Skip to content

Commit ea73fbb

Browse files
committed
2019 day 5
1 parent 53ff49a commit ea73fbb

3 files changed

Lines changed: 119 additions & 0 deletions

File tree

2019/python/data/day05/input.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3,225,1,225,6,6,1100,1,238,225,104,0,101,67,166,224,1001,224,-110,224,4,224,102,8,223,223,1001,224,4,224,1,224,223,223,2,62,66,224,101,-406,224,224,4,224,102,8,223,223,101,3,224,224,1,224,223,223,1101,76,51,225,1101,51,29,225,1102,57,14,225,1102,64,48,224,1001,224,-3072,224,4,224,102,8,223,223,1001,224,1,224,1,224,223,223,1001,217,90,224,1001,224,-101,224,4,224,1002,223,8,223,1001,224,2,224,1,223,224,223,1101,57,55,224,1001,224,-112,224,4,224,102,8,223,223,1001,224,7,224,1,223,224,223,1102,5,62,225,1102,49,68,225,102,40,140,224,101,-2720,224,224,4,224,1002,223,8,223,1001,224,4,224,1,223,224,223,1101,92,43,225,1101,93,21,225,1002,170,31,224,101,-651,224,224,4,224,102,8,223,223,101,4,224,224,1,223,224,223,1,136,57,224,1001,224,-138,224,4,224,102,8,223,223,101,2,224,224,1,223,224,223,1102,11,85,225,4,223,99,0,0,0,677,0,0,0,0,0,0,0,0,0,0,0,1105,0,99999,1105,227,247,1105,1,99999,1005,227,99999,1005,0,256,1105,1,99999,1106,227,99999,1106,0,265,1105,1,99999,1006,0,99999,1006,227,274,1105,1,99999,1105,1,280,1105,1,99999,1,225,225,225,1101,294,0,0,105,1,0,1105,1,99999,1106,0,300,1105,1,99999,1,225,225,225,1101,314,0,0,106,0,0,1105,1,99999,1107,226,226,224,102,2,223,223,1006,224,329,1001,223,1,223,1007,226,677,224,1002,223,2,223,1005,224,344,101,1,223,223,108,677,677,224,1002,223,2,223,1006,224,359,101,1,223,223,1008,226,226,224,1002,223,2,223,1005,224,374,1001,223,1,223,108,677,226,224,1002,223,2,223,1006,224,389,101,1,223,223,7,226,226,224,102,2,223,223,1006,224,404,101,1,223,223,7,677,226,224,1002,223,2,223,1005,224,419,101,1,223,223,107,226,226,224,102,2,223,223,1006,224,434,1001,223,1,223,1008,677,677,224,1002,223,2,223,1005,224,449,101,1,223,223,108,226,226,224,102,2,223,223,1005,224,464,1001,223,1,223,1108,226,677,224,1002,223,2,223,1005,224,479,1001,223,1,223,8,677,226,224,102,2,223,223,1006,224,494,1001,223,1,223,1108,677,677,224,102,2,223,223,1006,224,509,1001,223,1,223,1007,226,226,224,1002,223,2,223,1005,224,524,1001,223,1,223,7,226,677,224,1002,223,2,223,1005,224,539,1001,223,1,223,8,677,677,224,102,2,223,223,1005,224,554,1001,223,1,223,107,226,677,224,1002,223,2,223,1006,224,569,101,1,223,223,1107,226,677,224,102,2,223,223,1005,224,584,1001,223,1,223,1108,677,226,224,102,2,223,223,1006,224,599,1001,223,1,223,1008,677,226,224,102,2,223,223,1006,224,614,101,1,223,223,107,677,677,224,102,2,223,223,1006,224,629,1001,223,1,223,1107,677,226,224,1002,223,2,223,1005,224,644,101,1,223,223,8,226,677,224,102,2,223,223,1005,224,659,1001,223,1,223,1007,677,677,224,102,2,223,223,1005,224,674,1001,223,1,223,4,223,99,226

