Una rotación "se realiza dividiendo una cuerda en dos partes e invirtiendo su orden" . Un objeto es simétrico bajo una operación si el objeto no cambia después de aplicar dicha operación. Entonces, una "simetría rotacional" es el hecho de que una cadena permanece sin cambios después de la "rotación".
Dada una cadena no vacía que s
consta de solo letras de a
a z
, genera el orden más alto de la simetría rotacional de la cadena.
Casos de prueba:
input output
a 1
abcd 1
abab 2
dfdfdfdfdfdf 6
Este es el código de golf . La respuesta más corta en bytes gana. Se aplican lagunas estándar .
code-golf
string
abstract-algebra
Monja permeable
fuente
fuente
Respuestas:
Retina , 15 bytes
Pruébalo en línea!
Coincide con la cadena completa repitiendo una subcadena (las subcadenas más cortas se priorizan debido a la falta de gravedad
.+?
) y reemplaza la cadena completa con el número de repeticiones que usamos.fuente
.*(.+)$(?<=^(\1)*)
...Jalea , 3 bytes
Pruébalo en línea!
fuente
05AB1E , 8 bytes
Pruébalo en línea!
Explicación
fuente
Python, 31 bytes
Encuentra el primer índice no nulo de
s
ens+s
averiguar hasta qué punto hay que girar para obteners
la espalda, y luego dividir la longitud des
por ese número. Basado en ideas que vi en otros lugares .fuente
Prólogo (SWI) , 64 bytes
Pruébalo en línea!
Define un predicado
+/2
que toma una cadena (en forma de una lista de códigos de caracteres) como su primer argumento (A
) y establece su segundo argumento (B
) en el orden de la rotación simétrica de mayor orden.Explicación
Este programa utiliza el hecho de que el conjunto de rotaciones simétricas en una cadena es un grupo cíclico y, por lo tanto, el orden del conjunto de rotaciones simétricas es igual al orden de la rotación simétrica de mayor orden. Por lo tanto, el programa puede calcular el resultado deseado al encontrar el número total de rotaciones simétricas en la cadena de entrada.
Explicación del código
La mayor parte del trabajo pesado se realiza mediante una llamada al
findall/3
predicado. Elfindall/3
predicado encuentra todos los diferentes valores posibles para el primer argumento (X
en este caso) de modo que la expresión dada como el segundo argumento sea verdadera ((append(X,Y,A),append(Y,X,A))
más sobre eso más adelante). Finalmente, almacena cada uno de estos posibles valores deX
como una lista en el argumento final ([_|Z]
).La expresión que se pasa
findall/3
como el segundo argumento,(append(X,Y,A),append(Y,X,A))
usa elappend/3
predicado para especificar queX
concatenado con algo aún indefinidoY
debe ser igual aA
, la cadena de entrada, y que el mismoY
concatenadoX
también debe ser igual aA
. Esto significa queX
debe ser un prefijo deA
tal manera que si se elimina del frenteA
y se agrega a la parte posterior, la cadena resultante es la misma queA
. El conjunto deX
s con esta propiedad casi tiene una correspondencia uno a uno con las rotaciones simétricas deA
. Siempre hay exactamente un caso de doble conteo que se debe al hecho de que tanto la cadena vacía comoA
los prefijos deA
que corresponden a la rotación 0 deA
. Dado que la0
rotación deA
siempre es simétrica, la longitud de la lista resultante deX
sfindall/3
será mayor que la cantidad de rotaciones simétricas enA
.Para resolver el problema del conteo doble, utilizo la coincidencia de patrones en el tercer argumento del
findall/3
predicado. En Prolog, las listas se representan como pares de su cabeza (el primer elemento) y su cola (el resto). Por lo tanto,[_|Z]
representa una lista cuya cola es igual aZ
. Esto significa que la longitud deZ
es menor que el número de prefijos encontrados por elfindall/3
predicado y, por lo tanto, igual al número de rotaciones simétricas deA
. Finalmente, uso ellength/2
predicado para establecerB
la longitud deZ
.fuente
JavaScript (ES6),
4241 bytesGuardado 1 byte gracias a @ l4m2
Casos de prueba
Mostrar fragmento de código
fuente
f=s=>s.length/s.match`(.+?)\\1*$`[1].length
Japt , 7 bytes
¡Pruébelo en línea!
Explicación
fuente
PHP, 66 bytes
Pruébalo en línea!
PHP, 67 bytes
Pruébalo en línea!
fuente
C (gcc) , 59 bytes
Pruébalo en línea!
fuente
Haskell , 49 bytes
Pruébalo en línea!
Haskell , 49 bytes
Pruébalo en línea!
Explicación
Esto utiliza la solución simple @ 0 'señalada. Dado que las rotaciones de la cadena forman un grupo cíclico, el elemento de orden más alto es el mismo que el tamaño del grupo, por lo que podemos obtener el orden de la unidad al encontrar el número de rotaciones simétricas.
Los códigos simples hacen una comprensión de la lista y cuentan el número de rotaciones que preservan la cadena original.
fuente
drop<>take
lugar de usar(++)
para guardar 3 bytes, de esta manera .(<>)
no está en preludio, en la versión de Haskell con la que trabajo.