Alguns gostos desonestos baseados em texto não permitem que você entre nas paredes e, se tentar, retrocede. Por que fazer isso quando você pode fazer o jogador se mover na direção válida mais próxima?
O desafio
Escreva um programa de função que, dada uma direção e uma grade de 3 por 3 caracteres, produz a mesma grade depois que o jogador der um passo.
Por exemplo,
9
#..
.@#
#.#
torna-se
#.@
..#
#.#
Entrada
A direção é dada por um único dígito de 1 a 9, cada um correspondendo a 8 direções cardinais e parado. Isso é derivado dos locais relativos dos números em um teclado:
NW N NE .. \ | / ... 7 8 9 W- 4 5 6 -E ... 1 2 3 ../ \ SW S SE
No entanto, você também pode usar os números 123, 456, 789 em vez de 789, 456, 123. Em outras palavras, você pode trocar as 2 linhas ou os números superior e inferior, se assim desejar. Essas são as únicas 2 combinações de índice aceitáveis.A grade 3 por 3 consistirá em 3 caracteres ASCII distintos e imprimíveis, representando piso, paredes e o player que podem ser percorridos. (Nos casos de teste,
.
é usado para piso,#
s são paredes e@
é o jogador)- Você pode escolher quais caracteres seu programa usa, mas você deve indicá-los em sua resposta e eles devem ser consistentes em várias tentativas.
- O personagem que representa o personagem sempre estará no meio da grade 3 por 3, e a direção sempre estará entre 1 e 9 (incl.)
- Você pode receber informações em qualquer ordem
- A grade 3 por 3 pode ser inserida como uma matriz de caracteres, uma matriz de strings, uma string de 9 comprimentos ou outra alternativa razoável.
Resultado
- Retorno de uma função ou saída para StdOut ou alternativa mais próxima
- Espaços à direita e novas linhas são permitidos
- Você deve usar as mesmas representações de caracteres que a entrada
- Os mesmos formatos permitidos para entradas são permitidos para saídas
Como o jogador se move
Se a direção especificada estiver bloqueada por uma parede (por exemplo, se o exemplo acima tiver a direção 6), observe as 2 direções mais próximas:
- Se uma (e apenas uma) direção estiver livre, mova o player nessa direção.
- Se nenhuma direção estiver livre, observe as próximas 2 direções mais próximas (excluindo a direção 5). Se você deu a volta e não encontrou nenhuma direção aberta (jogador cercado por paredes), não mova o jogador
- Se as duas direções estiverem abertas, escolha uma para mover aleatoriamente (embora não necessariamente uniformemente).
Se a direção dada for um 5, não mova o jogador
Casos de teste
( #
= parede, .
= piso, @
= jogador)
Entrada: 9 # .. . @ # #. # Resultado: #. @ .. # #. # Entrada: 3 # .. . @ # #. # Resultado: # .. .. # # @ # Entrada: 7 ##. # @ # .. # Resultado: ## @ ##. #. # ou #. # .. # @. # Entrada: 5 ... . @. ... Resultado: ... . @. ... Entrada: 2 ### # @ # ### Resultado: ### # @ # ###
Pontuação
Isso é código-golfe , então a resposta mais curta em bytes vence.
yuhjklbn
? DESCANSE EM PAZ.123;456;789
vez de789;456;123
?Respostas:
Pitão -
7370 bytesTente
A entrada consiste em duas linhas:
1a linha: direção do movimento
2a linha: O tabuleiro (posições 123456789, com 123 sendo a linha superior)
fonte
JavaScript (ES6),
192163 bytesNotas
Esta função usa um formato de entrada especial. A primeira entrada é uma matriz de números inteiros (
0
parafloor
,1
parawall
e2
paraplayer
) representando o mapa. A segunda entrada é a direção (invertida):1
é noroeste,2
é norte,3
é nordeste,4
é oeste etc. As entradas devem ser fornecidas através da sintaxe de currying (Z(a)(b)
).Casos de teste
Os mapas e direções foram modificados para se adequarem ao meu formato de entrada.
fonte
Python 3,
120104153176175 bytesExperimente online!
Este método obtém direção e lista de '.', '#' E '@'. Os índices começam com 1 a 9 (com 0 a 8 na lista). Então tem a forma
O método retorna uma nova lista com novas posições.
Está linha
retorna uma lista deste tipo:
Calculamos distâncias para liberar pontos e adicionamos aleatoriedade. Porque
ord('#') <= ord('.') - 8 and ord('.') + 8 <= ord('@')
podemos dizer que o mais próximo '.' para n = 7 (índice na lista) tem um índice de 8.Exemplo:
fonte
','
(como é o caso dos casos de teste 2, 3 e 5). 2) Seu formato de E / S não parece ser o mesmo da pergunta. Por favor, mencione seu formato de E / S.f(9, ...
não funciona - ele coloca o caractere em 2, mas as posições mais próximas de 9 são 6 e 8; portanto, um deles deve ser escolhido aleatoriamente (também não há aleatoriedade no seu código). Além disso, ele deve contornar o perímetro, encontrando o próximo mais próximo, entãof(9,list("####@#.##"))
deve colocar o personagem no único local possível (7 aqui).f(9, ...
deve retornarlist("#....##@#")
(porque 8 é gratuito e próximo a 9). 2. Algo comof(9,list("####@.#.#"))
deve ter alguma chance de retornarlist("####..#@#")
(nem semprelist("####.@#.#")
), conforme especificado "Se ambas as direções estiverem abertas, escolha uma para mover aleatoriamente".