Ich habe einen Stapel sauberer Socken, die ich paarweise sortieren möchte. Leider kann ich nur Socken von beiden Enden des Stapels nehmen, nicht von der Mitte. Außerdem kann ich jeweils nur ein passendes Paar Socken vom Stapel nehmen. Meine Strategie besteht darin, den Stapel zunächst in einen oder mehrere kleinere Stapel aufzuteilen. Ich denke, einige Beispiele werden dies verdeutlichen. Ich werde jede Socke als positive Ganzzahl darstellen (übereinstimmende Ganzzahlen zeigen gleiche Socken an).
Wenn der erste Haufen Socken ist
1 2 3 3 2 1
dann muss ich nicht spalten. Ich kann beide 1
Socken ausziehen, dann beide 2
Socken, dann beide 3
Socken.
Wenn stattdessen der Anfangshaufen ist
1 2 3 2 3 1
dann muss ich es zuerst teilen, weil ich nicht alle Socken koppeln kann, indem ich sie einfach vom Ende entferne. Eine Möglichkeit besteht darin, es in zwei Stapel aufzuteilen
1 2 3 and 2 3 1
Jetzt kann ich die 1
Socken ausziehen, gehen 2 3 and 2 3
, gefolgt von den 3
Socken 2 and 2
, gehen und schließlich die 2
Socken.
Deine Arbeit
Schreiben Sie ein Programm, das den anfänglichen Sockenstapel in kleinere Stapel aufteilt, damit ich die Socken sortieren kann. Ihr Programm sollte den Stapel in die geringstmögliche Anzahl von Stapeln aufteilen (wenn es mehrere beste Lösungen gibt, müssen Sie nur eine finden).
Die Eingabe wird in Form einer Liste, einer durch Trennzeichen getrennten Zeichenfolge oder einer anderen geeigneten Form angegeben. Es enthält nur Ganzzahlen zwischen 1
und einen Maximalwert n
, wobei jede Ganzzahl genau zweimal vorkommt.
Die Ausgabe sollte aus der in kleinere Listen aufgeteilten Eingabeliste bestehen, die in einer beliebigen geeigneten Form angegeben wird.
Beispiele
Input Sample Output
1 1 1 1
1 2 1 2 1; 2 1 2
1 3 2 4 3 2 1 4 1 3 2; 4 3 2 1 4
1 2 3 4 3 4 1 2 1; 2 3; 4 3 4 1 2
1 1 2 2 3 3 1 1 2; 2 3 3
4 3 4 2 2 1 1 3 4 3 4 2; 2 1 1 3
Beachten Sie, dass dies nicht die einzige Ausgabe ist, die für die meisten dieser Eingaben zulässig ist. Für den zweiten Fall würden beispielsweise die Ausgänge 1 2; 1 2
oder 1 2 1; 2
auch akzeptiert.
Vielen Dank an Sp3000 für einige Testvorschläge!
Ich hasse es, viel Zeit damit zu verbringen, meine Klamotten zu sortieren, also mach deinen Code so kurz wie möglich. Kürzeste Antwort in Bytes gewinnt!
Anmerkungen
- Ich möchte nicht hinter eine Socke schauen müssen, um zu sehen, ob das passende Paar vorhanden ist, daher ist es nicht erlaubt, beide Socken in einem Paar vom selben Ende zu nehmen. ZB wenn der Stapel
1 1 2 2
dann ist, könntest du ihn nicht als einen Stapel lassen und beide1
Socken vom linken Ende nehmen.
123213
also aufgeteilt werden in1; 23; 213
(1; 23; 213
->1; 2; 21
->; 2; 2
)?123213
mit nur zwei Stapeln zu teilen , müsste Ihre Antwort einen von zwei Stapeln ergeben.Antworten:
Pyth, 25 Bytes
Testsuite
Erläuterung:
quelle
JavaScript (ES6), 329
Keine leichte Aufgabe für eine Sprache ohne eingebaute Kombinatorik.
Wahrscheinlich etwas golferischer.
Hinweis: Alle Partitionen haben mindestens die Größe 2, da eine Partition mit einem einzelnen Element immer weniger nützlich ist.
Erklärung in Teilen
(Es ist zu ausführlich, aber ich fand es schwierig zu erklären - überspringen Sie schließlich, um "alles zusammen zu setzen")
Eine rekursive Funktion zum Auflisten aller möglichen Teilungen eines Arrays
Jetzt benötige ich Partitionen der Größe 2 oder mehr, daher muss ich diese Funktion mit leicht unterschiedlichen Parametern verwenden. Der Parameter v ist "Arraygröße - Anzahl der gewünschten Partitionen - 1". Dann muss ich die Partitionen etwas anders aufbauen.
So kann ich die Liste der Partitionen für keine Teilung, 1 Teilung, 2 Teilungen usw. aufzählen. Wenn ich eine funktionierende Partition finde, halte ich an und gebe das gefundene Ergebnis aus.
Um dies zu überprüfen, scannen Sie die Partitionsliste, notieren Sie sich die Werte am Anfang und am Ende jeder Partition. Wenn Sie einen repetierten Wert gefunden haben, entfernen Sie ihn. Wiederholen, bis endlich nichts mehr entfernt werden kann: Wenn alle Paare entfernt wurden, ist diese Partition in Ordnung.
Dann ist der fehlende Teil nur eine Schleife, die die G-Funktion zur Erhöhung der Partitionsanzahl abruft. Die Schleife wird beendet, wenn ein Ergebnis gefunden wird.
Alles zusammen
Prüfung
quelle