Schreiben Sie zwei rechteckige Codeblöcke mit einer Breite von jeweils w Zeichen und einer Höhe von h Zeichen, die Conways Game of Life implementieren, wenn sie in einem Raster angeordnet sind. ( w und h können positive ganze Zahlen sein)
Beispielsweise könnten die zwei Codeblöcke sein: ( w = 3, h = 2, kein tatsächlicher Code)
XX|
--+
und
|
--+
Behandle den ersten Block, als wäre er die "lebendige" Zelle im Spiel des Lebens, und den zweiten Block, als wäre er die "tote" Zelle.
Nun mehrere Kopien dieser beiden Blöcke in ein größeres Programm arrangieren , die ein Spiel des Lebens Gitter darstellt, wie dieses Segelflugzeug :
| | | | |
--+--+--+--+--+
| |XX| | |
--+--+--+--+--+
| | |XX| |
--+--+--+--+--+
|XX|XX|XX| |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
Hier ist der entscheidende Punkt: Wenn dieser Code ausgeführt wird, muss die Ausgabe das Game of Life-Raster sein, das die nachfolgende Generierung darstellt, wobei dieselben aktiven und toten Codeblöcke für die Zellen verwendet werden.
Die Ausgabe für das obige Programm wäre also die nächste Generation des Segelflugzeugs, das auch als ausführbares Programm dient:
| | | | |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
|XX| |XX| |
--+--+--+--+--+
| |XX|XX| |
--+--+--+--+--+
| |XX| | |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
Wenn Sie dies ausführen, erhalten Sie die nächste Generation:
| | | | |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
| | |XX| |
--+--+--+--+--+
|XX| |XX| |
--+--+--+--+--+
| |XX|XX| |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
Und so weiter.
Der Prozess sollte auf unbestimmte Zeit wiederholbar sein und für jede Anordnung Ihrer lebenden und toten Codeblöcke in einem Game of Life-Raster geeignet sein.
Das Ausgaberaster sollte die gleichen Abmessungen haben wie das Programm, aus dem es stammt (5 mal 6 oben). Rastergrößen von nur 1 zu 1 sollten funktionieren und können beliebig groß sein. Natürlich gibt sich ein leeres Gitter von selbst aus.
Update: Es wäre ideal, wenn Sie Gitter beliebiger Größe simulieren könnten, ohne die "Kacheln" ändern zu müssen. Da dies jedoch sehr schwierig erscheint, akzeptiere ich Antworten, bei denen davon ausgegangen wird, dass das Gitter eine bestimmte Größe hat (etwa 16 * 16).
Die Spielregeln lauten wie folgt:
- Jede lebende Zelle mit weniger als 2 oder mehr als 3 lebenden ( Moore ) Nachbarn stirbt.
- Jede tote Zelle mit genau 3 lebenden Nachbarn wird lebendig.
- Andere Zellen ändern sich nicht.
Wertung
Die Herausforderung besteht darin, dies auf dem kleinstmöglichen Codeblockbereich zu tun. Ihre Punktzahl ist w * h . Die niedrigste Punktzahl gewinnt. Bei Stimmengleichheit gewinnt die am höchsten bewertete Antwort.
Einzelheiten
- Abgesehen von den Zeilenumbrüchen, die für die Rechteckigkeit der Elemente erforderlich sind, sollten Ihre beiden Codeblöcke (und damit Ihre Game of Life- Rasterprogramme ) nur druckbare ASCII-Zeichen enthalten (Hex-Codes 20 bis 7E, keine Tabulatoren, keine zusätzlichen Zeilenumbrüche ).
- Beide Codeblöcke müssen genau w * h Zeichen (außer den erforderlichen Zeilenumbrüchen) mit mindestens einem Zeichen Unterschied enthalten. Das Auffüllen mit Leerzeichen oder Kommentaren ist in Ordnung. Sie sollten nicht von einer Generation zur nächsten wechseln.
- Die Ausgabe sollte entweder in eine Datei oder nach stdout gehen. Es erfolgt keine Eingabe.
- Die Randbedingungen können entweder periodisch (wobei der obere Rand den unteren und der linke Rand den rechten Rand begrenzt) oder unendlich (wobei alle außerhalb der Grenzen liegenden Zellen immer tot sind) sein. Wählen Sie, was am besten zu Ihnen passt.
- Das Lesen des eigenen Quellcodes ist nicht erlaubt.
- Alle Sprachen oder Tools, die dies bereits tun, sind nicht zulässig. (Nur für den Fall, dass einer existiert.)
Hinweis: Die -|+
obigen Zeichen wurden nur verwendet, um die Zellränder hervorzuheben. Ihre Blöcke benötigen keine unterscheidbare Grenze. Bei der Anzeige Ihrer Ausgabe wäre es jedoch hilfreich, wenn eine unterscheidbare Trennung zwischen den Blöcken vorhanden wäre, möglicherweise mit einem Zeichen, das im Programm nie verwendet wurde, sodass es leicht zu entfernen ist. z.B
DD+DD+DD+DD
+++++++++++
AA+DD+AA+DD
Anstatt von
DDDDDDDD
AADDAADD
quelle
__SOURCE_CODE__
.Antworten:
Perl, w * h = 233 * 1 = 233 (pro Zelle)
Zellen arbeiten in jeder Rastergröße (eigentlich sogar mit unregelmäßiger Zeilenlänge). Außerhalb der Grenzen liegende Zellen gelten als tot.
Tote Zelle
Lebende Zelle
Segelflugzeug
erzeugt:
Erklärung (nicht aktuell)
Perl, w * h = 140 * 2 = 280 (pro Zelle)
Mehrzeilige Zelle ist nicht effizient, kann aber eliminieren
__LINE__
.Tote Zelle
Lebende Zelle
quelle
JavaScript ES6 (239 x 1 Zeichen pro Zelle)
Tote Zelle:
Lebende Zelle:
Der einzige Unterschied ist
S[j]=0
für tote undS[j]=1
für lebende Zellen.Die Rastergröße wird mit den Variablen W (Breite) und H (Höhe) gesteuert. Zellen außerhalb des Gitters sind tot.
Kommentierte Version
Segelflugzeug (5 x 6 Gitter)
Ausgänge der nächsten Generation:
quelle
|
ist ein bitweiser Operator und funktioniert nur mit Zahlen.||
ist ein logischer Operator, der die linke Seite zurückgibt, wenn es "wahr" ist, ansonsten die rechte Seite.Python, 67 × 33 = 2.211
Beachten Sie, dass dies meine hübsche Version ist, bei der ich zu jeder anderen Zeile in einer lebenden Zelle "#" und zu jeder anderen Zeile in einer toten Zelle "" eine Zeile hinzugefügt habe. Außerdem werden die Zellen durch "#" - Zeilen getrennt. Auf diese Weise können Sie beispielsweise eine Erstkonfiguration in eine Textdatei einfügen
GOL.py
und diese mit einer winzigen Schrift betrachten, um zu sehen, was in den einzelnen Schritten vor sich geht. Um zum nächsten Schritt zu gelangen, führen Sie den Befehl auspython GOL.py > GOL1.py;mv GOL1.py GOL.py
und schauen Sie ihn erneut an.Meine Lösung arbeitet mit einem Raster beliebiger Größe und setzt periodische Randbedingungen voraus. Ich habe verschiedene Linienbreiten nicht getestet, aber dafür gibt es definitiv Möglichkeiten.
Ich sollte auch erwähnen, dass der Erfolg dieser Lösung davon abhängt
__del__
, wanna
sie am Ende des Programms zerstört wird. In der Python-Dokumentation heißt esIch hoffe also nur, dass dies nicht nur mit meinem Dolmetscher funktioniert.
Lebende Zelle:
Tote Zelle:
Python, 67x17 = 1.139 Um eine Golf-Version zu erhalten, bei der die Lebenszellen noch aus der Ferne erkannt werden, wird die zweite print-Anweisung in den Zeilen 19 und 31 sowie jede andere Zeile gelöscht.
Lebende Zelle:
Tote Zelle:
Bei Bedarf erkläre ich Ihnen gerne das Innenleben meiner Lösung, wenn ich die Zeit finde.
quelle
<sup><sub>...</sub></sup>
innerhalb eines<pre><code>
Blocks zu verwenden. Dadurch wird die Höhe einer Zeile nicht verringert, die Schriftart des Texts wird jedoch bei jedem Auftreten verringert. Wenn Sie nur den tiefgestellten oder den hochgestellten Code verwenden, wird der Code außerhalb des Markups nach unten oder oben verschoben, bei einem Wechsel bleibt er jedoch vertikal zentriert.