Betrachten Sie eine binäre Zeichenfolge S
von Länge n
. Indizieren 1
wir von , können wir die Hamming-Entfernungen zwischen S[1..i+1]
und S[n-i..n]
für alle i
in der Reihenfolge von 0
bis berechnen n-1
. Der Hamming-Abstand zwischen zwei Saiten gleicher Länge ist die Anzahl der Positionen, an denen sich die entsprechenden Symbole unterscheiden. Beispielsweise,
S = 01010
gibt
[0, 2, 0, 4, 0].
Dies liegt daran, dass 0
Übereinstimmungen 0
, 01
Hamming-Distanz zwei zu 10
, 010
Übereinstimmungen 010
, 0101
Hamming-Distanz vier zu 1010
und schließlich sich 01010
selbst entsprechen.
Wir interessieren uns jedoch nur für Ausgaben, bei denen der Hamming-Abstand höchstens 1 beträgt. In dieser Aufgabe werden wir also eine Y
angeben, wenn die Hamming-Distanz höchstens eins beträgt, und eine N
andere. Also in unserem obigen Beispiel würden wir bekommen
[Y, N, Y, N, Y]
Definieren Sie f(n)
die Anzahl der verschiedenen Arrays von Y
s und N
s, die Sie erhalten, wenn Sie alle 2^n
verschiedenen möglichen Bitfolgen S
der Länge durchlaufen n
.
Aufgabe
Zum Erhöhen n
ab 1
sollte Ihr Code ausgegeben werden f(n)
.
Beispielantworten
Denn n = 1..24
die richtigen Antworten sind:
1, 1, 2, 4, 6, 8, 14, 18, 27, 36, 52, 65, 93, 113, 150, 188, 241, 279, 377, 427, 540, 632, 768, 870
Wertung
Ihr Code sollte iterieren, nachdem Sie n = 1
die Antwort für jede einzelne n
nacheinander gegeben haben. Ich werde den gesamten Lauf zeitlich festlegen und ihn nach zwei Minuten töten.
Ihre Punktzahl ist die höchste, die n
Sie in dieser Zeit erreichen.
Bei einem Gleichstand gewinnt die erste Antwort.
Wo wird mein Code getestet?
Ich werde Ihren Code auf meinem (etwas alten) Windows 7-Laptop unter Cygwin ausführen. Bitte geben Sie daher jede mögliche Unterstützung, um dies zu vereinfachen.
Mein Laptop hat 8 GB RAM und eine Intel i7 5600U @ 2,6 GHz (Broadwell) -CPU mit 2 Kernen und 4 Threads. Der Befehlssatz umfasst SSE4.2, AVX, AVX2, FMA3 und TSX.
Führende Einträge pro Sprache
- n = 40 in Rust mit CryptoMiniSat von Anders Kaseorg. (In Lubuntu Gast-VM unter Vbox.)
- n = 35 in C ++ unter Verwendung der BuDDy-Bibliothek von Christian Seviers. (In Lubuntu Gast-VM unter Vbox.)
- n = 34 in Clingo von Anders Kaseorg. (In Lubuntu Gast-VM unter Vbox.)
- n = 31 in Rust von Anders Kaseorg.
- n = 29 in Clojure von NikoNyrh.
- n = 29 in C von Bartavelle.
- n = 27 in Haskell von Bartavelle
- n = 24 in Pari / gp von Alephalpha.
- n = 22 in Python 2 + pypy von mir.
- n = 21 in Mathematica von Alephalpha. (Selbst berichtet)
Zukünftige Kopfgelder
Ich werde jetzt eine Prämie von 200 Punkten für jede Antwort geben, die in zwei Minuten auf meinem Computer auf n = 80 steigt .