Los palíndromos son divertidos, pero algunas de las otras cuerdas comienzan a sentirse excluidas. Podemos convertir esas cuerdas en palíndromos gruesos dividiéndolos en conjuntos palindrómicos de trozos.
Por ejemplo, la cadena "abcabca"
no es un palíndromo si lo leemos carácter por carácter, pero tenemos tres formas diferentes de convertirlo en un palíndromo grueso :
["abcabca"]
["a" "bcabc" "a"]
["a" "bc" "a" "bc" "a"]
Como puede ver, la palindrómica gruesa es un concepto muy inclusivo; cada cadena se puede convertir en un grueso palíndromo de al menos una forma.
Tarea
Escriba un programa o una función que reciba una cadena como entrada y devuelva su fragmentación palindrómica , es decir, el número de sus particiones que son matrices palindrómicas.
Casos de prueba
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"
Reglas adicionales
Puede suponer que la entrada consistirá en 42 caracteres ASCII o menos imprimibles, opcionalmente rodeados por los delimitadores de cadena de su idioma y / o seguidos por una nueva línea.
Para cada cadena de entrada válida, su código debe finalizar en menos de un minuto en mi máquina (Intel Core i7-3770, 16 GiB RAM, Fedora 21).
Con un algoritmo adecuado, debería ser fácil cumplir con este límite de tiempo. Sin embargo, lo más probable es que no pueda iterar sobre todas las particiones de la cadena de entrada.
Si elige imprimir el resultado en STDOUT, puede ir seguido de una nueva línea.
Se aplican reglas estándar de código de golf .
yz
. 2. En lugar de dos mapas y un filtro, puede usar un solo mapa y un condicional ( enlace ), que ahorra tres bytes.CJam (
4139 bytes)Demostración en línea
Esto es "ansioso" en el sentido de que encuentra el número de palíndromos gruesos para cada cadena "central" (es decir, el resultado de eliminar el mismo número de caracteres de ambos extremos de la cadena original), pero porque utiliza la memoria automática
j
cada operador se calcula una sola vez, lo que proporciona un programa muy rápido (y guarda algunos caracteres en una implementación no memorizada).Gracias a Dennis por ahorrar un byte.
fuente
Mathematica,
777257 bytesfuente
Perl, 86 bytes
Código de 84 bytes + 2 interruptores
Tiene que haber un método más corto, pero aquí va:
Toma información de STDIN, una cadena por línea.
Explicación: Para los valores
1<=$i<length(input string)
, usa la expresión regular/^(.{$i})(.*)\1$/
para obtener los fragmentos izquierdo y derecho e incrementa el recuento. Luego, recursivamente, hace lo mismo para la parte central de la cadena.fuente