ゴルフパターソンワームズ


11

パターソンのワームは、無限の三角形のグリッド上に存在するセルオートマトンの一種であり、すべてのステップで、ある方向に回転し、1つのユニットを移動します。彼らが定義している特性は、同じ場所を2回通過することは決してできないということです。同じ環境に出会うと、同じ決定を下します。ワームは、尾を3に配置し、頭をこの六角形の中心に配置して、常に独自の視点から「認識」します。

ウィキペディアからの画像

たとえば、次のルールを持つワームを考えます。

  1. 0、1、2、4、および5がすべて空白の場合、方向2に移動します
  2. 0、1、4、および5が空白で、2が満たされている場合、方向0に移動します
  3. 0、1、および5が空白で、2および4が満たされている場合、方向0に移動します

これにより、次のパスが得られます(Wikipediaから)。

ワームパス

ワームは、周囲がすべて満たされている状況で自分自身を見つけると、終了します。

入力

数字のリスト。n番目の数字は、ワームが遭遇するn番目の新しい状況で、判断を下さなければならない場合にどのような判断を下すべきかを示しています。周囲の1つを除くすべてが満たされている場合、空の方向にのみ移動する必要があることに注意してください。これは「決定」としてカウントされず、数値を消費しません。上記のワームの例を生成するには、入力はになります[2, 0, 0]。入力はワームを生成することが保証されており、ワームは終了し、パスをリトレースしません。また、入力が短すぎることはありません。

出力

から始まるワームの頭の位置を示す座標のリストを出力し(1, 0)ます。上に移動して右に移動するとy値のみが減少し、上に移動して左に移動するとx値が減少してy値が減少することを考慮します。たとえば、入力例のパスの出力は次のとおりです。

(1, 0), (1, 1), (0, 0), (-1, -1), (0, -1), (0, 0), (0, 1), (-1, 0), (0, 0)

テストケース

javascriptスニペットを使用して、テストを実行することもできます。

[2,0,0]: (1,0),(1,1),(0,0),(-1,-1),(0,-1),(0,0),(0,1),(-1,0),(0,0)
[1,0,4,0,1,5]: (1,0),(2,1),(2,2),(1,2),(0,1),(0,0),(0,-1),(1,-1),(2,0),(2,1),(3,1),(4,2),(4,3),(3,3),(2,2),(1,1),(1,0),(2,0),(3,1),(3,0),(4,0),(5,1),(5,2),(4,2),(3,2),(2,1),(1,1),(0,0),(-1,0),(-2,-1),(-2,-2),(-1,-2),(0,-1),(1,0),(1,-1),(2,-1),(3,0),(4,1),(4,2),(5,3),(5,4),(4,4),(3,3),(3,4),(2,4),(1,3),(1,2),(1,1),(0,1),(-1,0),(-1,1),(-2,1),(-3,0),(-3,-1),(-2,-1),(-1,-1),(0,0)
[1,0,5,1]: (1,0),(2,1),(2,2),(1,2),(0,1),(0,0),(0,-1),(1,-1),(2,0),(2,1),(3,2),(3,3),(2,3),(1,2),(0,2),(-1,1),(-1,0),(0,0),(1,1),(1,2),(1,3),(0,3),(-1,2),(-1,1),(-2,0),(-2,-1),(-1,-1),(0,0)
[2,0,1,0]: (1,0),(1,1),(0,0),(-1,-1),(0,-1),(0,0),(-1,0),(-1,-1),(-1,-2),(0,-1),(1,0),(2,1),(1,1),(0,1),(0,0)

次の急いで組み立てられた(おそらくバグのある)プログラムは、ワームを表示します。


2
推奨されるテストケース:p(これは[1,0,4,2,0,1,5]。)
Arnauld

入力を逆順にすることはできますか?
アーナルド

1
@Arnauld確認OK思われる
soktinpk

回答:


4

JavaScript(ES6)、 261 250  249バイト

入力リストを逆順に取得します。ペアのリストを返します。[x,y]

a=>(G=[[[x=1]]],v=[0,1,1,0,-1,-1],F=y=>[[x,y],...v.every((_,i)=>k^=g(o+i)[q%3]<<i,k=63,g=o=>(r=G[Y=y-o%2*v[q=(o+3)%6]]=G[Y]||[])[X=x-o%2*v[-~q%6]]=r[X]||[])?F(y+v[g(o+=F[k]|=1/F[k]?0:k&~-k?a.pop():31-Math.clz32(k))[q%3]=1,o%6],x+=v[-~o%6]):[]])(o=0)

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

これは基本的にデモスニペットの移植版です。


4

K(ngn / k)、115バイト

D,:-D:2\6 3;f:{d::0;m::2/=6;X::(!6),x;{m::?m,p:2/^(+':x)?(2*h:*|x)+/:D 6!d+!6;$[(~p)|^c:X m?p;x;x,,h+D 6!d+:c]}/,1 0}

(関数の命名部分をカウントしません、f:

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

D,:-D:2\6 3 6つの基本方向を生成します (1 0;1 1;0 1;-1 0;-1 -1;0 -1)

d::0 は現在の方向で、インデックスmod 6として使用されます D

m::2/=6初期ワームメモリを生成します32 16 8 4 2 1。各数値のビットは周囲をエンコードします(0 =訪問セグメント; 1 =訪問なし)。最初mは明確な周囲のみを含みます-単一の出口が利用可能な周囲です。

X::(!6),xワームのルールです。の最初の0 1 2 3 4 5明確な環境に合わせて追加しmます。

{... を含む1要素のリストで始まる}/,1 0関数を収束するまで適用します。リストには、ワームが訪れた座標のペアが含まれます。{ }1 0

D 6!d+!6d時計回りから始まり時計回りに進む6つの基本方向

h:*|x 引数の最後、つまりワームの頭の位置

(2*h:*|x)+/:D 6!d+!6頭の座標に2を掛け、基本方向を追加します。これは、ポイント間のセグメントを表すための私たちの方法です。

+':x 隣接する訪問ポイントのペアを追加します-これにより、それらの間のセグメントの表現が得られます

^(... )?...頭部のどのセグメントがまだ訪問されていないかを調べる

p:2/ バイナリエンコードおよび割り当て p

m::?m,pに追加しmて個別に保持します。つまり、で発生しない場合pmのみ追加しますpm

$[... ;... ;... ]if-then-else

c:X m?ppin のインデックスを見つけて、mそれをin のインデックスとして使用しXます。範囲外のインデックス作成の結果0N(「null」)

$[(~p)|^c:X m?p;x;... ]あればp0(出口経路)であるかcである0N、戻りx収束を強制し、ループを停止します

x,,h+D 6!d+:cそれ以外の場合は、新しいヘッドを追加しxて繰り返します

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