Das Leben kann bunt sein!


30

Jede Zelle in einem lebensechten Zellularautomaten benötigt nur ein Bit, um sie darzustellen, da sie nur lebendig oder tot sein kann. Das heißt, es gibt nur zwei Farben; ziemlich langweilig.

Normale Bilder haben 24 Bit pro Pixel (jeweils 8 in RGB). Dies bedeutet, dass Sie in einem normalen Bild mit Pixeln als Zellen 24 lebensechte Spiele gleichzeitig simulieren können!

Herausforderung

Ihre Aufgabe ist es, ein Programm zu schreiben, das eine Generation der Regeln eines lebensechten Zellularautomaten auf ein 24-Bit-Tiefenbild (in jedem bekannten Format, das Sie mögen) anwendet, und das resultierende Bild auszugeben.

Jede der 24 Ebenen verwendet denselben lebensechten Regelsatz, ausschließlich innerhalb ihrer eigenen Ebene. Die 24 Schichten interagieren nicht miteinander.

Ebenfalls

  • Nullen sind tote Zellen und diejenigen sind lebende Zellen.
  • Die Randbedingungen sind periodisch (Bildung eines Torus).
  • Alle Bildabmessungen sollten funktionieren.

Input-Output

Ihr Programm muss 3 Argumente über die Standardeingabe oder die Befehlszeile (oder die nächste Entsprechung Ihrer Sprache) aufnehmen:

  1. Der Name der Eingabebilddatei.
  2. Eine Zeichenfolge mit den Ziffern 0 bis 8 in aufsteigender Reihenfolge, die angibt, wann neue Zellen geboren werden:
    • Wenn die Ziffer d in der Zeichenfolge ist dann kommen toten Zellen am Leben , wenn sie d lebende Nachbarn.
    • Beispiel: 3ist normales Leben - Tote Zellen mit genau 3 lebenden Nachbarn werden lebendig.
  3. Eine Zeichenfolge mit den Ziffern 0 bis 8 in aufsteigender Reihenfolge, die angibt, wann vorhandene Zellen überleben:
    • Befindet sich die Ziffer d in der Zeichenkette, überleben lebende Zellen mit d lebenden Nachbarn bis zur nächsten Generation, andernfalls sterben sie.
    • Beispiel: 23ist normal Leben - Nur Zellen mit genau 2 oder 3 Nachbarn überleben die nächste Runde.

Beachten Sie, dass das Viertel Moore immer verwendet wird. Lesen Sie diese oder diese für weitere Informationen darüber , was genau einen getreuen Automaten definiert und viele interessanten rulesets.

Das Ausgabebild der ersten Generation sollte entweder angezeigt oder als out.png( bmpoder was auch immer) gespeichert werden .

Einreichung

Der kürzeste Code in Bytes gewinnt.

Sie sind erforderlich , mindestens ein Testbild und seine drei unmittelbaren nachfolgenden Generationen für einige nicht-triviale ruleset aufzunehmen. Verwenden Sie Ihren Avatar und die normalen Lebensregeln, wenn Sie sich nichts Besseres vorstellen können.

Wenn Sie möchten, können Sie diese Gosper Glider Gun verwenden, bei der sich die einzigen lebenden Teile in der grünen 128-Schicht befinden (dies funktioniert nur im normalen Leben):

Segelfluggewehr

Das Posten von interessanten Sequenzen oder sogar Animationen ist ausdrücklich erwünscht.


1
Ich denke, es ist ein Duplikat - die einzigen neuen Teile sind das Einlesen aus einem anderen Dateiformat und das Aufteilen der Ebenen - beide sind grundlegend und für sich genommen keine Herausforderung.
Howard

1
@ Howard Aber bist du nicht daran interessiert, die Bilder zu sehen?

3
Ja. PPCG.SE ist ein Ort des Schmerzes und der Qual, kein Spaß und schöne Bilder . Wenn er die Bonusidee zur Bedingung macht, muss die Frage doch originell genug sein?
Flonk

3
Das klare Interesse der Community besteht darin, dass Programme nicht mit geringfügigen Änderungen von den Antworten auf andere Fragen kopiert werden. Diese Seite funktioniert nicht auf der Grundlage von "Ich denke, es könnte Spaß machen, also ist es in Ordnung". Das ist 4chan.
Peter Taylor

4
@Howard Ich glaube nicht, dass dies mehr als Duplikat gilt. Wenn codegolf.stackexchange.com/questions/34505/simulate-rule-110 und codegolf.stackexchange.com/questions/4370/… koexistieren können, ist dies sicherlich kein Duplikat.
Calvins Hobbys

