2019 day 4 and 5
This commit is contained in:
123
2019/d5.py
Normal file
123
2019/d5.py
Normal file
@@ -0,0 +1,123 @@
|
||||
from lib import get_data, str_to_ints
|
||||
|
||||
|
||||
def part_1(data):
|
||||
xs = str_to_ints(data)
|
||||
i = 0
|
||||
while i < len(xs):
|
||||
inst = str(xs[i])
|
||||
inst = "0" * (5 - len(inst)) + inst
|
||||
assert len(inst) == 5
|
||||
op = int(inst[3:5])
|
||||
mode_p1 = int(inst[2])
|
||||
mode_p2 = int(inst[1])
|
||||
mode_p3 = int(inst[0])
|
||||
match op:
|
||||
case 1:
|
||||
p1 = xs[xs[i + 1]] if mode_p1 == 0 else xs[i + 1]
|
||||
p2 = xs[xs[i + 2]] if mode_p2 == 0 else xs[i + 2]
|
||||
assert mode_p3 == 0
|
||||
xs[xs[i + 3]] = p1 + p2
|
||||
i += 4
|
||||
case 2:
|
||||
p1 = xs[xs[i + 1]] if mode_p1 == 0 else xs[i + 1]
|
||||
p2 = xs[xs[i + 2]] if mode_p2 == 0 else xs[i + 2]
|
||||
assert mode_p3 == 0
|
||||
xs[xs[i + 3]] = p1 * p2
|
||||
i += 4
|
||||
case 3:
|
||||
print("input", i, 1)
|
||||
assert mode_p1 == 0
|
||||
xs[xs[i + 1]] = 1
|
||||
i += 2
|
||||
case 4:
|
||||
if mode_p1 == 0:
|
||||
v = xs[xs[i + 1]]
|
||||
else:
|
||||
v = xs[i + 1]
|
||||
print("output", v)
|
||||
i += 2
|
||||
case 99:
|
||||
break
|
||||
|
||||
|
||||
def part_2(data):
|
||||
xs = str_to_ints(data)
|
||||
i = 0
|
||||
while i < len(xs):
|
||||
inst = str(xs[i])
|
||||
inst = "0" * (5 - len(inst)) + inst
|
||||
assert len(inst) == 5
|
||||
op = int(inst[3:5])
|
||||
mode_p1 = int(inst[2])
|
||||
mode_p2 = int(inst[1])
|
||||
mode_p3 = int(inst[0])
|
||||
match op:
|
||||
case 1:
|
||||
p1 = xs[xs[i + 1]] if mode_p1 == 0 else xs[i + 1]
|
||||
p2 = xs[xs[i + 2]] if mode_p2 == 0 else xs[i + 2]
|
||||
assert mode_p3 == 0
|
||||
xs[xs[i + 3]] = p1 + p2
|
||||
i += 4
|
||||
case 2:
|
||||
p1 = xs[xs[i + 1]] if mode_p1 == 0 else xs[i + 1]
|
||||
p2 = xs[xs[i + 2]] if mode_p2 == 0 else xs[i + 2]
|
||||
assert mode_p3 == 0
|
||||
xs[xs[i + 3]] = p1 * p2
|
||||
i += 4
|
||||
case 3:
|
||||
print("input", i, 5)
|
||||
assert mode_p1 == 0
|
||||
xs[xs[i + 1]] = 5
|
||||
i += 2
|
||||
case 4:
|
||||
if mode_p1 == 0:
|
||||
v = xs[xs[i + 1]]
|
||||
else:
|
||||
v = xs[i + 1]
|
||||
print("output", v)
|
||||
i += 2
|
||||
case 99:
|
||||
break
|
||||
case 5:
|
||||
p1 = xs[xs[i + 1]] if mode_p1 == 0 else xs[i + 1]
|
||||
p2 = xs[xs[i + 2]] if mode_p2 == 0 else xs[i + 2]
|
||||
if p1 != 0:
|
||||
i = p2
|
||||
else:
|
||||
i += 3
|
||||
case 6:
|
||||
p1 = xs[xs[i + 1]] if mode_p1 == 0 else xs[i + 1]
|
||||
p2 = xs[xs[i + 2]] if mode_p2 == 0 else xs[i + 2]
|
||||
if p1 == 0:
|
||||
i = p2
|
||||
else:
|
||||
i += 3
|
||||
case 7:
|
||||
p1 = xs[xs[i + 1]] if mode_p1 == 0 else xs[i + 1]
|
||||
p2 = xs[xs[i + 2]] if mode_p2 == 0 else xs[i + 2]
|
||||
assert mode_p3 == 0
|
||||
if p1 < p2:
|
||||
xs[xs[i + 3]] = 1
|
||||
else:
|
||||
xs[xs[i + 3]] = 0
|
||||
i += 4
|
||||
case 8:
|
||||
p1 = xs[xs[i + 1]] if mode_p1 == 0 else xs[i + 1]
|
||||
p2 = xs[xs[i + 2]] if mode_p2 == 0 else xs[i + 2]
|
||||
assert mode_p3 == 0
|
||||
if p1 == p2:
|
||||
xs[xs[i + 3]] = 1
|
||||
else:
|
||||
xs[xs[i + 3]] = 0
|
||||
i += 4
|
||||
|
||||
|
||||
def main():
|
||||
data = get_data(__file__)
|
||||
part_1(data)
|
||||
part_2(data)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user