Kürzestes Spiel des Lebens


59

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!

8
Zuvor bei Stack Overflow: Code Golf: Conways Spiel des Lebens , und achten Sie darauf, den Link zur APL-Implementierung in den Kommentaren zu lesen.
dmckee

1
Ah, das habe ich nicht gesehen. Aber das ist etwas anders, nein (außer dass ich die Arbeit lösche, die die Herausforderung zusammenstellt?
Griffin

6
Es ist kein Problem. Viele Rätsel, die bereits mit Stack Overflow ausgeführt wurden, wurden auch hier ausgeführt, aber die Leute werden Ihnen sagen, dass ich davon besessen bin, ähnliche Herausforderungen zu bewältigen.
dmckee

@Griffin: Sie können alle diese ;vor }s entfernen . varManchmal kann auch s beseitigt werden (wenn es Ihren Code nicht beschädigt). Und für einzeilige fors, ifs etc, können Sie die Beseitigung { }vollständig: for(...) for(...) dosomething().
Pimvdb

@pimvdb, Prost, ich habe es noch nicht voll ausprobiert, hatte keine Zeit dafür. Ich wollte nur zeigen, dass ich es auch versucht habe, anstatt mich müßig einer Herausforderung zu stellen. Wird es bald bis zum Äußersten Golf spielen.
Griffin

Antworten:


27

HTML5 Canvas mit JavaScript, 940 639 586 519 Zeichen

<html><body onload="k=40;g=10;b=[];setInterval(function(){c=[];for(y=k*k;y--;){n=0;for(f=9;f--;)n+=b[(~~(y/k)+k+f%3-1)%k*k+(y+k+~~(f/3)-1)%k];c[y]=n==3||n-b[y]==3;r.fillStyle=b[y]?'red':'tan';r.fillRect(y%k*g,~~(y/k)*g,g-1,g-1)}if(v.nextSibling.checked)b=c},1);v=document.body.firstChild;v.width=v.height=g*k;v.addEventListener('click',function(e){b[~~((e.pageY-v.offsetTop)/g)*k+~~((e.pageX-v.offsetLeft)/g)]^=1},0);r=v.getContext('2d');for(y=k*k;y--;)b[y]=0"><canvas></canvas><input type="checkbox"/>Run</body></html>

Ich 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.


Schön, aber ändern Sie die Intervallverzögerung, um 1sie 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.
Griffin

Sie können ersetzen new Array('#FFF','#800')mit ['#FFF','#800'].
Lowjacker

Obwohl ich das über das Zeichnen sage, erlaubt mein Supergolfspieler das Zeichnen nicht und ist hässlich wie die Sünde. Haha. Sie können Ihre beiden Farben im sArray auf tanund einstellen , redda 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 von jin das Intervall ein. Ich bin mir sicher, dass es noch viel mehr zu tun gibt.
Griffin

@Griffin und Lowjacker: Vielen Dank. Ich bin mir auch ziemlich sicher, dass Sie so viel mehr Golf spielen können (und bereits einige Ideen haben). Leider habe ich keine Zeit dafür gefunden. Eine bessere Golfversion wird morgen folgen - ich hoffe ...
Howard

2
Sie können die HTML- und Body-Tags entfernen. Es wird genauso funktionieren
Arodebaugh

32

Python, 219 Zeichen

Ich habe mich für maximales Golfen entschieden, mit einer Schnittstelle, die gerade ausreicht, um die Frage zu befriedigen.

import time
P=input()
N=range(20)
while 1:
 for i in N:print''.join(' *'[i*20+j in P]for j in N)
 time.sleep(.1);Q=[(p+d)%400 for d in(-21,-20,-19,-1,1,19,20,21)for p in P];P=set(p for p in Q if 2-(p in P)<Q.count(p)<4)

Sie führen es so aus:

echo "[8,29,47,48,49]" | ./life.py

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.


1
Das hätte total gewinnen sollen. Ich denke, die Leichtigkeit der Eingabe wurde ziemlich hoch gewichtet.
Primo

@primo Ich würde sogar so weit gehen, mma einen separaten Wettbewerb vorzuschlagen.
Luser Droog

2
Also ist das Leben von Py dann?
Christopher Wirt

Sie können immer noch ein Zeichen speichern ... 2-(p in P)== 2-({p}<P). Aber dann müssten Sie Ihre Eingabe ändern {8,29,47,48,49}:)
JBernardo

21

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(), und pxl-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 .

