2017 Day 10 Part 2
This commit is contained in:
parent
63a14f13f9
commit
85f86147ee
1 changed files with 50 additions and 19 deletions
|
|
@ -1,31 +1,62 @@
|
|||
from functools import reduce
|
||||
|
||||
with open("input/day10.txt") as f:
|
||||
size, input = 256, f.read().strip()
|
||||
|
||||
lengths = [int(i) for i in input.split(",")]
|
||||
|
||||
ring = list(range(size))
|
||||
pos = 0
|
||||
skip = 0
|
||||
def part1(size, input):
|
||||
lengths = [int(i) for i in input.split(",")]
|
||||
|
||||
for length in lengths:
|
||||
assert length <= len(ring), "overlap undefined"
|
||||
ring = list(range(size))
|
||||
_, _, ring = hash_round(0, 0, ring, lengths)
|
||||
|
||||
tail = min(length, len(ring) - pos)
|
||||
head = max(length - tail, 0)
|
||||
return ring[0] * ring[1]
|
||||
|
||||
a = pos + tail
|
||||
b = 0 + head
|
||||
|
||||
prefix = ring[b:pos]
|
||||
inside = ring[pos:a] + ring[:b]
|
||||
suffix = ring[a:]
|
||||
def hash_round(pos, skip, ring, lengths):
|
||||
for length in lengths:
|
||||
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
|
||||
pos = (pos + length + skip) % len(ring)
|
||||
skip += 1
|
||||
prefix = ring[b:pos]
|
||||
inside = ring[pos:a] + ring[:b]
|
||||
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))
|
||||
|
|
|
|||
Loading…
Reference in a new issue