Bauen Sie in Conways Game of Life eine Digitaluhr

479

Ihre Aufgabe ist es, eine Game of Life-Simulation zu erstellen, die eine Digitaluhr darstellt und die folgenden Eigenschaften erfüllt:

  1. Die Uhr zeigt die Stunden und Minuten im Dezimalsystem (zB 12:00, 3:59, 7:24) mit einem anderen Zustand für jeden der 1440 Minuten des Tages - entweder die Stunden 0-23 oder von 1 bis 12 mit einer PM - Anzeige gehen.

  2. Das Muster ist periodisch und der Zustand dreht sich ohne äußere Interaktion.

  3. Die Aktualisierung der Minuten in regelmäßigen Abständen - von einem Minutenwechsel zum nächsten - benötigt die gleiche Anzahl von Generationen.

  4. Ein anonymer Zuschauer kann auf einen Blick erkennen, dass das Display eine Digitaluhr sein soll. Dies beinhaltet insbesondere:

    • Die Ziffern sind sichtbar und klar unterscheidbar. Sie müssen mit Sicherheit auf einen Blick erkennen können, welche Uhrzeit angezeigt wird.

    • Die Ziffern werden aktualisiert. Jede neue Nummer wird an derselben Stelle wie die vorherige Nummer angezeigt, und die Begrenzungsrahmen der Ziffern bewegen sich kaum bis gar nicht. (Insbesondere enthält eine Ziffer nicht 10 verschiedene Ziffern an verschiedenen Stellen, die jedes Mal aufgedeckt werden, wenn sich die Ziffern ändern.)

    • Die Ziffern werden nebeneinander ohne übermäßigen Abstand angezeigt.


Ihr Programm wird nach folgenden Kriterien bewertet (wobei niedrigere Kriterien als Tiebreaker für höhere Kriterien fungieren):

  • Größe des Begrenzungsrahmens - der rechteckige Rahmen mit dem kleinsten Bereich, der die angegebene Lösung vollständig enthält, gewinnt.

  • Schnellste Ausführung - die wenigsten Generationen, die eine Minute vorrücken, gewinnen.

  • Anfängliche Anzahl lebender Zellen - kleinere Anzahl gewinnt.

  • Erster Beitrag - früherer Beitrag gewinnt.

Joe Z.
quelle
5
@tuskiomi Nein, die Anzeige muss dezimal sein.
Joe Z.
2
Ich bin mir ziemlich sicher, dass dies B3 / S23 ist, aber können Sie das bestätigen oder leugnen?
Conor O'Brien
2
"Sie müssen auch an Ort und Stelle aktualisiert werden - jede neue Nummer muss an der gleichen Stelle wie die vorherige Nummer erscheinen." Wie definieren Sie "am selben Ort", da die Ziffern nicht unbedingt rechteckig sein müssen?
Martin Ender
4
Wie erkennbar müssen unsere Dezimalstellen sein? ist "Wenn Sie wissen, was es ist und Sie blinzeln, können Sie den Unterschied zwischen 0 und 8 erkennen" genug, oder muss es den Test "ein anonymer Zuschauer kann ohne Aufforderung erkennen, was es ist" bestehen?
Sparr
3
Dies wurde auch auf dem Hackaday-Blog gepostet: hackaday.com/2017/03/11/a-clock-created-with-conways-life
Anool Mahidharia

Antworten:

1013

Anzahl von 11.520 Generationen pro Takt / 10.016 x 6.796 Box / Anzahl von 244.596 Pops

Es hat Spaß gemacht.

Nun, das Design ist sicherlich nicht optimal. Weder vom Standpunkt der Bounding Box (diese 7-Segment-Ziffern sind riesig ) noch von der anfänglichen Bevölkerungszahl (es gibt einige nutzlose Dinge und einige Dinge, die sicherlich einfacher gemacht werden könnten) und der Ausführungsgeschwindigkeit - na ja ... ich 'ich bin mir nicht sicher.

Aber hey, es ist wunderschön. Aussehen:

Bildbeschreibung hier eingeben

Starte es!

Holen Sie sich das Design aus diesem Kern . Kopieren Sie den gesamten Dateitext in die Zwischenablage.

Neu : Hier ist eine Version mit AM- und PM-Indikatoren für anspruchsvolle Kunden.

Zum Online-Lebenssimulator von JavaScript Conway . Klicken Sie auf Importieren , fügen Sie den Designtext ein. Sie sollten das Design sehen. Gehen Sie dann zu den Einstellungen und stellen Sie den Generierungsschritt auf 512 oder etwas in der Nähe dieser Zeilen ein, oder Sie müssen ewig warten, bis die Uhrzeitanzeige aktualisiert wird.

Klicken Sie auf Ausführen , warten Sie ein bisschen und staunen Sie!

Direkter Link zur In-Browser-Version.

Beachten Sie, dass der einzige Algorithmus, der dieses riesige Design nutzbar macht, hashlife ist. Damit können Sie den gesamten Zeitumlauf in Sekunden erreichen. Bei anderen Algorithmen ist es unpraktisch zu sehen, wie sich die Stunde ändert.

Wie es funktioniert

