물이 궁극적으로 탱크에 도달합니까?


30

ASCII 예술 세계에는 물, 해시 벽 및 문자 메커니즘이 있습니다.

해시 벽 ( #표지판) 으로 구성된 방에 있습니다 .

#######
#     #
#     #
#     #
# ### #
#     #
#######

어느 방향에서나 물을받을 수 있는 S 수원 ( S기호)과 E 수조 ( E기호)를 설치하지만 S 수원과 E 탱크가 하나만 있습니다.

#######
#  S  #
#     #
#     #
# ### #
#  E  #
#######

따라서 소스를 배치 할 위치를 현명하게 선택해야합니다. 그곳에서 기술을 익힐 수 있습니다.

작업

소스와 탱크가있는 방을 나타내는 문자열로 구성된 입력을 얻습니다.

#######
#  S  #
#     #
#     #
# ### #
#  E  #
#######

물이 궁극적으로 탱크에 도달하는지 확인해야합니다. 가능하면 물이 가능하면 왼쪽과 오른쪽으로 흐릅니다. 물이 올라가지 않아 쌓이지 않습니다.

따라서 위의 입력에 대한 결과는 다음과 같습니다.

#######
#  *  #
#  *  #
#*****#
#*###*#
#**O**#
#######

물은 행복하게 탱크에 도달하므로 진실한 가치를 산출해야합니다.

그러나 물이 탱크에 도달하지 않으면 :

#######
#S    #
#     #
#  E  #
# ### #
#     #
#######

#######
#*    #
#*    #
#* X  #
#*### #
#*****#
#######

그런 다음 허위 값을 출력해야합니다.

물이 궁극적으로 탱크에 도달하는지 여부를 결정하는 프로그램을 작성하십시오. 코드는 가능한 짧아야합니다.

가정

  • 입력이 항상 유효하다고 가정하십시오 (전체 방은 S와 E로 둘러싸인 직사각형 영역입니다).

  • 입력으로 제공된 방이 하나만 있다고 가정하십시오.

테스트 사례

프로그램은 다음 테스트 사례에 대해 정확한 값을 반환해야합니다.

#######
#  S  #
#     #
#     #
# ### #
#  E  #
#######

#######
#  S  #
#     #
#  E  #
#     #
#     #
#######

#######
#     #
#     #
# SE  #
# ### #
#     #
#######

###############################################
#                      S                      #
#                                             #
#                                             #
#                                             #
#               ###############               #
#                                             #
#  ##################     ##################  #
#                                             #
#                                             #
#                    #####                    #
#                      E                      #
###############################################

#######
#  S  #
#     #
#     #
# ### #
#   # #
### ###
## E ##
#     #
#######

그러나 다음 테스트 사례에는 잘못된 값이 있습니다.

#######
#S    #
#     #
#  E  #
# ### #
#     #
#######

#######
#     #
# SE  #
#     #
#     #
#     #
#######

#######
#     #
#  E  #
#     #
#  S  #
#     #
#######

####################################
#                                  #
#                                  #
#                                  #
#S             #                  E#
####################################

진정한 범주에서 마지막 룸과 거짓 카테고리의 마지막 방에 두 번째 뻔뻔하게되었다 도난당한 에서 빌려 이동 및 실행 : KOTH 에 의해 마누 (샌드 박스 게시물을 삭제).

True 카테고리의 마지막 방은 Martin Buttner의 Retina 답변입니다 .


참고 : 내 KOTH 샌드 박스 게시물을 삭제, 당신의 도전 외모 훨씬 더 :)
CommonGuy

물이 방을 채울 때까지 축적되지 않습니까? 따라서 물은 같은 방에있는 경우에만 항상 탱크에 도달합니다.
Bob

1
참 / 거짓 챌린지 (또는 소수의 클래스로 분류 챌린지)에서 테스트 케이스를 형식화하기위한 팁 : 출력으로 테스트 케이스를 그룹화하고 그룹을 분리하여 from / to/ 실제 비트를 피할 수 있습니다 (참가자가 모든 테스트를보다 쉽게 ​​처리 할 수 ​​있도록 함) 한 번에 사례).
Martin Ender

1
기본적으로 Minecraft 액체 흐름 논리. Minecraft에서는 물이 왼쪽으로 만 이동하기 때문에 실제 테스트 사례에서 3 번째는 false를 반환한다고 생각합니다.
Patrick Roberts

1
떨어지는 모래 물 물리학을 생각 나게합니다.
user253751

답변:


15

달팽이 , 20 바이트

