Cuộc sống có thể đầy màu sắc!


30

Mỗi tế bào trong một máy tự động di động giống như cuộc sống chỉ cần một bit để thể hiện nó vì nó chỉ có thể sống hoặc chết. Điều đó có nghĩa là chỉ có hai màu; khá nhàm chán.

Hình ảnh bình thường có 24 bit cho mỗi pixel (8 trong mỗi RGB). Điều này có nghĩa là trong một hình ảnh bình thường có pixel là các ô bạn có thể mô phỏng 24 trò chơi giống như cuộc sống cùng một lúc!

Thử thách

Nhiệm vụ của bạn là viết một chương trình sẽ áp dụng một thế hệ quy tắc của máy tự động di động giống như cuộc sống vào hình ảnh có chiều sâu 24 bit (ở bất kỳ định dạng nổi tiếng nào bạn muốn) và xuất ra hình ảnh kết quả.

Mỗi lớp trong số 24 lớp sẽ sử dụng cùng một quy tắc giống như cuộc sống, hoàn toàn nằm trong lớp của chính nó. 24 lớp không tương tác với nhau.

Cũng thế

  • Số không là tế bào chết và tế bào là tế bào sống.
  • Điều kiện biên là định kỳ (tạo thành một hình xuyến).
  • Bất kỳ kích thước hình ảnh nên làm việc.

Đầu ra đầu vào

Chương trình của bạn cần có 3 đối số, thông qua stdin hoặc dòng lệnh (hoặc tương đương gần nhất với ngôn ngữ của bạn):

  1. Tên của tệp hình ảnh đầu vào.
  2. Một chuỗi các chữ số từ 0 đến 8 theo thứ tự tăng dần biểu thị khi các ô mới được sinh ra:
    • Nếu chữ số d nằm trong chuỗi thì các tế bào chết sẽ sống lại khi chúng có hàng xóm sống d .
    • Ví dụ: 3cuộc sống bình thường - Các tế bào chết với chính xác 3 người hàng xóm sống lại.
  3. Một chuỗi các chữ số từ 0 đến 8 theo thứ tự tăng dần biểu thị khi các ô hiện có tồn tại:
    • Nếu chữ số d nằm trong chuỗi thì các tế bào sống với hàng xóm sống d sẽ tồn tại đến thế hệ tiếp theo, nếu không chúng sẽ chết.
    • Ví dụ: 23là Cuộc sống bình thường - Chỉ các ô có chính xác 2 hoặc 3 hàng xóm tồn tại đến vòng tiếp theo.

Lưu ý rằng khu phố Moore luôn được sử dụng. Đọc cái này hoặc cái này để biết thêm thông tin về những gì định nghĩa chính xác một máy tự động giống như cuộc sống và nhiều quy tắc thú vị.

Hình ảnh đầu ra 1 thế hệ sau phải được hiển thị hoặc lưu dưới dạng out.png( bmphoặc bất cứ thứ gì).

Nộp hồ sơ

Mã ngắn nhất tính bằng byte thắng.

Bạn được yêu cầu bao gồm ít nhất một hình ảnh thử nghiệm và ba thế hệ tiếp theo ngay lập tức cho một số quy tắc không tầm thường. Sử dụng hình đại diện của bạn và các quy tắc Cuộc sống bình thường nếu bạn không thể nghĩ gì tốt hơn.

Nếu bạn thích, bạn có thể sử dụng Súng bắn tỉa Gosper này trong đó các bit sống duy nhất nằm trong lớp 128 màu xanh lá cây (nó chỉ chắc chắn hoạt động trong Cuộc sống bình thường):

súng lượn

Đăng các chuỗi thú vị hoặc thậm chí hoạt hình rất được khuyến khích.


1
Tôi nghĩ đó là một bản sao - các phần mới duy nhất đang đọc từ định dạng tệp khác và tách các lớp - cả hai đều cơ bản và không có thách thức nào.
Howard

1
@Howard Nhưng bạn có thích xem hình ảnh không?

