間に合いますか?


37

これに触発され

バックグラウンド

悪の農家が価格を押し上げるために、あなたの小麦畑を焼失することを決定しました。完全に破壊するために、彼はあなたの畑をガソリンに浸しました。さらに不幸なことに、あなたはたまたま畑に火がついたときに歩いていたので、生き残るためには素早く出なければなりません。

チャレンジ

小麦、火、およびあなたの場所を含む畑が与えられたら、時間内に畑から出せるかどうかを判断します。

畑は小麦(ここでは.)と火(F)で構成されています。ここであなたの場所はでマークされていOます。例えば:

...F...F
F.......
........
.F......
....O...
...F....
........
.F....F.

毎秒、隣接するセルに移動します(対角線上ではありません)。すべての火は隣接するすべてのセルに広がります。火事にならないセルに移動できない場合、あなたは死にます。野外に出れば生き残ります。この例で何が起こるか見てみましょう:

...F...F
F.......
........
.F......
....O...
...F....
........
.F....F.

..FFF.FF
FF.F...F
FF......
FFF.....
.F.F.O..
..FFF...
.F.F..F.
FFF..FFF

FFFFFFFF
FFFFF.FF
FFFF...F
FFFF....
FF.FF.O.
.FFFFFF.
FFFFFFFF
FFFFFFFF

FFFFFFFF
FFFFFFFF
FFFFF.FF
FFFFF.FF
FFFFFFFO
FFFFFFFF
FFFFFFFF
FFFFFFFF

FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFFO <-- you made it out and survived, barely
FFFFFFFF
FFFFFFFF
FFFFFFFF

ルール

  • 入力はグリッドとしてのフィールドです。行区切り記号または2D配列を含む文字列を含む、任意の入力形式を選択できます。
    • 入力として、火災および/またはあなた自身の場所を取ることはできません
    • 配列入力用の非文字列を含む、小麦、火、および自分の位置として3つの異なる値を使用できます。
    • フィールドのサイズは常に少なくとも1x1で、長方形で、無効な文字は含まれていません。
    • 任意のフィールドには、現在地を表す値が1つだけ含まれ、他のすべての位置は発砲される場合と発砲されない場合があります。
  • 出力は、通常のように、「生き残る」または「死ぬ」の2つの異なる値のいずれかです。
  • 標準の規則が適用されます。

テストケース

生き残った

O
....
.O..
....
FFFFF
.....
..O..
.....
FFFF
FFFO
FFFF
.F....
......
......
.F....
..O...
.FF...
.F....
..FF..
...F...F
F.......
........
.F......
....O...
...F....
........
.F....F.

生き残れなかった

FFF
FOF
FFF
F.F
.O.
F.F
....F
.....
..O..
.....
F....
.F....F.
........
........
F..O....
........
.....F..
...F...F
F......F
........
.F......
....O...
...F....
........
.F....F.
F..F
.O..
FF..

2
誰かがダウン投票した理由がわかりません
オリバーNi

3
両方のダウンボッターに、なぜ私の挑戦が悪いのか説明してください。
PurkkaKoodari

6
@DeadPossum私はそれが挑戦をあまりにも単純化し、少し広すぎるように感じるので。ただし、お気軽にご意見をお寄せください。他の人があなたに同意すれば、制限を変更するかもしれません。
PurkkaKoodari

2
Pietu1998に同意しますが、この制限は非常に適切であると感じています。
Mr Xcoder

2
@LuisMendo農夫が向きを変えたときに逃げることができる場合、彼/彼女は常に直線で逃げることができます。たとえば、農夫が畑の右側に逃げようとしているとしましょう。農夫が1スペース下に移動すると、いくらかの火災が下方に広がります。その後、農民の状況は初期位置と同じです(さらに火災が発生します)。
ジョンファンミン

回答:


28

カタツムリ、15バイト

\Oo!{.,fee7.,\F

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

1生存を0意味し、死を意味します。

火を追い越すことは不可能なので、それを回避しようとすることは決して役に立ちません。最適なルートは常に直線です。したがって、脱出ルートの選択肢は4つしかありません。方向が安全かどうかを判断するためにF、その方向を指している「ファイアコーン」内のすべてをチェックします。


1
O_oテストリンクを提供できますか?これは非常に短いようです。
ミスターXcoder

10
コードはほとんどと言っている:「オイ!」...「あー」...
マジックタコ壺

26
カタツムリは...火をoutrunning、あなたが知っている、のための完全な選択であるので
Timtech

6
@feersum「オンラインで試す」リンクで、次の3行の麦畑を試しました。これは死に違いないはずですが、プログラムは「F..F」、「。O ..」、「 FF ..」
Xantix


12

パイソン2283の 218 209 208バイト

lambda F:f(F)&f(F[::-1])
def f(F):l=F.split();w=len(l[0])+1;i=F.index('O');x,y=i/w,i%w;r=range(len(l));return all('F'in''.join(n)for n in[[l[i][x+abs(i-y):]for i in r],[l[i][max(0,y+x-i):i+x-y+1]for i in r]])

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

入力を改行で区切られた文字列として受け取りTrue/FalseDead/Alive

F外側を見て、怒りの各方向(udlr)をチェックすることで動作します:

例:

入力:

FFFFF
.....
..O..
.....

火災チェック:

Up:       Down:     Left:     Right:

FFFFF               F             F
 ...                ..           ..
  O         O       ..O         O..
           ...      ..           ..

すべての方向に火が含まれる場合、あなたは死にます。

編集:文字列を入力として使用することに戻り、上/右のみをチェックするようになりましたが、入力を逆方向にもチェックします(下/左に表示)

Xcoder氏Felipe Nardi Batistaのおかげで多くのバイトを節約できました


@FelipeNardiBatistaありがとう:)
TFeld


