ชีวิตอาจมีสีสัน!


30

แต่ละเซลล์ในหุ่นยนต์เซลลูล่าร์ที่มีชีวิตเหมือนต้องการเพียงหนึ่งบิตในการเป็นตัวแทนเพราะมันจะมีชีวิตอยู่หรือตายไปเท่านั้น นั่นหมายความว่ามีเพียงสองสี; ค่อนข้างน่าเบื่อ.

ภาพปกติมี 24 บิตต่อพิกเซล (8 ในแต่ละ RGB) ซึ่งหมายความว่าในภาพปกติที่มีพิกเซลเป็นเซลล์คุณสามารถจำลองเกมเหมือนชีวิต 24 เกมได้ในครั้งเดียว!

ท้าทาย

งานของคุณคือการเขียนโปรแกรมที่จะใช้กฎหนึ่งรุ่นของหุ่นยนต์เซลลูล่าร์ที่เหมือนสิ่งมีชีวิตกับภาพความลึก 24 บิต (ในรูปแบบที่รู้จักกันดีที่คุณต้องการ) และส่งออกภาพผลลัพธ์

แต่ละเลเยอร์ทั้ง 24 เลเยอร์จะใช้กฏเหมือนเหมือนชีวิตอย่างเคร่งครัดภายในเลเยอร์ของตัวเอง 24 เลเยอร์ไม่โต้ตอบซึ่งกันและกัน

ด้วย

  • ศูนย์คือเซลล์ที่ตายแล้วและเซลล์นั้นเป็นเซลล์ที่มีชีวิต
  • เงื่อนไขขอบเขตเป็นระยะ (ก่อตัวพรู)
  • ขนาดรูปภาพใด ๆ ควรใช้งานได้

Input / Output

โปรแกรมของคุณต้องใช้เวลา 3 ข้อโต้แย้งผ่าน stdin หรือบรรทัดคำสั่ง (หรือภาษาที่ใกล้เคียงที่สุดของคุณ):

  1. ชื่อของไฟล์ภาพอินพุต
  2. สตริงของตัวเลข 0 ถึง 8 ตามลำดับที่เพิ่มขึ้นซึ่งหมายถึงเมื่อเกิดเซลล์ใหม่:
    • ถ้าหลักdอยู่ในสตริงแล้วเซลล์ที่ตายแล้วมามีชีวิตอยู่เมื่อพวกเขามีdเพื่อนบ้านที่อยู่อาศัย
    • ตัวอย่าง: 3เป็นเรื่องปกติของชีวิต - เซลล์ที่ตายแล้วพร้อมกับเพื่อนบ้านที่มีชีวิต 3 คนที่เข้ามาในชีวิต
  3. สตริงของตัวเลข 0 ถึง 8 ในลำดับที่เพิ่มขึ้นซึ่งระบุว่าเมื่อเซลล์ที่มีอยู่รอด:
    • ถ้าหลักdอยู่ในสตริงแล้วเซลล์ที่มีชีวิตกับdเพื่อนบ้านที่อาศัยอยู่รอดในรุ่นต่อไปมิฉะนั้นพวกเขาตาย
    • ตัวอย่าง: 23เป็นชีวิตปกติ - มีเพียงเซลล์ที่มีเพื่อนบ้าน 2 หรือ 3 คนเท่านั้นที่รอดชีวิตในรอบถัดไป

โปรดทราบว่ามีการใช้ย่าน Mooreเสมอ อ่านนี้หรือนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่ได้อย่างแม่นยำกำหนดชีวิตเหมือนหุ่นยนต์และ rulesets ที่น่าสนใจมากมาย

รูปภาพเอาต์พุต 1 เจนเนอเรชั่นภายหลังควรแสดงหรือบันทึกเป็นout.png( bmpหรืออะไรก็ตาม)

ส่ง

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

คุณจะต้องรวมภาพทดสอบอย่างน้อยหนึ่งภาพและอีกสามภาพถัดมาในทันทีสำหรับชุดกฎที่ไม่สำคัญ ใช้รูปประจำตัวของคุณและกฎชีวิตปกติถ้าคุณไม่สามารถคิดอะไรดีขึ้น

หากคุณชอบคุณสามารถใช้Gosper Glider Gunที่มีเพียงบิตเดียวที่มีชีวิตอยู่ในเลเยอร์สีเขียว 128 (แน่นอนว่าจะใช้งานได้ตามปกติ):

ปืนเครื่องร่อน

โพสต์ลำดับที่น่าสนใจหรือภาพเคลื่อนไหวได้รับการสนับสนุนอย่างมาก


1
ฉันคิดว่ามันเป็นสิ่งที่ซ้ำกัน - ส่วนใหม่เท่านั้นที่อ่านจากรูปแบบไฟล์อื่นและแยกเลเยอร์ - ทั้งสองเป็นพื้นฐานและไม่ท้าทายด้วยตัวเอง
โฮเวิร์ด

1
@Howard แต่คุณไม่สนใจที่จะเห็นภาพ?

