Étant donné un carré de nombres positifs, écrire un programme trouver un chemin horizontal et vertical avec la somme des nombres le long d'eux étant maximale. Un chemin horizontal va de la première colonne à la dernière et doit augmenter sa position de colonne d'une unité à chaque étape. Un chemin vertical va de la première ligne à la dernière et doit augmenter sa position d'une ligne à chaque étape. De plus, la position des rangées dans un chemin horizontal peut rester la même ou changer d'une unité dans les deux sens, de même pour les chemins verticaux.
Pour illustrer, ce qui suit pourrait être un chemin valide:
Le chemin suivant ne serait pas valide, car il recule (et reste sur la même ligne à certains endroits):
Le chemin suivant serait également invalide, car il modifie la position de la ligne de plusieurs en une seule étape:
Remarque: La solution doit s'exécuter dans un délai acceptable.
Contribution
n lignes d'entrée avec n entiers positifs séparés par des espaces chacune sont données sur l'entrée standard. 2 ≤ n ≤ 40. Chaque ligne se termine par un saut de ligne. Les nombres sont suffisamment petits pour que la somme maximale tienne dans un entier signé 32 bits.
Production
Somme maximale des trajets horizontal et vertical (dans cet ordre) séparés par un seul espace.
Exemple d'entrée 1
1 2
1 2
Exemple de sortie 1
3 4
Exemple d'entrée 2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2 1 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 4 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 4 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 5 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Exemple de sortie 2
37 35
Exemple d'entrée 3
683 671 420 311 800 936
815 816 123 142 19 831
715 588 622 491 95 166
885 126 262 900 393 898
701 618 956 865 199 537
226 116 313 822 661 214
Exemple de sortie 3
4650 4799
Pour votre commodité, nous avons préparé quelques cas de test en bash (grâce à Ventero ) et PowerShell à travers lesquels vous pouvez exécuter votre programme. L'invocation est:, <test> <command line>
donc quelque chose comme ./test python paths.py
ou ./test.ps1 paths.exe
. S'amuser :-)
bash
script de test! Je souhaite que tout le golf de code soit livré avec un tel.Réponses:
GolfScript - 49 caractères améliorés Nabb
51 caractères50caractèresstrictement et absolument nécessaires + 3 slackers qui n'ont fait que le travail de 156 caractères pour la plupart redondants51 solution:
53 solution:
La méthode fonctionne sur deux lignes à la fois, l'une contenant les sommes maximales atteintes à chaque point et l'autre contenant la ligne suivante.
a / 14: Répétez deux fois, une fois pour chaque résultat.
8: Prenez la première ligne de l'entrée et passez-la derrière le tableau d'entrée, ceci est maintenant le premier ensemble de sommes maximales.
b / 13: Itère sur chaque ligne restante du tableau.
9: Mettez 0 au début des sommes maximales.
c / 12: Itérer sur chaque élément de la ligne.
10: Faites une copie des sommes maximales avec le premier élément supprimé.
11: Prenez les 3 premiers éléments des sommes maximales, triez-les et ajoutez le plus grand à l'élément courant de la ligne.
56 solution:
1: De l'entrée au tableau de tableaux en 9 caractères, cela aurait pu être fait avec seulement 1, mais j'ai cassé cette clé donc cela devra faire.
2: 4 caractères juste pour faire une copie transposée.
3: Tableau de 99 0 en 5 caractères, cela pourrait probablement être fait de manière plus intelligente, mais je fume trop de weed pour comprendre comment.
4: Double boucle trop compliquée qui itère sur chaque élément de l'entrée et fait une logique floue ou quelque chose comme ça pour produire le résultat. Nabb fera probablement quelque chose d'équivalent en 3½ caractères environ.
5: Le résultat est maintenant là, à l'intérieur d'un tableau qui est, ce morceau de code idiot est juste là pour le sortir (et jonque un morceau de restes (et mettez le résultat en place)).
6: Il s'agit d'une commande si simple que son nombre de caractères serait probablement négatif dans une solution optimale. 7: À ce stade, le programme est vraiment terminé, mais en raison de la négligence du code précédent, la sortie est dans le mauvais ordre et manque d'espace, alors voici quelques bits de plus.
la source
{}*
place de(\{}%
.J, 91
95Je refuse de faire des IO, ce qui réduit considérablement mon score.Réussit tous les tests dans le faisceau de tests (bien que cela ne fonctionne que si l'entrée se termine par une fin de ligne, comme dans le faisceau de tests).J'ai supprimé la gestion des fins de ligne Windows, car Chris a suggéré que ce n'était pas nécessaire. La version multi-plateforme aurait
a=:".;._2 toJ(1!:1)3
comme première ligne.Explication:
f
donne la paire de solutions en appelant p normalement et avec une entrée transposée (|:
).p
prend le maximum (>./
) des totaux de ligne à appliquerc
entre chaque ligne (c/
)c
prend deux lignes (x et y). Il ajoute x à chacun des y, y décalé d'une cellule (1|.!.0 y
) et y décalé d'une cellule (_1|.!.0 y
). Ensuite, il prend le maximum des trois alternatives pour chaque ligne. (>./
). Le reste est de rang [sic] - je ne sais pas si je le fais bien.la source
Haskell: 314 caractères nécessaires
Remarque: cela nécessite le module Data.Vector . Je ne sais pas si c'est inclus dans la plate-forme Haskell ou non.
Version non golfée:
Cette solution utilise la paresse, en tandem avec Data.Vector , pour la mémorisation. Pour chaque point, la solution pour le chemin maximum de celui-ci à la fin est calculée, puis stockée dans la cellule de Vector
m
et réutilisée en cas de besoin.la source
Ruby 1.9, 155 caractères
Solution simple qui passe tous les tests.
la source
Haskell, 154 caractères
la source
zipWith3
raccourcira le code?foldl1 max
, qui ajoute des caractères mais vous permet de factoriser foldl1 et max, ce qui devrait sauver les caractères.maximum.foldl1
,max
Etmax
--vs--f=foldl1;m=max;
,f m.f
,m
etm
. - ou 20 contre 22. Donc, non, ça ne sauve pas.m=max
. Qu'en est-il de zipWith3?J, 109 + 10 = 119 caractères
Courir avec
tr
:Comme d'habitude dans J, la majeure partie du code est destinée aux entrées / sorties. Le code "réel" est de 65 caractères:
Réussit tous les cas de test
la source
#!/usr/bin/env jconsole
sur le fichier et définissez le drapeau exécutable.Python, 149
Si je devais calculer uniquement un chemin le plus court vertical ou horizontal,
cela pourrait être fait sur place à la place, économisant environ un tiers des octets.
la source
Python, 204 caractères
la source