Vous êtes un entrepreneur ferroviaire aux États-Unis au XIXe siècle, lorsque les trains deviennent populaires parce qu'ils sont le moyen le plus efficace de transporter de gros volumes de matériaux par voie terrestre. Il y a un besoin national de voies ferrées de la côte est à travers certaines terres récemment colonisées à l'ouest.
Pour répondre à ce besoin, le gouvernement américain va prélever une taxe pour subventionner les chemins de fer. Ils ont promis de payer de l'argent à votre compagnie de chemin de fer pour chaque kilomètre de voie posé. Étant donné que la pose de pistes dans les régions vallonnées et montagneuses est plus coûteuse que la pose de pistes dans les terres plates, elles ajustent la quantité qu'elles donnent en conséquence. Autrement dit, le gouvernement paiera
- 5 000 $ par mille de voie posée sur un terrain plat
- 12 500 $ par mille de voie posée sur un terrain vallonné
- 20 000 $ par mille de voie posée dans les montagnes.
Bien sûr, ce plan ne reflète pas avec précision le coût réel de la pose des voies.
Vous avez engagé des cartographes pour dessiner des cartes en relief des régions où vous allez tracer une piste pour analyser l'altitude. Voici une telle carte:
S12321
121234
348E96
Chaque chiffre représente un mile carré de terrain. S
est le point de départ, E
est le point d'arrivée. Chaque nombre représente l'intensité des changements d'altitude dans cette région.
- Le terrain numéroté 1-3 constitue un terrain plat.
- Le terrain numéroté 4-6 constitue un terrain vallonné.
- Le terrain numéroté 7-9 constitue une chaîne de montagnes.
Vous avez, grâce à des années d'expérience dans la construction de voies ferrées, évalué que le coût de la construction de voies (en dollars) satisfait cette formule:
Cost_Per_Mile = 5000 + (1500 * (Elevation_Rating - 1))
Cela signifie que la construction de certains gradients d'élévation vous coûtera plus d'argent que le gouvernement ne le donne, parfois ce sera rentable, et parfois vous atteindrez le seuil de rentabilité.
Par exemple, un mile de voie sur une pente d'élévation de 3 coûte 8000 $ à construire, mais vous ne payez que 5000 $ pour cela, vous perdez donc 3000 $. En revanche, construire un mile de voie sur une pente d'élévation de 7 coûte 14 000 $, mais vous êtes payé 20 000 $ pour cela: un bénéfice de 6 000 $!
Voici un exemple de carte, ainsi que deux chemins possibles différents.
S29 S#9 S##
134 1#4 1##
28E 2#E 2#E
La première piste coûte 30 000 $ à construire, mais le gouvernement vous paie 30 000 $. Vous ne tirez aucun profit de cette piste.
D'un autre côté, le second coûte 56 500 $ à construire, mais vous êtes payé 62 500 $ pour cela. Vous bénéficiez de 6 000 $ de cette piste.
Votre objectif: à partir d' une carte en relief, trouvez le chemin le plus rentable (ou peut-être simplement le moins cher) du début à la fin. Si plusieurs chemins sont liés, l'un d'eux est une solution acceptable.
Détails du programme
Vous obtenez une entrée de texte séparée par une carte rectangulaire de nombres et un point de début et de fin. Chaque nombre sera un entier compris entre 1 et 9. En dehors de cela, l'entrée peut être fournie comme vous le souhaitez, dans des limites raisonnables.
La sortie doit être au même format que l'entrée, avec les numéros où la piste a été construite remplacée par un hachage ( #
). En raison des réglementations arbitraires imposées par certains politiciens capricieux, les pistes ne peuvent emprunter que des voies horizontales ou verticales. En d'autres termes, vous ne pouvez pas revenir en arrière ou aller en diagonale.
Le programme devrait être capable de résoudre dans un laps de temps raisonnable (c'est-à-dire <10 minutes) pour les cartes jusqu'à 6 lignes et 6 colonnes.
Il s'agit d'un défi de golf de code , donc le programme le plus court gagne.
J'ai un exemple d'implémentation (non-golfé) .
Exemple d'E / S
S12321
121234
348E96
S12321
######
3##E##
S73891
121234
348453
231654
97856E
S#3###
1###3#
3#####
######
#####E
la source
4
dans134
l'exemple de carte6
?Réponses:
Python, 307 caractères
P
prend un chemin partielp
et renvoie toutes les façons de l'étendre pour atteindreE
. Chaque chemin renvoyé est associé à son score afin que vousmax
puissiez trouver le meilleur.Prend environ 80 secondes sur une carte 6x6.
la source
Python:
529482460 octetsMa solution ne gagnera aucun prix. Cependant, comme il n'y a que deux solutions publiées et que j'ai trouvé le problème intéressant, j'ai quand même décidé de poster ma réponse.
Edit: Merci à Howard pour ses recommandations. J'ai réussi à raser une grande partie de mon score!
la source
P
etM
ne sont utilisées qu'une seule fois donc c'est une bonne idée de s'aligner ensuite (pour une seule invocation cela fonctionne dans presque tous les cas pour deux parfois).m[c]!='S'
peut être raccourci àm[c]<'S'
, égalementabs(z)==1
àabs(z)<2
ou même-2<z<2
.Ruby, 233 caractères
Une approche Ruby en force brute qui fonctionne bien dans les contraintes de temps sur une carte 6x6. L'entrée doit être donnée sur STDIN.
Exemples:
la source