Betrachten Sie die folgenden Definitionen aus Die Anzahl der Läufe in einer Zeichenfolge von W. Rytter. Beachten Sie, dass Wort, Zeichenfolge und Teilzeichenfolge ungefähr Synonyme sind.
Ein Lauf in einer Zeichenfolge ist ein nicht erweiterbares (mit derselben minimalen Periode) periodisches Segment in einer Zeichenfolge.
Eine Periode p eines Wortes w ist eine positive ganze Zahl p, so dass w [i] = w [i + p] ist, wenn beide Seiten dieser Gleichung definiert sind. Per (w) bezeichne die Größe der kleinsten Periode von w. Wir sagen, dass ein Wort w periodisch ist, wenn per (w) <= | w | / 2.
Betrachten Sie zum Beispiel die Zeichenfolge x = abcab
. per(abcab) = 3
wie x[1] = x[1+3] = a
, x[2]=x[2+3] = b
und es gibt keine kleinere Periode. Die Zeichenfolge abcab
ist daher nicht periodisch. Die Zeichenfolge abab
ist jedoch periodisch gemäß (abab) = 2.
Ein Lauf (oder eine maximale Periodizität) in einem String w ist ein Intervall [i ... j] mit j> = i, so dass
- w [i ... j] ist ein periodisches Wort mit der Periode p = per (w [i ... j])
- Es ist maximal. Formal ist weder w [i-1] = w [i-1 + p] noch w [j + 1] = w [j + 1-p]. Informell kann der Lauf nicht in einem größeren Lauf mit derselben Periode enthalten sein.
Bezeichne mit RUNS (w) die Menge der Läufe von w.
Beispiele
Die vier Läufe von atattatt
sind [4,5] = tt, [7,8] = tt, [1,4] = atat, [2,8] = tattatt.
Die Zeichenfolge aabaabaaaacaacac
enthält die folgenden 7 Läufe:
[1,2] = aa, [4,5] = aa, [7,10] = aaaa, [12,13] = aa, [13,16] = acac, [1,8] = aabaabaa, [9 , 15] = Aacaaca.
Ihre Ausgabe sollte eine Liste von Läufen sein. Jeder Lauf sollte das Intervall angeben, das er darstellt, muss jedoch den Teilstring selbst nicht ausgeben. Die genaue Formatierung kann beliebig sein.
In den Beispielen wird die 1-Indizierung verwendet. Sie können jedoch stattdessen die 0-Indizierung verwenden, wenn dies bequemer ist.
AUFGABE
Schreiben Sie Code, der eine Zeichenfolge w angibt, und geben Sie RUNS (w) aus.
Sprachen und Eingabe
Sie können eine beliebige Sprache verwenden und die Eingabezeichenfolge in der am besten geeigneten Form verwenden. Sie müssen jedoch ein vollständiges Programm angeben und ein Beispiel für Ihren Code anzeigen, der auf der Beispieleingabe ausgeführt wird.
class A{public static ...}
jedes Mal schreiben müsste, wenn ich Golfcode spielen wollteAntworten:
Pyth, 38 Bytes
Testsuite
quelle
[i, j]
stellt die Ausgangsscheibe zwischen (0-indizierte) Zeicheni-1
undi
und endend zwischen Zeichenj-1
undj
. Dies ist die Standardkonvention in Pyth und den meisten vernünftigen Sprachen, wie es sein sollte (siehe hier und hier ).CJam, 66
Probieren Sie es online aus
Kurze Erklärung:
Der Algorithmus arbeitet in 4 Schritten (die ersten 3 entsprechen den 3 Hauptblöcken, die Sie beobachten können):
Ich würde gerne mehr Golf spielen, daher kann sich dies ändern.
quelle