Descripción
La tarea de este desafío es diseñar un programa o función que rastree un objeto dado en un espacio .
I / O
Su programa recibirá 3 entradas, que se pueden tomar de cualquier manera sensata :
n
será el tamaño del lado del avión. (entonces, para , su plano será ). Puede suponer n
que siempre será un número entero impar.
s
será la posición inicial del objeto, dada como un par de coordenadas .
D
será un vector de pares ordenados. D
seguirá el formato , donde siempre será uno de 'N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'
, para las direcciones cardinales e intercardinales primarias, y será un número entero para el número de 'ticks'.
Dadas estas entradas, su programa debe generar un seguimiento del objeto en el plano.
Reglas
La salida debe contener los límites del plano. P.ej:
- 21012 + + ┌─────┐ 2│ │ 1│ │ 0│ │ 1│ │ 2│ │ -└─────┘
Puede usar cualquier carácter (s) para los límites, siempre que no sea un espacio en blanco (o se represente como un espacio en blanco). Los personajes que elijas deben delinear el plano completo, lo que significa que no puede haber espacios entre ellos.
Algunos planos aceptables incluyen: ┌──┐ .... ---- + - + │ │. . El | El | El | El | │ │. . El | El | El | El | └──┘; ....; ----; + - + Los aviones no aceptables incluyen: .... .... ++++. . . . + +. . . + +. . ; ....; ....; + +; . .
El objeto a rastrear puede ser cualquier personaje que elija, siempre que solo ocupe 1 espacio en el plano y sea diferente de los caracteres de límite.
La traza del objeto rastreado también puede ser cualquier personaje que elija, siempre que solo ocupe 1 espacio en el plano y sea diferente del objeto.
Si el objeto golpeara un límite, se reflejará. Si al objeto todavía le quedan movimientos, seguirá moviéndose en la dirección en que se reflejó.
Como referencia, estas instrucciones se reflejan entre sí:
El resultado final contendrá las trazas más nuevas posibles, es decir, si el objeto dejara una traza en un espacio donde ya hay una traza, el carácter de traza más nuevo sobrescribirá al anterior.
Como de costumbre, las lagunas estándar están prohibidas por defecto .
Puntuación:
Este es un desafío de código de golf .
Ejemplos:
Arreglando el asunto:
0 0 ┌─────┐ │ │ │ │ 0│ ○ │ │ │ │ │ └─────┘
0 0 ┌─────┐ │ ○ │ │ \ │ 0│ \ │ │ │ │ │ └─────┘
0 0 ┌─────┐ │∧ │ │ | \ │ 0│ ○ \ │ │ │ │ │ └─────┘
0 0 ┌─────┐ │∧ │ │ | \ │ 0│└ ○ \ │ │ │ │ │ └─────┘
(Los 0 son solo para referencia, y no necesitan estar en la salida final).
0 0 ┌─────────┐ │ │ │ │ │ │ │ ∧ │ 0│ / | │ │ ○ / | │ │⟨ / │ │ \ / │ │ ∨ │ └─────────┘
0 0 ┌─────────┐ │ ○ │ │ \ │ │ \ │ │ \ │ 0│ / | ⟩│ │ ∧ / / │ │⟨ \ / / │ │ \ \ / │ │ ∨ ∨ │ └─────────┘
Casos de prueba:
Salida:
0 0 ┌─────┐ │∧ │ │ | \ │ 0│└ ○ \ │ │ │ │ │ └─────┘
Entrada: , ,
Salida:
0 0 ┌─────────┐ │ ○ │ │ \ │ │ \ │ │ \ │ 0│ / | ⟩│ │ ∧ / / │ │⟨ \ / / │ │ \ \ / │ │ ∨ ∨ │ └─────────┘
Entrada: , ,
Salida:
0 0 ┌───┐ │ | │ 0│- ○ ┐│ │ | │ └───┘
Entrada: , ,
Salida:
0 0 ┌───────────┐ │ ∧ │ │ / \ │ │┌ - / - \ \ │ │ \ | / \ \ │ │ \ | \ \ │ 0│ | / ⟩│ │ | \ / / │ │ | / ○ │ │ | / \ │ │ ∨ \ │ │ \ │ └───────────┘
'N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'
como un entero indexado 0 (o indexado 1) en su lugar? Así se[('NW',2),('S',2),('E',1)]
convierte[[7,2],[4,2],[2,1]]
por ejemplo.Respuestas:
JavaScript (ES6), 228 bytes
(n,x,y,[[dir,len],[dir,len],...])
Emite una cadena con
0
un límite,1
una traza y3
la posición final.Pruébalo en línea!
¿Cómo?
Inicializar y dibujar en un 'lienzo' (es decir, una matriz de caracteres) es un poco tedioso y extenso en JavaScript.
Este código está utilizando una estrategia diferente: en lugar de almacenar la salida en una matriz 2D, crea una cadena carácter por carácter, de izquierda a derecha y de arriba a abajo. En cada iteración:
0
si estamos sobre un límite.1
o3
si lo hace, o un espacio de lo contrario.Con todo, este puede no ser el enfoque más corto, pero pensé que valía la pena intentarlo.
fuente
Java 10,
350343340336 bytesD
es una matriz de enteros en 2D donde las direcciones son enteros indexados en 0:N=0, NE=1, E=2, SE=3, S=4, SW=5, W=6, NW=7
. Lasx,y
coordenadas iniciales serán dos parámetros separadoss
yS
. La salida es una matriz de caracteres.Utiliza
#
como borde,*
como rastro yO
para la posición final (pero puede ser que los tres sean caracteres ASCII en el rango unicode[33,99]
para el mismo conteo de bytes si lo desea).Pruébalo en línea.
-4 bytes gracias a @ceilingcat .
Definitivamente se puede jugar un poco más al simplificar los movimientos y en qué dirección estamos viajando un poco más.
Explicación:
y<2&i<2|y>=n&i>2&i<5?4-i:x<2&i>4|x>=n&i>0&i<4?8-i:y<2&i>6?5:y<n|i!=5?i:7
es una versión de golf de esto a continuación utilizando4-i
y8-i
para la mayoría de los cambios de dirección:fuente
Carbón , 74 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Toma la entrada en el formato n, x, y, d donde d es una matriz de matrices de [distancia, dirección] pares donde la dirección es una codificación numérica 0 = sur en sentido horario a 7 = sureste. Explicación:
Ingrese
n
y dibuje un cuadro cuyo interior tenga ese tamaño centrado en el origen.Ingrese y salte hacia
x
yy
(pero lo niegay
porque el eje y del carbón aumenta cada vez más).Recorre las entradas en
d
.Extraer la dirección inicial.
Repita para la distancia deseada.
Guarda la dirección.
Haz un movimiento experimental en esa dirección.
Si esto sale por los lados, gire la dirección horizontalmente.
Si esto sale de la parte superior o inferior, gire la dirección verticalmente.
Reduzca la dirección del módulo 8 (los comandos de pivote solo aceptan valores de 0 a 7).
Deshacer el movimiento experimental.
Mire hacia la dirección correcta, luego imprima un rastro y muévase.
Vuelva a la dirección predeterminada e imprima el objeto en la posición actual.
fuente
JavaScript, 206 bytes
Toma la entrada como (n, x, y, [[dir, len], [dir, len], ...]) donde las direcciones se codifican con máscaras de bits:
Emite una cadena con
Los diferentes valores de los límites se utilizan para evaluar la siguiente dirección.
Menos golf
PRUEBA
fuente
C (gcc) ,
352323bytesGolfed 29 bytes gracias a ceilingcat.
Pruébalo en línea!
El programa toma la entrada como argumentos de línea de comando (como
a.out 10 1 1 3 5 0 4 7 2
):E
Explicación
fuente