Nie nakładająca się suma macierzy
Biorąc pod uwagę k tablic o długości n , wypisz maksymalną możliwą sumę, używając jednego elementu z każdej tablicy, tak aby żadne dwa elementy nie były z tego samego indeksu. Gwarantuje się, że k <= n.
Wkład
Niepusta lista niepustych tablic liczb całkowitych.
Wydajność
Liczba całkowita reprezentująca maksymalną sumę.
Przykłady
Input -> Output
[[1]] -> 1
[[1, 3], [1, 3]] -> 4
[[1, 4, 2], [5, 6, 1]] -> 9
[[-2, -21],[18, 2]] -> 0
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] -> 15
[[1, 2, 3, 4], [5, 4, 3, 2], [6, 2, 7, 1]] -> 16
[[-2, -1], [-1, -2]] -> -2
code-golf
array-manipulation
Quintec
źródło
źródło
Odpowiedzi:
Galaretka ,
106 bajtówWypróbuj online!
(4 bajty zapisywane przez @Dennis, który wskazał, że miał „Jelly sumy głównej przekątnej” wbudowanego polecenia byłem. Nie spodziewałem się, że jeden z tych; poprzednie rozwiązanie wdrożone działania bez użycia polecenie wbudowane operacji w pytaniu.
Æṭ
, jest zdefiniowany jako „ślad”, ale ślad jest zdefiniowany tylko dla macierzy kwadratowych; Jelly implementuje uogólnienie również do macierzy prostokątnych.)Poprawa w stosunku do innych odpowiedzi wynika głównie z prostszego (a więc szybszego do wyrażenia) algorytmu; program ten został pierwotnie napisany w Brachylog v2 (
{\p\iᶠ∋₎ᵐ+}ᶠot
), ale Jelly ma kilka wbudowanych części programu, które muszą być napisane w Brachylog, więc wyszło to krócej.Wyjaśnienie
Powinno być jasne, że dla każdego rozwiązania problemu możemy permutować kolumny oryginalnej matrycy, aby umieścić to rozwiązanie na głównej przekątnej. To rozwiązanie po prostu odwraca to, znajdując wszystkie możliwe główne przekątne permutacji.
Zauważ, że operacja „permutuj kolumny” jest wykonywana jako „transponuj, permutuj wiersze” bez zawracania sobie głowy transpozycją; reszta algorytmu jest symetryczna względem głównej przekątnej, więc nie musimy cofać transpozycji, dzięki czemu możemy zaoszczędzić bajt.
źródło
ZŒ!ÆṭṀ
oszczędza cztery bajty. Wypróbuj online!ZŒ!ŒD§ṀḢ
zanim sobie przypomniałemÆṭ
.J , 28 bajtów
Wypróbuj online!
W tym przypadku odbywa się wywołanie rekurencyjne, za pomocą
$:
którego reprezentowana jest największa anonimowa funkcja go zawierająca. Mamy szczęście w J, że mamy prymitywx u\. y
, który stosuje sięu
do kolejnych „przyrostków”y
uzyskanych przez tłumienie kolejnych przyrostków długościx
przedmiotówy
; tutaj chcemy zlikwidować kolejne kolumny, aby uzyskać „nieletnich”, więc transponujemy|:
niższe rzędy (lub ogon}.
)y
, a następnie powtórzymy transpozycję ich outfiksów.źródło
Python 3 ,
94 90 89 8480 bajtów-4 bajty dzięki xnor (używanie zestawów zamiast list)!
Wypróbuj online!
źródło
y
zestaw do skracania czek członkostwa:f=lambda x,y={-1}:x>[]and max(e+f(x[1:],y|{i})for(i,e)in enumerate(x[0])if{i}-y)
.-1
sztuczka jest naprawdę sprytna :) Wielkie dzięki!Łuska ,
12 119 bajtówWypróbuj online!
Dzięki BMO za zasugerowanie portu odpowiedzi ais523 i 2-bajtowego oszczędzania, które udało mi się ulepszyć, a BMO zrzuciło jeszcze 2 bajty.
Poprzednie rozwiązanie (14 bajtów)
Wypróbuj online!
Nie mogłem utworzyć pakietu testowego, ponieważ w tej odpowiedzi jawnie użyto pierwszego argumentu wiersza poleceń. Ale Husk w ogóle nie używa STDIN, więc zawarłem tam wszystkie przypadki testowe, więc możesz po prostu skopiować wklej w polu argumentu, aby to sprawdzić. Zauważ też, że tablice w Husk nie mogą zawierać spacji między elementami podczas wprowadzania.
Jak to działa?
Podział kodu
Przykład
Z każdego należy wybrać dokładnie jeden indeks, aby żadne dwa wskaźniki nie były zgodne. Tak więc generujemy zakresy długości wierszy i zachowujemy tylko te bez duplikatów, uzyskując następujące kombinacje (każda kombinacja to kolumna zamiast wiersza, aby zaoszczędzić miejsce):
Następnie program indeksuje na listach wejściowych każdy element kombinacji, zwracając:
źródło
JavaScript (ES6),
7471 bajtówDzięki @tsh za zidentyfikowanie 2 bezużytecznych bajtów, które zostały użyte do naprawy błędu
Zapisano 3 bajty dzięki @tsh
Wypróbuj online!
źródło
0
z tablicy wejściowej,-1+(-1)
jest-2
i jest poprawną odpowiedzią.f=([a,...r],k,i=1)=>a?Math.max(...a.map(c=>k&(i+=i)?-1/0:c+f(r,k|i))):0
To dziwne, aleMath.max
oszczędza bajty ...Galaretka ,
1312 bajtówWypróbuj online!
Alternatywna wersja, 11 bajtów
Korzysta z nowo dodanego
œ!
wbudowanego, który generuje wszystkie permutacje o danej długości.Wypróbuj online!
Jak to działa
źródło
XLṗL
zamiastJ€Œp
.Haskell , 65 bajtów
Wypróbuj online!
Wyjaśnienie i nieprzygotowany
Funkcja
take i<>drop(i+1)
pobiera listę i usuwa element na pozycjii
.Funkcja
f
pobiera każdy możliwy elemente
w pozycjii
, usuwa elementy w pozycjii
z pozostałych elementów i dodajee
do obliczonego rekurencyjnie optimum:Podstawowym przypadkiem pustej listy jest po prostu
0
:źródło
Brachylog , 18 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Perl 6 ,
5049 bajtówWypróbuj online!
Całkiem krótko, nawet pomimo długiego
permutations
połączenia. Jest to anonimowy blok kodu, który pobiera listę list i zwraca liczbę.Wyjaśnienie:
źródło
K (oK) ,
40, 32, 28,19 bajtów-13 bajtów dzięki ngn!
Wypróbuj online!
Wstępne rozwiązanie:
Wypróbuj online!
Uwaga: nie działa dla pierwszego przypadku testowego [[1]]
Wyjaśnienie:
{ }
- funkcja z argumentemx
źródło
prm
można zastosować bezpośrednio do listy w celu wygenerowania jej permutacji=
, ale wynik był dłuższy. Czy jestflatten
w porządku?flatten
w jakim sensie?(1 2 3; 4 5 6; 7 8 9) -> (1 2 3 4 5 6 7 8 9)
,/
lub jeśli chcesz, aby wchodziła w głębsze struktury:,//
Haskell , 65 bajtów
Wypróbuj online!
71 bajtów
Wypróbuj online!
Do
[x|x<-a,y<-a,x==y]==a
kontroli, że elementya
są różne. To zużywa zaskakującą liczbę postaci, ale nie widziałem krótszej drogi.źródło
Pyth,
1512 bajtówWypróbuj online tutaj .
Edycja: zapisane 3 bajty dzięki uprzejmości issacg
źródło
.PUlhQl
można zastąpić.plh
.V
domyślnie ignoruje wszelkie dodatkowe wpisy.05AB1E ,
1813 bajtówMam wrażenie, że jest zbyt długi, ale nie jestem pewien, jak efektywnie wektoryzować bajtowe indeksowanie w 05AB1E ..I rzeczywiście miałem rację, że był zbyt długi .. -5 bajtów dzięki @Emigna .Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Przykładowy przebieg:
[[1,4,2],[5,6,1]]
нgL
):[1,2,3]
œ
):[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
ε‚
):[[[[1,4,2],[5,6,1]],[1,2,3]],[[[1,4,2],[5,6,1]],[1,3,2]],[[[1,4,2],[5,6,1]],[2,1,3]],[[[1,4,2],[5,6,1]],[2,3,1]],[[[1,4,2],[5,6,1]],[3,1,2]],[[[1,4,2],[5,6,1]],[3,2,1]]]
ø
):[[[[1,4,2],1],[[5,6,1],2]],[[[1,4,2],1],[[5,6,1],3]],[[[1,4,2],2],[[5,6,1],1]],[[[1,4,2],2],[[5,6,1],3]],[[[1,4,2],3],[[5,6,1],1]],[[[1,4,2],3],[[5,6,1],2]]]
ε`è]
):[[4,1],[4,5],[2,6],[2,5],[1,6],[1,1]]
(UWAGA: 05AB1E jest indeksowany jako 0 (z automatycznym zawijaniem), więc indeksowanie3
do[5,6,1]
wyników w5
.)O
):[5,9,8,7,7,2]
à
):9
źródło
нgLœε‚øε
è] OZ` za 13 .Haskell, 84 bajty
Wypróbuj online!
źródło
Ruby ,
747269 bajtówWypróbuj online!
źródło
05AB1E , 7 bajtów
Port @ ais523 na Jelly CW , więc pamiętaj też, aby ją głosować!
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło