Une rotation "se fait en coupant une corde en deux morceaux et en inversant leur ordre" . Un objet est symétrique sous une opération si l'objet est inchangé après l'application de ladite opération. Ainsi, une "symétrie de rotation" est le fait qu'une chaîne reste inchangée après la "rotation".
Étant donné une chaîne non vide s
composée uniquement de lettres de a
à z
, affichez l'ordre le plus élevé de la symétrie de rotation de la chaîne.
Testcases:
input output
a 1
abcd 1
abab 2
dfdfdfdfdfdf 6
C'est du code-golf . La réponse la plus courte en octets gagne. Des échappatoires standard s'appliquent.
code-golf
string
abstract-algebra
Leaky Nun
la source
la source
Réponses:
Rétine , 15 octets
Essayez-le en ligne!
Correspond à la chaîne entière en répétant une sous-chaîne (les sous-chaînes plus courtes sont priorisées en raison de la non-légalité
.+?
) et remplace la chaîne entière par le nombre de répétitions que nous avons utilisées.la source
.*(.+)$(?<=^(\1)*)
...Gelée , 3 octets
Essayez-le en ligne!
la source
05AB1E , 8 octets
Essayez-le en ligne!
Explication
la source
Python, 31 octets
Trouvez le premier indice non nul de
s
ins+s
pour déterminer dans quelle mesure nous devons le faire pivoter pour revenir ens
arrière, puis divisez la longueur des
par ce nombre. Basé sur des idées que j'ai vues ailleurs .la source
Prolog (SWI) , 64 octets
Essayez-le en ligne!
Définit un prédicat
+/2
qui prend une chaîne (sous la forme d'une liste de codes de caractères) comme premier argument (A
) et définit son deuxième argument (B
) à l'ordre de la rotation symétrique d'ordre le plus élevé.Explication
Ce programme utilise le fait que l'ensemble des rotations symétriques sur une chaîne est un groupe cyclique et donc l'ordre de l'ensemble des rotations symétriques est égal à l'ordre de la rotation symétrique d'ordre le plus élevé. Ainsi, le programme est capable de calculer le résultat souhaité en trouvant le nombre total de rotations symétriques sur la chaîne d'entrée.
Explication du code
La majorité du levage lourd se fait par un appel au
findall/3
prédicat. Lefindall/3
prédicat trouve toutes les différentes valeurs possibles pour le premier argument (X
dans ce cas) de telle sorte que l'expression donnée comme deuxième argument soit vraie ((append(X,Y,A),append(Y,X,A))
, plus à ce sujet plus tard). Enfin, il stocke chacune de ces valeurs possiblesX
sous forme de liste dans l'argument final ([_|Z]
).L'expression passée en
findall/3
tant que deuxième arugment,(append(X,Y,A),append(Y,X,A))
utilise leappend/3
prédicat pour spécifier celuiX
concaténé avec certains encore indéfinisY
doit être égale àA
, la chaîne d'entrée, et que la mêmeY
concaténation avecX
doit également être égale àA
. Cela signifie qu'ilX
doit y avoir un préfixeA
tel que s'il est supprimé de l'avantA
et ajouté à l'arrière, la chaîne résultante est la même queA
. L'ensemble deX
s avec cette propriété a presque une correspondance biunivoque avec les rotations symétriques deA
. Il y a toujours exactement un cas de double comptage qui est dû au fait que la chaîne vide etA
les préfixes deA
qui correspondent à la rotation 0 deA
. Depuis la0
rotation deA
est toujours symétrique, la longueur de la liste résultante deX
sfindall/3
sera supérieure de un au nombre de rotations symétriques surA
.Pour résoudre le problème du double comptage, j'utilise la correspondance de motifs sur le troisième argument du
findall/3
prédicat. Dans Prolog, les listes sont représentées par des paires de leur tête (le premier élément) et de leur queue (le reste). Ainsi ,[_|Z]
représente une liste dont la queue est égale est égale àZ
. Cela signifie que la longueur deZ
est inférieure de un au nombre de préfixes trouvés par lefindall/3
prédicat et donc égale au nombre de rotations symétriques deA
. Enfin, j'utilise lelength/2
prédicat pour définirB
la longueur deZ
.la source
JavaScript (ES6),
4241 octets1 octet enregistré grâce à @ l4m2
Cas de test
Afficher l'extrait de code
la source
f=s=>s.length/s.match`(.+?)\\1*$`[1].length
Japt , 7 octets
Testez-le en ligne!
Explication
la source
PHP, 66 octets
Essayez-le en ligne!
PHP, 67 octets
Essayez-le en ligne!
la source
C (gcc) , 59 octets
Essayez-le en ligne!
la source
Haskell , 49 octets
Essayez-le en ligne!
Haskell , 49 octets
Essayez-le en ligne!
Explication
Cela utilise la solution simple @ 0 'indiquée. Puisque les rotations de la chaîne forment un groupe cyclique, l'élément d'ordre le plus élevé est le même que la taille du groupe, nous pouvons donc obtenir l'ordre de l'unité en trouvant le nombre de rotations symétriques.
Le code simple fait une liste de compréhension et compte le nombre de rotations qui préservent la chaîne d'origine.
la source
drop<>take
au lieu d'utiliser(++)
pour enregistrer 3 octets, comme ceci .(<>)
n'est pas en prélude, dans la version de Haskell avec laquelle je travaille.