벽에 들어 가지 마라!


16

일부 텍스트 기반 로그 라이크 (rogue-like)는 벽으로 걸어 들어 가지 못하게하고 시도하면 뒤로 물러납니다. 플레이어를 가장 가까운 방향으로 움직일 수있는 이유는 무엇입니까?

도전

방향과 3 x 3 문자 그리드가 주어지면 플레이어가 한 단계를 밟은 후에 동일한 그리드를 출력하는 함수 프로그램을 작성하십시오.

예를 들어

9
#..
.@#
#.#

된다

#.@
..#
#.#

입력

  • 방향은 1에서 9까지의 단일 숫자로 제공되며 각 숫자는 8 개의 기본 방향에 해당하며 여전히 서 있습니다. 이것은 키패드의 숫자의 상대 위치에서 파생됩니다.

    NW N NE
    .. \ | /
    ... 7 8 9
    W-4 5 6 -E
    ... 12 3
    ../ | \
    SW S SE
    
    그러나 789, 456, 123 대신 숫자 123, 456, 789를 사용할 수도 있습니다. 즉, 원하는 경우 맨 위와 맨 아래 2 개의 행 또는 숫자를 바꿀 수 있습니다. 이것들은 허용 가능한 유일한 인덱스 조합입니다.

  • 3 x 3 격자는 걸을 수있는 바닥, 벽 및 플레이어를 나타내는 3 개의 구별 가능한 인쇄 가능한 ASCII 문자로 구성됩니다. (테스트 사례에서는 .바닥에 사용되며 #s는 벽이며 @플레이어입니다.)

  • 프로그램에서 어떤 문자를 사용할지 선택할 수 있지만 답에 해당 문자를 명시해야하며 여러 번의 시험에서 일관되어야합니다.
  • 문자를 나타내는 문자는 항상 3 x 3 격자의 중간에 있으며 방향은 항상 1과 9 사이입니다 (포함).
  • 어떤 순서로든 입력 할 수 있습니다
  • 3 x 3 격자는 문자 배열, 문자열 배열, 9 길이 문자열 또는 다른 적절한 대안으로 입력 될 수 있습니다.

산출

  • 함수에서 반환하거나 StdOut 또는 가장 가까운 대안으로 출력
  • 후행 공백과 개행이 허용됩니다
  • 입력과 동일한 문자 표현을 사용해야합니다
  • 입력에 허용 된 것과 동일한 형식이 출력에 허용됩니다

플레이어의 움직임

지정된 방향이 벽에 의해 차단 된 경우 (예 : 위의 예에 방향이 6 인 경우) 가장 가까운 두 방향을보십시오.

  • 한 방향 (하나만)이 비어있는 경우 해당 방향으로 플레이어를 이동하십시오.
  • 비어있는 방향이없는 경우 다음 가장 가까운 2 개의 방향을 확인하십시오 (방향 5 제외). 끝까지 감싸고 열린 방향을 찾지 못한 경우 (벽으로 둘러싸인 플레이어) 플레이어를 움직이지 마십시오.
  • 두 방향이 모두 열려 있으면 무작위로 이동하려면 반드시 하나를 선택하십시오 (반드시 균일하지는 않지만).

주어진 방향이 5이면 플레이어를 움직이지 마십시오

테스트 사례

( #= 벽, .= 바닥, @= 플레이어)

입력:

9
# ..
. @ #
#. #

산출:

#. @
.. #
#. #


입력:

삼
# ..
. @ #
#. #

산출:

# ..
.. #
# @ #


입력:

7
##.
# @ #
.. #

산출:

## @ ##.
#. # 또는 #. #
.. # @. #


입력:

5
...
. @.
...

산출:

...
. @.
...


입력:

2
###
# @ #
###

산출:

###
# @ #
###

채점

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.


사용하지 yuhjklbn않습니까? 삼가 고인의 명복을 빕니다.
— Rɪᴋᴇʀ

또한, 나는 "대체 방향 선택"부분을 좋아하지 않습니다. 챌린지의 다른 부분과는 다릅니다. "플레이어를 지정된 방향으로 이동시켜 출력합니다." 그것은 단지 개인적인 취향입니다.
— Rɪᴋᴇʀ 1

1
이 부분은 혼란 스럽습니다. "자유로운 방향이 없으면 가장 가까운 다음 2 개의 방향을보십시오."
— Leaky Nun

1
각 요소에 ASCII 문자 대신 숫자를 할당 한 다음 2 차원 목록으로 입력 할 수 있습니까? 아니면 문자열이어야합니까?
— Scott Milner

2
방향을 123;456;789대신 사용할 수 있습니까 789;456;123?
— Leaky Nun

답변:


2

피스- 73 70 바이트

Kmsd"78963214"DPGJXXYt@K+xKQG\@4\.R?q/J\#/Y\#Jk=YwV5=GflTmPd(N_N)IGOGB

시도 해봐

입력은 두 줄로 구성됩니다.

첫 번째 줄 : 이동 방향

두 번째 줄 : 보드 (123456789 위치, 123은 맨 위 행)


3

자바 스크립트 (ES6), 192 163 바이트

a=>b=>a[(a[4]=0)+--b]?(A=(c,d)=>c==b|(e=a[c])-(f=a[d])|!e?(a[c-b?(e?e<f:new Date&1)?c:d:4]=2,a):A(+g[c],+h[d]))(+(g="3016X2785")[b],+(h="1250X8367")[b]):(a[b]=2,a)

노트

이 기능은 특수 입력 형식을 사용합니다. 첫 번째 입력은 지도를 나타내는 정수 배열 ( 0for floor, 1for wall및 2for player)입니다. 두 번째 입력은 (flipped) 방향입니다. 1북서쪽, 2북쪽, 3북동쪽, 4서쪽 등입니다. 입력은 카레 구문 (Z(a)(b) )을 .

테스트 사례

지도와 길 찾기가 내 입력 형식에 맞게 수정되었습니다.

Z=
a=>b=>a[(a[4]=0)+--b]?(A=(c,d)=>c==b|(e=a[c])-(f=a[d])|!e?(a[c-b?(e?e<f:new Date&1)?c:d:4]=2,a):A(+g[c],+h[d]))(+(g="3016X2785")[b],+(h="1250X8367")[b]):(a[b]=2,a)

testcases = [
    [[1,0,0,0,2,1,1,0,1], 3],
    [[1,0,0,0,2,1,1,0,1], 9],
    [[1,1,0,1,2,1,0,0,1], 1],
    [[0,0,0,0,2,0,0,0,0], 5],
    [[1,1,1,1,2,1,1,1,1], 2]
]
for (test of testcases) {
    console.log(Z(test[0])(test[1]))
}


1

파이썬 3 120 104 153 176 175 바이트

def f(n,l):
 n-=1
 if n!=4and'.'in l:l[sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)[1][0]],l[4]='@.'
 return l

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

이 방법은 '.', '#'및 '@'의 방향과 목록을 가져옵니다. 인덱스는 1에서 9로 시작합니다 (실제로 0에서 8까지). 그래서 형태가

123 
456
789 

메소드는 새로운 위치로 새로운리스트를 리턴합니다.

이 라인

sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)

