인생은 화려할 수 있습니다!


30

실제와 같은 셀룰러 오토 마톤의 각 셀은 살아 있거나 죽을 수 있기 때문에 하나의 비트 만 나타내면됩니다. 즉, 두 가지 색상 만 있습니다. 꽤 지루합니다.

일반 이미지에는 픽셀 당 24 비트가 있습니다 (각 RGB에서 8 개). 즉, 픽셀이 셀로 포함 된 일반 이미지에서는 한 번에 24 개의 실제와 같은 게임을 시뮬레이션 할 수 있습니다!

도전

당신의 임무는 실물과 같은 셀룰러 오토 마톤의 1 세대 규칙을 24 비트 심도 이미지 (원하는 잘 알려진 형식으로)에 적용하고 결과 이미지를 출력하는 프로그램을 작성하는 것입니다.

24 개 계층 각각은 자체 계층 내에서 동일한 실제와 같은 규칙 세트를 사용합니다. 24 개의 레이어는 서로 상호 작용하지 않습니다.

또한

  • 0은 죽은 세포이고 1은 살아있는 세포입니다.
  • 경계 조건은 주기적입니다 (원환 형성).
  • 모든 이미지 크기가 작동해야합니다.

입출력

프로그램은 stdin 또는 명령 줄 (또는 해당 언어와 가장 비슷한)을 통해 3 개의 인수를 사용해야합니다.

  1. 입력 이미지 파일의 이름입니다.
  2. 새 셀이 태어난시기를 나타내는 0에서 8까지의 숫자로 구성된 문자열 :
    • 숫자의 경우 d는 문자열에가있을 때 다음 죽은 세포는 살아 온 D 살아있는 이웃.
    • 예 : 3정상적인 생명체 -정확히 3 명의 살아있는 이웃을 가진 죽은 세포가 살아납니다.
  3. 기존 셀이 생존 할 때를 나타내는 순서대로 0에서 8까지의 숫자 문자열 :
    • 숫자 d 가 줄에 있으면 d 개의 이웃이 있는 살아있는 세포 는 다음 세대까지 살아남고 그렇지 않으면 죽습니다.
    • 예 : 23정상 수명입니다. 정확히 2 개 또는 3 개의 이웃이있는 셀만 다음 라운드에서 생존합니다.

점을 유의 무어 이웃이 항상 사용됩니다. 읽기 정확하게 실제와 같은 기계적 많은 재미있는 규칙 세트를 정의 사항에 대한 자세한 정보를 원하시면.

1 세대 이후의 출력 이미지는 out.png( bmp또는 기타) 로 표시되거나 저장되어야합니다 .

제출

바이트 단위의 가장 짧은 코드가 이깁니다.

당신은있다 필요한 적어도 하나 개의 테스트 이미지와 일부 비 사소한 룰에 대한 세 가지 바로 다음 세대를 포함 할 수 있습니다. 더 나은 생각이 없다면 아바타와 일반적인 생활 규칙을 사용하십시오.

원하는 경우 살아있는 비트가 녹색 128 레이어에있는 이 Gosper Glider Gun을 사용할 수 있습니다 (정상적인 생활에서만 작동합니다).

글라이더 건

재미있는 시퀀스 나 애니메이션을 게시하는 것이 좋습니다.


1
새로운 부분이 다른 파일 형식에서 읽고 레이어를 분할하는 것은 복제본이라고 생각합니다.
Howard

1
@Howard 그러나 이미지를 보는 데 관심이 없습니까?

3
네. PPCG.SE는 재미 있고 예쁜 이미지가 아닌 고통과 고통의 장소입니다 . 그가 보너스 아이디어를 요구 사항으로 만들면 분명히 그 질문은 독창적이어야합니까?
Flonk

3
커뮤니티의 분명한 관심은 다른 질문에 대한 답변에서 사소한 변경으로 프로그램을 복사하여 붙여 넣을 수 없다는 것입니다. 이 사이트는 "재미있을 것 같아서 괜찮을 것"에 근거하여 운영되지 않습니다. 4chan입니다.
피터 테일러

4
@Howard 나는 이것이 더 이상 중복으로 간주되지 않는다고 생각합니다. 분명히 codegolf.stackexchange.com/questions/34505/simulate-rule-110codegolf.stackexchange.com/questions/4370/… 이 공존 할 수 있다면 이것은 전혀 중복되지 않습니다.
Calvin 's Hobbies

답변:


16

MATLAB : 275

내가 시도 매개 변수의 나의 마음에 드는 것입니다 45678, 568별 반짝 반짝 빛나는의 하늘에서 점진적 붕괴의 결과를 다음있다. 이 이미지는 "메모리 지속성의 붕괴"를 나타냅니다.

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

이전에 발견 된 사실은 매개 변수이다 12, 1시어 핀 스키 카펫처럼 프랙탈을 생성 할 수 있습니다. 다음은 각 비트에 무작위로 시드 포인트가있는 것입니다.


14

매스 매 티카, 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 비트이면 가장 널리 사용되는 형식을 처리 할 수 ​​있습니다.

다음은 다소 ungolfed 버전입니다.

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 아바타를 사용한 두 가지 예입니다 .

레인 볼트

표준 Game of Life를 사용하는 20 세대 [3,23]:

여기에 이미지 설명을 입력하십시오

사용하여 20 세대 [456,34567]:

여기에 이미지 설명을 입력하십시오

그리고 여기 후자의 규칙의 첫 200 세대의 GIF가 있습니다. 그렇지 않으면 2MB 미만으로 압축 할 수 없으므로 GIF는 세 번째 프레임마다 건너 뜁니다.

여기에 이미지 설명을 입력하십시오


2
이 얼마나 흥미로운 규칙
자랑스런 하스 켈러

10

파이썬 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

자바, 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) :

0 세대 :

여기에 이미지 설명을 입력하십시오

1 세대 :

여기에 이미지 설명을 입력하십시오

2 세대 :

여기에 이미지 설명을 입력하십시오

3 세대 :

여기에 이미지 설명을 입력하십시오

세대 4 :

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.