교도소는 안전합니까?


58

당신의 도전은 어떤 죄수들이 탈출 할 수 있는지를 결정하기 위해 교도소 배치의 입력을받습니다.

입력

입력은 문자열, 배열, 배열 배열 등과 같은 적절한 형식 일 수 있습니다.이 경우 입력은 세 문자 (이 경우 #) P및 공백으로 구성됩니다. 입력에 반드시 세 문자가 모두 포함되는 것은 아닙니다.

  • #: 벽
  • P죄수
  • 공간 : 빈 공간

입력 예는 다음과 같습니다.

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

산출

교도소의 안전 여부에 대한 진실 / 거짓의 가치. 감옥은 모든 죄수를 수용 할 수있는 경우에만 안전하다 . 경우 어떤 죄수가 탈출 할 수는 안전하지 않습니다.

죄수는 벽으로 완전히 둘러싸이지 않으면 탈출 할 수 있습니다. 대각선 결합이 완전히 둘러싸여 있습니다.

테스트 사례

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

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

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

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

P             Falsey

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

8
나는 이것이 중복이거나 적어도 비슷한 도전이라고 생각합니다. 어쨌든 좋은 도전.
John Dvorak

2
@JanDvorak 제한적일 수 있지만 제한된 Google Fu로 복제본을 찾을 수 없습니다.
TheLethalCoder

2
관련 (2D 그리드를 채움)
Esolanging Fruit

3
수평 및 수직 이동이 모두 탈출해야하는 Falsey 예제를 사용하는 것이 좋습니다.
xnor

2
@tfbninja 실제로 중복되지는 않습니다. 그 단어가 상자에 있는지 확인하기 위해 프로그램이 주어진 데이터를 외삽하도록 요청합니다. 이것은 BFS 플러드 필이며 표시된 값을 보유한 밀폐되지 않은 공간이 있는지 확인합니다.
HyperNeutrino

답변:


54

달팽이 , 13 바이트

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

온라인으로 사용해보십시오!

0안전하지 않은 교도소 및 안전한 교도소를위한 투입물 경계 상자의 크기를 인쇄 합니다.

아이디어는 공간을 통해 직교 ( ) 이동하는 P경계에서 셀 범위 ( ~) 에서 경로를 찾을 수 없도록 하는 것입니다 o. 는 t관계없이 우리가 경기를 시도하는 곳이를 찾기 위해 가능한 모든 시작 위치를 시도 할 수 있도록 텔레포트입니다 P.


23
올바른 도구.
Jonathan Allan

16

C 번호 (.NET 코어) , 485 (480) 474 470 421 408 바이트

절대적으로 잘못된 도구와 접근 방식이지만 그럼에도 불구하고 ...

  • TheLethalCoder의 유용한 팁으로 7 바이트 이상이 저장되었습니다.
  • 정수를 반환하여 4 바이트를 절약했습니다.
  • 4 바이트가 추가로 대체하여 TheLethalCoder에 (다시 한번) 감사 저장 ' '32비교 식으로.
  • 코드를 리팩토링하여 절약 된 바이트 수.
  • TheLethalCoder 덕분에 13 바이트 더 감사합니다. :) 나는 그의 팁을 계속 잊어 버리고 그는 나에게 계속 상기시켜줍니다.
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가 레이아웃의 경계에 도달 할 때까지 공백이있을 때마다 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
당신은 비교할 수 char의가 int너무이야 난 당신이 바꿀 수 있다고 생각 ==' '하는 ==32저장 바이트. 비슷한 비교에서도이 작업을 수행 할 수 있어야합니다.
TheLethalCoder

15

펄 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/s오른쪽에 공간을 대체하거나 노호 P으로 P, 또는 왼쪽 또는 위쪽에 공간 P.
마지막으로 /\A.*P|P.*\Z|^P|P$/m행이로 시작 또는 끝나는 지 P또는 P첫 번째 또는 마지막 행에 가 있는지 확인 합니다.


정규 표현식을 사용한 멋진 접근 방식! (그러나 공간이 커지면 아마 매우 비쌉니다)
Olivier Dulac

실제로 그렇게 비효율적 이지 않습니다 . 특히, 그것은 많은 역 추적을 필요로하지 않습니다, *또는 +할 수있는 가장 긴 일치는 라인의 크기입니다 ... 이제 배열을 기반으로 한 더 수동적 인 접근법과 비교한다면 그렇다면 매우 비효율적입니다!
Dada

1
두 대체를 병합하여 -6 바이트 : s/P(.{@{-}})? | (.{@{-}})?P/P$1$2P/s.
Grimmy

1
병합 된 대체를 골퍼하여 -2 바이트 : s/(P| )(.{@{-}})?(?!\1)(?1)/P$2P/s.
Grimmy

2
@ 정규식의 @Grimy 아주 멋진 골프! 감사합니다 :)
Dada

7

자바 스크립트 (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

테스트 사례


&&의 단지 수 &?
TheLethalCoder

@TheLethalCoder 첫 번째는 아니지만 두 번째는로 대체 할 수 있습니다 |. 감사!
Arnauld

스프레드 연산자가 문자열에서 작동하는지 몰랐습니다. 시원한!
aebabis

6

자바 스크립트 (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)⍣≡ 0이 아닌 셀의 최대 이웃 홍수 채우기

⊃2≠ 왼쪽 상단에 2가 없습니까?


1

Stax , 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.