Compare commits
3 Commits
0000001043
...
000000408f
| Author | SHA1 | Date | |
|---|---|---|---|
|
000000408f
|
|||
|
000000307f
|
|||
|
000000200c
|
@@ -54,7 +54,7 @@ def get(
|
|||||||
path.parent.mkdir(parents=True, exist_ok=True)
|
path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
with open(path) as f:
|
with open(path) as f:
|
||||||
return f.read()
|
return f.read().strip()
|
||||||
|
|
||||||
|
|
||||||
def get_or_download(
|
def get_or_download(
|
||||||
|
|||||||
0
src/solution/year_2019/__init__.py
Normal file
0
src/solution/year_2019/__init__.py
Normal file
38
src/solution/year_2019/day_01.py
Normal file
38
src/solution/year_2019/day_01.py
Normal 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
|
||||||
50
src/solution/year_2019/day_02.py
Normal file
50
src/solution/year_2019/day_02.py
Normal 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
|
||||||
Reference in New Issue
Block a user