ゲームオブライフarrowlits


26

バックグラウンド

この挑戦はapsillersに敬意を表しており、彼は挑戦でBest of PPCG 2016の見た目ほど簡単でないカテゴリを獲得しました おめでとうございます!

「自己紹介」ページで、このユーザーはGame of Lifeセルラオートマトン用の本当にすてきなシミュレータを持っています。(真剣に、それをチェックしてみてください。)一方、aspillaは「arrowslit」のスペイン語です。これらの事実に照らして、この課題はGame of Lifeの矢じりについてです。

ゲームオブライフarrowlits

GoLでは、矢印をグライダーで表し、壁を一連のブロックで表します。単一のグライダーが上から壁に近づき、壁の隙間を通過しようとします(矢印が点灯)。あなたの仕事は、グライダーが矢印に照らされているか、壁に衝突するかを確認することです。

入力

入力は、GoL構成を表すビットのグリッドです。任意の妥当な形式(2つのdistict印刷可能なASCII文字の複数行文字列、文字列のリスト、整数の2D配列、ブール値の2D配列など)で使用できます。明確にするために、文字の複数行の文字列を使用します.#に、以下します。

入力には、いくつかのプロパティがあることが保証されています。最初は、その高さは2N一部のN≥6 、その幅が少なくともある2N + 2。入力はすべて.sになりますが、最上部の3行のどこかがグライダーであり、中央の2行にブロックの壁があります。グライダーは南西または南東に向かっており、その位置は、壁が取り外された場合、下端に到達する前にサイドエッジを通過しない(ただし、グリッドのコーナーに到達する)ような位置です。グライダーは、最初に少なくとも1ステップ.s だけ左右の端から分離されます。どのフェーズでもかまいません。

壁は、1列の.sで区切られたブロックで構成されますが、1つの場所を除き、少なくとも2列の.s で区切られます。グライダーのように、左端と右端のブロックも、.sの1ステップだけエッジから分離されています。常に左端に少なくとも1つのブロックがあり、右端に1つのブロックがあります。

有効な入力グリッドの例を次に示します。

....#......................
..#.#......................
...##......................
...........................
...........................
...........................
.##.##............##.##.##.
.##.##............##.##.##.
...........................
...........................
...........................
...........................
...........................
...........................

出力

述べたように、あなたの仕事は、グライダーが壁に衝突するか、南端に到達するかを判断することです。この課題の目的上、シミュレーションの後半で何が起こっても、構成が単一のグライダーとブロックの壁で構成されなくなった場合、クラッシュが発生します。次の図は、南東のグライダーが2つの異なるフェーズでクラッシュすることなく通過できる最小のギャップを示しています(南西のグライダーの状態は対称的です)。

...#...........
.#.#...........
..##...........
...............
...............
##...........##
##...........##

...#...........
....#..........
..###..........
...............
...............
##...........##
##...........##

グライダーが壁を飛んでいる場合、真実の値を出力し、そうでなければ偽の値を出力します。上記の例では、グライダーが壁の左側に衝突するため、正しい出力は偽物です。

この課題のために、2 *(height-3)の入力でGoLをシミュレートすると仮定できます。ステップ、グライダーは期待される位置の一番下の行にあり、壁は無傷で、出力は真実であると仮定できます。

ルールとスコアリング

完全なプログラムまたは関数を作成できます。最も低いバイトカウントが優先されます。

テストケース

テストケースは非常に大きいため、GitHubリポジトリに収集しました。個々のファイルへのリンクは次のとおりです。


入力に壁の下の空の行を含める理由はありますか?
マーティンエンダー

@MartinEnder入力でGoLを実際にシミュレートするソリューションを実行可能にします(少なくともそうすることを望みます)。
ズガルブ

グライダーは常に一番上の行から始まりますか?
ロッド

@Rodはい、それは南西または南東に向かう一番上の行にあります。
-Zgarb

人生の別のゲーム:P
クリストファー

回答:


15

パイソン2142の 136 135バイト

ElPedroのおかげで-6バイトTuukkaXのおかげで
-1バイト

p=input()
z=p[2].index(1)
m=(p[1][z]-p[1][z+1]<1)*2-1
k=i=0
for b in p[3:]:x=p[2][::m].index(1)+i;k|=1in b[::m][x-2:x+8];i+=1
print 1-k

オンラインでお試しください!またはすべてのテストケースを検証する

方向の確認(東/西):

西東
使用z=p[2].index(1)(赤四角で表される)3行目の最初の正方形を取得し、その後、m=(p[1][z]-p[1][z+1]<1)*2-1左の一方(青)から右(緑)上の値を減算し、このように行くされているすべての4つのグライダー状態南西は1(画像の一番上の行)になり、南東に行くものは0またはになり-1ます。
次に、変換します。1 -> -1また0,-1 -> 1、パラメータで使用して、西のリストを処理するときにリストを逆にします。このようにして、南西に行くグライダーは南東に行くグライダーと同じように脅かされます。

グライダーの動き

滑空
これは南東に向かうグライダーが行う動きで、「はしご」パターンがあり、3行目の左端のブロックはすべてのパターンで一定です。これを開始点として使用して、周囲の左右の3ブロックと中央の4ブロックの1s(壁)の存在を確認します。
矢印
arrowslits_path


変数iをループの0外側に設定し、for各パスに1を追加して、削除することで4バイトを失う可能性があると思いますenumerate。私があなたのTIOで試してみたときに機能しているようです。私が正しいか間違っているかに関わらず、クールな答えを得るために+1。
エルペドロ

いいね!から空白を削除して、バイトを保存できます1 in。+1。
-Yytsi


4

オクターブ、123 122 108バイト

@LuisMendoのおかげで2バイト節約

B=A=input("");B(1:3,:)=0;do;until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5;any(A(end,:))

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

または

すべてのテストケースを検証する

Rodがテストケースを準備してくれてありがとう。

B=A=input("");
B(1:3,:)=0;
do
until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5
any(A(end,:))

前の答え:

B=A=input("");
B(1:3,:)=0;
while nnz(A~=B)==5
    s=conv2(A,(m=-1:1)|m','same');
    x=~A;
    A&=~A|~(s<2|s>3);
    A|=x&s==3;
end;
any(A(end,:))

最初に変数として壁パターンを抽出しますB
壁のパターンとシミュレートされたパターンのセルが5種類以上になるまでGoLシミュレーションを実行します。
グライダーが最後の行を受け取った場合、関数はtrueを返します。


1
壁のパターンとシミュレートされたパターンのセルの数が5個より多い/少ないまで。それは賢いです!
ルイスメンドー

@LuisMendoありがとう、救われました
rahnema1

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