Laisser A
être un m
par n
matrice rectangulaire de positifs entiers, où m
et n
sont également positifs entiers.
Nous nous intéressons aux chemins RoD («droite ou bas») de la cellule supérieure gauche de la cellule A
inférieure droite; dans un chemin RoD, chaque cellule successive du chemin est soit une cellule à droite de, soit une cellule en bas de la cellule précédente.
Étant donné un tel chemin RoD, nous pouvons prendre la somme des cellules A
dans ce chemin.
Par exemple, considérons la matrice 4 x 3:
[ [1, 2, 3, 4],
[5, 1, 6, 7],
[8, 2, 1, 1] ]
Ensuite, nous pouvons considérer le chemin RoD:
1 > 2 3 4
v
5 1 6 7
v
8 2 > 1 > 1
qui a une somme de 1+2+1+2+1+1=8
. Il convient de noter que ce chemin a la plus petite somme de tous les chemins RoD possibles du coin supérieur gauche au coin inférieur droit de cette matrice.
Ainsi, le défi proposé est de fournir la fonction / le programme le plus court dans la langue de votre choix qui génère la somme minimale qu'un chemin RoD du coin supérieur gauche au coin inférieur droit peut avoir dans une matrice donnée A
.
Les failles habituelles interdites sont en vigueur. Votre contribution peut être dans n'importe quel format raisonnable; votre sortie doit être un entier.
C'est du golf de code; les réponses sont notées par nombre d'octets.
Cas de test
[ [5] ] -> 5
[ [5, 2] ] -> 7
[ [5],
[2] ] -> 7
[ [ 9 , 1 , 12, 3 ],
[ 12, 11, 6 , 11],
[ 12, 9 , 2 , 11] ] -> 40
[ [ 6 , 8 , 11, 2 ],
[ 3 , 6 , 7 , 6 ],
[ 6 , 2 , 8 , 12] ] -> 37
[ [ 4 , 5 , 8 , 4 ],
[ 6 , 5 , 9 , 4 ],
[ 2 , 5 , 6 , 8 ] ] -> 31
[ [ 4 , 5 , 15, 18, 30],
[ 26, 26, 3 , 4 , 5 ],
[ 7 , 9 , 29, 25, 14],
[ 16, 1 , 27, 13, 27],
[ 23, 11, 25, 24, 12],
[ 17, 23, 7 , 14, 5 ] ] -> 94
[ [ 10, 15, 7 , 2 , 9 ],
[ 24, 5 , 2 , 1 , 25],
[ 2 , 12, 14, 30, 18],
[ 28, 4 , 12, 22, 14],
[ 15, 21, 21, 11, 4 ],
[ 21, 15, 21, 29, 9 ] ] -> 103
la source
JavaScript (ES6),
787776 octetsEssayez-le en ligne!
Commenté
la source
Haskell,
6357 octetsEssayez-le en ligne!
la source
MATL ,
38363029 octetsMerci à @Giuseppe d' avoir signalé une erreur, maintenant corrigée.
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
la source
R , 90 octets
Essayez-le en ligne!
La solution naïve: parcourez le tableau (en bas des colonnes), en remplaçant chaque entrée par la somme d'elle-même et le minimum de ses voisins ci-dessus et à gauche, s'ils existent, puis renvoyez la dernière entrée.
la source
Perl 6 ,
5754 octetsEssayez-le en ligne!
Explication
la source
$!
au lieu de&f
Röda ,
10089 octetsEssayez-le en ligne!
-9 octets grâce au charlatan des vaches
la source
Python 3 , 108 octets
Essayez-le en ligne!
Non golfé
la source
Gelée , 21 octets
Essayez-le en ligne!
Comment?
la source
APL (Dyalog Classic) ,
3732 octetsEssayez-le en ligne!
+⍀+\
des sommes partielles horizontalement et verticalement - cela fournit une surestimation initiale pour les chemins vers chaque carré9e9(
...)⍣≡
appliquer "..." jusqu'à convergence, à chaque étape en passant un très grand nombre (9 × 10 9 ) comme argument de gauche,
ajouter9e9
-s à gauche de l'estimation actuelle2⊣/
prendre la première de chaque paire de cellules consécutives, en supprimant efficacement la dernière colonne2⊣⌿⍪
même chose verticalement - mettre9e9
en haut et déposer la dernière rangée(2⊣⌿⍪) ⌊ 2⊣/,
minima⍵+
ajouter la matrice d'origine⊢⌊
essayer d'améliorer les estimations actuelles avec ce⊃⌽,
cellule en bas à droitela source
Fusain , 46 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication: Ce serait probablement plus court s'il y avait trois arguments
reduce
dans Charcoal.Préremplissez le tableau de travail avec de grandes valeurs à l'exception de la première qui est zéro.
Faites une boucle sur les lignes de l'entrée.
Initialisez le total actuel avec le premier élément du tableau de travail.
Faites une boucle sur les colonnes de l'entrée.
Prenez le minimum du total actuel et de l'élément actuel du tableau de travail et ajoutez l'élément actuel de l'entrée pour donner le nouveau total actuel.
Et stockez-le dans le tableau de travail prêt pour la ligne suivante.
Imprimez le total une fois la saisie terminée.
la source
Gelée , 17 octets
Essayez-le en ligne!
la source
Java 8,
197193 octets-4 octets grâce à @ceilingcat .
Essayez-le en ligne.
Explication générale:
En fait, j'ai déjà fait ce défi il y a environ un an avec le projet Euler # 81 , sauf qu'il était limité à une matrice carrée au lieu d'un
N
parM
matrice. J'ai donc légèrement modifié mon code à l'époque pour en tenir compte.Je fais d'abord la somme de la dernière ligne et de la colonne la plus à droite de la dernière cellule vers l'arrière. Utilisons donc l'exemple de matrice du défi:
La dernière cellule reste la même. La seconde dernière cellule de la rangée du bas est la somme:
1+1 = 2
et de même pour la seconde dernière cellule de la colonne de droite:1+7 = 8
. Nous continuons à le faire, alors maintenant la matrice ressemble à ceci:Après cela, nous regardons toutes les lignes restantes une par une de bas en haut et de droite à gauche (sauf pour la dernière colonne / ligne), et nous recherchons chaque cellule à la fois en dessous et à droite de la cellule pour voir lequel est plus petit.
Ainsi, la cellule contenant le nombre
6
devient8
, car en2
dessous, elle est plus petite que sa8
droite. Ensuite, nous regardons le1
suivant (à gauche), et faisons de même. Cela1
devient5
, car le4
dessous est plus petit que le8
droit.Donc, après avoir terminé avec l'avant-dernière ligne, la matrice ressemble à ceci:
Et nous continuons à le faire pour toute la matrice:
Maintenant, la toute première cellule contiendra notre résultat, qui est
8
dans ce cas.Explication du code:
la source
Brachylog ,
2625 octetsEssayez-le en ligne!
-1 octet car la coupure n'est pas nécessaire - vous ne pouvez pas prendre la tête d'une liste vide
Il y a probablement beaucoup de place pour jouer au golf, mais j'ai besoin de dormir.
L'approche se résume à essayer chaque valeur pour la sortie, la plus petite en premier, (
∧≜.
) jusqu'à ce qu'un chemin puisse être trouvé (b|bᵐ
) dans le coin inférieur droit (~g~g
) qui produit cette somme (hhX&...↰+↙X
).la source
Java (JDK) , 223 octets
Prend les entrées sous forme de liste 2D d'entiers.
19 octets supplémentaires pour
import java.util.*;
inclus.Essayez-le en ligne!
Comment ça fonctionne
la source
Python 2 , 86 octets
Essayez-le en ligne!
Si
B
est la transposition deA
, alors la définition du problème implique celaf(A)==f(B)
.A[1:]
est le tableauA
manquant sa ligne supérieure.zip(*A[1:])
est le tableauA
manquant de sa colonne la plus à gauche et transposé.sum(sum(A,()))
est la somme de tous les élémentsA
.Si
A
n'a qu'une seule colonne ou une seule ligne, il n'y a qu'un seul chemin, doncf
retourne la somme de tous les éléments dansA
; sinon, nous récursions et renvoyons la somme deA[0][0]
+ le plus petitf
deA
manquer la ligne du haut etf
deA
manquer la colonne la plus à gauche.la source