Considera una stringa binaria S
di lunghezza n
. Indicizzando da 1
, possiamo calcolare le distanze di Hamming tra S[1..i+1]
e S[n-i..n]
per tutti i
in ordine da 0
a n-1
. La distanza di Hamming tra due stringhe di uguale lunghezza è il numero di posizioni in cui i simboli corrispondenti sono diversi. Per esempio,
S = 01010
dà
[0, 2, 0, 4, 0].
Questo perché le 0
partite 0
, 01
hanno la distanza di Hamming due a 10
, le 010
partite 010
, 0101
hanno la distanza di Hamming quattro 1010
e infine si 01010
abbina.
Siamo interessati solo alle uscite in cui la distanza di Hamming è al massimo 1, tuttavia. Quindi in questo compito segnaleremo Y
se la distanza di Hamming è al massimo una e una N
diversa. Quindi nel nostro esempio sopra avremmo
[Y, N, Y, N, Y]
Definire f(n)
il numero di matrici distinte di Y
s che N
si ottengono quando si scorre su tutte le 2^n
diverse stringhe S
di bit possibili di lunghezza n
.
Compito
Per aumentare a n
partire da 1
, il tuo codice dovrebbe essere prodotto f(n)
.
Risposte di esempio
Per n = 1..24
, le risposte corrette sono:
1, 1, 2, 4, 6, 8, 14, 18, 27, 36, 52, 65, 93, 113, 150, 188, 241, 279, 377, 427, 540, 632, 768, 870
punteggio
Il codice dovrebbe iterare dal n = 1
dare la risposta per ogni n
a turno. Farò cronometrare l'intera corsa, uccidendola dopo due minuti.
Il tuo punteggio è il più alto che n
riesci a raggiungere in quel momento.
In caso di pareggio, vince la prima risposta.
Dove verrà testato il mio codice?
Eseguirò il tuo codice sul mio (leggermente vecchio) laptop Windows 7 con Cygwin. Di conseguenza, ti preghiamo di fornire tutta l'assistenza possibile per aiutarti a renderlo semplice.
Il mio laptop ha 8 GB di RAM e una CPU Intel i7 5600U@2,6 GHz (Broadwell) con 2 core e 4 thread. Il set di istruzioni include SSE4.2, AVX, AVX2, FMA3 e TSX.
Voci principali per lingua
- n = 40 in Rust usando CryptoMiniSat, di Anders Kaseorg. (Nella VM guest Lubuntu sotto Vbox.)
- n = 35 in C ++ usando la libreria BuDDy, di Christian Seviers. (Nella VM guest Lubuntu sotto Vbox.)
- n = 34 in Clingo di Anders Kaseorg. (Nella VM guest Lubuntu sotto Vbox.)
- n = 31 in Rust di Anders Kaseorg.
- n = 29 in Clojure di NikoNyrh.
- n = 29 in C di bartavelle.
- n = 27 in Haskell da bartavelle
- n = 24 in Pari / gp di alephalpha.
- n = 22 in Python 2 + pypy da parte mia.
- n = 21 in Mathematica da alephalpha. (Segnalato da sé)
Taglie future
Ora darò una taglia di 200 punti per ogni risposta che arriva a n = 80 sulla mia macchina in due minuti.