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)
|
||||
|
||||
with open(path) as f:
|
||||
return f.read()
|
||||
return f.read().strip()
|
||||
|
||||
|
||||
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