Conways Game of Life ist das klassische Beispiel für zellulare Automatisierung. Die Zellen bilden ein quadratisches Gitter und haben jeweils zwei Zustände: lebend oder tot. In jedem Zug aktualisiert sich jede Zelle gleichzeitig entsprechend ihrem Zustand und denjenigen ihrer acht Nachbarn:
- Eine lebende Zelle bleibt am Leben, wenn sie genau zwei oder drei lebende Nachbarn hat
- Eine tote Zelle wird lebendig, wenn sie genau drei lebende Nachbarn hat
Ihre Mission ist es, die kürzeste Game of Life-Implementierung in Ihrer Lieblingssprache zu programmieren, falls Sie dies akzeptieren möchten.
Die Regeln:
- Das Raster muss mindestens 20x20 sein
- Das Gitter muss herumlaufen (so ist das Gitter wie die Oberfläche eines Torus)
- Ihre Implementierung muss es dem Benutzer ermöglichen, eigene Startmuster einzugeben
- GoL ist ein bisschen sinnlos, wenn Sie nicht sehen können, was gerade passiert. Daher muss eine visuelle Ausgabe des laufenden Automaten vorliegen, und das Ergebnis jeder Runde muss so lange angezeigt werden, dass es sichtbar ist!
;
vor}
s entfernen .var
Manchmal kann auch s beseitigt werden (wenn es Ihren Code nicht beschädigt). Und für einzeiligefor
s,if
s etc, können Sie die Beseitigung{ }
vollständig:for(...) for(...) dosomething()
.Antworten:
HTML5 Canvas mit JavaScript,
940639586519 ZeichenIch wollte schon immer etwas mit Leinwand machen, deshalb hier mein Versuch (Originalversion online ). Sie können Zellen durch Klicken umschalten (auch im laufenden Modus möglich).
Sie können jetzt auch die neue Version hier ausprobieren .
Leider gibt es ein Problem, das ich noch nicht umgehen konnte. Die Online-Version ist 11 Zeichen länger, da jsFiddle einen Textknoten direkt vor der Zeichenfläche einfügt (warum?) Und somit die Zeichenfläche nicht mehr das erste untergeordnete Element ist.
Edit 1: Viele Optimierungen und Restrukturierungen.
Edit 2: Mehrere kleinere Änderungen.
Bearbeiten 3: Inline den gesamten Skriptblock plus kleinere Änderungen.
quelle
1
sie so schnell wie meine zu machen und nicht so langsam. Wenn Sie das Zeichnen implementieren möchten (anstatt auf jedes Quadrat zu klicken), können Sie die Mausposition auf die nächste Blockgröße abrunden und das Rechteck an dieser Stelle ausfüllen. Mehr Charaktere, aber mehr Punkte.new Array('#FFF','#800')
mit['#FFF','#800']
.s
Array auftan
und einstellen ,red
da es sich um die beiden Farben mit den kürzesten Darstellungen handelt - Sie sparen zwei Zeichen. Fügen Sie nach Möglichkeit auch die Literalversion vonj
in das Intervall ein. Ich bin mir sicher, dass es noch viel mehr zu tun gibt.Python, 219 Zeichen
Ich habe mich für maximales Golfen entschieden, mit einer Schnittstelle, die gerade ausreicht, um die Frage zu befriedigen.
Sie führen es so aus:
Die Zahlen in der Liste repräsentieren die Koordinaten der Startzellen. Die erste Reihe ist 0-19, die zweite Reihe ist 20-39 usw.
Führen Sie es in einem Terminal mit 21 Zeilen aus und es sieht ziemlich pfiffig aus.
quelle
2-(p in P)
==2-({p}<P)
. Aber dann müssten Sie Ihre Eingabe ändern{8,29,47,48,49}
:)TI-BASIC, 96 Bytes (87 für nicht konkurrierenden Eintrag)
Für Ihren Grafikrechner der TI-84-Serie (!). Das war eine ziemliche Herausforderung, weil es keine einfache Möglichkeit, eine gepufferte Grafikroutine (definitiv nichts eingebaut), und der Graph - Bildschirm hat nur vier relevanten Grafikbefehle zu schreiben:
Pxl-On()
,Pxl-Off()
,Pxl-Change()
, undpxl-Test()
.Verwendet alle zugänglichen Pixel auf dem Bildschirm und wird korrekt umbrochen. Jede Zelle ist ein Pixel groß und das Programm wird zeilenweise horizontal rechts auf dem Bildschirm aktualisiert. Da die Rechner nur einen 15-MHz-z80-Prozessor haben und BASIC eine langsam interpretierte Sprache ist, erhält der Code alle fünf Minuten nur einen Frame.
Die Benutzereingabe ist einfach: Bevor Sie das Programm ausführen, können Sie mit dem Stift-Werkzeug Ihre Form auf dem Grafikbildschirm zeichnen.
Angepasst von meinem Beitrag zu einem Codegolfwettbewerb im Rechnerforum Omnimaga .
Omnimaga-Version (87 Byte)
Dieser Code hat eine zusätzliche Funktion: Er erkennt, ob er zum ersten Mal ausgeführt wird und ob der Bildschirmstatus zufällig ausgewählt wird. In nachfolgenden Läufen wird die Simulation automatisch fortgesetzt, wenn sie nach Beendigung eines Frames angehalten wird. Es handelt sich jedoch nicht um einen konkurrierenden Eintrag, da der Bildschirm nicht umbrochen wird. Die Zellen am äußeren Rand werden immer als tot betrachtet, wenn der Grafikbildschirm zuvor gelöscht wurde.
Diese Version ist wahrscheinlich der erfolgreichste Code, den ich je geschrieben habe, und enthält einige wirklich üble Optimierungen:
Ich benutze den Zustand der Uhr als Flagge. Zu Beginn des Programms ist die Datums- / Uhrzeituhr aktiviert, und ich verwende den Wert des globalen isClockOn-Flags, um zu bestimmen, ob es sich um die erste Iteration handelt. Nachdem der erste Frame gezeichnet wurde, schalte ich die Uhr aus. Spart ein Byte gegenüber der kürzesten anderen Methode und ungefähr vier gegenüber der offensichtlichen Methode.
Ich speichere die Zustände der drei Spalten neben der zu aktualisierenden Spalte in einem 63-Elemente-Array von Basis-7-Zahlen. Die 49er-Stelle enthält die rechte Spalte, die 7er-Stelle die mittlere Spalte und die Einheiten-Stelle die linke Spalte - 1 für eine lebende Zelle und 0 für eine tote Zelle. Dann nehme ich den Rest von Mod 6 aus der Summe der drei Zahlen um die Zelle, die modifiziert werden, um die Gesamtzahl der lebenden Nachbarzellen zu ermitteln (es ist wie bei der Teilbarkeit durch 9 - in Basis 7 entspricht der Rest von Mod 6 der Summe von die Ziffern). Spart ca. 10 Byte und bietet die Möglichkeit, die nächsten beiden Optimierungen zu verwenden. Beispieldiagramm (Angenommen, es gibt einen Schirm, der bei Y = 45 in einer bestimmten Spalte zentriert ist:
Die mittlere Zelle bleibt tot, da sie von genau fünf lebenden Zellen umgeben ist.
Nach Abschluss jeder Zeile werden die Zahlen im Array aktualisiert, indem die vorhandenen Zahlen durch 7 geteilt, der Dezimalteil verworfen und das 49-fache der Werte der Zellen in der neuen Spalte hinzugefügt werden. Das Speichern aller drei Spalten durch jedes Mal wäre viel langsamer und weniger elegant, würde mindestens 20 weitere Bytes beanspruchen und drei Listen anstelle von einer verwenden, da die Werte der Zellen in jeder Zeile gespeichert werden müssen, bevor Zellen aktualisiert werden. Dies ist bei weitem die kleinste Möglichkeit, Zellenpositionen zu speichern.
Das Snippet
int(3fPart(3cosh(
gibt an,1
wann die Eingabe 3/6,2
wann 4/6 und0
wann 0, 1/6, 2/6 oder 5/6 entspricht. Spart ungefähr 6 Bytes.quelle
Mathematica - 333
Eigenschaften:
Interaktive Oberfläche: Klicken Sie auf Zellen, um Ihre Muster zu erstellen
Schönes Gitter
Tasten: RUN, PAUSE, CLEAR
Der Code ist unten.
Wenn Sie ein Gefühl dafür bekommen möchten, wie dies abläuft, ist das zweite Beispiel in diesem Blog nur eine ausführlichere Version (Live-Fourier-Analyse, bessere Benutzeroberfläche) des obigen Codes. Das Beispiel sollte nach dem kostenlosen Download des Plugins direkt in Ihrem Browser laufen.
quelle
C 1063 Zeichen
Als Herausforderung habe ich dies in C mithilfe der golfunfreundlichen Windows-API für Echtzeit-E / A durchgeführt. Wenn die Feststelltaste aktiviert ist, wird die Simulation ausgeführt. Es bleibt still, wenn die Feststelltaste ausgeschaltet ist. Zeichne Muster mit der Maus. Linksklick belebt Zellen und Rechtsklick tötet Zellen.
Die kompilierte EXE finden Sie hier
Bearbeiten: Ich habe die Quelle kommentiert. Es ist erhältlich hier
quelle
J (39 Zeichen)
Basierend auf dieser APL-Version (gleicher Algorithmus, toroidale Faltung).
Anwendungsbeispiel:
quelle
Mathematica, 123 Zeichen
Eine sehr rudimentäre Implementierung, die die in Mathematica integrierte CellularAutomaton-Funktion nicht verwendet.
quelle
Ruby 1.9 + SDL (
380325314)BEARBEITEN : 314 Zeichen, und ein Fehler wurde behoben, durch den zusätzliche Zellen bei der ersten Iteration lebendig wurden. Die Rastergröße wurde auf 56 erhöht, da die Farbroutine nur die niedrigsten 8 Bits betrachtet.
EDIT : golfed bis 325 Zeichen nach unten. Die Breite / Höhe des Rasters beträgt jetzt 28, da 28 * 9 die größte ist, die Sie haben können, während Sie den Wert weiterhin als Hintergrundfarbe verwenden. Außerdem wird jetzt nur ein SDL-Ereignis pro Iteration verarbeitet, wodurch die innere Schleife vollständig umgangen wird. Ganz schön eng finde ich!
Die Simulation wird angehalten, und alle Zellen sind tot. Sie können eine beliebige Taste drücken, um zwischen Pause und Pause umzuschalten, und auf eine beliebige Zelle klicken, um zwischen lebendig und tot umzuschalten. Führt jede Zehntelsekunde eine Iteration aus.
Die Verpackung ist etwas wackelig.
Sieht aus wie das:
Eine lustige Herausforderung! Ich freue mich über Verbesserungen, die jeder sehen kann.
quelle
Scala,
118111581128106310181003999992987 ZeichenUngolfed:
Der größte Teil des Codes hier ist Swing GUI-Zeug. Das Spiel selbst befindet sich in der
actionPerformed
Methode, die von derTimer
, und der Helferfunktion,n
die die Nachbarn zählt, ausgelöst wird .Verwendungszweck:
Kompiliere es mit
scalac filename
und starte es dann mitscala L
.Wenn Sie auf ein Quadrat klicken, wechselt es von "live" zu "dead", und die Menüoption startet und stoppt das Spiel. Wenn Sie die Größe des Rasters ändern möchten, ändern Sie die ersten drei Werte in der Zeile:
var(w,h,c,d,r)=(20,20,20,0,false)
Breite, Höhe und Zellengröße (in Pixel).quelle
import java.awt.event._
undcontents+=m("Go",true)+=m("Stop",false)}}
, was zu 1093 Zeichen führt.Pure Bash, 244 Bytes
Funktioniert auf einem ringförmig gewickelten 36x24-Universum:
Da es sich um ein Shell-Skript handelt, stimmt die Eingabemethode mit anderen Shell-Befehlen überein - z. B. von stdin:
... usw
Wir können Eingaben von jeder Textquelle umleiten, die durch einen
tr
Filter geleitet werden, um interessante Anfangsgenerationen zu erhalten, zquelle
JavaScript, 130
Die Herausforderung wurde nicht vollständig gemeistert, aber für den Rekord: Hier ist eine Game of Life-Engine mit 130 Bytes, die Subzey und ich 2013 erstellt haben.
http://xem.github.io/miniGameOfLife/
quelle
@@\n@@
(2 x 2 Quadrat in der oberen linken Ecke) oder.@\n.@\n.@
. (1 x 3 Spalte)C # - 675 Zeichen
Ich wollte schon immer eine Version dieses Programms schreiben. Ich hätte nie gedacht, dass es für eine schnelle und schmutzige Version nur eine halbe Stunde dauern würde. (Golfen dauert natürlich viel länger.)
Verwendungszweck
Golf-Kompromisse
quelle
GW-BASIC,
10861035 Bytes (tokenisiert)In tokenisierter Form sind dies 1035 Bytes. (Das ASCII-Formular ist natürlich etwas länger.) Sie erhalten das Token-Formular, indem Sie den
SAVE"life
Befehl verwenden, ohne es",a
im Interpreter anzuhängen .Dies ist die Maximal-Golf-Version, aber immer noch sehr interessant: Beim Starten erhalten Sie einen Editor, in dem Sie sich mit den Cursortasten bewegen können. Leertaste
c
schaltet Bakterien auf dem aktuellen Feld ein / aus, löscht den Bildschirm, Return startet den Spielemodus.Hier folgt eine weniger verschleierte Version, die auch ein erstes Spielbrett mit zwei Strukturen (ein kreisrotierendes Ding und ein Segelflugzeug) setzt:
Ich schrieb dies in 15 Minuten, während ich gelangweilt und auf einen Freund wartete, der gleichzeitig mit seinem „Lehrling“ für Conways Game of Life Code-Golf spielte.
Es funktioniert wie folgt: Es verwendet sofort den 80x25-Textmodus-Bildschirmpuffer (ändern Sie die Initiale
DEF SEG
,&hB000
wenn Sie eine Hercules-Grafikkarte verwenden; diese Einstellungen funktionieren mit Qemu und (langsamerer) Dosbox). Ein Sternchen*
ist ein Bakterium.Es funktioniert in zwei Schritten: Erstens werden Geburtsorte mit markiert
+
und der Tod markiert seine Ziele mit.
. Im zweiten Durchgang werden+
und.
durch*
und ersetztbezeichnet.
Das
TIMER
Sache ist, es nach jeder Runde eine halbe Sekunde warten zu lassen, falls Ihr Qemu-Host sehr schnell istIch hoffe hier nicht auf einen kürzesten Gewinn, sondern auf einen coolen Preis, besonders wenn man die anfängliche Konfiguration des Boards bedenkt. Ich habe auch eine Version, in der die Spiel-Engine durch Assembler-Code ersetzt wurde, falls Sie interessiert sind ...
quelle
1
,2
,3
, etc.) Oder die Zeilennummern zählen nicht?Mathematica, 115 Bytes
Hier ist eine einfache Lösung:
quelle
Java (OpenJDK 8) -
400 388367 ByteZweit und (wahrscheinlich) Abschluss Edit: Verwaltete zum Golf ein zusätzliches 21 Bytes nach den diesen (imo) Suche nach Goldminen - auf jeden Fall neue Leute empfehlen diese zu lesen (vor allem , wenn Sie einige dieser Herausforderungen mit Hilfe von Java , um zu versuchen gehen).
Resultierender Code (der wahrscheinlich noch mehr Golf spielen wird, wenn ich herausfinde, wie ich diese doppelt verschachtelten Schleifen verkürzen kann ...):
Probieren Sie es online!
(Der ursprüngliche Beitrag beginnt hier.)
Ich dachte tatsächlich für einen Moment, dass ich in der Lage sein würde, die beste Python-Antwort mit meinen (wohl eingeschränkten) Java-Kenntnissen herauszufordern. Es war eine Herausforderung, an der ich trotzdem gerne teilnahm (obwohl ich vielleicht nur einer von ihnen beigetreten war) ein bisschen spät...)
Es gibt nicht viel zu sagen - grundlegende Erklärung wie folgt (ungolfed):
(Weitere Informationen zu Lambda-Anweisungen in Java 8 finden Sie hier )
Ja, meine Herangehensweise hat einen Haken.
Wie die meisten von Ihnen wahrscheinlich bemerkt haben, wird mein Golf-Code in seiner jetzigen Form eine Endlosschleife bilden. Um dies zu verhindern, kann oben ein Zähler eingeführt und in der while-Schleife verwendet werden, um nur die folgenden
n
(in diesem Fall 5) Iterationen anzuzeigen (beachten Sie die neueb
hinzugefügte Variable):Ergänzend einige erwähnenswerte Punkte. Dieses Programm überprüft nicht, ob die Eingabe korrekt ist, und schlägt daher (höchstwahrscheinlich) mit einem fehl
ArrayOutOfBoundsException
. Stellen Sie daher sicher, dass die Eingabe gültig ist, indem Sie einen Teil eines Arrays vollständig ausfüllen (Arrays mit Spieß lösen die oben genannte Ausnahme aus). Außerdem sieht das Board, wie es derzeit ist, "flüssig" aus - das heißt, es gibt keine Trennung zwischen einer Generation und der nächsten. Wenn Sie dies hinzufügen möchten, um zu überprüfen, ob die produzierten Generationen tatsächlich gültig sind,System.out.println();
müssen Sie kurz vor dem Hinzufügen ein zusätzliches Element hinzufügenfor(int[]t:u)Arrays.fill(t,0);
(siehe hierzu Online ausprobieren! Verdeutlichung). Und last but not least, da dies mein erster Code Golf ist, wird jedes Feedback sehr geschätzt :)Alter Code aus der vorherigen 388-Byte-Antwort:
Und von der ersten 400-Byte-Antwort:
quelle
Schablone , 6 Bytes
Nicht meine Lieblingssprache, aber es ist kurz ...
4 Code-Bytes plus die
∊
Flags nlist undT
orus.Probieren Sie es online!
Ist ...
3
3∊
Mitglied inm
der m oore-Nachbarschaft Zählung mit Selbst odere
das Moor e -Umgebung-count ohne selbst...?
quelle
Scala - 799 Zeichen
Als Skript ausführen. Ein Mausklick auf ein Quadrat schaltet es ein oder aus und jede Taste startet oder stoppt die Generierung.
quelle
J, 45
Ich dachte, ich würde es versuchen. Es ist noch nicht besonders gut golfen, aber ich werde es bald noch einmal versuchen.
Beispiel:
quelle
Verarbeitung
536532Ich glaube, dass dies alle Anforderungen erfüllt.
Ungolfed:
quelle
Matlab (152)
Ich habe Matlab momentan nicht installiert, um es zu testen. Ich habe nur den Code gespielt, den ich vor ein paar Jahren geschrieben habe.
Ungolfed:
quelle
Perl,
218216211202 Bytes(Keine neue Zeile am Ende dieses Codes.)
Liest das Startmuster aus der Standardeingabe als Textdatei, in der lebende Zellen als
1
, tote Zellen als Leerzeichen dargestellt werden und Zeilen durch eine neue Zeile getrennt werden. Die Eingabe darf keine anderen Zeichen als diese enthalten. Zeilen können variabel lang sein und werden auf genau 79 Breite aufgefüllt oder abgeschnitten. Beispiel Eingabe ist eine Segelflugwaffe:Während das Programm Game of Life ausführt, wird jeder Status in einem ähnlichen Format wie die Eingabe auf die Standardausgabe kopiert und anschließend um 0,1 Sekunden verzögert. Die Verzögerung kann durch Ändern des vierten Arguments des Auswahlaufrufs angepasst werden.
Das Spielbrett ist fest auf die Größe 79x23 codiert. Es ist in einen Torus gewickelt: Wenn Sie das Brett unten lassen, landen Sie oben. Wenn Sie auf der rechten Seite verlassen, landen Sie auf der linken Seite, aber eine Reihe nach unten verschoben.
Hier ist eine alternative Version, die keine Eingaben liest und von einer zufälligen Karte ausgeht:
Dieser Code stammt aus einem verschleierten Perl-Programm, das ich vor Jahren geschrieben habe . Ich habe es sehr verändert, um das Board toroidal und den Code Golf zu machen.
Dies ist wahrscheinlich nicht die kürzeste Methode, um Game of Life in Perl zu implementieren, aber eine der weniger verständlichen.
quelle
Python, 589 Bytes
Maustasten: links - Zelle setzen, rechts - Zelle entfernen, Mitte - Start / Stopp.
Und hier ist eine Version, in der Sie die Maus zum Zeichnen ziehen können. Grafiken sind etwas angenehmer.
quelle
if 1<n<4:
sollte auf derselben Ebene eingerückt sein wiefor j in z(-1,2):
Python 2, 456 Bytes
Obwohl ich weiß, dass dies ein alter Beitrag ist, konnte ich mir nicht helfen, es zu versuchen. Die anfängliche Tafel kann beliebig groß sein, solange Sie einen Rand um sie herum zeichnen und in der letzten Zeile ein zusätzliches Leerzeichen haben.
Golf.py
Input.txt (beachten Sie das zusätzliche Leerzeichen in der letzten Zeile)
Wie man läuft
quelle
time.sleep(0.1)==None
=>not time.sleep(.1)
,(f=='@'and(x==3 or x==2
)) oder (f == '' und x == 3) =>x==3or f=='@'and x==2
1 if
=>1if
.wird bearbeitet
270,261249 BytesDas Raster entspricht 100 * 100 Pixel des Bildschirms. Die Eingabe erfolgt in Form eines PNG-Bilds
Ungolfed
quelle
Lua + LÖVE / Love2D , 653 Bytes
oder beabstandet:
Klicken Sie auf das Feld, um lebende Zellen hinzuzufügen. Klicken Sie außerhalb des Feldes, um es auszuführen.
Probieren Sie es online!
quelle
Nachsatz
529515Begonnen mit dem Beispiel von Rosetta Code . Rufen Sie mit einem Dateinamenargument (
gs -- gol.ps pulsar
) die Datei auf, die 20 * 20 Binärzahlen enthält (durch Leerzeichen getrennt). Endlosschleife: Brett zeichnen, auf Eingabe warten, nächste Generation berechnen.Mit ein paar Stapelkommentaren (genau die, die ich gebraucht habe).
Pulsardatendatei:
quelle
JavaScript 676
Sorry Griffin, ich konnte deinen Code einfach nicht ansehen und ihn nicht leicht umschreiben ... musste zwei Zeichen abschneiden, aber es war es verdammt wert!
b=[];r=c=s=20;U=document;onload=function(){for(z=E=0;z<c;++z)for(b.push(t=[]),j=0;j<r;j++)with(U.body.appendChild(U.createElement("button")))t.push(0),id=z+"_"+j,style.position="absolute",style.left=s*j+"px",style.top=s*z+"px",onclick=a}; ondblclick=function(){A=E=E?clearInterval(A):setInterval(function(){Q=[];for(z=0;z<c;++z){R=[];for(j=0;j<r;)W=(c+z-1)%c,X=(c+z+1)%c,Y=(r+j-1)%r,Z=(r+j+1)%r,n=b[W][Y]+b[z][Y]+b[X][Y]+b[W][j]+b[X][j]+b[W][Z]+b[z][Z]+b[X][Z],R.push(b[z][j++]?4>n&&1<n:3==n);Q.push(R)}b=Q.slice();d()})};function a(e){E?0:P=e.target.id.split("_");b[P[0]][P[1]]^=1;d()}function d(){for(z=0;z<c;++z)for(j=0;j<r;)U.getElementById(z+"_"+j).innerHTML=b[z][j++]-0}
Aber wie sie sagen, ist es einfacher um Vergebung zu bitten als um Erlaubnis ...;)
quelle
Oktave (153)
das gleiche wie Matlab von DenDenDo beim kürzesten Spiel des Lebens , musste jedoch imshow auf imagesc ändern:
quelle
Python 2: 334 Bytes
Nur 6 Jahre zu spät.
Sie können es wie folgt ausführen:
Wenn die Nullen und Einsen tote und lebende Zellen darstellen, beginnt eine zusätzliche Zeile am Ende mit der Ausführung.
Die Gitter müssen quadratisch sein.
Es ist einfacher auszuführen als das kürzeste Python, unterstützt Gitter beliebiger Größe und sieht beim Ausführen hübsch aus.
Es sind auch 100 Bytes mehr, also gibt es das.
quelle
PHP, 201 Bytes (nicht getestet)
Laufen Sie mit
-nr
.Nervenzusammenbruch
quelle