Construisez une horloge numérique dans le jeu de la vie de Conway

479

Votre tâche consiste à créer une simulation Game of Life représentant une horloge numérique, qui satisfait les propriétés suivantes:

  1. L'horloge affiche les heures et minutes décimales (par exemple 12:00, 3:59, 7:24) avec un état différent pour chacun des 1.440 minutes de la journée - soit les heures vont de 0 à 23 ou de 1 à 12 avec un indicateur PM.

  2. Le schéma est périodique et l’état est mis en boucle sans interaction extérieure.

  3. Les minutes sont mises à jour à intervalles réguliers - d'un changement de minute à l'autre prend le même nombre de générations.

  4. Un témoin anonyme est en mesure de dire en un coup d'œil que l'affichage est censé être une horloge numérique. Cela implique notamment:

    • Les chiffres sont visibles et clairement distinguables. Vous devez être capable de dire avec certitude d'un coup d'œil quelle heure est affichée.

    • Les chiffres sont mis à jour en place. Chaque nouveau numéro apparaît au même endroit que le numéro précédent et les boîtes de sélection des chiffres ne bougent quasiment pas. (En particulier, un chiffre ne contient pas 10 chiffres différents à des endroits différents qui sont découverts chaque fois que les chiffres changent.)

    • Les chiffres apparaissent côte à côte, sans espace excessif entre eux.


Votre programme sera noté dans l'ordre suivant (les critères les plus bas jouant le rôle de bris d'égalité pour les critères les plus élevés):

  • Taille de la boîte englobante - la boîte rectangulaire avec la plus petite surface qui contient complètement la solution donnée l'emporte.

  • L'exécution la plus rapide - le moins de générations à avancer d'une minute gagne.

  • Nombre initial de cellules vivantes - le plus petit nombre gagne.

  • Premier post - post précédent gagne.

Joe Z.
la source
5
@tuskiomi Non, l'affichage doit être décimal.
Joe Z.
2
Je suis à peu près sûr que c'est B3 / S23, mais pouvez-vous confirmer ou nier?
Conor O'Brien
2
"Ils doivent également être mis à jour sur place - chaque nouveau numéro doit apparaître au même endroit que le numéro précédent." Comment définissez-vous "au même endroit", puisque les chiffres ne seront pas nécessairement rectangulaires.
Martin Ender
4
à quel point nos chiffres décimaux doivent-ils être discernables? est "si vous savez ce que c'est et que vous louchez alors vous pouvez faire la différence entre 0 et 8" assez, ou faut-il réussir le test "un spectateur anonyme peut dire ce que c'est sans invite"?
Sparr
3
cela a aussi été posté sur le blog de Hackaday: hackaday.com/2017/03/11/a-clock-created-with-conways-life
Anool Mahidharia

Réponses:

1014

11 520 générations par compte d'horloge / 10 016 x 6 796 boîtes / 244 596 pop

Voilà ... c'était amusant.

Eh bien, le design n’est certainement pas optimal. Ni du point de vue de la boîte englobante (ces chiffres à 7 segments sont énormes ), ni du décompte de population initial (il y a des trucs inutiles, et des trucs qui pourraient certainement être simplifiés), et la vitesse d'exécution - eh bien ... I ne suis pas sûr.

Mais, hé, c'est beau. Regardez:

entrez la description de l'image ici

Exécuter!

Obtenez la conception de cet élément essentiel . Copiez tout le texte du fichier dans le presse-papiers.

Nouveau : voici une version avec les indicateurs AM et PM pour les plus exigeants.

Accédez au simulateur de vie JavaScript en ligne de Conway . Cliquez sur importer , collez le texte de conception. Vous devriez voir la conception. Ensuite, allez dans les paramètres et définissez l' étape de génération sur 512, ou quelque chose autour de ces lignes, ou vous devrez attendre indéfiniment pour voir la mise à jour de l'affichage de l'horloge.

Cliquez sur Exécuter , attendez un peu et soyez surpris!

Lien direct vers la version dans le navigateur.

Notez que le seul algorithme qui rend cette conception énorme utilisable est hashlife. Mais avec cela, vous pouvez réaliser l’ensemble de l’horloge en quelques secondes. Avec d'autres algorithmes, il n'est même pas pratique de voir l'heure changer.

Comment ça fonctionne

