65 lines
1.6 KiB
Python
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()
|