Antecedentes
El Random Domino Automaton es un modelo de juguete para terremotos, inspirado en autómatas celulares. En este desafío, su tarea es simular una versión simplificada de este modelo y recopilar datos de él.
El autómata se define en una matriz A
de k
bits, que representa una línea de falla en la cual pueden ocurrir terremotos. La matriz se envuelve en sus bordes. La condición A[i] = 0
significa que la posición i
está relajada y A[i] = 1
significa que está excitada o que contiene energía almacenada. En cada paso de tiempo, se elige una posición de la matriz de manera uniforme al azar. Si esa posición se relaja, se excita (se agrega energía potencial al sistema). Si esa posición ya está excitada, desencadena un terremoto, y la posición elegida y todas las posiciones excitadas conectadas a ella se relajan nuevamente. El número de posiciones excitadas que se relajan es la magnitud del terremoto.
Ejemplo
Considera la matriz
100101110111
de longitud 12. Si el proceso aleatorio elige el segundo bit desde la izquierda, la matriz se actualiza a
110101110111
^
ya que el bit elegido (marcado con ^
) era 0
. Si luego elegimos el cuarto bit de la izquierda, que es un aislado 1
, se activa un terremoto de magnitud 1, y el bit se establece de 0
nuevo en:
110001110111
^
A continuación, podríamos elegir el segundo bit de la derecha, que desencadena un terremoto de magnitud 5:
000001110000
^
Tenga en cuenta que todos los 1
s en el mismo "clúster" que el elegido fueron parte del terremoto, y la matriz se envuelve en el borde.
La tarea
Deberá tomar como entradas dos enteros positivos k
y t
, y su tarea es simular el autómata de dominó aleatorio para t
pasos de tiempo, comenzando desde una k
matriz de longitud inicial de todos los 0
s. Su salida será una lista L
de k
enteros, donde L[i]
(con indexación basada en 1) contiene el número de terremotos de magnitud i
que ocurrieron durante la simulación. Se le permite eliminar los ceros finales de la salida.
Para las entradas k = 15
y t = 1000
, algunas salidas representativas son
[117, 97, 45, 26, 10, 5, 3, 1, 3, 0, 0, 0, 0, 0, 0]
[135, 91, 58, 21, 8, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0]
[142, 63, 51, 31, 17, 4, 2, 1, 1, 0, 0, 0, 0, 0, 0]
[106, 75, 45, 30, 16, 8, 5, 2, 2, 0, 0, 0, 0, 0, 0]
[111, 96, 61, 22, 3, 8, 3, 2, 0, 0, 0, 1, 0, 0, 0]
Reglas
Se permiten tanto programas completos como funciones. El conteo de bytes más corto gana, y las lagunas estándar no se permiten.
Tenga en cuenta que no es necesario que simule el autómata utilizando una implementación particular, solo importa la salida.
Respuestas:
Pyth, 48 bytes
Me inspiré un poco en la explicación de @ Dennis. Tuve algunos pensamientos similares ayer, pero realmente no los seguí.
Pruébelo en línea: demostración
Explicación:
fuente
CJam,
5755 bytesEsta es una función anónima que saca k y t de la pila ( k encima de t ) y deja la matriz deseada a cambio.
Pruébelo en línea en intérprete de CJam .
Cómo funciona
fuente
Python 2, 153 bytes
Resulta que tenía casi la misma solución que la de Fry , pero con un poco más de violín.
fuente
randrange
, pero no me di cuenta de que funcionaba con un solo argumento. ¡Buen trabajo!Java,
278272 bytesJava no es el mejor lenguaje de golf, y no soy el mejor golfista, pero fue muy divertido escribir, ¡así que aquí está! ¡Avísame sobre errores y mejoras! (Decidí volver a enviarlo solo como una función).
Y el archivo con espacios y comentarios:
fuente
Alt+09
od[q]+=1;
Esto puede convertirse end[q]++;
un incremento directo en las matrices en lugar de usar + = en todas partes. Eso debería salvar a un montón de personajes.for(;t>0;t--){
se puede cambiar afor(;t-->0;){
: DPitón 2,
174170Gracias @Vioz por encontrar una forma más corta de hacer
D
y probar de nuevo quenot
generalmente es golfable. Y también por escribir la explicación.Intenté hacer un programa similar en Pyth, pero parece haber un problema de alcance en lo que estaba tratando de hacer. Esto implementa ingenuamente las fichas de dominó y la función
U
propaga terremotos. La dirección de restaU
no necesita un mod porque se envolverá naturalmente. El último elemento deE
cuenta el número de veces que un cero se convierte en uno, por lo que no se imprime al final.Ungolfed + Explicación:
fuente
D[r]=not e
paraD[r]=e<1
guardar 2 bytes, yE=[0]*-~k
paraE=D+[0]
guardar otros 2, para llegar a 170.ES6,
224196189179172Las cosas fáciles se han jugado al golf, pero aún queda mucho trabajo por hacer. Escribiré una explicación más tarde. Además, si alguien puede decirme por qué la
new Date%k
cosa corta ya no funciona tan bien, sería genial.El uso es
fuente
new
. No necesita esot
en el ciclo for, no necesita los dos últimos;
a[r]^=1
defs trabajará si el valor inicial es1
o0
Perl, 212
La versión anterior que había publicado no se ajustaba correctamente, y su implementación tomó algo de trabajo.
Probablemente este no sea el algoritmo correcto para esto, pero no puedo pensar en este momento. La versión sin golf es la siguiente.
Sin golf:
fuente
CJam, 76 bytes
Bueno, esto no es muy competitivo. Pero como me llevó bastante tiempo, pensé en publicarlo de todos modos.
Pruébalo en línea
fuente