Watch
1
0
Fork
You've already forked advent-of-code
0

2017 Day 10 Part 2

This commit is contained in:
Jeremy Kaplan 2026-07-31 13:13:57 -04:00
commit 85f86147ee

View file

@ -1,31 +1,62 @@
from functools import reduce
with open("input/day10.txt") as f: with open("input/day10.txt") as f:
size, input = 256, f.read().strip() size, input = 256, f.read().strip()
lengths = [int(i) for i in input.split(",")]
ring = list(range(size)) def part1(size, input):
pos = 0 lengths = [int(i) for i in input.split(",")]
skip = 0
for length in lengths: ring = list(range(size))
assert length <= len(ring), "overlap undefined" _, _, ring = hash_round(0, 0, ring, lengths)
tail = min(length, len(ring) - pos) return ring[0] * ring[1]
head = max(length - tail, 0)
a = pos + tail
b = 0 + head
prefix = ring[b:pos] def hash_round(pos, skip, ring, lengths):
inside = ring[pos:a] + ring[:b] for length in lengths:
suffix = ring[a:] assert length <= len(ring), "overlap undefined"
assert length == len(inside) tail = min(length, len(ring) - pos)
head = max(length - tail, 0)
twisted = inside[::-1] a = pos + tail
b = 0 + head
ring = twisted[tail:] + prefix + twisted[:tail] + suffix prefix = ring[b:pos]
pos = (pos + length + skip) % len(ring) inside = ring[pos:a] + ring[:b]
skip += 1 suffix = ring[a:]
print(ring[0] * ring[1]) assert length == len(inside)
twisted = inside[::-1]
ring = twisted[tail:] + prefix + twisted[:tail] + suffix
pos = (pos + length + skip) % len(ring)
skip += 1
return pos, skip, ring
def part2(size, input):
lengths = [ord(c) for c in input] + [17, 31, 73, 47, 23]
pos, skip = 0, 0
ring = list(range(size))
for _ in range(64):
pos, skip, ring = hash_round(pos, skip, ring, lengths)
dense = [0] * 16
for i in range(16):
start = 16 * i
block = ring[start : start + 16]
dense[i] = reduce(int.__xor__, block)
out = ""
for d in dense:
out += f"{d:02x}"
return out
print(part1(size, input))
print(part2(size, input))