소스 검색

Solve 2016 day 16-18

Taddeus Kroes 6 년 전
부모
커밋
e51598d61d
4개의 변경된 파일70개의 추가작업 그리고 0개의 파일을 삭제
  1. 25 0
      2016/16_dragoncurve.py
  2. 30 0
      2016/17_vault.py
  3. 14 0
      2016/18_traps.py
  4. 1 0
      2016/input/18

+ 25 - 0
2016/16_dragoncurve.py

@@ -0,0 +1,25 @@
+#!/usr/bin/env python3
+def fill(seed, target):
+    curve = [False] * target
+    for i, bit in enumerate(seed):
+        curve[i] = bit == '1'
+    length = len(seed)
+    while length < target:
+        for i in range(max(0, length * 2 + 1 - target), length):
+            curve[length * 2 - i] = not curve[i]
+        length = length * 2 + 1
+    return curve
+
+def checksum(curve):
+    length = len(curve)
+    while length % 2 == 0:
+        for i in range(length // 2):
+            curve[i] = curve[i * 2] == curve[i * 2 + 1]
+        length >>= 1
+    return curve[:length]
+
+def joinbits(curve):
+    return ''.join('01'[bit] for bit in curve)
+
+print(joinbits(checksum(fill('01110110101001000', 272))))
+print(joinbits(checksum(fill('01110110101001000', 35651584))))

+ 30 - 0
2016/17_vault.py

@@ -0,0 +1,30 @@
+#!/usr/bin/env python3
+from functools import reduce
+from hashlib import md5
+from heapq import heappop, heappush
+
+def doors_open(path):
+    a, b = md5(path.encode('ascii')).digest()[:2]
+    quads = a >> 4, a & 0xf, b >> 4, b & 0xf
+    return tuple(i for i, quad in enumerate(quads) if quad > 0xa)
+
+def walk(passcode):
+    dx = 0, 0, -1, 1
+    dy = -1, 1, -0, 0
+    work = [(len(passcode), 6, 0, 0, passcode)]
+    while work:
+        pathlen, dist, x, y, path = heappop(work)
+        if dist == 0:
+            yield path[len(passcode):]
+        else:
+            for door in doors_open(path):
+                newx = x + dx[door]
+                newy = y + dy[door]
+                if 0 <= newx < 4 and 0 <= newy < 4:
+                    newdist = dist - dx[door] - dy[door]
+                    newpath = path + 'UDLR'[door]
+                    heappush(work, (len(newpath), newdist, newx, newy, newpath))
+
+walker = walk('gdjjyniy')
+print(next(walker))
+print(len(reduce(lambda a, b: b, walker)))

+ 14 - 0
2016/18_traps.py

@@ -0,0 +1,14 @@
+#!/usr/bin/env python3
+import sys
+
+def count_safe(first, nrows):
+    row = [False] + [c == '^' for c in first] + [False]
+    safe = len(row) - sum(row) - 2
+    for step in range(nrows - 1):
+        row[1:-1] = (row[i - 1] != row[i + 1] for i in range(1, len(row) - 1))
+        safe += len(row) - sum(row) - 2
+    return safe
+
+first = sys.stdin.readline().rstrip()
+print(count_safe(first, 40))
+print(count_safe(first, 400000))

+ 1 - 0
2016/input/18

@@ -0,0 +1 @@
+^..^^.^^^..^^.^...^^^^^....^.^..^^^.^.^.^^...^.^.^.^.^^.....^.^^.^.^.^.^.^.^^..^^^^^...^.....^....^.