Construye un reloj digital en Conway's Game of Life

479

Su tarea es construir una simulación de Game of Life que represente un reloj digital, que satisfaga las siguientes propiedades:

  1. El reloj muestra las horas y minutos en decimal (p 12:00. Ej . 3:59, 7:24) Con un estado diferente para cada uno de los 1,440 minutos del día: las horas irán de 0 a 23 o de 1 a 12 con un indicador de PM.

  2. El patrón es periódico, y el estado gira sin ninguna interacción externa.

  3. Los minutos se actualizan a intervalos regulares: de un cambio de minuto a otro lleva la misma cantidad de generaciones.

  4. Un espectador anónimo puede decir de un vistazo que se supone que la pantalla es un reloj digital. En particular, esto implica:

    • Los dígitos son visibles y claramente distinguibles. Debe poder decir con certeza de un vistazo a qué hora se muestra.

    • Los dígitos se actualizan en su lugar. Cada nuevo número aparece en el mismo lugar que el número anterior, y hay poco o ningún movimiento de los cuadros delimitadores de los dígitos. (En particular, un dígito no contiene 10 dígitos diferentes en diferentes lugares que se descubren cada vez que cambian los dígitos).

    • Los dígitos aparecen uno al lado del otro, sin una cantidad excesiva de espacio entre ellos.


Su programa se puntuará en los siguientes aspectos, en orden (con criterios más bajos que actúen como desempate para criterios más altos):

  • Tamaño del cuadro delimitador: gana el cuadro rectangular con el área más pequeña que contiene completamente la solución dada.

  • Ejecución más rápida: gana la menor cantidad de generaciones para avanzar un minuto.

  • Recuento inicial de células vivas: el recuento más pequeño gana.

  • Primero en publicar: la publicación anterior gana.

Joe Z.
fuente
55
@tuskiomi No, la pantalla debe ser decimal.
Joe Z.
2
Estoy bastante seguro de que esto es B3 / S23, pero ¿podría confirmar o negar?
Conor O'Brien el
2
"También deben actualizarse en su lugar: cada nuevo número debe aparecer en el mismo lugar que el número anterior". ¿Cómo se define "en el mismo lugar", ya que los dígitos no serán necesariamente rectangulares?
Martin Ender
44
¿Qué tan discernibles deben ser nuestros dígitos decimales? es "si sabe lo que es y entrecierra los ojos, entonces puede notar la diferencia entre 0 y 8" lo suficiente, o ¿necesita pasar la prueba de "un espectador anónimo puede decir qué es sin preguntar"?
Sparr
3
esto también se publicó en el blog de Hackaday: hackaday.com/2017/03/11/a-clock-created-with-conways-life
Anool Mahidharia

Respuestas:

1014

11,520 generaciones por cuenta de reloj / 10,016 x 6,796 caja / 244,596 cuenta de pop

Ahí tienes ... Fue divertido.

Bueno, el diseño ciertamente no es óptimo. Ni desde el punto de vista del cuadro delimitador (esos dígitos de 7 segmentos son enormes ), ni desde el recuento de población inicial (hay algunas cosas inútiles, y algunas cosas que ciertamente podrían simplificarse), y la velocidad de ejecución, bueno ... yo 'No estoy seguro.

Pero, oye, es hermoso. Mira:

ingrese la descripción de la imagen aquí

¡Ejecutarlo!

Obtén el diseño de esta esencia . Copie todo el texto del archivo en el portapapeles.

Nuevo : aquí hay una versión con indicadores AM y PM para los exigentes.

Vaya al simulador de vida en línea JavaScript Conway . Haga clic en importar , pegue el texto del diseño. Deberías ver el diseño. Luego, vaya a la configuración y configure el paso de generación a 512, o algo alrededor de esas líneas, o tendrá que esperar para siempre para ver la actualización de la pantalla del reloj.

Haga clic en ejecutar , espere un poco y ¡sorpréndase!

Enlace directo a la versión en el navegador.

Tenga en cuenta que el único algoritmo que hace que este gran diseño sea utilizable es hashlife. Pero con esto, puede lograr que todo el reloj se ajuste en segundos. Con otros algoritmos, no es práctico incluso ver cambiar la hora.

Cómo funciona

