Einführung
Die meisten von Ihnen sind mit dem Algorithmus für die Zusammenführung zum Sortieren einer Liste von Zahlen vertraut . Als Teil des Algorithmus schreibt man eine Hilfsfunktion merge
, die zwei sortierte Listen zu einer sortierten Liste kombiniert. Im Python-ähnlichen Pseudocode sieht die Funktion normalerweise so aus:
function merge(A, B):
C = []
while A is not empty or B is not empty:
if A is empty:
C.append(B.pop())
else if B is empty or A[0] ≤ B[0]:
C.append(A.pop())
else:
C.append(B.pop())
return C
Die Idee ist, das kleinere der ersten Elemente von A
und B
so lange auszublenden, bis beide Listen leer sind, und die Ergebnisse in zu sammeln C
. Wenn A
und B
beide sortiert sind, ist dies auch der Fall C
.
Umgekehrt ist if C
eine sortierte Liste und wir teilen sie in zwei beliebige Untersequenzen auf A
und B
, dann A
und B
werden auch sortiert und merge(A, B) == C
. Interessanterweise gilt dies nicht unbedingt, wenn C
nicht sortiert wird, was uns zu dieser Herausforderung bringt.
Eingang
Ihre Eingabe ist eine Permutation der ersten 2*n
nichtnegativen Ganzzahlen [0, 1, 2, ..., 2*n-1]
für einige n > 0
, angegeben als Liste C
.
Ausgabe
Ihr Ausgang wird ein truthy Wert sein , wenn es zwei Listen A
und B
die Länge , n
so dass C == merge(A, B)
, und ein falsy Wert anders. Da die Eingabe keine Duplikate enthält, müssen Sie sich keine Gedanken darüber machen, wie Verbindungen in der merge
Funktion unterbrochen werden.
Regeln und Boni
Sie können entweder eine Funktion oder ein vollständiges Programm schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Beachten Sie, dass Sie nicht verpflichtet sind, die Listen A
und B
in den "Ja" -Instanzen zu berechnen . Wenn Sie jedoch auf die Ausgabe der Listen erhalten Sie einen Bonus von 20% . Um diesen Bonus zu erhalten, müssen Sie nur ein Listenpaar ausgeben, nicht alle Möglichkeiten. Damit dieser Bonus leichter in stark typisierten Sprachen beansprucht werden kann, ist es zulässig, ein Paar leerer Listen in den "Nein" -Instanzen auszugeben.
Brute Forcing ist nicht verboten, aber es gibt einen Bonus von -10% für die Berechnung aller letzten vier Testfälle in weniger als 1 Sekunde.
Testfälle
In den "Ja" -Instanzen ist nur ein möglicher Ausgang angegeben.
[1,0] -> False
[0,1] -> [0] [1]
[3,2,1,0] -> False
[0,3,2,1] -> False
[0,1,2,3] -> [0,1] [2,3]
[1,4,0,3,2,5] -> False
[4,2,0,5,1,3] -> [4,2,0] [5,1,3]
[3,4,1,2,5,0] -> [4,1,2] [3,5,0]
[6,2,9,3,0,7,5,1,8,4] -> False
[5,7,2,9,6,8,3,4,1,0] -> False
[5,6,0,7,8,1,3,9,2,4] -> [6,0,8,1,3] [5,7,9,2,4]
[5,3,7,0,2,9,1,6,4,8] -> [5,3,7,0,2] [9,1,6,4,8]
[0,6,4,8,7,5,2,3,9,1] -> [8,7,5,2,3] [0,6,4,9,1]
[9,6,10,15,12,13,1,3,8,19,0,16,5,7,17,2,4,11,18,14] -> False
[14,8,12,0,5,4,16,9,17,7,11,1,2,10,18,19,13,15,6,3] -> False
[4,11,5,6,9,14,17,1,3,15,10,12,7,8,0,18,19,2,13,16] -> [4,17,1,3,15,10,12,7,8,0] [11,5,6,9,14,18,19,2,13,16]
[9,4,2,14,7,13,1,16,12,11,3,8,6,15,17,19,0,10,18,5] -> [9,4,2,16,12,11,3,8,6,15] [14,7,13,1,17,19,0,10,18,5]
(K[0], Q-K[0])
Sie nicht drucken , sondern drucken können(K[0], K[-1])
. Ich weiß aber nicht, ob das eine Ersparnis wäre.K[::len(K)-1]
.GolfScript (35 * 0,9 = 31,5)
Die Online-Demo ist ziemlich langsam: Auf meinem Computer werden alle Tests in weniger als 0,04 Sekunden ausgeführt.
Erläuterung
quelle
APL,
625044 * 90% = 39,6Probieren Sie es hier aus.
quelle