Symétrie de rotation de la chaîne

9

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 scomposé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 . La réponse la plus courte en octets gagne. Des échappatoires standard s'appliquent.

Leaky Nun
la source
En relation.
Martin Ender
1
précédemment demandé en tant que CMC: chat.stackexchange.com/transcript/message/37509699#37509699
John Dvorak
Cela revient à trouver le nombre de rotations symétriques inférieures à la taille de la chaîne. Comme le souligne @ 0 ', ils forment un groupe cyclique, donc trouver l'ordre le plus élevé revient à trouver la taille du groupe. Cela rendrait l'explication de la tâche qui est actuellement assez peu claire beaucoup plus claire.
Ad Hoc Garf Hunter

Réponses:

8

Rétine , 15 octets

(^.+?|\1)+$
$#1

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.

Martin Ender
la source
Oh, bien sûr, non-cupide. Et là, je me débattais avec .*(.+)$(?<=^(\1)*)...
Neil
5

Gelée , 3 octets

ṙJċ

Essayez-le en ligne!

Erik le Outgolfer
la source
Toutes nos félicitations!
Leaky Nun
@LeakyNun C'était votre solution, non?
Erik the Outgolfer
En effet, ça l'était.
Leaky Nun
Votre nom est-il une référence Gauntlet?
user2357112 prend en charge Monica
@ user2357112 Non, cela fait référence au pari, c'est-à-dire lorsque vous publiez une solution plus courte qu'une autre solution publiée.
Erik the Outgolfer
3

05AB1E , 8 octets

gGDÀ})QO

Essayez-le en ligne!

Explication

gG  }      # len(input)-1 times do:
  D        # duplicate
   À       # rotate left
     )     # wrap result in a list
      Q    # compare each to input for equality
       O   # sum
Emigna
la source
2

Python, 31 octets

lambda s:len(s)/(s+s).find(s,1)

Trouvez le premier indice non nul de sin s+spour déterminer dans quelle mesure nous devons le faire pivoter pour revenir en sarrière, puis divisez la longueur de spar ce nombre. Basé sur des idées que j'ai vues ailleurs .

user2357112 prend en charge Monica
la source
2

Prolog (SWI) , 64 octets

A+B:-findall(X,(append(X,Y,A),append(Y,X,A)),[_|Z]),length(Z,B).

Essayez-le en ligne!

Définit un prédicat +/2qui 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/3prédicat. Le findall/3prédicat trouve toutes les différentes valeurs possibles pour le premier argument ( Xdans 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 possibles Xsous forme de liste dans l'argument final ( [_|Z]).

L'expression passée en findall/3tant que deuxième arugment, (append(X,Y,A),append(Y,X,A))utilise le append/3prédicat pour spécifier celui Xconcaténé avec certains encore indéfinisY doit être égale à A, la chaîne d'entrée, et que la même Yconcaténation avec Xdoit également être égale à A. Cela signifie qu'il Xdoit y avoir un préfixe Atel que s'il est supprimé de l'avant Aet ajouté à l'arrière, la chaîne résultante est la même que A. L'ensemble de Xs avec cette propriété a presque une correspondance biunivoque avec les rotations symétriques de A. Il y a toujours exactement un cas de double comptage qui est dû au fait que la chaîne vide et Ales préfixes deA qui correspondent à la rotation 0 de A. Depuis la 0rotation deAest toujours symétrique, la longueur de la liste résultante de Xs findall/3sera 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/3pré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 de Zest 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 de A. Enfin, j'utilise le length/2prédicat pour définir Bla longueur de Z.

0 '
la source
2

JavaScript (ES6), 42 41 octets

1 octet enregistré grâce à @ l4m2

s=>s.length/s.match`(.+?)\\1*$`[1].length

Cas de test

Arnauld
la source
f=s=>s.length/s.match`(.+?)\\1*$`[1].length
l4m2
1

Japt , 7 octets

¬x@¥UéY

Testez-le en ligne!

Explication

 ¬ x@   ¥ UéY
 q xXY{ ==UéY}  // Expanded
Uq xXY{U==UéY}  // Variable introduction
                // Implicit: U = input string
Uq              // Split U into chars.
   xXY{      }  // Map each item X and index Y by this function, then sum the results:
       U==UéY   //   Return U equals (U rotated by Y characters).
                // Implicit: output result of last expression
ETHproductions
la source
0

PHP, 66 octets

for(;strtr($a=$argn,[substr($a,0,++$i)=>""]););echo strlen($a)/$i;

Essayez-le en ligne!

PHP, 67 octets

preg_match('#^(.+?)\1*$#',$argn,$t);echo substr_count($argn,$t[1]);

Essayez-le en ligne!

Jörg Hülsermann
la source
0

C (gcc) , 59 octets

-Df(d,s)=for(d=n=strlen(s);n%d|memcmp(s,s+n/d,n-n/d);d--)

n;

Essayez-le en ligne!

l4m2
la source
tio doit être suggéré pour que les drapeaux complices puissent être décidés ajoutés dans la longueur du code
l4m2
0

Haskell , 49 octets

g x=sum[1|a<-[1..length x],drop a x++take a x==x]

Essayez-le en ligne!

Haskell , 49 octets

g x=sum[1|(a,_)<-zip[1..]x,drop a x++take a x==x]

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.

Ad Hoc Garf Hunter
la source
Vous pouvez utiliser drop<>takeau lieu d'utiliser (++)pour enregistrer 3 octets, comme ceci .
ბიმო
@BMO (<>)n'est pas en prélude, dans la version de Haskell avec laquelle je travaille.
Ad Hoc Garf Hunter