Algunos `` me gusta '' basados en texto no te permiten caminar hacia las paredes y te permiten retroceder si lo intentas. ¿Por qué hacer eso cuando puedes hacer que el jugador se mueva en la dirección válida más cercana?
El reto
Escriba un programa de función que, dada una dirección y una cuadrícula de caracteres de 3 por 3, genere la misma cuadrícula después de que el jugador haya dado un paso.
Por ejemplo,
9
#..
.@#
#.#
se convierte
#.@
..#
#.#
Entrada
La dirección viene dada por un solo dígito del 1 al 9, cada uno correspondiente a 8 direcciones cardinales y detenido. Esto se deriva de las ubicaciones relativas de los números en un teclado:
NW N NE .. \ | / / ... 7 8 9 W- 4 5 6 -E ... 1 2 3 ../ | \ SW S SE
Sin embargo, también puede usar los números 123, 456, 789 en lugar de 789, 456, 123. En otras palabras, puede intercambiar las 2 filas o números superiores e inferiores si así lo desea. Estas son las únicas 2 combinaciones de índice aceptables.La cuadrícula de 3 por 3 constará de 3 caracteres ASCII distintos e imprimibles que representan el piso, las paredes y el jugador que se pueden caminar. (En los casos de prueba,
.
se usa para piso,#
s son paredes y@
es el jugador)- Puede elegir qué caracteres usa su programa, pero debe indicarlos en su respuesta y deben ser consistentes en varias pruebas.
- El personaje que representa al personaje siempre estará en el medio de la cuadrícula de 3 por 3, y la dirección siempre estará entre 1 y 9 (incl.)
- Puede tomar entrada en cualquier orden
- La cuadrícula de 3 por 3 se puede ingresar como una matriz de caracteres, una matriz de cadenas, una cadena de 9 longitudes u otra alternativa razonable.
Salida
- Regresar de una función o salida a StdOut o la alternativa más cercana
- Se permiten espacios finales y líneas nuevas
- Debe usar las mismas representaciones de caracteres que la entrada
- Los mismos formatos permitidos para entradas están permitidos para salidas
Cómo se mueve el jugador
Si la dirección especificada está bloqueada por un muro (por ejemplo, si el ejemplo anterior tenía la dirección 6), mire las 2 direcciones más cercanas:
- Si una (y solo una) dirección es libre, mueva al jugador en esa dirección.
- Si no hay direcciones libres, mira las siguientes 2 direcciones más cercanas (excluyendo la dirección 5). Si has dado la vuelta y no has encontrado una dirección abierta (jugador rodeado de paredes), no muevas al jugador
- Si ambas direcciones están abiertas, elija una para moverse al azar (aunque no necesariamente de manera uniforme).
Si la dirección dada es un 5, no muevas al jugador
Casos de prueba
( #
= pared, .
= piso, @
= jugador)
Entrada: 9 9 # .. . @ # #. # Salida: #. @ .. # #. # Entrada: 3 # .. . @ # #. # Salida: # .. .. # # @ # Entrada: 7 7 ##. # @ # .. # Salida: ## @ ##. #. # o #. # .. # @. # Entrada: 5 5 ... . @. ... Salida: ... . @. ... Entrada: 2 ### # @ # ### Salida: ### # @ # ###
Puntuación
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
yuhjklbn
? Q.E.P.D.123;456;789
lugar de789;456;123
?Respuestas:
Pyth -
7370 bytesIntentalo
La entrada consta de dos líneas:
1a línea: dirección del movimiento
Segunda línea: el tablero (posiciones 123456789, siendo 123 la fila superior)
fuente
JavaScript (ES6),
192163 bytesNotas
Esta función utiliza un formato de entrada especial. La primera entrada es una matriz de enteros (
0
parafloor
,1
parawall
y2
paraplayer
) que representan el mapa. La segunda entrada es la dirección (invertida):1
es noroeste,2
es norte,3
es noreste,4
es oeste, etc. Las entradas deben darse a través de la sintaxis de curry (Z(a)(b)
).Casos de prueba
Los mapas y las direcciones se han modificado para adaptarse a mi formato de entrada.
fuente
Python 3,
120104153176175 bytesPruébalo en línea!
Este método obtiene la dirección y la lista de '.', '#' Y '@'. Los índices comienzan con 1 a 9 (con 0 a 8 en la lista realmente). Entonces tiene la forma
Método devolver nueva lista con nuevas posiciones.
Esta línea
devuelve una lista de este tipo:
Calculamos distancias a puntos libres y agregamos aleatoriedad. Porque
ord('#') <= ord('.') - 8 and ord('.') + 8 <= ord('@')
podemos decir que el '.' Más cercano para n = 7 (índice en la lista) tiene un índice de 8.Ejemplo:
fuente
','
(que es el caso para los casos de prueba 2, 3 y 5). 2) Su formato de E / S no parece ser el mismo que en la pregunta. Por favor mencione su formato de E / S.f(9, ...
no funciona: coloca el personaje en 2, pero las posiciones más cercanas a 9 son 6 y 8, por lo que una de ellas debe seleccionarse al azar (tampoco hay aleatoriedad en su código). Además, debe rodear el perímetro para encontrar el siguiente más cercano, por lo quef(9,list("####@#.##"))
debe colocar al personaje en el único lugar posible (7 aquí).f(9, ...
debería volverlist("#....##@#")
(porque 8 es gratis y junto a 9). 2. Algo asíf(9,list("####@.#.#"))
debería tener alguna posibilidad de regresarlist("####..#@#")
(no siemprelist("####.@#.#")
) como se especifica "Si ambas direcciones están abiertas, elija una para moverse al azar".