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)