La description
La tâche de ce défi est de concevoir un programme ou une fonction qui suit un objet donné dans un espace .
E / S
Votre programme recevra 3 entrées, qui peuvent être prises de n'importe quelle manière sensée :
n
sera la taille du côté de l'avion. (donc, pour , votre avion sera ). Vous pouvez supposer que ce sera toujours un entier impair.n
s
sera la position de départ de l'objet, donnée sous la forme d'une paire de .
D
sera un vecteur de paires ordonnées. D
suivra le format , où sera toujours l' un des , pour les directions cardinale et primaire intercardinale, et sera un entier pour le nombre de «ticks».'N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'
Compte tenu de ces entrées, votre programme doit générer un suivi de l'objet dans l'avion.
Règles
La sortie doit contenir les limites de l'avion. Par exemple:
- 21012 + + ┌─────┐ 2│ │ 1│ │ 0│ │ 1│ │ 2│ │ -└─────┘
serait un exemple d'un avion vide . Les chiffres au-dessus et sur le côté sont pour référence seulement et n'ont pas besoin d'être imprimés.
Vous pouvez utiliser n'importe quel caractère pour les limites, tant qu'il ne s'agit pas d'espaces (ou s'affiche en tant qu'espaces). Les caractères que vous choisissez doivent délimiter le plan complet, ce qui signifie qu'il ne peut y avoir aucun espace entre eux.
Certains avions acceptables comprennent: ┌──┐ .... ---- + - + │ │. . | | | | │ │. . | | | | └──┘; ....; ----; + - + Les avions non acceptables comprennent: .... .... ++++. . . . + +. . . + +. . ; ....; ....; + +; . .
L'objet à suivre peut être le personnage que vous choisissez, tant qu'il n'occupe qu'un espace dans l'avion et est différent des caractères de limite.
La trace de l'objet suivi peut également être celle des personnages que vous choisissez, tant qu'ils n'occupent qu'un espace dans l'avion et sont différents de l'objet.
Pour chaque élément de , l'objet doit déplacer espaces vers , et laisser une trace derrière.
Si l'objet heurte une limite, il sera reflété. Si l'objet a encore des mouvements à gauche, il continuera à se déplacer dans la direction à laquelle il a été réfléchi.
Pour référence, ces directions se reflètent mutuellement:
→ lorsque la limite supérieure ou inférieure est respectée;
→ lorsqu'une limite latérale est rencontrée;
La sortie finale contiendra les traces les plus récentes possibles, c'est-à-dire que si l'objet laisse une trace dans un espace où il y a déjà une trace, le caractère de trace le plus récent remplacera l'ancienne.
Comme d'habitude, les failles standard sont interdites par défaut .
Notation:
Il s'agit d'un défi de code-golf .
Exemples:
Entrée: , ,
Élaborer:
0 ┌─────┐┐ │ │ │ │ 0│ ○ │ │ │ │ │ └─────┘┘
0 ┌─────┐┐ │ ○ │ │ \ │ 0│ \ │ │ │ │ │ └─────┘┘
0 ┌─────┐┐ │∧ │ │ | \ │ 0│ ○ \ │ │ │ │ │ └─────┘┘
, qui sera la sortie.
0 ┌─────┐┐ │∧ │ │ | \ │ 0│└ ○ \ │ │ │ │ │ └─────┘┘
(Les 0 sont juste pour référence, et ils n'ont pas besoin d'être dans la sortie finale.)
Entrée: , ,
Notez que, lorsque :
0 ┌─────────┐ │ │ │ │ │ │ │ ∧ │ 0│ / | │ │ ○ / | │ │⟨ / │ │ \ / │ │ ∨ │ └─────────┘
L'objet a été réfléchi deux fois : une fois en atteignant le bas de l'avion en allant vers le , où il se réfléchit vers le ; puis une nouvelle fois en atteignant le côté gauche de l'avion, où correspond à .
La sortie finale arrive à :
0 ┌─────────┐ │ ○ │ │ \ │ │ \ │ │ \ │ 0│ / | ⟩│ │ ∧ / / │ │⟨ \ / / │ │ \ \ / │ │ ∨ ∨ │ └─────────┘
Cas de test:
Entrée: n = 5 , s = ( 0 , 0 ) , D = [ ( ′ N W ′ , 2 ) , ( ′ S ′ , 2 ) , ( ′ E ′ , 1 )
Production:
0 ┌─────┐┐ │∧ │ │ | \ │ 0│└ ○ \ │ │ │ │ │ └─────┘┘
Entrée: , ,
Production:
0 ┌─────────┐ │ ○ │ │ \ │ │ \ │ │ \ │ 0│ / | ⟩│ │ ∧ / / │ │⟨ \ / / │ │ \ \ / │ │ ∨ ∨ │ └─────────┘
Entrée: , ,
Production:
0 ┌───┐ │ | │ 0│- ○ ┐│ │ | │ └───┘
Entrée: , ,
Production:
0 ┌───────────┐ │ ∧ │ │ / \ │ │┌ - / - \ \ │ │ \ | / \ \ │ │ \ | \ \ │ 0│ | / ⟩│ │ | \ / / │ │ | / ○ │ │ | / \ │ │ ∨ \ │ │ \ │ └───────────┘
'N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'
plutôt prendre comme un entier indexé 0 (ou indexé 1)? Ainsi[('NW',2),('S',2),('E',1)]
devient[[7,2],[4,2],[2,1]]
par exemple.Réponses:
JavaScript (ES6), 228 octets
(n,x,y,[[dir,len],[dir,len],...])
Génère une chaîne avec
0
pour une limite,1
une trace et3
la position finale.Essayez-le en ligne!
Comment?
L'initialisation et le dessin dans une «toile» (c'est-à-dire une matrice de caractères) est un peu fastidieux et long en JavaScript.
Ce code utilise une stratégie différente: au lieu de stocker la sortie dans un tableau 2D, il construit une chaîne caractère par caractère, de gauche à droite et de haut en bas. À chaque itération:
0
si nous dépassons une limite.1
ou3
si c'est le cas, soit un espace sinon.Dans l'ensemble, ce n'est peut-être pas l'approche la plus courte, mais j'ai pensé que cela valait la peine d'essayer.
la source
Java 10,
350343340336 octetsD
est un nombre entier 2D-réseau dans lequel les directions sont des nombres entiers 0 indexées:N=0, NE=1, E=2, SE=3, S=4, SW=5, W=6, NW=7
. Lesx,y
coordonnées de départ seront deux paramètres séparéss
etS
. La sortie est une matrice de caractères.Il utilise
#
comme bordure,*
comme piste etO
pour la position de fin (mais il peut s'agir de trois caractères ASCII dans la plage unicode[33,99]
pour le même nombre d'octets si vous le souhaitez).Essayez-le en ligne.
-4 octets grâce à @ceilingcat .
Peut certainement être joué un peu plus en simplifiant les mouvements et dans quelle direction nous voyageons un peu plus.
Explication:
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
est une version golfée de ceci ci-dessous en utilisant4-i
et8-i
pour la plupart des changements de direction:la source
Fusain , 74 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Prend l'entrée au format n, x, y, d où d est un tableau de tableaux de [distance, direction] paires où la direction est un codage numérique 0 = sud dans le sens horaire à 7 = sud-est. Explication:
Saisissez
n
et dessinez une boîte dont l'intérieur est cette taille centrée sur l'origine.Entrez et passez à
x
ety
(mais annulezy
car l'axe Y du charbon de bois augmente vers le bas).Parcourez les entrées dans
d
.Extraire la direction initiale.
Répétez l'opération pour la distance souhaitée.
Enregistrez la direction.
Faites un mouvement expérimental dans cette direction.
Si cela sort des côtés, inversez la direction horizontalement.
Si cela sort du haut ou du bas, inversez la direction verticalement.
Réduisez la direction modulo 8 (les commandes de pivot acceptent uniquement les valeurs de 0 à 7).
Annulez le mouvement expérimental.
Faites face à la bonne direction, puis imprimez une trace et déplacez-vous.
Revenez dans la direction par défaut et imprimez l'objet dans la position actuelle.
la source
JavaScript, 206 octets
Prend l'entrée comme (n, x, y, [[dir, len], [dir, len], ...]) où les directions sont codées à l'aide de masques de bit:
Sort une chaîne avec
Les différentes valeurs des limites sont utilisées pour évaluer la prochaine direction
Moins golfé
TESTER
la source
C (gcc) ,
352323 octetsGolfé en bas de 29 octets grâce au plafond.
Essayez-le en ligne!
Le programme prend l'entrée comme arguments de ligne de commande (comme
a.out 10 1 1 3 5 0 4 7 2
):E
et en tournant dans le sens horaire) etExplication
la source