From 2d561eab7d534f2b597f560d796e04dbc82b0ca6 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Tue, 2 Feb 2021 19:12:10 +0100 Subject: [PATCH] Implement 2019 day 16 part 1 --- 2019/aoc2019/day16.py | 33 +++++++++++++++++++++++++++++++++ 2019/tests/day16.py | 15 +++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 2019/aoc2019/day16.py create mode 100644 2019/tests/day16.py diff --git a/2019/aoc2019/day16.py b/2019/aoc2019/day16.py new file mode 100644 index 0000000..217fe68 --- /dev/null +++ b/2019/aoc2019/day16.py @@ -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) diff --git a/2019/tests/day16.py b/2019/tests/day16.py new file mode 100644 index 0000000..f83024d --- /dev/null +++ b/2019/tests/day16.py @@ -0,0 +1,15 @@ +import pytest + +from aoc2019.day16 import simulate + + +@pytest.mark.parametrize('data,correct', [ + ('80871224585914546619083218645595', '24176176'), + ('19617804207202209144916044189917', '73745418'), + ('69317163492948606335995924319873', '52432133'), +]) +def test_sample_part1(data: str, correct: str): + numbers = [int(c) for c in data] + + assert simulate(numbers) == correct + pass