Entrada
- Una matriz binaria representa las paredes de una mazmorra.
- La posición del jugador dentro de la mazmorra.
- La dirección que el jugador está enfrentando actualmente (0 = Norte, 1 = Este, 2 = Sur, 3 = Oeste)
Salida
Una representación pseudo-3D de las paredes que están en el campo de visión del jugador, como un arte ASCII de caracteres.
A continuación hay varios marcos de salida posibles, junto con el mapa y la brújula correspondientes para ayudar a dominarlo (pero dibujar el mapa y la brújula no es parte del desafío).
Especificación
Campo de visión
El jugador tiene paredes en su campo de visión, marcada de a . A continuación se muestran las posiciones de las paredes en relación con el jugador (en amarillo), en todas las direcciones posibles.
Dibujando las paredes
Se supone que los muros se dibujan de a en este orden exacto, dado que cualquier parte dibujada previamente puede sobrescribirse con muros más cercanos. Por supuesto, puede implementarlo de manera diferente siempre que el resultado final sea el mismo.
Toda la producción se dibuja con 7 caracteres distintos: " "
, "'"
, "."
, "|"
, "-"
, "_"
y ":"
.
Debido a que detallar las formas de las paredes en el cuerpo de este desafío lo haría demasiado largo, en su lugar se proporcionan en el siguiente enlace TIO:
Los caracteres que no forman parte de un muro determinado están marcados con un "?"
en estos diagramas. Deben tratarse como caracteres 'transparentes' que no se dibujan en absoluto. Por otro lado, todos los espacios dentro de una pared son 'sólidos' y deben sobrescribir cualquier otro personaje que haya sido dibujado previamente allí.
Reglas
Sobre la entrada
- Usted puede tomar , , y en cualquier formato razonable.
- Puede usar coordenadas indexadas 0 o indexadas 1.
- Puede usar 4 valores distintos de su elección para las direcciones.
- Se garantiza que la matriz sea al menos .
- Puede suponer que siempre habrá paredes circundantes en los bordes.
- Se garantiza que el jugador se ubicará en una casilla vacía.
- La entrada está garantizada para ser válida.
Acerca de la salida
- Las paredes deben dibujarse exactamente como se describe.
- Sin embargo, el formato de salida también es flexible: cadena única, matriz de cadenas, matriz de caracteres, etc.
- Los espacios en blanco iniciales y finales son aceptables siempre que sean consistentes.
Este es el código de golf .
Casos de prueba
Todos los casos de prueba utilizan la siguiente matriz:
[ [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
[ 1, 0, 1, 1, 1, 0, 0, 0, 0, 1 ],
[ 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 ],
[ 1, 0, 0, 0, 0, 0, 1, 1, 0, 1 ],
[ 1, 0, 0, 1, 0, 0, 0, 1, 0, 1 ],
[ 1, 0, 0, 1, 1, 0, 1, 1, 0, 1 ],
[ 1, 1, 1, 1, 0, 0, 0, 0, 0, 1 ],
[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ] ]
Las siguientes entradas están utilizando coordenadas indexadas 0, con apuntando a la esquina superior izquierda.
x=3, y=3, d=0
x=6, y=4, d=3
x=4, y=4, d=1
x=1, y=5, d=2
x=7, y=7, d=3
x=6, y=6, d=1
x=8, y=1, d=2
x=7, y=6, d=1
Resultados esperados:
------------------------------ ------------------------------
x=3, y=3, d=0: x=6, y=4, d=3:
------------------------------ ------------------------------
__ __ '. .'
|'. .'| | |
| '.--------------.' | |----. |
| | | | | | '.--------. |
| | | | | | | | |
| | | | | | | | |
| | | | | | .'--------' |
| .'--------------'. | |----' |
__|.' '.|__ | |
.' '.
------------------------------ ------------------------------
x=4, y=4, d=1: x=1, y=5, d=2:
------------------------------ ------------------------------
.' __ ________________________ .'
| | |
-------. .----| | |
| '.--------.' | | | |
| | | | | | |
| | | | | | |
| .'--------'. | | | |
-------' '----| | |
| __|________________________|
'. '.
------------------------------ ------------------------------
x=7, y=7, d=3: x=6, y=6, d=1:
------------------------------ ------------------------------
'. '.
|'. |'.
| '. | '.
| | '. .- | |--.--------.--------.-
| | |: :| | | | | |
| | |: :| | | | | |
| | .' '- | |--'--------'--------'-
| .' | .'
|.' |.'
.' .'
------------------------------ ------------------------------
x=8, y=1, d=2: x=7, y=6, d=1:
------------------------------ ------------------------------
'. __ '.
|'. .'| |
| '. .' | |----.--------------.-------
| | '. .' | | | | |
| | |: :| | | | | |
| | |: :| | | | | |
| | .' '. | | | | |
| .' '. | |----'--------------'-------
|.' '.|__ |
.' .'
Desafío relacionado:
Este desafío de 2013 está estrechamente relacionado. Pero tiene un criterio ganador diferente (desafío de código), una especificación mucho más flexible de la salida y requiere E / S interactiva.
fuente
Respuestas:
Limpias (con Snappy ),
800785670644 bytes460402 bytes de código +360literal de cadena de 242 bytes(escapado aquí y en TIO porque no es válido UTF-8)
Puede verificar la longitud del literal aquí.
Pruébalo en línea!
La compresión rápida en realidad funciona bastante bien en este caso, a pesar de estar centrada en la velocidad, porque hay muchas ejecuciones de un solo carácter en la cadena que se está comprimiendo.
La cadena sin comprimir (con
#
reemplazado\n
por claridad) es:Esto codifica las versiones del lado izquierdo de los diferentes componentes de la pantalla con en
!
lugar de líneas nuevas, y en~
lugar de?
, que luego se rellenan a la derecha con~
hasta 30 caracteres antes de que se agreguen ellos mismos y sus inversiones de línea a una lista de búsqueda.El resto del código simplemente maneja la búsqueda de coordenadas con casos fuera de los límites ignorados.
fuente
Python 2 ,
864854848826810 bytesPruébalo en línea!
fuente
Carbón de leña ,
500332 bytesPruébalo en línea! El enlace es a la versión detallada del código. Enfoque algo aburrido, me temo; mucha impresión de literales de cadena comprimidos. Explicación:
Rellene la matriz con dos
0
s adicionales en cada lado.Corte una
7x7
subsección de la matriz centrada en las coordenadas dadas.Gire la matriz según corresponda para la dirección dada.
(observe el espacio final) Dibuje un
30×10
cuadro vacío para que la salida sea siempre de un tamaño consistente.Dibuja cada mitad por separado, reflexionando en el medio.
Tome un conjunto de descriptores de muro, divídalos en trozos de (cadena, coordenada y, coordenada x), filtre esos trozos que tienen un muro en la posición relevante en la mitad relevante del conjunto y realice un bucle sobre los muros. La posición se calcula extrayendo 12 muros de la matriz e indexándolos usando el índice de fragmentos, ya que esto es más atractivo que ubicar el muro directamente usando el índice de fragmentos.
Salta a las coordenadas de la pared e imprímelo. Tenga en cuenta que el reflejo niega las coordenadas X de
[0, 30)
a(-30, 0]
para que, en una pasada, el lienzo se desplace 29 caracteres a la izquierda.fuente
Rubí ,
412 391 385383 bytesPruébalo en línea!
Toma datos como una matriz de valores de verdad / falsedad (la nota
0
es verdadera en Ruby, peronil
es falsa).Emite una matriz de caracteres.
Explicación
Los bloques se dibujan de adelante hacia atrás con la distancia
n
disminuyendo y la posición de lado a ladom
desplazándose a la-1,1,0
izquierda, derecha, centro. El bloque central E en la fila más alejada se dibuja dos veces porque necesitamos verificar ambos bloques A / B y bloques C / D.n,m
yd
se utilizan para modificar los valoresx
yy
para buscar la matriza
. Six
está fuera de rangonil
se devuelve para una celda fuera de rango y no se produce ningún error, pero siy
está fuera de rangonil
se devolverá para la fila y Ruby arrojará un error de tipo cuando intente buscar la celda. Para evitar esto, la matriz se triplica en la dirección vertical antes de la búsqueda. Si se encuentra un valor verdadero, se dibuja un bloque.La salida se construye en una matriz
b
de matrices de 10 elementos que representan las columnas de la salida, y se transpone en 10 filas al final de la función. Se dibuja la cara frontal completa de todos los bloques (ya sea que aparezca en la ventana gráfica o no), por lo que se necesita espacio adicional en la matriz para evitar errores fuera de rango. El rango dej
valores en la ventana gráfica es de-15
a+14
, esto se compensa con 15 cuando se guarda en la matriz para dar un rango de0
a29
. Para cada bloque dibujado se calculan tres valores:p
yq
para las esquinas izquierda y derecha de la pared frontal, respectivamente, yr
para la parte posterior de la pared lateral.j
se itera del mínimo al máximo de estos tres valores dibujando las columnas a su vez.Hay 3 tipos de líneas: horizontal
-
o_
vertical|
o:
diagonal y diagonal con un" .'"
patrón repetitivo . Donde lasp < j < q
columnas que contienen espacios cubiertos con-
o_
se dibujan para formar la cara frontal. Dondej
está fuera de este rango, las columnas que contienen espacio,|
o:
se dibujan con símbolost=" .'"
para formar los bordes y / o la cara lateral. Esto se gestiona mediante la variablek=j
dondej
es positivo ok=-j-1
dondej
es negativo. El número de caracteres entre las mayúsculas y las minúsculas esk/3*2
. Para manejar correctamente los bordes exteriores de los bloques más lejanos donden=3
,k
debe tomarse el módulo 9, pero esto no debe hacerse para valores más pequeños den
.k
Por lo tanto, se toma módulo36/-~n
, donde se-~n
evalúa comon+1
.Código sin golf
fuente