Die Herausforderung ist denkbar einfach: Bei einer bestimmten Zahl teilen Sie die Ziffern in ein Array kleinerer Zahlen auf, sodass die resultierenden Zahlen nicht abnehmen. Der Haken ist, dass Sie es so aufteilen müssen, dass die Array-Länge maximal ist.
Verwirrt?
- Sie erhalten eine positive Ganzzahl über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument in einem beliebigen praktischen, eindeutigen Eingabeformat.
- Sie müssen die Dezimalstellen der Zahl in zusammenhängende, nicht zusammenhängende Gruppen unterteilen.
- Das durch diese Zifferngruppen dargestellte Zahlenfeld sollte sortiert werden (in der üblichen, nicht abnehmenden Reihenfolge), ohne die Gruppen neu anzuordnen .
- In Fällen, in denen mehr als eine solche Partition vorhanden ist, müssen Sie die Eingabe in so viele Zahlen wie möglich unterteilen. Geben Sie bei Gleichstand ein solches Ergebnis zurück.
- Sie können das Array an STDOUT (oder die nächstgelegene Alternative) oder als Funktionsrückgabewert ausgeben. Im Falle von STDOUT (oder der nächstgelegenen Alternative) sollte das Array in einem geeigneten, eindeutigen Listenformat gedruckt werden.
- Die aufgeteilten Zahlen sollten keine führenden Nullen haben. So kann zum Beispiel
1002003
nicht als[1, 002, 003]
oder gedruckt werden[1, 2, 3]
und die einzig gültige Antwort ist[100, 2003]
.
Testfälle:
123456 -> [1, 2, 3, 4, 5, 6]
345823 -> [3, 4, 5, 8, 23]
12345678901234567890 -> [1, 2, 3, 4, 5, 6, 7, 8, 90, 123, 456, 7890]
102 -> [102]
302 -> [302]
324142 -> [3, 24, 142] OR [32, 41, 42]
324142434445 -> [32, 41, 42, 43, 44, 45]
1356531 -> [1, 3, 5, 6, 531]
11121111111 -> [1, 1, 1, 2, 11, 11, 111]
100202003 -> [100, 202003]
Wertung
Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes.
quelle
aY
anstelle von~Y]
a
. Ich weiß nicht warum.int("01")
es sich bei Pyth um einen Fehler handelt (das passiert in Python nicht).n
die Länge der Eingabe.Mathematica,
134127 BytesDas ist ziemlich ineffizient, da es viel mehr Partitionen erzeugt als die gültigen. Der
324142434445
Testfall läuft innerhalb weniger Sekunden, aber ich würde es nicht versuchen12345678901234567890
.Dies definiert eine unbenannte Funktion, die eine Ganzzahl annimmt und eine Liste von Ganzzahlen zurückgibt.
Erläuterung
Die Lesereihenfolge dieses Codes ist ein wenig uneinheitlich, daher werde ich in der Reihenfolge aufteilen, in der er gelesen (und größtenteils ausgewertet) werden soll:
d=IntegerDigits@#
Holen Sie sich die Dezimalstellen der Eingabe und weisen Sie diese Liste zud
.SetPartitions
(was erfordertNeeds@"Combinatorica`";
) gibt mir alle partitionen davon. Es gibt jedoch viel mehr zurück, als ich eigentlich möchte, da es die Eingabe als Menge behandelt . Das macht es ineffizient, aber ich benutze es, weil der kürzeste Weg, den ich kenne, um alle Listenpartitionen zu erhalten, viel länger ist. Wenn die Liste ein Beispiel wäre, würde{1, 2, 3}
die Funktion Folgendes zurückgeben:Beachten Sie, dass a) die aufeinanderfolgenden Partitionen alle in der richtigen Reihenfolge sind und b) die Partitionen von grob nach fein sortiert sind.
Select[...,...&]
filtert diese Liste dann nach der anonymen Funktion, die als zweites Argument übergeben wird.Join @@ # == d
prüft, ob wir tatsächlich eine Listenpartition anstelle einer allgemein festgelegten Partition haben.#~FreeQ~{0, __}
Überprüft, dass keine Partition mit einer führenden Null beginnt.0 <= ## & @@ f /@ #
ist ein bisschen dunkler. Zuerst ordnen wirFromDigits
jede Liste in der Partition zu, um die durch die Ziffern dargestellten Zahlen wiederzugewinnen. Dann wenden wir uns0 <= ##
diesen Zahlen zu, wobei##
sich auf alle Zahlen bezieht. Wenn es sich bei der Partition um eine handelt,{1, 23, 45}
wird diese auf erweitert0 <= 1 <= 23 <= 45
, sodass überprüft wird, ob das Array sortiert ist.Last@
gibt mir dann die letzte nach dem filtern übrig gebliebene partition - das funktioniert, weilSetPartitions
schon die partitionen so sortiert sind, dass die feinsten am ende sind.f/@
die Nummern aus den Ziffernlisten wiederhergestellt.quelle
Python 3, 134 Bytes
Es ist ein bisschen chaotisch, aber na ja. Das Programm generiert nur alle gültigen Partitionen rekursiv. Der interessante Teil ist, dass alles, was notwendig war, um führende Nullen zu verbieten, eine zusätzliche
or "1">s[i:]>""
Bedingung war.Nimmt Eingaben wie
f("12345678901234567890")
und gibt eine Liste von Ints zurück.quelle
Pyth,
626160Erläuterung
Der Algorithmus generiert alle Binärzahlen zwischen
0
(einschließlich) und2^(n-1)
(ausschließlich), wobein
die Länge der Eingabe ist.Die Binärziffern von jedem werden dann einem Trennzeichen (
N
) für 1 und nichts für 0 zugeordnet.Diese Zeichen werden dann zwischen die einzelnen Eingabezeichen eingefügt, und das Ergebnis wird durch geteilt
N
, um eine Liste zu erhalten.Die Werte in den Listen werden dann in ganze Zahlen zerlegt und die Listen werden nach Länge sortiert. Dann müssen nur noch nicht sortierte und an führenden Nullen aufgeteilte herausgefiltert werden, wonach die längste Liste ausgewählt wird.
quelle
(NICHT-WETTBEWERBSFÄHIG) Pyth, 25 Bytes
Probieren Sie es online!
Wie es funktioniert:
quelle
J, 109 Bytes
Sehr lang, benötigt aber mindestens O (n * (2n)!) Speicher und O (n * log (n) * (2n)!) Zeit, wobei n die Länge der Eingabe ist. (Versuchen Sie also nicht, es mit mehr als 5 Ziffern auszuführen.)
Die Funktion nimmt die Eingabe als String.
Beispiele:
Methode:
quelle
Haskell, 161 Bytes
Testlauf:
So funktioniert es: Die Hilfsfunktion
f
teilt die Eingabeliste in jede mögliche Liste von Unterlisten auf.g
Zuerst werden diejenigen mit einer Unterliste verworfen, die mit0
und dann diejenigen ohne die richtige Reihenfolge beginnen. Verbinde jede verbleibende Liste mit ihrer Länge, nimm das Maximum und verwerfe den Längenteil erneut.quelle