Fondo
Sí, la física de las cadenas de bits es algo real . La idea es construir una nueva teoría de la física utilizando solo cadenas de bits que evolucionen bajo una regla probabilística ... o algo así. A pesar de leer un par de artículos al respecto, todavía estoy bastante confundido. Sin embargo, el universo de la cadena de bits lo convierte en un bonito código de golf.
Programa Universo
La física de Bitstring tiene lugar en el llamado universo de programas . En cada paso de la evolución del universo, hay una lista finita L
de cadenas de bits de cierta longitud k
, comenzando con la lista de dos elementos [10,11]
donde k = 2
. Un paso de tiempo se procesa de la siguiente manera (en pseudocódigo similar a Python).
A := random element of L
B := random element of L
if A == B:
for each C in L:
append a random bit to C
else:
append the bitwise XOR of A and B to L
Todas las elecciones aleatorias son uniformemente aleatorias e independientes entre sí.
Ejemplo
Un ejemplo de evolución de 4 pasos podría ser el siguiente. Comience con la lista inicial L
:
10
11
Elegimos aleatoriamente A := 10
y B := 10
, que son la misma fila, lo que significa que necesitamos extender cada cadena L
con un bit aleatorio:
101
110
A continuación, elegimos A := 101
y B := 110
, y dado que no son iguales, agregamos su XOR a L
:
101
110
011
Luego, elegimos A := 011
y B := 110
, y nuevamente agregamos su XOR:
101
110
011
101
Finalmente, elegimos A := 101
(última fila) y B := 101
(primera fila), que son iguales, por lo que ampliamos con bits aleatorios:
1010
1100
0111
1010
La tarea
Su tarea es tomar un número entero no negativo t
como entrada, simular el universo del programa para t
pasos de tiempo y devolver o imprimir la lista resultante L
. Tenga t = 0
en cuenta que los resultados en la lista inicial [10,11]
. Puede generar L
una lista de listas de enteros, una lista de listas de valores booleanos o una lista de cadenas; si la salida va a STDOUT, también puede imprimir las cadenas de bits una por línea en algún formato razonable. El orden de las cadenas de bits es significativo; en particular, la lista inicial no puede ser [11,10]
, [01,11]
ni nada de eso. Ambas funciones y programas completos son aceptables, las lagunas estándar no están permitidas y gana el conteo de bytes más bajo.
Respuestas:
Pyth,
2726 bytesPruébelo en línea: demostración
Explicación:
fuente
xVFK
es equivalente axMK
.xVFK
es equivalente alxMCK
mismo número de bytes.CJam,
42403837 bytes1 byte guardado por Sp3000.
Explicación
Cree el estado inicial como un número base-2:
Y luego realice el bucle principal e imprima el resultado al final:
Pruébalo aquí.
fuente
Julia,
141129 bytesNada inteligente Crea una función sin nombre que acepta un entero como entrada y devuelve una matriz de matrices. Para llamarlo, dale un nombre, por ejemplo
f=t->...
.Ungolfed + explicación:
Ejemplos:
¡Guardado 12 bytes gracias a ML!
fuente
A=something;B=something else to A,B=something,something else
:t->(L=Any[[1,0],[1,1]];for i=1:t r=1:length(L);A,B=L[rand(r)],L[rand(r)];A==B?(for j=r L[j]=[L[j],rand(0:1)]end):(push!(L,A$B))end;L)
A
y porB
separado es en realidad la misma longitud que asignarlos juntos, así que dejé esa parte como está. Gracias de nuevo por su sugerencia!Pitón 2, 141
Probé algunos métodos diferentes, pero lo mejor que pude obtener fue relativamente sencillo. Gracias a @ Sp3000 por 15 caracteres más o menos (y por enseñarme sobre la existencia de
int.__xor__
).fuente
Pitón 2,
127122Suponiendo que las cadenas de bits de Python del formulario,
'0b1'
etc. estén bien:Aquí solo un ligero matiz es el uso del hecho de que XOR (A, B) = 0 si A = B.
Gracias a @ Sp300 por acortar el
for
circuito de cierrefuente
Pyth, 34
Utiliza reducir para aplicar cada iteración. Te lo explicaré cuando termine de jugar golf.
Pruébalo aquí
fuente
K,
465346 bytesUna buena parte del tamaño (aproximadamente 7 bytes) de esto se debe al hecho de que K no tiene
xor
operador, por lo que tuve que implementar uno yo mismo. Originalmente, usé una lista de cadenas, seguido de darme cuenta de que era increíblemente estúpido. ¡Así que ahora corté los 7 bytes nuevamente!Antes de:
@JohnE señaló en los comentarios que se suponía que el estado inicial estaba codificado, lo que costó 7 bytes adicionales. : /
fuente
(1 0;1 1)
; su programa lo acepta como entrada.JavaScript ( ES6 ) 152
Una función, que utiliza cadenas (con números debería ser más corta, pero en JavaScript las operaciones de bits están limitadas a enteros de 32 bits).
Prueba en Firefox usando el fragmento a continuación.
fuente
K,
454138 bytesLa estructura de mi respuesta es bastante similar a la de @ kirbyfan64sos, pero en lugar de cadenas utilicé vectores 1/0 y evito la necesidad de un condicional (
:[ ; ; ]
) al indexar en una lista.Algunas carreras:
Editar:
Guardado cuatro bytes con una forma más compacta de construir el universo inicial:
Edit2:
Olvidé que "elegir" puede tomar una lista como argumento correcto:
Entonces puedo simplificar parte de esto. Crédito donde corresponde, Kirby consiguió este truco antes que yo.
fuente
Javascript,
241233 bytesEso es un poco largo.
fuente
for(b=prompt(a=[[1,0],[1,1]]),R=Math.random;b--;){c=a.length;d=a[c*R()|0];e=a[c*R()|0];if(d+""==e+"")for(f=0;f<c;f++)a[f].push(2*R()|0);else{for(h=0,g=[];h<d.length;)g.push(d[h]^e[h++]);a.push(g)}}alert(a.join("\n"))
produce la salida deseada 3/5 del tiempo.for(b=prompt(a=[[1,0],[1,1]]),R=Math.random;b--;){c=a.length;d=a[c*R()|0];e=a[c*R()|0];if(d+""==e+"")for(f=0;f<c;f++)a[f].push(2*R()|0);else{g=[];for(h=0;h<d.length;h++)g.push(d[h]^e[h]);a.push(g)}}alert(a.join("\n"))
funciona el 90% del tiempo.T-SQL (2012+), 1019
Lamento mucho que esto no sea competitivo, pero para ser sincero, no pensé que podría hacer que esto funcione y tuve que publicarlo una vez que lo hice. Intenté jugar al golf un poco :)
Para manejar las conversiones binarias / enteras, tuve que crear un par de funciones escalares (513 de los bytes).
A
va de entero a una cadena de bits.B
hace lo contrarioLuego está el procedimiento.
@C
es la cantidad de pasosDiez mil iteraciones tomaron alrededor de 2 minutos y devolvieron 9991 filas
fuente
Pyth - 37 bytes
Obviamente, solo sigue el psuedocode. Probablemente pueda jugar mucho al golf.
Pruébalo aquí en línea .
fuente
O2
lugar deO1
.O1
le da un número aleatorio del rangoU1 = [0]
.0
.Mathematica, 106 bytes
fuente
Perl, 102
Trate de mí .
fuente
R, 186
Nada mágico aquí. Ingrese el valor para
t
en la consola R y ejecute el script. Es difícil "jugar" el código R pero aquí hay una versión más legible:fuente
sample
a una variable. por ejemplos=sample
, use s en lugar de muestra. Desafortunadamente, creo que su método de agregar un bit aleatorio en ellapply
terminará con una muestra aleatoria que se agregará a todos los elementos de la lista.lapply(L,function(x)append(x,sample(0:1,1)))
parece funcionar, pero a un costo. Puede reemplazarloas.numeric
con el1*
que debería recuperar algo.Rubí, 82
Bastante sencillo. En comparación con otros idiomas que no son de golf, Ruby parece tener un buen desempeño con su gran biblioteca estándar.
Salida de muestra para t = 101010:
fuente