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.



1

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.


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


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

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 .


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.


2

JavaScript (ES6), 42 41 octets

1 octet enregistré grâce à @ l4m2

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

Cas de test


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


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!


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.