1Dセルラーオートマトンのシミュレーション


14

チャレンジ

STDINから7つの数字を取得し、セルオートマトン(CA)の2次元の履歴をSTDOUTに出力する完全なプログラムを作成します。これはコードゴルフです。

入力フォーマット 入力は、コンマで区切られた7つの整数/文字列です。最初の数字は、Wolframコード(各ルールの標準名)に従ったルールの番号です。2番目は、最初の初期構成です。3番目と4番目は、開始パターンの左側に追加するパターンとその回数を示しています。パディングとして。5番目と6番目は右側についても同じことを行います。最後の数字は、シミュレーションを実行する世代の数です。

したがって、入力の例はです90,11,0,4,0,4,5。これにより、プログラムにルール90を実行していることがわかります。また、プログラムに、両端に11文字列を04回追加した初期構成にすることを伝える必要があるため、実際の開始パターンは0000110000です。また、このシミュレーションを5世代実行するようプログラムに指示します。

出力プログラムは、出力がCAの時空間図になるように、各世代のセルの配列全体(改行で区切られている)を印刷する必要があります。世代ごとに、各セルの状態は、その状態と、入力として提供されたルールに従って、すぐ左と右のセルの状態によって決定されます。シミュレーションはエッジの周りをラップする必要があります。最初に印刷されるのは、genとしての開始配列です。0。

入力90,11,0,4,0,4,5により、次の出力が可能な限り正確になります。

0000110000
0001111000
0011001100
0111111110
1100000011
0110000110

開始状態は5つの世代に含まれていないことに注意してください。また、シミュレーションがエッジの周りをラップしていることに注意してください。

その他の例

入力:

184,1100,01,2,01,1,4

出力:

0101110001
1011101000
0111010100
0110101010
0101010101

入力:

0,1011,1,0,0,1,2

出力:

10110
00000
00000

1D CAの仕組みと番号付け方法の詳細


ルール0をテストケースとして含めることでうまくいきました。
ピーターテイラー

ルール90がシェルピンスキーガスケットであることに魅了されました。特に、それが別のCodegolfプロジェクトのために行ったテストの一部だったので。
JoeFish

@JoeFishこれを試してみたのはあなたのイメージでした。8086の回答(2羽の鳥を殺す)を作成したかったのですが、おそらく文字列操作が必要になるため、エミュレータで(まだ)実行できません。
luser droog

誰かがすでにそれをやった:pouet.net/prod.php
which=

回答:


5

Golfscript、77 73 70文字

','/)~\(~:?;~~*@@~*@+\+{1&}/]({[.,{.[3<?256+]{2base}/\~=\(+}*])n@)\+}*

4文字を保存する方法を指摘してくれた@Howardに感謝します。


あなたは明白なものを保存することができます48--> 1&そして私はまた3つだと思います。)ブロックの前を省略して(カウンターを増やすことはできません)、最後の2つのポップを保存することもできます。
ハワード

@Howard、ありがとう。最後のポップは以前のイテレーションで役立ちましたが、それらを削除することは今では理にかなっています。
ピーターテイラー

5

APL(153文字)

∇ cellularautomaton
  i               ← ⍞
  s               ← (i=',') / ⍳ ⍴i
  (b a x c)       ← {i[s[⍵]↓⍳s[⍵+1]-1]} ¨ ⍳4
  (z x x l x r n) ← ⍎i
  y               ← ⍎ ¨ ⊃ ,/ (l / ⊂a) , b , r / ⊂c
  (n+1) (⊃⍴,y) ⍴ '01'[1+⊃ ,/ y,{({(z ⊤⍨ 8/2)[8 - 2⊥¨ 3 ,/ (⊃⌽⍵),⍵,⊃⍵]}⍣⍵)y} ¨ ⍳n]
∇

そして、読みにくい、わずかに短い形式で:

i←⍞⋄s←(i=',')/⍳⍴i⋄b a x c←{i[s[⍵]↓⍳s[⍵+1]-1]}¨⍳4⋄z x x l x r n←⍎i⋄y←⍎¨⊃,/(l/⊂a),b,r/⊂c⋄'01'[1+⊃,/y,{({(z⊤⍨8/2)[8-2⊥¨3,/(⊃⌽⍵),⍵,⊃⍵]}⍣⍵)y}¨⍳n]⍴⍨(1+n),⊃⍴,y

例:

      cellularautomaton
26,00110,01,4,10,6,7
0101010100110101010101010
1000000011100000000000001
0100000110010000000000011
0010001101101000000000110
0101011001000100000001101
0000010110101010000011000
0000100100000001000110100
0001011010000010101100010

改善の余地はあると確信しています(この投稿を書いている間にいくつかの変更を見つけました!)が、その一部は根本的な変更を伴う可能性があり、APLを見つめることはもうできません。ここで使用されるAPLのバリアントはDyalog APLです。


4

ルビー、165 159文字

a=gets.split ?,
b=a.map &:to_i
c=(x=a[2]*b[3]+a[1]+a[4]*b[5]).chars.map &:hex
(0..b[6]).map{puts c*''
c=(1..w=x.size).map{|i|b[0]>>c[i-1]*2+c[i%w]+c[i-2]*4&1}}

編集:小さな機能強化のための場所を見つけました。

実行例:

> 30,1,0,20,0,20,20
00000000000000000000100000000000000000000
00000000000000000001110000000000000000000
00000000000000000011001000000000000000000
00000000000000000110111100000000000000000
00000000000000001100100010000000000000000
00000000000000011011110111000000000000000
00000000000000110010000100100000000000000
00000000000001101111001111110000000000000
00000000000011001000111000001000000000000
00000000000110111101100100011100000000000
00000000001100100001011110110010000000000
00000000011011110011010000101111000000000
00000000110010001110011001101000100000000
00000001101111011001110111001101110000000
00000011001000010111000100111001001000000
00000110111100110100101111100111111100000
00001100100011100111101000011100000010000
00011011110110011100001100110010000111000
00110010000101110010011011101111001100100
01101111001101001111110010001000111011110
11001000111001111000001111011101100010001

