벽을 따라가는 뱀으로 미로를 채우십시오.


21

뱀이 미로를 가득 채운다.

뱀은 주어진 시작점에서 시작하여 EAST를 가리 킵니다 . 머리 주위의 네 방향이 모두 점령되어 붙어 붙을 때까지 항상 벽이나 신체 일부를 머리 의 왼쪽 ( " 왼쪽 규칙 벽 추종자 ")으로 즉시 이동시킵니다 . (참고 : 붙어있는 뱀은 도달 가능한 모든 공간을 채울 수는 없지만 목표는 아닙니다!)

도전

미로를 2D 텍스트 형식으로 입력으로 받아들이는 프로그램이나 함수를 작성하십시오.

  • 입력은 문자열 형식, 줄 바꿈이있는 단일 문자열, 파일과 같은 합리적인 형식 일 수 있습니다.
  • 미로는 벽 ( " #"), 빈 공간 ( " ") 및 정확히 하나의 시작점 ( " ")을 갖습니다 o.
  • 당신은 선택할 수 있습니다

    • 첫 번째 행과 마지막 행과 열이 모두 벽이라고 가정합니다.
    • 또는 모든 입력이 암시적인 외부 벽 층 을 갖는 것으로 간주됩니다
  • 시작점 바로 위에 벽 (또는 암시 적 벽)이 있고 뱀이 EAST 또는 SOUTH 방향으로 유효한 시작 이동을 할 수 있다고 가정 할 수 있습니다.

  • 텍스트에 다른 문자가 없다고 가정 할 수 있습니다 (입력에 필요한 경우 줄 바꿈 제외).
  • 모든 줄의 길이가 같다고 가정 할 수 있습니다.

