Die Herausforderung: Schreiben Sie das kürzeste Programm, das den zellularen Automaten Game of Life von John H. Conway implementiert . [ Link ]
EDIT: Nach ungefähr einer Woche Wettbewerb habe ich einen Sieger ausgewählt: pdehaan , der es geschafft hat, die Matlab-Lösung mit Perl um einen Charakter zu schlagen .
Für diejenigen, die noch nichts von Game of Life gehört haben, nehmen Sie ein Gitter (idealerweise unendlich) aus quadratischen Zellen. Zellen können lebendig (gefüllt) oder tot (leer) sein. Wir bestimmen, welche Zellen im nächsten Schritt der Zeit leben, indem wir die folgenden Regeln anwenden:
- Jede lebende Zelle mit weniger als zwei lebenden Nachbarn stirbt, als ob sie durch eine Unterbevölkerung verursacht würde.
- Jede lebende Zelle mit mehr als drei lebenden Nachbarn stirbt wie durch Überfüllung.
- Jede lebende Zelle mit zwei oder drei lebenden Nachbarn lebt für die nächste Generation weiter.
- Jede tote Zelle mit genau drei lebenden Nachbarn wird wie durch Reproduktion zu einer lebenden Zelle.
Ihr Programm liest eine ASCII-Textdatei mit 40 x 80 Zeichen ein, die als Befehlszeilenargument angegeben ist, sowie die Anzahl der auszuführenden Iterationen (N). Schließlich wird der Status des Systems nach N Iterationen in eine ASCII-Datei out.txt ausgegeben.
Hier ist ein Beispiellauf mit relevanten Dateien:
in.txt:
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
..................................XX............................................
..................................X.............................................
.......................................X........................................
................................XXXXXX.X........................................
................................X...............................................
.................................XX.XX...XX.....................................
..................................X.X....X.X....................................
..................................X.X......X....................................
...................................X.......XX...................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
100 Mal iterieren:
Q:\>life in.txt 100
Resultierende Ausgabe (out.txt)
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
..................................XX............................................
..................................X.X...........................................
....................................X...........................................
................................XXXXX.XX........................................
................................X.....X.........................................
.................................XX.XX...XX.....................................
..................................X.X....X.X....................................
..................................X.X......X....................................
...................................X.......XX...................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
Die Regeln:
- Sie müssen Datei-E / A verwenden, um die Dateien zu lesen / schreiben.
- Sie müssen eine Eingabedatei und die Anzahl der Iterationen als Argumente akzeptieren
- Sie müssen out.txt (angegeben, falls vorhanden) im angegebenen Format generieren
- Sie müssen sich nicht mit den Kanten der Platine befassen (umlaufende, unendliche Gitter usw.).
- EDIT: Sie tun müssen Zeilenumbrüche in der Ausgabedatei haben.
Der Gewinner wird anhand der Anzahl der Charaktere ermittelt.
Viel Glück!
Antworten:
Perl, 127
129 135ZeichenHat es geschafft, ein paar weitere Charaktere auszuziehen ...
quelle
@b=<>=~/./g
spart 3 weitere charMathematica -
179163154151 Zeichen
Zur besseren Lesbarkeit hinzugefügte LeerzeichenRufen Sie mit auf
Animation:
Sie können auch ein Diagramm der mittleren Bevölkerung über die Zeit erhalten:
Ein schönes Muster zum Generieren von Segelflugzeugen aus Wikipedia
AFAIK Mathematica verwendet einen Zellularautomaten, um nach Regel 30 Zufallszahlen zu generieren .
quelle
CellularAutomaton
Funktion scheint die Herausforderung zu meistern.MATLAB 7.8.0 (R2009a) -
174171161150138131128124 ZeichenFunktionssyntax: (124 Zeichen)
Hier ist die besser lesbare Version (mit unnötigen Zeilenumbrüchen und Leerzeichen zur besseren Formatierung):
Und so wird das Programm über das MATLAB-Befehlsfenster ausgeführt:
Befehlssyntax: (130 Zeichen)
Nach einem Kommentar über Funktionen mit einer Befehlssyntax Aufruf, grub ich ein wenig tiefer und fand heraus , dass MATLAB - Funktionen können in der Tat werden aufgerufen mit einem Befehlszeilenformat (mit einigen Einschränkungen). Sie lernen jeden Tag etwas Neues!
Und so wird das Programm über das MATLAB-Befehlsfenster ausgeführt:
Zusätzliche Herausforderung: Tweetbarer GIF-Hersteller - 136 Zeichen
Ich dachte zum Spaß, ich würde sehen, ob ich die Ausgabe in eine GIF-Datei anstatt in eine Textdatei kopieren könnte, während die Zeichenanzahl immer noch unter 140 bleibt (dh "tweetbar"). Hier ist der schön formatierte Code:
Obwohl IMWRITE ein GIF erstellen soll, das standardmäßig unendlich viele Schleifen enthält, wird mein GIF nur einmal wiederholt. Möglicherweise ist dies ein Fehler, der in neueren Versionen von MATLAB behoben wurde. Um die Animation länger zu halten und die Evolutionsschritte besser sichtbar zu machen, habe ich die Bildverzögerung auf dem Standardwert belassen (der ungefähr eine halbe Sekunde zu betragen scheint). Hier ist die GIF-Ausgabe mit dem Gosper Glider Gun- Muster:
Verbesserungen
b
von einem logischen (dh "booleschen") Typ in einen numerischen Typ , um einige Konvertierungen zu vermeiden.~~b+0
mitb/42
und ersetzt'same'
mit's'
als Argument an CONV2 (und es überraschenderweise noch gearbeitet!).b
zu einer logischen Matrix zurückkehren musste.b
und die Logik in der Schleife überarbeitet, um 1 zusätzliches Zeichen zu speichern.cell2mat
wobeichar
4 Zeichen gespeichert wurden. Danke Eric!quelle
Ruby 1.9 -
189178159155153 ZeichenBearbeiten: Behandelt Zeilenumbrüche mit 4 Zeichen weniger.
Kann 7 weitere (
v<?.?v:
) entfernen, wenn Sie zulassen, dass Zeilenumbrüche blockiert werden, wenn die lebenden Zellen die Ränder erreichen.quelle
v<13?v:l==3||v-l==?T?X:?.}}
. Aber ich habe nicht 1.9 installiert, um es zu testen.v
(eine Zeichenfolge) mit einer Ganzzahl vergleichen kann .Python - 282 Zeichen
könnte genauso gut den Ball ins Rollen bringen ...
quelle
;)
set(...)
können also durch ersetzt werden{...}
, und das Ersetzenrange(3e3)
durchrange(3000)
ergibt eine Nettoverbesserung von 2 Zeichen.Python 2.x - 210/234 Zeichen
Okay, der 210-stellige Code ist eine Art Betrug.
#coding:l1 exec'xÚ=ŽA\nÂ@E÷sŠº1ƒÆscS‰ØL™Æª··âî¿GÈÿÜ´1iÖ½;Sçu.~H®J×Þ-‰Ñ%ª.wê,šÖ§J®d꘲>cÉZË¢V䀻Eîa¿,vKAËÀå̃<»Gce‚ÿ‡ábUt¹)G%£êŠ…óbÒüíÚ¯GÔ/n×Xši&ć:})äðtÏÄJÎòDˆÐÿG¶'.decode('zip')
Sie werden diesen Code wahrscheinlich nicht kopieren, einfügen und zum Laufen bringen können. Es soll Latin-1 (ISO-8859-1) sein, aber ich denke, es wurde irgendwo auf dem Weg in Windows-1252 pervertiert. Darüber hinaus verschluckt Ihr Browser möglicherweise einige der Nicht-ASCII-Zeichen.
Wenn es also nicht funktioniert, können Sie die Datei aus einfachen alten 7-Bit-Zeichen generieren:
s = """ 23 63 6F 64 69 6E 67 3A 6C 31 0A 65 78 65 63 27 78 DA 3D 8E 41 5C 6E C2 40 0C 45 F7 73 8A BA 31 13 AD 83 15 11 11 C6 73 08 63 17 05 53 89 D8 4C 99 C6 AA B7 B7 AD E2 EE BF 47 C8 FF DC B4 31 69 D6 BD 3B 53 E7 75 2E 7E 48 AE 4A D7 DE 90 8F 2D 89 AD D1 25 AA 2E 77 16 EA 2C 9A D6 A7 4A AE 64 EA 98 B2 3E 63 C9 5A CB A2 56 10 0F E4 03 80 BB 45 16 0B EE 04 61 BF 2C 76 0B 4B 41 CB C0 E5 CC 83 03 3C 1E BB 47 63 65 82 FF 87 E1 62 55 1C 74 B9 29 47 25 A3 EA 03 0F 8A 07 85 F3 62 D2 FC ED DA AF 11 47 D4 2F 6E D7 58 9A 69 26 C4 87 3A 7D 29 E4 F0 04 74 CF C4 4A 16 CE F2 1B 44 88 1F D0 FF 47 B6 27 2E 64 65 63 6F 64 65 28 27 7A 69 70 27 29 """ with open('life.py', 'wb') as f: f.write(''.join(chr(int(i, 16)) for i in s.split()))
Das Ergebnis ist eine gültige Python-Quelldatei mit 210 Zeichen. Alles, was ich hier getan habe, ist die komprimierte Komprimierung des ursprünglichen Python-Quellcodes. Der eigentliche Cheat ist, dass ich in der resultierenden Zeichenfolge Nicht-ASCII-Zeichen verwende. Es ist immer noch gültiger Code, es ist nur umständlich.
Die nicht komprimierte Version wiegt 234 Zeichen, was meiner Meinung nach immer noch respektabel ist.
import sys f,f,n=sys.argv e=open(f).readlines() p=range for v in p(int(n)):e=[''.join('.X'[8+16*(e[t][i]!='.')>>sum(n!='.'for v in e[t-1:t+2]for n in v[i-1:i+2])&1]for i in p(80))for t in p(40)] open('out.txt','w').write('\n'.join(e))
Entschuldigung für die horizontale Schriftrolle, aber alle Zeilenumbrüche oben sind erforderlich, und ich habe sie jeweils als ein Zeichen gezählt.
Ich würde nicht versuchen, den Golfcode zu lesen. Die Variablennamen werden zufällig ausgewählt, um die beste Komprimierung zu erzielen. Ja, es ist mein Ernst. Es folgt eine besser formatierte und kommentierte Version:
# get command-line arguments: infile and count import sys ignored, infile, count = sys.argv # read the input into a list (each input line is a string in the list) data = open(infile).readlines() # loop the number of times requested on the command line for loop in range(int(count)): # this monstrosity applies the rules for each iteration, replacing # the cell data with the next generation data = [''.join( # choose the next generation's cell from '.' for # dead, or 'X' for alive '.X'[ # here, we build a simple bitmask that implements # the generational rules. A bit from this integer # will be chosen by the count of live cells in # the 3x3 grid surrounding the current cell. # # if the current cell is dead, this bitmask will # be 8 (0b0000001000). Since only bit 3 is set, # the next-generation cell will only be alive if # there are exactly 3 living neighbors in this # generation. # # if the current cell is alive, the bitmask will # be 24 (8 + 16, 0b0000011000). Since both bits # 3 and 4 are set, this cell will survive if there # are either 3 or 4 living cells in its neighborhood, # including itself 8 + 16 * (data[y][x] != '.') # shift the relevant bit into position >> # by the count of living cells in the 3x3 grid sum(character != '.' # booleans will convert to 0 or 1 for row in data[y - 1 : y + 2] for character in row[x - 1 : x + 2] ) # select the relevant bit & 1 ] # for each column and row for x in range(80) ) for y in range(40) ] # write the results out open('out.txt','w').write('\n'.join(data))
Entschuldigung, Pythonistas, für die C-ish-Klammerformatierung, aber ich habe versucht, klar zu machen, was jede Klammer schloss.
quelle
open(f).readlines()
sollte als gesetzt werdenlist(open(f))
. Äquivalent und sechs Zeichen kürzer minimiert und 3 Bytes kürzer gezippt und seltsamerweise 4 Zeichen kürzer gezippt mit EOL bei EOF, was es 206 (gezippt mit EOL) und 228 (minimiert ohne EOL) macht.Haskell -
284272232 Zeichenquelle
F #, 496
Ich könnte das sehr reduzieren, aber ich mag das, da es immer noch im Stadion ist und ziemlich lesbar.
BEARBEITEN
428
Auf Anfrage hier mein nächster Stich:
Das ist eine 14% ige Ermäßigung bei einigen grundlegenden Golfspielen. Ich kann nicht anders, als das Gefühl zu haben, dass ich durch die Verwendung eines 2D-Arrays / Arrays von Strings anstelle eines 1D-Arrays verliere, aber ich habe jetzt keine Lust, diese Transformation durchzuführen. Beachten Sie, wie ich die Datei 3200 Mal elegant gelesen habe, um mein Array zu initialisieren :)
quelle
Ruby 1.8:
178175 ZeichenZeilenumbrüche sind von Bedeutung (obwohl alle mit Semikolons ersetzt werden können.)
Bearbeiten: Das Newline-Problem wurde behoben und 3 Zeichen wurden gekürzt.
quelle
Java,
441 ...346Einfach mit der Lösung von BalusC herumspielen. Eingeschränkter Ruf bedeutet, dass ich seinem Kommentar nichts hinzufügen konnte.
Lesbarere (?) Version:
quelle
--i
kann reingehennew char[i--*t]
undb[l++]+=(char)j
kann einfach seinb[l++]=(char)j
. Das spart weitere 3 Zeichen.&n+j<s
? Dies würde zu AIOBE führen, wenn die Eingabedatei wirklich 3240 Zeichen lang ist. Mehr Optimierung: Schauen Sie sich an, wie ich die Datei einlesechar[]
, Ihre kann durch ersetzt werdenwhile(l<t)b[l++]=(char)r.read();
, spart 4 Zeichen.Scala -
467364339 ZeichenIch denke, es gibt viel Raum für Verbesserungen ...
[Bearbeiten] Ja, es ist:
[Bearbeiten] Und ich habe das Gefühl, es gibt noch mehr herauszudrücken ...
quelle
Die folgende Lösung verwendet meine eigene domänenspezifische Programmiersprache, die ich NULL genannt habe:
Falls Sie sich fragen, wie das funktioniert: Meine Sprache besteht nur aus einer Aussage pro Programm. Die Anweisung repräsentiert eine StackOverflow-Thread-ID, die zu einem Code-Golf-Thread gehört. Mein Compiler kompiliert dies zu einem Programm, das nach der besten Javascript-Lösung (mit der SO-API) sucht, diese herunterlädt und in einem Webbrowser ausführt.
Die Laufzeit könnte für neue Threads besser sein (es kann einige Zeit dauern, bis die erste hochgestufte Javascript-Antwort angezeigt wird), aber auf der anderen Seite sind nur sehr geringe Programmierkenntnisse erforderlich.
quelle
Javascript / Node.js - 233
236Zeichenquelle
C - 300
Ich habe mich nur gefragt, wie viel kleiner und hässlicher meine Java-Lösung in C sein könnte. Reduziert sich auf 300, einschließlich der Zeilenumbrüche für die Präprozessor-Bits. Lässt den Speicher für das Betriebssystem frei! Könnte ~ 20 speichern, wenn angenommen wird, dass das Betriebssystem die Datei auch schließt und leert.
quelle
MUMPS: 314 Zeichen
quelle
Java,
556532517496472433428420418381 ZeichenUpdate 1 : 1.
StringBuffer
durchAppendable
und 2. durch ersetztchar[]
. 24 Zeichen gespeichert.Update 2: Es wurde eine kürzere Möglichkeit zum Einlesen von Dateien gefunden
char[]
. 15 Zeichen gespeichert.Update 3: ersetzt
if/else
durch?:
und zusammengeführtchar[]
undint
Deklarationen. 21 Zeichen gespeichert.Update 4: ersetzt
(int)f.length()
undc.length
durchs
. 24 Zeichen gespeichert.Update 5: Verbesserungen gemäß den Hinweisen von Molehill vorgenommen. Major eins hat die Zeichenlänge hartcodiert, damit ich sie loswerden konnte
File
. 39 Zeichen gespeichert.Update 6: Minor Refactoring. 6 Zeichen gespeichert.
Update 7: ersetzt
Integer#valueOf()
durchnew Integer()
und überarbeitet für Schleife. 8 Zeichen gespeichert.Update 8: Verbesserte Nachbarberechnung. 2 Zeichen gespeichert.
Update 9: Optimiertes Lesen von Dateien, da die Dateilänge bereits fest codiert ist. 37 Zeichen gespeichert.
Lesbarere Version:
Das Schließen nach dem Schreiben ist unbedingt erforderlich, andernfalls bleibt die Datei leer. Es hätte sonst weitere 21 Zeichen gespart.
Außerdem könnte ich ein weiteres Zeichen speichern, wenn ich es
46
anstelle von verwende'.'
, aber sowohl javac als auch Eclipse ruckeln mit einem Kompilierungsfehler. Möglicher Genauigkeitsverlust . Komisches Zeug.Hinweis: Dies erwartet eine Eingabedatei mit
\n
Zeilenumbrüchen, nicht\r\n
wie Windows standardmäßig verwendet!quelle
PHP -
365328322 Zeichen.Ich bin sicher, dass dies verbessert werden kann, aber ich war gespannt, wie es in PHP aussehen würde. Vielleicht inspiriert dies jemanden, der etwas mehr Erfahrung mit Code-Golf hat.
quelle
R 340 Zeichen
Ich finde es etwas betrügerisch, ein Add-In-Paket zu haben, das die eigentlichen Automaten für Sie erledigt, aber ich mache mit, weil ich immer noch mit Matrizen und Sachen herumschlagen musste, um die Datei mit 'X' anstelle von 1 einzulesen.
Dies ist mein erster 'Code Golf', interessant ....
quelle
c ++ -
492454386mein erster Code Golf;)
Eine etwas überarbeitete Version, die einen Teil der Logik durch eine Tabellensuche und einige andere kleinere Tricks ersetzt:
quelle
Perl - 214 Zeichen
Was, noch keine Perl-Einträge?
Laufen Sie mit:
quelle
Ein weiterer Java-Versuch, 361 Zeichen
Und etwas lesbarer
Sehr ähnlich zu Molehills Version. Ich habe versucht, einen anderen FileWriter zu verwenden und die Nachbarn der Zelle ohne eine zusätzliche Variable zu zählen. Leider
RandomAccessFile
ist der Name ziemlich lang und es ist erforderlich, dass Sie einen Dateizugriffsmodus übergeben.quelle
ROST - 469 Zeichen Ich weiß nicht, ob ich das hier posten soll (dieser Beitrag ist 3 Jahre alt), aber trotzdem, mein Versuch, in Rost (0,9):
Für Interessierte ist hier der Code vor aggressivem Golfen:
quelle
ét voilà möchten Sie möglicherweise diese HTML-Datei verwenden. Keine Dateieingabe, sondern ein Textbereich, der den Job macht! Es gibt auch einige HTML und Initiation und Vars. Die Hauptroutine hat nur 235 Zeichen. Es ist handminimiertes JS.
quelle
Eines der klassischen Muster
Mein Avatar wurde mit meiner Version des Game of Life nach diesem Muster und dieser Regel erstellt (beachten Sie, dass es nicht 23/3 ist):
IMHO - als ich Conways Spiel des Lebens lernte, war der Trick nicht, Kurzcode zu schreiben, sondern Code, der komplexe Lebensformen schnell erstellen kann. Unter Verwendung des obigen klassischen Musters und einer Welt mit 594.441 Zellen war das Beste, was ich jemals tun konnte, etwa 1.000 Generationen / Sek.
Ein weiteres einfaches Muster
Und Segelflugzeuge
quelle