Il utilise la technologie p30. Juste des choses basiques, des planeurs et des vaisseaux spatiaux légers. Fondamentalement, la conception va de haut en bas:

  • Tout en haut, il y a l'horloge. C'est une horloge de la période 11520. Notez qu’il faut environ 10 000 générations pour que l’affichage soit mis à jour correctement, mais la conception doit rester stable avec une horloge de plus petite période (environ 5 000 - l’horloge doit être multiple de 60).
  • Ensuite, il y a l'étape de la distribution d'horloge. Le planeur de l'horloge est copié dans un arbre équilibré, ainsi, à la fin, 32 planeurs arrivent au même moment au stade des comptoirs.
  • La phase de comptage est réalisée à l'aide d'un verrou RS pour chaque état et pour chaque chiffre (nous comptons en décimal). Il y a donc 10 états pour le chiffre de droite des minutes, 6 états pour le chiffre de gauche des minutes et 12 états pour les heures (les deux chiffres des heures sont fusionnés ici). Pour chacun de ces groupes, le compteur se comporte comme un registre à décalage.
  • Après la phase de comptage, il y a les tables de recherche. Ils convertissent les impulsions d'état pour afficher les actions d'activation / désactivation de segments.
  • Ensuite, l'affichage lui-même. Les segments sont simplement constitués de plusieurs chaînes de LWSS. Chaque segment a son propre verrou pour maintenir son état. J'aurais pu faire un simple OU logique des états des chiffres pour savoir si un segment doit être activé ou non, et supprimer ces verrous, mais il y aurait des problèmes pour les segments qui ne changent pas, lorsque les chiffres changent signaux retardés). Et il y aurait de longs flux de planeurs allant de la table de recherche aux segments de chiffres. Donc, ce ne serait pas aussi beau. Et ça devait être. Oui.

Quoi qu'il en soit, il n'y a rien d'extraordinaire dans cette conception. Aucune réaction étonnante n’a été découverte dans ce processus, et aucune combinaison vraiment intelligente à laquelle personne n’avait pensé auparavant. Juste des morceaux pris ici et là et mis ensemble (et je ne suis même pas sûr de l'avoir fait de la "bonne" façon - j'étais en fait complètement nouveau à cela). Cela demandait cependant beaucoup de patience. Mettre tous ces planeurs au bon moment dans la bonne position était un casse-tête.

Optimisations possibles:

  • Au lieu de copier et de distribuer la même horloge racine aux n cellules de compteur, j’aurais pu mettre le même bloc d’horloge n fois (une fois pour chaque cellule de compteur). Ce serait en réalité beaucoup plus simple. Mais alors, je ne serais pas capable de l'ajuster aussi facilement en changeant l'horloge en un seul point ... Et j'ai une formation en électronique, et dans un vrai circuit, ce serait terriblement faux.
  • Chaque segment a son propre verrou RS. Cela nécessite que les tables de consultation génèrent à la fois les impulsions R et S. Si nous avions un verrou qui basculerait simplement son état à partir d'une impulsion d'entrée commune, nous pourrions rendre les tables de consultation deux fois moins grandes. Il y a un tel verrou pour le point PM, mais il est énorme et je suis incapable de trouver quelque chose de plus pratique.
  • Réduisez l'affichage. Mais ce ne serait pas aussi beau. Et ça devait être. Oui.
faible
la source
26
Magnifique. Bonne réponse.
Pavel
33
@Poke viens, tu aurais pu essayer de l'ajouter toi-même ... Quoi qu'il en soit, j'ai édité le message avec une version à la fois avec AM + PM, pour ton plus grand plaisir.
Dim
48
À titre d'information, cette réponse a été présentée dans Microsiervos , l'un des blogs les plus importants sur la technologie en espagnol, avec plus de 800 000 adeptes sur Twitter
Luis Mendo
26
@Rory Vous prenez votre tête, écrasez-la douze fois plus fort que vous le pouvez. Vous êtes alors prêt à commencer.
dim
34
Donc, le processus de conception est le suivant: "Ok, je dois entrer en collision avec cela, et mon planeur vient de là dans cette position. Voyons le ramener là-bas en utilisant deux réflecteurs. Merde, la chose dont il a besoin pour entrer en collision n’est que deux étapes de génération. trop tôt, là. Si je bouge un peu les réflecteurs, voyons voir… Merde, trop tard. Ok, on les heurte ailleurs. Merde, je n'ai pas la place pour faire y aller mon planeur. ajoutons deux autres réflecteurs inutiles juste pour y arriver à la place. Merde, les réflecteurs entrent en collision avec cet autre courant de planeur ... Merde, allons au lit. "
Dim