\S{d(=\#n)?^#},!(t\E

0거짓된 가치와 진실한 가치를 1위해 인쇄 합니다.

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

  • \SS처음에 일치
  • d 방향을 아래로 설정
  • {...}, 중괄호 안의 항목을 0 번 이상 일치
  • =\##달팽이 앞에 숯 이 있으면 성공 하지만, 움직이지 않는 주장
  • n 어느 방향 으로든 90도 회전
  • (...)? 괄호 안의 패턴을 0 번 또는 1 번 일치
  • \ ​ 공간과 일치하고 달팽이를 그 위로 움직입니다.
  • !(... 부정적인 주장이다
  • t 그리드에서 일치하지 않는 사각형으로 순간 이동
  • \E 성냥 E

이 언어를 혼자서 컴파일하고 싶지 않습니다. 이에 대한 온라인 통역사가 있습니까?
user48538

@ zyabin101 아니요, 온라인 통역사가 없습니다.
feersum

좋아, 데니스에게 전화 할 시간이야 : P 프로젝터는 어디에 있습니까?
user48538

5
i.imgur.com/dvWrAwP.png 직접 만들었습니다.
user48538

글쎄, 시도 했지만 모든 테스트 사례에 대해 0을 인쇄하고 나에게는 하나를 인쇄합니다. 내가 무엇을 잘못하고 있지?
Dennis

11

슬립 , 20 + 2 = 22 바이트

S>( ^4|^4(?|`#)^T)*E

Slip은 여전히 ​​그 어느 때보 다 끊어졌지만 한 번은 이것이 실제로 할 수있는 도전이었습니다. 그것은 결코 그렇게 골퍼가되도록 설계되지 않았으므로 아무것도 달팽이를 이길 수는 없습니다 : P

r종료 할 플래그 (반복 셀 없음)가 필요합니다.

온라인으로 사용해보십시오 . 출력은 진실을 위해 취해진 경로이며, 거짓을 위해 비어 있습니다.

S                 Match S
>                 Rotate pointer downward
(                 Either...
 <space>^4          Match a space and point downwards
 |                  or
 ^4                 Point downwards
 (?|`#)             Match # below then reset pointer
 ^T                 Either turn left or right
)*                ... 0+ times
E                 Match E

6

레티 나 , 87 바이트

바이트 수는 ISO 8859-1 인코딩을 가정합니다.

+mT`E `S`(?<=^(?(1)!)(?<-1>.)*S.*¶(.)*)[E ]|.?S(?=(.)*¶.*#(?<-2>.)*(?(2)!)$)[E ]?
M`E
0

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

Retina (또는 일반적으로 .NET 정규식)에서 2D 문자열 처리가 가능한 한 정확하게 간결하지는 않습니다 ...

설명

+mT`E `S`(?<=^(?(1)!)(?<-1>.)*S.*¶(.)*)[E ]|.?S(?=(.)*¶.*#(?<-2>.)*(?(2)!)$)[E ]?

이것은 물로 닿는 모든 세포를로 표시하는 플러드 필입니다 S. 도달 할 수있는 문자를 일치시킨 후 -mode 를 사용 S하여 음역합니다 T. 이 플러드 필은 공간과을 모두 통과합니다 E. 는 +처음에 출력 변경이 멈출 때까지 반복한다.

실제 정규 표현식은 두 가지 경우를 포함합니다.

(?<=^(?(1)!)(?<-1>.)*S.*¶(.)*)[E ]

이것은 공백과 일치하거나 E아래에 정확히 하나의 셀 S입니다. 수직 일치는 밸런싱 그룹을 사용하여 현재 라인의 접두사를 계산하여 수행 되므로 수평 위치가 동일한 지 확인할 수 있습니다. 이것은 떨어지는 물을 처리합니다.

.?S(?=(.)*¶.*#(?<-2>.)*(?(2)!)$)[E ]?

이것은 매우 유사 합니다 . a S바로 아래에있는 문자 S가 a이면 a 및 전후 문자와 일치합니다 #. 이것은 땅을 따라 퍼지는 물을 처리합니다.

완료되면 물이 도달했는지 확인하기가 매우 쉽습니다 E. 그럴 경우 E, 플러드 필의 줄에서 줄을 제거하고 그렇지 않은 경우 E아직 제거합니다. 따라서 Es 의 수를 세어 봅시다 .

M`E

그러나 이제는 0진실한 테스트 사례에 대해서는 (허위로 1간주) 및 거짓 테스트 사례에 대해서는 (거짓으로 간주)입니다. 0이 결과에서 s의 수를 세면 이것을 쉽게 뒤집을 수 있습니다.

0

끝난.


테스트 사례로 입력 추가
user48538
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.