mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
Implement 2019 day 5 part 2
This commit is contained in:
@@ -90,8 +90,35 @@ class Computer:
|
|||||||
self[mode[0], 1] = self.input.popleft()
|
self[mode[0], 1] = self.input.popleft()
|
||||||
self.pointer += 2
|
self.pointer += 2
|
||||||
elif opcode == 4:
|
elif opcode == 4:
|
||||||
|
# Output
|
||||||
self.output.append(self[mode[0], 1])
|
self.output.append(self[mode[0], 1])
|
||||||
self.pointer += 2
|
self.pointer += 2
|
||||||
|
elif opcode == 5:
|
||||||
|
# Jump if true
|
||||||
|
if self[mode[0], 1] != 0:
|
||||||
|
self.pointer = self[mode[1], 2]
|
||||||
|
else:
|
||||||
|
self.pointer += 3
|
||||||
|
elif opcode == 6:
|
||||||
|
# Jump if false
|
||||||
|
if self[mode[0], 1] == 0:
|
||||||
|
self.pointer = self[mode[1], 2]
|
||||||
|
else:
|
||||||
|
self.pointer += 3
|
||||||
|
elif opcode == 7:
|
||||||
|
# Less than
|
||||||
|
if self[mode[0], 1] < self[mode[1], 2]:
|
||||||
|
self[mode[2], 3] = 1
|
||||||
|
else:
|
||||||
|
self[mode[2], 3] = 0
|
||||||
|
self.pointer += 4
|
||||||
|
elif opcode == 8:
|
||||||
|
# Equals
|
||||||
|
if self[mode[0], 1] == self[mode[1], 2]:
|
||||||
|
self[mode[2], 3] = 1
|
||||||
|
else:
|
||||||
|
self[mode[2], 3] = 0
|
||||||
|
self.pointer += 4
|
||||||
elif opcode == 99:
|
elif opcode == 99:
|
||||||
# Halt
|
# Halt
|
||||||
return False
|
return False
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import itertools
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
@@ -20,3 +21,46 @@ def test_instructions_day2(program: List[int], expected: List[int]) -> None:
|
|||||||
computer.run()
|
computer.run()
|
||||||
|
|
||||||
assert computer.program == expected
|
assert computer.program == expected
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('number,program', itertools.product([7, 8, 9], [
|
||||||
|
[3, 9, 8, 9, 10, 9, 4, 9, 99, -1, 8],
|
||||||
|
[3, 3, 1108, -1, 8, 3, 4, 3, 99],
|
||||||
|
]))
|
||||||
|
def test_equality_opcode(program: List[int], number: int):
|
||||||
|
computer = Computer(program.copy())
|
||||||
|
computer.input.append(number)
|
||||||
|
|
||||||
|
computer.run()
|
||||||
|
|
||||||
|
assert computer.output.pop() == int(number == 8)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('number,program', itertools.product([7, 8, 9], [
|
||||||
|
[3, 9, 7, 9, 10, 9, 4, 9, 99, -1, 8],
|
||||||
|
[3, 3, 1107, -1, 8, 3, 4, 3, 99],
|
||||||
|
]))
|
||||||
|
def test_less_than_opcode(program: List[int], number: int):
|
||||||
|
computer = Computer(program.copy())
|
||||||
|
computer.input.append(number)
|
||||||
|
|
||||||
|
computer.run()
|
||||||
|
|
||||||
|
assert computer.output.pop() == int(number < 8)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('inputs,expected', [
|
||||||
|
(12, 1001),
|
||||||
|
(8, 1000),
|
||||||
|
(2, 999),
|
||||||
|
])
|
||||||
|
def test_day5_example(inputs: int, expected: int):
|
||||||
|
computer = Computer([3, 21, 1008, 21, 8, 20, 1005, 20, 22, 107, 8, 21, 20, 1006, 20, 31,
|
||||||
|
1106, 0, 36, 98, 0, 0, 1002, 21, 125, 20, 4, 20, 1105, 1, 46, 104,
|
||||||
|
999, 1105, 1, 46, 1101, 1000, 1, 20, 4, 20, 1105, 1, 46, 98, 99])
|
||||||
|
|
||||||
|
computer.input.append(inputs)
|
||||||
|
|
||||||
|
computer.run()
|
||||||
|
|
||||||
|
assert computer.output.pop() == expected
|
||||||
|
|||||||
Reference in New Issue
Block a user