Spezifikation
Diese Herausforderung ist einfach zu formulieren: Ihre Eingabe ist ein nicht leeres Array nichtnegativer Ganzzahlen, und Ihre Aufgabe besteht darin, es in möglichst wenige aufsteigende Teilsequenzen zu unterteilen. Genauer gesagt, wenn das Eingabearray ist A
, ist die Ausgabe ein Array von Arrays, B
so dass:
- Jedes Array
B
bildet eine AufteilungA
in nicht zusammenhängende (nicht notwendigerweise zusammenhängende) Teilfolgen. Induktiv bedeutet dies, dass entwederB
das Singleton-Array enthaltenA
ist oder das erste ElementB
eine Teilfolge von istA
und der Rest eine Partition von bildet,A
wobei diese Teilfolge entfernt ist. - Jedes Array in
B
nimmt (nicht unbedingt streng) zu. - Die Anzahl der Arrays
B
ist minimal.
Sowohl die Eingabe als auch die Ausgabe können im nativen Array-Format Ihrer Sprache erfolgen. Beachten Sie, dass es möglicherweise mehrere korrekte Ausgaben gibt.
Beispiel
Betrachten Sie das Eingabearray A = [1,2,1,2,5,4,7,1]
. Eine mögliche Ausgabe ist B = [[1],[1,2,4,7],[1,2,5]]
. Die Partitionsbedingung ist aus diesem Diagramm ersichtlich:
A 1 2 1 2 5 4 7 1
B[0] 1
B[1] 1 2 4 7
B[2] 1 2 5
Außerdem nimmt jedes Array in B
zu. Lässt A
sich schließlich nicht in zwei aufsteigende Teilfolgen aufteilen, so B
ist auch die Länge minimal. Somit ist es eine gültige Ausgabe.
Regeln und Wertung
Sie können eine Funktion oder ein vollständiges Programm schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig. Es gibt keine Zeitbeschränkung, aber Sie sollten Ihre Lösung in allen Testfällen bewerten, bevor Sie sie einreichen.
Testfälle
Es wird nur eine mögliche Ausgabe angezeigt, es können jedoch mehrere gültige Optionen vorhanden sein. Insbesondere spielt die Reihenfolge der Arrays im Ergebnis keine Rolle (aber jedes einzelne Array sollte in aufsteigender Reihenfolge sein).
[0] -> [[0]]
[3,5,8] -> [[3,5,8]]
[2,2,2,2] -> [[2,2,2,2]]
[1154,1012,976,845] -> [[845],[976],[1012],[1154]]
[6,32,1,2,34,8] -> [[1,2,8],[6,32,34]]
[1,12,1,12,1,13] -> [[1,1,1,13],[12,12]]
[6,4,6,13,18,0,3] -> [[0,3],[4,6,13,18],[6]]
[1,2,3,2,3,4,7,1] -> [[1,1],[2,2,3,4,7],[3]]
[0,9,2,7,4,5,6,3,8] -> [[0,2,3,8],[4,5,6],[7],[9]]
[7,1,17,15,17,2,15,1,6] -> [[1,1,6],[2,15],[7,15,17],[17]]
[4,12,2,10,15,2,2,19,16,12] -> [[2,2,2,12],[4,10,15,16],[12,19]]
[10,13,9,2,11,1,10,17,19,1] -> [[1,1],[2,10,17,19],[9,11],[10,13]]
[3,7,3,8,14,16,19,15,16,2] -> [[2],[3,3,8,14,15,16],[7,16,19]]
[15,5,13,13,15,9,4,2,2,17] -> [[2,2,17],[4],[5,9],[13,13,15],[15]]
[0,5,2,0] -> [[0,5],[0,2]]
Wiederverwertung der ersten Null zuzulassen , anstatt sie jeweils einmal zu verwenden. Ist das beabsichtigt?B
, hoffentlich sind sie jetzt klarer.Antworten:
Haskell, 54 Bytes
Anwendungsbeispiel:
foldr(#)[] [4,12,2,10,15,2,2,19,16,12]
->[[2,2,2,12],[4,10,15,16],[12,19]]
So funktioniert es: Gehen Sie die Eingabeliste beginnend am rechten Ende durch. Erstellen Sie die Ausgabeliste (von Listen), indem Sie das aktuelle Element
n
der ersten Unterliste voranstellen,l
inn
der der Kopf von kleiner oder gleich istl
. Wenn es keine gibt, erstellen Sie eine neue Singleton-Listen
am Ende der Ausgabeliste.quelle
Pyth, 20 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Gieriger Ansatz. Ich erstelle
len(input)
leere Listen. Dann iteriere ich über jede Nummer in der undinput
wähle die erste Liste aus, die nach dem Anhängen der Nummer noch sortiert ist.Erläuterung:
quelle