이 유형의 목록을 반환합니다.

>>>n=7
>>> l=['#','#','#','.','@','#','.','#','.']
>>> sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)
[(4, '@'), (8, '.'), (6, '.'), (3, '.'), (7, '#'), (5, '#'), (1, '#'), (0, '#'), (2, '#')]

우리는 자유 지점까지의 거리를 계산하고 임의성을 추가합니다. ord('#') <= ord('.') - 8 and ord('.') + 8 <= ord('@')가장 가까운 '.'라고 말할 수 있기 때문에 n = 7 (목록의 색인)의 색인은 8입니다.

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

예:

>>> f(9, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '.', '.', '#', '#', '@', '#']
>>> f(3, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '@', '.', '.', '#', '#', '.', '#']
>>> f(5, ['.','.','#','.','@','.','#','.','#'])
['.', '.', '#', '.', '@', '.', '#', '.', '#']
>>> f(7, ['#','#','#','#','@','#','#','#','#'])
['#', '#', '#', '#', '@', '#', '#', '#', '#']
>>> f(7, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '@', '.', '#', '#', '.', '#'] or ['#', '.', '.', '.', '.', '#', '#', '@', '#']

1) 플레이어가 이동하려는 방향이 사용되고 올바른 위치가 첫 번째가 아닌 ','테스트 케이스 (테스트 케이스 2, 3 및 5의 경우)에서는 작동 하지 않습니다 . 2) 귀하의 I / O 형식이 질문과 동일하지 않은 것 같습니다. I / O 형식을 언급하십시오.
— Luke

귀하의 예제 f(9, ...는 작동하지 않습니다-문자를 2에 배치하지만 9에 가장 가까운 위치는 6과 8이므로 그중 하나를 임의로 선택해야합니다 (코드에 임의성이 없습니다). 또한 주변을 돌아 다음으로 가장 가까운 곳을 찾아야하므로 f(9,list("####@#.##"))캐릭터를 유일하게 가능한 지점에 배치해야합니다 (여기 7).
— Jonathan Allan

실수를 지적 해 주셔서 감사합니다. 저에게 뉴스는 코드 l [4], l [l.index ( '.')] = '. @'및 l [l.index ( '.')], l [4입니다. ] = '@.' 다릅니다
— Кирилл Малышев

@JonathanAllan, 처음에는 규칙을 잘 이해하지 못했습니다. 코드를 올바르게 수정할 수 있기를 바랍니다.
— Кирилл Малышев

여전히 정확하지 않습니다. 1. 예제 f(9, ...가 리턴되어야합니다 list("#....##@#")(8이 비어 있고 9 옆에 있기 때문). 2. "두 방향이 모두 열려있는 경우 무작위로 이동하려면 하나를 선택하십시오." 와 같이 무언가 f(9,list("####@.#.#"))가 list("####..#@#")항상 그런 것은 아닙니다 list("####.@#.#").
— Jonathan Allan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.