Costruisci un orologio digitale in Conway's Game of Life


479

Il tuo compito è costruire una simulazione di Game of Life che rappresenti un orologio digitale, che soddisfi le seguenti proprietà:

  1. L'orologio visualizza le ore e i minuti in decimale (ad es 12:00. 3:59, 7:24) Con uno stato diverso per ciascuno dei 1.440 minuti del giorno - le ore passeranno da 0 a 23 o da 1 a 12 con un indicatore PM.

  2. Il modello è periodico e lo stato gira senza alcuna interazione esterna.

  3. I minuti si aggiornano a intervalli regolari: da un cambio di minuto al successivo ci vuole lo stesso numero di generazioni.

  4. Uno spettatore anonimo è in grado di dire a colpo d'occhio che il display dovrebbe essere un orologio digitale. In particolare, ciò comporta:

    • Le cifre sono visibili e chiaramente distinguibili. Devi essere in grado di dire con certezza a colpo d'occhio che ora viene visualizzato.

    • Le cifre si aggiornano sul posto. Ogni nuovo numero appare nello stesso posto del numero precedente e c'è poco o nessun movimento delle caselle di delimitazione delle cifre. (In particolare, una cifra non contiene 10 cifre diverse in luoghi diversi che vengono scoperte ogni volta che le cifre cambiano.)

    • Le cifre appaiono una accanto all'altra, senza una quantità eccessiva di spazio tra di loro.


Il tuo programma verrà valutato in base alle seguenti cose, in ordine (con criteri inferiori che fungono da tiebreak per criteri più alti):

  • Dimensioni del riquadro di delimitazione: vince il riquadro rettangolare con l'area più piccola che contiene completamente la soluzione data.

  • Esecuzione più veloce: il minor numero di generazioni che avanza di un minuto vince.

  • Conteggio iniziale delle cellule vive - vince un conteggio inferiore.

  • Prima di postare - vince post precedente.


5
@tuskiomi No, il display deve essere decimale.
Joe Z.

2
Sono abbastanza sicuro che si tratti di B3 / S23, ma potresti confermare o negare?
Conor O'Brien,

2
"Devono anche essere aggiornati sul posto: ogni nuovo numero deve apparire nello stesso posto del numero precedente." Come si definisce "nello stesso posto", poiché le cifre non saranno necessariamente rettangolari.
Martin Ender,

4
quanto devono essere riconoscibili le nostre cifre decimali? è "se sai di cosa si tratta e strizza gli occhi, allora puoi dire abbastanza la differenza tra 0 e 8", oppure deve superare il test "un passante anonimo può dire di cosa si tratta senza richiedere"?
Sparr

3
questo è stato pubblicato anche sul blog di Hackaday: hackaday.com/2017/03/11/a-clock-created-with-conways-life
Anool Mahidharia

Risposte:


1014

11.520 generazioni per conteggio degli orologi / 10.016 x 6.796 scatole / 244.596 conteggi pop

Ecco qua ... È stato divertente.

Bene, il design non è certamente ottimale. Né dal punto di vista del riquadro di delimitazione (quelle cifre a 7 segmenti sono enormi ), né dal conteggio iniziale della popolazione (ci sono alcune cose inutili e alcune cose che potrebbero sicuramente essere rese più semplici) e la velocità di esecuzione - beh ... I non sono sicuro.

Ma, ehi, è bellissimo. Guarda:

inserisci qui la descrizione dell'immagine

Eseguirlo!

Ottieni il design da questo senso . Copia l'intero testo del file negli appunti.

Novità : ecco una versione con indicatori AM e PM per i più esigenti.

Vai al simulatore di vita Conway JavaScript online . Fai clic su Importa , incolla il testo del disegno. Dovresti vedere il design. Quindi, vai alle impostazioni e imposta il passaggio di generazione su 512, o qualcosa attorno a quelle linee, o dovrai aspettare per sempre per vedere l'aggiornamento del display dell'orologio.

Fai clic su Esegui , aspetta un po 'e lasciati stupire!

Collegamento diretto alla versione nel browser.

Si noti che l'unico algoritmo che rende utilizzabile questo enorme design è l'hashlife. Ma con questo, puoi ottenere l'intero orologio avvolgente in pochi secondi. Con altri algoritmi, non è pratico nemmeno vedere l'ora che cambia.

Come funziona

