Wprowadzenie:
Zainspirowany tymi dwoma pytaniami SO (bez wątpienia z tej samej klasy): wydrukuj elementy w podtablicy maksymalnej sumy bez sąsiadujących elementów java i Maksymalna suma nieprzylegających elementów tablicy, które zostaną wydrukowane .
Wyzwanie:
Biorąc pod uwagę listę liczb całkowitych, wypisz podsekwencję składającą się z nieprzylegających do siebie elementów o najwyższej sumie. Oto kilka przykładów:
[1,2,3,-1,-3,2,5]
spowoduje[1,3,5]
(z sumą9
) indeksy oparte na 0[0,2,6]
.[4,5,4,3]
spowoduje albo[4,4]
(z sumą8
) przy indeksach opartych na 0[0,2]
lub[5,3]
(również z sumą8
) przy indeksach opartych na 0[1,3]
.[5,5,10,100,10,5]
spowoduje[5,100,5]
(z sumą110
) indeksy oparte na 0[0,3,5]
lub[1,3,5]
.
Co najważniejsze w powyższych przykładach, indeksy zawierające elementy są co najmniej 2 od siebie. Jeśli przyjrzymy się dokładniej przykładowi [5,5,10,100,10,5]
: mamy następującą potencjalną podsekwencję zawierającą nieprzylegające elementy; z ich indeksami poniżej; z sumami poniżej:
[[5],[10],[100],[10],[5],[5],[100,5],[10,5],[10,10],[5,5],[5,10],[5,100],[5,5],[5,10],[5,100],[5,10],[5,100,5],[5,100,5],[5,10,5],[5,10,10]] // non-adjacent subsequences
[[5],[ 4],[ 3],[ 2],[1],[0],[ 3,5],[ 2,5],[ 2, 4],[1,5],[1, 4],[1, 3],[0,5],[0, 4],[0, 3],[0, 2],[1, 3,5],[0, 3,5],[0, 2,5],[0, 2, 4]] // at these 0-based indices
[ 5, 10, 100, 10, 5, 5, 105, 15, 20, 10, 15, 105, 10, 15, 105, 15, 110, 110, 20, 25] // with these sums
^ ^ // and these two maximums
Ponieważ maksymalne kwoty są 110
, wyprowadzamy [5,100,5]
jako wynik.
Zasady konkursu:
- Możesz wyprowadzać pary klucz-wartość indeksu + wartość. Zamiast tego
[5,100,5]
możesz wyprowadzać dane wyjściowe[[0,5],[3,100],[5,5]]
lub[[1,5],[3,100],[5,5]]
w wyniku (lub[[1,5],[4,100],[6,5]]
/[[2,5],[4,100],[6,5]]
gdy indeksowanie oparte na 1 zamiast 0).- Jeśli użyjesz par klucz-wartość, mogą one również występować w kolejności odwrotnej lub losowej, ponieważ jasne jest, które wartości mają na myśli ze względu na sparowany indeks.
- Wyprowadzanie tylko indeksów bez wartości jest niedozwolone. Powinien albo generować wartości, albo wartości / indeksy jako pary klucz-wartość (lub dwie oddzielne listy dla „kluczy” i „wartości” tego samego rozmiaru, jeśli pary klucz-wartość nie są możliwe w wybranym języku).
- Możesz wypisywać wszystkie możliwe podciągi z maksymalną sumą zamiast tylko jednej.
- Jak widać z przykładów, lista wejściowa może również zawierać wartości ujemne i zduplikowane. Możesz założyć, że liczby całkowite wejściowe są w zakresie .
- Lista wyjściowa nie może być pusta i zawsze musi zawierać co najmniej jeden element (jeśli lista zawiera tylko wartości ujemne, wówczas lista zawierająca jedną najniższą wartość ujemną byłaby wówczas wynikiem - patrz dwa ostatnie przypadki testowe).
- Jeśli istnieje jeden możliwy wynik, ale dla wielu różnych indeksów, dozwolone jest generowanie obu z nich, nawet jeśli mogą wyglądać na duplikaty. (tzn. powyższy przykład może wyprowadzać dane
[[5,100,5],[5,100,5]]
dla obu możliwych kombinacji indeksów).
Przypadki testowe:
Input: Possible outputs: At 0-based indices: With sum:
[1,2,3,-1,-3,2,5] [1,3,5] [0,2,6] 9
[4,5,4,3] [4,4]/[5,3] [0,2]/[1,3] 8
[5,5,10,100,10,5] [5,100,5] [0,3,5]/[1,3,5] 110
[10] [10] [0] 10
[1,1,1] [1,1] [0,2] 2
[-3,7,4,-2,4] [7,4] [1,4] 11
[1,7,4,-2] [7] [1] 7
[1,2,-3,-4,5,6,-7] [2,6] [1,5] 8
[800,-31,0,0,421,726] [800,726]/[800,0,726] [0,5]/[0,3,5]/[0,2,5] 1526
[-1,7,8,-5,40,40] [8,40] [2,4]/[2,5] 48
[-5,-18,-3,-1,-10] [-1] [3] -1
[0,-3,-41,0,-99,-2,0] [0]/[0,0]/[0,0,0] [0]/[3]/[6]/[0,3]/
[0,6],[3,6]/[0,3,6] 0
code-golf
number
array-manipulation
integer
Kevin Cruijssen
źródło
źródło
[5,100,5]
dwa razy dla twojego trzeciego przykładu.powerset
jest zestawem podzbiorów, prawda? ale wygląda na to, że zwracasz zestaw podsekwencji? [4,5,4,3] spowoduje albo [4,4], gdzie [4,4] wyraźnie nie jest zbiorem.Odpowiedzi:
Łuska , 11 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Haskell , 60 bajtów
Wypróbuj online!
Funkcja pomocnicza
%
rekurencyjnie rozgałęzia się po wybraniu, czy dołączyć pierwszy element i upuścić drugi, czy też pominąć pierwszy element. Pobiera maksimum wszystkich wyników, którymi są krotki, których pierwszym elementem jest suma, a drugim elementem jest odpowiednia lista wyodrębniona dla wyniku.Aby poradzić sobie z zasadą, że pusta lista jest niedozwolona, nawet jeśli miałaby najmniejszą sztuczkę, wykonujemy uroczą sztuczkę pisania
sum r<$r
zamiast.sum r
To tworzy listę, której wszystkie elementy sąsum r
i których długość jest równar
. W ten sposób, kiedy wybieramy maksimum, priorytetem jest każda lista nad pustąr
, ale w przeciwnym razie porównania zależą od pierwszego elementu, który jestsum r
.źródło
R ,
136125 bajtówWypróbuj online!
-6 bajtów dzięki digEmAll , który, nawiasem mówiąc, również mnie obezwładnił .
Zwraca najkrótszą podsekwencję jako a
list
, przerywając najpierw związki leksykograficzne indeksami.Brute-force generuje wszystkie podsekwencje indeksu, a następnie
Filter
s dla tych, które nie sąsiadują, tjall(diff(x)>1)
. Gdzie . Następnie podzbiory[
językl
za pomocą tych wskaźników, wybierając[[
pierwszy z nich, gdzie suma jest max (which.max
).Jestem prawie pewien, że jest to pierwsza odpowiedź, jaką kiedykolwiek napisałem R, która używasmutny,Filter
!Filter
jest niegrzeczny, nic dziwnego, że nigdy go nie użyłem ...źródło
05AB1E , 14 bajtów
Zaoszczędził 1 bajt dzięki Kevinowi Cruijssenowi
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
¤ª
naĆ
.Brachylog (v2), 14 bajtów
Wypróbuj online!
Podanie funkcji; wejście z lewej strony, wyjście z prawej strony, jak zwykle. Bardzo wolno; pięcioelementowa lista jest prawdopodobnie maksimum dla testów na TIO.
Wyniki, które otrzymujemy z prefiksów, nie są niepoprawne, ale również nie są interesujące; wszystkie możliwe wyniki są generowane poprzez pobranie sufiksu (który może być samą listą, ale nie może być pusty), ale „sufiks” jest bardziej szczegółowy w Brachylogu niż „prefiks lub sufiks”, więc wybrałem wersję bardziej złożoną (i mniej wydajne, ale nadal poprawne). Podstawową ideą jest to, że dla każdego elementu, który chcemy na liście wyników, podział na ciągłe podlisty musi umieścić ten element i element wcześniej w tej samej podlistie (ponieważ element jest drugimelement listy podrzędnej), więc w wyniku nie mogą pojawić się dwa kolejne elementy. Z drugiej strony jest dość jasne, że w wyniku może pojawić się każda lista bez dwóch kolejnych elementów. Kiedy więc mamy wszystkie możliwe listy kandydatów, możemy po prostu zebrać ich sumy i zobaczyć, która z nich jest największa.
źródło
Galaretka ,
1614 bajtówWypróbuj online!
Dzięki @EriktheOutgolfer za zapisanie 2 bajtów!
źródło
JavaScript (ES6),
138 132 130 129126 bajtówGeneruje pary klucz-wartość.
Wypróbuj online!
Krok 1
Krok 2
źródło
Haskell,
8180 bajtówWypróbuj online!
f
buduje wszystkie poprawne podciągi, pomijając następny element (f(b:c)
) lub używając go i pomijając następny (map(a:)(f c)
) i rekurencyjnie pracuj nad resztą. Aby uzyskać wynik, zbuduj wszystkie podsekwencje (f
), upuść puste podsekwencje (które występują najpierw na liścietail
:), twórz pary(<sum>,<subsequence>)
(map((,)=<<sum)
), znajdź maksimum (pary są porównywane w kolejności leksykograficznej) ->maximum
) i upuść sumę (snd
).Edycja: -1 bajt dzięki @Lynn.
źródło
map(:[])a
jest bajtem krótszym niż(pure<$>a)
^^J , 47 bajtów
Wypróbuj online!
-7 bajtów dzięki FrownyFrog
oryginalny
J , 54 bajty
Wypróbuj online!
źródło
T-SQL,
122119118 bajtówDane wejściowe to zmienna tabelowa.
To zapytanie wybiera wszystkie elementy ze zmiennej tabeli, łącząc je ze wszystkimi nieprzylegającymi elementami z wyższymi wartościami pozycji i pokazuje tekst wygenerowany dla najwyższej sumy tych wartości.
Wypróbuj online bez golfa
źródło
Wolfram Language (Mathematica) , 144 bajty
Wypróbuj online!
źródło
Pyth, 19 bajtów
Spróbuj go online tutaj , lub sprawdzić wszystkie przypadki testowe od razu tutaj .
źródło
Gaia , 24 bajty
Wypróbuj online!
Ugh,
E‡
robi jakieś dziwne rzeczy ... zgodnie z dokumentacją powinien zrobić coś takiego „danej długościi
zestawu listX
i długośćj
zestawu wskaźnikówY
, powrotuX[i][Y[j]]
”, lecz powraca[X[i][Y[j]] X[i][Y[-j]]
gdzie negatywne indeksowanie oznacza dopełnienie, tak musimy zrobić,ev2%
aby wyodrębnij tylko te, które chcemy.źródło
]]
zamiast jednego?[[1] [2]]
są drukowane,[[1]] [2]]]]
co sprawia, że bardzo trudno jest odczytać / wyświetlić wyniki listy.re.sub(" ?$","]",result)
w tłumaczu, które powinno być,re.sub(" +$","]",result)
ale mój python jest bardzo zły.R ,
108107 bajtówWypróbuj online!
-1 dzięki @Giuseppe
źródło
Wolfram Language (Mathematica) ,
7063 bajtówWypróbuj online!
Wyszukiwanie na wysokim poziomie
,1
jest wymagane, aby nie zwracać przypadkowo niepoprawnych zestawów (w przeciwnym razie na przykład wejście{1,1,1}
spowoduje wynik w postaci{{1,1},{1,1},{1,1}}
)źródło
Haskell ,
300168 bajtówWypróbuj online!
-132 bajtów dzięki wszystkim opiniom @nimi :)
Oryginalny
Niegolfowany (oryginalny)
źródło
f
:f x=zip[0..length x]x
takf
się stanief=zip[0..]
.g
jest po prostug=map unzip
. Funkcja filtrowania za pomocą inj
toh.fst
(<- odwrócone pary!).j=filter(h.fst)
.foldl1+
Zek
tosum
iz podejmowania pary pointfreek=map((,)=<<sum.snd)
.sortBy(...)
może być zastąpiony przezsortOn fst
:l=snd.last.sortOn fst
. Wreszcie, ponieważ używasz wszystkich funkcji tylko raz, możesz wstawić je do pojedynczego wyrażenia bezcelowego:z=snd.last.sortOn fst.map((,)=<<sum.snd).filter(h.fst).map unzip.subsequences.zip[0..]
Data.Function
już importować .h
: szukamy nieprzylegających elementów, tzn. Różnica sąsiednich wskaźników musi być>1
.zipWith(-)=<<tail
buduje taką listę różnic, ale nie trafia do pustej listy, więc musimy dodatkowotail
nasubsequences
celu pozbyć się go. Wstaw ponownie. Wypróbuj online!Węgiel drzewny , 46 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Zmienna
u
jest predefiniowana z pustą listą. Jest to umieszczone na liście, do której jest przypisanyh
. Te zmienne działają jak akumulatory.u
zawiera listy podrzędne, które zawierają najnowszy element danych wejściowych,q
podczas gdyh
zawiera listy podrzędne, które nie (i dlatego nadają się do dołączania następnego elementu danych wejściowych).Pętla nad elementami wejścia.
Zapisz listę podlist, które zawierają poprzedni element.
Weź wszystkie podlisty, które nie zawierają poprzedniego elementu, dołącz bieżący element i zapisz wynik jako listę podlist, które zawierają bieżący element. (Nie używam
Push
tutaj, ponieważ muszę sklonować listę.)Połącz obie poprzednie podlisty z nową listą podlist, które nie zawierają bieżącego elementu.
Po raz ostatni połącz listy podrzędne i usuń pierwotną pustą listę (której Charcoal i tak nie może zliczyć).
Oblicz sumy wszystkich podlist.
Znajdź indeks największej sumy i wypisz odpowiednią listę podrzędną.
źródło
Japt
-h
, 22 bajtySpróbuj
źródło
Japt
-h
, 21 bajtówCzy kiedykolwiek miałeś jedno z tych wyzwań, w których całkowicie zapominasz, jak grać w golfa ?!
Spróbuj
źródło
Python 2 ,
637065 bajtówWypróbuj online!
5 bajtów dzięki ArBo
źródło
[1, 7, 4, -2] [1, 4] 5 7
otrzymuje złą odpowiedź.