私の刑務所は安全ですか?


58

あなたの挑戦には、囚人のいずれかが逃げることができるかどうかを判断するための刑務所レイアウトの入力が与えられます。

入力

入力は、入力が、この場合、3つの文字で構成されますなどのアレイの列、アレイ、アレイのような任意の妥当な形式であってもよく#Pそしてスペース。入力には3文字すべてが含まれているとは限りません。

  • #: 壁
  • P:囚人
  • スペース:空のスペース

入力例は次のようになります。

#####
#   #
# P #
#   #
#####

出力

刑務所が安全かどうかの真偽値。刑務所は、すべての囚人を収容できる場合にのみ安全です。囚人が逃げることができれば安全ではありません。

囚人は、壁に完全に囲まれていない場合、逃げることができます。対角結合は完全に囲まれています。

テストケース

############# Truthy
# P #  P#   #
#   #   # P #
#############

############# Truthy
# P    P    #
#   #   # P #
#############

############# Falsey
# P #  P#   #
#   #   # P #
########## ##

####          Truthy
#   #
 #   #
  # P ####
  ####

P             Falsey

###           Falsey
# #
# #
### P

8
これは重複しているか、少なくとも同様の課題であると感じています。とにかく良い挑戦。
ジョンドヴォルザーク

2
@JanDvorakかもしれませんが、私の限られたGoogle Fuでは重複を見つけることができませんでした。
TheLethalCoder

2
関連(2Dグリッドに洪水を埋める)
エソランジングフルーツ

3
脱出するために水平と垂直の両方の動きが必要なFalseyの例があるといいでしょう。
xnor

2
@tfbninja実際には複製ではありません。その人は、与えられたデータからプログラムを外挿して、単語がボックス内にあるかどうかを判断するように要求します。これは、マークされた値を保持する囲まれていないスペースがあるかどうかを確認するBFSフラッドフィルです。
ハイパーニュートリノ

回答:


54

カタツムリ、13バイト

!(t\P(o\ ),o~

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

0安全でない刑務所用の印刷物と、安全な刑務所用の入力の境界ボックスのサイズ。

アイデアは、a Pから境界外のセル(~)までのパスを見つけられないことを保証することoです。tかかわらず、我々は試合をしようとするところ、それは見つけるために、すべての可能な開始位置を試みるようにテレポートですP


23
適切なツール。
ジョナサンアラン

16

C#(.NETコア)485の480 474 470 421 408バイト

絶対に間違ったツールとアプローチですが、それでも...

  • TheLethalCoderの便利なヒントで7バイト(およびそれ以上)節約されました。
  • 整数を返すことで4バイト節約されました。
  • 比較で置き換えること' 'により32、TheLethalCoderのおかげで(もう一度)おかげで、さらに4バイト節約できました。
  • コードのリファクタリングにより節約された大量のバイト。
  • TheLethalCoderのおかげで(推測する人は?):)私は彼のヒントを忘れ続け、彼はそれらを思い出させ続けます。
m=>{var p='P';int a=m.Length,b=m[0].Length,i=0,j,x,y;var c=new System.Collections.Stack();for(;i<a;i++)for(j=0;j<b;j++)if(m[i][j]==p)c.Push(new[]{i,j});while(c.Count>0){var t=(int[])c.Pop();x=t[0];y=t[1];if(x<1|x>a-2|y<1|y>b-2)return 0;foreach(var v in new[]{-1,1}){var z=x>0&x<a-1&y>0&y<b-1;if(z&m[x+v][y]==32){m[x][y]=p;c.Push(new[]{x+v,y});}if(z&m[x][y+v]==32){m[x][y]=p;c.Push(new[]{x,y+v});}}}return 1;}

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

基本的に、空白がレイアウトの境界に到達する(または到達しない)まで、Pの位置を拡張します。

一部のライセンス:

  • char[][]レイアウトの入力としてaを使用します。
  • 0安全でないと安全1として返します。

関数に余分な入力をすることはできませんので、次元を仮定することができます...そうでなければ私を説得するメタ投稿を見つけることができない限り。
TheLethalCoder

1>0および1<0は、trueおよびより短いfalse
TheLethalCoder

1
==0なることができます<1か?少なくとも1バイトの無関係な空白があります。new[]s を削除できますか?(常に動作するわけではありませんが、のように動作する場合がありますint[] n = {1,2,3};)。
TheLethalCoder

