mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
Implement 2019 day 8
This commit is contained in:
@@ -15,9 +15,9 @@ def main() -> None:
|
|||||||
day = importlib.import_module(f'.day{args.day:02d}', __package__)
|
day = importlib.import_module(f'.day{args.day:02d}', __package__)
|
||||||
|
|
||||||
if args.part2:
|
if args.part2:
|
||||||
function = day.part2
|
function = day.part2 # type: ignore
|
||||||
else:
|
else:
|
||||||
function = day.part1
|
function = day.part1 # type: ignore
|
||||||
|
|
||||||
print(function(args.input))
|
print(function(args.input))
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from typing import TextIO
|
from typing import TextIO
|
||||||
|
|
||||||
import networkx
|
import networkx # type: ignore
|
||||||
|
|
||||||
|
|
||||||
def read_graph(data: TextIO) -> networkx.DiGraph:
|
def read_graph(data: TextIO) -> networkx.DiGraph:
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ from typing import List, TextIO, Tuple
|
|||||||
from aoc2019.intcode import read_program, Computer
|
from aoc2019.intcode import read_program, Computer
|
||||||
|
|
||||||
|
|
||||||
def amplify(phases: Tuple[int], program: List[int]) -> int:
|
def amplify(phases: Tuple[int, ...], program: List[int]) -> int:
|
||||||
amps = []
|
amps: List[Computer] = []
|
||||||
|
|
||||||
for i, phase in enumerate(phases):
|
for i, phase in enumerate(phases):
|
||||||
amp = Computer(program.copy())
|
amp = Computer(program.copy())
|
||||||
@@ -25,8 +25,8 @@ def amplify(phases: Tuple[int], program: List[int]) -> int:
|
|||||||
return amps[-1].output.pop()
|
return amps[-1].output.pop()
|
||||||
|
|
||||||
|
|
||||||
def reamplify(phases: Tuple[int], program: List[int]) -> int:
|
def reamplify(phases: Tuple[int, ...], program: List[int]) -> int:
|
||||||
amps = []
|
amps: List[Computer] = []
|
||||||
|
|
||||||
for i, _ in enumerate(phases):
|
for i, _ in enumerate(phases):
|
||||||
amp = Computer(program.copy())
|
amp = Computer(program.copy())
|
||||||
|
|||||||
33
2019/aoc2019/day08.py
Normal file
33
2019/aoc2019/day08.py
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
from collections import Counter
|
||||||
|
from typing import Iterable, TextIO
|
||||||
|
|
||||||
|
import numpy # type: ignore
|
||||||
|
|
||||||
|
|
||||||
|
def parse_layers(width: int, height: int, data: TextIO) -> Iterable[numpy.array]:
|
||||||
|
chunk_size = width * height
|
||||||
|
|
||||||
|
content = next(data).strip()
|
||||||
|
|
||||||
|
for pos in range(0, len(content), chunk_size):
|
||||||
|
yield numpy.array([int(c) for c in content[pos:pos + chunk_size]])
|
||||||
|
|
||||||
|
|
||||||
|
def part1(data: TextIO) -> int:
|
||||||
|
best_layer: Counter[int] = min((Counter(layer) for layer in parse_layers(25, 6, data)), key=lambda c: c[0])
|
||||||
|
|
||||||
|
return best_layer[1] * best_layer[2]
|
||||||
|
|
||||||
|
|
||||||
|
def format_row(row: Iterable[int]) -> str:
|
||||||
|
return ''.join('#' if p == 1 else ' ' for p in row)
|
||||||
|
|
||||||
|
|
||||||
|
def part2(data: TextIO) -> str:
|
||||||
|
layers = list(parse_layers(25, 6, data))
|
||||||
|
background = numpy.zeros(25 * 6, numpy.int8)
|
||||||
|
|
||||||
|
for layer in reversed(layers):
|
||||||
|
background[layer != 2] = layer[layer != 2]
|
||||||
|
|
||||||
|
return '\n'.join(format_row(row) for row in background.reshape(6, 25))
|
||||||
@@ -21,14 +21,11 @@ class Computer:
|
|||||||
self.output = collections.deque()
|
self.output = collections.deque()
|
||||||
|
|
||||||
def _mode_and_key(self, item: Union[int, Tuple[int, int]]) -> Tuple[int, int]:
|
def _mode_and_key(self, item: Union[int, Tuple[int, int]]) -> Tuple[int, int]:
|
||||||
if type(item) == int:
|
if isinstance(item, int):
|
||||||
mode = 0
|
return 0, item
|
||||||
key = item
|
|
||||||
else:
|
else:
|
||||||
mode, key = item
|
mode, key = item
|
||||||
key = self.program[self.pointer + key]
|
return mode, self.program[self.pointer + key]
|
||||||
|
|
||||||
return mode, key
|
|
||||||
|
|
||||||
def __getitem__(self, item: Union[int, Tuple[int, int]]) -> int:
|
def __getitem__(self, item: Union[int, Tuple[int, int]]) -> int:
|
||||||
mode, key = self._mode_and_key(item)
|
mode, key = self._mode_and_key(item)
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
pytest
|
pytest
|
||||||
networkx
|
networkx
|
||||||
|
numpy
|
||||||
|
|||||||
Reference in New Issue
Block a user