로그 라이크 길 찾기


21

로그 라이크 길 찾기

당신의 임무는 지하 감옥을 나타내는 아래에 설명 된 요소의 2 차원 배열이 주어질 때 괴물을 깨우지 않고 도적이 수집 할 수있는 금 조각의 양을 나타내는 단일 숫자를 출력하거나 반환하는 것입니다.

배열의 요소는 다음과 같습니다.

  1. 빈 공간은 .전화 또는 공백으로 표시됩니다 .
  2. 도적의 시작 위치는 물론 @;
  3. 금 조각은로 표시됩니다 $.
  4. 벽은로 표시됩니다 #.
  5. 몬스터는 다음 정규 표현식의 문자로 표시됩니다 [a-zA-Z*&].

배열에는 위에 나열되지 않은 문자가 포함되어서는 안되므로 벽, 빈 공간, 불량 또는 금 조각이 아닌 것은 괴물이라고 가정 할 수 있습니다.

길 찾기 규칙은 다음과 같습니다.

  1. 도적은 빈 세포 나 금을 함유 한 세포 만 걸을 수 있습니다.
  2. 인접한 또는 대각선으로 인접한 셀로 이동하려면 회전이 필요합니다.
  3. 금을 줍는 것은 즉각이다.
  4. 도적은 깨어나지 않고 몬스터에게 한 차례 이상 인접하거나 대각선으로 인접 해있을 수 없으며 금지되어 있습니다.
  5. 도적은 몬스터의 인식 영역에 여러 번 들어올 수 있으며, 도적 이 근처 에서 2 번 연속 턴을 하면 몬스터가 깨어납니다 .

입력 및 출력 규칙

2 차원 배열, 평면 배열, 문자열 또는 기타 다른 것을 포함하여 합리적인 형식으로 입력을 얻을 수 있습니다. 삶을 더 편하게 만들면 어레이의 크기도 고려할 수 있습니다.

처음에는 도적이 괴물 근처에 있지 않을 것입니다.

전체 프로그램 또는 기능이 정상입니다.

채점

이것은 이며 점수는 제출물의 바이트 수이며 더 적을수록 좋습니다.

테스트 사례

나는 가독성을 위해 빈 공간에 점을 사용합니다. 원한다면 공백을 사용할 수 있습니다 (위 참조). 또한 이것은 로그가 항상 왼쪽 상단에 있다는 순수한 우연의 일치입니다. 코드는 다른 유효한 위치도 처리해야합니다.

1)
@..
.$.
...  -> 1

위생 검사입니다.

2)
@....
...g$
.....  -> 0

다시 한번, 위생 테스트.

3)
@....
...$g
.....  -> 1

도적은 왼쪽에서 움직여서 금을 붙잡을 수 있습니다.

4)
@....g..
.......$
........
.....h..  -> 1

도적은 몬스터들 사이에서 지그재그를 할 수 있으며, 각 몬스터 근처에서 한 턴 이상 머물지 않습니다.

5)
@....z..
.......$
.....b..  -> 0

이전 테스트 사례의 전술은 작동하지 않습니다. 몬스터 감도 영역이 겹칩니다.

6)
@$#.
###$
....  -> 1

위생 시험.

7)
@..#..
$.$g.$
...#..  -> 2

같게.

8)
@#.d#$
$...##
e.....
..$...
##..$b
.#..g$  -> 3

여기에있는 모든 금 중에서 세 개만 안전하게 도달 할 수 있습니다. 시작 위치 근처의 금은 하나 아래로 이동 한 다음 다시 시작 위치로 가져와 얻을 수 있습니다. 왼쪽 상단에서 벗어나려면 로그가 대각선 아래 오른쪽으로 두 번 움직여야합니다. 가운데 금은 도전이되지 않습니다. 지키고 외부 금 g과은 b다시 다음 중간 금의 오른쪽에있는 곳에서 대각선으로의 이동에 의해 가지고 할 수 있습니다. 나머지는 얻을 수 없습니다 : 오른쪽 상단 금은 벽에 의해 차단되며 오른쪽 하단 금은 몬스터 감도 영역에서 2 턴이 필요합니다.

다음 테스트 사례는 mbomb007에 의해 기부되었습니다.

9)
  12345678
a @....g.D
b .......$
c ......#.
d .....h..  -> 1

이것은 까다 롭습니다. 경로는 b4-b5-c6-b7-c8-b8(grab)입니다.

10)
  12345678
a @....g.D
b .......$
c .......#
d .....h..  -> 1

