Einführung
Bei dieser Herausforderung besteht Ihre Aufgabe darin, verallgemeinerte Teilfolgen von Zeichenfolgen zu finden. Die Teilsequenzen sind nicht unbedingt zusammenhängend, und sie können die Zeichenfolge auch "umwickeln", über ihr Ende hinausgehen und von vorne beginnen. Sie sollten jedoch die Anzahl der Wraps minimieren.
Formal lassen u
und v
alle zwei Saiten, und sein k ≥ 0
eine ganze Zahl. Wir sagen, dass dies u
eine k
umhüllende Folge von ist v
, wenn es unterschiedliche Indizes gibt, so dass und höchstens die Indizes erfüllen . Dies bedeutet, dass man das Innere finden kann, indem man von links nach rechts geht, einige seiner Charaktere auf dem Weg auswählt und sich meistens umhüllt (äquivalent, höchstens überstrichen ). Beachten Sie, dass selbst nach einem Wrap-Around kein Zeichen mehr als einmal ausgewählt werden kann und dass -wrapping-Teilsequenzen genau die gewöhnlichen Teilsequenzen sind, mit denen wir alle vertraut sind.i1, i2, ..., ilen(u)
u == v[i1] v[i2] ... v[ilen(u)]
k
ij
ij > ij+1
u
v
k
k+1
v
0
Die Aufgabe
Ihre Eingaben sind zwei nicht leere alphanumerische Zeichenfolgen u
und v
, und Ihre Ausgabe ist die kleinste Ganzzahl, k
so dass u
es sich um eine k
umschließende Teilsequenz von handelt v
. Wenn dies nicht k
der Fall ist, erfolgt die Ausgabe -1
.
Beispiel
Betrachten Sie die Eingaben u := xyzyxzzxyx
und v := yxzzazzyxxxyz
. Wenn wir anfangen, gierig nach den Charakteren von u
in zu suchen v
, werden wir uns dreimal umwickeln:
yxzzazzyxxxyz
>─x─────y────z┐
┌─────────────┘
└y───────x────┐
┌─────────────┘
└──zz─────x─y─┐
┌─────────────┘
└──────────x──>
Somit ist die korrekte Ausgabe höchstens 3. Beachten Sie, wie das Zeichen ganz links x
einmal ausgewählt und dann beim zweiten Durchlauf ignoriert wird, da es nicht wiederverwendet werden kann. Es gibt jedoch eine kürzere Methode mit nur 2 Wrap-arounds:
yxzzazzyxxxyz
>──────────xyz┐
┌─────────────┘
└yxzz────x────┐
┌─────────────┘
└───────y─x───>
Es stellt sich heraus, dass ein Wrap-Around (dh zwei Sweeps) nicht ausreicht, sodass die richtige Ausgabe erfolgt 2
.
Regeln und Boni
Sie können entweder eine Funktion oder ein vollständiges Programm schreiben und bei Bedarf auch die Reihenfolge der Eingaben ändern. Die niedrigste Byteanzahl gewinnt und Standardschlupflöcher sind nicht zulässig.
Es gibt einen Bonus von -10% für die Berechnung aller Testfälle in insgesamt weniger als 10 Sekunden. Ich werde unklare Fälle auf meiner Maschine testen. Meine Referenzimplementierung in Python dauert ungefähr 0,6 Sekunden. Ich habe einen 7 Jahre alten Laptop mit 1,86 GHz Dual-Core-CPU, den Sie vielleicht berücksichtigen möchten.
Testfälle
"me" "moe" -> 0
"meet" "metro" -> -1
"ababa" "abaab" -> 1
"abaab" "baabaa" -> 1
"1c1C1C2B" "1111CCCcB2" -> 3
"reverse" "reserved" -> 2
"abcdefg" "gfedcba" -> 6
"xyzyxzzxyx" "yxzzazzyxxxyz" -> 2
"aasdffdaasdf" "asdfddasdfsdaafsds" -> 2
quelle
x
in drei verschiedenen Sweeps verwendet wird. Es kann nur einmal verwendet werden.Antworten:
Pyth, 34 Bytes
Dies definiert eine Funktion
g
, die zwei Zeichenfolgen als Parameter verwendet. Probieren Sie es online aus: Pyth Compiler / ExecutorDieser Code ist sehr ineffizient. Es hat eine Zeit- und Speicherkomplexität von
len(v)!/(len(v)-len(u))!
. Die längeren Testfälle können nicht in weniger als 10 Sekunden gelöst werden. (Es wird auch sehr wahrscheinlich abstürzen, da der Speicher knapp wird.)quelle
Haskell, 160 · 0,9 = 144 Bytes
Timing für alle Testfälle (Hinweis: Argumente werden umgedreht):
So funktioniert es (Kurzversion): einfache Brute Force, bei der nur ein passender Charakter verwendet und übersprungen werden muss. Ich stoppe die Suche, wenn entweder fertig (Rückgabe der Anzahl der Zyklen) oder wenn mehr als das Minimum zurückgelegt wurde (Rückgabe -1).
Ich habe im Vergleich zu meiner ersten Version viele Bytes gespart, hauptsächlich weil ich von einem vollständigen Programm zu einer Funktion gewechselt bin.
Mit einigen Kommentaren und dem richtigen Abstand ist Golf Haskell gut lesbar:
Als Referenz: alte Version, Vollprogramm, 187 Bytes
quelle
JavaScript (ES6) 174 (193 - 10%)
Rekursive Suche, wie die Antwort von @ nimi, wobei das Minimum an Wraps erhalten bleibt. Der Lösungsraum ist groß (vor allem für das letzte Beispiel), aber das Reduzieren der Suche auf die aktuell gefundene Minute hält die Zeit niedrig. Bearbeiten 1 Fügen Sie einen fehlenden Testfall hinzu, der etwas verkürzt wurde. Bearbeiten 2 Keine Notwendigkeit, Parameter weiterzugeben, es ist behoben
Ungolfed
Test In Firefox / Firebug - Konsole
Ausgabe (letzte Zeile ist die Ausführungszeit in ms)
quelle