Einführung:
Inspiriert von diesen beiden SO-Fragen (ohne Zweifel aus derselben Klasse): Drucken Sie die Elemente in der Unteranordnung mit der maximalen Summe ohne benachbarte Elemente, Java, und der maximalen Summe nicht benachbarter Elemente einer Anordnung, die gedruckt werden sollen .
Herausforderung:
Bei einer Liste von Ganzzahlen wird eine Teilsequenz ausgegeben, die aus nicht benachbarten Elementen mit der höchsten Summe besteht. Hier einige Beispiele:
[1,2,3,-1,-3,2,5]
würde[1,3,5]
(mit einer Summe von9
) zu den 0-basierten Indizes führen[0,2,6]
.[4,5,4,3]
würde entweder[4,4]
(mit einer Summe von8
) bei den 0-basierten Indizes[0,2]
oder[5,3]
(auch mit einer Summe von8
) bei den 0-basierten Indizes ergeben[1,3]
.[5,5,10,100,10,5]
würde[5,100,5]
(mit einer Summe von110
) entweder zu den 0-basierten Indizes[0,3,5]
oder führen[1,3,5]
.
Was an diesen Beispielen oben am wichtigsten ist, sind die Indizes, die die Elemente enthalten, mindestens 2 voneinander entfernt. Wenn wir uns das Beispiel [5,5,10,100,10,5]
genauer ansehen, haben wir die folgende mögliche Folge, die nicht benachbarte Elemente enthält. mit ihren Indizes darunter; mit ihren Summen darunter:
[[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
Da die maximalen Summen sind 110
, geben wir [5,100,5]
als Ergebnis aus.
Herausforderungsregeln:
- Sie dürfen Schlüssel-Wert-Paare aus Index + Wert ausgeben. Stattdessen
[5,100,5]
können Sie also[[0,5],[3,100],[5,5]]
oder[[1,5],[3,100],[5,5]]
als Ergebnis ausgeben (oder[[1,5],[4,100],[6,5]]
/[[2,5],[4,100],[6,5]]
wenn 1-basierte Indexierung anstelle von 0-basierten verwendet wird).- Wenn Sie Schlüssel-Wert-Paare verwenden, können diese auch in umgekehrter oder zufälliger Reihenfolge vorliegen, da klar ist, welche Werte aufgrund des gepaarten Index gemeint sind.
- Die Ausgabe nur der Indizes ohne Werte ist nicht zulässig. Es sollte entweder die Werte oder die Werte / Indizes als Schlüssel-Wert-Paare ausgeben (oder zwei getrennte Listen für 'Schlüssel' und 'Werte' derselben Größe, wenn Schlüssel-Wert-Paare in der Sprache Ihrer Wahl nicht möglich sind).
- Sie dürfen statt nur einer alle möglichen Teilfolgen mit der maximalen Summe ausgeben.
- Wie Sie den Beispielen entnehmen können, kann die Eingabeliste auch negative und doppelte Werte enthalten. Sie können davon ausgehen, dass die Eingabe-Ganzzahlen im Bereich .
- Die Ausgabeliste darf nicht leer sein und muss immer mindestens ein Element enthalten (wenn eine Liste nur negative Werte enthalten würde, würde eine Liste mit dem niedrigsten negativen Wert als Ergebnis ausgegeben - siehe die letzten beiden Testfälle).
- Wenn es eine mögliche Ausgabe gibt, jedoch für mehrere verschiedene Indizes, ist es zulässig, beide auszugeben, obwohl sie möglicherweise doppelt aussehen. (dh das obige Beispiel kann
[[5,100,5],[5,100,5]]
für beide möglichen Indexkombinationen ausgegeben werden ).
Testfälle:
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
quelle
[5,100,5]
zweimal für dein drittes Beispiel.powerset
ist eine Menge von Teilmengen, nicht wahr? aber es sieht so aus, als würden Sie eine Reihe von Teilsequenzen zurückgeben? [4,5,4,3] würde entweder [4,4] ergeben, wobei [4,4] eindeutig keine Menge ist.Antworten:
Schale , 11 Bytes
Probieren Sie es online!
Erläuterung
quelle
Haskell , 60 Bytes
Probieren Sie es online!
Die
%
Hilfsfunktion verzweigt rekursiv bei der Auswahl, ob das erste Element eingeschlossen und das zweite gelöscht werden soll oder ob das erste Element übersprungen werden soll. Es wird das Maximum aller Ergebnisse verwendet. Hierbei handelt es sich um Tupel, deren erstes Element die Summe und deren zweites Element die entsprechende Liste ist, die für die Ausgabe extrahiert wird.Um mit der Regel umzugehen, dass die leere Liste auch dann
sum r<$r
nichtsum r
zulässig ist, wenn sie den kleinsten Trick hätte, führen wir einen niedlichen Trick des Schreibens durch, anstatt. Dadurch wird eine Liste erstellt, deren Elemente alle sindsum r
und deren Länge die von istr
. Auf diese Weise priorisieren wir bei der Auswahl des Maximums eine Liste gegenüber einer leerenr
, ansonsten hängen Vergleiche vom ersten Element absum r
.quelle
R ,
136125 BytesProbieren Sie es online!
-6 Bytes dank digEmAll , der mich übrigens auch überrumpelt hat .
Gibt die kürzeste Subsequenz als zurück
list
, wobei die lexikografischen Bindungen zuerst durch Indizes unterbrochen werden.Brute-Force generiert alle Index-Teilsequenzen, dann
Filter
s für diejenigen, die nicht benachbart sind, dh woall(diff(x)>1)
. Dann Untergruppen[
inl
diese Indizes verwendet, die Auswahl[[
des ersten , wobei die Summe der max (which.max
).Ich bin mir ziemlich sicher, dass dies die erste R-Antwort ist, die ich je geschrieben habe und die verwendettraurig,Filter
!Filter
ist ungolfisch, kein Wunder, dass ich es nie benutzt habe ...quelle
05AB1E , 14 Bytes
Dank Kevin Cruijssen 1 Byte gespeichert
Probieren Sie es online! oder als Test Suite
Erläuterung
quelle
¤ª
zu wechselnĆ
.Brachylog (v2), 14 Bytes
Probieren Sie es online!
Funktionsübermittlung; Eingabe von links, Ausgabe von rechts wie gewohnt. Sehr langsam; Eine Liste mit fünf Elementen ist wahrscheinlich das Maximum für Tests mit TIO.
Die Ergebnisse, die wir mit Präfixen erhalten, sind nicht falsch, aber auch nicht interessant. Alle möglichen Ergebnisse werden über ein Suffix generiert (das möglicherweise die Liste selbst ist, aber nicht leer sein darf), aber "Suffix" ist in Brachylog ausführlicher als "Präfix oder Suffix" effizient aber immer noch korrekt). Die Grundidee ist, dass für jedes Element, das in der Ausgabeliste enthalten sein soll, die Partition in zusammenhängende Unterlisten dieses Element und das Element davor in dieselbe Unterliste einfügen muss (da das Element das zweite ist)Element der Unterliste), so dass zwei aufeinanderfolgende Elemente nicht im Ergebnis erscheinen können. Andererseits ist es ziemlich klar, dass jede Liste ohne zwei aufeinanderfolgende Elemente im Ergebnis erscheinen kann. Wenn wir also alle möglichen Kandidatenlisten haben, können wir einfach die Summen von allen nehmen und sehen, welche die größte ist.
quelle
Jelly ,
16 bis14 BytesProbieren Sie es online!
Vielen Dank an @EriktheOutgolfer für das Speichern von 2 Bytes!
quelle
JavaScript (ES6),
138 132 130 129126 BytesGibt Schlüssel-Wert-Paare aus.
Probieren Sie es online!
Schritt 1
Schritt 2
quelle
Haskell,
81-80BytesProbieren Sie es online!
f
Erstellt alle gültigen Teilsequenzen, indem entweder das nächste Element übersprungen (f(b:c)
) oder es verwendet und das nächste übersprungen (map(a:)(f c)
) und der Rest rekursiv bearbeitet wird. Erstellen Sie für das Ergebnis alle Untersequenzen (f
), löschen Sie die leere Untersequenz (die zuerst in der Liste vorkommt:)tail
, bilden Sie Paare(<sum>,<subsequence>)
(map((,)=<<sum)
), ermitteln Sie das Maximum (Paare werden in lexikografischer Reihenfolge verglichen) ->maximum
) und löschen Sie die Summe (snd
).Bearbeiten: -1 Byte dank @Lynn.
quelle
map(:[])a
ist ein Byte kürzer als(pure<$>a)
^^J , 47 Bytes
Probieren Sie es online!
-7 Bytes dank FrownyFrog
Original
J , 54 Bytes
Probieren Sie es online!
quelle
T-SQL,
122119118 BytesDie Eingabe ist eine Tabellenvariable.
Diese Abfrage wählt alle Elemente aus der Tabellenvariablen aus, kombiniert diese mit allen nicht benachbarten Elementen mit höheren Positionswerten und zeigt den Text an, der für die höchste Summe dieser Werte generiert wurde.
Probieren Sie es online ungolfed
quelle
Wolfram Language (Mathematica) , 144 Byte
Probieren Sie es online!
quelle
Pyth, 19 Bytes
Versuchen Sie es online hier oder überprüfen alle Testfälle auf einmal hier .
quelle
Gaia , 24 Bytes
Probieren Sie es online!
Ugh,
E‡
hat einige seltsame Dinge ... nach der Dokumentation, es sollte so etwas wie „gegebene Länge tuni
Menge von ListenX
und Längej
Reihe von IndizesY
, ReturnX[i][Y[j]]
“, sondern kehrt[X[i][Y[j]] X[i][Y[-j]]
in Negativ Indizierung das Komplement darstellt, so dass wir tun müssen ,ev2%
um extrahiere nur die, die wir wollen.quelle
]]
anstelle von einem?[[1] [2]]
gedruckt werden,[[1]] [2]]]]
was das Lesen und Debuggen der Listenausgabe extrem erschwert.re.sub(" ?$","]",result)
im Interpreter, der stattdessen sein sollte,re.sub(" +$","]",result)
aber meine Python ist super schlecht.R ,
108107 BytesProbieren Sie es online!
-1 danke an @ Giuseppe
quelle
Wolfram Sprache (Mathematica) ,
7063 BytesProbieren Sie es online!
High-Level-Suche
,1
ist erforderlich, um nicht versehentlich ungültige Mengen zurückzugeben (andernfalls würde z. B. eine Eingabe von{1,1,1}
zu einer Ausgabe von führen{{1,1},{1,1},{1,1}}
).quelle
Haskell ,
300168 BytesProbieren Sie es online!
-132 Bytes danke an alle Rückmeldungen von @nimi :)
Original
Ungolfed (original)
quelle
f
: zurückgegebenen Paare umf x=zip[0..length x]x
, sof
wirdf=zip[0..]
.g
ist einfachg=map unzip
. Die Funktion, mit der gefiltert werden soll,j
isth.fst
(<- gespiegelte Paare!).j=filter(h.fst)
. Dasfoldl1+
ausk
istsum
und mit einem pointfree Paar machenk=map((,)=<<sum.snd)
.sortBy(...)
kann ersetzt werden durchsortOn fst
:l=snd.last.sortOn fst
. Da Sie alle Funktionen nur einmal verwenden, können Sie sie schließlich in einen einzelnen punktfreien Ausdruck einbetten:z=snd.last.sortOn fst.map((,)=<<sum.snd).filter(h.fst).map unzip.subsequences.zip[0..]
Data.Function
mehr nötig .h
suchen wir nach nicht benachbarten Elementen, dh die Differenz benachbarter Indizes muss sein>1
.zipWith(-)=<<tail
baut eine solche Liste der Unterschiede auf, scheitert aber an der leeren Liste, also brauchen wir eine zusätzlichetail
auf dersubsequences
, um sie loszuwerden. Wieder inline. Probieren Sie es online!Kohle , 46 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Die Variable
u
ist mit einer leeren Liste vordefiniert. Dies wird in eine Liste eingetragen, die zugeordnet isth
. Diese Variablen wirken als Akkumulatoren.u
Enthält die Unterlisten, die das neueste Element der Eingabe enthalten,q
währendh
die Unterlisten, die dies nicht tun, enthalten sind (und daher zum Anhängen des nächsten Elements der Eingabe geeignet sind).Schleife über die Elemente der Eingabe.
Speichern Sie die Liste der Unterlisten, die das vorherige Element enthalten.
Nehmen Sie alle Unterlisten, die das vorherige Element nicht enthalten, hängen Sie das aktuelle Element an und speichern Sie das Ergebnis als Liste der Unterlisten, die das aktuelle Element enthalten. (Ich benutze
Push
hier nicht , da ich die Liste klonen muss.)Verketten Sie die beiden vorherigen Unterlisten mit der neuen Liste der Unterlisten, die das aktuelle Element nicht enthalten.
Verketten Sie die Unterlisten ein letztes Mal und entfernen Sie die ursprüngliche leere Liste (die Charcoal sowieso nicht summieren kann).
Berechnen Sie die Summen aller Unterlisten.
Suchen Sie einen Index der größten Summe und geben Sie die entsprechende Unterliste aus.
quelle
Japt
-h
, 22 BytesVersuch es
quelle
Japt
-h
, 21 BytesHaben Sie jemals eine dieser Herausforderungen erlebt, bei denen Sie das Golfen völlig vergessen haben ?!
Versuch es
quelle
Python 2 ,
637065 BytesProbieren Sie es online!
5 Bytes danke an ArBo
quelle
[1, 7, 4, -2] [1, 4] 5 7
erhält die falsche Antwort.