Hayat renkli olabilir!


30

Yaşam benzeri hücresel otomatlardaki her bir hücrenin, onu sadece canlı ya da ölü olabileceğinden temsil etmesi için bir bit yeterlidir. Bu sadece iki renk olduğu anlamına gelir; oldukça sıkıcı.

Normal görüntülerin piksel başına 24 biti vardır (RGB'nin her birinde 8). Bu, normal görüntüde pikseller gibi normal bir görüntüde, aynı anda 24 hayat tarzı oyunu simüle edebileceğiniz anlamına gelir!

Meydan okuma

Göreviniz, canlı benzeri bir hücresel otomatın bir neslin kurallarını 24-bit derinlikli bir görüntüye (istediğiniz herhangi bir iyi formatta) uygulayacak ve ortaya çıkan görüntüyü çıkaran bir program yazmaktır.

24 katmandan her biri, kesinlikle kendi katmanının içinde, aynı yaşam benzeri kural setini kullanacaktır. 24 katman birbiriyle etkileşime girmez.

Ayrıca

  • Sıfırlar ölü hücrelerdir ve olanlar canlı hücrelerdir.
  • Sınır koşulları periyodiktir (torus oluşturur).
  • Herhangi bir görüntü boyutu işe yaramalı.

Giriş çıkış

Programınızın stdin veya komut satırı (veya dilinizin en yakın eşdeğeri) aracılığıyla 3 argüman alması gerekir:

  1. Giriş görüntüsü dosyasının adı.
  2. Yeni hücrelerin ne zaman doğduğunu belirten, 0'dan 8'e kadar olan basamaklardan oluşan bir dize:
    • Haneli Eğer d dizesinde onlar varken daha sonra ölü hücreleri canlanıyor d oturma komşuları.
    • Örnek: 3normaldir Yaşam - Tam olarak 3 yaşayan komşusu olan ölü hücreler canlanır.
  3. Mevcut hücreler hayatta kaldıklarını ifade eden, 0 ila 8 arasındaki rakamların artan sırada bir dizesi:
    • D rakamı dizgede ise, d yaşayan komşuları olan canlı hücreler bir sonraki nesle ulaşırlar, aksi takdirde ölürler.
    • Örnek: 23normaldir Yaşam - Sadece tam olarak 2 veya 3 komşu olan hücreler bir sonraki tura çıkar.

Not Moore mahalle her zaman kullanılır. Hayata benzeyen bir otomatı ve birçok ilginç kural setini tam olarak neyin tanımladığı hakkında daha fazla bilgi için bunu veya bunu okuyun .

1 nesil sonraki çıkış görüntüsü ya out.png(ya bmpda her neyse) olarak görüntülenmeli ya da kaydedilmelidir .

boyun eğme

Bayt cinsinden en kısa kod kazanır.

Sen edilir gerekli en az bir deneme çekimi ve bazı önemsiz olmayan kural seti için üç acil sonraki nesillere dahil etmek. Daha iyi bir şey düşünemiyorsanız avatarınızı ve normal Yaşam kurallarınızı kullanın.

İsterseniz , sadece yaşayan bitlerin yeşil 128 katmanındaki (sadece normal Hayatta çalışacağından emin olduğunuzda) bu Mühürcü Planör Silahını kullanabilirsiniz :

planör tabancası

İlginç diziler veya hatta animasyonlar yayınlamak çok teşvik edilir.


1
Bence bu bir kopya - sadece yeni bölümler başka bir dosya biçiminden okuyor ve katmanları bölüyor - hem basit hem de kendileri için sorun değil.
Howard

1
@Howard Ama görüntüleri görmekle ilgilenmiyor musunuz?

3
Evet. PPCG.SE, eğlenceli ve hoş görüntülerin değil, acı ve ıstırabın olduğu bir yer . Bonus fikri bir zorunluluk haline getirirse, sorunun yeterince orijinal olması gerekir mi?
Ağustos'ta

3
Topluluğun net ilgisi, programların diğer sorulara verilen cevaplardan ufak değişikliklerle kopyalanarak yapıştırılmamasıdır. Bu site, "eğlenceli olabileceğini düşünüyorum, bu yüzden sorun değil" temelinde çalışmaz. Bu 4chan.
Peter Taylor,

4
@Hardard Bunun artık bir kopya olduğunu düşünmüyorum. Elbette codegolf.stackexchange.com/questions/34505/simulate-rule-110 ve codegolf.stackexchange.com/questions/4370/… bir arada bulunabiliyorsa , bu kesinlikle bir yineleme değildir.
Calvin'in Hobileri

Yanıtlar:


16

MATLAB: 275

Denedim parametrelerin Benim favorim 45678, 568yıldızlı parlayan bir gökyüzünde gittikçe bütünleşmenin sonuçları aşağıdaki hangi. Bu görüntü, "hafızanın sürekliliğinin dağılması" tasvir eder.

Ungolfed gif üreten kod (uzantı olmadan PNG kabul eder):

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

Tam bir dosya adı (GIF, JPEG ve belki başka şeyler olabilir) kabul eden ve aşağıdakilere yazılan golf kodu 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')

Daha önce keşfedilen bir gerçek, parametrelerin 12, 1bir Sierpinski halısı benzeri fraktal üretmek için kullanılabileceğidir. İşte her bit rastgele yerleştirilmiş bir tohum noktası olan:


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

Dize istemlerinden (1) doğum kuralları, (2) hayatta kalma kuralları, (3) dosya adından girdi alıyorum ve sonucu Mathematica'da görüntülüyorum.

Bu dosya aslında 24 bit derinliğe sahip olduğu sürece, en popüler formatlarla başa çıkabilmelidir.

İşte biraz ungolfed versiyonu:

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

Rainbolt'in avatarını kullanan iki örnek :

Rainbolt

Standart Yaşam Oyunu kullanılarak 20 kuşak [3,23]:

görüntü tanımını buraya girin

20 kuşak kullanarak [456,34567]:

görüntü tanımını buraya girin

Ve işte ikinci kuralın ilk 200 neslinin bir GIF'i. GIF her üç çerçeveyi atlar çünkü 2MB'nin altına sıkıştırmazdım:

görüntü tanımını buraya girin


2
ne ilginç bir kural
Gurur haskeller

10

Python 2, 427

Mathematica'ya sahip olmayanlar için;)

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

Önce dosya adını, sonra doğum vakasını, sonra hayatta kalma vakasını sorar. Öyleyse normal yaşam kuralları için test.bmp, o zaman 3, sonra girebilirsiniz 23(tırnak işareti veya hiçbir şey gerekli değil).

Renk bitlerine endekslemek ve bunları yeniden birleştirmek için string formatlamayı kullandım, bunun muhtemelen optimal olmadığını düşünüyorum.

Bu oldukça yavaş olduğuna dikkat edin.

Örnek

Yüksek yaşam ve harika sanat karışımı değil mi? (Kural 36/ 23)

Mona Lisa Original nesil 1 Orijinal / Nesil 1

2. nesil nesil 3 2. Nesil / 3. Nesil


6

Java, 1085 bayt

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

Örnekler (kural 368/245):

Gen 0:

görüntü tanımını buraya girin

Gen 1:

görüntü tanımını buraya girin

Gen 2:

görüntü tanımını buraya girin

Gen 3:

görüntü tanımını buraya girin

Gen 4:

görüntü tanımını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.