인터랙티브 미로 해결사


13

밥은 납치되어 미로에 갇혔다. 당신의 임무는 그가 탈출구를 찾도록 돕는 것입니다. 그러나 그것은 매우 어둡고 무서운 미로이기 때문에 아무것도 볼 수 없습니다. 그는 벽에 닿을 때만 벽을 느끼고 출구를 찾았을 때를 알고 있지만 더 이상 아무것도 모른다.

그는 메모리로 프로그램을 실행해야하므로 가능한 짧아야합니다.

참고 :이 문제는 http://acmgnyr.org/year2016/problems.shtml 에서 가져 왔지만 약간 조정하여 판사 프로그램 / 테스트 사례를 직접 작성했습니다.

사양

  • 이것은 대화식 문제이므로 프로그램은 stdout으로 이동을 출력하고 stdin에서 응답을받습니다.
  • 움직임의 귀하의 프로그램 출력 할 수 하나 right, left, down, up.
  • 그런 다음 다음 중 하나를 입력으로받습니다.
    • wall-이것은 밥이 벽에 부딪쳤다는 것을 의미합니다. 밥은 같은 곳에 머무를 것입니다.
    • solved-밥이 출구를 찾았습니다! 이제 다른 것을 인쇄하지 않고 프로그램을 종료해야합니다.
    • ok -밥은 주어진 방향으로 움직일 수있었습니다.
  • 미로에 출구가 없으면 프로그램은 no exitBob에게 포기해야한다는 사실을 알리기 위해 출력 해야합니다. 그러면 다른 것을 인쇄하지 않고 프로그램을 종료해야합니다.
  • Bob은 빨리 나가기 때문에 프로그램에서 불필요한 움직임을 일으키지 않아야합니다. 다시 말해, 프로그램은 같은 사각형에서 같은 방향으로 두 번 이동할 수 없습니다 .
  • 이것은 이므로 가장 짧은 프로그램이 승리합니다!

다음 예 S에서 시작 사각형, X출구, #벽 및 공백은 유효한 사각형입니다. 정답은 하나도 없으므로 솔루션의 예제 실행 일뿐입니다. 또한 미로의 그림은 당신이 볼 수있는 곳이며 프로그램은 입력으로 얻지 못합니다.

########
#S     #
###### #
     # #
     #X#

right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              wall
down
              ok
right
              wall
down
              ok
right
              wall
down
              solved

#####
# S #
#####

right
              ok
right
              wall
down
              wall
up
              wall
left
              ok
down
              wall
up
              wall
left
              ok
down
              wall
up
              wall
left
              wall
right
              ok
no exit
              solved

###############################
#S                            #
##############       ###      #
             #       #X#      #
             #                #
             ##################

right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              wall
down
              ok
right
              wall
down
              ok
right
              wall
down
              ok
right
              wall
down
              wall
left
              ok
down
              wall
up
              ok
up
              ok
left
              ok
down
              ok
down
              ok
down
              wall
left
              ok
down
              wall
up
              ok
up
              ok
left
              ok
down
              ok
down
              ok
down
              wall
left
              ok
down
              wall
up
              ok
up
              ok
left
              wall
down
              ok
left
              wall
down
              ok
left
              ok
down
              wall
up
              wall
left
              ok
down
              wall
up
              solved

체커 프로그램

  • 파이썬으로 솔루션 검사기를 작성했습니다. https://gist.github.com/Maltysen/f0186019b3aa3812d812f8bb984fee19 에서 찾을 수 있습니다 .
  • 처럼 실행하십시오 python mazechecker.py ./mazesolver.
  • 라는 폴더의 모든 미로에서 프로그램을 테스트합니다 mazes.
  • 미로는 위와 동일한 형식으로 별도의 파일에 있습니다.
  • 위에 나열된 모든 조건을 확인하고 솔루션 위반 여부를 알려줍니다.
  • 로 추가 진단 정보를 인쇄 할 수 있습니다 python mazechecker.py -d ./mazesolver.
  • 압축 mazes폴더는 여기에서 찾을 수 있습니다 . 원하는 경우 자신 만의 것을 추가 할 수도 있습니다.

1
문제가 CC-BY-NA-SA 라이센스로 릴리스되었다고 명시 적으로 언급 할 가치가 있으므로 리믹스가 반드시 동일한 라이센스하에 있습니다.
Nick Kennedy

