Dada una cadena como argumento, genera la longitud de la (s) subcadena (s) repetida (s) más larga (s) que no se superponen o cero si no existe dicha cadena.
Puede suponer que la cadena de entrada no está vacía.
Ejemplos
abcdefabc
: la subcadena abc
se repite en las posiciones 1 y 7, por lo que el programa debería generar 3
abcabcabcabcab
: abcabc
o bcabca
o cabcab
se repiten, por lo que el programa debería generar 6 . (la subcadena abcabcabcab
también se repite, pero las ocurrencias se superponen, por lo que no lo aceptamos).
aaaaaaa
: aaa
se repite en las posiciones 1 y 4, por ejemplo, por lo que el programa debería generar 3
abcda
: a
se repite, por lo que el programa debería generar 1
xyz
: sin cadena repetida → 0
ababcabcabcabcab
: debería devolver 6
Este es el código de golf , por lo que gana menos bytes.
fuente
Respuestas:
brainfuck, 226 bytes
Formateado:
Espera la entrada con o sin una nueva línea final y genera el resultado como un valor de byte .
Pruébalo en línea.
Esto verifica cada prefijo para ver si ocurre más adelante en la cadena, luego corta el primer carácter y repite el proceso hasta que no queden más caracteres.
La cinta se divide en nodos de 3 celdas,
c 0 f
donde
c
es un carácter de la cadena dada yf
es un indicador que puede ser uno, negativo o cero. Los indicadores distintos de cero se colocan entre los dos caracteres que se comparan actualmente, y los negativos se reservan para las celdas después del final del prefijo actual y antes del comienzo del sufijo actual (es decir, antes del índice de la coincidencia potencial actual).El resultado se almacena a la izquierda de la cadena y se actualiza cada vez que se encuentra una coincidencia.
(La cadena en realidad se procesa en reversa con un
\x01
adjunto).fuente
Jalea , 12 bytes
Pruébalo en línea!
Cómo funciona
fuente
œ-Q
es realmente genialPerl 6 , 36 bytes
Intentalo
Expandido:
fuente
Retina ,
353230 bytesMuy buen desafío.
Pruébalo en línea
Explicación:
fuente
M%`.
como segunda etapa.JavaScript (ES6),
796866 bytesEditar: Guardado
1113 bytes gracias a @Arnauld.fuente
Haskell , 79 bytes
Pruébalo en línea!
fuente
%
puede acumular una subsecuencia no contiguo, dando falsos positivos como 2 paraaa
enaxayaa
,a%d
es incorrecta, pero también innecesaria. Lo que también significa que puede usar enmax
lugar demaximum
.a%d
para""%d
arreglarlo.a
está vacío.sum[1|(x,y)<-zip a c,x==y]
se puede usar en lugar dea!c
.Python 3 ,
7572 bytesPruébalo en línea!
fuente
JavaScript, 120
fuente
Casco , 11 bytes
Pruébalo en línea!
Nota: Husk es más nuevo que este desafío.
Explicación
fuente
Perl 5 con
-p
40 bytesPruébalo en línea!
fuente
Mathematica,
7565 bytes10 bytes guardados debido a @JingHwan Min .
Función anónima. Toma una cadena como entrada y devuelve un número como salida.
fuente
BlankNullSequence (___)
cuandoOverlaps->All
esté allí.Max@StringLength@StringCases[#,a___~~___~~a___:>a,Overlaps->All]&
estaría bienStringReplace
: PPyth - 16 bytes
Necesito jugar golf convirtiendo todas las cuerdas a longitudes y encontrando el máximo.
Test Suite .
fuente
Clojure, 112 bytes
realiza un bucle dos veces sobre los números
0
paran - 1
(n
siendo la longitud de la cadena), sueltaj
caracteres y divide el resto en partes "iniciales" y "finales". Crea un conjunto de todas las subcadenase
de longitudb
y lo utiliza como una función para verificar sib
se encuentra desde allí. Devuelve la longitud deb
si se encuentra y 0 de lo contrario, devuelve el máximo de estos valores.Sería interesante ver una versión más corta.
fuente
Retina , 24 bytes
Pruébalo en línea!
Un calentamiento para mí para aprender las nuevas características de Retina 1.
Explicación
Una etapa de Lista, esto devuelve todas las coincidencias para la expresión regular
(.*).*\1
, que coincide con cualquier patrón de la forma "ABA", donde A y B son dos subcadenas arbitrarias (posiblemente vacías). Las opciones adicionales dadas a esta etapa sonv
, que considera coincidencias superpuestas, y$
que aplica una sustitución a cada una de las coincidencias antes de devolverla: la sustitución se indica en la segunda línea y corresponde a la longitud (.
) del primer grupo de captura ( que sería la subcadena "A" en el ejemplo anterior).Ahora tenemos todas las longitudes de subcadenas repetidas, esta etapa simplemente las ordena en orden numérico, desde la más corta hasta la más larga.
Finalmente, esta etapa grep (
G
) mantiene solo el último-1
resultado ( ), que es la longitud de la subcadena repetida más larga.fuente
Javascript, 165 bytes
Casos de prueba
fuente
ababcabcabcabcab
, pero la cadenacabcab
se repite.