ルール110のシミュレーション


27

ルール110は、いくつかの興味深い特性を持つセルオートマトンです。 目標は、できるだけ少ない文字数でルール110をシミュレートすることです。

知らない人のために、ルール110はグリッド内の行ごとにシミュレートされます。グリッドの行の各正方形は、上、左上、および右上の正方形を見て、どのセルになるかを決定します。

current pattern  111 110 101 100 011 010 001 000
new cell          0   1   1   0   1   1   1   0

入力:合理的な形式(カンマ区切りの文字列、リスト、関数の引数)で、最上行のn番目の入力正方形を表す0から39までの数字。1インデックス付き言語に対応するために、数字も1インデックス付きであるため、範囲は1〜40です。

入力例:

38,39

出力:最初の行を含む実行中のオートマトンを表す40 x 40のグリッド。0を空白、1を表示可能な印刷文字として残す必要があります。実際のグリッドを合理的に区別できる限り、末尾のスペースを使用できます。グリッドの下部には改行が含まれている場合がありますが、グリッド線の間に空白行があってはなりません。

出力例:

                                  XX
                                 XXX
                                XX X
                               XXXXX
                              XX   X
                             XXX  XX
                            XX X XXX
                           XXXXXXX X
                          XX     XXX
                         XXX    XX X
                        XX X   XXXXX
                       XXXXX  XX   X
                      XX   X XXX  XX
                     XXX  XXXX X XXX

注:1Dセルラーオートマトンに関する同様の質問は既に尋ねられていますが、1つのルールのみを使用することで、短い回答を作成できることを願っています。


4
パターンは折り返しますか(つまり、左端のセルがその上の行の右端のセルをチェックしますか)?
Ventero

4
単数形の場合はセルオートマトンです。
ClickRick

1
入力から解析する必要はなく、ルールがハードコーディングされているため、回答は1Dセルラーオートマトンのシミュレーションよりもわずかに短くなる場合がありますが、それ以外は回答が同じになります。それが別のルールである場合、節約の可能性がありますが、チューリングの強力なルールを特別なケースでどのように一般的な実装よりも節約するのでしょうか?
ピーターテイラー

1
@Venteroこのバージョンにはありません。
qwr

1
@BMOこれは古い質問ですが、最近はコンセンサスが柔軟な入力フォーマットを可能にしているので、私はそれを可能にするために、質問を変更します
QWR

回答:


8

CJam-47

