From 85f86147ee2137cfbfb100406e7934c35f400385 Mon Sep 17 00:00:00 2001 From: Jeremy Kaplan Date: Fri, 31 Jul 2026 13:13:57 -0400 Subject: [PATCH] 2017 Day 10 Part 2 --- 2017/day10.py | 69 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 50 insertions(+), 19 deletions(-) diff --git a/2017/day10.py b/2017/day10.py index 95c973c..fb35e88 100644 --- a/2017/day10.py +++ b/2017/day10.py @@ -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))