3
solved출력 할 때을 얻 no exit습니까? 그렇다면 테스트 사례뿐만 아니라 규칙에도 명시하십시오!
wastl

1
" 프로그램이 두 번 같은 광장에서 같은 방향으로 이동 할 수 없습니다. "이에 대해 두 가지 질문 : 나는 위치에있어 1하자 말 x,y과 가고 up응답으로, wall다음, right다시 응답과를 wall, 그때하려고 할 수 있습니다 up다시, 또는 전용 leftdown나는 아직이 광장에서 이동하지 않았기 때문에 계속 사용할 수?
Kevin Cruijssen

1
2. 이 미로 가 있다고 가정 해 봅시다 . 이 흐름으로 : 오른쪽 (확인); 오른쪽 (ok); 오른쪽 (벽); 위로 (ok) ; 위로 (ok); 위로 (벽); 왼쪽 (벽); 아래로 (ok); 아래로 (ok); 아래로 (ok); 아래로 (ok); 아래로 (벽); 오른쪽 (벽); 위로 (ok); 위로 (ok); 나는 이미 그 특정 광장에서 (대담한 광장에서) 이미 했어도 다시 올라갈 수 있습니까?
Kevin Cruijssen

1
@KevinCruijssen 나는 내 대답에서 어디서 왔는지 명시 적으로 추적하지 않습니다. 대신 각 사각형에서 처리 된 모든 방향을 추적하고 방문하지 않은 사각형을 먼저 시도합니다. 방문하지 않은 모든 정사각형을 시험해 보았을 때 남은 법적 조치는 내가 온 곳입니다 (이미 방문했지만이 방향은 아님).
Arnauld

답변:


7

자바 스크립트 (ES6)  180  174 바이트

prompt()방향을 출력하고 결과를 검색하는 데 사용 합니다.

_=>(g=p=>[...'012301234'].some((d,i)=>g[p]>>d&1|i<4&g[P=[p[0]+(d-2)%2,p[1]+~-d%2]]>0?0:(r=prompt('up/left/down/right/no exit'.split`/`[g[p]|=1<<d,d]))<'s'?g(P):r<'t'))([0,0])

온라인으로 사용해보십시오! (자동 I / O 사용)

대화식 스 니펫

경고 :이 코드는 'solved'가 입력되거나 함수가 종료가 없음을 알 때까지 prompt () 대화 상자를 표시합니다.

(
_=>(g=p=>[...'012301234'].some((d,i)=>g[p]>>d&1|i<4&g[P=[p[0]+(d-2)%2,p[1]+~-d%2]]>0?0:(r=prompt('up/left/down/right/no exit'.split`/`[g[p]|=1<<d,d]))<'s'?g(P):r<'t'))([0,0])
)()

댓글

_ => (                      // anonymous function taking no argument
  g = p =>                  // g = recursive function taking the current position p = [x, y]
    [ ...'0123',            // i<4  : try to move on squares that haven't been visited yet
      ...'0123',            // 3<i<8: try to go back to where we initially came from
      ...'4'                // i=8  : if everything failed, there must be no exit
    ].some((d, i) =>        // for each direction d at index i:
      g[p] >> d & 1         //   if this direction was already tried at this position
      | i < 4 &             //   or i is less than 4 and
      g[P = [               //   the square at the new position P = [X, Y] with:
        p[0] + (d - 2) % 2, //     X = x + dx[d]
        p[1] + ~-d % 2      //     Y = y + dy[d]
      ]] > 0 ?              //   was already visited:
        0                   //     abort
      : (                   //   else:
        r = prompt(         //     output the direction:
          [ 'up',           //       0 = up
            'left',         //       1 = left
            'down',         //       2 = down
            'right',        //       3 = right
            'no exit'       //       4 = no exit
          ][                //
            g[p] |= 1 << d, //       mark this direction as used
            d               //       d = actual index of the string to output
          ]                 //     r = result of prompt()
        )                   //
      ) < 's' ?             //     if r = 'ok':
        g(P)                //       do a recursive call at the new position
      :                     //     else:
        r < 't'             //       yield true if r = 'solved' or false if r = 'wall'
    )                       // end of some()
)([0, 0])                   // initial call to g at (0, 0)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.