Otrzymujesz wielowymiarową tablicę liczb całkowitych. Każdy wymiar ma ustalony rozmiar (aby zawsze był prostokątny, jeśli jest dwuwymiarowy). Twój program powinien obliczyć sumy w każdym wymiarze i dołączyć je jako nowe ostatnie pozycje w tym wymiarze.
Załóżmy, że tablice wejściowe i wyjściowe to A i B, a rozmiar wymiaru i A wynosi n i . B miałby taką samą liczbę wymiarów jak A, a rozmiar wymiaru i wynosiłby n i +1. B j 1 , j 2 , ..., j m jest sumą A k 1 , k 2 , ..., k m gdzie:
- k i = j i jeśli j i <= n i
- 0 <k i <= n i jeśli j i = n i +1
Dla danych wejściowych:
[[1 2 3]
[4 5 6]]
Twój program (lub funkcja) powinien wypisać:
[[1 2 3 6]
[4 5 6 15]
[5 7 9 21]]
Dane wejściowe zawierają tylko tablicę. Całkowita liczba wymiarów i rozmiar każdego wymiaru nie są podane na wejściu. (Ale możesz pobrać je z tablicy za pomocą własnego kodu.) Możesz używać dowolnych wygodnych formatów list w swoim języku, o ile nie określa bezpośrednio liczby wymiarów ani rozmiarów wymiarów.
Dane wejściowe mają co najmniej 1 wymiar i co najmniej 1 element w tablicy.
To jest golf golfowy. Najkrótszy kod wygrywa.
Przypadki testowe
Input:
[5 2 3]
Output:
[5 2 3 10]
Input:
[[1 2 3] [4 5 6]]
Outputs:
[[1 2 3 6] [4 5 6 15] [5 7 9 21]]
Input:
[[[1] [1] [1] [0]]]
Output:
[[[1 1] [1 1] [1 1] [0 0] [3 3]] [[1 1] [1 1] [1 1] [0 0] [3 3]]]
Input:
[[[[-1]]]]
Output:
[[[[-1 -1] [-1 -1]] [[-1 -1] [-1 -1]]] [[[-1 -1] [-1 -1]] [[-1 -1] [-1 -1]]]]
źródło
Odpowiedzi:
J, 14 bajtów
Stosowanie:
Ta funkcja jest równoważna z poniższą,
(0|:],+/)^:(#@$)
ale używa przysłówka zdefiniowanego przez użytkownika do zapisywania parens.Objaśnienie drugiego kodu od prawej do lewej:
^:(#@$)
powtórz^:
dla liczby#
wymiarów$
:],+/
konkatenuje,
do argumentu]
z sumą w ostatnim wymiarze+/
0|:
obróć wymiary|:
, umieszczając pierwszy0
na końcu listy wymiarówPo wykonaniu powyższej procedury odzyskujemy oryginalne dane wejściowe z sumami dla wszystkich wymiarów.
W przypadku mojego starszego rozwiązania sprawdź historię zmian.
Wypróbuj online tutaj.
źródło
Mathematica,
3220 bajtówPrzykład:
Wyjaśnienie:
Pełna forma
{{1, 2, 3}, {4, 5, 6}}
toList[List[1, 2, 3], List[4, 5, 6]]
. Następnie zamień wszystkieList
s wyrażenia na funkcję({##,+##}&)
.źródło
Python 2, 95 bajtów
To iteruje każdy wymiar, konkatenując jego sumy za pomocą NumPy.
Natknąłem się na NumPy's
r_
, co jest całkiem niesamowite do gry w golfa.r_[:n]
jest krótszyrange(n)
i znacznie potężniejszy (npr_[:4, 7, 8, 10:100:10]
.). Może także wykonywać inne czynności, takie jak konkatenacja wzdłuż dowolnej osi.Przykładowe użycie:
źródło
APL,
1615 bajtówDzięki @ user23013 za grę w golfa poza 3 bajtami i ustalenie odpowiedniego formatu wejściowego.
Sprawdź przypadki testowe online za pomocą TryAPL .
Pomysł
Ogólna idea jest taka sama, jak w moim przedłożeniu CJam, dla którego APL pozwala na znacznie krótszą implementację. Składa się tylko z dwóch kroków:
Zsumuj tablicę w jej skrajnym wymiarze.
Powtórz krok 1 dla każdej podtablicy.
Kod
źródło
,⊂(,1)(,1)(,1)(,0)
i,⊂,⊂,⊂,¯1
odpowiednio. Możesz więc usunąć inną postać.Pip ,
1815 bajtówJest to anonimowa funkcja, która przyjmuje tablicę jako argument i zwraca wynik. Przykładowe wywołanie przy użyciu
-p
flagi w celu uzyskania czytelnego wyniku:Pomysł jest zasadniczo taki sam jak APL Dennisa , choć niezależnie pochodzi. Dokładniej:
Ta metoda działa, ponieważ
+
(wraz z wieloma innymi operatorami) działa w elementach na listach w Pipie - funkcja inspirowana językami programowania tablic, takimi jak APL. Więc kiedy masz$+
taką listę[[1 2 3] [4 5 6]]
, wynik jest[5 7 9]
zgodny z oczekiwaniami. Używany również w teście list lub skalar:[1 2 3] - [1 2 3]
daje[0 0 0]
, co jest zgodne z prawdą (podobnie jak wszystkie listy oprócz pustej listy).Poprzednia 18-bajtowa wersja:
Zmiany:
[1 2 3] != 123
);M
mają niższy priorytet niż?
(choć prawdopodobnie zamierzam to zmienić, szczególnie teraz): bez nich kod byłby analizowany jako(Ja=a?af)M(aAE$+a)
, co prowadzi do dziwnych komunikatów o błędach. Jednak środkowym argumentem operatora trójskładnikowego może być dowolne wyrażenie o dowolnym priorytecie, niepotrzebne nawiasy. Tak więc, czyniąc listę prawdziwym przypadkiem, mogę zapisać te dwa bajty.źródło
APL (25)
Tablice APL mają wbudowane wymiary, więc jest to funkcja, która pobiera tablicę n- wymiarową, a następnie sumuje wzdłuż każdego wymiaru.
Wyjaśnienie:
N←⍵
: zapisz tablicę wN
.⍴⍴N
: uzyskać ilość wymiarówN
ma. (⍴
podaje wymiary, tzn.⍴↑(1 2 3)(4 5 6)
daje2 3
, więc⍴⍴
podaje wymiary wymiarów).{
...}¨⍳
: dla każdej liczby od 1 do⍴⍴N
:+/[⍵]N
: sumaN
wzdłuż wymiaru⍵
N,[⍵]←
: dołącz wynik doN
tego wymiaruN
: w końcu powróćN
.źródło
↑(1 2 3)(4 5 6)
robi, to po prostu zbudowanie 2-wymiarowej tablicy z 2 1-wymiarowych przy użyciu↑
. To nie jest wbudowana notacja i nie uogólnia sposobu myślenia. Kanoniczny sposób konstruowania trzeciej i czwartej tablicy byłby1 4 1⍴1 1 1 0
i1 1 1 1⍴¯1
, ale możliwe jest również zbudowanie ich bez odwoływania się do rozmiarów, np. Trzecia tablica może być również zbudowana↑⍉⍪(,1)(,1)(,1)(,0)
, a czwarta może być zbudowana↑⍪⊂⍪¯1
.f←{0=≡⍵:⍵⋄f¨⍵,+/⍵}⋄f((1 2)(3 4))((5 6)(7 8))
), Ale wydaje się, że zagnieżdżone wektory i tablice są różne, a ta pierwsza nie odróżnia skalarów od singletonów ...{×≡⍵:∇¨⍵,+/⍵⋄⍵}((1 2)(3 4))((5 6)(7 8))
. Poprawiono:{×⍴⍴⍵:∇↓⍵,+/⍵⋄⍵}1 4 1⍴1 1 1 0
. Jest teraz krótszy niż Mathematica ...CJam, 36 bajtów
Jest to rekurencyjna funkcja o nazwie, która usuwa tablicę ze stosu i pozostawia jedną w zamian.
Wypróbuj przypadki testowe w interpretatorze CJam .
Pomysł
Niestety, CJam nie ma operatora automagicznego, który pozwala dodawać dowolnie zagnieżdżone tablice, więc musimy go sami zaimplementować. Na szczęście robi to dwóch operatorów infix,
:
(redukcja) i.
(wektoryzacja), które okażą się pomocne w tym zadaniu.Pierwszym krokiem jest obliczenie liczby wymiarów. Jest to łatwe: przekonwertuj tablicę na reprezentację ciągu i policz liczbę wiodących [ .
Teraz, aby zmniejszyć tablicę o jednym wymiarze, zwykle wystarczy wykonać
:+
:W przypadku tablicy dwóch wymiarów
+
wykonałby konkatenację zamiast dodawania, dlatego musimy ją wektoryzować:Teraz, dla tablicy trzech wymiarów,
.+
działałby na tablicach dwóch wymiarów i ponownie przeprowadzałby konkatenację. Tym razem musimy wektoryzować.+
:W ogólnym przypadku macierz wymiaru D musimy połączyć jeden
:
, D - 1.
i jeden+
.Oczywiście sumuje to tablicę tylko w jej skrajnym wymiarze. Możemy to rozwiązać, definiując funkcję S, która oblicza wymiar (i nie robi nic, jeśli jest równa zero), wykonuje sumę jak wskazano powyżej i na koniec stosuje się do elementów tablicy.
Kod
źródło
Rubinowy (
181139119108 bajtów)Zakłada, że dane wejściowe są przekazywane jako JSON.
źródło
d
tej odpowiedzi.Java, 669 bajtów
nie będę kłamał, jestem z tego dumny: p
rozszerzony o testy:
uruchomienie rozszerzonej wersji testowej drukuje to:
źródło