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 sconsta de solo letras de aa 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
sens+saveriguar hasta qué punto hay que girar para obtenersla espalda, y luego dividir la longitud despor 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
+/2que 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/3predicado. Elfindall/3predicado encuentra todos los diferentes valores posibles para el primer argumento (Xen 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 deXcomo una lista en el argumento final ([_|Z]).La expresión que se pasa
findall/3como el segundo argumento,(append(X,Y,A),append(Y,X,A))usa elappend/3predicado para especificar queXconcatenado con algo aún indefinidoYdebe ser igual aA, la cadena de entrada, y que el mismoYconcatenadoXtambién debe ser igual aA. Esto significa queXdebe ser un prefijo deAtal manera que si se elimina del frenteAy se agrega a la parte posterior, la cadena resultante es la misma queA. El conjunto deXs 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 comoAlos prefijos deAque corresponden a la rotación 0 deA. Dado que la0rotación deAsiempre es simétrica, la longitud de la lista resultante deXsfindall/3será 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/3predicado. 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 deZes menor que el número de prefijos encontrados por elfindall/3predicado y, por lo tanto, igual al número de rotaciones simétricas deA. Finalmente, uso ellength/2predicado para establecerBla 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].lengthJapt , 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<>takelugar de usar(++)para guardar 3 bytes, de esta manera .(<>)no está en preludio, en la versión de Haskell con la que trabajo.