0
While 1
For(X,0,94
Ans/7+49seq(pxl-Test(remainder(Y,63),remainder(X+1,95)),Y,62,123
For(Y,0,62
If 1=pxl-Test(Y,X)+int(3fPart(3cosh(fPart(6ֿ¹iPart(sum(Ans,Y+1,Y+3
Pxl-Change(Y,X
End
End
End

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.

0
While 1
For(X,0,93
Ans/7+49seq(pxl-Test(Y,X+1),Y,0,62
For(Y,1,61
If 2rand>isClockOn=pxl-Test(Y,X)+int(3fPart(3cosh(fPart(6ֿ¹iPart(sum(Ans,Y,Y+2
Pxl-Change(Y,X
End
End
ClockOff
End

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:

    Row # | Cell State       | Stored number | Mod 6 = cell count
    ...
    44      Live, Live, Live   49+7+1 = 57     3
    45      Dead, Dead, Live   49+0+0 = 49     1
    46      Dead, Live, Dead   0+7+0  = 7      1
    ...
    

    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, 1wann die Eingabe 3/6, 2wann 4/6 und 0wann 0, 1/6, 2/6 oder 5/6 entspricht. Spart ungefähr 6 Bytes.


19

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.

Manipulate[x=Switch[run,1,x,2,CellularAutomaton[{224,{2,{{2,2,2},{2,1,2},{2,2,2}}},
{1,1}},x],3,Table[0,{k,40},{j,40}]];EventHandler[Dynamic[tds=Reverse[Transpose[x]];
ArrayPlot[tds,Mesh->True]],{"MouseClicked":>(pos=Ceiling[MousePosition["Graphics"]];
x=ReplacePart[x,pos->1-x[[Sequence@@pos]]];)}],{{run,3,""},{1->"||",2->">",3->"X"}}]

Bildbeschreibung hier eingeben

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.


2
+1, schön, dass du es probierst. Ja, das ist das Problem mit dieser Seite. Es gibt Unmengen alter Fragen, die man gerne übersieht.
Griffin

@Griffin danke, dass du es überhaupt bemerkt hast;)
Vitaliy Kaurov

15

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.

#include <windows.h>
#include<process.h>
#define K ][(x+80)%20+(y+80)%20*20]
#define H R.Event.MouseEvent.dwMousePosition
#define J R.Event.MouseEvent.dwButtonState
HANDLE Q,W;char*E[3],O;Y(x,y){return E[0 K;}U(x,y,l,v){E[l K=v;}I(){E[2]=E[1];E[1]=*E;*E=E[2];memset(E[1],0,400);}A(i,j,k,l,P){while(1){Sleep(16);for(i=0;i<20;++i)for(j=0;j<20;++j){COORD a={i,j};SetConsoleCursorPosition(Q,a);putchar(E[0][i+j*20]==1?'0':' ');}if(O){for(i=0;i<20;++i)for(j=0;j<20;++j){for(k=i-1,P=0;k<i+2;++k)for(l=j-1;l<j+2;++l){P+=Y(k,l);}U(i,j,1,P==3?1:Y(i,j)==1&&P==4?1:0);}I();}}}main(T,x,y,F,D){for(x=0;x<21;++x)puts("#####################");E[0]=malloc(800);E[1]=E[0]+400;I();I();W=GetStdHandle(-10);Q=GetStdHandle(-11);SetConsoleMode(W,24);INPUT_RECORD R;F=D=O=0;COORD size={80,25};SetConsoleScreenBufferSize(Q,size);_beginthread(A,99,0);while(1){ReadConsoleInput(W,&R,1,&T);switch(R.EventType){case 1:O=R.Event.KeyEvent.dwControlKeyState&128;break;case 2:switch(R.Event.MouseEvent.dwEventFlags){case 1:x=H.X;y=H.Y;case 0:F=J&1;D=J&2;}if(F)U(x,y,0,1);if(D)U(x,y,0,0);}}}

Die kompilierte EXE finden Sie hier

Bearbeiten: Ich habe die Quelle kommentiert. Es ist erhältlich hier


Ich würde gerne eine kommentierte Version davon sehen!
Luser Droog

1
Klar, wenn ich mich erinnern kann, was ich gedacht habe ... = p
Kaslai

1
@luserdroog Hier ist es pastebin.com/BrX6wgUj
Kaslai

Das ist einfach großartig.
rayryeng - Wiedereinsetzung von Monica

12

J (39 Zeichen)

l=:[:+/(3 4=/[:+/(,/,"0/~i:1)|.])*.1,:]

Basierend auf dieser APL-Version (gleicher Algorithmus, toroidale Faltung).

Anwendungsbeispiel:

   r =: (i.3 3) e. 1 2 3 5 8
   r
0 1 1          NB. A glider!
1 0 1
0 0 1

   R =: _1 _2 |. 5 7 {. r
   R
0 0 0 0 0 0 0  NB. Test board
0 0 0 1 1 0 0
0 0 1 0 1 0 0
0 0 0 0 1 0 0
0 0 0 0 0 0 0

   l R
0 0 0 0 0 0 0  NB. Single step
0 0 0 1 1 0 0
0 0 0 0 1 1 0
0 0 0 1 0 0 0
0 0 0 0 0 0 0

10

Mathematica, 123 Zeichen

Eine sehr rudimentäre Implementierung, die die in Mathematica integrierte CellularAutomaton-Funktion nicht verwendet.

ListAnimate@NestList[ImageFilter[If[3<=Total@Flatten@#<=3+#[[2]][[2]],1,0]&,#,1]&,Image[Round/@RandomReal[1,{200,200}]],99]

8

Ruby 1.9 + SDL (380 325 314)

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.

require'sdl'
SDL.init W=56
R=0..T=W*W
b=[]
s=SDL::Screen.open S=W*9,S,0,0
loop{r="#{e=SDL::Event.poll}"
r['yU']?$_^=1:r[?Q]?exit: r['nU']?b[e.y/9*W+e.x/9]^=1:0
b=R.map{|i|v=[~W,-W,-55,-1,1,55,W,57].select{|f|b[(i+f)%T]}.size;v==3||v==2&&b[i]}if$_
R.map{|i|s.fillRect i%W*9,i/W*9,9,9,[b[i]?0:S]*3}
s.flip
sleep 0.1}

Sieht aus wie das:

Screenshot der App in Aktion

Eine lustige Herausforderung! Ich freue mich über Verbesserungen, die jeder sehen kann.


Netter Versuch, aber ich kann sofort sehen, dass du falsch gelaufen bist. Sie können ein solches Muster in GoL nicht haben. Lesen Sie die Regeln noch einmal durch: de.wikipedia.org/wiki/Conway%27s_Game_of_Life#Rules
Griffin

@Griffin Ich glaube, der Screenshot wurde aufgenommen, nachdem einige Zellen manuell angehalten und umgeschaltet wurden. Ich werde die Regeln jedoch erneut überprüfen. Vielen Dank!
Paul Prestidge

7
@Griffin Kann das Samenmuster nicht in einer möglichen Konfiguration sein?
Mittwoch,

7

Scala, 1181 1158 1128 1063 1018 1003 999 992 987 Zeichen

import swing._
import event._
object L extends SimpleSwingApplication{import java.awt.event._
import javax.swing._
var(w,h,c,d,r)=(20,20,20,0,false)
var x=Array.fill(w,h)(0)
def n(y:Int,z:Int)=for(b<-z-1 to z+1;a<-y-1 to y+1 if(!(a==y&&b==z)))d+=x((a+w)%w)((b+h)%h)
def top=new MainFrame with ActionListener{preferredSize=new Dimension(500,500)
menuBar=new MenuBar{contents+=new Menu("C"){contents+={new MenuItem("Go/Stop"){listenTo(this)
reactions+={case ButtonClicked(c)=>r= !r}}}}}
contents=new Component{listenTo(mouse.clicks)
reactions+={case e:MouseClicked=>var p=e.point
x(p.x/c)(p.y/c)^=1
repaint}
override def paint(g:Graphics2D){for(j<-0 to h-1;i<-0 to w-1){var r=new Rectangle(i*c,j*c,c,c)
x(i)(j)match{case 0=>g draw r
case 1=>g fill r}}}}
def actionPerformed(e:ActionEvent){if(r){var t=x.map(_.clone)
for(j<-0 to h-1;i<-0 to w-1){d=0
n(i,j)
x(i)(j)match{case 0=>if(d==3)t(i)(j)=1
case 1=>if(d<2||d>3)t(i)(j)=0}}
x=t.map(_.clone)
repaint}}
val t=new Timer(200,this)
t.start}}

Ungolfed:

import swing._
import event._

object Life extends SimpleSwingApplication
{
    import java.awt.event._
    import javax.swing._
    var(w,h,c,d,run)=(20,20,20,0,false)
    var x=Array.fill(w,h)(0)
    def n(y:Int,z:Int)=for(b<-z-1 to z+1;a<-y-1 to y+1 if(!(a==y&&b==z)))d+=x((a+w)%w)((b+h)%h)
    def top=new MainFrame with ActionListener
    {
        title="Life"
        preferredSize=new Dimension(500,500)
        menuBar=new MenuBar
        {
            contents+=new Menu("Control")
            {
                contents+={new MenuItem("Start/Stop")
                {
                    listenTo(this)
                    reactions+=
                    {
                        case ButtonClicked(c)=>run= !run
                    }
                }}
            }
        }
        contents=new Component
        {
            listenTo(mouse.clicks)
            reactions+=
            {
                case e:MouseClicked=>
                    var p=e.point
                    if(p.x<w*c)
                    {
                        x(p.x/c)(p.y/c)^=1
                        repaint
                    }
            }
            override def paint(g:Graphics2D)
            {
                for(j<-0 to h-1;i<-0 to w-1)
                {
                    var r=new Rectangle(i*c,j*c,c,c)
                    x(i)(j) match
                    {
                        case 0=>g draw r
                        case 1=>g fill r
                    }
                }
            }
        }
        def actionPerformed(e:ActionEvent)
        {
            if(run)
            {
                var t=x.map(_.clone)
                for(j<-0 to h-1;i<-0 to w-1)
                {
                    d=0
                    n(i,j)
                    x(i)(j) match
                    {
                        case 0=>if(d==3)t(i)(j)=1
                        case 1=>if(d<2||d>3)t(i)(j)=0
                    }
                }
                x=t.map(_.clone)
                repaint
            }
        }
        val timer=new Timer(200,this)
        timer.start
    }
}

Der größte Teil des Codes hier ist Swing GUI-Zeug. Das Spiel selbst befindet sich in der actionPerformedMethode, die von der Timer, und der Helferfunktion, ndie die Nachbarn zählt, ausgelöst wird .

Verwendungszweck:

Kompiliere es mit scalac filenameund starte es dann mit scala 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).


Ich habe 2 Golf-Verbesserungen gefunden: import java.awt.event._und contents+=m("Go",true)+=m("Stop",false)}}, was zu 1093 Zeichen führt.
Benutzer unbekannt

@user unbekannt Danke. Ich habe selbst ein paar Verbesserungen gefunden - bis jetzt 1063.
Gareth

Verdammt, du warst beschäftigt. Mach weiter! Ich werde die Antworten testen, wenn ein paar Leute sie veröffentlichen.
Griffin

7

Pure Bash, 244 Bytes

Funktioniert auf einem ringförmig gewickelten 36x24-Universum:

mapfile a
for e in {0..863};{
for i in {0..8};{
[ "${a[(e/36+i/3-1)%24]:(e+i%3-1)%36:1}" == O ]&&((n++))
}
d=\ 
c=${a[e/36]:e%36:1}
[ "$c" == O ]&&((--n==2))&&d=O
((n-3))||d=O
b[e/36]+=$d
n=
}
printf -vo %s\\n "${b[@]}"
echo "$o"
exec $0<<<"$o"

Da es sich um ein Shell-Skript handelt, stimmt die Eingabemethode mit anderen Shell-Befehlen überein - z. B. von stdin:

$ ./conway.sh << EOF

   O 
    O 
  OOO 

EOF


  O O                                                       
   OO                                                       
   O                                                        

















    O                                                       
  O O                                                       
   OO                                                       

... usw

Wir können Eingaben von jeder Textquelle umleiten, die durch einen trFilter geleitet werden, um interessante Anfangsgenerationen zu erhalten, z

man tr | tr [:alnum:] O | ./conway.sh

6

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/

/* Fill an array with 0's and 1's, and call g(array, width, height) to iterate */
g=function(f,c,g,d,e,b,h){g=[];e=[c+1,c,c-1,1];for(b=c*c;b--;g[b]=3==d||f[b]&&2==d,d=0)for(h in e)d+=f[b+e[h]]+f[b-e[h]];return g}

Dies scheint einige Probleme mit der ersten Reihe zu haben. Zum Beispiel Einstellung @@\n@@(2 x 2 Quadrat in der oberen linken Ecke) oder .@\n.@\n.@. (1 x 3 Spalte)
Annan

5

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.)

using System.Windows.Forms;class G:Form{static void Main(){new G(25).ShowDialog();}
public G(int z){var g=new Panel[z,z];var n=new int [z,z];int x,y,t;for(int i=0;i<z;
i++)for(int j=0;j<z;j++){var p=new Panel{Width=9,Height=9,Left=i*9,Top=j*9,BackColor
=System.Drawing.Color.Tan};p.Click+=(s,a)=>p.Visible=!p.Visible;Controls.Add(g[i,j]=
p);}KeyUp+=(s,_)=>{for(int i=0;i<99;i++){for(x=0;x<z;x++)for(y=0;y<z;y++){t=0;for(int 
c=-1;c<2;c++)for(int d=-1;d<2;d++)if(c!=0||d!=0){int a=x+c,b=y+d;a=a<0?24:a>24?0:a;b=
b<0?24:b>24?0:b;t+=g[a,b].Visible?0:1;}if(t==3||t>1&&!g[x,y].Visible)n[x,y]=1;if(t<2
||t>3)n[x,y]=0;}for(x=0;x<z;x++)for(y=0;y<z;y++)g[x,y].Visible=n[x,y]<1;Update();}};}}

Verwendungszweck

  • Geben Sie ein Startmuster ein, indem Sie auf Zellen klicken, um sie zu aktivieren (lebendig).
  • Starten Sie das Spiel durch Drücken einer beliebigen Tastaturtaste.
  • Jedes Mal, wenn eine Taste gedrückt wird, läuft das Spiel 99 Generationen lang (ich hätte es auf 9 setzen können, um ein Zeichen zu retten, aber das schien zu lahm).

Golf-Kompromisse

  • Sie können Zellen nur mit der Maus einschalten, nicht aber aus. Wenn Sie also einen Fehler machen, müssen Sie das Programm neu starten.
  • Es gibt keine Gitterlinien, aber das schadet der Spielbarkeit nicht zu sehr.
  • Die Aktualisierungsgeschwindigkeit ist proportional zur CPU-Geschwindigkeit, sodass es bei sehr schnellen Computern wahrscheinlich nur zu einer Unschärfe kommt.
  • Lebende Zellen sind rot, weil "schwarz" zwei weitere Zeichen verwendet.
  • Die Kleinheit der Zellen und die Tatsache, dass sie nicht den gesamten Formularraum beanspruchen, sind auch Zeichen sparende Kompromisse.

5

GW-BASIC, 1086 1035 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"lifeBefehl verwenden, ohne es ",aim Interpreter anzuhängen .

10 DEFINT A-Z:DEF SEG=&HB800:KEY OFF:COLOR 7,0:CLS:DEF FNP(X,Y)=PEEK((((Y+25)MOD 25)*80+((X+80)MOD 80))*2)
20 X=0:Y=0
30 LOCATE Y+1,X+1,1
40 S$=INKEY$:IF S$=""GOTO 40
50 IF S$=CHR$(13)GOTO 150
60 IF S$=" "GOTO 130
70 IF S$=CHR$(0)+CHR$(&H48)THEN Y=(Y-1+25)MOD 25:GOTO 30
80 IF S$=CHR$(0)+CHR$(&H50)THEN Y=(Y+1)MOD 25:GOTO 30
90 IF S$=CHR$(0)+CHR$(&H4B)THEN X=(X-1+80)MOD 80:GOTO 30
100 IF S$=CHR$(0)+CHR$(&H4D)THEN X=(X+1)MOD 80:GOTO 30
110 IF S$="c"THEN CLS:GOTO 20
120 GOTO 40
130 Z=PEEK((Y*80+X)*2):IF Z=42 THEN Z=32ELSE Z=42
140 POKE(Y*80+X)*2,Z:GOTO 40
150 LOCATE 1,1,0:ON KEY(1)GOSUB 320:KEY(1) ON
160 V!=TIMER+.5:FOR Y=0 TO 24:FOR X=0 TO 79:N=0
170 Z=FNP(X-1,Y-1):IF Z=42 OR Z=46 THEN N=N+1
180 Z=FNP(X,Y-1):IF Z=42 OR Z=46 THEN N=N+1
190 Z=FNP(X+1,Y-1):IF Z=42 OR Z=46 THEN N=N+1
200 Z=FNP(X-1,Y):IF Z=42 OR Z=46 THEN N=N+1
210 Z=FNP(X+1,Y):IF Z=42 OR Z=46 THEN N=N+1
220 Z=FNP(X-1,Y+1):IF Z=42 OR Z=46 THEN N=N+1
230 Z=FNP(X,Y+1):IF Z=42 OR Z=46 THEN N=N+1
240 Z=FNP(X+1,Y+1):IF Z=42 OR Z=46 THEN N=N+1
250 Z=PEEK((Y*80+X)*2):IF Z=32 THEN IF N=3 THEN Z=43
260 IF Z=42 THEN IF N<2 OR N>3 THEN Z=46
270 POKE(Y*80+X)*2,Z:NEXT:NEXT:FOR Y=0 TO 24:FOR X=0 TO 79:Z=PEEK((Y*80+X)*2):IF Z=46 THEN Z=32
280 IF Z=43 THEN Z=42
290 POKE(Y*80+X)*2,Z:NEXT:NEXT
300 IF TIMER<V!GOTO 300
310 IF INKEY$=""GOTO 160
320 SYSTEM

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 cschaltet 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:

1000 REM Conway's Game of Life
1001 REM -
1002 REM Copyright (c) 2012 Thorsten "mirabilos" Glaser
1003 REM All rights reserved. Published under The MirOS Licence.
1004 REM -
1005 DEFINT A-Z:DEF SEG=&hB800
1006 KEY OFF:COLOR 7,0:CLS
1007 DEF FNP(X,Y)=PEEK((((Y+25) MOD 25)*80+((X+80) MOD 80))*2)
1010 PRINT "Initial setting mode, press SPACE to toggle, RETURN to continue"
1020 PRINT "Press C to clear the board, R to reset. OK? Press a key then."
1030 WHILE INKEY$="":WEND
1050 CLS
1065 DATA 3,3,4,3,5,3,6,3,7,3,8,3,3,4,4,4,5,4,6,4,7,4,8,4
1066 DATA 10,3,10,4,10,5,10,6,10,7,10,8,11,3,11,4,11,5,11,6,11,7,11,8
1067 DATA 11,10,10,10,9,10,8,10,7,10,6,10,11,11,10,11,9,11,8,11,7,11,6,11
1068 DATA 4,11,4,10,4,9,4,8,4,7,4,6,3,11,3,10,3,9,3,8,3,7,3,6
1069 DATA 21,0,22,1,22,2,21,2,20,2,-1,-1
1070 RESTORE 1065
1080 READ X,Y
1090 IF X=-1 GOTO 1120
1100 POKE (Y*80+X)*2,42
1110 GOTO 1080
1120 X=0:Y=0
1125 LOCATE Y+1,X+1,1
1130 S$=INKEY$
1140 IF S$="" GOTO 1130
1150 IF S$=CHR$(13) GOTO 1804
1160 IF S$=" " GOTO 1240
1170 IF S$=CHR$(0)+CHR$(&h48) THEN Y=(Y-1+25) MOD 25:GOTO 1125
1180 IF S$=CHR$(0)+CHR$(&h50) THEN Y=(Y+1) MOD 25:GOTO 1125
1190 IF S$=CHR$(0)+CHR$(&h4B) THEN X=(X-1+80) MOD 80:GOTO 1125
1200 IF S$=CHR$(0)+CHR$(&h4D) THEN X=(X+1) MOD 80:GOTO 1125
1210 IF S$="c" THEN CLS:GOTO 1120
1220 IF S$="r" GOTO 1050
1225 IF S$=CHR$(27) THEN END
1230 GOTO 1130
1240 Z=PEEK((Y*80+X)*2)
1250 IF Z=42 THEN Z=32 ELSE Z=42
1260 POKE (Y*80+X)*2,Z
1270 GOTO 1130
1804 LOCATE 1,1,0
1900 ON KEY(1) GOSUB 2300
1910 KEY(1) ON
2000 V!=TIMER+.5
2010 FOR Y=0 TO 24
2020  FOR X=0 TO 79
2030   N=0
2040   Z=FNP(X-1,Y-1):IF Z=42 OR Z=46 THEN N=N+1
2050   Z=FNP(X  ,Y-1):IF Z=42 OR Z=46 THEN N=N+1
2060   Z=FNP(X+1,Y-1):IF Z=42 OR Z=46 THEN N=N+1
2070   Z=FNP(X-1,Y  ):IF Z=42 OR Z=46 THEN N=N+1
2080   Z=FNP(X+1,Y  ):IF Z=42 OR Z=46 THEN N=N+1
2090   Z=FNP(X-1,Y+1):IF Z=42 OR Z=46 THEN N=N+1
2100   Z=FNP(X  ,Y+1):IF Z=42 OR Z=46 THEN N=N+1
2110   Z=FNP(X+1,Y+1):IF Z=42 OR Z=46 THEN N=N+1
2120   Z=PEEK((Y*80+X)*2)
2130   IF Z=32 THEN IF N=3 THEN Z=43
2140   IF Z=42 THEN IF N<2 OR N>3 THEN Z=46
2150   POKE (Y*80+X)*2,Z
2160  NEXT X
2170 NEXT Y
2200 FOR Y=0 TO 24
2210  FOR X=0 TO 79
2220   Z=PEEK((Y*80+X)*2)
2230   IF Z=46 THEN Z=32
2240   IF Z=43 THEN Z=42
2250   POKE (Y*80+X)*2,Z
2260  NEXT X
2270 NEXT Y
2280 IF TIMER<V! GOTO 2280
2290 IF INKEY$="" GOTO 2000
2300 SYSTEM

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, &hB000wenn 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 ersetzt bezeichnet.

Das TIMER Sache ist, es nach jeder Runde eine halbe Sekunde warten zu lassen, falls Ihr Qemu-Host sehr schnell ist

Ich 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 ...


Ist es in Anbetracht der Tatsache, dass Sie Ihre Labels bei der nicht-golfenden Version um 1 erhöht haben, möglich, dasselbe bei der golfenden Version zu tun? (dh 1, 2, 3, etc.) Oder die Zeilennummern zählen nicht?
Zacharý,

Zeilennummern zählen, wenn sie mit einem Token versehen sind, als Wort (16 Bit), wenn ich mich nicht völlig irre
mirabilos

Okay, dann muss ich wohl an einen anderen BASIC-Dialekt gedacht haben.
Zacharý

@ Zacharý Klicken Sie auf "GW-BASIC tokenized program format" und dann hier auf "Program format", um zu sehen, dass die Zeilennummern konstant zwei Byte lang sind, und um weitere Informationen zum Tokenformat zu erhalten.
Mirabilos

5

Mathematica, 115 Bytes

Hier ist eine einfache Lösung:

ListAnimate[ArrayPlot/@CellularAutomaton[{224,{2,{{2,2,2},{2,1,2},
{2,2,2}}},{1,1}},{RandomInteger[1,{9,9}],0},90]]

1
Mathematica ist in Ordnung, aber gemäß den Regeln muss das Programm dem Benutzer die Eingabe eigener Muster ermöglichen. Diese Regel ist beabsichtigt, da einige Sprachen kurze Implementierungen wie diese zulassen, jedoch ohne Benutzerinteraktion. Sicher, Sie können Ihr eigenes Array darin platzieren, aber es wird nicht gewinnen.
Griffin

"Eingabe" in Mathematica erfolgt hauptsächlich über die Notebook-Oberfläche, daher denke ich nicht, dass "Benutzerinteraktion" wirklich möglich ist. Sie ersetzen einfach das RandomInteger-Argument für die CellularAutomaton-Funktion durch das gewünschte Argument und werten den Code neu aus.
JeremyKun

3
Benutzerinteraktion ist möglich. Die einfachste Methode, die ich mir vorstellen kann, ist eine Reihe von Schaltflächen. Probieren Sie es aus, Mann.
Griffin

4

Java (OpenJDK 8) - 400 388 367 Byte

Zweit 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 ...):

u->{int w=u.length,h=u[0].length,x,y,i,j,n;Stack<Point>r=new Stack<Point>();for(;;){for(Point c:r)u[c.x][c.y]=1;r.clear();for(x=0;x<w;++x)for(y=0;y<h;++y){boolean o=u[x][y]>0;n=o?-1:0;for(i=-2;++i<2;)for(j=-2;++j<2;)if(u[(w+x+i)%w][(h+y+j)%h]>0)++n;if(o&n>1&n<4|!o&n==3)r.add(new Point(x,y));System.out.print(u[x][y]+(y>h-2?"\n":""));}for(int[]t:u)Arrays.fill(t,0);}}

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):

/*
 * Explanation of each variable's usage:
 * w=height* of array
 * h=width* of array
 * x=y* coord of point in array
 * y=x* coord of point in array
 * i and j are counters for calculating the neighbours around a point in the array
 * n=neighbour counter
 * r=temporary array to store the cells from the current generation
 * u=the 2d array used for all the calculations (parameter from lambda expression)
 * c=temporary variable used to help populate the 2d array
 * o=boolean variable that stores the value of whether the cell is alive or not
 */
u-> // start of lambda statement with u as parameter (no need for brackets as it's only one parameter being passed)
{
    int w=u.length,h=u[0].length,x,y,i,j,n; // defines all the necessary integer variables;
    Stack<Point>r=new Stack<Point>(); // same with the only array list needed (note how I only use two data structures);
    for(;;) // notice how this is still an infinite loop but using a for loop;
    {
        for(Point c:r)u[c.x][c.y]=1; //for every point in the "previous" generation, add that to the 2D array as a live (evil?) cell;
        r.clear(); // clears the array list to be populated later on
        for(x=0;x<w;++x) // a pair of nested for loops to iterate over every cell of the 2D array;
        {
            for(y=0;y<h;++y)
            {
                // sets o to be the presence of a live cell at (x,y) then uses said value in initialising the neighbour counter;
                boolean o=u[x][y]>1;n=o?-1:0;
                for(i=-2;++i<2;) // another pair of nested for loops - this one iterates over a 3x3 grid around *each* cell of the 2D array;
                {                // this includes wrap-around (note the modulus sign in the if statement below);
                    for(j=-2;++j<2;)
                    {
                        if(u[(w+x+i)%w][(h+y+j)%h]>0)++n; // this is where the first interesting thing lies - the bit which makes wrap-around a reality;
                    }
                }
                if(o&n>1&n<4|!o&n==3)r.add(new Point(x,y)); // this is the second interesting bit of my code - perhaps more so as I use bitwise operators to calculate the number of neighbours (x,y) has;
                                                            // (since I'm technically dealing with 0s and 1s, it's not a total misuse of them imo);
                System.out.print(u[x][y]+(y>h-2?"\n":""));  // that extra part of the print statement adds a newline if we reached the end of the current 'line';
            }
        }
        // since the information about the new generation is now in the array list, this array can be emptied out, ready to receive said info on the new generation;
        for(int[]t:u)Arrays.fill(t,0);
    }
} // end of lambda statement

(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 neue bhinzugefügte Variable):

u->{int b=0,w=u.length,h=u[0].length,x,y,i,j,n;Stack<Point>r=new Stack<Point>();for(;++b<6;){for(Point c:r)u[c.x][c.y]=1;r.clear();for(x=0;x<w;++x)for(y=0;y<h;++y){boolean o=u[x][y]>0;n=o?-1:0;for(i=-2;++i<2;)for(j=-2;++j<2;)if(u[(w+x+i)%w][(h+y+j)%h]>0)++n;if(o&n>1&n<4|!o&n==3)r.add(new Point(x,y));System.out.print(u[x][y]+(y>h-2?"\n":""));}for(int[]t:u)Arrays.fill(t,0);}}

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ügen for(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:

u->{int w=u.length,h=u[0].length,x,y,i,j,n;ArrayList<Point>r=new ArrayList<Point>();while(true){for(Point c:r)u[c.x][c.y]=1;r.clear();for(x=0;x<w;++x){for(y=0;y<h;++y){boolean o=u[x][y]==1;n=o?-1:0;for(i=-2;++i<2;)for(j=-2;++j<2;)if(u[(w+x+i)%w][(h+y+j)%h]==1)++n;if(o&n>1&n<4|!o&n==3)r.add(new Point(x,y));System.out.print(u[x][y]);}System.out.println();}for(int[]t:u)Arrays.fill(t,0);}}

Und von der ersten 400-Byte-Antwort:

int w=35,h=20,x,y,i,j,n;ArrayList<Point>l=new ArrayList<Point>(),r;while(true){int[][]u=new int[w][h];for(Point c:l)u[c.x][c.y]=1;r=new ArrayList<Point>();for(x=0;x<w;++x){for(y=0;y<h;++y){boolean o=u[x][y]==1;n=o?-1:0;for(i=-2;++i<2;)for(j=-2;++j<2;)if(u[(w+x+i)%w][(h+y+j)%h]==1)++n;if(o&n>1&n<4|!o&n==3)r.add(new Point(x,y));System.out.print(u[x][y]);}System.out.println();}l.clear();l.addAll(r);}

Erstaunlicher erster Beitrag, willkommen bei PPCG!
Zacharý

Danke, ich werde auf jeden Fall mehr davon machen - sie machen Spaß :)
NotBaal

Mach mit, wir haben Dennis. Dies ist auch kein vollständiges Programm oder eine Funktion, die es sein muss, IIRC.
Zacharý

Oh, richtig, ich habe den 'Programm'-Teil vergessen: P Ich bearbeite das gleich.
NotBaal

Es kann auch nur eine Funktion sein.
Zacharý

4

Schablone , 6 Bytes

Nicht meine Lieblingssprache, aber es ist kurz ...

4 Code-Bytes plus die Flags nlist und Torus.

3me

Probieren Sie es online!

Ist ...
3 3
 Mitglied in
m der m oore-Nachbarschaft Zählung mit Selbst oder
e das Moor e -Umgebung-count ohne selbst
...?


3

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.

import java.awt.Color._
import swing._
import event._
import actors.Actor._
new SimpleSwingApplication{var(y,r,b)=(200,false,Array.fill(20,20)(false))
lazy val u=new Panel{actor{loop{if(r){b=Array.tabulate(20,20){(i,j)=>def^(i:Int)= -19*(i min 0)+(i max 0)%20
var(c,n,r)=(0,b(i)(j),-1 to 1)
for(x<-r;y<-r;if x!=0||y!=0){if(b(^(i+x))(^(j+y)))c+=1}
if(n&&(c<2||c>3))false else if(!n&&c==3)true else n}};repaint;Thread.sleep(y)}}
focusable=true
preferredSize=new Dimension(y,y)
listenTo(mouse.clicks,keys)
reactions+={case e:MouseClicked=>val(i,j)=(e.point.x/10,e.point.y/10);b(i)(j)= !b(i)(j)case _:KeyTyped=>r= !r}
override def paintComponent(g:Graphics2D){g.clearRect(0,0,y,y);g.setColor(red)
for(x<-0 to 19;y<-0 to 19 if b(x)(y))g.fillRect(x*10,y*10,9,9)}}
def top=new Frame{contents=u}}.main(null)

3

J, 45

Ich dachte, ich würde es versuchen. Es ist noch nicht besonders gut golfen, aber ich werde es bald noch einmal versuchen.

(]+.&(3&=)+)+/((4&{.,(_4&{.))(>,{,~<i:1))&|.

Beispiel:

   f =: 5 5 $ 0 1 0 0 0   0 0 1 0 0   1 1 1 0 0   0 0 0 0 0    0 0 0 0 0
   f
0 1 0 0 0
0 0 1 0 0
1 1 1 0 0
0 0 0 0 0
0 0 0 0 0
   f (]+.&(3&=)+)+/((4&{.,(_4&{.))(>,{,~<i:1))&|. f
0 0 0 0 0
1 0 1 0 0
0 1 1 0 0
0 1 0 0 0
0 0 0 0 0

3

Verarbeitung 536 532

int h=22,t=24,i,j;int[][]w=new int[t][t],b=new int[t][t];int[]q={1,0,-1};void draw(){if(t<9){clear();for(i=2;i<h;i++){for(j=2;j<h;j++)w[i][j]=b[i][j];w[i][1]=w[i][21];w[i][h]=w[i][2];w[1][i]=w[21][i];w[h][i]=w[2][i];}for(i=1;i<23;i++)for(j=1;j<23;j++){t=-w[i][j];for(int s:q)for(int d:q)t+=w[i+s][j+d];b[i][j]=w[i][j]>0&(t<2|t>3)?0:t==3?1:b[i][j];}a();}}void keyPressed(){t=0;}void mousePressed(){int i=mouseX/5+2,j=mouseY/5+2;w[i][j]=b[i][j]=1;a();}void a(){for(i=0;i<h-2;i++)for(j=0;j<h-2;j++)if(w[i+2][j+2]==1)rect(i*5,j*5,5,5);}

Ich glaube, dass dies alle Anforderungen erfüllt.

Ungolfed:

int h=22,t=24,i,j;
int[][]w=new int[t][t],b=new int[t][t];
int[]q={1,0,-1};
void draw(){
  if(t<9){
  clear();
  for(i=2;i<h;i++){
    for(j=2;j<h;j++)
      w[i][j]=b[i][j];  
    w[i][1]=w[i][21];
    w[i][h]=w[i][2];
    w[1][i]=w[21][i];
    w[h][i]=w[2][i];
  }
  for(i=1;i<23;i++)
    for(j=1;j<23;j++){
      t=-w[i][j];
      for(int s:q)
        for(int d:q)
          t+=w[i+s][j+d];        
      b[i][j]=w[i][j]>0&(t<2|t>3)?0:t==3?1:b[i][j];  
  }
  a();
}
}
void keyPressed(){
  t=0;
}
void mousePressed(){
  int i=mouseX/5+2,j=mouseY/5+2;
  w[i][j]=b[i][j]=1;
  a();
}
void a(){
  for(i=0;i<h-2;i++)
    for(j=0;j<h-2;j++)
      if(w[i+2][j+2]==1)
        rect(i*5,j*5,5,5);
  }  

3

Matlab (152)

b=uint8(rand(20)<0.2)
s=@(m)imfilter(m,[1 1 1;1 0 1;1 1 1],'circular')
p=@(m,n)uint8((n==3)|(m&(n==2)))
while 1
imshow(b)
drawnow
b=p(b,s(b))
end

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:

%% initialize
Bsize = 20;
nsteps = 100;
board = uint8(rand(Bsize)<0.2); % fill 20% of the board
boardsum = @(im) imfilter(im,[1 1 1; 1 0 1; 1 1 1], 'circular');
step = @(im, sumim) uint8((sumim==3) | (im & (sumim==2)) );

%% run
for i = 1:nsteps
    imshow(kron(board,uint8(ones(4))), [])
    drawnow
    ss(p,i) = sum(board(:));
    board = step(board, boardsum(board));
end
  • Boardsize ist fest codiert, kann aber alles sein
  • umschlingt
  • Für Benutzereingaben kann die Anfangskarte entweder durch Hardcodierung einer anderen Matrix oder mit dem Variableneditor geändert werden. Nicht schön, aber es funktioniert
  • 20 Zeichen können gespeichert werden, wenn die grafische Ausgabe übersprungen wird. Die Tafel wird bei jeder Iteration weiterhin als Text gedruckt. Ein-Pixel-Zellen, die sich jede Millisekunde ändern, sind sowieso nicht sehr nützlich

Funktioniert in R2014a, gerade getestet
masterX244 06.10.14

3

Perl, 218 216 211 202 Bytes

$,=$/;$~=AX3AAAx76;$b=pack('(A79)23',<>)x6;{print unpack'(a79)23a0',$b;select$v,$v,$v,0.1;$b=pack'(A)*',unpack'((x7a/(x13)X4Ax!18)1817@0)4',pack'((a*)17xx!18)*',unpack"x1737(AA$~Ax$~AA$~@)2222",$b;redo}

(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:

                                  1
                                1 1
                      11      11            11
                     1   1    11            11
          11        1     1   11
          11        1   1 11    1 1
                    1     1       1
                     1   1
                      11









                                         11
                                         1
                                          111
                                            1

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:

$,=$/;$/=AX3AAAx76;$b=pack("(A)*",map{rand 3<1}0..1816)x6;{print unpack'(a79)23a0',$b;select$v,$v,$v,0.1;$b=pack'(A)*',unpack'((x7a/(x13)X4Ax!18)1817@0)4',pack'((a*)17xx!18)*',unpack"x1737(AA$/Ax$/AA$/@)2222",$b;redo}

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.

Die Platine wird in $bForm einer Reihe gespeichert '1'und ' 'für jede Zelle wird nur das Ganze mindestens dreimal wiederholt. Der dritte Aufruf zum Entpacken extrahiert 17 Werte für jede Zelle: Es gibt einen für die Zelle selbst und zwei für jede der acht benachbarten Zellen in einer willkürlichen Reihenfolge, und jeder Wert ist'1' oder eine leere Zeichenfolge. Die Zelle sollte in der nächsten Iteration aktiv sein, wenn die Anzahl der '1'Werte unter diesen 17 Werten 5, 6 oder 7 beträgt. Der dritte Paketaufruf verknüpft diese 17 Werte zu einem 18 Zeichen breiten Feld, das links ausgerichtet und rechts mit nul Bytes aufgefüllt ist . Der zweite Aufruf zum Entpacken nimmt ein solches 18-faches Feld in Anspruch, löst das Zeichen an Position 7 aus und entpackt das Leerzeichen an Position 17, wenn es ein ist'1', oder entpackt das Zeichen von Position 4 ansonsten. Dieses Ergebnis ist genau der Wert, den die Zelle in der nächsten Generation haben sollte.


2

Python, 589 Bytes

Maustasten: links - Zelle setzen, rechts - Zelle entfernen, Mitte - Start / Stopp.

von Tkinter import *
Kopie importieren
z = Bereich
F = 50
T = Tk ()
S = 9
f = [F * [0] für i in'7 '* F]
c = Canvas (T, Breite = S * F, Höhe = S * F)
c.pack ()
def p (x, y, a): f [y] [x] = f [y] [x] oder c.create_oval (x · S, y · S, x · S + S, y · S + S) if a else c.delete (f [y] [x])
r = 1
def R (e): globales r; r = 1-r
exec ("c.bind ('<Button-% i>', Lambda e: p (ex / S, ey / S,% i));" * 2% (1,1,3,0))
c.bind ('<Button-2>', R)
def L ():
 T.after (99, L)
 if r: return
 g = copy.deepcopy (f)
 für y in z (F):
	für x in z (F):
	 n = 8
	 für j in z (-1,2):
		für i in z (-1,2):
		 wenn i oder j: n- = nicht g [(y + j)% F] [(x + i)% F]
	 wenn 1 <n <4:
		wenn n == 3und nicht g [y] [x]: p (x, y, 1)
	 sonst: p (x, y, 0)
L ()
T.mainloop ()

Und hier ist eine Version, in der Sie die Maus zum Zeichnen ziehen können. Grafiken sind etwas angenehmer.

from Tkinter import*
import copy
z=range
F=50
T=Tk()
S=9
f=[F*[0]for i in'7'*F]
c=Canvas(T,bg='white',width=S*F,height=S*F)
c.pack()
def p(x,y,a):f[y][x]=f[y][x]or c.create_rectangle(x*S,y*S,x*S+S,y*S+S,fill='gray')if a else c.delete(f[y][x])
r=1
def R(e):global r;r=1-r
exec("c.bind('<Button-%i>',lambda e:p(e.x/S,e.y/S,%i));c.bind('<B%i-Motion>',lambda e:p(e.x/S,e.y/S,%i));"*2%(1,1,1,1,3,0,3,0))
c.bind('<Button-2>',R)
def L():
 T.after(99,L)
 if r:return
 g=copy.deepcopy(f)
 for y in z(F):
  for x in z(F):
   n=8
   for j in z(-1,2):
    for i in z(-1,2):
     if i or j:n-=not g[(y+j)%F][(x+i)%F]
   if 1<n<4:
    if n==3and not g[y][x]:p(x,y,1)
   else:p(x,y,0)
L()
T.mainloop()

Dies folgt nicht den Lebensregeln.
Steven Rumbalski

1
@StevenRumbalski: Oh, wirklich?
Oleh Prypin

2
Ja wirklich. In Ihrer zweiten Version ist ein Einrückungsfehler aufgetreten. Der Abschnitt, der mit beginnt, if 1<n<4:sollte auf derselben Ebene eingerückt sein wiefor j in z(-1,2):
Steven Rumbalski

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

import time,itertools as w,sys;t,q=map(lambda x:list(x[:-1]),sys.stdin.readlines()),list(w.product(range(-1,2),range(-1,2)));del q[4];n=map(lambda x:x[:],t[:])
while time.sleep(0.1)==None:
 for j in range(1,len(t)-1):
  for i in range(1,len(t[j])-1):x=sum(map(lambda s:1 if t[j+s[0]][i+s[1]]in'@'else 0,q));f=t[j][i];n[j][i]='@'if(f=='@'and(x==3 or x==2))or(f==' 'and x==3)else' '
 t=map(lambda x:x[:],n[:]);print'\n'.join(list(map(lambda x:''.join(x),t)))

Input.txt (beachten Sie das zusätzliche Leerzeichen in der letzten Zeile)

+----------------------------------------+
|                    @                   |
|                     @                  |
|                   @@@                  |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
+----------------------------------------+ 

Wie man läuft

python Golf.py < input.txt

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
CalculatorFeline

^ Du hast eins vergessen, 1 if=> 1if.
Zacharý

2

wird bearbeitet 270,261 249 Bytes

Das Raster entspricht 100 * 100 Pixel des Bildschirms. Die Eingabe erfolgt in Form eines PNG-Bilds

void setup(){image(loadImage("g.png"),0,0);}void draw(){loadPixels();int n,i=0,j,l=10000;int[]a=new int[l],p=pixels;for(;i<l;a[i]=n==5?-1<<24:n==6?p[i]:-1,i++)for(j=n=0;j<9;j++)n+=j!=4?p[(i+l-1+j%3+100*(j/3-1))%l]&1:0;arrayCopy(a,p);updatePixels();}

Ungolfed

void setup() {
  image(loadImage("g.png"), 0, 0);
}
void draw() {
  loadPixels();
  int c=100, i=0, n, l=c*c, b=color(0);
  int[]a=new int[l], p=pixels;
  for (; i<l; i++) {
    n=p[(i+l-101)%l]&1;
    n+=p[(i+l-100)%l]&1;
    n+=p[(i+l-99)%l]&1;
    n+=p[(i+l-1)%l]&1;
    n+=p[(i+1)%l]&1;
    n+=p[(i+99)%l]&1;
    n+=p[(i+100)%l]&1;
    n+=p[(i+101)%l]&1;
    a[i]=n==5?b:p[i]==b&&n==6?b:-1;
  }
  arrayCopy(a, pixels, l);
  updatePixels();
}

Bildschirmfoto


2

Lua + LÖVE / Love2D , 653 Bytes

l=love f=math.floor t={}s=25 w=20 S=1 for i=1,w do t[i]={}for j=1,w do t[i][j]=0 end end e=0 F=function(f)loadstring("for i=1,#t do for j=1,#t[i]do "..f.." end end")()end function l.update(d)if S>0 then return end e=e+d if e>.2 then e=0 F("c=0 for a=-1,1 do for b=-1,1 do if not(a==0 and b==0)then c=c+(t[((i+a-1)%w)+1][((j+b-1)%w)+1]>0 and 1 or 0)end end end g=t[i][j]t[i][j]=(c==3 or(c==2 and g==1))and(g==1 and 5 or-1)or(g==1 and 4 or 0)")F("t[i][j]=t[i][j]%2")end end function l.draw()F("l.graphics.rectangle(t[i][j]==1 and'fill'or'line',i*s,j*s,s,s)")end function l.mousepressed(x,y)S=0 o,p=f(x/s),f(y/s)if t[o]and t[o][p]then t[o][p]=1 S=1 end end

oder beabstandet:

l=love
f=math.floor
t={}s=25
w=20
S=1
for i=1,w do
    t[i]={}
    for j=1,w do
        t[i][j]=0
    end
end
e=0
F=function(f)
    loadstring("for i=1,#t do for j=1,#t[i] do  "..f.." end end")()
end
function l.update(d)
    if S>0 then
        return
    end
    e=e+d
    if e>.2 then
        e=0
        F([[
        c=0
        for a=-1,1 do
            for b=-1,1 do
                if not(a==0 and b==0)then
                    c=c+(t[((i+a-1)%w)+1][((j+b-1)%w)+1]>0 and 1 or 0)
                end
            end
        end
        g=t[i][j]
        t[i][j]=(c==3 or(c==2 and g==1))and(g==1 and 5 or-1) or (g==1 and 4 or 0)]])
        F("t[i][j]=t[i][j]%2")
    end
end
function l.draw()
    F("l.graphics.rectangle(t[i][j]==1 and'fill'or'line',i*s,j*s,s,s)") end
function l.mousepressed(x,y)
    S=0
    o,p=f(x/s),f(y/s)
    if t[o]and t[o][p] then
        t[o][p]=1
        S=1
    end
end

Klicken Sie auf das Feld, um lebende Zellen hinzuzufügen. Klicken Sie außerhalb des Feldes, um es auszuführen.

Probieren Sie es online!

Bildbeschreibung hier eingeben


1

Nachsatz 529 515

Begonnen 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.

[/f ARGUMENTS 0 get(r)file/n 20>>begin[/m
n 1 sub/b[n{[n{f token pop}repeat]}repeat]/c 400
n div/F{dup 0 lt{n add}if dup n ge{n sub}if}>>begin{0
1 m{dup 0 1 m{2 copy b exch get exch get 1 xor setgray
c mul exch c mul c c rectfill dup}for pop pop}for
showpage/b[0 1 m{/x exch def[0 1 m{/y exch def 0
y 1 sub 1 y 1 add{F dup x 1 sub 1 x
1 add{F b exch get exch get 3 2 roll add exch
dup}for pop pop}for b x get y get sub b x get y get
0 eq{3 eq{1}{0}ifelse}{dup 2 eq exch 3 eq
or{1}{0}ifelse}ifelse}for]}for]def}loop

Mit ein paar Stapelkommentaren (genau die, die ich gebraucht habe).

[
/f ARGUMENTS 0 get(r)file
/n 20
/sz 400
%/r{rand 2147483647 div}
>>begin
[
/m n 1 sub
/b[
%n{[n{r .15 le{1}{0}ifelse}repeat]}repeat
 n{[n{f token pop}repeat]}repeat
]
/c sz n div
/F{dup 0 lt{n add}if dup n ge{n sub}if}
>>begin
{
    0 1 m{dup % y y
    0 1 m{ % y y x
        2 copy b exch get exch get 1 xor setgray
        c mul exch c mul c c rectfill
        dup 
    }for pop pop}for
    pstack
    showpage
    /b[0 1 m{/x exch def
      [0 1 m{/y exch def
          0   
          y 1 sub 1 y 1 add{F dup %s y y
          x 1 sub 1 x 1 add{F %s y y x
              b exch get exch get %s y bxy
              3 2 roll add exch %s+bxy y
              dup %s y y
          }for pop pop}for
          b x get y get sub
          b x get y get
          0 eq{3 eq{1}{0}ifelse}{dup 2 eq exch 3 eq or{1}{0}ifelse}ifelse
      }for]
      }for]def
}loop

Pulsardatendatei:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

1

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 ...;)


1

Oktave (153)

das gleiche wie Matlab von DenDenDo beim kürzesten Spiel des Lebens , musste jedoch imshow auf imagesc ändern:

b=uint8(rand(20)<0.2)
s=@(m)imfilter(m,[1 1 1;1 0 1;1 1 1],'circular')
p=@(m,n)uint8((n==3)|(m&(n==2)))
while 1
imagesc(b)
drawnow
b=p(b,s(b))
end

1

Python 2: 334 Bytes

Nur 6 Jahre zu spät.

import time
s='';s=map(list,iter(raw_input,s));k=len(s);l=(-1,0,1);n=int;z=range
while 1:
 r=[[0]*k for i in z(k)]
 for i in z(k*k):
  a,b=i//k,i%k
  m,g=sum([n(s[(a+c)%k][(b+d)%k])for c in l for d in l if c|d]),n(s[a][b])
  r[a][b]=n((m==2)&g or m==3)
  print'*'if r[a][b]else' ',
  if b-k+1==0:print
 s=r;time.sleep(.2);print"\033c"

Sie können es wie folgt ausführen:

python gol.py
0000000
0001000
0000100
0011100
0000000
0000000
0000000

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.


0

PHP, 201 Bytes (nicht getestet)

for($s=file(f);print"\n";$s=$t)foreach($s as$y=>$r)for($x=-print"
";"
"<$c=$s[$y][++$x];print$t[$y][$x]=" X"[$n<4&$n>2-$a])for($n=-$a=$c>A,$i=$x-!!$x-1;$i++<=$x;)for($k=$y-2;$k++<=$y;)$n+=$s[$k][$i]>A;

Laufen Sie mit -nr.

Nervenzusammenbruch

for($s=file(f);                         # import input from file "f"
    print"\n";                              # infinite loop: 1. print newline
    $s=$t)                                  # 3. copy target to source, next iteration
    foreach($s as$y=>$r)                    # 2. loop through lines
        for($x=-print"\n";"\n"<$c=$s[$y][++$x]; # print newline, loop $x/$c through line characters (before line break)
            print                                   # 5. print new cell
                $t[$y][$x]=" X"[$n>2-$a&$n<4])      # 4. new cell is alive if neighbour count<4 and >2 (>1 if alive)
            for($n=-                                # 2. init neighbour count: exclude self
                $a=$c>A,                            # 1. $a=cell is alife
                $i=$x-!!$x-1;$i++<=$x;)             # 3. loop $i from one left to one right of current position
                for($k=$y-2;$k++<=$y;)                  # loop $k from one above to one below current position
                    $n+=$s[$k][$i]>A;                       # increase neighbor count if neighbour is alife
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.