2019/python/src/aoc2019/day05.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
from pathlib import Path
2+
3+
4+
def part1(input: Path) -> int:
5+
code = [int(n) for n in input.read_text().split(",")]
6+
return run_intcode(code, [1])[-1]
7+
8+
9+
def part2(input: Path) -> int:
10+
code = [int(n) for n in input.read_text().split(",")]
11+
return run_intcode(code, [5])[-1]
12+
13+
14+
def run_intcode(code: list[int], inputs: list[int]) -> list[int]:
15+
ip = 0
16+
outputs = []
17+
while True:
18+
opcode, parameter_modes = parse_opcode(code[ip])
19+
match opcode:
20+
case 1:
21+
set(
22+
code,
23+
ip + 3,
24+
parameter_modes[2],
25+
get(code, ip + 1, parameter_modes[0])
26+
+ get(code, ip + 2, parameter_modes[1]),
27+
)
28+
ip += 4
29+
case 2:
30+
set(
31+
code,
32+
ip + 3,
33+
parameter_modes[2],
34+
get(code, ip + 1, parameter_modes[0])
35+
* get(code, ip + 2, parameter_modes[1]),
36+
)
37+
ip += 4
38+
case 3:
39+
set(code, ip + 1, parameter_modes[0], inputs.pop(0))
40+
ip += 2
41+
case 4:
42+
outputs.append(get(code, ip + 1, parameter_modes[0]))
43+
ip += 2
44+
case 5:
45+
jump = get(code, ip + 1, parameter_modes[0]) != 0
46+
if jump:
47+
ip = get(code, ip + 2, parameter_modes[1])
48+
else:
49+
ip += 3
50+
case 6:
51+
jump = get(code, ip + 1, parameter_modes[0]) == 0
52+
if jump:
53+
ip = get(code, ip + 2, parameter_modes[1])
54+
else:
55+
ip += 3
56+
case 7:
57+
set(
58+
code,
59+
ip + 3,
60+
parameter_modes[2],
61+
int(
62+
get(code, ip + 1, parameter_modes[0])
63+
< get(code, ip + 2, parameter_modes[1])
64+
),
65+
)
66+
ip += 4
67+
case 8:
68+
set(
69+
code,
70+
ip + 3,
71+
parameter_modes[2],
72+
int(
73+
get(code, ip + 1, parameter_modes[0])
74+
== get(code, ip + 2, parameter_modes[1])
75+
),
76+
)
77+
ip += 4
78+
case 99:
79+
break
80+
return outputs
81+
82+
83+
def parse_opcode(opcode: int) -> tuple[int, tuple[int, ...]]:
84+
s = str(opcode).zfill(5)
85+
return int(s[3:]), (int(s[2]), int(s[1]), int(s[0]))
86+
87+
88+
def get(code: list[int], parameter_ip: int, parameter_mode: int) -> int:
89+
match parameter_mode:
90+
case 0:
91+
return code[code[parameter_ip]]
92+
case 1:
93+
return code[parameter_ip]
94+
case _:
95+
raise ValueError(f"Invalid parameter mode {parameter_mode}")
96+
97+
98+
def set(code: list[int], parameter_ip: int, parameter_mode: int, value: int) -> None:
99+
match parameter_mode:
100+
case 0:
101+
code[code[parameter_ip]] = value
102+
case 1:
103+
code[parameter_ip] = value
104+
case _:
105+
raise ValueError(f"Invalid parameter mode {parameter_mode}")

2019/python/tests/test_day05.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from pathlib import Path
2+
3+
from aoc2019 import day05
4+
5+
DATA_DIR = Path(__file__).parent.parent / "data/day05"
6+
7+
8+
def test_part1():
9+
assert day05.part1(DATA_DIR / "input.txt") == 9219874
10+
11+
12+
def test_part2():
13+
assert day05.part2(DATA_DIR / "input.txt") == 5893654

0 commit comments

Comments
 (0)