Uma rotação "é feita dividindo uma corda em duas partes e revertendo sua ordem" . Um objeto é simétrico sob uma operação se o objeto for inalterado após a aplicação da referida operação. Portanto, uma "simetria rotacional" é o fato de uma string permanecer inalterada após a "rotação".
Dada uma sequência não vazia que s
consiste apenas em letras de a
até z
, produz a ordem mais alta da simetria rotacional da sequência.
Casos de teste:
input output
a 1
abcd 1
abab 2
dfdfdfdfdfdf 6
Isso é código-golfe . A resposta mais curta em bytes vence. Aplicam-se brechas padrão .
code-golf
string
abstract-algebra
Freira Furada
fonte
fonte
Respostas:
Retina , 15 bytes
Experimente online!
Corresponde à sequência inteira repetindo uma subseqüência (subseqüências mais curtas são priorizadas devido à falta de credibilidade
.+?
) e substitui a sequência inteira pelo número de repetições que usamos.fonte
.*(.+)$(?<=^(\1)*)
...Gelatina , 3 bytes
Experimente online!
fonte
05AB1E , 8 bytes
Experimente online!
Explicação
fonte
Python, 31 bytes
Encontre o primeiro índice diferente de zero de
s
ins+s
para descobrir até que ponto precisamos girá-lo paras
voltar e divida o comprimentos
por esse número. Baseado em idéias que vi em outro lugar .fonte
Prolog (SWI) , 64 bytes
Experimente online!
Define um predicado
+/2
que pega uma string (na forma de uma lista de códigos de caracteres) como seu primeiro argumento (A
) e define seu segundo argumento (B
) na ordem da rotação simétrica da ordem mais alta.Explicação
Este programa usa o fato de que o conjunto de rotações simétricas em uma sequência é um grupo cíclico e, portanto, a ordem do conjunto de rotações simétricas é igual à ordem da rotação simétrica de ordem mais alta. Assim, o programa é capaz de calcular o resultado desejado, localizando o número total de rotações simétricas na sequência de entrada.
Código Explicação
A maior parte do trabalho pesado é feita por uma chamada ao
findall/3
predicado. Ofindall/3
predicado encontra todos os diferentes valores possíveis para o primeiro argumento (X
neste caso), de modo que a expressão fornecida como segundo argumento seja verdadeira ((append(X,Y,A),append(Y,X,A))
, mais sobre isso posteriormente). Finalmente, ele armazena cada um desses valores possíveisX
como uma lista no argumento final ([_|Z]
).A expressão transmitida
findall/3
como a segunda versão,(append(X,Y,A),append(Y,X,A))
usa oappend/3
predicado para especificar queX
concatenado com alguns ainda não definidosY
deve ser igual aA
, a sequência de entrada e que o mesmoY
concatenadoX
também deve ser igual aA
. Isso significa queX
deve haver algum prefixo paraA
que, se for removido da frenteA
e adicionado à parte traseira, a sequência resultante seja a mesma queA
. O conjunto deX
s com essa propriedade tem quase uma correspondência individual com as rotações simétricas deA
. Sempre há exatamente um caso de contagem dupla causado pelo fato de que a cadeia vazia eA
os prefixos deA
que correspondem à rotação 0 deA
. Como a0
rotação deA
é sempre simétrica, o comprimento da lista resultante deX
sfindall/3
será um maior que o número de rotações simétricas ativadasA
.Para resolver o problema da contagem dupla, utilizo a correspondência de padrões no terceiro argumento do
findall/3
predicado. No Prolog, as listas são representadas como pares de cabeça (o primeiro elemento) e cauda (o resto). Assim,[_|Z]
representa uma lista cuja cauda é igual é igual aZ
. Isso significa que o comprimento deZ
é um menor que o número de prefixos encontrados pelofindall/3
predicado e, portanto, igual ao número de rotações simétricas deA
. Finalmente, eu uso olength/2
predicado para definirB
o comprimento deZ
.fonte
JavaScript (ES6),
4241 bytesGuardado 1 byte graças a @ l4m2
Casos de teste
Mostrar snippet de código
fonte
f=s=>s.length/s.match`(.+?)\\1*$`[1].length
Japonês , 7 bytes
Teste online!
Explicação
fonte
PHP, 66 bytes
Experimente online!
PHP, 67 bytes
Experimente online!
fonte
C (gcc) , 59 bytes
Experimente online!
fonte
Haskell , 49 bytes
Experimente online!
Haskell , 49 bytes
Experimente online!
Explicação
Isso usa a solução simples @ 0 'apontada. Como as rotações da corda formam um grupo cíclico, o elemento de ordem mais alta é igual ao tamanho do grupo, portanto, podemos obter a ordem da unidade encontrando o número de rotações simétricas.
Os códigos simple fazem uma lista de compreensão e contam o número de rotações que preservam a string original.
fonte
drop<>take
vez de usar(++)
para salvar 3 bytes, como este .(<>)
não está no prelúdio, na versão do Haskell com a qual trabalho.