day25
This commit is contained in:
parent
d1f28a1b3b
commit
5bcd80a2c4
21
asembunny.py
21
asembunny.py
@ -7,20 +7,32 @@ class Command(str, Enum):
|
|||||||
DECREASE = "dec"
|
DECREASE = "dec"
|
||||||
JUMP_NON_ZERO = "jnz"
|
JUMP_NON_ZERO = "jnz"
|
||||||
TOGGLE = "tgl"
|
TOGGLE = "tgl"
|
||||||
|
OUTPUT = "out"
|
||||||
|
|
||||||
|
|
||||||
class Computer:
|
class Computer:
|
||||||
def __init__(
|
def __init__(
|
||||||
self, code: list[tuple[Command, str | int, ...]], reg_a: int = 0, reg_b: int = 0, reg_c: int = 0, reg_d: int = 0
|
self, code: list[tuple[Command, str | int, ...]], reg_a: int = 0, reg_b: int = 0, reg_c: int = 0, reg_d: int = 0
|
||||||
):
|
):
|
||||||
|
self.code = code
|
||||||
|
self.max_output_len = int(1e12)
|
||||||
|
self.reg = {}
|
||||||
|
self.instr_ptr = 0
|
||||||
|
self.output = []
|
||||||
|
self.reset(reg_a=reg_a, reg_b=reg_b, reg_c=reg_c, reg_d=reg_d)
|
||||||
|
|
||||||
|
def reset(self, reg_a: int = 0, reg_b: int = 0, reg_c: int = 0, reg_d: int = 0):
|
||||||
self.reg = {
|
self.reg = {
|
||||||
"a": reg_a,
|
"a": reg_a,
|
||||||
"b": reg_b,
|
"b": reg_b,
|
||||||
"c": reg_c,
|
"c": reg_c,
|
||||||
"d": reg_d,
|
"d": reg_d,
|
||||||
}
|
}
|
||||||
self.code = code
|
|
||||||
self.instr_ptr = 0
|
self.instr_ptr = 0
|
||||||
|
self.output = []
|
||||||
|
|
||||||
|
def set_max_output_len(self, count: int) -> None:
|
||||||
|
self.max_output_len = count
|
||||||
|
|
||||||
def get_value(self, source: int | str) -> int:
|
def get_value(self, source: int | str) -> int:
|
||||||
if isinstance(source, int):
|
if isinstance(source, int):
|
||||||
@ -46,6 +58,13 @@ class Computer:
|
|||||||
elif cmd == Command.DECREASE:
|
elif cmd == Command.DECREASE:
|
||||||
self.reg[args[0]] -= 1
|
self.reg[args[0]] -= 1
|
||||||
self.instr_ptr += 1
|
self.instr_ptr += 1
|
||||||
|
elif cmd == Command.OUTPUT:
|
||||||
|
self.output.append(self.get_value(args[0]))
|
||||||
|
if len(self.output) >= self.max_output_len or (
|
||||||
|
len(self.output) > 1 and self.output[-1] == self.output[-2]
|
||||||
|
):
|
||||||
|
break
|
||||||
|
self.instr_ptr += 1
|
||||||
elif cmd == Command.JUMP_NON_ZERO:
|
elif cmd == Command.JUMP_NON_ZERO:
|
||||||
if isinstance(args[0], int):
|
if isinstance(args[0], int):
|
||||||
check = args[0]
|
check = args[0]
|
||||||
|
|||||||
33
day25.py
Normal file
33
day25.py
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
from asembunny import Computer, parse_assembunny_code
|
||||||
|
from tools.aoc import AOCDay
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
class Day(AOCDay):
|
||||||
|
inputs = [
|
||||||
|
[
|
||||||
|
(198, "input25"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
(None, "input25"),
|
||||||
|
],
|
||||||
|
]
|
||||||
|
|
||||||
|
def part1(self) -> Any:
|
||||||
|
computer = Computer(parse_assembunny_code(self.getInput()))
|
||||||
|
computer.set_max_output_len(20)
|
||||||
|
ans = 0
|
||||||
|
while True:
|
||||||
|
computer.reset(reg_a=ans)
|
||||||
|
computer.run()
|
||||||
|
if computer.output == [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]:
|
||||||
|
return ans
|
||||||
|
ans += 1
|
||||||
|
|
||||||
|
def part2(self) -> Any:
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
day = Day(2016, 25)
|
||||||
|
day.run(verbose=True)
|
||||||
30
inputs/input25
Normal file
30
inputs/input25
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
cpy a d
|
||||||
|
cpy 4 c
|
||||||
|
cpy 633 b
|
||||||
|
inc d
|
||||||
|
dec b
|
||||||
|
jnz b -2
|
||||||
|
dec c
|
||||||
|
jnz c -5
|
||||||
|
cpy d a
|
||||||
|
jnz 0 0
|
||||||
|
cpy a b
|
||||||
|
cpy 0 a
|
||||||
|
cpy 2 c
|
||||||
|
jnz b 2
|
||||||
|
jnz 1 6
|
||||||
|
dec b
|
||||||
|
dec c
|
||||||
|
jnz c -4
|
||||||
|
inc a
|
||||||
|
jnz 1 -7
|
||||||
|
cpy 2 b
|
||||||
|
jnz c 2
|
||||||
|
jnz 1 4
|
||||||
|
dec b
|
||||||
|
dec c
|
||||||
|
jnz 1 -4
|
||||||
|
jnz 0 0
|
||||||
|
out b
|
||||||
|
jnz a -19
|
||||||
|
jnz 1 -21
|
||||||
Loading…
Reference in New Issue
Block a user