Antworten:


16

MATLAB: 275

Mein Favorit unter den Parametern, die ich ausprobiert habe, ist 45678, 568dass nach einer allmählichen Auflösung ein Himmel aus funkelnden Sternen entsteht. Dieses Bild zeigt "die Auflösung der Beständigkeit des Gedächtnisses".

Ungolfed GIF-produzierender Code (akzeptiert PNG ohne Erweiterung):

B = input('B', 's') - 48;
S = input('S', 's') - 48;
f0 = input('file: ', 's');
frames = 60;

f = sprintf('%s.png',f0);
fout = sprintf('%s.gif',f0);
first = 1;
img = imread(f);
for i = 1:60
    out = img * 0;
    [r, c, turd] = size(img);
    for b=0:7
        bimg = ~~bitand(img,2^b);
        pimg = [bimg,bimg,bimg;bimg,bimg,bimg;bimg,bimg,bimg];
        fun = @(ro,co) pimg(r+ro:r+r+ro-1,c+co:c+c+co-1,:);
        sum = fun(0,0)+fun(0,1)+fun(0,2)+fun(1,0)+fun(1,2)+fun(2,0)+fun(2,1)+fun(2,2);
        bnew = uint8(bimg & ismember(sum,S) | ~bimg & ismember(sum, B));
        out = out + 2^b * bnew;
    end
    %imwrite(out,'out.png');
       if first
           [img1,img2] = rgb2ind(img,256);
           imwrite(img1,img2,fout,'gif','Loop',Inf);
          imwrite(img1,img2,fout,'gif','WriteMode','append');
           first = 0;
       end
       img = out;
       [img1,img2] = rgb2ind(img,256);
       imwrite(img1,img2,fout,'gif','WriteMode','append');%,'DelayTime', 2*delay);
end

Golfed Code, der einen vollständigen Dateinamen akzeptiert (der aus GIF, JPEG und anderen Elementen bestehen kann) und in out.pngfolgende Felder schreibt :

I=@()input('','s');B=I();S=I();i=imread(I());o=0;[r,c,t]=size(i);for b=0:7
g=~~bitand(i,2^b);p=repmat(g,3);F=@(z,Z)p(r+z:r+r+z-1,c+Z:c+c+Z-1,:);M=@(A)ismember(F(0,0)+F(0,1)+F(0,2)+F(1,0)+F(1,2)+F(2,0)+F(2,1)+F(2,2),A-48);o=o+2^b*uint8(g&M(S)|~g&M(B));end
imwrite(o,'out.png')

Eine zuvor entdeckte Tatsache ist , dass Parameter 12, 1kann eine Sierpinski teppichartige Fraktal zu erzeugen , verwendet werden. Hier ist eine mit einem zufällig platzierten Startpunkt in jedem Bit:


14

Mathematica, 359

