introduction
Tout le monde sait que la possibilité de naviguer avec succès dans un champ d'astéroïdes est d'environ 3 720 à 1. Cependant, malgré votre avertissement, Han Solo est toujours disposé à tenter sa chance.
Craignant pour votre vie artificielle, vous décidez de coder, dans le dialecte spécifique du navire ( lisez: votre langue préférée de Code Golf ), un programme permettant d'éviter les astéroïdes qui décidera quel chemin emprunter dans un labyrinthe ASCII de champ d'astéroïdes.
Contribution
Le Millenium Falcon possède un programme de cartographie des astéroïdes qui fournit des données similaires à celles-ci:
| ##### ######### |
| ###### # ### # |
| # # # # #### # |
@ ## ####
|# # # ### ## |
|## ## #### # # |
|#### ##### # ## |
Les rangées supérieures sont à gauche du Falcon, les rangées inférieures à droite du Falcon et les colonnes représentent ce qui se trouve devant le vaisseau.
- Chaque
#
est un obstacle. - Chaque espace est un espace vide dans lequel le navire peut voler.
- L'entrée est toujours haute de 7 caractères. C'est la limite de largeur de mappage d'astéroïde.
- La saisie comporte toujours 32 caractères (30 pour le champ et 2 pour les limites de début et de fin). C'est la limite de profondeur de cartographie d'astéroïde. Barres verticales
|
marquent le début et la fin du mappage. @
est le faucon. Il se trouve toujours dans la rangée du milieu (4ème rangée) et dans la première colonne de l'entrée.- L'espace laissé dans les barres verticales de la dernière colonne est l'endroit où le navire doit arriver. Il est toujours dans la rangée du milieu (4ème rangée) et dans la dernière colonne de l'entrée.
L'entrée peut être considérée comme une chaîne multiligne, un tableau de chaînes, à partir de paramètres STDIN ou d'une fonction, ou lue dans un fichier.
Manoeuvres possibles
TIE-Fighters vous poursuit, vous devez donc toujours aller de l'avant. Le navire peut donc voler à chaque étape de trois manières différentes:
-
Vers l'avant/
Avancer et tourner à gauche\
Avancer et tourner à droite
Par exemple, ce sont des chemins valides:
@---
--
/ \ /
@ -
-
/ \
/ \
@ \
Comme vous pouvez le constater, il y a toujours exactement un mouvement par colonne. Le Falcon est un morceau de ferraille, donc il ne peut pas faire de virages violents. Ce qui signifie des mouvements tels que /\
ou \/
sont interdits . Il doit y avoir au moins un pur attaquant-
entre deux tours opposés. Comme indiqué ci-dessus, il est également possible de tourner dans un sens pour plusieurs étapes consécutives.
Le Falcon se bloque si un mouvement entraîne le navire dans un endroit où se trouve un obstacle. Par exemple, ces mouvements entraînent des accidents:
@-#
@
\
#
#
/
@
Notez que ce n'est pas un crash:
@-#
\
-
Sortie
Vous devez sortir le même champ astéroïde ASCII, avec un chemin valide à la fin. Le Falcon doit être imprimé au point final au lieu du point de départ.
Par exemple, une sortie valide pour l'exemple d'entrée donné ci-dessus serait:
| ##### ######### |
| ###### #-------- ### # |
| # # #/ # ####\ # |
--------- ## \ #### ----@
|# # # ### \ ## / |
|## ## #### \ #/ # |
|#### ##### #-- ## |
Votre chemin doit seulement ne pas écraser le faucon. Il n'est pas nécessaire que ce soit le chemin le plus court possible.
Vous pouvez supposer qu'il y aura toujours au moins un chemin possible vers la fin.
Vous pouvez exporter vers STDOUT, dans un fichier ou un équivalent, tant que le champ de l'astéroïde est imprimé exactement comme ils le sont dans cet article (par exemple, l'affichage d'une liste de coordonnées pour le chemin d'accès n'est pas valide).
Cas de test
Un champ d'astéroïdes normal
| ##### ######### | | ###### # ### # | | # # # # #### # | @ ## #### |# # # ### ## | |## ## #### # # | |#### ##### # ## |
Sortie possible
| ##### ######### | | ###### #-------- ### # | | # # #/ # ####\ # | --------- ## \ #### ----@ |# # # ### \ ## / | |## ## #### \ #/ # | |#### ##### #-- ## |
Champ d'astéroïdes hyper-régulier
|# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # | @ # # # # # # # # # # # # # # |# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # |
Sortie possible
|# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # | -# #-# #-# #-# #-# #-# #-# #--@ |#\#/#\#/#\#/#\#/#\#/#\#/#\#/# | | #-# #-# #-# #-# #-# #-# #-# #| |# # # # # # # # # # # # # # # |
Noyau de l'étoile de la mort
| # # # # | | # # # | | # # # # # | @ # # # # # | # # # # | | # # # # # | | # # # # |
Sortie possible
| # # # -- # | | --- # # / #\ - | | / #\ # # / # \ /#\ | - # \ # #/ # - # ----@ | # \ # ---- # # | | # \#/ # # # | | # - # # # |
Tranchée étoile de la mort
|##############################| |##############################| |##############################| @ |##############################| |##############################| |##############################|
Sortie
|##############################| |##############################| |##############################| ------------------------------@ |##############################| |##############################| |##############################|
Grotte d'astéroïdes
|### ##########################| |## # ############### ## ######| |# ### ######## ### ## # #####| @ ###### ###### ### ## ### |######## ### ### ## #########| |########## # ### ## ##########| |########### #####|
Sortie possible
|###-##########################| |##/#\############### ##-######| |#/###--######## ### ##/#\#####| -######\###### ### ##/###-----@ |########--### ### ##/#########| |##########\# ### ##/##########| |###########-------- #####|
Notation
R2D2 est occupé à nager dans les marécages, vous devrez donc programmer vous-même le contrôleur du Falcon, ce qui est fastidieux. Par conséquent, le code le plus court gagne .
-
, à chaque virage, un chemin qui se définit comme un coup «en avant». Mais les mouvements réels sont toujours deux diagonales à gauche suivies de deux diagonales à droite.Réponses:
JavaScript (ES6), 186
201Snippet exécutable:
Cette fonction accepte une seule chaîne avec des nouvelles lignes. La fonction divise la chaîne en un tableau à l'aide de l'
...
opérateur et obtient l'index des(x,y)
coordonnées par(33 * y) + x
.La fonction s'exécute de manière récursive, testant différents mouvements possibles pour chaque espace. Lorsqu'il rencontre un obstacle, il renvoie une valeur de fausseté et lorsqu'il atteint l'espace de l'objectif final, il revient
true
. (Dans le code golfé, celatrue
est créé par!console.log(...)
.)Notez que ce code n'utilise pas de longs mouvements de mouvements à droite, mais les ponctue de mouvements droits. C'est la deuxième option ci-dessous, pas la première:
Cela semble être légal, puisque
-
peut légalement venir avant ou après un tour, alors pourquoi pas les deux à la fois? Cela semble particulièrement étrange à la fin, quand le dernier coup est\
mais est affiché comme@
:Mon hack de golf méchant préféré ici est un abus d'argument par défaut avec
c=k=" "
. Les arguments(i,l,c=" ")
diraient "utiliser la chaîne" "
carc
iff
n'est pas fourni un troisième argument". Cependant, en faisantc=k=" "
, on dit "sic
n'est pas fourni, enregistrez" "
dans la variable globalek
, puis enregistrez cette valeurc
". Comme la récursivité ne commence qu'avec un seul argument, ellek
est toujours initialisée au premier appel de fonction.Légèrement non-golfé:
la source
" "
une variable) qui a réduit mon score encore plus bas.C (programme complet),
249247235 octetsIl s’agit d’un programme complet qui lit l’entrée d’un fichier et affiche le résultat sur stdout. Le nom du fichier est transmis en tant que paramètre au programme.
Ungolfed:
Sortie:
la source
-
suivi par un\
, mais le\
est recouvert par le@
. (Mon programme fait la même chose.)Common Lisp, 303 octets
Je me suis bien amusé avec ce défi, c’est la première tâche que j’ai réalisée avec CodeGolf. En gros, il existe une fonction récursive simple qui essaie tous les mouvements viables jusqu'à atteindre la position finale.
Golfé / Minifié
Lit les entrées d’un fichier i dans le répertoire de travail. Je suis sûr que des améliorations sont encore possibles.
Code simple
Échantillon de sortie
la source
ActionScript 3, 364 octets
Je divise cela en deux fonctions; un pour changer le tableau en un tableau de tableaux et un autre pour calculer le chemin de vol.
Version non-golfée dans un programme avec un exemple de champ astéroïde défini:
la source