Cluck cluck. Personne ne sait pourquoi le poulet a traversé la route, peut-être qu'il y avait un beau coq de l'autre côté. Mais nous pouvons comprendre comment. Écrivez un programme qui, de gauche à droite, traverse cette (ou n'importe quelle) "route".
1356 | 1738
3822 | 1424
3527 3718
9809 | 5926
0261 | 1947
7188 4717
6624 | 9836
4055 | 9164
2636 4927
5926 | 1964
3144 | 8254
Votre programme le "traverse", se déplaçant de gauche à droite. Vous commencez sur n'importe quel nombre dans la colonne de gauche que vous aimez. De là, vous pouvez vous déplacer vers n'importe quel personnage adjacent à droite. Si vous avez commencé dans le coin supérieur gauche, 1, vous pouvez passer à 3 ou 8. Chaque numéro auquel vous allez, y compris le numéro de départ, est ajouté à une somme. Les espaces ne s'ajoutent pas à votre somme. "|" vous oblige à vous déplacer vers le haut ou vers le bas, plutôt que quelque part vers la droite. (Vous NE POUVEZ PAS avancer sur ce personnage) Votre objectif est d'arriver de l'autre côté avec la plus petite somme possible. Votre programme doit imprimer la somme à la fin, et il doit être capable de résoudre n'importe quelle route. De préférence, il pourrait également avoir une entrée pour une route, mais ce n'est pas obligatoire. Votre programme doit imprimer à la fois le chemin et la somme. Le moins d'octets de code gagne.
Pour clarifier, vous pouvez vous déplacer de diagnostic à moins que vous ne soyez sur une barre verticale. Vous ne pouvez vous déplacer de haut en bas que lorsque vous êtes sur une barre verticale.
Pour une spécification plus claire des routes, c'est essentiellement une chaîne de texte (ou un tableau de colonnes ou de lignes, si vous préférez penser de cette façon) qui suit les règles des caractères, et il ne peut rien y avoir MAIS ces caractères dans la route. Il peut y avoir n'importe quel nombre, un espace, une barre ("|") ou une nouvelle ligne. Si une route a été pavée par un ivrogne, comme dans la réponse de ProgrammerDan, c'est toujours une route valide, et votre programme doit être capable de résoudre une telle route. Elle n'est pas considérée comme une route s'il est impossible de se rendre de l'autre côté (par exemple, il n'y a aucun moyen de sortir d'une ligne droite de barres).
Votre programme n'est pas requis pour déterminer si une route n'est pas valide.
Clé:
N'importe quel nombre - ajoute le nombre à votre somme, avancez.
Espace - Avancez, rien n'est ajouté à votre somme.
"|" - Montez ou descendez, rien n'est ajouté à votre somme.
EDIT: Un exemple de solution, comme suggéré. Je ne peux pas en faire un horriblement gros, je ne peux pas monter sur un IDE pour le résoudre pour moi ATM.
Prenez cette petite route:
9191 | 8282
1919 | 2727
5555 5555
La solution serait un chemin de 1, 1, 1, 1, espace, diviseur, diviseur, espace, espace, 2, 2, 2, 2 pour un total de 12.
EDIT # 2: La solution à la première route sur cette question, telle que déterminée par les programmes Geobits et peuples, est 0,2,0,1,,,, 1,4,1,4 pour une somme de 13.
la source
|
d'affilée?0,2,0,1, , , ,1,4,1,4 -> 13
Réponses:
Pyth,
168143141 octets [désormais compatible Drunken Road]Mon cas de test fonctionne, mais en raison d'un malentendu de ma part, il ne fonctionnera pas correctement avec l'exemple initial. Je travaille à le réparer.Travaille maintenant pour l'exemple original et les routes ivres
Certains
vraiment unpeu moins laidcode:Testez-le ici
Je l'ai testé sur une route 10 + 9 x 40.
la source
Java, 955 octets
Évidemment, je ne gagnerai aucun prix, étant Java et tout, mais j'aime ce problème et je voulais ajouter ma propre candidature.
Caractéristiques et limites:
Ok, assez de jibba jabba. Version golfée:
Selon mon habitude, github avec le code non golfé .
Solution pour la "première" route:
Deuxième exemple:
Échantillon de Brian Tuck:
Exemple de "Drunkified" de Brian:
Solution visualisée:
Prendre plaisir!
Edit: Maintenant, je montre juste (deux routes fusionnent! Peut-il y arriver?)
Solution:
(bonus: chemin de non-golfé):
Détails sur l'algorithme
Une explication plus complète de la technique de programmation dynamique que j'ai employée a été demandée, alors voici:
J'utilise une méthode de solution de marquage et précalcul. Il a un nom propre, mais je l'ai depuis longtemps oublié; peut-être que quelqu'un d'autre peut l'offrir?
Algorithme:
Remarques:
C'est ça. Nous balayons de haut en bas, de droite à gauche, une fois; les seules cellules touchées (potentiellement) plus d'une fois sont des tuyaux, cependant, chaque tuyau n'est "résolu" qu'une seule fois, ce qui nous maintient dans notre fenêtre O (m * n).
Pour gérer les tailles de carte "impaires", j'ai choisi de simplement pré-scanner et normaliser les longueurs de lignes en remplissant les caractères par des valeurs nulles. Les caractères nuls comptent comme un "coût nul" comme les tuyaux et les espaces. Ensuite, lors de l'impression de la solution, j'arrête l'impression des coûts ou des déplacements lorsque le bord de la route normalisée est atteint ou qu'un caractère nul est atteint.
La beauté de cet algorithme est qu'il est très simple, applique les mêmes règles à chaque cellule, produisant une solution complète en résolvant les sous-problèmes O (m * n), et en termes de vitesse est assez rapide. Il échange la mémoire, créant effectivement deux copies en mémoire de la carte routière, la première pour stocker les données "au meilleur coût" et la seconde pour stocker les données "le meilleur mouvement" par cellule; c'est typique de la programmation dynamique.
la source
c
comme-1>>>1
.