Implement 2019 day 16 part 1

This commit is contained in:
2021-02-02 19:12:10 +01:00
parent 165159cba9
commit 2d561eab7d
2 changed files with 48 additions and 0 deletions

33
2019/aoc2019/day16.py Normal file
View File

@@ -0,0 +1,33 @@
import math
from typing import List, TextIO
import numpy # type: ignore
def read_input(data: TextIO) -> List[int]:
line = next(data).strip()
return [int(c) for c in line]
def simulate(numbers: List[int]) -> str:
numbers = numpy.array(numbers)
pattern = numpy.array([0, 1, 0, -1], dtype=numpy.int)
matrix = numpy.zeros((len(numbers), len(numbers)), dtype=numpy.int)
for i in range(len(numbers)):
base = numpy.repeat(pattern, i + 1)
needed_repetitions = math.ceil((len(numbers) + 1) / len(base))
matrix[i, :] = numpy.tile(base, needed_repetitions)[1:len(numbers) + 1]
for _ in range(100):
numbers = numpy.abs(numpy.dot(matrix, numbers)) % 10
return ''.join(str(s) for s in numbers[:8])
def part1(data: TextIO) -> str:
numbers = read_input(data)
return simulate(numbers)