Considere una cadena binaria Sde longitud n. Indexando desde 1, podemos calcular las distancias de Hamming entre S[1..i+1]y S[n-i..n]para todos ien orden de 0a n-1. La distancia de Hamming entre dos cadenas de igual longitud es el número de posiciones en las que los símbolos correspondientes son diferentes. Por ejemplo,
S = 01010
da
[0, 2, 0, 4, 0].
Esto se debe a que 0coincide 0, 01tiene una distancia de Hamming de dos a 10, 010coincide 010, 0101tiene una distancia de Hamming de cuatro a 1010 y finalmente 01010coincide.
Sin embargo, solo nos interesan las salidas donde la distancia de Hamming es como máximo 1. Entonces, en esta tarea, informaremos Ysi la distancia de Hamming es como máximo una y Notra. Entonces, en nuestro ejemplo anterior, obtendríamos
[Y, N, Y, N, Y]
Definir f(n)a ser el número de matrices distintas de Ys y Ns se obtiene cuando se itera sobre todas las 2^ndiferentes cadenas de bits posibles Sde longitud n.
Tarea
Para aumentar a npartir de 1, su código debería salir f(n).
Ejemplo de respuestas
Para n = 1..24, las respuestas correctas son:
1, 1, 2, 4, 6, 8, 14, 18, 27, 36, 52, 65, 93, 113, 150, 188, 241, 279, 377, 427, 540, 632, 768, 870
Puntuación
Su código debe iterar desde n = 1dar la respuesta para cada uno npor turno. Voy a cronometrar toda la carrera, matándola después de dos minutos.
Tu puntaje es el más alto n que alcanzas en ese momento.
En caso de empate, la primera respuesta gana.
¿Dónde se probará mi código?
Ejecutaré su código en mi computadora portátil Windows 7 (un poco vieja) con cygwin. Como resultado, brinde toda la ayuda que pueda para ayudar a que esto sea más fácil.
Mi laptop tiene 8GB de RAM y una CPU Intel i7 5600U@2.6 GHz (Broadwell) con 2 núcleos y 4 hilos. El conjunto de instrucciones incluye SSE4.2, AVX, AVX2, FMA3 y TSX.
Entradas principales por idioma
- n = 40 en Rust usando CryptoMiniSat, por Anders Kaseorg. (En la máquina virtual invitada de Lubuntu en Vbox).
- n = 35 en C ++ usando la biblioteca BuDDy, por Christian Seviers. (En la máquina virtual invitada de Lubuntu en Vbox).
- n = 34 en Clingo por Anders Kaseorg. (En la máquina virtual invitada de Lubuntu en Vbox).
- n = 31 en Rust por Anders Kaseorg.
- n = 29 en Clojure por NikoNyrh.
- n = 29 en C por bartavelle.
- n = 27 en Haskell por bartavelle
- n = 24 en Pari / gp por alephalpha.
- n = 22 en Python 2 + pypy por mí.
- n = 21 en Mathematica por alephalpha. (Autoinformado)
Recompensas futuras
Ahora daré una recompensa de 200 puntos por cualquier respuesta que llegue a n = 80 en mi máquina en dos minutos.