1
{m[x][y]= p; c.Push(new[]->{m[x][y]=p;c.Push(new[]
TheLethalCoder

1
charsとints を比較して、==' 'to ==32を置き換えてバイトを節約できると思います。同様の比較でもこれを行うことができるはずです。
TheLethalCoder

15

Perl 5、69バイト

@Grimyのおかげで-10バイト。

@Neilのおかげで-2バイト。

77バイトのコード+ -p0フラグ。

/
/;$_=s/(P| )(.{@{-}})?(?!\1)(?1)/P$2P/s?redo:!/\A.*P|P.*\Z|^P|P$/m

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

いくつかの短い説明:
アイデアが入れてあるP囚人が行くことができるどこでも。いずれかの場合はP最初/最後の行、または最後の/最初の列にあり、その後、囚人たちはそこに行くことができますし、刑務所を意味し、そのためのエスケープは、安全ではありません。
s/(P| )(.{@{-}})?(?!\1)(?1)/P$2P/saの右側または下のスペースPをa P、またはaの左側または上部のスペースを置き換えPます。
最後に、/\A.*P|P.*\Z|^P|P$/m行がで始まるか終了するかP、またはP最初または最後の行にがあるかどうかを確認します。


正規表現を使用したクールなアプローチ!(ただし、スペースが大きくなるとおそらく非常に高価になります)
オリビエデュラック

実は、そうではありませんという非効率的。特に、多くのバックトラッキングを必要とせず、ありません、*または+できる最長の一致は行のサイズです...もちろん、たとえば配列に基づいて、より手動のアプローチと比較した場合、はい、それは非常に非効率的です!
ダダ

1
2つの置換をマージすることにより、-6バイト:s/P(.{@{-}})? | (.{@{-}})?P/P$1$2P/s
グリムミー

1
-マージされた置換をゴルフで2バイト:s/(P| )(.{@{-}})?(?!\1)(?1)/P$2P/s
グリムミー

2
正規表現の@Grimy非常に素晴らしいゴルフ!ありがとう:)
ダダ

7

JavaScript(ES6)、134 133バイト

入力を文字の配列の配列として受け取ります。0(安全でない)または1(安全な)を返します。

f=a=>a.map((r,y)=>r.map((c,x)=>c>'O'&&[-1,1,0,0].map((X,i)=>(R=a[y+1-'1102'[i]])&&R[X+=x]?R[X]<'!'?R[o=2,X]=c:0:o=0)),o=1)|o&2?f(a):o

テストケース


することができます&&sがちょうどこと&
TheLethalCoder

@TheLethalCoder最初のものではなく、2番目のものをに置き換えることができます|。ありがとう!
アーナルド

スプレッド演算子が文字列に作用することを知りませんでした。クール!
aebabis

6

JavaScript(ES6)、121バイト

f=s=>s==(s=s.replace(eval('/( |P)([^]{'+s.search`
`+'})?(?!\\1)[ P]/'),'P$2P'))?!/^.*P|P.*$/.test(s)&!/^P|P$/m.test(s):f(s)

入力を改行区切りの長方形の文字列として受け取ります。安全でない場合は0、安全な場合は1を返します。Failing Castlesの検出に対する私の答えに基づきますが、脱獄した囚人を刑務所の探索を終えた後ではなく、各ステップでテストする方が効率的です。



2

APL(Dyalog Classic)、40バイト

{⊃2≠(××{1⊃⌈/⍵,⍉⍵}⌺3 3)⍣≡(⌽1,⍉)⍣4'# '⍳⍵}

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

'# '⍳⍵エンコード'#'' ''P'0 1 2として

(⌽1,⍉)⍣4 1で囲む

(××{1⊃⌈/⍵,⍉⍵}⌺3 3)⍣≡ ゼロ以外のセルの最大隣接フラッドフィル

⊃2≠ 左上に2はありませんか?


1

スタックス、35 バイトCP437

ä¬my■╡╤▲l@┤êr*⌠\¶ƒläå─▄¶√¿ [Uy⌠Só4↔

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

もちろん、経路探索を処理する内部構造のないゴルフ言語もこれを行うことができます!

説明

解凍形式を使用して説明します。

zLz]Y+Mys+y+{{{" P|P ""PP"Rm}Y!My!Mgphh' =
zLz]Y+Mys+y+                                  Surround the original matrix with four borders of whitespaces
            {                      gp         Iterate until a fixed point is found, return the single fixed point
             {              }Y!               Store the block in register Y and execute it
              {" P|P ""PP"Rm                  For each row, flood every space adjacent to a P with P.
                               My!            Transpose the matrix and do the flooding again
                                     hh' =    The final matrix has a space on the upper left corner that has not been flooded by P 

1

SmileBASIC、154 146バイト

フラッドフィルを使用した回答がこれよりも短くなることを望んでいました。

DEF S P
FOR J=0TO 1X=1Y=1FOR I=0TO LEN(P)-1GPSET X,Y,-(P[I]=="#")GPAINT X,Y,-1,-J*(P[I]>@A)X=X*(P[I]>"31")+1INC Y,X<2NEXT
NEXT?!GSPOIT(0,0)GCLS
END

31対応するASCII文字に置き換えます。

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