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 :
nserá el tamaño del lado del avión. (entonces, para  , su plano será  ). Puede suponer nque siempre será un número entero impar.
sserá la posición inicial del objeto, dada como un par de coordenadas  .
Dserá un vector de pares ordenados. Dseguirá 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
0un límite,1una traza y3la 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:
0si estamos sobre un límite.1o3si 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 bytesDes 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,ycoordenadas iniciales serán dos parámetros separadossyS. La salida es una matriz de caracteres.Utiliza
#como borde,*como rastro yOpara 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:7es una versión de golf de esto a continuación utilizando4-iy8-ipara 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
ny dibuje un cuadro cuyo interior tenga ese tamaño centrado en el origen.Ingrese y salte hacia
xyy(pero lo niegayporque 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):EExplicación
fuente