Utilizza la tecnologia p30. Solo cose di base, alianti e astronavi leggere. Fondamentalmente, il design va dall'alto verso il basso:

  • In cima c'è l'orologio. È un orologio d'epoca 11520. Si noti che sono necessarie circa 10.000 generazioni per assicurarsi che il display sia aggiornato in modo appropriato, ma il design dovrebbe essere stabile con un orologio di periodo più piccolo (circa 5.000 o giù di lì - l'orologio deve essere multiplo di 60).
  • Quindi, c'è la fase di distribuzione dell'orologio. L'aliante dell'orologio viene copiato in un albero bilanciato, quindi alla fine, ci sono 32 alianti che arrivano nello stesso preciso momento sul palco dei contatori.
  • Il contatore è realizzato usando un fermo RS per ogni stato e per ogni cifra (contiamo in decimale). Quindi ci sono 10 stati per la cifra destra dei minuti, 6 stati per la cifra sinistra dei minuti e 12 stati per le ore (qui vengono unite entrambe le cifre delle ore). Per ciascuno di questi gruppi, il contatore si comporta come un registro a scorrimento.
  • Dopo la fase di conteggio, ci sono le tabelle di ricerca. Convertono gli impulsi di stato in modo da visualizzare le azioni ON / OFF dei segmenti.
  • Quindi, il display stesso. I segmenti sono semplicemente realizzati con più stringhe di LWSS. Ogni segmento ha il suo fermo per mantenere il suo stato. Avrei potuto creare un semplice OR logico degli stati delle cifre per sapere se un segmento deve essere ATTIVO o DISATTIVO e liberarmi di questi blocchi, ma ci sarebbero problemi per i segmenti non cambianti, quando le cifre cambiano (a causa di ritardi del segnale). E ci sarebbero lunghe correnti di alianti che arrivano dalla tabella di ricerca ai segmenti delle cifre. Quindi non sarebbe così bello. E doveva essere. Sì.

Comunque, in realtà non c'è nulla di straordinario in questo design. Non ci sono reazioni sorprendenti che sono state scoperte in questo processo, né combinazioni davvero intelligenti a cui nessuno aveva pensato prima. Solo pezzi presi qua e là e messi insieme (e non sono nemmeno sicuro di averlo fatto nel modo "giusto" - in realtà ero completamente nuovo a questo). Ha richiesto molta pazienza, tuttavia. Far graffiare tutti quegli alianti al momento giusto nella posizione giusta.

Possibili ottimizzazioni:

  • Invece di copiare e distribuire lo stesso clock radice alle n celle contatore, avrei potuto mettere lo stesso blocco orologio n volte (una volta per ogni cella contatore). Questo sarebbe in realtà molto più semplice. Ma poi non sarei in grado di regolarlo facilmente cambiando l'orologio in un unico punto ... E ho un background elettronico, e in un circuito reale, sarebbe terribilmente sbagliato.
  • Ogni segmento ha il proprio fermo RS. Ciò richiede che le tabelle di ricerca emettano entrambi gli impulsi R e S. Se avessimo un latch che alterherebbe il suo stato da un impulso di input comune, potremmo rendere le tabelle di ricerca dimezzate. C'è un tale fermo per il punto PM, ma è enorme e non riesco a trovare qualcosa di più pratico.
  • Rendi il display più piccolo. Ma non sarebbe così bello. E doveva essere. Sì.

26
Bellissimo. Bella risposta.
Pavel

33
@Poke dai, avresti potuto provare ad aggiungerlo tu stesso ... Comunque, ho modificato il post con una versione con AM + PM, per il tuo piacere.
fioco

48
Solo per questo, questa risposta è stata pubblicata su Microsiervos , uno dei blog più importanti sulla tecnologia in spagnolo, con oltre 800.000 follower su Twitter
Luis Mendo,

26
@Rory Prendi la testa, sbattila sul muro una dozzina di volte più forte che puoi. Sei quindi pronto per iniziare.
dim

34
Quindi il processo di progettazione è: "Ok, devo scontrarlo, e il mio aliante viene da lì in questa posizione in questo momento. Vediamo di portarlo lì usando due riflettori. Merda, la cosa che deve scontrarsi è solo due passaggi di generazione troppo presto, lì. Se muovo un po 'i riflettori, vediamo ... Merda, troppo tardi. Ok, scontriamoli in qualche altro posto. Merda, non ho la stanza per far andare la mia vela. Ok, aggiungiamo altri due riflettori inutili solo per farlo arrivare invece lì. Merda, i riflettori si scontrano con questo altro flusso di aliante ... Merda, andiamo a letto. "
dim
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.