La regla 110 es un autómata celular con algunas propiedades interesantes. Su objetivo es simular una regla 110 en la menor cantidad de caracteres posible.
Para aquellos que no saben, la regla 110 se simula línea por línea en una cuadrícula. Cada cuadrado en una línea de la cuadrícula mira los cuadrados de arriba, arriba a la izquierda y arriba a la derecha para determinar qué celda debería ser.
current pattern 111 110 101 100 011 010 001 000
new cell 0 1 1 0 1 1 1 0
Entrada: números del 0 al 39 que representan el enésimo cuadro de entrada de la fila superior, en cualquier formato razonable (cadena separada por comas, lista, argumentos de función). Para acomodar idiomas indexados en 1, los números también pueden estar indexados en 1 y, por lo tanto, varían de 1 a 40.
Entrada de ejemplo:
38,39
Salida: una cuadrícula de 40 x 40 que representa la ejecución de autómatas, incluida la primera fila. Debe dejar 0 en blanco y 1 como cualquier carácter de impresión visible. Se permiten espacios finales, siempre que la cuadrícula real se pueda distinguir razonablemente. La parte inferior de la cuadrícula puede tener una nueva línea, pero no debe haber líneas en blanco entre las líneas de la cuadrícula.
Salida de ejemplo:
XX
XXX
XX X
XXXXX
XX X
XXX XX
XX X XXX
XXXXXXX X
XX XXX
XXX XX X
XX X XXXXX
XXXXX XX X
XX X XXX XX
XXX XXXX X XXX
etc.
Nota: Ya se ha hecho una pregunta similar sobre los autómatas celulares 1D, pero espero que, al usar solo una regla, se puedan escribir respuestas más cortas.
Respuestas:
CJam - 47
Se utiliza
!
para las celdas "1".Pruébalo en http://cjam.aditsu.net/
Explicación:
S40*
hace una cadena (matriz) de 40 espacios,l',/
lee una línea y se divide por comas,{…}/
ejecuta el bloque para cada elemento (los números en forma de cadena):
i'!t
convierte el número en entero y establece el elemento en esa posición en la cadena anterior (inicialmente 40 espacios ) a '!'En este punto hemos obtenido la primera línea.
{…}39*
ejecuta el bloque 39 veces-
N
agrega una nueva línea-
40,
hace la matriz [0 1… 39]-
S3$S++
copia la línea anterior (posición 3 en la pila) y la rellena con un espacio en cada lado-
f{…}
ejecuta el bloque para {cada número de 0 a 39} y {la línea rellenada}:
>3<
toma una porción de 3 elementos de la línea rellenada que comienza en el número actual-
2b
convierte de base 2; los elementos que dividimos no son dígitos de base 2, pero los caracteres se convierten a sus valores ASCII y '' mod 8 es 0 y '!' mod 8 es 1-
137Yb
convierte 137 a base 2 (Y
= 2), obteniendo [1 0 0 0 1 0 0 1], que es 110 invertido y negado (en 8 bits)-
='!^
obtiene el correspondiente dígito de base 2 (el La matriz se envuelve para que el índice se tome mod 8) y xor con el '!' carácter, que resulta en '!' para 0 y '' para 1fuente
Ruby, 113 caracteres
Toma entrada en stdin. Para usar una regla diferente, simplemente reemplace el
110
en la última línea con cualquier regla que desee probar.Ejemplo:
fuente
Mathematica, 122 bytes
Sí, puede ver esto como un abuso de esta laguna , pero a) esa laguna está bastante disputada, b) una pregunta de Autómata celular necesita una respuesta de Mathematica (especialmente una sobre la Regla 110) yc) la respuesta de Ruby de Ventero es más corta de todos modos, así que no No creo que se haya hecho ningún daño.
La mayoría de los caracteres se utilizan para el análisis de entrada y el formato de salida. El autómata real se simula usando
Esto utiliza condiciones de contorno periódicas (por lo que la cuadrícula se ajusta)
fuente
Python - 141
Ejecutar como p. Ej.
python 110.py <<< 38,39
fuente
['X',' ']
podría cambiarse'X '
para guardar 5 caracteres.o=range()
q,
676258 bytesAsume que no hay envoltura:
Versión antigua
fuente
Python, 186
Decente pero probablemente no óptimo.
No especificó cómo se obtiene la entrada, así que simplemente hice una función.
Use ejemplo:
Salida:
fuente
Mathematica, 113 caracteres
Otra respuesta de Mathematica usando
CellularAutomaton
.fuente
" "["X"][[#]]&
funciona?" "["X"][[1]]
es"X"
." "["X"][[0]]
devuelve la cabeza de" "["X"]
, a saber" "
.C - 178
Este código depende del hecho de que cada fila de una matriz se almacena en la memoria contigua. Además, no imprime la primera fila, pero imprime las siguientes 40, ya que las reglas solo especifican una cuadrícula de 40x40.
Con sangría solo para facilitar la lectura, el recuento de bytes solo incluye el código necesario.
fuente
Lua - 351
No es el idioma ideal para jugar al golf.
fuente
do u(n,i,'x')
eso es intencional, ¿no?Haskell ,
175 170 169 136 127124 bytes−9 bytes gracias a @bmo
Pruébalo en línea!
fuente
Haskell ,
135 131130 bytes-1 byte gracias a Ørjan Johansen (reorganización
take 40
)Enfoque completamente diferente a la respuesta de FrownyFrog pero sobre la misma longitud:
Explicación
r
zipWith3
(?)
El
(?)
operador es la parte más interesante de la solución: anteriormente utilicé una regla booleana generada con un mapa de Karnaugh, pero resulta que hay una forma aún más concisa:fuente
take 40$
antesmap(" o"!!)<$>
.Cáscara ,
3128 bytes¡Ja, Husk está venciendo a Jelly!
Pruébalo en línea!
Explicación y Ungolfed
Antes de agregar una explicación, déjame desglosar esto un poco. Primero, eliminemos las diversas composiciones, agreguemos paréntesis explícitos y descomprimamos la
¨↑¨
cadena. También vamos a reemplazar40
con4
una explicación más legible:fuente
Java, 321 caracteres
Entrada pasada como argumento desde la línea de comando, por ejemplo
java R 38,39
Nunca he escrito más código Java ofuscado :-)
fuente
Actualización: Ejemplo de salida correcto aquí (con 40 líneas no 50): Nueva salida a continuación (eliminada la anterior por brevedad):
Al hacer otro rompecabezas, aprendí algo interesante sobre las instrucciones de anidamiento en bucles for en php, y de repente son mucho más complejas de lo que pensé originalmente. Cuando tengo tiempo, creo que puedo superar este puntaje considerablemente. Por ahora, sin embargo, se mantiene sin cambios en un 408 no competitivo.
Mi php versión 408 caracteres:
Este fue un gran rompecabezas. También pasé años jugando con las entradas, ya que estas son cosas fascinantes que hay que decir. De todos modos, aquí está mi versión de PHP (que no es tan buena como algunas de las respuestas publicadas, pero está completa. En la posición 0 solo tome arriba y arriba a la derecha, en la posición 39 solo tome arriba y arriba a la izquierda, es decir, sin envoltura. Entonces aquí es mi versión
Puede verlo y ejecutarlo aquí: http://codepad.org/3905T8i8
La entrada es una cadena de entrada al inicio como $ a = '38, 39 ';
La salida es la siguiente:
¡¡¡Espero que te guste!!!
PD: Tuve que agregar algunos saltos de línea al código para que pudieras verlo todo y que no se extendiera por la página con una barra de desplazamiento.
fuente
Stax , 24 bytes CP437
¡Ejecute y depure en línea!
Utiliza el punto de código 1 en CP437 para las celdas "1".
Excelente caso para mostrar el poder de este lenguaje.
Explicación
Utiliza la versión desempaquetada (29 bytes) para explicar.
fuente
K (ngn / k) ,
4435 bytesPruébalo en línea!
{
}
funcionar con argumentox
!40
lista de entradas de 0 a 39x?
encuentre sus índices enx
, use0N
(el "entero nulo") para no encontrado^
¿Cuáles de ellos son nulos? esto nos da la entrada, negada39{
}\
aplicar 39 veces, recogiendo resultados intermedios en una lista1,x,1
rodear la lista con 1s (0s negados)3'
triples de artículos consecutivos2/'
decodificación binaria cada@
utilizar como índices en ...2\145
codificación binaria 145 (bits negados de 110)"X "
finalmente, use la matriz 40x40 como índices en la cadena"X "
(@
aquí está implícito)fuente
Jalea , 29 bytes
Pruébalo en línea!
fuente