Utiliza tecnología p30. Solo cosas básicas, planeadores y naves espaciales livianas. Básicamente, el diseño va de arriba hacia abajo:

  • En la parte superior, está el reloj. Es un reloj de época 11520. Tenga en cuenta que necesita alrededor de 10.000 generaciones para garantizar que la pantalla se actualice adecuadamente, pero el diseño aún debe ser estable con un reloj de período más pequeño (aproximadamente 5.000 más o menos; el reloj debe ser múltiplo de 60).
  • Luego, está la etapa de distribución del reloj. El planeador del reloj se copia en un árbol equilibrado, por lo que al final, hay 32 planeadores que llegan exactamente en el mismo momento a la etapa de contadores.
  • La etapa del contador se realiza utilizando un pestillo RS para cada estado y para cada dígito (contamos en decimal). Entonces, hay 10 estados para el dígito derecho de los minutos, 6 estados para el dígito izquierdo de los minutos y 12 estados para las horas (aquí se fusionan ambos dígitos de las horas). Para cada uno de estos grupos, el contador se comporta como un registro de desplazamiento.
  • Después de la etapa de conteo, están las tablas de búsqueda. Convierten los pulsos de estado para mostrar acciones de ENCENDIDO / APAGADO de segmentos.
  • Luego, la pantalla en sí. Los segmentos simplemente están hechos con múltiples cadenas de LWSS. Cada segmento tiene su propio pestillo para mantener su estado. Podría haber hecho un OR lógico simple de los estados de los dígitos para saber si un segmento debe estar ENCENDIDO o APAGADO, y deshacerme de estos pestillos, pero habría fallas en los segmentos que no cambian, cuando los dígitos están cambiando (debido a retrasos de señal). Y habría largas corrientes de planeadores procedentes de la tabla de búsqueda a los segmentos de dígitos. Por lo tanto, no sería tan bonito. Y tenía que ser así. Si.

De todos modos, en realidad no hay nada extraordinario en este diseño. No se han descubierto reacciones sorprendentes en este proceso, y no hay combinaciones realmente inteligentes que nadie haya pensado antes. Solo fragmentos tomados aquí y allá y juntos (y ni siquiera estoy seguro de haberlo hecho de la manera "correcta", en realidad era completamente nuevo en esto). Sin embargo, requirió mucha paciencia. Hacer que todos esos planeadores subieran en el momento correcto en la posición correcta fue un rasguño en la cabeza.

Posibles optimizaciones:

  • En lugar de copiar y distribuir el mismo reloj raíz a las n celdas de contador, podría haber puesto el mismo bloque de reloj n veces (una vez para cada celda de contador). Esto en realidad sería mucho más simple. Pero entonces no podría ajustarlo tan fácilmente cambiando el reloj en un solo punto ... Y tengo experiencia en electrónica, y en un circuito real, eso sería terriblemente incorrecto.
  • Cada segmento tiene su propio pestillo RS. Esto requiere que las tablas de búsqueda generen pulsos R y S. Si tuviéramos un pestillo que simplemente cambiara su estado de un pulso de entrada común, podríamos hacer que las tablas de búsqueda sean la mitad de grandes. Hay un cierre para el punto PM, pero es enorme y no puedo encontrar algo más práctico.
  • Haga la pantalla más pequeña. Pero eso no sería tan bonito. Y tenía que ser así. Si.
oscuro
fuente
26
Hermosa. Buena respuesta.
Pavel
33
@Poke vamos, podrías haber intentado agregar esto tú mismo ... De todos modos, he editado la publicación con una versión con AM + PM, para tu placer.
dim
48
Para que lo sepas, esta respuesta ha sido presentada en Microsiervos , uno de los blogs más importantes sobre tecnología en español, con más de 800,000 seguidores en Twitter
Luis Mendo
26
@Rory Coges tu cabeza y la golpeas contra la pared una docena de veces lo más fuerte que puedes. Entonces estás listo para comenzar.
dim
34
Entonces, el proceso de diseño es: "Ok, necesito colisionar con eso, y mi planeador viene de allí en esta posición en este momento. Veamos traerlo allí usando dos reflectores. Mierda, lo que necesita para colisionar son solo dos pasos de generación demasiado pronto, allí. Si muevo los reflectores un poco, veamos ... Mierda, demasiado tarde. Ok, colisionémoslos en otro lugar. Mierda, no tengo espacio para hacer que mi planeador vaya allí. agreguemos otros dos reflectores inútiles para que lleguen allí. Mierda, los reflectores chocan con esta otra corriente de planeador ... Mierda, vamos a la cama ".
dim