生活可以丰富多彩!


30

栩栩如生的细胞自动机中的每个细胞仅需要一位来表示,因为它只能是生的或死的。这意味着只有两种颜色。很无聊。

普通图像的每个像素为24位(RGB中的每个像素为8位)。这意味着在以像素为单元格的正常图像中,您可以一次模拟24个逼真的游戏!

挑战

您的任务是编写一个程序,该程序将逼真的蜂窝自动机的一代规则应用于24位深度图像(以您喜欢的任何已知格式),然后输出结果图像。

24层中的每一层都将使用相同的栩栩如生的规则集,严格在其自己的层之内。这24层不会互相影响。

  • 零是死细胞,一个是活细胞。
  • 边界条件是周期性的(形成圆环)。
  • 任何图像尺寸都可以。

输入输出

您的程序需要通过stdin或命令行(或您的语言最接近的等效语言)接受3个参数:

  1. 输入图像文件的名称。
  2. 由0到8的数字组成的字符串,以递增的顺序表示新单元格的诞生时间:
    • 如果数字d在字符串中,则死细胞在有d个存活邻居时会恢复活力。
    • 示例:3正常的生命 -刚好有3个存活邻居的死细胞复活。
  3. 从0到8的数字字符串,以递增的顺序表示现有的单元格何时存活:
    • 如果数字d在字符串中,则具有d个存活邻居的存活细胞将存活到下一代,否则它们将死亡。
    • 示例:23正常生命-只有具有2或3个邻居的细胞才能存活到下一轮。

请注意,始终使用摩尔街区。阅读这个对精确什么定义了一个栩栩如生的自动机和许多有趣的规则集的更多信息。

1代以后的输出图像应显示或另存为out.pngbmp或其他任何形式)。

投稿

以字节为单位的最短代码获胜。

对于某些非平凡的规则集,您需要至少包含一个测试映像及其三个后继代。如果您想不出更好的方法,请使用您的头像和正常的生活规则。

如果您愿意,可以使用这种Gosper Glider Gun,其中唯一的活物在绿色的128层中(只能确保在正常的Life中工作):

滑翔机枪

强烈建议张贴有趣的序列甚至动画。


1
我认为它是重复的-唯一的新部分是从另一种文件格式读取并拆分层-两者都是基本的,而且本身没有挑战。
霍华德

1
@Howard但是您是否对查看图像感兴趣?

3
是的 PPCG.SE是一个痛苦和痛苦的地方,不是有趣漂亮的图像。如果他把奖金的想法作为一个要求,那么问题肯定一定足够新颖吗?
Flonk 2014年

3
社区的明确兴趣是,程序的复制不会因答案或其他问题的微小变化而被复制粘贴。该网站的运作并非基于“我认为这可能很有趣,所以还可以”。那是4chan。
彼得·泰勒

4
@Howard我认为这不再是重复的了。当然,如果codegolf.stackexchange.com/questions/34505/simulate-rule-110codegolf.stackexchange.com/questions/4370/…可以共存,那么这根本不是重复。
加尔文的业余爱好

Answers:


16

MATLAB:275

我最喜欢的参数是45678568它在逐渐分解之后会产生闪烁的星星。此图像描绘了“内存持久性的瓦解”。

非高尔夫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

接受完整文件名(可以是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')

一个先前发现的事实是,参数121可以用来生成一个谢尔宾斯基地毯般的分形。这是在每个位中随机放置一个种子点的种子:


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头像的示例:

雨栓

20代使用标准的《人生游戏》[3,23]

在此处输入图片说明

20代使用[456,34567]

在此处输入图片说明

这是后一个规则的前200代的GIF。GIF每隔三帧跳过一次,因为否则我无法将其压缩到2MB以下:

在此处输入图片说明


2
多么有趣的规则
骄傲的haskeller 2014年

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

蒙娜丽莎原件 第一代 原始/第一代

第二代 第三代 第2代/第3代


6

Java,1085个字节

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:

在此处输入图片说明

第1代:

在此处输入图片说明

第2代:

在此处输入图片说明

第3代:

在此处输入图片说明

第四代:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.