Étant donné un ensemble de contours 2D fermés non superposés (séparés par au moins un espace même sur des diagonales) avec des flèches orientées de manière cohérente dans le même sens horaire ou antihoraire (chaque contour a sa propre direction) et un nombre positif n
, déplacez les flèches n
étapes le long des contours dans la direction respective. Les flèches sont représentées > v < ^
respectivement par les directions droite, bas, gauche et haut. Là, les autres caractères sont -
(horizontal), |
(vertical) et +
(coin). Lorsqu'une flèche est sur un coin, elle conserve sa direction actuelle et ne la change qu'après le virage.
Il y aura toujours un segment droit (ou un espace) entre deux coins quelconques (comme +-+
pour l'horizontale et similaire pour la verticale) - en d'autres termes, les U
virages serrés sont interdits. Les segments entre les coins sont verticaux ou horizontaux et le coude dans un coin est toujours à 90 degrés.
Contribution:
- un entier positif -
n
- nombre d'étapes - une représentation ASCII des contours - il peut s'agir d'une chaîne multiligne, d'une liste de chaînes, d'une liste de caractères, etc.
Sortie:
Les mêmes contours avec toutes les flèches ont décalé les n
pas dans la direction globale de chaque contour.
Cas de test:
1.
Contribution:
n
= 1
+----->->
| |
| v---+
| |
+---<-------+
Sortie:
+------>+
| v
| +>--+
| |
+--<--------+
2.
Contribution:
n
= 2
+-----+ +---+
| | | |
+-->--+ | v
| |
+--->---+ |
| |
+------<<---+
Sortie:
+-----+ +---+
| | | |
+---->+ | |
| |
+----->-+ v
| |
+----<<-----+
3.
Contribution:
n
= 3
+---+ +---+ +-------+
| | | v | |
^ | | | +-<-+ |
| | ^ | | v
| +---+ +-->----+ |
| |
| +-------+ +---+ |
| | | v | |
+---+ +---+ +---+
Sortie:
+>--+ ^---+ +-------+
| | | | ^ |
| | | | +---+ |
| | | | | |
| +---+ v----->-+ |
| |
| +-------+ +---+ v
| | | | | |
+---+ +-<-+ +---+
4.
Contribution:
n
= 1
+--+
| |
| +---+
| |
+----+ |
| |
+-+
Sortie:
+--+
| |
| +---+
| |
+----+ |
| |
+-+
5.
Contribution
n
= 4
^>>>>
^ v
^ v>>>>
^ v
<<<<<<<<v
Sortie:
^>>>>
^ v
^ v>>>>
^ v
<<<<<<<<v
6.
Contribution:
n
= 1
^->
^ v
<<v
Sortie:
^>+
^ v
<<v
Écrivez une fonction ou un programme résolvant la tâche ci-dessus. Le code le plus court en octets dans chaque langue gagne. Ne vous laissez pas décourager par les langues de golf. L'explication de l'algorithme et du code est très appréciée.
There will always be a straight segment (or a space) between any two corners (like +-+ for the horizontal and similar for the vertical) - in other words the sharp U turns are forbidden.
Réponses:
JavaScript (ES6),
210 ... 182180 octets(m)(n)
Essayez-le en ligne!
Comment?
Vous pouvez suivre ce lien pour voir une version formatée de la source.
Wrapper
Méthode de mise à jour
Nous ne pouvons pas déplacer chaque flèche en toute sécurité une par une, car nous courrions le risque d'écraser des flèches non mises à jour avec des flèches mises à jour. Au lieu de cela, nous supprimons d'abord toutes les flèches et calculons leurs nouvelles positions. Nous appliquons les nouveaux postes dans un deuxième temps.
Les nouveaux postes sont appliqués en faisant simplement
eval(n)
.instructions
$
Coins
+
-
|
$
"$"
"$"
"$"
Version animée
Afficher l'extrait de code
la source
K (ngn / k) ,
183 161157 157 octetsEssayez-le en ligne!
{
}/
lorsqu'il est appelé avec un argument int gauche n, cela appliquera la fonction en{
}
n fois à l'argument droitA:"^>v<"
flèchesD,:-D:(-1 0;!2)
∆y, ∆x pour les 4 directions cardinaless:(#x;#*x)
forme de l'entrée: hauteur, largeurc:~^x
countours - matrice booléenne montrant où sont les non-espacesr:" -+|"c*+/'3'0,c,0
recréer la matrice de caractères avec un compteur mais sans flèches, en comptant soi + supérieur + inférieur pour chaque cellule dansc
et en remplaçant 1->-
, 2->+
, 3->|
t:A?,/x
types de flèches: 0 1 2 3 pour^>v<
, toutes les autres cellules sont représentées comme0N
(nulles)p:+s\&~^t
coordonnées des flèches$[#p
;;:r]
s'il n'y a pas de flèches, retournezr
q:+p+/:D@4!(t^0N)+/:0 1 3
les 3 nouvelles positions possibles pour chaque flèche - si elle continue d'avancer, si elle tourne à gauche et si elle tourne à droiteq:q@'*'&'~^x ./:/:q
pour chaque flèche, choisissez la première option qui atterrit sur le countour@[,/r;s/+q;:;A@D?q-p]
aplatirr
et mettre dessus les flèches à leurs nouvelles positions et avec leurs nouvelles directionss#
remodeler à la forme d'originela source
Fusain , 105 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Comprend 22 octets utilisés pour éviter d'exiger un format d'entrée encombrant. Explication:
Saisissez facilement les contours et le nombre de pas.
Les caractères de direction sont utilisés plusieurs fois afin que la chaîne soit mise en cache ici. L'index d'un caractère de direction dans cette chaîne est appelé sa direction.
Imprimez les contours d'origine sans déplacer le curseur.
Faites une boucle sur les caractères du contour.
Si les caractères actuels sont des caractères de direction ...
... puis enregistrez la direction et la position dans une liste ...
... et remplacez le caractère par le caractère de ligne approprié.
Sinon, affichez le caractère et passez au caractère suivant.
Faites une boucle sur les positions enregistrées.
Aller à la position enregistrée.
Extrayez la direction enregistrée.
Faites une boucle sur le nombre approprié d'étapes.
Trouvez la direction de l'étape suivante, qui est une direction qui n'est ni inversée ni vide.
Faites un pas dans cette direction. (Les indices de direction du charbon de bois pour la
Move
commande sont deux fois la valeur de ma direction.)Imprimez le caractère de direction approprié.
la source
APL (Dyalog Unicode) , 111 octets SBCS
Essayez-le en ligne!
similaire à ma réponse k
la source