경로는 [bc]4-c5-b6-c7-b8(grab)입니다.

11)
  12345678
a @....g.D
b ......#$
c .......#
d .....h..  -> 1

여분의 벽은 실제로 아무것도 변경하지 않으며 [bc]4-c5-b6-c7-b8(grab)여전히 해결책입니다.


더 크고 복잡한 예를 추가해야합니다. 또한 던전의 최소 및 최대 크기는 얼마입니까? 1x1 던전 @은 유효한 입력입니까?
mbomb007


@ mbomb007 새로운 예를 추가했습니다. 그리드의 크기에 관해서는 적어도 3x3으로 제한하는 것이 합리적이라고 생각합니다.
Michail

@ mbomb007 예제를 편집해도 될까요? 일단 이해되면 논리를 잘 보여줍니다.
Michail

부담없이 그것이 내가 만든 것입니다. 테스트 케이스를 회전해도 결과에 영향을 미치지 않아야합니다.
mbomb007

답변:


5

이전 솔루션 (그들 중 일부)은 tio 링크의 바닥 글 컨테이너에서 찾을 수 있습니다 (아마도 더 읽기 쉽습니다)

자바 스크립트 (Node.js를) , 883 (436) 411 360,345 311 바이트

g=>g.map((r,y)=>[...r].map((c,x)=>A+=c=="$"&&P(g,x,y)),A=0)|A
P=(g,x,y,m={},p={},I=i=9,M={})=>{if(/[.$]/.test(c=(g[y]||0)[x])){for(;i--;)if(/^[^.@$#]$/.test(C=(g[y+~-(i/3)]||0)[x+i%3-1])){if(m[C])return
M[C]=1}for(;I--;)if(!p[(X=x+~-(I/3))+","+(Y=y+I%3-1)]&&P(g,X,Y,M,{...p,[x+","+y]:1}))return 1}return c=="@"}

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

외식-

플레이어에서 현금으로가는 대신 케이스에서 @로 갔다. 나는 (@에 도달)보고 중지해야 할 시점을 알고 있기 때문에 내가 더 빠를 것이라고 생각하고 현금을 찾을 때 항상 모든 지점 (그리고 그에 도달하는 방법)을 커버 할 때까지 계속 움직여야합니다. 너 한테 꽤 간단 그래서 그런 식으로 - 주요 기능 g.map((r,y)=>[...r].map((c,x)=>A+=c=="$"&&P(g,x,y)),A=0)|A: 발견 현금 -> 당신은 그것을 발견하는 경우 -> 증가 편지 P 일명 경로 찾기에 도착 할 수 있습니다 - 당신이 그를 찾을 경우> -> 플레이어를 찾기 시작 if(/[.$]/.test(c=(g[y]||[])[x]))단지 있는지 확인 현재 셀은 "특별"-> 그렇다면 플레이어이면 반환하고 싶습니다. 특수 사례 : @ # (monster)

for(;i--;) if(/^[a-zA-Z*&]$/.test(C=(g[y+~-(i/3)]||0)[x+i%3-1])) -> if my neighbor is a monster {if(m[C])return false -> and it already was in the previous turn - this path is not value M[C]=1} -> if not just add it to the neighbors monsters for(;I--;) if(!p[(X=x+~-(I / 3))+","+(Y=y+I%3-1)]&&P(g,X,Y,M,{...p,[x+","+y]:1}))return true 이웃을 다시 반복하십시오-내가 거기에 없다면 (p는 경로입니다) 경로를 계속하십시오 (P 호출)


좋은 골프! 내가 알아 차린 몇 가지 : (1) 코드에는 두 번째와 일곱 번째 줄에 불필요한 공백이 있으며 대부분의 줄 바꿈은 불필요하며 (1 줄과 6 줄만 줄 바꿈) I / 3공간이 필요하지 않습니다. 그 공백을 제거하면 점수는 실제로입니다 324! (2) return truereturn 1(진실한 가치)가 return false될 수 있고 단순히 return(의미 된 가치 ) 가 될 수 있습니다 undefined. (3) ^[^.@$#]$몬스터가 아닌 몬스터를 확인 하는 정규식 ^[a-zA-Z*&]$은 몬스터를 확인하는 것보다 짧습니다 . 잘 하셨어요!
apillers

그래, 난 내가 그것을 더 짧게 만들 수 있습니다 알아요 :)
DanielIndie

@apsillers는 스페이스 프리 솔루션으로 업데이트되었습니다 :)
DanielIndie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.