Tenga en cuenta que cuando digo "negar", me refiero a reemplazar todos los ceros (es decir, una negación bit a bit)
La secuencia Thue-Morse es como 01101001
La forma en que lo genera es:
Comienza tomando 0. Niega lo que queda y añádelo hasta el final.
Entonces, toma 0
. Negarlo y agregarlo al final -01
Luego, tómalo, niegalo y agrégalo al final. 0110
Y así.
Otra propiedad interesante de esto es que la distancia entre ceros crea una cadena "irracional" y no repetitiva.
Entonces:
0110100110010110
|__|_||__||_|__|
2 1 0 2 01 2 <------------Print this!
¿Puede escribir un programa que, cuando ingrese n, produzca los primeros n dígitos de la cadena para imprimir?
Este es el código de golf, por lo que gana el menor número de bytes.
Respuestas:
Jalea, 9 bytes
Pruébalo en línea!
Cómo funciona
fuente
Python
32,104928884 bytesEsta es una solución bastante rudimentaria basada en la construcción de una secuencia Thue-Morse ternaria desde cero. Esta secuencia es idéntica a la que se pregunta, aunque alguien más tendrá que escribir una explicación más completa de por qué es así. En cualquier caso, esta secuencia es solo una modificación trivial de esta, A036580 .
Editar: Cambió el bucle for a una lista de comprensión, cambió de una función a un programa y cambió todo a Python 2. Gracias a Dennis por la ayuda en el golf.
fuente
Julia,
5650 bytesEsta es una función anónima que acepta un entero y devuelve una matriz de enteros. Para llamarlo, asígnelo a una variable.
Generamos la secuencia Thue-Morse bit-intercambiado partiendo de un número entero
m = 1
y, a continuación añadimos1-m
am
como una matrizn+1
veces, donden
es la entrada. Esto genera más términos de los que necesitamos. Luego localizamos los que usanfind(m)
, obtenemos la diferencia entre los valores consecutivos usandodiff
, y restamos 1 elemento. Tomar los primerosn
términos de la matriz resultante nos da lo que queremos.¡Ahorré 6 bytes y solucioné un problema gracias a Dennis!
fuente
PowerShell, 102 bytes
Una forma un poco diferente de computación. PowerShell no tiene una manera fácil de "obtener todos los índices en esta matriz donde el valor en ese índice es igual a tal y tal ", por lo que debemos ser un poco creativos.
Aquí estamos usando A001969 , los "números con un número par de 1s en su expansión binaria", que casualmente da los índices de los 0 en la secuencia Thue-Morse. ;-)
El
filter
calcula ese número. Por ejemplo,x 4
daría9
. Luego simplemente hacemos un bucle desde0
nuestra entrada$args[0]
, restando1
porque estamos indexados a cero, y cada iteración del bucle imprime la diferencia entre el siguiente número y el número actual. La salida se agrega a la canalización e implícitamente se genera con nuevas líneas.Ejemplo
fuente
Haskell, 42 bytes
Ejemplo de uso:
(`take`l) 7
->[2,1,0,2,0,1,2]
.Es una implementación de
a036585_list
de A036585 desplaza hacia abajo a0
,1
y2
. Golf:concat (map f l)
esf =<< l
yf 0=[0,1,2]; f 1=[0,2]; f 2=[1]
es([[0..2],[0,2],[1]]!!)
.Nota:
l
es la secuencia infinita. Se necesitan 10 bytes o aproximadamente el 25% para implementar la función de primerosn
elementos.fuente
Mathematica,
796870 bytesfuente
n<3
.MATL ,
1411 bytesPruébalo en línea!
Como señaló @TimmyD en su respuesta , la secuencia deseada está dada por las diferencias consecutivas de A001969 . Este último a su vez se puede obtener como la secuencia Thue-Morse más 2 * n . Por lo tanto, la secuencia deseada viene dada por (diferencias consecutivas de la secuencia Thue-Morse) más uno .
Por otro lado, la secuencia Thue-Morse se puede obtener como el número de unos en la representación binaria de n , comenzando desde n = 0.
fuente
05AB1E ,
1413 bytesCódigo:
Explicación:
Pruébalo en línea!
fuente
Python, 69 bytes
El
i
término th de esta secuencia es1+t(i+1)-t(i)
, dondet
está la función Thue-Morse. El código lo implementa de forma recursiva, que es más corto quefuente
Mathematica, 65 bytes
Supera mi otra respuesta, pero no supera el extra-
versión de golfpicante. Ahora normalmente pongo mi código entre comillas, luego lo saco porque a Mathematica le encanta agregar espacios a su código (que no hace nada) pero nunca se mete con cadenas, pero eso no funciona para el código que sí tiene comillas ...Lo que sea, solo estoy usando la magia incorporada para esto. La salida es una cadena.
fuente
Mathematica, 58 bytes
fuente
1;;#
puede ser reemplazado por simplemente;;#
.Position
.)Perl, 45 + 2 = 47 bytes
Requiere la bandera
-p
y-a
:Puerto de @ Sherlock9 respuesta
Guardado 9 bytes gracias a Ton
fuente
-a
opción le da una copia gratuita de la entrada, entonces$_=2;s/./(1,20,210)[$&]/ge until/.{@F}/;$_=$&
-p
con-E
:say$&
al final si suponemos que Perl> v5.18JavaScript (ES6),
7367 bytesLa respuesta del puerto de @ Sherlock9.
editar: guardado 6 bytes gracias a @WashingtonGuedes.
fuente
!s[n]
Funcionaría en lugar des.length<n
? O tal vez solos[n]
con?:
invertido?CJam (19 bytes)
Demostración en línea
Esto utiliza el enfoque de incrementar las sucesivas diferencias entre los elementos de la secuencia Thue-Morse.
Mi enfoque más corto usando reglas de reescritura es de 21 bytes:
(Advertencia: lento). Esto codifica las reglas de reescritura
como
fuente
Ruby, 57 bytes
Un puerto de la respuesta Python de xnor. Los cambios se encuentran en su mayoría en la declaración ternaria
t
en lugar de laand
debida a0
estar Truthy en Ruby, y el uso(1..n).map
y1+t[i]-t[i-1]
ahorrar bytes frente a la importación de la lista por comprensión directa.fuente
0
es verdad? ¿¿Cómo funciona??Mathematica (
casino verbal),107110 bytesLa secuencia se genera aplicando repetidamente una regla de reemplazo. Otra regla lo transforma a la salida deseada. Si hay suficientes personas interesadas, lo explicaré en detalle.
versión no alfanumérica
como lo sugiere CatsAreFluffy.
fuente
$
y reemplaza0
conx-x
(donde x es una secuencia no utilizada de$
) (y usa(x-x)!
para 1 (ídem)), seremos libres de caracteres alfanuméricos.{x__}
lugar de_[x__]
$[_]:=-/;
(ambos por emulación de máquina de contador)