Períodos locales
Tome una cadena no vacía s . El período local de s en el índice i es el número entero positivo más pequeño n tal que para cada 0 ≤ k <n , tenemos s [i + k] = s [i-n + k] cada vez que se definen ambos lados. Alternativamente, es la longitud mínima de una cadena no vacía w tal que si la concatenación ww se coloca al lado de s para que la segunda copia de w comience en el índice i de s , entonces las dos cadenas coinciden donde se superponen.
Como ejemplo, calculemos el período local de s = "abaabbab" en el índice 2 (basado en 0).
- Pruebe n = 1 : luego s [2 + 0] ≠ s [2-1 + 0] , por lo que esta opción no es correcta.
- Pruebe n = 2 : entonces s [2 + 0] = s [2-2 + 0] pero s [2 + 1] ≠ s [2-2 + 1] , por lo que esto tampoco es correcto.
- Pruebe n = 3 : entonces s [2 + 0-3] no está definido, s [2 + 1] = s [2-3 + 1] y s [2 + 2] = s [2-3 + 2] . Por lo tanto, el período local es 3.
Aquí hay una visualización de los períodos locales usando la segunda definición, con punto y coma agregados entre las dos copias de w para mayor claridad:
index a b a a b b a b period
0 a;a 1
1 b a;b a 2
2 a a b;a a b 3
3 a;a 1
4 b b a b a a;b b a b a a 6
5 b;b 1
6 a b b;a b b 3
7 b a;b a 2
Tenga en cuenta que w no es necesariamente una subcadena de s . Esto sucede aquí en el caso del índice 4.
La tarea
Su entrada es una cadena no vacía s de caracteres ASCII en minúscula. Se puede tomar como una lista de caracteres si se desea. Su salida será la lista que contiene el período local de s en cada uno de sus índices. En el ejemplo anterior, la salida correcta sería [1,2,3,1,6,1,3,2] .
El conteo de bytes más bajo en cada idioma gana. Se aplican reglas estándar de código de golf .
Casos de prueba
a -> [1]
hi -> [1, 2]
www -> [1, 1, 1]
xcxccxc -> [1, 2, 2, 5, 1, 3, 2]
abcbacb -> [1, 4, 7, 7, 7, 3, 3]
nininini -> [1, 2, 2, 2, 2, 2, 2, 2]
abaabbab -> [1, 2, 3, 1, 6, 1, 3, 2]
woppwoppw -> [1, 4, 4, 1, 4, 4, 4, 1, 4]
qwertyuiop -> [1, 10, 10, 10, 10, 10, 10, 10, 10, 10]
deededeededede -> [1, 3, 1, 5, 2, 2, 5, 1, 12, 2, 2, 2, 2, 2]
abababcabababcababcabababcaba -> [1, 2, 2, 2, 2, 7, 7, 7, 7, 2, 2, 2, 19, 19, 5, 5, 2, 5, 5, 12, 12, 2, 2, 2, 7, 7, 5, 5, 2]
qwertyuiop
, w será una versión rotada deqwertyuiop
. Vea también el ejemplo en el índice 4: w no es necesariamente una subcadena de s .;
esté en su ejemplo). Eso eliminaría al líder 1.Respuestas:
Retina ,
8986 bytesPruébalo en línea! Editar: Guardado 3 bytes gracias a @MartinEnder. Explicación:
Divida la entrada en cada carácter, creando un par de líneas, una para el prefijo y otra para el sufijo del prefijo.
Ejecute el resto del script en cada par resultante.
Encuentra todas las coincidencias superpuestas y enumera los resultados. (Vea abajo.)
Descarta la cerilla vacía.
Toma la duración de cada partido.
Ordenar numéricamente.
Toma el más pequeño.
La coincidencia funciona dividiendo el prefijo y el sufijo en tres partes. Hay cuatro casos válidos a considerar:
Por lo tanto, la expresión regular solo permite que A y C coincidan en un lado a la vez.
fuente
$&$'
es igual a$<'
y calcular longitudes de línea es más corto con%C`.
. tio.run/##K0otycxLNPz/X49LJeHQNhUb9UPbuPQ14mr0tDUPbdPT1o/…Java 8,
167154152 bytes-2 bytes gracias a @ceilingcat .
Pruébalo en línea.
Explicación:
fuente
JavaScript (ES6), 84 bytes
Toma la entrada como una matriz de caracteres.
Casos de prueba
Mostrar fragmento de código
fuente
Ruby ,
104102 bytesPruébalo en línea!
Una lambda que acepta una cadena y devuelve una matriz.
-2 bytes: puntos finales de rango de intercambio con guardias vinculados al índice
Sin golf:
fuente
Japt ,
3332 bytesGuardado 1 byte gracias a @Shaggy
¡Pruébelo en línea!
Explicación
Mi primer pensamiento fue comparar cada carácter en la subcadena izquierda con el carácter correspondiente en la subcadena derecha, como en la respuesta JS. Sin embargo, eso no funcionaría, ya que el método de Japt para obtener un personaje simplemente se ajusta al otro extremo de la cadena si el índice es negativo o demasiado grande.
En cambio, mi solución construye una expresión regular de la segunda subcadena y la prueba en la primera subcadena. Tomemos el quinto elemento en el caso de prueba
abaabbab
como ejemplo:El truco principal es que
^
puede coincidir infinitamente, hasta que un personaje real coincida. Esto nos permite ignorar cualquier número de caracteres desde el comienzo de la expresión regular, al tiempo que nos aseguramos de que el resto coincida consecutivamente, terminando al final de la cadena de prueba.No estoy seguro de haber explicado esto muy bien, así que avíseme si hay algo que le gustaría aclarar o cualquier otra cosa que deba explicarse.
fuente
C (gcc) ,
143142140139128126123 bytes!b&&printf
ab||printf
.for
paréntesis del cuerpo del bucle haciendo malabares con laprintf
ubicación.b+=S[i+k]!=S[i-n+k]
ab|=S[i+k]-S[i-n+k]
.l=strlen(S)
acondicionar ambos bucles de manejo de cadenas para que se rompan al llegar al final de la cadena (un byte nulo'\0'
).i-n+k>~0
ai-n>~k
.b||printf("|"),n++
es equivalente an+=b||printf("|")
.Pruébalo en línea!
fuente
b||printf("%d,",n)
dentro del ciclo for:i,b,k,n,l;f(char*S){for(l=strlen(S),i=-1;++i<l;)for(b=n=1;b;b||printf("%d,",n),n++)for(b=k=0;k<n;k++)i+k<l&i-n+k>=0&&(b+=S[i+k]!=S[i-n+k]);}
140 bytesPython 2 , 115 bytes
Pruébalo en línea!
fuente