@@ -30,16 +30,17 @@ def __post_init__(self):
30
30
self .program = defaultdict (lambda : 0 , enumerate (self .program ))
31
31
32
32
def __iter__ (self ) -> Generator [int , int , None ]:
33
- """Execute the Intcode program."""
33
+ """Execute the Intcode program.
34
+
35
+ Raises:
36
+ UnknownOpCodeError: if encountered an unknown op code
37
+ """
34
38
while True :
35
39
op = self .program [self .pointer ] % 100
36
40
match op :
37
41
case 1 | 2 : # add, multiply
38
42
a , b , c = self .get_parameters (3 ) # type: ignore
39
- if op == 1 :
40
- self .program [c ] = a + b
41
- else :
42
- self .program [c ] = a * b
43
+ self .program [c ] = a + b if op == 1 else a * b
43
44
self .pointer += 4
44
45
case 3 : # input
45
46
a = self .program [self .pointer + 1 ]
@@ -51,19 +52,14 @@ def __iter__(self) -> Generator[int, int, None]:
51
52
a : int = self .get_parameters (1 ) # type: ignore
52
53
self .pointer += 2
53
54
yield a
54
- case 5 : # jump-if-true
55
- a , b = self .get_parameters (2 ) # type: ignore
56
- self .pointer = b if a else self .pointer + 3
57
- case 6 : # jump-if-false
55
+ case 5 | 6 : # jump-if-true, jump-if-false
58
56
a , b = self .get_parameters (2 ) # type: ignore
59
- self .pointer = b if not a else self .pointer + 3
60
- case 7 : # less than
61
- a , b , c = self .get_parameters (3 ) # type: ignore
62
- self .program [c ] = 1 if a < b else 0
63
- self .pointer += 4
64
- case 8 : # equals
57
+ cond = a if op == 5 else not a
58
+ self .pointer = b if cond else self .pointer + 3
59
+ case 7 | 8 : # less than, equals
65
60
a , b , c = self .get_parameters (3 ) # type: ignore
66
- self .program [c ] = 1 if a == b else 0
61
+ cond = a < b if op == 7 else a == b
62
+ self .program [c ] = 1 if cond else 0
67
63
self .pointer += 4
68
64
case 9 : # relative base offset
69
65
a : int = self .get_parameters (1 ) # type: ignore
0 commit comments