Pozwolić A
być m
przez n
prostokątnej matrycy dodatnich liczb całkowitych, gdzie m
i n
są również pozytywne całkowitymi.
Interesują nas ścieżki RoD („Right-or-Down”) od lewej górnej komórki A
do prawej dolnej komórki; w ścieżce RoD każda kolejna komórka ścieżki jest albo jedną komórką na prawo od niej, albo jedną komórką w dół od poprzedniej komórki.
Biorąc pod uwagę taką ścieżkę RoD, możemy wziąć sumę komórek A
na tej ścieżce.
Na przykład rozważmy macierz 4 na 3:
[ [1, 2, 3, 4],
[5, 1, 6, 7],
[8, 2, 1, 1] ]
Następnie możemy rozważyć ścieżkę RoD:
1 > 2 3 4
v
5 1 6 7
v
8 2 > 1 > 1
który ma sumę 1+2+1+2+1+1=8
. Warto zauważyć, że ta ścieżka ma najmniejszą sumę wszystkich możliwych ścieżek RoD od lewej górnej do prawej dolnej w tej macierzy.
Tak więc proponowanym wyzwaniem jest zapewnienie najkrótszej funkcji / programu w wybranym języku, który generuje minimalną sumę ścieżki RoD od lewej górnej do prawej dolnej w danej macierzy A
.
Obowiązują zwykłe zabronione luki. Twój wkład może mieć dowolny rozsądny format; Twój wynik musi być liczbą całkowitą.
To jest golf golfowy; odpowiedzi są oceniane według liczby bajtów.
Przypadki testowe
[ [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
źródło
JavaScript (ES6),
787776 bajtówWypróbuj online!
Skomentował
źródło
Haskell,
6357 bajtówWypróbuj online!
źródło
MATL ,
38363029 bajtówDzięki @Giuseppe za wskazanie błędu, teraz poprawionego.
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
R , 90 bajtów
Wypróbuj online!
Naiwne rozwiązanie: iteruj przez tablicę (w dół kolumn), zastępując każdy wpis sumą siebie i minimum jego powyższego i lewych sąsiadów, jeśli istnieją, a następnie zwróć ostatni wpis.
źródło
Perl 6 ,
5754 bajtówWypróbuj online!
Wyjaśnienie
źródło
$!
zamiast&f
Röda ,
10089 bajtówWypróbuj online!
-9 bajtów dzięki kwakowi krów
źródło
Python 3 , 108 bajtów
Wypróbuj online!
Nie golfił
źródło
Galaretka , 21 bajtów
Wypróbuj online!
W jaki sposób?
źródło
APL (Dyalog Classic) ,
3732 bajtówWypróbuj online!
+⍀+\
sumy częściowe w poziomie i w pionie - zapewnia to początkowe przeszacowanie ścieżek do każdego kwadratu9e9(
...)⍣≡
stosuj „...” aż do zbieżności, na każdym kroku przekazując bardzo dużą liczbę (9 × 10 9 ) jako lewy argument,
dodaj9e9
-s po lewej stronie obecnego oszacowania2⊣/
weź pierwszą z każdej pary kolejnych komórek, skutecznie upuszczając ostatnią kolumnę2⊣⌿⍪
to samo w pionie - umieść9e9
na górze i upuść ostatni rząd(2⊣⌿⍪) ⌊ 2⊣/,
minima⍵+
dodaj oryginalną macierz⊢⌊
spróbuj poprawić obecne szacunki⊃⌽,
dolna prawa komórkaźródło
Węgiel drzewny , 46 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Objaśnienie: Prawdopodobnie byłoby to krótsze, gdyby
reduce
w węgiel drzewny istniał trzy argumenty .Wstępnie wypełnij tablicę roboczą dużymi wartościami, z wyjątkiem pierwszej, która wynosi zero.
Pętla nad wierszami danych wejściowych.
Zainicjuj bieżącą sumę za pomocą pierwszego elementu tablicy roboczej.
Pętla nad kolumnami danych wejściowych.
Weź minimum bieżącej sumy i bieżącego elementu tablicy roboczej i dodaj bieżący element wejścia, aby uzyskać nową bieżącą sumę.
I przechowuj to z powrotem w tablicy roboczej gotowej do następnego rzędu.
Wydrukuj sumę po całkowitym przetworzeniu danych wejściowych.
źródło
Galaretka , 17 bajtów
Wypróbuj online!
źródło
Java 8,
197193 bajtów-4 bajty dzięki @ceilingcat .
Wypróbuj online.
Ogólne wyjaśnienie:
I rzeczywiście już zrobił to wyzwanie około rok temu z projektu Eulera # 81 , oprócz tego, że był ograniczony do kwadratu macierzy zamiast
N
przezM
matrycę. Więc nieco zmodyfikowałem wtedy swój kod, aby to uwzględnić.Najpierw sumuję dolny wiersz i kolumnę najbardziej na prawo od ostatniej komórki do tyłu. Użyjmy więc przykładowej macierzy wyzwania:
Ostatnia komórka pozostaje taka sama. Przedostatni komórek dolnego rzędu będzie sumą:
1+1 = 2
, a tym samym w drugim ostatniej komórki w prawej kolumnie tabeli:1+7 = 8
. Kontynuujemy to, więc teraz macierz wygląda następująco:Po wykonaniu tej czynności patrzymy na wszystkie pozostałe wiersze jeden po drugim od dołu do góry i od prawej do lewej (z wyjątkiem ostatniej kolumny / wiersza) i szukamy każdej komórki zarówno w komórce poniżej, jak i po prawej stronie, aby zobaczyć który jest mniejszy.
Komórka zawierająca liczbę
6
staje się8
, ponieważ2
pod nią jest mniejsza niż jej8
prawa strona. Następnie patrzymy na1
następny (po lewej) i robimy to samo. Że1
staje5
, bo4
pod nim jest mniejszy niż8
prawo od niego.Więc po zakończeniu drugiego do ostatniego rzędu macierz wygląda następująco:
Nadal robimy to dla całej matrycy:
Teraz pierwsza komórka będzie zawierać nasz wynik, czyli
8
w tym przypadku.Objaśnienie kodu:
źródło
Brachylog ,
2625 bajtówWypróbuj online!
-1 bajt, ponieważ wycięcie nie jest konieczne - nie możesz wziąć nagłówka pustej listy
Prawdopodobnie jest tam dużo miejsca do gry w golfa, ale potrzebuję snu.
Podejście sprowadza się do wypróbowania każdej wartości wyjściowej, od najmniejszej najpierw (
∧≜.
), aż do znalezienia ścieżki (b|bᵐ
) do prawego dolnego rogu (~g~g
), która generuje tę sumę (hhX&...↰+↙X
).źródło
Java (JDK) , 223 bajty
Pobiera dane wejściowe jako 2D listę ints.
import java.util.*;
Dołączone dodatkowe 19 bajtów .Wypróbuj online!
Jak to działa
źródło
Python 2 , 86 bajtów
Wypróbuj online!
Jeśli
B
jest to transpozycjaA
, oznacza to definicja problemuf(A)==f(B)
.A[1:]
oznaczaA
brak tablicy w górnym wierszu.zip(*A[1:])
tablicaA
nie ma swojej lewej kolumny i została transponowana.sum(sum(A,()))
jest sumą wszystkich elementów wA
.Jeśli
A
ma tylko jedną kolumnę lub pojedynczy wiersz, istnieje tylko jedna ścieżka, więcf
zwraca sumę wszystkich elementówA
; w przeciwnym przypadku powrót i rekursja sumaA[0][0]
+ mniejsząf
odA
brakuje górnego wiersza if
odA
braku lewej kolumnie.źródło