Périodes locales
Prenez une chaîne non vide s . La période locale de s à l'indice i est le plus petit entier positif n tel que pour chaque 0 ≤ k <n , nous avons s [i + k] = s [i-n + k] chaque fois que les deux côtés sont définis. Alternativement, c'est la longueur minimale d'une chaîne non vide w telle que si la concaténation ww est placée à côté de s de sorte que la deuxième copie de w commence à l'index i de s , alors les deux chaînes s'accordent partout où elles se chevauchent.
À titre d'exemple, calculons la période locale de s = "abaabbab" à l'index 2 (basé sur 0).
- Essayez n = 1 : puis s [2 + 0] ≠ s [2-1 + 0] , donc ce choix n'est pas correct.
- Essayez n = 2 : alors s [2 + 0] = s [2-2 + 0] mais s [2 + 1] ≠ s [2-2 + 1] , ce n'est donc pas correct non plus.
- Essayez n = 3 : alors s [2 + 0-3] n'est pas défini, s [2 + 1] = s [2-3 + 1] et s [2 + 2] = s [2-3 + 2] . La période locale est donc de 3.
Voici une visualisation des périodes locales en utilisant la deuxième définition, avec des points-virgules ajoutés entre les deux copies de w pour plus de clarté:
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
Notez que w n'est pas nécessairement une sous-chaîne de s . Cela se produit ici dans le cas de l'index-4.
La tâche
Votre entrée est une chaîne non vide s de caractères ASCII minuscules. Il peut être considéré comme une liste de caractères si vous le souhaitez. Votre sortie doit être la liste contenant la période locale de s à chacun de ses indices. Dans l'exemple ci-dessus, la sortie correcte serait [1,2,3,1,6,1,3,2] .
Le nombre d'octets le plus bas dans chaque langue gagne. Les règles de code-golf standard s'appliquent.
Cas de test
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 sera une version pivotée deqwertyuiop
. Voir aussi l'exemple à l'index 4: w n'est pas nécessairement une sous-chaîne de s .;
trouve dans votre exemple). Cela permettrait de se débarrasser du premier 1.Réponses:
Rétine ,
8986 octetsEssayez-le en ligne! Edit: sauvé 3 octets grâce à @MartinEnder. Explication:
Divisez l'entrée à chaque caractère, en créant une paire de lignes, une pour le préfixe et une pour le suffixe du préfixe.
Exécutez le reste du script sur chaque paire résultante.
Trouvez toutes les correspondances qui se chevauchent et répertoriez les résultats. (Voir ci-dessous.)
Jeter le match vide.
Prenez la durée de chaque match.
Trier numériquement.
Prenez le plus petit.
La correspondance fonctionne en divisant le préfixe et le suffixe en trois parties. Il y a quatre cas valides à considérer:
Le regex permet donc uniquement à A et C de correspondre d'un côté à la fois.
la source
$&$'
est égal à$<'
et la longueur des lignes de calcul est plus courte avec%C`.
. tio.run/##K0otycxLNPz/X49LJeHQNhUb9UPbuPQ14mr0tDUPbdPT1o/…Java 8,
167154152 octets-2 octets grâce à @ceilingcat .
Essayez-le en ligne.
Explication:
la source
JavaScript (ES6), 84 octets
Prend l'entrée comme un tableau de caractères.
Cas de test
Afficher l'extrait de code
la source
Rubis ,
104102 octetsEssayez-le en ligne!
Un lambda acceptant une chaîne et renvoyant un tableau.
-2 octets: permuter les points de terminaison de plage avec des gardes liés à l'index
Non golfé:
la source
Japt ,
3332 octets1 octet enregistré grâce à @Shaggy
Testez-le en ligne!
Explication
Ma première pensée a été de comparer simplement chaque caractère de la sous-chaîne de gauche avec le caractère correspondant dans la sous-chaîne de droite, comme dans la réponse JS. Cela ne fonctionnerait pas, cependant, car la méthode de Japt pour obtenir un caractère passe simplement à l'autre extrémité de la chaîne si l'index est négatif ou trop grand.
Au lieu de cela, ma solution construit une expression régulière à partir de la deuxième sous-chaîne et la teste sur la première sous-chaîne. Prenons le 5ème élément du cas
abaabbab
de test comme exemple:L'astuce principale est qu'elle
^
peut correspondre à l'infini, jusqu'à ce qu'un personnage réel soit mis en correspondance. Cela nous permet d'ignorer n'importe quel nombre de caractères depuis le début de l'expression régulière, tout en garantissant que les autres sont tous mis en correspondance consécutivement, en terminant à la fin de la chaîne de test.Je ne suis pas sûr d'avoir très bien expliqué cela, alors faites-moi savoir s'il y a quelque chose que vous aimeriez clarifier ou quoi que ce soit qui devrait être expliqué.
la source
C (gcc) ,
143142140139 139128126123 octets!b&&printf
àb||printf
.for
parenthèses du corps de la boucle en jonglant avec leprintf
placement.b+=S[i+k]!=S[i-n+k]
àb|=S[i+k]-S[i-n+k]
.l=strlen(S)
conditionner les deux boucles de gestion des chaînes pour qu'elles se rompent lorsqu'elles atteignent la fin de la chaîne (un octet nul'\0'
).i-n+k>~0
ài-n>~k
.b||printf("|"),n++
est équivalent àn+=b||printf("|")
.Essayez-le en ligne!
la source
b||printf("%d,",n)
insérant la boucle for: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]);}
Python 2 , 115 octets
Essayez-le en ligne!
la source