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


24

Wireworldは、ワイヤを流れる電子に似るように設計されたセルオートマトンです。そのシンプルなメカニズムにより、デジタル回路を構築できます。それはコンピュータ全体の構築さえ許可しました。

あなたの使命は、選択した言語で最短のWireworld実装を作成することです。

グリッド内の各セルには、4つの状態のうち1つがあります。4つの状態は、「ブランク」、「銅」、「電子ヘッド」、または「電子テール」です。

  • 空白のセルは常に空白のセルのままです
  • 電子ヘッドは常に電子テールになります
  • 電子の尾は常に銅になります
  • 銅のセルは、8つの隣接セルのうち1つまたは2つが電子ヘッドである場合に限り、電子ヘッドになります。

このコンペティションは、Shortest Game of Lifeコンペティションと同様のスタイルを持ちますが、いくつかの変更があります。

  • グリッドは少なくとも40 x 40セルでなければなりません
  • グリッドのエッジは、(トーラスではなく)ラップアラウンドしてはいけません。フィールドの外側のセルを常に「空白」として扱います。
  • ユーザーが独自の開始構成を入力できる必要があります。
  • 空白の画面を見つめるのは楽しいことではありません。プログラムは、実行中のシミュレーションを視覚的に表示する必要があります。

これはコードゴルフで、最少バイトが勝ちます。

回答:


6

APL、Dyalog(131)

{h t c←1↓⍵∘=¨F←' htc'⋄⎕SM∘←1 1,⍨⊂N←F[1+⊃+/H h(t∨c≠H←c∧S↑1 1↓1 2∊⍨⊃+/+/K∘.⊖(K←2-⍳3)∘.⌽⊂¯1⌽¯1⊖h↑⍨2+S←25 79)ר⍳3]⋄∇N⊣⎕DL÷4}↑{79↑⍞}¨⍳25

出力が⎕SMウィンドウに表示されます。シミュレーションは無限に実行されます。これは⎕SMウィンドウのデフォルトサイズであるため、グリッドは79x25です。電子ヘッドはh、尾はt、銅はcです。プログラムは、25行としてキーボードから開始構成を読み取ります。

説明:

  • ↑{79↑⍞}¨⍳25:79x25グリッドを読む
  • h t c←1↓⍵∘=¨F←' htc':3つのマトリックスを取得します。1つはヘッド、1つはテール、もう1つは銅です。また、Fを文字列に設定します' htc'

  • ⎕SM∘←1 1,⍨⊂N←F[1+⊃+/... ר⍳3]:「...」部分は長さ3のベクトルで、要素はそれぞれ新しいヘッド、テール、銅を示す行列です。頭に1を、尾に2を、銅に3を掛け、これらの行列を合計して1を加算し、インデックスの行列をに与えFます。N入力と同じ形式の新しい状態になり、⎕SM画面の左上隅から表示されます。

  • ¯1⌽¯1⊖h↑⍨2+S←25 79:空白の境界線を追加hするには、2行と2列ずつ拡大し、右と下に1つずつ回転します。

  • ⊃+/+/K∘.⊖(K←2-⍳3)∘.⌽⊂:マトリックスを8方向すべてに回転させてから、結果のマトリックスを合計して、各位置の先頭である隣接ノードの量を求めます

  • 1 2∊⍨:1つまたは2つの隣人がいる位置のみを1に設定します。

  • S↑1 1↓:以前に追加した境界線を削除します。

  • H←c∧:新しいヘッドは、1つまたは2つのヘッドネイバーを持つすべての銅セルです。

  • t∨c≠H:新しい銅製セルはすべて古いテールであり、ヘッドになっていないすべての古い銅製セルです。

  • H h(... ):新しいヘッドはH上で計算されたものであり、新しいテールは古いヘッドであり、新しい銅セルは上で計算されたものです。

  • ∇N⊣⎕DL÷4:1/4秒待ってから、関数を再度実行しますN


40 x 40のグリッドを含めることができれば良いと思います。
mbomb007

6

アルパカ、82文字

ALPACAは、セルオートマトン用に特別に設計された言語です。

oは何もない; cは導体です。eは電子です。tは電子の尾です。

state o " ";
state c "c" to e when 1 e or 2 e;
state e "e" to t;
state t "t" to c.

この言語はいつリリースされましたか?言語のリンクはありますか?
オプティマイザー

@Optimizerどうぞ私は言語を作りませんでした。
DanTheMan

4
クール。適切な課題に適切な言語..
オプティマイザー

4

GolfScript(125 120 105 100文字)

