Simetria rotacional da corda

9

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 sconsiste apenas em letras de aaté 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 é . A resposta mais curta em bytes vence. Aplicam-se brechas padrão .

Freira Furada
fonte
Relacionado.
Martin Ender
11
anteriormente solicitado como CMC: chat.stackexchange.com/transcript/message/37509699#37509699
John Dvorak
É o mesmo que encontrar o número de rotações simétricas menores que o tamanho da sequência. Como @ 0 'aponta, eles formam um grupo cíclico, portanto, encontrar a ordem mais alta é o mesmo que encontrar o tamanho do grupo. Isso tornaria a explicação da tarefa que atualmente é bastante pouco clara muito mais clara.
Ad Hoc Garf Hunter

Respostas:

8

Retina , 15 bytes

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

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.

Martin Ender
fonte
Ah, claro, sem graça. E aqui estava eu ​​lutando com .*(.+)$(?<=^(\1)*)...
Neil
5

Gelatina , 3 bytes

ṙJċ

Experimente online!

Erik, o Outgolfer
fonte
Parabéns!
Leaky Nun
@LeakyNun Essa foi a sua solução, certo?
Erik the Outgolfer
De fato era.
Leaky Nun
O seu nome é uma referência ao Gauntlet?
User2357112 suporta Monica
@ user2357112 Não, refere-se à exclusão, ou seja, quando você publica uma solução mais curta que outra solução publicada.
Erik the Outgolfer
3

05AB1E , 8 bytes

gGDÀ})QO

Experimente online!

Explicação

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
fonte
2

Python, 31 bytes

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

Encontre o primeiro índice diferente de zero de sin s+spara descobrir até que ponto precisamos girá-lo para svoltar e divida o comprimento spor esse número. Baseado em idéias que vi em outro lugar .

user2357112 suporta Monica
fonte
2

Prolog (SWI) , 64 bytes

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

Experimente online!

Define um predicado +/2que 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/3predicado. O findall/3predicado encontra todos os diferentes valores possíveis para o primeiro argumento ( Xneste 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íveis Xcomo uma lista no argumento final ( [_|Z]).

A expressão transmitida findall/3como a segunda versão, (append(X,Y,A),append(Y,X,A))usa o append/3predicado para especificar que Xconcatenado com alguns ainda não definidos Ydeve ser igual a A, a sequência de entrada e que o mesmo Yconcatenado Xtambém deve ser igual a A. Isso significa que Xdeve haver algum prefixo para Aque, se for removido da frente Ae adicionado à parte traseira, a sequência resultante seja a mesma que A. O conjunto de Xs com essa propriedade tem quase uma correspondência individual com as rotações simétricas de A. Sempre há exatamente um caso de contagem dupla causado pelo fato de que a cadeia vazia e Aos prefixos deAque correspondem à rotação 0 de A. Como a 0rotação de Aé sempre simétrica, o comprimento da lista resultante de Xs findall/3será um maior que o número de rotações simétricas ativadas A.

Para resolver o problema da contagem dupla, utilizo a correspondência de padrões no terceiro argumento do findall/3predicado. 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 a Z. Isso significa que o comprimento de Zé um menor que o número de prefixos encontrados pelo findall/3predicado e, portanto, igual ao número de rotações simétricas de A. Finalmente, eu uso o length/2predicado para definir Bo comprimento de Z.

0 '
fonte
2

JavaScript (ES6), 42 41 bytes

Guardado 1 byte graças a @ l4m2

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

Casos de teste

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

Japonês , 7 bytes

¬x@¥UéY

Teste online!

Explicação

 ¬ 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
fonte
0

PHP, 66 bytes

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

Experimente online!

PHP, 67 bytes

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

Experimente online!

Jörg Hülsermann
fonte
0

C (gcc) , 59 bytes

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

n;

Experimente online!

l4m2
fonte
A sugestão deve ser sugerida para que os sinalizadores de conformidade possam ser decididos adicionados ao comprimento do código
l4m2
0

Haskell , 49 bytes

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

Experimente online!

Haskell , 49 bytes

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

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.

Caçador Ad Hoc Garf
fonte
Você pode usar em drop<>takevez de usar (++)para salvar 3 bytes, como este .
ბიმო
O @BMO (<>)não está no prelúdio, na versão do Haskell com a qual trabalho.
Ad Hoc Garf Hunter