Períodos locais
Pegue uma string não vazia s . O período local de s no índice i é o menor número inteiro positivo n, de modo que para cada 0 ≤ k <n , temos s [i + k] = s [i-n + k] sempre que ambos os lados são definidos. Como alternativa, é o comprimento mínimo de uma sequência não vazia w, de modo que, se a concatenação ww for colocada ao lado de s, de modo que a segunda cópia de w comece no índice i de s , as duas cadeias concordam onde quer que se sobreponham.
Como exemplo, vamos calcular o período local de s = "abaabbab" no índice 2 (baseado em 0).
- Tente n = 1 : então s [2 + 0] ≠ s [2-1 + 0] , portanto, essa opção não está correta.
- Tente n = 2 : então s [2 + 0] = s [2-2 + 0] mas s [2 + 1] ≠ s [2-2 + 1] , portanto, isso também não está correto.
- Tente n = 3 : em seguida, s [2 + 0-3] não é definida, s [2 + 1] = s [3/2 + 1] e do [2 + 2] = s [2-3 + 2] . Assim, o período local é 3.
Aqui está uma visualização dos períodos locais usando a segunda definição, com ponto-e-vírgula adicionado entre as duas cópias de w para maior clareza:
index a b a a b b a b period
0 a;a 1
1 b a;b a 2
2 a a b;a a b 3
3 a;a 1
4 b b a b a a;b b a b a a 6
5 b;b 1
6 a b b;a b b 3
7 b a;b a 2
Observe que w não é necessariamente uma substring de s . Isso acontece aqui no caso do índice 4.
A tarefa
Sua entrada é uma sequência não vazia s de caracteres ASCII em minúsculas. Pode ser tomado como uma lista de caracteres, se desejado. Sua saída deve ser a lista que contém o período local de s em cada um de seus índices. No exemplo acima, a saída correta seria [1,2,3,1,6,1,3,2] .
A contagem de bytes mais baixa em cada idioma vence. Aplicam-se as regras padrão de código de golfe .
Casos de teste
a -> [1]
hi -> [1, 2]
www -> [1, 1, 1]
xcxccxc -> [1, 2, 2, 5, 1, 3, 2]
abcbacb -> [1, 4, 7, 7, 7, 3, 3]
nininini -> [1, 2, 2, 2, 2, 2, 2, 2]
abaabbab -> [1, 2, 3, 1, 6, 1, 3, 2]
woppwoppw -> [1, 4, 4, 1, 4, 4, 4, 1, 4]
qwertyuiop -> [1, 10, 10, 10, 10, 10, 10, 10, 10, 10]
deededeededede -> [1, 3, 1, 5, 2, 2, 5, 1, 12, 2, 2, 2, 2, 2]
abababcabababcababcabababcaba -> [1, 2, 2, 2, 2, 7, 7, 7, 7, 2, 2, 2, 19, 19, 5, 5, 2, 5, 5, 12, 12, 2, 2, 2, 7, 7, 5, 5, 2]
qwertyuiop
, w será uma versão rotacionada deqwertyuiop
. Veja também o exemplo no índice 4: w não é necessariamente uma substring de s .;
esteja no seu exemplo). Isso acabaria com o principal.Respostas:
Retina ,
8986 bytesExperimente online! Editar: salvou 3 bytes graças a @MartinEnder. Explicação:
Divida a entrada em cada caractere, criando um par de linhas, uma para o prefixo e outra para o sufixo do prefixo.
Execute o restante do script em cada par resultante.
Encontre todas as correspondências sobrepostas e liste os resultados. (Ver abaixo.)
Descarte a partida vazia.
Pegue a duração de cada partida.
Classifique numericamente.
Pegue o menor.
A correspondência funciona dividindo o prefixo e o sufixo em três partes. Há quatro casos válidos a serem considerados:
Portanto, a regex permite apenas que A e C correspondam de um lado de cada vez.
fonte
$&$'
é igual a$<'
e o comprimento da linha de computação é menor com%C`.
. tio.run/##K0otycxLNPz/X49LJeHQNhUb9UPbuPQ14mr0tDUPbdPT1o/…Java 8,
167154152 bytes-2 bytes graças a @ceilingcat .
Experimente online.
Explicação:
fonte
JavaScript (ES6), 84 bytes
Recebe a entrada como uma matriz de caracteres.
Casos de teste
Mostrar snippet de código
fonte
Ruby ,
104102 bytesExperimente online!
Um lambda aceitando uma string e retornando uma matriz.
-2 bytes: trocar pontos de extremidade do intervalo com proteções vinculadas ao índice
Ungolfed:
fonte
Japonês ,
3332 bytesGuardado 1 byte graças a @Shaggy
Teste online!
Explicação
Meu primeiro pensamento foi comparar apenas cada caractere na substring esquerda com o caractere correspondente na substring direita, como na resposta JS. Isso não funcionaria, no entanto, como o método de Japt para obter um caractere apenas passa para o outro extremo da string se o índice for negativo ou muito grande.
Em vez disso, minha solução cria um regex a partir da segunda substring e a testa na primeira substring. Vamos considerar o quinto item no caso de teste
abaabbab
como exemplo:O principal truque é que
^
pode corresponder infinitamente, até que um caractere real seja correspondido. Isso nos permite ignorar qualquer número de caracteres desde o início da regex, garantindo que os demais sejam correspondidos consecutivamente, terminando no final da sequência de teste.Não sei se expliquei isso muito bem; por isso, deixe-me saber se há algo que você queira esclarecer ou qualquer outra coisa que deva ser explicada.
fonte
C (gcc) ,
143142140139128126123 bytes!b&&printf
parab||printf
.for
parênteses do corpo do loop, manipulando oprintf
veiculação.b+=S[i+k]!=S[i-n+k]
parab|=S[i+k]-S[i-n+k]
.l=strlen(S)
condicionar o loop de manipulação de string para quebrar ao atingir o final da string (um byte nulo'\0'
).i-n+k>~0
parai-n>~k
.b||printf("|"),n++
é equivalente an+=b||printf("|")
.Experimente online!
fonte
b||printf("%d,",n)
no interior do for-loop:i,b,k,n,l;f(char*S){for(l=strlen(S),i=-1;++i<l;)for(b=n=1;b;b||printf("%d,",n),n++)for(b=k=0;k<n;k++)i+k<l&i-n+k>=0&&(b+=S[i+k]!=S[i-n+k]);}
140 bytesPython 2 , 115 bytes
Experimente online!
fonte