人生はカラフルになることができます!


30

生きているようなセルオートマトンの各セルは、生きているか死んでいるだけであるため、それを表すのに1ビットしか必要ありません。つまり、2色しかありません。かなり退屈。

通常の画像のピクセルあたりのビット数は24です(RGBごとに8ビット)。これは、セルとしてピクセルを持つ通常の画像では、24のリアルなゲームを一度にシミュレートできることを意味します!

チャレンジ

あなたの仕事は、実物のようなセルオートマトンの1世代のルールを24ビット深度画像(お好みのよく知られている形式)に適用し、結果の画像を出力するプログラムを書くことです。

24の各レイヤーは、厳密に独自のレイヤー内で、同じリアルなルールセットを使用します。24層は相互に作用しません。

また

  • ゼロは死んだ細胞であり、ゼロは生細胞です。
  • 境界条件は周期的です(トーラスを形成します)。
  • すべての画像サイズが機能するはずです。

入出力

プログラムは、stdinまたはコマンドライン(または言語に最も近いもの)を介して3つの引数を取る必要があります。

  1. 入力画像ファイルの名前。
  2. 新しいセルがいつ生まれるかを示す昇順の0〜8の数字の文字列:
    • 桁の場合はdが文字列である彼らが持っているときに死んだ細胞が生きてくるD生活隣人を。
    • 例:3通常の生活 -正確に3つの生きている隣人の死んだ細胞が生き返ります。
  3. 既存のセルがいつ生き残るかを示す、昇順の0から8までの数字のストリング:
    • 桁の場合はdが文字列である、その後で生きた細胞D生きている隣人はそうでない場合、彼らは死ぬ、次世代に生き残ります。
    • 例:23通常の生活-正確に2つまたは3つの隣接セルを持つセルのみが次のラウンドまで生き残ります。

ムーア近傍が常に使用されることに注意してください。実物のようなオートマトンと多くの興味深いルールセットを正確に定義するものの詳細については、こちらまたはこちらをお読みください。

1世代以降の出力イメージは、表示するかout.pngbmpまたは(または何でも)として保存する必要があります。

提出

バイト単位の最短コードが優先されます。

いくつかの重要なルールセットに対して、少なくとも1つのテストイメージとその3つの後続の世代を含める必要あります。これ以上良いものが思いつかない場合は、アバターと通常のライフルールを使用してください。

必要に応じて、緑色の128層に唯一の生きているビットがあるこのGosper Glider Gunを使用できます(通常の生活でのみ動作するはずです)。

グライダーガン

興味深いシーケンスやアニメーションを投稿することを強くお勧めします。


1
私はそれが複製だと思います-唯一の新しい部分は別のファイル形式から読み込んでレイヤーを分割するだけです-両方とも基本的であり、それ自体は挑戦ではありません。
ハワード14

1
@Howardしかし、あなたは画像を見ることに興味がありませんか?

3
うん。PPCG.SEは、痛みや苦痛の場所であり、楽しくきれいな画像ではありません。彼がボーナスのアイデアを要件にした場合、質問は確かに十分に独創的でなければなりませんか?
フランク14

3
コミュニティの明確な関心は、プログラムをコピーペーストして、他の質問への回答から小さな変更を加えないことです。このサイトは「楽しいかもしれないと思うので大丈夫」に基づいて運営されていません。それは4ちゃんです。
ピーターテイラー14

4
@Howardこれはもう重複とは見なされません。確かにcodegolf.stackexchange.com/questions/34505/simulate-rule-110codegolf.stackexchange.com/questions/4370/…が共存できる場合、これはまったく重複していません。
カルビンの趣味14

回答:


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、そしておそらく他のものすることができます)完全なファイル名を受け入れ、に書き込みGolfedコード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のアバターを使用した2つの例を次に示します。

レインボルト

標準的なGame of Lifeを使用した20世代[3,23]

ここに画像の説明を入力してください

を使用して20世代[456,34567]

ここに画像の説明を入力してください

そして、後者のルールの最初の200世代のGIFがあります。GIFは3フレームごとにスキップします。2MB未満に圧縮できないためです。

ここに画像の説明を入力してください


2
なんて

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、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:

ここに画像の説明を入力してください

Gen 1:

ここに画像の説明を入力してください

Gen 2:

ここに画像の説明を入力してください

Gen 3:

ここに画像の説明を入力してください

Gen 4:

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.