S40*l',/{i'!t}/{N40,S3$S++f{>3<2b137Yb='!^}}39*

!「1」個のセルに使用します。

http://cjam.aditsu.net/で試してください

説明:

S40*40のスペースの列(アレイ)になり
l',/コンマによってラインとスプリットを読み出し
{…}/各項目のブロック(文字列形式の数字)を実行
- i'!t整数に変換される数値をし、前の文字列(最初に40のスペース内のその位置にある項目を設定します)から「!」
この時点で、最初の行を取得しました。
{…}39*ブロックを39回実行
- N改行を追加
- 40,配列[0 1…39]を作成
- S3$S++前の行(スタック上の位置3)をコピーし、両側にスペースを埋める
- f{…}{各番号0からのブロックを実行to 39} and {th​​e padded line}
- >3<現在の番号で始まる3行のパディング行からの項目を取得します
- 2b基数2から変換します。スライスしたアイテムは2進数ではありませんが、文字はASCII値に変換され、 '' mod 8 is 0 and '!' MOD 8 1
- 137Yb変換ベース2から137(Y= 2)、(8ビットで)110が反転し、否定される、[1 0 0 0 1 0 0 1]の取得は、
- ='!^対応するベース2桁(取得配列は折り返されるので、インデックスはmod 8)で取得され、「!」でxorされます 文字、結果は '!' 0の場合と1の場合は「」


17

ルビー、113文字

c=[0]*41
eval"[#{gets}].map{|i|c[i]=1}"+'
c=(0..39).map{|x|putc" X"[u=c[x]]
110[4*c[x-1]+2*u+c[x+1]]}<<0;puts'*40

stdinで入力を受け取ります。別のルールを使用するに110は、最後の行のを、試したいルールに置き換えるだけです。

例:

$ ruby 110.rb <<< 38,39
                                      XX
                                     XXX
                                    XX X
                                   XXXXX
                                  XX   X
                                 XXX  XX
                                XX X XXX
                               XXXXXXX X
                              XX     XXX
                             XXX    XX X
                            XX X   XXXXX
                           XXXXX  XX   X
                          XX   X XXX  XX
                         XXX  XXXX X XXX
                        XX X XX  XXXXX X
                       XXXXXXXX XX   XXX
                      XX      XXXX  XX X
                     XXX     XX  X XXXXX
                    XX X    XXX XXXX   X
                   XXXXX   XX XXX  X  XX
                  XX   X  XXXXX X XX XXX
                 XXX  XX XX   XXXXXXXX X
                XX X XXXXXX  XX      XXX
               XXXXXXX    X XXX     XX X
              XX     X   XXXX X    XXXXX
             XXX    XX  XX  XXX   XX   X
            XX X   XXX XXX XX X  XXX  XX
           XXXXX  XX XXX XXXXXX XX X XXX
          XX   X XXXXX XXX    XXXXXXXX X
         XXX  XXXX   XXX X   XX      XXX
        XX X XX  X  XX XXX  XXX     XX X
       XXXXXXXX XX XXXXX X XX X    XXXXX
      XX      XXXXXX   XXXXXXXX   XX   X
     XXX     XX    X  XX      X  XXX  XX
    XX X    XXX   XX XXX     XX XX X XXX
   XXXXX   XX X  XXXXX X    XXXXXXXXXX X
  XX   X  XXXXX XX   XXX   XX        XXX
 XXX  XX XX   XXXX  XX X  XXX       XX X
XX X XXXXXX  XX  X XXXXX XX X      XXXXX
XXXXXX    X XXX XXXX   XXXXXX     XX   X

8

Mathematica、122バイト

f[a_]:=Riffle[CellularAutomaton[110,Array[If[MemberQ[ToExpression["{"<>a<>"}"],#-1],1,0]&,40],39]/.0->" "/.1->"X","
"]<>""

はい、あなたが悪用としてこれを見るかもしれない、この抜け穴を、しかし)抜け穴はかなり議論されていること、b)はセルオートマトンの質問が必要 Iドンので、Mathematicaの答(ルール110)およびc)VenteroのRubyの答えはとにかく短い程度、特に1を害はないと思います。

ほとんどの文字は、入力の解析と出力のフォーマットに使用されます。実際のオートマトンは、次を使用してシミュレートされます

CellularAutomaton[110,initialGrid,39]

これは、周期的な境界条件を使用します(したがって、グリッドは回り込みます)。


8

Python-141

i=input()
o=range(40)
l=''.join(' X'[c in i]for c in o)
for r in o:print l;l=''.join('X '[l[c-1:c+2]in('XXX','   ','X  ','','  ')]for c in o)

例として実行 python 110.py <<< 38,39


3
['X',' ']'X '5文字を保存するように変更できます。
カルビンの趣味

16
私の好きな果物は今あるo=range()
kitcar2000

7

q、67 62 58バイト

ラップアラウンドを想定していません:

{40{not(2 sv'flip 1 0 -1 xprev\:x)in 0 4 7}\@[40#0b;x;~:]}

古いバージョン

{40{not(flip(prev;::;next)@\:x)in 3 cut 111100000b}\@[40#0b;x;not]}
{40{not(flip 1 0 -1 xprev\:x)in 3 3#111100000b}\@[40#0b;x;~:]}

5

Python、186

def r(s,m=range(40)):
 s=[int(i in s)for i in m]
 for g in m:print''.join([' X'[i]for i in s]);s=[int(not''.join(map(str,s[i-1:i+2]if i else s[:2]))in'111 100 000 00'.split())for i in m]

まともですが、おそらく最適ではありません。

入力の取得方法を指定しなかったため、関数を作成しました。

使用例:

r([38,39])

出力:

                                      XX
                                     XXX
                                    XX X
                                   XXXXX
                                  XX   X
                                 XXX  XX
                                XX X XXX
                               XXXXXXX X
                              XX     XXX
                             XXX    XX X
                            XX X   XXXXX
                           XXXXX  XX   X
                          XX   X XXX  XX
                         XXX  XXXX X XXX
                        XX X XX  XXXXX X
                       XXXXXXXX XX   XXX
                      XX      XXXX  XX X
                     XXX     XX  X XXXXX
                    XX X    XXX XXXX   X
                   XXXXX   XX XXX  X  XX
                  XX   X  XXXXX X XX XXX
                 XXX  XX XX   XXXXXXXX X
                XX X XXXXXX  XX      XXX
               XXXXXXX    X XXX     XX X
              XX     X   XXXX X    XXXXX
             XXX    XX  XX  XXX   XX   X
            XX X   XXX XXX XX X  XXX  XX
           XXXXX  XX XXX XXXXXX XX X XXX
          XX   X XXXXX XXX    XXXXXXXX X
         XXX  XXXX   XXX X   XX      XXX
        XX X XX  X  XX XXX  XXX     XX X
       XXXXXXXX XX XXXXX X XX X    XXXXX
      XX      XXXXXX   XXXXXXXX   XX   X
     XXX     XX    X  XX      X  XXX  XX
    XX X    XXX   XX XXX     XX XX X XXX
   XXXXX   XX X  XXXXX X    XXXXXXXXXX X
  XX   X  XXXXX XX   XXX   XX        XXX
 XXX  XX XX   XXXX  XX X  XXX       XX X
XX X XXXXXX  XX  X XXXXX XX X      XXXXX
XXXXXX    X XXX XXXX   XXXXXX     XX   X

入力を指定しました。あなたの場合、input()を使用し、元の投稿で指定されているように入力をフォーマットする必要があります。
qwr 14

5

Mathematica、113文字

を使用した別のMathematicaの答えCellularAutomaton

Print@@" "["X"][[#]]&/@CellularAutomaton[110,SparseArray[#+1->1&/@ImportString[InputString[],"CSV"][[1]],40],39];

興味深いことに、どのように機能し" "["X"][[#]]&ますか?
マーティンエンダー

@ m.buettner " "["X"][[1]]"X"です。" "["X"][[0]]の頭" "["X"]、つまりを返します" "
alephalpha

ああなるほど。したがって、これは一般的にリスト用の文字を保存するだけです。それは本当に賢いです。codegolf.stackexchange.com/questions/12900/に
Martin Ender

4

C-178

このコードは、行列の各行が連続したメモリに格納されているという事実に依存しています。また、最初の行は印刷されませんが、ルールでは40x40グリッドのみが指定されているため、次の40行が印刷されます。

読みやすくするためにインデントされているため、バイトカウントには必要なコードのみが含まれます。

a[41][42],i,j,*t;
main(){
    while(scanf("%d,",&j)>0)
        a[i][j]=1;
    for(;i<40;i++,puts(""))
        for(j=0;++j<40;)
            t=&a[i][j],
            putchar((*(t+42)=1&(110>>(*(t+1)?1:0)+(*t?2:0)+(*(t-1)?4:0)))?88:32);
}

3

ルア-351

ゴルフに理想的な言語ではありません。

s,n,t,u=arg[1],{},table.remove,table.insert
for i=1,40 do u(n,i,'.') end
for i in s:gmatch("%d+")do u(n,i,'x');t(n)end
function a(b) c="";for i=1,40 do c=c..b[i] end;print(c);return c end
for i=1,40 do z= n[40]..a(n)..n[1];for k=2,41 do y=string.sub(z,k-1,k+1);if y=="xxx"or y=="x.." or y=="..." then u(n,k-1,'.')else u(n,k-1,'x')end;t(n)end end

1
do u(n,i,'x')それは意図的ですよね?
スタン・ストラム


3

Haskell135131130バイト

ØrjanJohansenのおかげで-1バイト(再配置take 40

FrownyFrogの答えに対するまったく異なるアプローチですが、長さはほぼ同じです。

(a?b)r=mod(b+r+b*r+a*b*r)2
r x=0:(zipWith3(?)x=<<tail$tail x++[0])
f y=take 40$map(" o"!!)<$>iterate r[sum[1|elem i y]|i<-[0..40]]

1

説明

4101

f y=                               [sum[1|elem i y]|i<-[0..40]]

40

    take 40$              iterate r

01

            map(" o"!!)<$>

r110zipWith3(?)

r x=0:(zipWith3(?)x=<<tail$tail x++[0])

(?)オペレータは、ソリューションの最も興味深い部分です。以前私がブールカルノー図で生成されたルールが、使用が判明し、より簡潔な方法があります:

(a?b)r=mod(b+r+b*r+a*b*r)2

1
take 40$前に置いてバイトを保存しますmap(" o"!!)<$>
Ørjanヨハンセン

3

31 28バイト

ハ、ハスクはゼリーを破っている!

†!¨↑¨↑40¡ȯẊȯ!ḋ118ḋėΘ`:0M#ŀ40

オンラインでお試しください!

説明と未ゴルフ

説明を追加する前に、これを少し説明します。まず、さまざまな構成を削除し、明示的な括弧を追加して、¨↑¨文字列を圧縮解除します。また、読みやすく説明40する4ために置き換えましょう。

†!"t "↑4¡(Ẋ(!ḋ118ḋė)Θ`:0)M#ŀ4  -- example input: [3]
                           ŀ4  -- lower range of 4: [0,1,2,3]
                         M     -- map over left argument
                          #    -- | count in list
                               -- : [0,0,0,1]
        ¡(              )      -- iterate the following indefinitely (example with [0,1,1,1])
                     `:0       -- | append 0: [0,1,1,1,0]
                    Θ          -- | prepend 0: [0,0,1,1,1,0]
          Ẋ(       )           -- | map over adjacent triples (example with  1 1 0
                  ė            -- | | create list: [1,1,0]
                 ḋ             -- | | convert from base-2: 6
                               -- | | convert 118 to base-2: [1,1,1,0,1,1,0]
                               -- | | 1-based index: 1
                               -- | : [1,1,0,1]
                               -- : [[0,0,0,1],[0,0,1,1],[0,1,1,1],[1,1,0,1],[1,1,1,1],[1,0,0,1],...]
      ↑4                       -- take 4: [[0,0,0,1],[0,0,1,1],[0,1,1,1],[1,1,0,1]]
†                              -- deep map the following (example with [1,1,0,1])
 !"t "                         -- | use each element to index into "t ": "tt t"
                               -- : ["   t","  tt"," ttt","tt t"]

2

Java、321文字

コマンドラインから引数として渡される入力。たとえば java R 38,39

これ以上難読化されたJavaコードを書いたことはありません:-)

class R{public static void main(String[]a) {
Integer s=40;boolean[]n,o=new boolean[s];
for(String x:a[0].split(","))o[s.valueOf(x)]=s>0;
for(Object b:o){n=o.clone();
for(int j=0;j<s;j++){
boolean l=j>1&&o[j-1],r=o[j],c=j+1<s&&o[j+1];
n[j]=!(l&c&r|l&!c&!r|!(l|c|r));
System.out.print((r?"X":" ")+(j>s-2?"\n":""));
}o=n;}}}

2

更新:ここでの正しい出力例(50行ではなく40行):以下の新しい出力(簡潔にするために以前のものを削除):

                                      xx
                                     xxx
                                    xx x
                                   xxxxx
                                  xx   x
                                 xxx  xx
                                xx x xxx
                               xxxxxxx x
                              xx     xxx
                             xxx    xx x
                            xx x   xxxxx
                           xxxxx  xx   x
                          xx   x xxx  xx
                         xxx  xxxx x xxx
                        xx x xx  xxxxx x
                       xxxxxxxx xx   xxx
                      xx      xxxx  xx x
                     xxx     xx  x xxxxx
                    xx x    xxx xxxx   x
                   xxxxx   xx xxx  x  xx
                  xx   x  xxxxx x xx xxx
                 xxx  xx xx   xxxxxxxx x
                xx x xxxxxx  xx      xxx
               xxxxxxx    x xxx     xx x
              xx     x   xxxx x    xxxxx
             xxx    xx  xx  xxx   xx   x
            xx x   xxx xxx xx x  xxx  xx
           xxxxx  xx xxx xxxxxx xx x xxx
          xx   x xxxxx xxx    xxxxxxxx x
         xxx  xxxx   xxx x   xx      xxx
        xx x xx  x  xx xxx  xxx     xx x
       xxxxxxxx xx xxxxx x xx x    xxxxx
      xx      xxxxxx   xxxxxxxx   xx   x
     xxx     xx    x  xx      x  xxx  xx
    xx x    xxx   xx xxx     xx xx x xxx
   xxxxx   xx x  xxxxx x    xxxxxxxxxx x
  xx   x  xxxxx xx   xxx   xx        xxx
 xxx  xx xx   xxxx  xx x  xxx       xx x
xx x xxxxxx  xx  x xxxxx xx x      xxxxx
xxxxxx    x xxx xxxx   xxxxxx     xx   x

別のパズルをやって、PHPのforループでステートメントをネストすることについて面白いことを学びました。時間があるときは、このスコアをかなり上回ることができます。現時点では、競争力のない408のままです。


私のPHPバージョン408文字:

これは素晴らしいパズルでした。言わなければならない魅力的なものであるので、私はまた入力で遊んでいる年齢を過ごしました。とにかく、ここに私のPHPバージョンがあります(投稿された回答のいくつかほど近くはありませんが、完全です。私のバージョンです:

<?php $a='38,39';$b='';$d=explode(',',$a);for($i=0;$i<40;++$i){$c=' ';
foreach($d as $k=>$v){if($v == $i){$c='x';}}$b.=$c;}echo $b."\n";
for($x=1;$x<41;++$x){$o='';for($i=1;$i<41;++$i){if(($i>1)AND(substr($b,$i-2,1)=='x')){
$l=1;}else{$l=0;}if((substr($b,$i-1,1))=='x'){$v=1;}else{$v=0;}if((substr($b,$i,1))=='x'){
$r=1;}else{$r=0;}if((($l+$v+$r)==2)OR(($v+$r)==1)){$o.='x';}else{$o.=' ';}}
echo $o."\n";$b=$o;}?>

あなたはそれを見ることができ、ここで実行できます:http : //codepad.org/3905T8i8

入力は、先頭の$ a = '38、39 'の入力文字列です。

出力は次のとおりです。

xx removed as was too long originally - had 50 lines, not 40 xx

あなたがそれを好き願っています!

PSスクロールバーでページ全体に表示されるように、すべてのコードを表示できるように、コードに改行をいくつか追加する必要がありました。


あなたの出力は50行あり
aditsu

ああ、それは私が終わって何が起こったのかを見てから遊んでいたからです。ルールを少し変更すると、このような興味深い影響があります。とにかくそれを今40に変えました、そしてそれを逃してすみません。
ポールドリューエット14

出力も変更したい場合があります:p
aditsu 14

出力を修正し、新しいコードパッドリンクを正しい値で追加しました。ありがとうございました。
ポールドリューエット14

2

スタックス、24 バイトCP437

╦♥µ╤u{£┬íQ<;▀ΦΣ╢╕╚äZ↕áû↑

オンラインで実行してデバッグします!

「1」セルにCP437のコードポイント1を使用します。

この言語の力を示す優れた事例。

説明

解凍されたバージョン(29バイト)を使用して説明します。

0]40X*,1&xDQ0]|S3B{:b^374:B@m
0]40X*                           Prepare a tape with 40 cells
      ,1&                        Assign 1 to the cells specified by the input
         xD                      Repeat the rest of the program 40 times
           Q                     Output current tape
            0]|S                 Prepend and append a 0 cell to it
                3B               All runs of length 3
                  {         m    Map each run with block
                   :b            Convert from binary
                     ^           Increment (call this value `n`)
                      374:B      The binary representation of 374
                                 [1,0,1,1,1,0,1,1,0]
                                 which is `01101110` reversed and prepended a 1
                           @     Element at 0-based index `n`

1

K(ngn / k)44 35バイト

{"X "39{(2\145)@2/'3'1,x,1}\^x?!40}

オンラインでお試しください!

{ } 引数付きの関数 x

!40 0〜39の整数のリスト

x?でインデックスを見つけ、見つからないx場合は0N(「整数null」)を使用します

^それらのどれがヌルですか?これにより、否定が入力されます

39{ }\ 39回適用し、中間結果をリストに収集します

1,x,1 リストを1で囲む(負の0)

3' 連続したアイテムのトリプル

2/' それぞれバイナリデコード

@ のインデックスとして使用...

2\145 バイナリエンコード145(否定ビット110)

"X "最後に、40x40行列を文字列のインデックスとして使用します"X "@ここは暗黙的です)


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