그리고 채워진 순간에 뱀의 스냅 샷 과 함께 "채워진 미로"를 출력으로 출력 / 반환합니다 :

  • 뱀의 몸은 다음 세그먼트가 >v<^있는 곳을 가리키는 문자로 표현됩니다.
  • 뱀의 시작점은 시작시 방향 ( " >"바로 회전하지 않는 한 ") 또는 o캐릭터 (일관 될 필요는 없음)입니다.
  • 뱀의 종말은 o캐릭터

채점

일반적인 코드 골프 : 가장 짧은 코드가 승리

in:
#################################
#                    o          #
#                               #
#     ##       ###       ##     #
#    ##     ##     ##     ##    #
#    ##     ##     ##     ##    #
#    ##      ##   ##      ##    #
#   ##       ##   ##       ##   #
#   ##         ###         ##   #
#    ##       #####       ##    #
#    ##       #####       ##    #
#    ##        ###        ##    #
#     ##                 ##     #
#                               #
#                               #
#################################

out:
#################################
#>>>>>>>>>>>>>>>>>>>v>>>>>>>>>>v#
#^>>>>>>>>>>>>>>>>>v>>>>>>>>>>vv#
#^^   ##>>>>>>v###o>>>>>v##   vv#
#^^  ##>^   ##>>>>^##   >v##  vv#
#^^  ##^    ##     ##    v##  vv#
#^^  ##^     ##   ##     v##  vv#
#^^ ##>^     ##   ##     >v## vv#
#^^ ##^<       ###       v<## vv#
#^^  ##^      #####      v##  vv#
#^^  ##^      #####      v##  vv#
#^^  ##^<      ###      v<##  vv#
#^^   ##^<<<<<<<<<<<<<<<<##   vv#
#^^<<<<<<<<<<<<<<<<<<<<<<<<<<<<v#
#^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<#
#################################

애니메이션 (예시 목적으로) :

여기에 이미지 설명을 입력하십시오

편집 : 의심 스러울 때 뱀은 코너를 따라 1 블록 떨어진 곳으로 점프하지 말고 이미있는 벽에 "왼손을 유지"해야합니다.

여기에 이미지 설명을 입력하십시오

이를 설명해 준 Jonathan Allan과 위의 설명을 위해 Draco18s에게 감사드립니다.

다른 예

in:
####################
#               o# #  
#                ###
#                  #
#      ##          #
#                ###
####################

out:
####################
#>>>>>>>>>>>>>>vv# #
#^>>>>>>>>>>>>vvv###
#^^   v<<<o<<<<v>>v#
#^^<<<<##^<<<<<<v<<#
#^<<<<<<<<<<<<<<<###
####################
in:
####################
#         o    #####  
#              #####
#                  #
#                 ##
####################

out:
####################
#         >>>>v#####
#             v#####
#             >>>>o#
#                 ##
####################
in:
################
#o             #
#   ########## #
# #          # #
# #          # #
# #          # #
# #  #       # #
# #          # #
# #          # #
# #          # #
# ############ #
#              #
################

out:
################
#>>>>>>>>>>>>>v#
#>>v##########v#
#^#>>>>>>>>>v#v#
#^#>>>>>>>>vv#v#
#^#^>>>>>>vvv#v#
#^#^^#    vvv#v#
#^#^^o<<<<<vv#v#
#^#^^<<<<<<<v#v#
#^#^<<<<<<<<<#v#
#^############v#
#^<<<<<<<<<<<<<#
################

GIF 예제에서 패턴을 입력 할 때 빈 공간의 다른 부분을 채우기 위해 다시 돌아 가지 않는 이유는 무엇입니까? 왼쪽에서 위로, 왼쪽에서 아래로, 그리고 다시 돌아 다니는 것이 가능했지만 뱀은 대신 똑바로 선택했습니다. 뱀으로 가능한 많은 공간을 채우거나 "벽을 만났을 때 우회전하고 우회전하면 두 번 끝납니다"전략 만 따르는 것이 목표입니까?
매직 문어 Urn

2
@MagicOctopusUrn 나는 당신이 모호성을 볼 수있는 시점을 이해하지 못합니다. 그러나 귀하의 질문에 대답하기 위해, 가능한 한 많은 공간을 채우는 것이 목표입니다. 그러나 알고리즘 ( "벽 추종자")은 단순히 "한 번 우회전 또는 가능하지 않은 경우 두 번 회전"하는 것이 아닙니다. 뱀이 왼쪽에 벽이없는 상태에서 발견되면 대신 왼쪽으로 회전해야합니다 ( "왼쪽 유지" 벽에 직접 ")
니콜라 수

(죄송합니다. 알고리즘 런아웃을 잘못 읽었습니다)
Nicola Sap

2
@ jonah : 맞습니다. 단일 결정 론적 경로가 있으며 최적이 아닙니다. @ 가치 잉크 : 예. @ jonathanallan 나는 애매 모호함을 보려고 애 쓰지만 그것은 나일지도 모른다. 벽 추적 알고리즘의 내 버전은 다음과 같습니다. 더 이상 왼쪽에 장애물이 없으면 [먼저 평가], 좌회전하거나 벽에 부딪힌 경우 [두 번째 평가], 우회전 가능하면 게임 오버.
니콜라

1
최종 상태가 왜 그런지 알아 내기 위해 GIF를 해부해야했습니다. 마지막으로 표시된 프레임에서는 분명하지 않지만 바로 이전 상태에서 볼 수 있습니다. i.stack.imgur.com/kj67V.png 사람들에게 도움이되기를 바랍니다.
Draco18s

답변:


8

, 94 68 바이트

F²⊞υSW¬⁼§υ⁰§υ±¹⊞υS≔⪫υ¶θPθ…θ⌕θo≔⁰θW№KV «≧⁺⊖⌕E³§KV⁺θκ θ✳§rdluθ§>v<^θ»o

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

F²⊞υSW¬⁼§υ⁰§υ±¹⊞υS≔⪫υ¶θ

입력을 문자열로 처리하십시오. 덜 편리한 입력 형식을 사용하면이를 피할 수 있습니다.

Pθ…θ⌕θo

커서를 움직이지 않고 입력을 인쇄 한 다음 o다시 인쇄 하여 커서가 그 아래에 있도록합니다.

≔⁰θ

현재 방향을 초기화하십시오.

W№KV «

어떤 방향으로 여전히 여유 공간이있는 동안 반복하십시오.

≧⁺⊖⌕E³§KV⁺θκ θ

뱀이 왼쪽으로 돌릴 수 있는지 또는 강제로 오른쪽으로 돌릴 지 계산하십시오. 코드 ≦⊖θW¬⁼§KVθ ≦⊕θ는 동일한 바이트 수에 대해서도 작동하지만 0올바른 코드 대신에 최대로 간주 되므로 나머지 코드를 조정해야합니다.

✳§rdluθ§>v<^θ

적절한 바디 캐릭터를 적절한 방향으로 출력하십시오.

»o

머리를 복원하십시오. 이것은 Po루프를 통과 할 때마다 커서를 움직이지 않고 헤드를 인쇄하는 것으로 쓰여질 수도 있습니다 (그러나 이것은 동일한 바이트 수에 대해 루프가 암시 적으로 닫힐 수 있도록합니다).


7

파이썬 2 , 273 253 242 바이트

ArBo 덕분에 -11 바이트

g=input()
d=0
t=lambda g,k=1:'\n'.join(map(''.join,zip(*g.split('\n')[::k])[::-k]))
h='o '
while 1:
 l,r=t(g,-1),t(g)
 if h in l:g=l;d-=1
 elif h in g:g=g.replace(h,'>v<^'[d%4]+'o')
 elif h in r:g=r;d+=1
 else:break
exec-d%4*'g=t(g);'
print g

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

이것은 문자열을 검색 하고 미로에있는 경우 문자열 'o '로 대체 하여 작동합니다 '[>v<^]o'.

줄이 더 이상 없을 때 채워진 미로를 인쇄하여 회전 된 미로에서도 동일한 검사가 수행됩니다.

이 기능 t=lambda g,k=1:'\n'.join(map(j,zip(*g.split('\n')[::k])[::-k]))은 그리드를 회전시키는 데 사용됩니다


3

젤리 , 72 56 바이트

œṣ€⁾o j€ṛị“v<^>”;”oʋ,
UZ$ṛ¡+ƭ€Ɱ3r5¤ç/€ḟ$Ḣß$ṛ¹?
,0ÇZU$ṛ¡/

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

입력을 문자열 목록으로 가져 와서 최종 뱀과 함께 문자열 목록을 반환하는 전체 프로그램입니다. TIO의 바닥 글은 단일 줄 바꿈으로 구분 된 문자열을 원하는 입력으로 변환하고 끝에 줄 바꿈을 복원합니다. 이것은 단지 편의를위한 것입니다.

솔루션은 @Rod의 Python 2 answer 에서 사용 된 방법에서 다소 영감을 얻었 지만 구현은 매우 다릅니다.



3

T-SQL 2008 쿼리, 373 371 366 바이트

나는 우선 순위 목록을 가지고 있었고, 항상 왼쪽, 똑바로, 오른쪽으로 미끄러 져 갔다. 나는 그 우선 순위를 항상 뒤로, 왼쪽, 똑바로, 오른쪽으로 변경했다. 슬리 더백은 항상 차단되므로 우선 순위는 첫 번째 슬리 더를 제외하고 동일합니다. 뱀을 처음에 낮추면 (C = 4), 백 슬라이드 할 때 슬리 더링을 시도합니다. 이 작은 묘기는 2 바이트를 절약했습니다. ~-~ -c % 4에 1을 추가 할 필요가 없었기 때문입니다.

읽을 수 있도록 두 줄 바꿈을 삽입했습니다.

DECLARE @ varchar(8000)=
'################
#o             #
#   ########## #
# #          # #
# #          # #
# #          # #
# #  #       # #
# #          # #
# #          # #
# #          # #
# ############ #
#              #
################';

WITH s as(SELECT 0i,4c,@ m 
UNION ALL
SELECT~-i,x,stuff(stuff(m,~-a+x/3*2+(x-3)%2*s,1,'o')
,a,1,char(59+x+~x%2*11*~x))FROM(SELECT
charindex(' ',replicate(stuff(substring(m,~-a,3),2,1,substring(m,a+~s,1))+
substring(m,a-~s,1)+'~',2),-~-~c%4)%5x,*FROM(SELECT*,charindex('o',m)a,charindex('
',M)S FROM S)Q)L
WHERE x>0)SELECT top 1m FROM s
ORDER BY i
OPTION(MAXRECURSION 0)

이 온라인을 실행하기 위해 약간의 조정이 필요했습니다. 게시 된 버전은 MS-SQL 서버 관리 스튜디오에서 실행됩니다.

MS-SQL Server Management Studio에서 실행하기 전에 Ctrl-T를 누르면 결과가 텍스트로 표시됩니다.

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


2
이것이 어떻게 작동하는지 전혀 알지 못하지만 그것이 작동하는지 확인할 수 있습니다. 놀라운 직업!
BradC

@BradC 확인 및 칭찬에 감사드립니다. SQL 솔루션은 요즘 많이 사랑하지 않습니다.
t-clausen.dk

1

파이썬 3 , 343 바이트

import sys
X=0,1,0,-1
F,*Y=*X,0
L=3
g=[*map(list,sys.stdin.read().split("\n"))]
e=enumerate
r,c=[[r,c]for r,R in e(g)for c,C in e(R)if"o"==C][0]
while 1:
	if" "==g[r+X[L]][c+Y[L]]:F,L=L,~-L%4
	elif" "<g[r+X[F]][c+Y[F]]:
		if" "<g[r-X[L]][c-Y[L]]:g[r][c]="o";break
		L,F=F,-~F%4
	g[r][c]=">v<^"[F];r,c=r+X[F],c+Y[F]
for r in g:print("".join(r))

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

ArBo 덕분에 -11 바이트,
Jonathan Frech 덕분에 -4 바이트


당신은 골프의 초기화를 할 수있는 X, Y그리고 FX=0,1,0,-1;F,*Y=*X,0내가 잘못 아니에요 경우. 또한 import*절약하는 것보다 더 많은 바이트가 필요합니다.
ArBo

@ArBo 오, 나는 그것이 약간의 lol을 절약하고 있다고 생각했다. 또한 그것은 매우 영리합니다. 감사합니다!
HyperNeutrino

나는 당신이 바이트를 절약 할 수 있다고 생각합니다 *g,=map(...). 그리고 sys.stdin.readlines()아마도 작동합니까?
Andras Deak

1
또는 단일 행 입력을 가정하고을 사용하여 몇 바이트를 절약 할 수 있습니다 input().
Andras Deak

1
if C=="o"~> if"o"==C, if g[r+X[L]][c+Y[L]]==" ", elif g[r+X[F]][c+Y[F]]>" ", if g[r-X[L]][c-Y[L]]>" "그에 따라.
Jonathan Frech

1

05AB1E , 54 52 바이트

[S¶¡øí3FDíø})J€»¼D¾èU¼.Δ.¼„o ©å}DÄiXqë®">^<v"¾è'o«.;

단일 다중 행 문자열로서의 I / O

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

[                      # Start an infinite loop:
 S                     #  Split the multi-line string into a list of characters
                       #  (which will use the implicit input in the first iteration)
  ¶¡                   #  Then split by newlines
    øí                 #  Rotate the matrix once clockwise
      3F               #  Loop 3 times:
        D              #   Create a copy of the matrix
         íø            #   And rotate this copy once counterclockwise
       })              #  After the loop: wrap all four matrices into a list
 J                     #  Join each inner-most character-list to string-lines again
  €»                   #  And join each inner list of lines by newlines again
    ¼                  #  Increase variable `c` by 1 (variable `c` is 0 by default)
     D¾<è              #  Index the updated variable `c` in a copy of the list of matrices
                       #  (note that indexing wraps around in 05AB1E)
         U             #  Pop and store it in variable `X`
    ¼                  #  Then increase variable `c` again
                     #  Find the first multi-line string in the list which is truthy for:
                     #   Decrease variable `c` by 1 first
        o             #   Push string "o "
           ©           #   Store this string in variable `®` (without popping)
            å          #   Check if the current multi-line string contains this "o "
    }D                 #  Duplicate the result (results in -1 if none were truthy/found)
      Äi               #  If no result was found:
        X              #   Push variable `X`
         q             #   And stop the program, after which this multi-line string of
                       #   variable `X` is output implicitly as result
       ë               #  Else:
         ">^<v"¾è      #   Get the `c`'th character in string ">^<v"
                       #   (note that indexing wraps around in 05AB1E)
                 'o«  '#   Append a trailing "o" to this character
        ®           .; #   And replace the first variable `®` ("o ") in the 
                       #   multi-line string with this

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