2

JavaScript、174バイト

a=>+(t=>g=a=>t--?g(a.map((l,y)=>l.map((c,x)=>(h=v=>[(a[y-1]||[])[x],(a[y+1]||[])[x],a[y][x+1],a[y][x-1],c].includes(v),!c&&h()?p=1:[2,0,1].find(h))))):p)((p=a+'!').length)(a)

入力形式:

  • 整数の配列の配列
  • 2の場合F、1の場合.、0の場合O

出力:

  • 生き残るための真の価値(1)
  • ダイの偽値(NaN)

それを試してみてください:

セルオートマトンを考えてみましょう。セルには3つの状態O(人が到達可能)、F(キャッチが発生)、.(何も起きなかった)があります。次世代を作成するためのルールは次のとおりです。

for each cell:
  me and my 4 neighborhoods,
    if anyone is `F` then result is `F`,
    otherwise, if anyone is `O` then result is `O`
    otherwise, keep state `.`

エッジにセルが存在するとO、人々は生き残ります。これが十分な量の世代で起こらなければ、人々は死にました。

// check for all neighbors:
h=v=>[(a[y-1]||[])[x],(a[y+1]||[])[x],a[y][x+1],a[y][x-1],c].includes(v)
// if me == 'O' and i'm edge (neighbors contain _undefined_), then survive
!c&&h()?p=1
// Otherwise apply the given rule
:[2,0,1].find(h)

2

オクターブ、71バイト

@(a)(A=blkdiag(0,a,0))<3||any((bwdist(A>2,'ci')>bwdist(A==2,'ci'))(!A))

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

または

すべてのテストケースを検証してください!

入力形式:

  • 整数の2D配列
  • 1以下のため.2O3F

出力:

  • true そして false

説明:

説明:

A=blkdiag(0,a,0)    % add a boundary of 0s around the array
A<3                 % return truthy when there is no fire
bwdist(A>2,'ci')    % city block distance transform of binary map of fire
bwdist(A==2,'ci')   % city block distance transform of binary map of your location
any(...)(!A)        % check if there is at least one element on the boundary of 
                    % the fire distance map has its distance greater than 
                    % that of distance map of your location

1

網膜、243バイト

^.*O(.|¶)*|(.|¶)*O.*$|(.|¶)*(¶O|O¶)(.|¶)*
O
m`^((.)*) (.*¶(?<-2>.)*(?(2)(?!))O)
$1#$3
m`^((.)*O.*¶(?<-2>.)*(?(2)(?!))) 
$1#
T`p`\O`#| ?O ?
+m`^((.)*)[O ](.*¶(?<-2>.)*(?(2)(?!))F)
$1#$3
+m`^((.)*F.*¶(?<-2>.)*(?(2)(?!)))[O ]
$1#
}T`p`F`#|.?F.?
O

オンラインでお試しください!背景は.s ではなくスペースである必要があります(または他の正規表現に対して安全な文字を使用できます)。説明:

^.*O(.|¶)*|(.|¶)*O.*$|(.|¶)*(¶O|O¶)(.|¶)*
O

Oエッジがある場合、他のすべてを削除します(サバイバルケース)

m`^((.)*) (.*¶(?<-2>.)*(?(2)(?!))O)
$1#$3

a #を既存の上の任意のスペースに配置しますO

m`^((.)*O.*¶(?<-2>.)*(?(2)(?!))) 
$1#

そして、#既存のの下の任意のスペースにO

T`p`\O`#| ?O ?

#sをOsに変更し、既存のの左右のスペースも変更しOます。

+m`^((.)*)[O ](.*¶(?<-2>.)*(?(2)(?!))F)
$1#$3

#sを既存Fのsの上に配置します。これらはO、スペースだけでなくs も上書きできます。

+m`^((.)*F.*¶(?<-2>.)*(?(2)(?!)))[O ]
$1#

#sを既存Fのsの下に配置し、s もOsとスペースを上書きします。

}T`p`F`#|.?F.?

#sをFsに変更しO、既存のの左側または右側のany またはspace も変更しFます。Fがすべてを消費するまで繰り返します。

O

そうでない場合は1、生存のために戻り0ます。

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