벽에 들어 가지 마라!


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 wall2for 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.