Étant donné une séquence de nombres, trouvez le nombre minimum de sauts pour aller de la position de départ à la fin et revenez à la position de départ.
Chaque élément de la séquence indique le nombre maximum de mouvements que l'on peut déplacer à partir de cette position.
À n'importe quelle position, vous pouvez effectuer un saut d'au plus k mouvements, où k est la valeur stockée à cette position. Après avoir atteint la fin, vous ne pouvez utiliser que les positions de saut qui n'ont pas été utilisées auparavant pour le saut.
L'entrée sera donnée sous la forme d'une séquence de nombres séparés par des espaces simples. La sortie doit être un nombre unique qui est le nombre minimum de sauts utilisés. S'il n'est pas possible d'aller à la fin et de revenir à la position de départ, alors imprimez -1
Contribution:
2 4 2 2 3 4 2 2
Production:
6 (3 pour atteindre la fin et 3 pour revenir)
Contribution
dix
Production
-1
Remarque
- Supposons que tous les numéros de la séquence sont non négatifs
EDIT 1
La ligne "Ainsi, il devrait être clair que l'on peut toujours sauter de la dernière position." pourrait être déroutant, donc je l'ai retiré de la question. Cela n'aura aucun effet sur la question.
Critères gagnants:
Le gagnant sera celui avec le code le plus court.
la source
Thus, it should be clear that one can always jump from the last position.
- n'est-ce pas1 0
un contre-exemple?Réponses:
APL (Dyalog), 116
Cas de test
Approche
L'approche est une recherche par force brute utilisant une fonction récursive.
À partir de la position 1, définissez la valeur à la position actuelle sur 0 et générez un tableau des positions qui peuvent être sautées à partir de la position actuelle. Passez la nouvelle position et le tableau modifié à lui-même. Les cas de base sont lorsque la valeur à la position actuelle est 0 (ne peut pas sauter) ou atteint la fin.
Ensuite, pour chacun des tableaux générés, inversez-le et recommencez la recherche. Étant donné que les positions sautées sont définies sur 0, nous ne pouvons plus sauter à partir de là.
Pour les tableaux que nous avons atteint à la fin, trouvez ceux qui ont le nombre minimum de 0. En soustrayant le nombre de 0 dans le tableau initial donne le nombre réel de sauts effectués.
la source
Mathematica,
197193 caractèresForce brute.
la source
Mathematica 351
[Remarque: Ce n'est pas encore entièrement joué; De plus, l'entrée doit être ajustée pour s'adapter au format requis. Et la règle de ne pas sauter sur la même position deux fois doit être mise en œuvre. Il existe également des problèmes de formatage de code qui doivent être résolus. Mais c'est un début.]
Un graphe est construit avec des nœuds correspondant à chaque position, c'est-à-dire chaque chiffre d'entrée représentant un saut.
DirectedEdge[node1, node2]
signifie qu'il est possible de passer du nœud 1 au nœud 2. Les chemins les plus courts sont trouvés du début à la fin, puis de la fin au début.Usage
la source
Python 304
Je pense que cette nouvelle approche résout (j'espère!) Tous les problèmes concernant le cas [2,0] et similaire:
Dans cette version, la séquence d'entrée est parcourue (si possible) jusqu'à la fin, puis nous recommençons le processus avec la séquence inversée. Nous pouvons maintenant garantir que pour chaque solution valide l'un des sauts atterrit sur le dernier élément.
Ce sont les versions golfées:
Et quelques exemples:
la source
R - 195
Simulation:
De-golfé:
la source
Python 271
c'est ma solution:
Exemples:
Et ce sont les versions golfées (en partie maintenant):
Quelques exemples:
la source
Rubis - 246
Simulation:
la source
Ruby - environ 700 golfés. J'ai commencé une version golfée, avec des noms à un caractère pour les variables et les méthodes, mais après un certain temps, je me suis plus intéressé à l'algorithme qu'au golf, j'ai donc arrêté d'essayer d'optimiser la longueur du code. Je ne m'inquiétais pas non plus d'obtenir la chaîne d'entrée. Mon effort est ci-dessous.
Pour vous aider à comprendre comment cela fonctionne, j'ai inclus des commentaires qui montrent comment une chaîne particulière (u = "2 1 4 3 0 3 4 4 3 5 0 3") est manipulée. J'énumère des combinaisons de "roches dans le ruisseau" qui sont disponibles pour sauter. Ceux-ci sont représentés par une chaîne binaire. Je donne l'exemple 0b0101101010 dans les commentaires et montre comment il serait utilisé. Les 1 correspondent aux positions des roches disponibles pour le voyage initial; les 0 pour le voyage de retour. Pour chacune de ces allocations, j'utilise la programmation dynamique pour déterminer le nombre minimal de sauts requis dans chaque direction. J'effectue également quelques optimisations simples pour éliminer certaines combinaisons très tôt.
Je l'ai exécuté avec les chaînes données dans d'autres réponses et j'obtiens les mêmes résultats. Voici quelques autres résultats que j'ai obtenus:
J'aimerais savoir si d'autres obtiennent les mêmes résultats pour ces chaînes. Les performances sont relativement bonnes. Par exemple, il a fallu moins d'une minute pour obtenir une solution pour cette chaîne:
"3 4 3 0 4 3 4 4 5 3 5 3 0 4 3 3 0 3 4 5 3 2 0 3 4 1 6 3 2 0 4 5 3 2 0 3 4 1 6 3 0 4 3 4 4 5 0 1"
Le code suit.
la source
Haskell,
173166 octets, 159 octets dans GHCiVoici la version normale:
importer Data.List
Voici la réponse GHCi (mettez la ligne une à la fois):
Juste une bruteforce. Générez la réponse possible. (c'est-à-dire permutation de [0..n-1] avec zéro et l'élément suivant supprimés. Vérifiez ensuite si la réponse est correcte. Obtenez la longueur minimale et ajoutez par un. (Puisque les zéros de tête et de fin sont supprimés).
Comment utiliser:
j[3,4,0,0,6]
->3
la source
Data.List.permutations
ne fonctionne pas dans GHC, mais uniquement dans GHCi. Selon notre Guide des règles du golf à Haskell , vous devez soit ajouter l'importation, soit marquer votre réponse comme "Haskell GHCi". La première option est généralement préférée par les golfeurs Haskell sur ce site.a<-permutations[0..t l-1],let f=takeWhile(/=0)a
, vous pouvez écriref<-map(takeWhile(/=0))(permutations[0..t l-1])
, qui peut encore être joué au golff<-fst.span(>0)<$>permutations[0..t l-1]
. Avec cela, vous êtes de retour à 166 octets même en ajoutant l'importation: Essayez-le en ligne!