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 1Socken ausziehen, dann beide 2Socken, dann beide 3Socken.
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 1Socken ausziehen, gehen 2 3 and 2 3, gefolgt von den 3Socken 2 and 2, gehen und schließlich die 2Socken.
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 1und 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 2oder 1 2 1; 2auch 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 2dann ist, könntest du ihn nicht als einen Stapel lassen und beide1Socken vom linken Ende nehmen.
123213also aufgeteilt werden in 1; 23; 213( 1; 23; 213-> 1; 2; 21-> ; 2; 2)?
123213mit nur zwei Stapeln zu teilen , müsste Ihre Antwort einen von zwei Stapeln ergeben.