Compare commits

...

3 Commits

Author SHA1 Message Date
000000408f feat: strip file after reading 2025-12-01 23:04:19 +01:00
000000307f feat: add solution 2019/02 2025-12-01 23:03:37 +01:00
000000200c feat: add solution 2019/01 2025-12-01 22:39:29 +01:00
4 changed files with 89 additions and 1 deletions

View File

@@ -54,7 +54,7 @@ def get(
path.parent.mkdir(parents=True, exist_ok=True)
with open(path) as f:
return f.read()
return f.read().strip()
def get_or_download(

View File

View File

@@ -0,0 +1,38 @@
from typing import Any
def fuel_req(mass: int) -> int:
return max(mass // 3 - 2, 0)
def rec_fuel_req(mass: int) -> int:
fuel = fuel_req(mass)
if fuel == 0:
return 0
return fuel + rec_fuel_req(fuel)
def part_1_2(input_data: str) -> Any:
req1, req2 = 0, 0
for line in input_data.splitlines():
mass = int(line)
req1 += fuel_req(mass)
req2 += rec_fuel_req(mass)
return req1, req2
def test_fuel_req() -> None:
assert fuel_req(12) == 2
assert fuel_req(14) == 2
assert fuel_req(1969) == 654
assert fuel_req(100756) == 33583
def test_rec_fuel_req() -> None:
assert rec_fuel_req(14) == 2
assert rec_fuel_req(1969) == 966
assert rec_fuel_req(100756) == 50346

View File

@@ -0,0 +1,50 @@
from typing import Any
class IntcodeComputer:
def __init__(self, program: list[int]):
self.memory = program.copy()
self.pointer = 0
def process_opcode(self) -> bool:
opcode = self.memory[self.pointer]
match opcode:
case 99:
return True
case 1:
p1, p2, p3 = self.memory[self.pointer + 1 : self.pointer + 4]
self.memory[p3] = self.memory[p1] + self.memory[p2]
case 2:
p1, p2, p3 = self.memory[self.pointer + 1 : self.pointer + 4]
self.memory[p3] = self.memory[p1] * self.memory[p2]
case e:
raise ValueError(f"unexpected opcode {e}")
self.pointer += 4
return False
def run_intcode_computer(program: list[int], noun: int, verb: int) -> int:
ic = IntcodeComputer(program)
ic.memory[1:3] = [noun, verb]
while True:
if ic.process_opcode():
break
return ic.memory[0]
def part_1(input_data: str) -> Any:
parsed = list(map(int, input_data.split(",")))
return run_intcode_computer(parsed, 12, 2)
def part_2(input_data: str) -> Any:
parsed = list(map(int, input_data.split(",")))
for n in range(100):
for v in range(100):
if run_intcode_computer(parsed, n, v) == 19690720:
return 100 * n + v