3

C、303 305 301 294 292

305編集:おっと。calloc()2つの引数を取ることを忘れていました。より大きな入力で爆発していました。

301編集:ああ!私のcalloc()ブーブーを使用して、要求されたメモリのブロックサイズを増やして、さらに2バイトを節約しました。

294編集:300を破った!の1つを削除しstrcat()、いくつかのループを調整しました。最大のムンクを使用するようになりました。これは、使用と同じくらい楽しいです。

292編集:+2メモリ内割り当ては必要ありませんでした。

基本的な考えとしてluser droogの答え使用しましたが、ラッピングアルゴリズムを変更し、多くの定数の調整と因数分解を行いました。

r,A,C,n,j;main(){char*s,*p,*t,a[9],b[9],c[9];scanf("%d,%[01],%[01],%d,%[01],%d,%d",&r,b,a,&A,c,&C,&n);for(s=calloc(A+++C,9);A--;)strcat(s,A?a:b);for(;C--;)strcat(s,c);p=strdup(s);for(C=strlen(s);A++<n;puts(s),t=p,p=s,s=t)for(j=C;j--;)p[j]=(1<<(s[j?j-1:C-1]*4+s[j]*2+s[(j+1)%C])-336)&r?49:48;}

r,A,C,n,j;
main(){
    char*s,*p,*t,a[9],b[9],c[9];
    scanf("%d,%[01],%[01],%d,%[01],%d,%d",&r,b,a,&A,c,&C,&n);
    for(s=calloc(A+++C,9);A--;)
        strcat(s,A?a:b);
    for(;C--;)
        strcat(s,c);
    p=strdup(s);
    for(C=strlen(s);A++<n;puts(s),t=p,p=s,s=t)
        for(j=C;j--;)
            p[j]=(1<<(s[j?j-1:C-1]*4+s[j]*2+s[(j+1)%C])-336)&r?49:48;
}

スクリーンショット1

スクリーンショット2


1
あなたはそれを開始させるのを忘れましたC,A,!:)
luser droog

メモリの負荷についてはbrk()どうですか?それからp=s+C+1;どこかに。
luserはドローグ

1
使用するために再度+1 +++
ルーザーdroog

ハハ!すべてを変更%[01]%sます!-9(...何年も後)
luserは

1
@luserdroogは、%sが貪欲であり、カンマや他の数字も食べるため、機能しません。
JoeFish

2

C(487 484 418スペースが削除されています)

* JoeFishの助けを借りて66をドロップ*

C,A,r,n,j;main(){char*s,*p,*t,a[9],b[9],c[9];
    scanf("%d,%[01],%[01],%d,%[01],%d,%d",&r,b,a,&A,c,&C,&n);
    s=malloc(strlen(a)*A+strlen(b)+strlen(c)*C+3);*s=0;
    strcat(s,"0");
    for(;A--;)strcat(s,a);
    strcat(s,b);
    for(;C--;)strcat(s,c);
    strcat(s,"0");
    p=malloc((C=strlen(s)-1)+2);
    for(;n--;){
    *s=s[C-1];
    s[C]=0;
    puts(s+1);
    s[C]=s[1];
    for(j=1;s[j+1];j++)
        p[j]=(1<<(s[j-1]-48)*4+(s[j]-48)*2+s[j+1]-48)&r?49:48;
    t=p;p=s;s=t;
    }
    s[C]=0;
    puts(s+1);
}

タイプスクリプト

josh @ Z1〜
$!m
CAを作る
cc ca.c -o ca
ca.c:1:1:警告:データ定義にタイプまたはストレージクラスがありません
ca.c:関数「main」内:
ca.c:2:5:警告:組み込み関数「scanf」の互換性のない暗黙の宣言
ca.c:3:7:警告:組み込み関数 'malloc'の互換性のない暗黙の宣言
ca.c:3:14:警告:組み込み関数 'strlen'の互換性のない暗黙の宣言
ca.c:4:5:警告:組み込み関数「strcat」の互換性のない暗黙の宣言

josh @ Z1〜
$ echo 90,11,0,4,0,4,5 | ca
-bash:ca:コマンドが見つかりません

josh @ Z1〜
$ echo 90,11,0,4,0,4,5 | ./ca
0000110000
0001111000
0011001100
0111111110
1100000011
0110000110


いいね あなたは、あなたのすることによって、かなりの数のバイトを剃ることができint、変数はグローバルと削除#includer,A,B,C,n,i,j; main(){char *s...
JoeFish

あなたの中にたくさん保存for:ループfor(;A--;)strcat(s,a);
JoeFish

そして再利用しAC後で宣言するiB、まったく宣言する必要がありません。p=malloc((C=strlen(s))+1); --C; strcpy(p,s); for(A=0;A<n;A++){申し訳ありませんが、今すぐ停止します:)
JoeFish

わかりました、もう一つ嘘をつきました。以下を排除することで2バイスを取り除き--C;ます:p=malloc((C=strlen(s)-1)+2);。ゴルフのコードは、そもそも考え出すよりも楽しいと思います!
JoeFish

可変個である#includeため、削除するかどうかscanfはわかりませんでした。しかし、一度しか呼び出されないため、おそらく大丈夫です。...私の古いマシンは昨日死にました、そして私はまだCygwinをインストールしています。私はそれをテストできるとすぐにそれらの変更を取り入れます。ありがとう!
luserはドローグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.