Files
aocpy/2017/d10.py

65 lines
1.6 KiB
Python

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()