Not The Main Worb/ntmw.py
Jump to navigation
Jump to search
from collections import defaultdict
import heapq
import random
import os
import sys
from time import sleep
def load_file(filename):
with open(filename) as f:
phase1=True
board={}
sites=defaultdict(list)
transmitmap={}
x=0
y=0
width=0
height=0
for y,line in enumerate(f):
line=line.rstrip("\r\n")
if line=="#":
phase1=not phase1
height=y
continue
if phase1:
if len(line)>width: width = len(line)
for x in range(0,len(line)-1,2):
board[(x/2,y)]=[line[x],line[x+1]]
if line[x+1]!=" ":
sites[line[x+1]].append((x/2,y))
if len(line)%2:
board[(len(line)/2,y)]=[line[x]," "]
else:
if len(line)==0: continue
if len(line)!=2: raise ValueError("Invalid transmitter-receiver pair on line %d: %s"%(y+1,line))
if line[1] in transmitmap.values() or line[1] in transmitmap.keys() or line[0]==line[1]:
raise KeyError("Receiver symbol on line %d was previously declared: %s"%(y+1,line))
if line[0] in transmitmap.values() or line[0] in transmitmap.keys():
raise KeyError("Transmitter symbol on line %d was previously declared: %s"%(y,line))
transmitmap[line[0]]=line[1]
if phase1:
height=y
return NTMW(board,sites,transmitmap,width,height)
class NTMW:
def __init__(self,board,sites,transmitmap,width,height):
self.board = board
self.sites = sites
self.transmitmap = transmitmap
self.width = width
self.height = height
def do_transmit(self):
for transmitter,receiver in self.transmitmap.items():
if (all([self.board[coord][0]=="." for coord in self.sites[transmitter]]) and
all([self.board[coord][0]==" " for coord in self.sites[receiver]])):
for coord in self.sites[transmitter]:
self.board[coord][0]=" "
for coord in self.sites[receiver]:
self.board[coord][0]="."
def move_bobules(self):
priorityq = []
newboard = {}
for coord,contents in self.board.items():
if contents[0]=="." and contents[1] not in self.transmitmap.keys():
heapq.heappush(priorityq,(random.random(), coord, contents[0]))
newboard[coord]=["." if contents[1] in self.transmitmap.keys() and contents[0]=="." else "",contents[1]]
while priorityq:
_ , coord, contents = heapq.heappop(priorityq)
dx,dy = random.sample(xrange(-1,2),2)
x,y = coord
if (x+dx,y+dy) in newboard.keys() and not newboard[(x+dx,y+dy)][0]:
newboard[(x+dx,y+dy)][0]=contents
newboard[coord][0]=self.board[(x+dx,y+dy)][0]
else:
newboard[coord][0]=self.board[coord][0]
for contents in newboard.values():
if not contents[0]:
contents[0]=" "
self.board = newboard
def print_board(self):
os.system('cls' if os.name=="nt" else 'printf "\033c"')
for y in range(self.height):
print "".join(["@" if self.board[(x,y)][0]=="." else self.board[(x,y)][1] for x in range(self.width) if (x,y) in self.board.keys()])
def run(self):
try:
while True:
self.do_transmit()
self.move_bobules()
self.print_board()
sleep(0.05)
except KeyboardInterrupt:
sys.exit(0)
if __name__=="__main__":
if len(sys.argv)<2:
print "No NTMW filename provided to execute."
sys.exit(0)
ntmw = load_file(sys.argv[1])
ntmw.run()