i=InputString;f=Transpose;b=(p=FromDigits/@Characters@#&)@i[];s=p@i[];Map[FromDigits[#,2]&/@#~ArrayReshape~{3,8}&,f[(g=#;{#,Total[g~RotateRight~#&/@Drop[Join@@Table[{i,j},{i,-1,1},{j,-1,1}],{5}],1]}~f~{3,1,2}/.{l_,n_}:>Boole[l<1&&!b~FreeQ~n||l>0&&!s~FreeQ~n])&/@Apply[Join,IntegerDigits[ImageData[Import@i[],y="byte"],2,8],{2}]~f~{2,3,1},{3,1,2}],{2}]~Image~y

Ich nehme Eingaben von Eingabeaufforderungen in der Reihenfolge (1) Geburtsregeln, (2) Überlebensregeln, (3) Dateinamen entgegen und zeige das Ergebnis direkt in Mathematica an.

Dies sollte mit den meisten gängigen Formaten kompatibel sein, sofern die Datei tatsächlich eine Tiefe von 24 Bit hat.

Hier ist eine etwas ungolfed Version:

i = InputString;
f = Transpose;
b = (p = FromDigits /@ Characters@# &)@i[];
s = p@i[];
Map[
  FromDigits[#,2] & /@ #~ArrayReshape~{3, 8} &,
  f[
   (
      g = #;
      {#, 
         Total[g~RotateRight~# & /@ 
           Drop[Join @@ Table[{i, j}, {i, -1, 1}, {j, -1, 1}], {5}], 
          1]}~f~{3, 1, 2} /. {l_, n_} :> 
        Boole[l < 1 && ! b~FreeQ~n || l > 0 && ! s~FreeQ~n]
      ) & /@ 
    Apply[Join, 
      IntegerDigits[ImageData[Import@i[], y = "byte"], 2, 8], {2}]~
     f~{2, 3, 1},
   {3, 1, 2}
   ],
  {2}
  ]~Image~y

Hier sind zwei Beispiele mit Rainbolts Avatar:

Regenblitz

20 Generationen mit dem Standard Game of Life [3,23]:

Bildbeschreibung hier eingeben

20 Generationen mit [456,34567]:

Bildbeschreibung hier eingeben

Und hier ist ein GIF der ersten 200 Generationen der letzteren Regel. Das GIF überspringt jeden dritten Frame, da ich ihn sonst nicht unter 2 MB komprimieren könnte:

Bildbeschreibung hier eingeben


2
Was für eine interessante Regel
stolzer Haskeller

10

Python 2, 427

Für diejenigen, die kein Mathematica haben;)

import Image as I
t=raw_input
r=range
A=I.open(t())
G=map(int,t())
S=map(int,t())
w,h=A.size
B=I.new('RGB',(w,h))
A=[[map(int,("{:08b}"*3).format(*A.load()[x,y]))for y in r(h)]for x in r(w)]
for x in r(w):
 for y in r(h):
  p=''
  for i in r(24):
    c=A[x][y][i]
    n=sum(A[(x+k-1)%w][(y+j-1)%h][i]for j in r(3)for k in r(3))-c
    p+=str(~~[n in G,n in S][c])
  B.load()[x,y]=tuple(int(p[i*8:i*8+8],2)for i in r(3))
B.save('out.bmp')

Es fordert zur Eingabe des Dateinamens auf, dann der Geburtsfälle und dann der Überlebensfälle. Also für das normale Leben Regeln , die Sie könnten Eingang test.bmp, dann 3, dann 23(ohne Anführungszeichen oder etwas brauchten).

Ich habe Zeichenfolgenformatierung verwendet, um die Farbbits zu indizieren und neu zu kombinieren, obwohl ich befürchte, dass dies wahrscheinlich nicht optimal ist.

Beachten Sie, dass es ziemlich langsam ist.

Beispiel

Hoher Lebensstandard und großartiger Kunstmix, oder? (Regel 36/ 23.)

Mona Lisa Original Generation 1 Original / Generation 1

Generation 2 Generation 3 Generation 2 / Generation 3


6

Java, 1085 Bytes

import java.awt.image.*;import java.io.*;import javax.imageio.*;class F{static int n(boolean[][][]a,int x,int y,int z){int k=0;for(X=Math.max(x-1,0);X<Math.min(x+2,w);X++)for(Y=Math.max(y-1,0);Y<Math.min(y+2,h);Y++)if(a[X][Y][z])k++;return k-(a[x][y][z]?1:0);}static int p(String k){return Integer.parseInt(k,2);}static int w,h,x,y,z,X,Y;public static void main(String[]a)throws Exception{BufferedImage i=ImageIO.read(new File(a[0]));w=i.getWidth();h=i.getHeight();boolean[][][]G=new boolean[w][h][24];for(x=0;x<w;x++)for(y=0;y<h;y++){String k="".format("%24s",Integer.toBinaryString(0xFFFFFF&i.getRGB(x,y)));for(z=0;z<24;z++){G[x][y][z]=k.charAt(z)>48;}}for(x=0;x<w;x++)for(y=0;y<h;y++){String r="",g="",b="",k;for(z=0;z<8;){k=""+n(G,x,y,z);r+=(-1!=(G[x][y][z++]?a[1].indexOf(k):a[2].indexOf(k)))?1:0;}for(;z<16;){k=""+n(G,x,y,z);g+=(-1!=(G[x][y][z++]?a[1].indexOf(k):a[2].indexOf(k)))?1:0;}for(;z<24;){k=""+n(G,x,y,z);b+=(-1!=(G[x][y][z++]?a[1].indexOf(k):a[2].indexOf(k)))?1:0;}i.setRGB(x,y,new java.awt.Color(p(r),p(g),p(b)).getRGB());}ImageIO.write(i,"png",new File("out.png"));}}

Beispiele (Regel 368/245):

Gen 0:

Bildbeschreibung hier eingeben

Gen 1:

Bildbeschreibung hier eingeben

Gen 2:

Bildbeschreibung hier eingeben

Gen 3:

Bildbeschreibung hier eingeben

Gen 4:

Bildbeschreibung hier eingeben

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.