-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path18b_aoc.py
More file actions
114 lines (101 loc) · 2.81 KB
/
18b_aoc.py
File metadata and controls
114 lines (101 loc) · 2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import sys
program = []
timesSent = 0
def main():
try:
while True:
getinputs(raw_input())
except EOFError:
solve()
def getinputs(arg):
program.append(arg)
class ProcessProgram():
def __init__(self, pid):
self.pid = pid
self.regs = {}
self.recieveQueue = []
# for x in range(26):
# self.regs[chr(ord('a')+x)] = 0
self.regs['p'] = pid
self.rip = 0
self.other = None
def get(self,arg):
if 'a'<=arg<='z':
if arg in self.regs:
return self.regs[arg]
else:
self.regs[arg] = 0
return 0
else:
return int(arg)
def process(self):
global timesSent
arg = program[self.rip]
arg = arg.split()
if arg[0]=='snd':
if self.pid == 1:
timesSent += 1
if arg[1] in self.regs:
self.other.recieveQueue.insert(0,self.regs[arg[1]])
else:
self.other.recieveQueue.insert(0,int(arg[1]))
self.rip += 1
return 1
elif arg[0]=='set':
self.regs[arg[1]] = self.get(arg[2])
elif arg[0]=='add':
self.regs[arg[1]] += self.get(arg[2])
elif arg[0]=='mul':
self.regs[arg[1]] *= self.get(arg[2])
elif arg[0]=='mod':
self.regs[arg[1]] %= self.get(arg[2])
elif arg[0]=='rcv':
if len(self.recieveQueue)>0:
self.regs[arg[1]] = self.recieveQueue.pop()
else:
return -1
elif arg[0]=='jgz':
z = self.get(arg[1])
if z>0:
self.rip += self.get(arg[2])
self.printState()
return 0
else:
raise Exception("Instruction not found")
self.printState()
self.rip += 1
return 0
def printState(self):
if self.pid==0:
print "%2d: <%10s>"%(self.rip,program[self.rip])
print "\t\t\t\t\t",self.regs,self.recieveQueue
else:
print "\t\t%2d: <%10s>"%(self.rip,program[self.rip])
print "\t\t\t\t\t",self.regs,self.recieveQueue
import time
def solve():
p0 = ProcessProgram(0)
p1 = ProcessProgram(1)
p0.other = p1
p1.other = p0
readyQ = [p1,p0]
waitingQ = []
while len(readyQ)>0:
#time.sleep(0.01)
p = readyQ.pop()
r = p.process()
if r==-1:
waitingQ.insert(0,p)
continue
if r==1:
try:
readyQ.append(waitingQ.pop())
except IndexError:
pass
readyQ.insert(0,p)
assert len(readyQ)+len(waitingQ)==2
print timesSent
def end():
print timesSent
sys.exit(0)
main()