61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
from tools.aoc import AOCDay
|
|
from typing import Any
|
|
|
|
|
|
class Day(AOCDay):
|
|
inputs = [
|
|
[
|
|
(24176176, "test_input16"),
|
|
(73745418, "test_input16_2"),
|
|
(52432133, "test_input16_3"),
|
|
(59522422, "input16"),
|
|
],
|
|
[
|
|
(84462026, "test_input16_4"),
|
|
(None, "input16"),
|
|
]
|
|
]
|
|
|
|
def part1(self) -> Any:
|
|
base_pattern = [0, 1, 0, -1]
|
|
the_number = self.getInput()
|
|
|
|
for r in range(100):
|
|
new_number = 0
|
|
for l in range(len(the_number)):
|
|
mul_sum = 0
|
|
for i, c in enumerate(the_number):
|
|
pattern_index = ((i + 1) // (l + 1)) % 4
|
|
mul_sum += ((ord(c) - 48) * (2 - pattern_index if pattern_index else 0))
|
|
|
|
new_number = new_number * 10 + abs(mul_sum) % 10
|
|
|
|
the_number = "0" * (len(the_number) - len(str(new_number))) + str(new_number)
|
|
|
|
return int(the_number[:8])
|
|
|
|
def part2(self) -> Any:
|
|
base_pattern = [0, 1, 0, -1]
|
|
the_number = 10000 * self.getInput()
|
|
|
|
for r in range(100):
|
|
print("Round", r)
|
|
new_number = 0
|
|
for l in range(len(the_number)):
|
|
mul_sum = 0
|
|
for i, c in enumerate(the_number):
|
|
pattern_index = ((i + 1) // (l + 1)) % 4
|
|
mul_sum += ((ord(c) - 48) * (2 - pattern_index if pattern_index else 0))
|
|
|
|
new_number = new_number * 10 + abs(mul_sum) % 10
|
|
|
|
the_number = "0" * (len(the_number) - len(str(new_number))) + str(new_number)
|
|
|
|
offset = int(the_number[:8])
|
|
return int(the_number[offset + 1:offset + 8])
|
|
|
|
|
|
if __name__ == '__main__':
|
|
day = Day(2019, 16)
|
|
day.run(verbose=True)
|