diff --git a/2019/aoc2019/day16.py b/2019/aoc2019/day16.py index 217fe68..e61987e 100644 --- a/2019/aoc2019/day16.py +++ b/2019/aoc2019/day16.py @@ -27,7 +27,31 @@ def simulate(numbers: List[int]) -> str: return ''.join(str(s) for s in numbers[:8]) +def simulate2(numbers: List[int]) -> str: + numbers = numpy.tile(numpy.array(numbers, dtype=numpy.int), 10000) + starting_index = 0 + + for n in numbers[:7]: + starting_index *= 10 + starting_index += n + + assert starting_index > len(numbers) / 2 + + numbers = numbers[starting_index:] + + for _ in range(100): + numbers = numpy.abs(numpy.flip(numpy.cumsum(numpy.flip(numbers)))) % 10 + + return ''.join(str(s) for s in numbers[:8]) + + def part1(data: TextIO) -> str: numbers = read_input(data) return simulate(numbers) + + +def part2(data: TextIO) -> str: + numbers = read_input(data) + + return simulate2(numbers) diff --git a/2019/tests/day16.py b/2019/tests/day16.py deleted file mode 100644 index f83024d..0000000 --- a/2019/tests/day16.py +++ /dev/null @@ -1,15 +0,0 @@ -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 diff --git a/2019/tests/test_day16.py b/2019/tests/test_day16.py new file mode 100644 index 0000000..67a49db --- /dev/null +++ b/2019/tests/test_day16.py @@ -0,0 +1,25 @@ +import pytest + +from aoc2019.day16 import simulate, simulate2 + + +@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 + + +@pytest.mark.parametrize('data,correct', [ + ('03036732577212944063491565474664', '84462026'), + ('02935109699940807407585447034323', '78725270'), + ('03081770884921959731165446850517', '53553731'), +]) +def test_sample_part2(data: str, correct: str): + numbers = [int(c) for c in data] + + assert simulate2(numbers) == correct