Una cadena x
genera una cadena y
si y
es una subcadena de una repetición infinita de x
. Por ejemplo abc
genera bcabcab
.
Escriba un programa para encontrar la cadena más corta, lexicográficamente más pequeña que generará la entrada. Se le da en la entrada estándar una sola línea de texto. Debe imprimir la cadena generadora a la salida estándar. Por ejemplo:
entrada
bcabcabca
salida
abc
El código más corto gana. Puede suponer que la entrada contiene solo los caracteres az (y una nueva línea final si lo desea).
code-golf
kolmogorov-complexity
subsequence
Keith Randall
fuente
fuente
bac
en su ejemplo en lugar deabc
?bac
s.(bca)^n
, lo que significa quebca
es tan válido para el ejemplo dado comoabc
.bca
no es el más pequeño lexicográficamente.Respuestas:
Ruby 1.9, 40 caracteres
Asume que la entrada no es terminada por una nueva línea. También es probablemente ridículamente lento para obtener resultados más grandes.
fuente
Python
88185 caracteresSalida:
fuente
bacabac
correctamente.Haskell,
299128 caracteresGracias a jloy! Ahora la versión es mucho más corta y creo que es correcta.
fuente
cabcabcabc
produceabcabc
, por lo que esta solución no está ahí. Creo que tendrá que modificarq++q++q
para obtener el resultado deseado. Sin embargo, mi intento rápido de arreglar las cosas volvieron a tener 145 caracteres. (Spoilers están aquí: gist.github.com/1035161 )(/=)""
condición? No parece hacer nada. Además, deshacerse de lambdas ayuda: puede deshacerse de w por completo utilizando el.
operador y cambiar la función principalmain=interact s
para guardar un par de caracteres.permutations
lugar details
.Python,
121137129 caracteresEDITAR: se corrigió el error detectado por JiminP
fuente
aabab
para cadenaababa
... :(Ruby 1.9, 36
Utiliza el mismo enfoque que la solución de Ventero.
fuente
Pitón,
161 159 166 140 141 134132 caracteresEDITAR : Golfed el código después de leer el comentario de Jules Olléon. Se eliminó un 'error' que
bcdabcdab
da como resultadoabbc
.EDIT2 : Se corrigió el error (
abaa
resultadosaaa
) detectado por Jules Olléon.No conozco bien Python, por lo que este código probablemente no sea "golf".
Amo esta regla:
Puede suponer que la entrada contiene solo los caracteres az ...
Salidas, entradas
fuente
i-=1
lugar dei=i-1
. Igualmente para el incremento.Mathematica 124 bytes
Los espacios en blanco y las nuevas líneas (en presencia de punto y coma en los extremos de las líneas) no tienen significado en Mathematica y se incluyen aquí para facilitar la lectura.
La entrada va entre comillas en la primera línea. Si se relanza como una función, eso toma la entrada de cadena de la siguiente manera:
entonces son 128 bytes.
El
For
bucle toma los primerosi
caracteres de la entrada y los repite al menos hasta la longitud de la entrada, luego verifica si la entrada es una subcadena del resultado. Habiendo encontrado la longitud del período de la cadena, elStringPartition
comando concatena dos copias de ese período y toma todas las subcadenas de esa longitud (básicamente obtiene todas las permutaciones cíclicas), luegoFirst@Sort
encuentra la primera de ellas cuando se ordena lexicográficamente.fuente
javascript 96 Chars.
Plunkr de trabajo
fuente