Choisissez vos propres livres d'aventure sont une forme de littérature interactive où le lecteur doit prendre des décisions qui affectent le résultat de l'histoire. À certains moments de l'histoire, le lecteur a plusieurs options qui peuvent être choisies, chacune envoyant le lecteur vers une page différente du livre.
Par exemple, dans un cadre fantastique, on pourrait avoir à décider à la page 14 s'il faut s'aventurer dans une grotte mystérieuse en "sautant" à la page 22, ou pour explorer la forêt voisine en sautant à la page 8. Ces "sauts" peuvent être exprimés sous forme de paires de numéros de page, comme ceci:
14 22
14 8
Dans la plupart des cas, il y a de nombreuses fins à l'histoire, mais seulement quelques bonnes. L'objectif est de naviguer dans l'histoire pour arriver à une bonne fin.
Tâche:
Étant donné une liste de «sauts» pour un livre donné, votre tâche est de déterminer un itinéraire qui mènera à une fin spécifique. Comme c'est assez facile, le vrai défi est de le faire avec le moins de caractères possible.
C'est le golf de code .
Exemple d'entrée (où 1 est le début et 100 est l'objectif):
1 10
10 5
10 13
5 12
5 19
13 15
12 20
15 100
Exemple de sortie:
1 10 13 15 100
Exemple d'entrée:
15 2
1 4
2 12
1 9
3 1
1 15
9 3
12 64
4 10
2 6
80 100
5 10
6 24
12 80
6 150
120 9
150 120
Exemple de sortie:
1 15 2 12 80 100
Remarques:
- La liste des sauts sera saisie par l'utilisateur, soit à partir d'un fichier, soit de stdin. Vous pouvez choisir celui qui vous convient le mieux.
- L'entrée contiendra 1 saut par ligne, avec l'origine et la destination séparées par un seul espace.
- Il n'est pas garanti que les lignes de l'entrée soient dans un ordre spécifique.
- Un chemin réussi commencera à la page 1 et se terminera à la page 100.
- Vous pouvez supposer qu'il existe au moins 1 chemin vers l'objectif. Vous n'avez pas besoin de trouver tous les chemins, ni de trouver le plus court. Trouvez-en au moins un.
- Le plus petit numéro de page sera 1. Il n'y a pas de limite au plus grand numéro de page. (Vous pouvez supposer qu'il rentrera dans la plage d'un int.)
- Des boucles peuvent exister. Par exemple, la liste peut contenir des sauts des pages 5 à 10, 10 à 19 et 19 à 5.
- Il peut y avoir des impasses. Autrement dit, une page de destination peut ne pas avoir de destination.
- Inversement, il peut y avoir des pages inaccessibles. Autrement dit, une page d'origine peut ne pas être la destination de sauts.
- Tous les numéros de page entre 1 et 100 ne sont pas garantis pour être utilisés.
- Votre sortie doit consister en un itinéraire valide de numéros de page, commençant par 1 et se terminant à 100, séparés par des espaces.
N'oubliez pas qu'il s'agit de code golf, donc la solution la plus courte l'emporte!
EDIT: Ajout d'un autre échantillon pour les tests.
la source
Réponses:
Golfscript,
5857 caractèresAttention : c'est super-inefficace. Il fonctionne en quadrillant la matrice d'adjacence à plusieurs reprises, puis en recherchant un itinéraire; s'il y a des
E
bords dans le graphique, il trouvera tous les chemins de longueur jusqu'à 2 E (et les plus courts, il trouvera beaucoup de fois). Il devrait vous donner un résultat pour le premier cas de test dans un délai raisonnable, mais si vous voulez essayer le second, assurez-vous que vous avez quelques Go de mémoire libre et faites une longue marche.Si vous voulez une solution raisonnablement efficace, je propose à 67 caractères:
la source
cat input | ruby1.9 golfscript.rb peter.gs
et tout ce qui s'est passé c'est que mon MacBook est devenu très chaud. Comment dois-je l'exécuter?Python,
232213157 157143135132 caractères (chemin le plus court)Cette implémentation peut gérer tous les cas marginaux décrits (boucles, impasses, pages orphelines, etc.) et garantit qu'elle trouvera le chemin le plus court vers la fin. Il est basé sur l'algorithme de chemin le plus court de Djikstra.
la source
Javascript: 189 caractères
Il s'agit d'une solution récursive qui trouve le chemin le plus court dans l'aventure.
Code-Golfé:
Pour tester ( ATTENTION: boucle infinie pour mauvaise entrée! ):
Copiez l'une des chaînes de saisie suivantes (ou utilisez un format similaire pour choisir la vôtre, choisissez votre propre aventure):
1 10\n10 5\n10 13\n5 12\n5 19\n13 15\n12 20\n15 100
15 2\n1 4\n2 12\n1 9\n3 1\n1 15\n9 3\n12 64\n4 10\n2 6\n80 100\n5 10\n6 24\n12 80\n6 150\n120 9\n150 120
Collez-le dans l' invite du violon de test .
Code formaté et commenté:
Pour tester ( ATTENTION: boucle infinie pour mauvaise entrée! ):
Copiez l'une des chaînes de saisie suivantes (ou utilisez un format similaire pour choisir la vôtre, choisissez votre propre aventure):
1 10\n10 5\n10 13\n5 12\n5 19\n13 15\n12 20\n15 100
15 2\n1 4\n2 12\n1 9\n3 1\n1 15\n9 3\n12 64\n4 10\n2 6\n80 100\n5 10\n6 24\n12 80\n6 150\n120 9\n150 120
Collez-le dans l' invite du violon de test .
la source
var
mot clé ont une portée globale :)Rubis 1.9, 98
Non golfé:
la source
Perl, 88 caractères
essentiellement une version améliorée de l'entrée de Clueless; les pré-matchs et les post-matchs sont amusants :)
la source
Python -
239237236malheureusement, cette solution récursive de queue est vulnérable aux boucles de "l'histoire" ...
Utilisation : cat ./test0 | ./sol.py Sortie pour le cas de test 1:
Sortie pour le cas de test 2:
la source
Scala 2.9,
260256254252248247241239234227225212205 caractèresNon golfé:
Usage:
Compilez avec
scalac filename
et exécutez avecscala C
. L'entrée est prise viaSTDIN
.Pour exécuter sur ideone.com, passez
object C extends App
àobject Main extends Application
pour l'exécuter en tant que Scala 2.8.la source
PHP,
166146138 caractèresNon golfé:
Utilisation:
la source
STDIN
plutôt que comme arguments.Je les mettrais tous dans un tableau 2D et rechercherais tous les éléments avec plusieurs boucles, s'ils peuvent atteindre le dernier élément, je collecterais les éléments associés dans un autre tableau de résultats, et à partir des résultats, je choisirais un tableau dont l'un est plus petit .
EDIT => JAVA: J'ai également utilisé la fonction récursive, le code complet ci-dessous;
la source