Palindrome machen Spaß, aber einige der anderen Saiten fühlen sich allmählich ausgelassen. Wir können diese Saiten in klobige Palindrome verwandeln, indem wir sie in palindrome Gruppen von Stücken aufteilen.
Beispielsweise ist der String "abcabca"
kein Palindrom, wenn wir ihn Zeichen für Zeichen lesen, aber wir haben drei verschiedene Möglichkeiten, ihn zu einem klobigen Palindrom zu machen:
["abcabca"]
["a" "bcabc" "a"]
["a" "bc" "a" "bc" "a"]
Wie Sie sehen können, ist klobige Palindromie ein sehr umfassendes Konzept. Jede Saite kann auf mindestens eine Weise in ein klobiges Palindrom verwandelt werden.
Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die eine Zeichenfolge als Eingabe empfängt und ihre palindromische Chunkiness zurückgibt , dh die Anzahl ihrer Partitionen, die palindromische Arrays sind.
Testfälle
OUTPUT | INPUT
--------+---------------------------------------------
1 | ""
1 | "a"
1 | "ab"
2 | "aa"
2 | "aaa"
3 | "abcabca"
4 | "abababab"
28 | "abcabcaabababababcabca"
1 | "bbbbabababbbbababbbaaaaa"
20 | "ababbaaaabababbbaaabbbaa"
5 | "baaabaabababaababaaabbaab"
62 | "bbaaababbabbabbbabaabaabb"
2 | "a man a plan a canal panama"
25 | "ama nap lan aca nal pan ama"
93 | "SATOR AREPO TENET OPERA ROTAS"
976 | "abcabcaabcabcaabcabcaabcabcaabcabcaabcabca"
28657 | "ababababababababababaababababababababababa"
2097152 | "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
Zusätzliche Regeln
Sie können davon ausgehen, dass die Eingabe aus 42 oder weniger druckbaren ASCII-Zeichen besteht, die optional von den Zeichenfolgenbegrenzern Ihrer Sprache und / oder einer neuen Zeile umgeben sind.
Für jede gültige Eingabezeichenfolge muss Ihr Code auf meinem Computer (Intel Core i7-3770, 16 GB RAM, Fedora 21) in weniger als einer Minute fertig sein.
Mit einem geeigneten Algorithmus sollte es einfach sein, diese Frist einzuhalten. Höchstwahrscheinlich können Sie jedoch nicht alle Partitionen der Eingabezeichenfolge durchlaufen.
Wenn Sie die Ausgabe auf STDOUT drucken möchten, wird möglicherweise eine einzelne neue Zeile eingefügt.
Es gelten die Standardregeln für Code-Golf .
yz
. 2. Anstelle von zwei Karten und einem Filter können Sie auch eine einzelne Karte und eine Bedingung ( Link ) verwenden, wodurch drei Bytes eingespart werden.CJam (
4139 Bytes)Online-Demo
Dies ist "eifrig" in dem Sinne, dass es die Anzahl von klobigen Palindromen für jede "zentrale" Zeichenfolge findet (dh das Ergebnis des Entfernens der gleichen Anzahl von Zeichen von beiden Enden der ursprünglichen Zeichenfolge), aber weil es das automatische Merken verwendet
j
Jeder Operator wird nur einmal berechnet, was ein sehr schnelles Programm ergibt (und einige Zeichen über eine nicht-memoisierte Implementierung speichert).Vielen Dank an Dennis für die Einsparung von einem Byte.
quelle
Mathematica,
777257 Bytesquelle
Perl, 86 Bytes
84 Byte Code + 2 Schalter
Es muss eine kürzere Methode geben, aber hier geht es:
Übernimmt die Eingabe von STDIN, eine Zeichenfolge pro Zeile.
Erläuterung:
1<=$i<length(input string)
Verwendet für Werte den regulären Ausdruck/^(.{$i})(.*)\1$/
, um die linken und rechten Abschnitte abzurufen und die Anzahl zu erhöhen. Das Gleiche geschieht dann rekursiv für den mittleren Teil der Zeichenfolge.quelle