-
Notifications
You must be signed in to change notification settings - Fork 0
/
19.py
121 lines (99 loc) · 3.05 KB
/
19.py
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
115
116
117
118
119
120
121
import copy
CODE = [];
with open('19.txt') as f:
nums = f.read().strip().split(',')
for n in nums:
CODE.append(int(n))
# Extend memmory "alot"
CODE += [0]*10*len(CODE)
def intcom(C, pos, relpos, Input, running):
Output = []
def read(pos, mode):
if mode == 0:
return C[C[pos]]
elif mode == 1:
return C[pos]
elif mode == 2:
return C[C[pos]+relpos]
def write(val, pos, mode):
if mode == 0:
C[C[pos]] = val
if mode == 2:
C[C[pos]+relpos] = val
while running:
oc = C[pos] % 100
ma = (C[pos] - oc) // 100 % 10
mb = (C[pos] - oc - ma*100) // 1000 % 10
mc = (C[pos] - oc - ma*100 - mb*1000) // 10000 % 10
if oc == 99:
return (C, pos, relpos, Output, False)
if oc == 1:
a = read(pos+1, ma)
b = read(pos+2, mb)
write(a + b, pos+3, mc)
step = 4
elif oc == 2:
a = read(pos+1, ma)
b = read(pos+2, mb)
write(a * b, pos+3, mc)
step = 4
elif oc == 3:
if Input == []:
return (C, pos, relpos, Output, True)
else:
a = Input.pop(0)
write(a, pos+1, ma)
step = 2
elif oc == 4:
Output.append(read(pos+1, ma))
step=2
elif oc == 5:
a = read(pos+1, ma)
b = read(pos+2, mb)
if a != 0:
pos = b
step = 0
else:
step = 3
elif oc == 6:
a = read(pos+1, ma)
b = read(pos+2, mb)
if a == 0:
pos = b
step = 0
else:
step = 3
elif oc == 7:
a = read(pos+1, ma)
b = read(pos+2, mb)
write(int(a < b), pos+3, mc)
step = 4
elif oc == 8:
a = read(pos+1, ma)
b = read(pos+2, mb)
write(int(a == b), pos+3, mc)
step = 4
elif oc == 9:
a = read(pos+1, ma)
relpos += a
step = 2
pos += step
# Part 1
beamdata = []
for y in range(50):
for x in range(50):
C = copy.deepcopy(CODE)
(C, pos, relpos, Output, running) = intcom(C, 0, 0, [x,y], True)
beamdata = beamdata + Output
print(sum(beamdata))
# Part 2
rightedge = 616
for y in range(1001,2000):
C = copy.deepcopy(CODE)
(C, pos, relpos, Output, running) = intcom(C, 0, 0, [rightedge+1,y], True)
rightedge += Output[0]
C = copy.deepcopy(CODE)
(C, pos, relpos, Output, running) = intcom(C, 0, 0, [rightedge-99,y+99], True)
if Output[0]:
print((rightedge-99)*10000+y)
break