Weź macierz dodatnich liczb całkowitych jako dane wejściowe i wyślij indywidualne sumy elementów na ukośnych liniach przez macierz.
Policzycie tylko te linie, które idą po przekątnej w dół i w prawo. Musisz zacząć od przekątnej, która zawiera tylko lewy dolny element, potem przekątnej długości dwa powyżej (jeśli istnieje) i tak dalej, aż do przekątnej, która zawiera tylko prawy górny element, jak pokazano poniżej.
Przykład:
Input:
8 14 5 1
10 5 5 8
6 6 8 10
15 15 4 11
Output:
15, 21, 20, 32, 29, 13, 1
(Diagonals: {{15},{6,15},{10,6,4},{8,5,8,11},{14,5,10},{5,8},{1}})
Input:
1
Output:
1
Input:
1 5
Output:
1, 5
Input:
4
1
Output:
1, 4
Input:
17 4 5
24 16 5
9 24 10
1 14 22
1 21 24
4 4 17
24 25 17
Output:
24, 29, 22, 39, 47, 70, 43, 9, 5
Formaty wejściowe i wyjściowe są jak zawsze opcjonalne.
To jest gra w golfa , więc wygrywa najkrótsze zgłoszenie w każdym języku.
Odpowiedzi:
Haskell ,
4037 bajtówWypróbuj online! Zastosowanie:
(foldl1$(.(++z)).zipWith(+).(0:)) [[1,2,3],[4,5,6]]
.Edycja: Podziękowania dla Ørjan Johansen za -3 bajty!
Nie golfowany:
z
to lista nieskończenie wielu zer. Wf
składamy listę listm
, łącząc dwie listy z funkcją#
. W#
pierwszej listys
zawiera nagromadzonych sumy kolumn pory i druga listat
jest nowy rząd, które powinny być dodawane. Przesuwamys
jeden element w prawo, dodając zero z przodu i dodając elementy zs
oraz . Ponieważ może być dowolnie duży, musimy uzupełnić odpowiednią liczbą zer .t
zipWith(+)
s
t
z
źródło
foldl1$(.(++z)).zipWith(+).(0:)
.Mathematica,
5354 bajtyCzysta funkcja przyjmuje tablicę 2D jako dane wejściowe i zwraca listę. (Wpisy nie muszą być liczbami całkowitymi ani parzystymi).
Diagonal[#,k]
Zwracak
th przekątną powyżej (lub poniżej, jeślik
jest ujemna) głównej przekątnej.{k,-l@#,l@#&@@#}
oblicza zakres potrzebnych przekątnych na podstawie wymiarów tablicy wejściowej. ITr
sumuje wpisy każdej przekątnej.źródło
Tr@Diagonal[m,#]&/@Range@@({-1,1}(Dimensions[m=#]-1))&
MATL , 6 bajtów
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
s==sum(x(:))
, gdybyś trzymał się konwencji MATLAB, jak się wydaje MATLAB?sum(x)
isum(x,1)
. W przypadku matrycyx
fakt, żesum(x)
zachowuje się inaczej, jeśli matryca ma 1 rząd, jest czasem denerwujący. Ale ostatecznie zdecydowałem się na Matlaba, więc oba języki są bliżej; i dodaj kilkafun(x,1)
funkcji dla najczęstszych przypadkówGalaretka , 5 bajtów
Wypróbuj online!
Jak to działa
źródło
ŒD
?ŒD
dziwne uporządkowanie sprawiło, że nie był użyteczny.JavaScript (ES6),
6558 bajtówźródło
a=>a.map(r=>r.map(v=>s[i]=~~s[i++]+v,i=--y),s=[],y=a.length)&&s
CJam ,
2221 bajtówZaoszczędzono 1 bajt dzięki Martinowi Enderowi
Anonimowy blok oczekuje argumentu na stosie i pozostawia wynik na stosie.
Wypróbuj online!
Jak to działa
źródło
05AB1E , 17 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
J , 7 bajtów
Wypróbuj online!
To jest dość proste:
Ukośne odwrócone linie są przekątnymi tablicy, więc jest to tylko sumowanie przekątnych.
źródło
Python 2 , 62 bajty
Wypróbuj online!
źródło
Galaretka , 8 bajtów
Wypróbuj online!
Połowa kodu służy do uporządkowania wyników we właściwej kolejności.
W jaki sposób?
źródło
Perl 5, 47 bajtów
źródło
R, 45 bajtów
Funkcja bez nazwy przyjmująca obiekt klasy macierzy jako dane wejściowe:
Wykorzystując pomysł wyjaśniony w tej odpowiedzi.
źródło
unname
, ale jest to niesamowite rozwiązanie niezależnie!Oktawa, 71 bajtów
Zakładając, że A jest macierzą, na przykład:
Potem będzie:
Zauważ, że transpozycja macierzy odwraca kolejność sum diagonalnych, co pozwoliło zaoszczędzić ogółem dwa bajty w pętli for.
Wynik:
źródło
[m,n]=size(A);for i=1:m+n-1,trace([zeros(m-1,m);A'](i:end,:)),end
oszczędza 6 bajtów. Oktawa może wykonywać bezpośrednie indeksowanie i wbudowane przypisania. Niestety, zakładanie, że zmienna istnieje w obszarze roboczym przed uruchomieniem kodu, jest niedozwolone, więc myślę, że musisz go użyćinput
, w ten sposób przywracając go do 75 bajtów. Ładne podejście, więc +1 ode mnie :) I witamy w PPCG! =)zeros(m-1,m)
można zapisać~e(m-1,m)
, oszczędzając 4 bajty :) Neat co?Python, 126 bajtów
f
działa tylko na dolnym trójkątnym odcinku, więc transponuję go i otrzymam w ten sposób górny trójkątny odcinek. Nie wiem, dlaczego taf
funkcja nie działa dla wartości ujemnych (zmieniłem sięf
na krótszy, ponieważ część polegająca na uzyskaniu negatywów nie działała).źródło
C, 148 bajtów
Wypróbuj online
źródło
PHP, 81 bajtów
Weź dane wejściowe jako tablicę 2 D.
Wypróbuj online!
źródło
Awk, 67 bajtów
Nie golfowany:
Awk dzieli się na białe znaki
$n
ton
pole th (1-indeksowane);NF
to liczba pól w linii,NR
to liczba bieżącego wiersza. Niezdefiniowane zmienne mają wartość 0 i są tworzone przy pierwszym użyciu.źródło
PHP, 86 bajtów
rozwiązanie przyjazne pamięci w dwóch wariantach:
pobiera dane wejściowe z parametrów skryptu, używa podkreślnika jako separatora;
użyj ustawień domyślnych (nie domyślnego php.ini) lub wypróbuj je online
źródło
Clojure, 81 bajtów
Całkiem gadatliwy, ponieważ uzupełnia listy zerami, dzięki czemu możemy po prostu obliczyć sumę według kolumn.
źródło
matematyka 73 bajty
Ten działa dla KAŻDEJ tablicy 2D 2D (nie tylko nxn)
wprowadź tablicę na końcu kodu w ten sposób (ostatni przypadek testowy)
dane wejściowe w formie [{a, b, c, d ...}, {m, n}]
źródło