Solve a couple of 2017 problems.
This commit is contained in:
64
2017/d10.py
Normal file
64
2017/d10.py
Normal file
@@ -0,0 +1,64 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user