3
ใช่. PPCG.SE เป็นสถานที่แห่งความเจ็บปวดและความทุกข์ทรมานไม่สนุกและภาพสวย หากเขาทำให้ความต้องการโบนัสเป็นสิ่งที่ต้องการแน่นอนว่าคำถามนั้นต้องเป็นของจริงหรือไม่
Flonk

3
ความสนใจที่ชัดเจนของชุมชนคือไม่ให้คัดลอกโปรแกรมพร้อมการเปลี่ยนแปลงเล็กน้อยจากคำตอบของคำถามอื่น ๆ ไซต์นี้ใช้งานไม่ได้บนพื้นฐานของ "ฉันคิดว่ามันอาจจะสนุกดังนั้นมันก็โอเค" นั่นคือ 4chan
Peter Taylor

4
@Howard ฉันไม่คิดว่ามันจะนับว่าซ้ำกันอีกต่อไป แน่นอนถ้าcodegolf.stackexchange.com/questions/34505/simulate-rule-110และcodegolf.stackexchange.com/questions/4370/…สามารถอยู่ร่วมกันได้นี่ไม่ใช่การซ้ำกันเลย
งานอดิเรกของ Calvin

คำตอบ:


16

MATLAB: 275

ที่ชื่นชอบของพารามิเตอร์ที่ฉันพยายามเป็น45678, 568ซึ่งต่อไปนี้ผลการล่มสลายอย่างค่อยเป็นค่อยไปในท้องฟ้าของแววดาว ภาพนี้แสดงให้เห็นว่า "การแตกสลายของการคงอยู่ของหน่วยความจำ"

โค้ดที่สร้าง gif ที่ไม่ดี (ยอมรับ PNG โดยไม่มีส่วนขยาย):

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 ที่ยอมรับชื่อไฟล์แบบเต็ม (ซึ่งอาจเป็น GIF, JPEG และสิ่งอื่น ๆ ) และเขียนไปที่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')

ค้นพบความจริงก่อนหน้านี้ก็คือว่าพารามิเตอร์12, 1สามารถนำมาใช้ในการสร้าง Sierpinski พรมเหมือนเศษส่วน นี่คือจุดที่มีจุดเมล็ดสุ่มในแต่ละบิต:


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

ฉันกำลังป้อนข้อมูลจากสตริงแจ้งในลำดับ (1) กฎการเกิด (2) กฎการเอาชีวิตรอดชื่อไฟล์ (3) และฉันแสดงผลลัพธ์ใน Mathematica

นี่ควรจะสามารถจัดการกับรูปแบบที่นิยมมากที่สุดตราบใดที่ไฟล์นั้นมีความลึก 24- บิต

นี่เป็นเวอร์ชั่นที่ค่อนข้างไม่อวดดี:

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 :

Rainbolt

20 รุ่นที่ใช้ Game of Life มาตรฐาน[3,23]:

ป้อนคำอธิบายรูปภาพที่นี่

20 รุ่นที่ใช้[456,34567]:

ป้อนคำอธิบายรูปภาพที่นี่

และนี่คือ GIF ของ 200 รุ่นแรกของกฎหลัง GIF ข้ามเฟรมที่สามทุกครั้งเพราะฉันไม่สามารถบีบอัดได้ต่ำกว่า 2MB ไม่เช่นนั้น:

ป้อนคำอธิบายรูปภาพที่นี่


2
สิ่งที่น่าสนใจคือกฎ
ภูมิใจ haskeller

10

Python 2, 427

สำหรับผู้ที่ไม่มี 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')

มันแจ้งให้ชื่อไฟล์จากนั้นกรณีเกิดและกรณีการอยู่รอด ดังนั้นสำหรับกฎชีวิตปกติคุณอาจป้อนข้อมูลtest.bmpจาก3นั้นจึง23(ไม่ต้องใส่เครื่องหมายคำพูดหรืออะไรก็ได้)

ฉันใช้การจัดรูปแบบสตริงเพื่อจัดทำดัชนีและรวบรวมบิตสีใหม่อีกครั้ง แต่ฉันกลัวว่าอาจไม่เหมาะสม

โปรดทราบว่ามันค่อนข้างช้า

ตัวอย่าง

ชีวิตสูงและผสมผสานศิลปะที่ยอดเยี่ยมใช่มั้ย (กฎ36/ 23.)

โมนาลิซ่าออริจินัล รุ่นที่ 1 ต้นฉบับ / รุ่น 1

รุ่นที่ 2 รุ่นที่ 3 รุ่นที่ 2 / รุ่นที่ 3


6

Java, 1,085 ไบต์

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

ตัวอย่าง (กฎ 368/245):

Gen 0:

ป้อนคำอธิบายรูปภาพที่นี่

Gen 1:

ป้อนคำอธิบายรูปภาพที่นี่

Gen 2:

ป้อนคำอธิบายรูปภาพที่นี่

Gen 3:

ป้อนคำอธิบายรูปภาพที่นี่

Gen 4:

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.