Forráskód Böngészése

Solve 2019 day 16

Taddeus Kroes 6 éve
szülő
commit
73bf707147
2 módosított fájl, 53 hozzáadás és 0 törlés
  1. 52 0
      2019/16_fft.py
  2. 1 0
      2019/input/16

+ 52 - 0
2019/16_fft.py

@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+import sys
+
+def fft(seq):
+    end = len(seq)
+    windows = [(i, 1, i + 1, seq[i]) for i in range(0, end, 2)]
+    for i in range(end):
+        newval = 0
+        multiplier = 1
+        newwins = []
+        for start, size, shift, winsum in windows:
+            newval = newval + winsum * multiplier
+            multiplier *= -1
+            if start + shift < end:
+                winsum -= sum_at(seq, start, shift)
+                winsum += sum_at(seq, start + size, shift + 1)
+                newwins.append((start + shift, size + 1, shift, winsum))
+        seq[i] = abs(newval) % 10
+        windows = newwins
+
+def join(seq):
+    return ''.join(map(str, seq))
+
+def message(seq, offset):
+    seq = list(seq)
+    for i in range(100):
+        fft(seq)
+    return join(seq[offset:offset + 8])
+
+def sum_at(seq, start, size):
+    return sum(seq[start:start + size])
+
+def fft_at(seq, start):
+    assert start > len(seq) // 2
+    size = start + 1
+    winsum = sum_at(seq, start, size)
+
+    for i in range(start, len(seq)):
+        newdigit = abs(winsum) % 10
+        winsum += sum_at(seq, start + size, 2) - seq[start]
+        start += 1
+        size += 1
+        seq[i] = newdigit
+
+def message_at(seq, start):
+    for i in range(100):
+        fft_at(seq, start)
+    return join(seq[start:start + 8])
+
+seq = list(map(int, sys.stdin.readline().rstrip()))
+print(message(seq, 0))
+print(message_at(seq * 10000, int(join(seq[:7]))))

+ 1 - 0
2019/input/16

@@ -0,0 +1 @@
+59765216634952147735419588186168416807782379738264316903583191841332176615408501571822799985693486107923593120590306960233536388988005024546603711148197317530759761108192873368036493650979511670847453153419517502952341650871529652340965572616173116797325184487863348469473923502602634441664981644497228824291038379070674902022830063886132391030654984448597653164862228739130676400263409084489497532639289817792086185750575438406913771907404006452592544814929272796192646846314361074786728172308710864379023028807580948201199540396460310280533771566824603456581043215999473424395046570134221182852363891114374810263887875638355730605895695123598637121