Sei A
eine m
durch n
rechteckige Matrix positiver Ganzzahlen, wobei m
und n
auch positive Ganzzahlen sind.
Wir sind an RoD-Pfaden ('Rechts-oder-Runter'-Pfaden) von der oberen linken Zelle A
zur unteren rechten Zelle interessiert . In einem RoD-Pfad ist jede nachfolgende Zelle des Pfads entweder eine Zelle rechts von oder eine Zelle nach unten von der vorherigen Zelle.
Bei einem solchen RoD-Pfad können wir die Summe der Zellen A
in diesem Pfad nehmen.
Betrachten Sie zum Beispiel die 4 x 3-Matrix:
[ [1, 2, 3, 4],
[5, 1, 6, 7],
[8, 2, 1, 1] ]
Dann können wir den RoD-Pfad betrachten:
1 > 2 3 4
v
5 1 6 7
v
8 2 > 1 > 1
das hat eine Summe von 1+2+1+2+1+1=8
. Es ist erwähnenswert, dass dieser Pfad die kleinste Summe aller möglichen RoD-Pfade von links oben nach rechts unten in dieser Matrix aufweist.
Die vorgeschlagene Herausforderung besteht also darin, die kürzeste Funktion / das kürzeste Programm in der Sprache Ihrer Wahl bereitzustellen, die bzw. das die minimale Summe ausgibt, die ein RoD-Pfad von links oben nach rechts unten in einer bestimmten Matrix haben kann A
.
Es gelten die üblichen verbotenen Lücken. Ihre Eingabe kann in jedem vernünftigen Format erfolgen. Ihre Ausgabe muss eine Ganzzahl sein.
Das ist Code-Golf; Die Antworten werden nach Anzahl der Bytes bewertet.
Testfälle
[ [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
quelle
JavaScript (ES6),
787776 BytesProbieren Sie es online!
Kommentiert
quelle
Haskell,
63.57BytesProbieren Sie es online!
quelle
MATL ,
38363029 BytesVielen Dank an @ Giuseppe für den Hinweis auf einen Fehler, der jetzt korrigiert wurde.
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
R , 90 Bytes
Probieren Sie es online!
Die naive Lösung: Durchlaufen Sie das Array (in den Spalten) und ersetzen Sie jeden Eintrag durch die Summe aus sich selbst und dem Minimum der darüber und links davon liegenden Nachbarn, sofern vorhanden. Geben Sie dann den letzten Eintrag zurück.
quelle
Perl 6 ,
5754 BytesProbieren Sie es online!
Erläuterung
quelle
$!
anstelle von&f
Röda ,
10089 BytesProbieren Sie es online!
-9 Bytes dank Kühe quaken
quelle
Python 3 , 108 Bytes
Probieren Sie es online!
Ungolfed
quelle
Jelly , 21 Bytes
Probieren Sie es online!
Wie?
quelle
APL (Dyalog Classic) ,
3732 BytesProbieren Sie es online!
+⍀+\
Teilsummen horizontal und vertikal - dies liefert eine anfängliche Überschätzung für die Pfade zu jedem Quadrat9e9(
...)⍣≡
wende "..." bis zur Konvergenz an und übergebe bei jedem Schritt eine sehr große Zahl (9 × 10 9 ) als linkes Argument,
Add-9e9
s links von der aktuellen Schätzung2⊣/
nimm die erste von jedem Paar aufeinanderfolgender Zellen und lasse die letzte Spalte effektiv fallen2⊣⌿⍪
Das Gleiche vertikal -9e9
oben auflegen und letzte Reihe fallen lassen(2⊣⌿⍪) ⌊ 2⊣/,
Minima⍵+
Fügen Sie die ursprüngliche Matrix hinzu⊢⌊
versuchen Sie damit die aktuellen Schätzungen zu verbessern⊃⌽,
Zelle rechts untenquelle
Kohle , 46 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erklärung: Dies wäre wahrscheinlich kürzer, wenn es
reduce
in Charcoal drei Argumente gäbe .Füllen Sie das Arbeitsarray mit großen Werten vor, mit Ausnahme des ersten, der Null ist.
Schleife über die Zeilen der Eingabe.
Initialisieren Sie die aktuelle Summe mit dem ersten Element des Arbeitsarrays.
Durchlaufen Sie die Spalten der Eingabe.
Nehmen Sie das Minimum der aktuellen Summe und des aktuellen Elements des Arbeitsarrays und fügen Sie das aktuelle Element der Eingabe hinzu, um die neue aktuelle Summe zu erhalten.
Und bewahren Sie das wieder in der Arbeitsgruppe auf, damit es für die nächste Reihe bereit ist.
Gibt die Gesamtsumme aus, sobald die Eingabe vollständig verarbeitet wurde.
quelle
Gelee , 17 Bytes
Probieren Sie es online!
quelle
Java 8,
197,193 Bytes-4 Bytes dank @ceilingcat .
Probieren Sie es online aus.
Allgemeine Erklärung:
Ich habe eigentlich schon diese Herausforderung vor etwa einem Jahr mit Projekt Euler # 81 , mit der Ausnahme , dass auf einer quadratischen Matrix beschränkt wurde anstelle einer
N
vonM
Matrix. Also habe ich meinen Code von damals leicht verändert, um das zu berücksichtigen.Ich summiere zuerst die unterste Zeile und die äußerste rechte Spalte von der allerletzten Zelle zurück. Verwenden wir also die Beispielmatrix der Herausforderung:
Die letzte Zelle bleibt gleich. Die zweite letzte Zelle der unteren Reihe wird die Summe:
1+1 = 2
, und das gleiche für die zweite letzten Zelle der Spalte ganz rechts:1+7 = 8
. Wir machen damit weiter, also sieht die Matrix jetzt so aus:Danach betrachten wir alle verbleibenden Zeilen nacheinander von unten nach oben und von rechts nach links (mit Ausnahme der letzten Spalte / Zeile) und suchen nach jeder Zelle, die sich sowohl unter als auch rechts davon befindet welches ist kleiner.
So ist die Zelle , die die Zahl enthält ,
6
wird8
, weil die2
darunter kleiner als die8
rechts davon. Dann schauen wir uns das1
nächste an (links) und machen dasselbe. Das1
wird5
, weil das4
darunter kleiner ist als das8
rechts davon.Nachdem wir mit der vorletzten Zeile fertig sind, sieht die Matrix folgendermaßen aus:
Und das machen wir für die gesamte Matrix weiter:
Jetzt enthält die allererste Zelle unser Ergebnis,
8
in diesem Fall.Code Erklärung:
quelle
Brachylog ,
2625 BytesProbieren Sie es online!
-1 Byte, weil der Schnitt nicht notwendig ist - Sie können den Kopf einer leeren Liste nicht nehmen
Es gibt wahrscheinlich viel Platz zum Golfen, aber ich brauche Schlaf.
Der Ansatz läuft darauf hinaus, jeden Wert für die Ausgabe (kleinster zuerst) (
∧≜.
) zu versuchen, bis ein Pfad (b|bᵐ
) zur rechten unteren Ecke (~g~g
) gefunden wird, der diese Summe (hhX&...↰+↙X
) ergibt .quelle
Java (JDK) , 223 Byte
Übernimmt die Eingabe als 2D-Liste von Ints.
Zusätzliche 19 Bytes für
import java.util.*;
enthalten.Probieren Sie es online!
Wie es funktioniert
quelle
Python 2 , 86 Bytes
Probieren Sie es online!
Wenn dies
B
die Transposition von istA
, dann impliziert die Problemdefinition diesf(A)==f(B)
.A[1:]
Fehlt dem ArrayA
die oberste Zeile? Fehltzip(*A[1:])
dem ArrayA
die Spalte ganz links und ist es transponiert?sum(sum(A,()))
ist die Summe aller Elemente inA
.Wenn
A
nur eine einzelne Spalte oder Zeile vorhanden ist, gibt es nur einen Pfad.f
Daher wird die Summe aller Elemente in zurückgegebenA
. andernfalls wir die Summe der Rekursion und das RückA[0][0]
+ die kleineren vonf
derA
fehlt die obere Reihe undf
derA
fehlte die Spalte ganz links.quelle