Hintergrund
Ich war inspiriert von 3Blue1Brown ‚s jüngsten Video über die Halskette Spaltung Problem (oder , wie er es nennt, das gestohlene Halskette Problem) und seine Beziehung zum Borsuk-Ulam .
In diesem Problem haben zwei Diebe eine wertvolle Halskette gestohlen, die aus verschiedenen Arten von Juwelen besteht. Es gibt eine gerade Anzahl von Juwelen jeder Art, und die Diebe möchten jede Juwelenart gleichmäßig auf die beiden aufteilen. Der Haken ist, dass sie dies tun müssen, indem sie die Kette in eine Anzahl zusammenhängender Segmente aufteilen und die Segmente auf die beiden verteilen.
Hier ist ein Beispiel mit vier jewel Typen bezeichnet S
, E
, D
, und R
(für Saphir, Smaragd, Diamanten und Rubin, jeweils). Angenommen, die Halskette sieht wie folgt aus:
[S,S,S,E,S,D,E,R,S,R,E,S,S,S,D,R,E,E,R,E,D,E,R,R,D,E,E,E]
Es gibt 8
Saphire, 10
Smaragde, 4
Diamanten und 6
Rubine. Wir können die Kette wie folgt aufteilen:
[[S],[S],[S,E,S,D,E,R,S],[R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]
Wenn wir dann das erste, dritte und fünfte Segment einem Dieb und das zweite und vierte Segment dem anderen Dieb geben, wird jedes mit 4
Saphiren, 5
Smaragden, 2
Diamanten und 3
Rubinen enden :
[S], [S,E,S,D,E,R,S], [R,R,D,E,E,E]
[S], [R,E,S,S,S,D,R,E,E,R,E,D,E],
Mit 0
-indexing werden diese Schnitte an den Indizes ausgeführt [1,2,9,22]
.
Tor
Es stellt sich heraus, dass eine solche faire Aufteilung immer mit höchstens n
Schnitten durchgeführt werden kann, wobei n
die Anzahl der Edelsteintypen angegeben ist. Ihre Aufgabe ist es, ein komplettes Programm oder eine komplette Funktion zu schreiben, die eine Kette als Eingabe verwendet und eine minimale Teilung (die geringste Anzahl von Schnitten) ausgibt.
Eingang
Die Eingabe kann in einem beliebigen Format erfolgen. Die Kette sollte eine Abfolge von Juwelen sein und nichts weiter; zB eine Liste von ganzen Zahlen, ein Wörterbuch mit Schlüsseln, die die Edelsteintypen und -werte darstellen, wobei es sich um Listen von Indizes handelt. Sie können optional die Länge der Halskette oder die Anzahl der verschiedenen Edelsteintypen angeben, sollten jedoch keine weiteren Eingaben vornehmen.
Sie können davon ausgehen, dass die Eingabehalskette gültig ist. Sie müssen nicht mit dem Fall umgehen, in dem eine ungerade Anzahl von Juwelen eines bestimmten Typs vorhanden ist oder die Halskette leer ist.
Ausgabe
Auch hier kann die Ausgabe in jedem geeigneten Format erfolgen. zB eine Liste von Segmenten, eine Liste von Schnittpositionen, ein Wörterbuch mit Schlüsseln, die die beiden Diebe darstellen, und Werte, die Listen von Segmenten sind usw. Segmente können durch ihren Startindex, Endindex, Liste von aufeinanderfolgenden Indizes, Liste von Juwelen, ihre Länge usw. Sie können 0
- oder 1
- indizieren. Wenn die Reihenfolge für Ihr Format nicht von Bedeutung ist, kann die Ausgabe in beliebiger Reihenfolge erfolgen. Hier ist die obige Ausgabe in verschiedenen Formaten:
list of segments: [[S],[S],[S,E,S,D,E,R,S],[R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]
list of cuts: [1,2,9,22]
list of lengths: [1,1,7,13,6]
dictionary: {'thief1' : [(R,R,D,E,E,E),(S),(S,E,S,D,E,R,S)], 'thief2' : [(S),(R,E,S,S,S,D,R,E,E,R,E,D,E)]}
Beachten Sie, dass die Reihenfolge in der Liste der Segmente (Segmente wechseln sich zwischen den Dieben ab) und der Liste der Längen (um die Segmente zu identifizieren) wichtig ist, nicht jedoch in der Liste der Schnitte oder im Wörterbuch. Edit: Greg Martin wies darauf hin, dass dies keine gültigen Ergebnisse sind, da eine faire Aufteilung in zwei Teile erzielt werden kann
Testfälle
[1,2,1,2,1,3,1,3,3,2,2,3] -> [[1,2,1],[2,1,3,1],[3,3,2],[2,3]]
[1,1,1,1,2,2,3,3,3,3,3,3] -> [[1,1],[1,1,2],[2,3,3,3],[3,3,3]]
[1,1,1,1,1,1,1,1,1,1,1,1] -> [[1,1,1,1,1,1],[1,1,1,1,1,1]]
[1,1,1,1,2,3,4,2,3,4,2,2] -> [[1,1],[1,1,2,3,4,2],[3,4,2,2]]
Anmerkungen
- Standardlücken sind verboten.
- Das ist Code-Golf ; kürzeste Antwort (in Bytes) gewinnt.
[S,S,S,E,S,D,E,R,S,R,E,S,S,S,D,R,E,E,R,E,D,E,R,R,D,E,E,E]
scheint es, dass die Ausgabe sein sollte [[S,S,S,E,S,D,E,R],[S,R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]
, da das weniger Schnitte als hat [[S],[S],[S,E,S,D,E,R,S],[R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]
. Verstehe ich die Spezifikation richtig?