3
Vâng. PPCG.SE là một nơi đau đớn và đau đớn, không vui vẻhình ảnh đẹp . Nếu anh ấy làm cho ý tưởng tiền thưởng là một yêu cầu, thì chắc chắn câu hỏi phải đủ bản gốc?
Flonk

3
Sự quan tâm rõ ràng của cộng đồng là các chương trình không được sao chép với những thay đổi nhỏ từ câu trả lời cho các câu hỏi khác. Trang web này không hoạt động trên cơ sở "Tôi nghĩ rằng nó có thể vui vẻ, vì vậy nó ổn". Đó là 4chan.
Peter Taylor

4
@ Làm thế nào tôi không nghĩ rằng điều này được tính là một bản sao nữa. Chắc chắn nếu codegolf.stackexchange.com/questions 432505 / fax-rule-310codegolf.stackexchange.com/questions/4370/ .
Sở thích của Calvin

Câu trả lời:


16

MATLAB: 275

Yêu thích của tôi về các tham số tôi đã thử là 45678, 568theo sau sự tan rã dần dần dẫn đến một bầu trời lấp lánh. Hình ảnh này mô tả, "sự tan rã của sự tồn tại của bộ nhớ."

Mã sản xuất gif không được chấp nhận (chấp nhận PNG mà không cần gia hạn):

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

Mã được chấp nhận tên tệp đầy đủ (có thể là GIF, JPEG và có lẽ các nội dung khác) và ghi vào 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')

Một thực tế được phát hiện trước đó là các tham số 12, 1có thể được sử dụng để tạo ra một mảnh nhỏ giống như thảm Sierpinki. Đây là một điểm có điểm giống được đặt ngẫu nhiên trong mỗi bit:


14

Toán học, 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

Tôi đang nhập dữ liệu từ các dấu nhắc chuỗi theo thứ tự (1) quy tắc sinh, (2) quy tắc sinh tồn, (3) tên tệp và tôi đang hiển thị kết quả ngay trong Mathicala.

Điều này sẽ có thể xử lý hầu hết các định dạng phổ biến, miễn là tệp thực sự có độ sâu 24 bit.

Đây là một phiên bản hơi vô căn cứ:

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

Dưới đây là hai ví dụ sử dụng hình đại diện của Rainbolt :

Mưa rào

20 thế hệ sử dụng Trò chơi cuộc sống tiêu chuẩn [3,23]:

nhập mô tả hình ảnh ở đây

20 thế hệ sử dụng [456,34567]:

nhập mô tả hình ảnh ở đây

Và đây là một GIF của 200 thế hệ đầu tiên của quy tắc sau. GIF bỏ qua mọi khung hình thứ ba, vì tôi không thể nén nó xuống dưới 2 MB nếu không:

nhập mô tả hình ảnh ở đây


2
thật là một quy tắc thú vị
tự hào

10

Con trăn 2, 427

Đối với những người không có Mathicala;)

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

Nó nhắc tên tệp, sau đó là trường hợp sinh, sau đó là trường hợp sống sót. Vì vậy, đối với các quy tắc cuộc sống bình thường, bạn có thể nhập vào test.bmp, sau 3đó 23(không có dấu ngoặc kép hoặc bất cứ điều gì cần thiết).

Tôi đã sử dụng định dạng chuỗi để lập chỉ mục và kết hợp lại các bit màu, mặc dù tôi sợ rằng điều đó có thể không tối ưu.

Lưu ý rằng nó khá chậm.

Thí dụ

Cuộc sống cao và nghệ thuật pha trộn tuyệt vời phải không? (Quy tắc 36/ 23.)

Mona Lisa gốc thế hệ 1 Bản gốc / Thế hệ 1

thế hệ 2 thế hệ 3 Thế hệ 2 / Thế hệ 3


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

Ví dụ (quy tắc 368/245):

Gen 0:

nhập mô tả hình ảnh ở đây

Gen 1:

nhập mô tả hình ảnh ở đây

Gen 2:

nhập mô tả hình ảnh ở đây

Gen 3:

nhập mô tả hình ảnh ở đây

Gen 4:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.