Conway's Game of Life es el ejemplo clásico de automatización celular. Las celdas forman una cuadrícula cuadrada y cada una tiene dos estados: vivo o muerto. En cada turno, cada celda se actualiza simultáneamente según su estado y el de sus ocho vecinos:
- Una célula viva permanece viva si tiene exactamente dos o tres vecinos vivos.
- Una célula muerta cobra vida si tiene exactamente tres vecinos vivos.
Su misión, si elige aceptarla, es codificar la implementación más corta de Game of Life en su idioma favorito.
Las normas:
- La cuadrícula debe ser de al menos 20x20
- La cuadrícula debe envolverse (por lo que la cuadrícula es como la superficie de un Toro)
- Su implementación debe permitir al usuario ingresar sus propios patrones de inicio
- GoL es un poco inútil si no puede ver lo que está sucediendo, por lo que debe haber una salida visual del autómata en funcionamiento, ¡y el resultado de cada turno se mostrará durante el tiempo suficiente para poder verlo!
;
anteriores a}
s. Tambiénvar
se pueden eliminar s a veces (si no rompe su código). Y por una líneafor
s,if
s, etc, se puede eliminar la{ }
completamente:for(...) for(...) dosomething()
.Respuestas:
HTML5 Canvas con JavaScript,
940639586519 caracteresSiempre quise hacer algo con el lienzo, así que aquí está mi intento (versión original en línea ). Puede alternar celdas haciendo clic (también es posible en modo de ejecución).
Ahora también puedes probar la nueva versión aquí .
Desafortunadamente, hay un problema que aún no puedo solucionar. La versión en línea tiene 11 caracteres más porque jsFiddle coloca un nodo de texto justo antes del lienzo (¿por qué?) Y, por lo tanto, el lienzo ya no es el primer elemento secundario.
Edición 1: muchas optimizaciones y reestructuraciones.
Edición 2: varios cambios más pequeños.
Edición 3: en línea el bloque de script completo más pequeños cambios.
fuente
1
que sea tan rápido como el mío en lugar de ese paso lento. Además, si desea implementar el dibujo (en lugar de hacer clic en cada cuadrado), puede redondear la posición del mouse al tamaño de bloque más cercano y llenar el rectángulo en ese punto. Más personajes pero más puntos.new Array('#FFF','#800')
con['#FFF','#800']
.s
matriztan
y,red
dado que son los dos colores con las representaciones más cortas, le ahorra dos caracteres. Además, si es posible, coloque la versión literal dej
en el intervalo. Estoy seguro de que hay mucho más para exprimir también.Python, 219 caracteres
Fui por el máximo golfage, con la interfaz suficiente para satisfacer la pregunta.
Lo ejecutas así:
Los números en la lista representan las coordenadas de las celdas iniciales. La primera fila es 0-19, la segunda fila es 20-39, etc.
Ejecútelo en una terminal con 21 filas y se ve bastante elegante.
fuente
2-(p in P)
==2-({p}<P)
. Pero entonces tendrías que cambiar tu entrada a{8,29,47,48,49}
:)TI-BASIC, 96 bytes (87 para entrada no competitiva)
Para su calculadora gráfica de la serie TI-84 (!). Esto fue todo un reto, ya que no hay manera fácil de escribir una rutina de buffer de gráficos (nada definitivamente incorporada), y la pantalla gráfica tiene sólo cuatro comandos de gráficos pertinentes:
Pxl-On()
,Pxl-Off()
,Pxl-Change()
, ypxl-Test()
.Utiliza todos los píxeles accesibles en la pantalla y se ajusta correctamente. Cada celda tiene un píxel, y el programa se actualiza línea por línea horizontalmente a la derecha en la pantalla. Debido a que las calculadoras solo tienen un procesador z80 de 15MHz y BASIC es un lenguaje de interpretación lenta, el código solo obtiene una trama cada cinco minutos.
La entrada del usuario es fácil: antes de ejecutar el programa, use la herramienta Pluma para dibujar su forma en la pantalla del gráfico.
Adaptado de mi entrada a un concurso de golf de código en el foro de calculadora Omnimaga .
Versión Omnimaga (87 bytes)
Este código tiene una característica adicional: detecta si se está ejecutando por primera vez y aleatoriza el estado de la pantalla. En ejecuciones posteriores, continúa automáticamente la simulación si se detiene después de que finaliza un fotograma. Sin embargo, no es una entrada competitiva porque no ajusta la pantalla; las celdas en el borde exterior siempre se considerarán muertas si la pantalla del gráfico se borra de antemano.
Esta versión es probablemente el código más avanzado que he escrito, y contiene algunas optimizaciones ofuscadoras realmente desagradables:
Yo uso el estado del reloj como una bandera. Al comienzo del programa, el reloj de fecha / hora está habilitado y utilizo el valor del indicador global isClockOn para determinar si es la primera iteración. Después de dibujar el primer cuadro, apago el reloj. Guarda un byte sobre el otro método más corto y aproximadamente cuatro sobre el método obvio.
Almaceno los estados de las tres columnas junto a la que se actualiza en una matriz de 63 elementos de números de base 7. El lugar de los 49 mantiene la columna a la derecha, el lugar de los 7 mantiene la columna central y el lugar de las unidades mantiene la columna izquierda: 1 para una celda viva y 0 para una celda muerta. Luego tomo el resto mod 6 de la suma de los tres números alrededor de la celda que se modifica para encontrar el número total de celdas vecinas vivas (es como la divisibilidad por 9 truco; en la base 7, el resto mod 6 es igual a la suma de los dígitos). Ahorra unos 10 bytes por sí mismo y brinda la oportunidad de usar las siguientes dos optimizaciones. Diagrama de ejemplo (digamos que hay un planeador centrado en una determinada columna en Y = 45:
La célula central permanecerá muerta, porque está rodeada por exactamente cinco células vivas.
Después de completar cada fila, los números en la matriz se actualizan dividiendo los números existentes por 7, descartando la parte decimal y agregando 49 veces los valores de las celdas en la nueva columna. Almacenar las tres columnas cada vez sería mucho más lento y menos elegante, tomaría al menos 20 bytes más y usaría tres listas en lugar de una, porque los valores de las celdas en cada fila deben almacenarse antes de actualizar las celdas. Esta es, con mucho, la forma más pequeña de almacenar posiciones de celda.
El fragmento
int(3fPart(3cosh(
da1
cuando la entrada es igual a 3/6,2
cuando es igual a 4/6 y0
cuando es igual a 0, 1/6, 2/6 o 5/6. Ahorra unos 6 bytes.fuente
Mathematica - 333
caracteristicas:
Interfaz interactiva: haga clic en las celdas para crear sus patrones
Buena cuadrícula
Botones: EJECUTAR, PAUSAR, BORRAR
El código está abajo.
Si desea tener una idea de cómo funciona esto, el segundo ejemplo en este blog es solo una versión más elaborada (análisis de Fourier en vivo, mejor interfaz) del código anterior. El ejemplo debería ejecutarse directamente en su navegador después de la descarga gratuita del complemento.
fuente
C 1063 caracteres
Como desafío, hice esto en C usando la API de Windows poco amigable para el golf para IO en tiempo real. Si el bloqueo de mayúsculas está activado, la simulación se ejecutará. Se quedará quieto si el bloqueo de mayúsculas está desactivado. Dibuja patrones con el mouse; el clic izquierdo revive las celdas y el clic derecho mata las celdas.
El EXE compilado se puede encontrar aquí.
Editar: he comentado la fuente. Está disponible aquí
fuente
J (39 caracteres)
Basado en esta versión APL (mismo algoritmo, convolución toroidal).
Ejemplo de uso:
fuente
Mathematica, 123 caracteres
Una implementación muy rudimentaria que no utiliza la función CellularAutomaton incorporada de Mathematica.
fuente
Ruby 1.9 + SDL (
380325314)EDITAR : 314 caracteres, y se corrigió un error con celdas adicionales que aparecían vivas en la primera iteración. Se aumentó el tamaño de la cuadrícula a 56 ya que la rutina de color solo mira los 8 bits más bajos.
EDITAR : Golfed hasta 325 caracteres. El ancho / alto de la cuadrícula ahora es 28, ya que 28 * 9 es el más grande que puede tener mientras usa el valor como color de fondo. También procesa solo un evento SDL por iteración ahora, lo que obvia el bucle interno por completo. Bastante apretado, creo!
La simulación comienza en pausa, con todas las células muertas. Puede presionar cualquier tecla para alternar entre pausa / pausa y hacer clic en cualquier celda para alternar entre vivo y muerto. Ejecuta una iteración cada décima de segundo.
El envoltorio es un poco torpe.
Se ve como esto:
Desafío divertido! Agradezco cualquier mejora que cualquiera pueda ver.
fuente
Scala,
118111581128106310181003999992987 caracteresSin golf:
La mayor parte del código aquí es cosas de Swing GUI. El juego en sí está en el
actionPerformed
método que se activa porTimer
, y la función auxiliarn
que cuenta vecinos.Uso:
Compílelo
scalac filename
y luego ejecúteloscala L
.Al hacer clic en un cuadrado, se cambia de vivo a muerto, y la opción de menú comienza y detiene el juego. Si desea cambiar el tamaño de la cuadrícula, cambie los primeros tres valores en la línea:
var(w,h,c,d,r)=(20,20,20,0,false)
son ancho, alto y tamaño de celda (en píxeles) respectivamente.fuente
import java.awt.event._
ycontents+=m("Go",true)+=m("Stop",false)}}
, lo que lleva a 1093 caracteres.Pure Bash, 244 bytes
Funciona en un universo de 36x24 envuelto en toroidales:
Como se trata de un script de shell, el método de entrada es congruente con otros comandos de shell, es decir, desde stdin:
... etc.
Podemos redirigir la entrada desde cualquier fuente de texto, canalizada a través de un
tr
filtro para obtener generaciones iniciales interesantes, por ejemplofuente
JavaScript, 130
No respondimos totalmente al desafío, pero para el registro, aquí hay un motor de Juego de la Vida en 130 bytes hecho por Subzey y yo en 2013.
http://xem.github.io/miniGameOfLife/
fuente
@@\n@@
(2 por 2 cuadrados en la esquina superior izquierda) o.@\n.@\n.@
. (Columna 1 por 3)C # - 675 caracteres
Siempre quise escribir una versión de este programa. Nunca supe que solo tomaría una media hora perezosa para una versión rápida y sucia. (Jugar al golf lleva mucho más tiempo, por supuesto).
Uso
Compromisos de golf
fuente
GW-BASIC,
10861035 bytes (tokenizado)En forma de token, esto es 1035 bytes. (El formulario ASCII es, por supuesto, un poco más largo). Se obtiene el formulario con token utilizando el
SAVE"life
comando sin agregarlo",a
en el intérprete.Esta es la versión de golf máximo, pero aún tiene características: al comenzar, obtienes un editor, en el que puedes moverte con las teclas del cursor; el espacio activa / desactiva las bacterias en el campo actual,
c
borra la pantalla, el modo Regreso inicia el juegoAquí sigue una versión menos ofuscada, que también establece un tablero de juego inicial con dos estructuras (una cosa giratoria y un planeador):
Escribí esto en 15 minutos mientras estaba aburrido y esperando a un amigo, que estaba jugando al golf con su "aprendiz" para el Juego de la Vida de Conway al mismo tiempo.
Funciona de esta manera: inmediatamente usa el búfer de pantalla de modo de texto 80x25 (cambie la inicial
DEF SEG
para usar&hB000
si está en una tarjeta gráfica Hercules; esta configuración funciona con Qemu y dosbox (más lento)). Un asterisco*
es una bacteria.Funciona en dos pasos: primero, los lugares de nacimiento están marcados con
+
y la muerte marca sus objetivos con.
. En el segundo pase,+
y.
son reemplazados por*
y, respectivamente.
Lo
TIMER
importante es hacer que espere medio segundo después de cada ronda, en caso de que su host Qemu sea muy rápido ☺No espero un precio de victorias más cortas aquí, sino uno genial, especialmente teniendo en cuenta la configuración inicial del tablero. También tengo una versión donde el motor del juego fue reemplazado por código de ensamblaje, en caso de que estés interesado ...
fuente
1
,2
,3
, etc.) ¿O es que los números de línea no cuentan?Mathematica, 115 bytes
Aquí hay una solución fácil para esto:
fuente
Java (OpenJDK 8) -
400 388367 bytesSegunda y (probablemente) edición final: se las arregló para jugar al golf 21 bytes adicionales después de encontrar estas minas de oro (imo) : definitivamente recomiendo que nuevas personas las lean (especialmente si vas a probar algunos de estos desafíos usando Java).
Código resultante (probablemente termine jugando al golf aún más si descubro cómo acortar esos bucles doblemente anidados ...):
Pruébalo en línea!
(La publicación original comienza aquí).
De hecho, pensé por un momento que al menos podría desafiar la mejor respuesta de Python con mi (posiblemente limitado) conocimiento de Java lol ... Fue un desafío en el que, sin embargo, disfruté participar (a pesar de haberme unido a la fiesta, tal vez solo un un poco tarde...)
Realmente no hay mucho: explicación básica de la siguiente manera (sin golf):
(Más información sobre las declaraciones lambda en Java 8 aquí )
Sí, hay un problema con mi enfoque.
Como la mayoría de ustedes probablemente notaron, mi código de golf tal como está actualmente se repetirá para siempre. Para evitar esto, se puede introducir un contador en la parte superior y usarlo en el ciclo while para mostrar solo
n
(en este caso, 5) iteraciones de la siguiente manera (observe la nuevab
variable agregada):Además, algunos puntos que vale la pena mencionar. Este programa no verifica si la entrada es correcta y, por lo tanto, fallará con (lo más probable) un
ArrayOutOfBoundsException
; como tal, asegúrese de verificar que la entrada sea válida completando completamente una parte de una matriz (las matrices ensartadas arrojarán la excepción mencionada anteriormente). Además, la placa como se ve actualmente es 'fluida', es decir, no hay separación entre una generación y la siguiente. Si desea agregar eso para verificar que las generaciones que se están produciendo sean válidas, seSystem.out.println();
debe agregar un extra justo antesfor(int[]t:u)Arrays.fill(t,0);
(vea esto ¡ Pruébelo en línea! Para mayor claridad). Y por último, pero no menos importante, dado que este es mi primer código de golf, cualquier comentario es muy apreciado :)Código anterior de la respuesta anterior de 388 bytes:
Y a partir de la respuesta inicial de 400 bytes:
fuente
Stencil , 6 bytes
No es mi idioma favorito, pero es corto ...
4 bytes de código más las banderas
∊
nlist yT
orus.Pruébalo en línea!
Es ...
3
3∊
un miembro dem
la m Oore-barrio-recuento con uno mismo oe
el páramo e -neighbourhood-recuento sin auto...?
fuente
Scala - 799 caracteres
Ejecutar como un script Un clic del mouse en un cuadrado lo activa o desactiva y cualquier tecla inicia o detiene la generación.
fuente
J, 45
Pensé darle una oportunidad a J. Todavía no está particularmente bien golfizado, pero lo intentaré pronto.
Ejemplo:
fuente
Procesamiento
536532Creo que esto satisface todos los requisitos.
Sin golf:
fuente
Matlab (152)
No tengo Matlab instalado en este momento para probarlo, acabo de jugar el código que escribí hace unos años.
Sin golf:
fuente
Perl,
218216211202 bytes(No hay nueva línea al final de este código).
Lee el patrón inicial a partir de la entrada estándar, como un archivo de texto donde las celdas vivas se representan como
1
, las celdas muertas se representan como un espacio, las líneas están separadas por una nueva línea. La entrada no tendrá caracteres distintos a estos. Las líneas pueden ser de longitud variable, y se rellenarán o truncarán exactamente a 79 de ancho. La entrada de ejemplo es una pistola planeadora:A medida que el programa ejecuta Game of Life, cada estado se descarga a la salida estándar en un formato similar a la entrada, luego se retrasa 0.1 segundos. El retraso se puede personalizar cambiando el cuarto argumento de la llamada de selección.
El tablero de juego está codificado en tamaño 79x23. Está envuelto en un toro: si dejas el tablero en la parte inferior, terminas en la parte superior; si te vas del lado derecho, terminas en el lado izquierdo pero desplazas una fila hacia abajo.
Aquí hay una versión alternativa que no lee ninguna entrada y comienza desde una placa aleatoria:
Este código se deriva de un programa de perl ofuscado de juego de vida que escribí hace años . Lo he cambiado mucho para que el tablero sea toroidal y el código sea el golf.
Probablemente este no sea el método más corto para implementar Game of Life en Perl, pero es uno de los menos comprensibles.
fuente
Python, 589 bytes
Botones del mouse: izquierda - poner una celda, derecha - eliminar una celda, centro - iniciar / detener.
Y aquí hay una versión donde puedes arrastrar el mouse para dibujar. Los gráficos son un poco más agradables.
fuente
if 1<n<4:
debe tener sangría al mismo nivel quefor j in z(-1,2):
Python 2, 456 bytes
Si bien sé que esta es una publicación antigua, no pude evitar darle una oportunidad. El tablero inicial puede ser de cualquier tamaño siempre que dibuje un borde alrededor y tenga un espacio adicional en la última línea.
Golf.py
Input.txt (tenga en cuenta el espacio extra en la última línea)
Como correr
fuente
time.sleep(0.1)==None
=>not time.sleep(.1)
,(f=='@'and(x==3 or x==2
)) o (f == '' yx == 3) =>x==3or f=='@'and x==2
1 if
=>1if
.Tratamiento
270,261249 bytesLa cuadrícula son los 100 * 100 píxeles de pantalla, la entrada viene en forma de imagen png
Sin golf
fuente
Lua + LÖVE / Love2D , 653 bytes
o espaciado:
Haga clic en el campo para agregar células vivas. Haga clic fuera del campo para ejecutarlo.
Pruébalo en línea!
fuente
Posdata
529515Comenzó con el ejemplo de Rosetta Code . Invoque con un argumento de nombre de archivo (
gs -- gol.ps pulsar
), el archivo que contiene 20 * 20 números binarios (separados por espacio). Bucle infinito: tablero de dibujo, espere a entrar, calcule la próxima generación.Espaciado, con algunos comentarios de pila (solo los que necesitaba).
archivo de datos de pulsar:
fuente
JavaScript 676
Lo siento, Griffin, simplemente no pude ver tu código y no volver a escribirlo ligeramente ... ¡tuve que quitar dos caracteres, pero valió la pena!
b=[];r=c=s=20;U=document;onload=function(){for(z=E=0;z<c;++z)for(b.push(t=[]),j=0;j<r;j++)with(U.body.appendChild(U.createElement("button")))t.push(0),id=z+"_"+j,style.position="absolute",style.left=s*j+"px",style.top=s*z+"px",onclick=a}; ondblclick=function(){A=E=E?clearInterval(A):setInterval(function(){Q=[];for(z=0;z<c;++z){R=[];for(j=0;j<r;)W=(c+z-1)%c,X=(c+z+1)%c,Y=(r+j-1)%r,Z=(r+j+1)%r,n=b[W][Y]+b[z][Y]+b[X][Y]+b[W][j]+b[X][j]+b[W][Z]+b[z][Z]+b[X][Z],R.push(b[z][j++]?4>n&&1<n:3==n);Q.push(R)}b=Q.slice();d()})};function a(e){E?0:P=e.target.id.split("_");b[P[0]][P[1]]^=1;d()}function d(){for(z=0;z<c;++z)for(j=0;j<r;)U.getElementById(z+"_"+j).innerHTML=b[z][j++]-0}
Pero como dicen, es más fácil pedir perdón que permiso ...;)
fuente
Octava (153)
lo mismo que Matlab de DenDenDo en Shortest Game of Life , pero tuvo que cambiar imshow a imagesc:
fuente
Python 2: 334 bytes
Solo 6 años de retraso.
Puedes ejecutarlo como:
Donde los 0 y 1 representan células muertas y vivas, una nueva línea adicional al final comienza la ejecución.
Las cuadrículas deben ser cuadradas.
Es más fácil de ejecutar que el Python más corto, admite cuadrículas de cualquier tamaño y se ve bonito cuando se ejecuta.
También es 100 bytes más, así que está eso.
fuente
PHP, 201 bytes (no probado)
Corre con
-nr
.Descompostura
fuente