2017 Day 10 Part 2
This commit is contained in:
parent
63a14f13f9
commit
85f86147ee
1 changed files with 50 additions and 19 deletions
|
|
@ -1,12 +1,19 @@
|
||||||
|
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()
|
||||||
|
|
||||||
|
|
||||||
|
def part1(size, input):
|
||||||
lengths = [int(i) for i in input.split(",")]
|
lengths = [int(i) for i in input.split(",")]
|
||||||
|
|
||||||
ring = list(range(size))
|
ring = list(range(size))
|
||||||
pos = 0
|
_, _, ring = hash_round(0, 0, ring, lengths)
|
||||||
skip = 0
|
|
||||||
|
|
||||||
|
return ring[0] * ring[1]
|
||||||
|
|
||||||
|
|
||||||
|
def hash_round(pos, skip, ring, lengths):
|
||||||
for length in lengths:
|
for length in lengths:
|
||||||
assert length <= len(ring), "overlap undefined"
|
assert length <= len(ring), "overlap undefined"
|
||||||
|
|
||||||
|
|
@ -28,4 +35,28 @@ for length in lengths:
|
||||||
pos = (pos + length + skip) % len(ring)
|
pos = (pos + length + skip) % len(ring)
|
||||||
skip += 1
|
skip += 1
|
||||||
|
|
||||||
print(ring[0] * ring[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