n%{.,,{1${.0=,:w[1,*]\+2*>3<}:^~`{zip^''+.4=5%'`X '@{+}*(7&1>'iX'>+=}+w,%}%"\033[H\033[J"@n*+puts 6.?.?}do

\033リテラルESC文字に置き換えることができるため、1文字としてカウントしていることに注意してください。これはANSI制御コードを使用するため、互換性のあるttyに依存しています。また、入力グリッドからフレームが印刷されることに注意してください。

また、Moore近傍を使用するSum of gridsの生成といくつかのオーバーラップがあります。

エンコード:空白=> ; 電子ヘッド=> i; 電子テール=> `; 銅=> X

反復間の一時停止は、46656 46656の計算に必要な時間です。6.?.?別の式に変更すると、速度を制御できます。同じ文字数で次に遅いのはで7.?.?、これははるかに遅いです(出力は22倍の大きさであり、線形複雑度の計算ではありません)。

テストケースのために、私は使用しています

`iXXXXXXXXX
X   X      
   XXX     
X   X      
i`XX XXXXXX

ロゼッタコードから Wireworldチャレンジから。


3

Python 371 341文字

ええ、それほど短くはありませんが、インタラクティブなGUIがあります!

import matplotlib.pylab as l,scipy.ndimage as i
r=round
w=l.zeros((40,40),int)-1
p=l.matshow(w,vmax=2)
c=p.figure.canvas
def h(e):
 try:w[r(e.ydata),r(e.xdata)]=[0,2,-1][e.button-1]
 except:x=i.convolve(w==2,l.ones((3,3)),int,'constant');w[:]=w/2+((w==0)&(x>0)&(x<3))*2
 p.set_data(w);c.draw()
c.mpl_connect('button_press_event',h)
l.show()

手順:

左マウスボタンでクリックしてワイヤを配置します

マウスの右ボタンでクリックしてクリアします

マウスの中ボタンをクリックして、電子ヘッドを配置します

軸の外側をクリックして、オートマトンをステップ実行します


(x>0)&(x<3)-> (0<x<3)。:)
beary605

3

パイソン(243 214)

使いやすさとキャラクターをクロスさせようとしました。グリッドは40x40です。入力は標準入力に与えられます。電子ヘッドはh、電子テールはt、銅はc、その他は空白です。

import os
f=raw_input()
while 1:f=''.join('h'if(i=='c')&(0<sum(1 for i in[-1,1,-39,-40,-41,39,40,41]if f[e+i:e+i+1]=='h')<3)else't'if i=='h'else'c'if i=='t'else f[e]for e,i in enumerate(f));os.system('cls');print f

whileループ(3行目)は圧縮されていません(コード内に配置すると機能しません):

while 1:
 for e,i in enumerate(f):
  if(i=='c')&(0<sum(1 for i in[-1,1,-39,-40,-41,39,40,41]if f[e+i:e+i+1]=='h')<3):f[e]='h'
  elif i=='h':f[e]='t'
  elif i=='t':f[e]='c'
  else:f[e]=f[e]  #redundant, but Python needs this to run
 os.system('cls') #cls is shorter than clear, so I used that
 print f

行5〜7を単一の式で置き換えることができると思いますg[e]='h'if(t=='c')&...else't'if i=='h'else'c'if i=='t'else i。それが正確に機能するかどうかは
わかり

2

C、355 347 300 294文字

編集:必要ないことに気づいた feof()

編集:47文字を保存しました!スリープを削除し、ほとんどすべてのブレースを取り除き、多くの操作を組み合わせました。

編集:私は300文字を壊したので、今日最後。変更printfputs、最初の比較でかわいい最適化を見つけました。

Cはこの種の問題にはあまり適していませんが、ゴルフは楽しいです。これはかなりブルートフォースの実装ですが、どこまでゴルフできるかを見たかったのです。

入力はという名前のテキストファイルですi*銅、+電子ヘッド、-電子テール、空のセルのスペースを含む開始状態の表現が含まれています。テストのためにWikiページのXORゲートを使用しています。

   ****-+**
  +        ******
   -*******      *
                ****
                *  *****
                ****
   ********      *
  +        ******
   -****+-*

char*p,t[42][42],s[42][42];
main(i,r,c,n,j)
{
  for(p=fopen("i","r");fgets(s[i++]+1,40,p););

  for(;;getch(),memcpy(s,t,1764))
    for(j=1;j<41;puts(s[j++]+1))
      for(i=1;i<41;)
      {
        p=t[j]+i;
        r=s[j][i++];
        *p=r==43?45:r;
        if(r==45)
          *p=42;
        if(r==42)
          for(r=-1,n=0;r<2;++r,*p=n&&n<3?43:42)
            for(c=-2;c<1;)
              n+=s[j+r][i+c++]==43;
      }
}

cond?43:42書くことができます42+(cond)か?そして、私は確信しているr=s[j][i++];*p=r==43?45:r;if(r==45)*p=42;に低減することができr=s[j][i++];*p=r==43?45:r==45?42:r;ていない場合にr=s[j][i++]-43;*p=!r?45:r==2?42:r;
ピーター・テイラー

1

Python、234 218文字

import time
I=input
C=I()
H=I()
T=I()
R=range(40)
while 1:
 for y in R:print''.join(' CHT'[(C+H+2*T).count(x+y*1j)]for x in R)
 H,T=[c for c in C if 0<sum(1 for h in H if abs(c-h)<2)<3and c not in H+T],H;time.sleep(.1)

ボードを、銅のセル(頭と尾のリストを含む必要があります)、頭、および尾の座標を表す複素数の3つのリストとして入力します。以下に例を示します。

[3+2j+x for x in range(8)] + [3+4j+x for x in range(8)] + [11+3j+x for x in range(6)] + [2+3j]
[3+2j]
[2+3j]

eval入力なので、複素数のリストに任意の複雑な式を使用できることに注意してください。


1

QBasic、309バイト

警告:ゴルフバージョンはユーザーフレンドリーではありません:奇妙な入力メソッドを持ち、無限ループとして実行され、遅延がありません(したがって、一部のシステムでは実行速度が速すぎます)。QBasic環境でプログラムを終了する方法を知っている場合にのみ実行してください。無償版が推奨されます(以下を参照)。

INPUT w,h
SCREEN 9
FOR y=1TO h
FOR x=1TO w
PSET(x,y),VAL(INPUT$(1))
NEXT
NEXT
DO
FOR y=1TO h
FOR x=1TO w
SCREEN,,0
c=POINT(x,y)
d=c
IF c=7THEN d=1
IF c=1THEN d=6
IF c=6THEN
n=0
FOR v=y-1TO y+1
FOR u=x-1TO x+1
n=n-(POINT(u,v)=7)
NEXT
NEXT
d=7+(n=0OR n>2)
END IF
SCREEN,,1,0
PSET(x,y),d
NEXT
NEXT
PCOPY 1,0
LOOP

実行するには、入力プロンプトで構成の幅wと高さを指定しますh1次にw*h、セルに1桁のコードを入力します(左から右、上から下に移動)。

  • 0 =空
  • 6 =ワイヤー
  • 7 =信号ヘッド
  • 1 =シグナルテール

すべてのセルを入力すると、シミュレーションが開始されます(プログラムを強制終了するまで永久に続行されます)。

非ゴルフ

よりユーザーフレンドリーなバージョン。レイアウトを変更するにはDATA、最後にステートメントを変更します。

コードはPOINT、画面からピクセルの色の値を読み取る関数を利用します。これは、セルを配列として個別に保存する必要がないことを意味します。すべてのセルが同時に更新されるように、2番目の「ページ」で更新を実行します。SCREENステートメントのバージョンを使用してアクティブなページを切り替え、ステートメントを使用してあるページのコンテンツを別のページにコピーできますPCOPY

SCREEN 9

EMPTY = 0 ' Black
HEAD = 7  ' Light gray
TAIL = 1  ' Blue
WIRE = 6  ' Brown/orange

' First two data values are the width and height
READ w, h
' The rest are the initial configuration, row by row
' Read them and plot the appropriately colored pixels
FOR y = 1 TO h
  FOR x = 1 TO w
    READ state$
    IF state$ = "" THEN value = EMPTY
    IF state$ = "H" THEN value = HEAD
    IF state$ = "T" THEN value = TAIL
    IF state$ = "W" THEN value = WIRE
    PSET (x, y), value
  NEXT x
NEXT y

' Loop the simulation until user presses a key
DO UNTIL INKEY$ <> ""
  ' Store current time for delay purposes
  t# = TIMER

  FOR y = 1 TO h
    FOR x = 1 TO w
      ' Active page = display page = 0
      SCREEN , , 0
      ' Get the color value of the pixel at x,y
      oldVal = POINT(x, y)
      IF oldVal = EMPTY THEN
        newVal = EMPTY
      ELSEIF oldVal = HEAD THEN
        newVal = TAIL
      ELSEIF oldVal = TAIL THEN
        newVal = WIRE
      ELSEIF oldVal = WIRE THEN
        neighbors = 0
        FOR ny = y - 1 TO y + 1
          FOR nx = x - 1 TO x + 1
            IF POINT(nx, ny) = HEAD THEN neighbors = neighbors + 1
          NEXT nx
        NEXT ny
        IF neighbors = 1 OR neighbors = 2 THEN
          newVal = HEAD
        ELSE
          newVal = WIRE
        END IF
      END IF
      ' Active page = 1, display page = 0
      SCREEN , , 1, 0
      ' Plot the new value on page 1
      PSET (x, y), newVal
    NEXT x
  NEXT y

  ' Copy page 1 to page 0
  PCOPY 1, 0

  ' Delay
  WHILE TIMER >= t# AND t# + 0.2 > TIMER
  WEND
LOOP

DATA 8,5
DATA T,H,W,W,W,W,W,W
DATA W, , , ,W, , , 
DATA  , , ,W,W,W, , 
DATA W, , , ,W, , , 
DATA H,T,W,W, ,W,W,W

1幅と高さの最大値は、使用する画面モードによって異なります。ではSCREEN 9、幅は最大638、高さは最大348です。SCREEN 7解像度は小さくなります(最大構成サイズ318 x 198)が、ピクセルが大きくなり、見やすくなります(DOS QBasicまたはDOSBoxエミュレーター-残念ながらQB64のみ)より小さなウィンドウを提供します)。

実行例

画面モード7のarchive.orgのゴルフバージョン:

QBasicのWireworld

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