from lib import str_to_ints def part_1(data): ns = list(range(256)) lenghts = str_to_ints(data) i = 0 skip_size = 0 for length in lenghts: a, b = i, (i + length) % len(ns) if a <= b: ns[a:b] = reversed(ns[a:b]) else: rev = list(reversed(ns[a:] + ns[:b])) ns[a:] = rev[:len(ns) - a] ns[:b] = rev[-b:] i = (i + length + skip_size) % len(ns) skip_size += 1 print(ns[0] * ns[1]) def part_2(data): ns = list(range(256)) lenghts = list(map(ord, data)) + [17, 31, 73, 47, 23] rounds = 64 i = 0 skip_size = 0 for _ in range(rounds): for length in lenghts: assert length < 256 a, b = i, (i + length) % len(ns) if a <= b: ns[a:b] = reversed(ns[a:b]) else: rev = list(reversed(ns[a:] + ns[:b])) ns[a:] = rev[:len(ns) - a] if b != 0: ns[:b] = rev[-b:] i = (i + length + skip_size) % len(ns) assert len(ns) == 256 skip_size += 1 out = "" for i in range(0, len(ns), 16): r = 0 for j in range(i, i + 16): r ^= ns[j] out += f"{r:02x}" return out def main(): data = open(0).read().strip() part_1(data) assert part_2("") == "a2582a3a0e66e6e86e3812dcb672a272" assert part_2("AoC 2017") == "33efeb34ea91902bb2f59c9920caa6cd" assert part_2("1,2,3") == "3efbe78a8d82f29979031a4aa0b16a9d" assert part_2("1,2,4") =="63960835bcdc130f0b66d7ff4f6a5a8e" print(part_2(data)) if __name__ == "__main__": main()