Es nutzt die p30-Technologie. Nur grundlegende Dinge, Segelflugzeuge und leichte Raumschiffe. Grundsätzlich geht das Design von oben nach unten:

  • Ganz oben steht die Uhr. Es ist eine 11520 Periodenuhr. Beachten Sie, dass Sie ca. 10.000 Generationen benötigen, um sicherzustellen, dass die Anzeige ordnungsgemäß aktualisiert wird. Das Design sollte jedoch auch bei einer Uhr mit kleinerer Periode stabil sein (ca. 5.000 oder so - die Uhr muss ein Vielfaches von 60 sein).
  • Dann gibt es die Taktverteilungsstufe. Der Uhrensegelflug wird in einen ausgeglichenen Baum kopiert, so dass am Ende 32 Segelflugzeuge zum exakt gleichen Zeitpunkt auf der Zählerstufe ankommen.
  • Die Zählerstufe wird unter Verwendung eines RS-Signalspeichers für jeden Zustand und für jede Ziffer (wir zählen in Dezimalzahl) erstellt. Es gibt also 10 Zustände für die rechte Ziffer der Minuten, 6 Zustände für die linke Ziffer der Minuten und 12 Zustände für die Stunden (beide Ziffern der Stunden werden hier zusammengeführt). Für jede dieser Gruppen verhält sich der Zähler wie ein Schieberegister.
  • Nach dem Zählen gibt es die Nachschlagetabellen. Sie konvertieren die Statusimpulse, um die Ein / Aus-Aktionen der Segmente anzuzeigen.
  • Dann das Display selbst. Die Segmente werden einfach mit mehreren LWSS-Zeichenfolgen erstellt. Jedes Segment verfügt über ein eigenes Latch, um seinen Zustand beizubehalten. Ich hätte eine einfache logische ODER-Verknüpfung der Ziffernzustände erstellen können, um zu wissen, ob ein Segment EIN oder AUS sein muss, und um diese Latches zu entfernen, aber es gäbe Pannen für sich nicht ändernde Segmente, wenn sich die Ziffern ändern (wegen Signalverzögerungen). Und es würde lange Ströme von Segelflugzeugen geben, die von der Nachschlagetabelle zu den Ziffernsegmenten kamen. Also wäre es nicht so gut aussehend. Und es musste sein. Ja.

In diesem Design steckt eigentlich nichts Außergewöhnliches. Es gibt keine erstaunlichen Reaktionen, die in diesem Prozess entdeckt wurden, und keine wirklich klugen Kombinationen, an die noch niemand gedacht hat. Nur ein bisschen hier und da genommen und zusammengefügt (und ich bin mir nicht mal sicher, ob ich es "richtig" gemacht habe - ich war tatsächlich völlig neu darin). Es erforderte jedoch viel Geduld. Alle diese Segelflugzeuge zur richtigen Zeit in die richtige Position zu bringen, war ein Kopfkratzer.

Mögliche Optimierungen:

  • Anstatt den gleichen Grundtakt zu kopieren und auf die n Zählerzellen zu verteilen , hätte ich den gleichen Taktblock auch n- mal setzen können (einmal für jede Zählerzelle). Das wäre eigentlich viel einfacher. Aber dann würde ich es nicht so einfach einstellen können, indem ich die Uhr an einem einzigen Punkt ändere ... Und ich habe einen elektronischen Hintergrund, und in einer realen Schaltung wäre das schrecklich falsch.
  • Jedes Segment hat einen eigenen RS-Latch. Dies erfordert, dass die Nachschlagetabellen sowohl R- als auch S-Impulse ausgeben. Wenn wir ein Latch hätten, das nur seinen Zustand von einem gemeinsamen Eingangsimpuls umschaltet, könnten wir die Nachschlagetabellen halb so groß machen. Es gibt eine solche Verriegelung für den PM-Punkt, aber sie ist riesig, und ich kann mir nichts Praktischeres einfallen lassen.
  • Verkleinern Sie die Anzeige. Aber das wäre nicht so gut aussehend. Und es musste sein. Ja.
trübe
quelle
26
Schön. Gute Antwort.
Pavel
33
@Poke, komm schon, du hättest versuchen können, das selbst hinzuzufügen ... Wie auch immer, ich habe den Beitrag mit einer Version mit AM + PM bearbeitet, damit es dir Spaß macht.
dim
48
Nur damit Sie wissen, diese Antwort wurde vorge in Microsiervos , einer der wichtigsten Blogs über Technologie in Spanisch, mit mehr als 800K Follower auf Twitter
Luis Mendo
26
@Rory Du nimmst deinen Kopf und schlägst ihn ein Dutzend Mal so fest an die Wand, wie du kannst. Dann können Sie loslegen.
Dim
34
Der Designprozess lautet also: "Ok, das muss ich kollidieren, und mein Segelflugzeug kommt von dort in dieser Position zu diesem Zeitpunkt. Mal sehen, wie es mit zwei Reflektoren dorthin gebracht wird. Mist, das, was es kollidieren muss, sind nur zwei Generationsschritte Zu früh, da. Wenn ich die Reflektoren ein bisschen bewege, lass uns mal sehen ... Mist, zu spät. Ok, lass uns an einem anderen Ort mit ihnen kollidieren. Mist, ich habe nicht den Raum, um meinen Segelflugzeug dorthin zu bringen. Ok, Lass uns zwei weitere nutzlose Reflektoren hinzufügen, damit sie dort ankommen. Mist, die Reflektoren kollidieren mit diesem anderen Strom von Segelflugzeugen ... Mist, lass uns ins Bett gehen. "
dim