Hidup bisa penuh warna!

30

Setiap sel dalam otomat seluler seperti hidup hanya membutuhkan satu bit untuk mewakilinya karena hanya bisa hidup atau mati. Itu berarti hanya ada dua warna; membosankan.

Gambar normal memiliki 24 bit per piksel (8 di masing-masing RGB). Ini berarti dalam gambar normal dengan piksel sebagai sel Anda bisa mensimulasikan 24 game seperti hidup sekaligus!

Tantangan

Tugas Anda adalah menulis sebuah program yang akan menerapkan satu generasi aturan otomat seluler yang mirip dengan gambar kedalaman 24-bit (dalam format apa pun yang Anda suka), dan menampilkan gambar yang dihasilkan.

Masing-masing dari 24 lapisan akan menggunakan seperangkat aturan hidup yang sama, ketat di dalam lapisan itu sendiri. 24 lapisan tidak saling berinteraksi.

Juga

  • Nol adalah sel mati dan sel hidup.
  • Kondisi batas bersifat periodik (membentuk torus).
  • Setiap dimensi gambar harus bekerja.

Input output

Program Anda perlu mempertimbangkan 3 argumen, melalui stdin atau baris perintah (atau padanan terdekat bahasa Anda):

  1. Nama file gambar input.
  2. String digit 0 hingga 8 dalam urutan yang meningkat yang menunjukkan kapan sel baru dilahirkan:
    • Jika digit d adalah dalam string maka sel-sel mati menjadi hidup ketika mereka memiliki d tetangga hidup.
    • Contoh: 3adalah Kehidupan normal - Sel-sel mati dengan 3 tetangga yang hidup menjadi hidup.
  3. String digit 0 hingga 8 dalam urutan yang meningkat yang menunjukkan kapan sel yang ada bertahan:
    • Jika digit d adalah dalam string maka sel-sel hidup dengan d tetangga hidup bertahan hidup ke generasi berikutnya, jika tidak mereka mati.
    • Contoh: 23adalah Kehidupan normal - Hanya sel dengan tepat 2 atau 3 tetangga yang bertahan ke babak berikutnya.

Perhatikan bahwa lingkungan Moore selalu digunakan. Baca ini atau ini untuk info lebih lanjut tentang apa yang secara tepat mendefinisikan otomat seperti kehidupan dan banyak aturan yang menarik.

Gambar keluaran 1-generasi-nanti harus ditampilkan atau disimpan sebagai out.png( bmpatau apa pun).

pengajuan

Kode terpendek dalam byte menang.

Anda harus menyertakan setidaknya satu gambar uji dan tiga generasi berikutnya untuk beberapa aturan non-sepele. Gunakan avatar Anda dan aturan Hidup normal jika Anda tidak dapat memikirkan hal lain yang lebih baik.

Jika Anda suka, Anda dapat menggunakan Gosper Glider Gun ini di mana satu-satunya bit yang hidup berada di lapisan 128 hijau (itu pasti akan bekerja dalam Kehidupan normal):

pistol glider

Memposting urutan yang menarik atau bahkan animasi sangat dianjurkan.

Gagang pintu
sumber
1
Saya pikir itu adalah duplikat - satu-satunya bagian baru membaca dari format file lain dan memisahkan lapisan - keduanya dasar dan tidak ada tantangan sendiri.
Howard
1
@Howard Tapi apakah Anda tidak tertarik melihat gambar?
3
Ya. PPCG.SE adalah tempat rasa sakit dan penderitaan, bukan gambar yang menyenangkan dan cantik . Jika dia membuat ide bonus sebagai persyaratan, maka tentunya pertanyaannya harus cukup orisinal?
Flonk
3
Minat masyarakat yang jelas adalah bahwa program tidak dapat disalin dengan perubahan kecil dari jawaban atas pertanyaan lain. Situs ini tidak beroperasi atas dasar "Saya pikir itu mungkin menyenangkan, jadi tidak apa-apa". Itu 4chan.
Peter Taylor
4
@Howard Saya tidak berpikir ini dianggap sebagai duplikat lagi. Tentunya jika codegolf.stackexchange.com/questions/34505/simulate-rule-110 dan codegolf.stackexchange.com/questions/4370/… dapat hidup berdampingan maka ini bukan duplikat sama sekali.
Calvin Hobbies

Jawaban:

16

MATLAB: 275

Favorit saya dari parameter yang saya coba adalah 45678, 568yang mengikuti disintegrasi bertahap menghasilkan langit bintang yang berkelap-kelip. Gambar ini menggambarkan, "disintegrasi kegigihan ingatan."

Kode penghasil gif yang tidak digabungkan (menerima PNG tanpa ekstensi):

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

Kode golf yang menerima nama file lengkap (yang bisa berupa GIF, JPEG, dan mungkin hal-hal lain) dan menulis ke out.png:

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

Fakta yang ditemukan sebelumnya adalah bahwa parameter 12, 1dapat digunakan untuk menghasilkan fraktal seperti karpet Sierpinski. Berikut ini adalah satu dengan titik benih ditempatkan secara acak di setiap bit:

feersum
sumber
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

Saya mengambil input dari string prompt dalam urutan (1) aturan kelahiran, (2) aturan bertahan hidup, (3) nama file, dan saya menampilkan hasilnya tepat di Mathematica.

Ini harus dapat menangani sebagian besar format populer, selama file tersebut sebenarnya memiliki kedalaman 24-bit.

Berikut ini adalah versi yang agak tidak dikoleksi:

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

Berikut adalah dua contoh menggunakan avatar Rainbolt :

Rainbolt

20 generasi menggunakan Game of Life standar [3,23]:

masukkan deskripsi gambar di sini

20 generasi menggunakan [456,34567]:

masukkan deskripsi gambar di sini

Dan di sini ada GIF dari 200 generasi pertama dari aturan yang terakhir. GIF melewatkan setiap frame ketiga, karena saya tidak bisa memampatkannya di bawah 2MB jika tidak:

masukkan deskripsi gambar di sini

Martin Ender
sumber
2
aturan yang menarik
haskeller yang bangga
10

Python 2, 427

Bagi mereka yang tidak memiliki Mathematica;)

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

Itu meminta nama file, maka kasus kelahiran, kemudian kasus kelangsungan hidup. Jadi untuk aturan kehidupan normal, Anda dapat memasukkan test.bmp, lalu 3, kemudian 23(tidak ada kutipan atau apapun yang diperlukan)

Saya menggunakan pemformatan string untuk mengindeks dan menggabungkan kembali bit warna, meskipun saya khawatir itu mungkin tidak optimal.

Perhatikan bahwa ini sangat lambat.

Contoh

Kehidupan tinggi dan campuran seni yang hebat bukan? (Aturan 36/ 23.)

Mona Lisa Asli generasi 1 Asli / Generasi 1

generasi 2 generasi 3 Generasi 2 / Generasi 3

Hobi Calvin
sumber
6

Java, 1085 byte

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"));}}

Contoh (aturan 368/245):

Kejadian 0:

masukkan deskripsi gambar di sini

Kejadian 1:

masukkan deskripsi gambar di sini

Kejadian 2:

masukkan deskripsi gambar di sini

Gen 3:

masukkan deskripsi gambar di sini

Kejadian 4:

masukkan deskripsi gambar di sini

SuperJedi224
sumber