Le period
d'une chaîne est le décalage non nul le plus court afin que la chaîne corresponde à elle-même, en ignorant toutes les parties qui dépassent. Ainsi, par exemple, abcabcab
a des règles 3
. Par convention, nous disons que s'il n'y a pas un tel décalage, une chaîne a une période égale à sa longueur. Donc la période de abcde
est 5
et la période de a
est 1
.
En termes plus formels, la période d'une chaîne S
est le minimum i > 0
pour que S[1,n-i] == S[i+1,n]
(indexation à partir de 1
).
Pour une chaîne S donnée de puissance de deux longueurs, nous calculerons la période de tous ses préfixes de puissance de deux longueurs. Par exemple, réfléchissez S = abcabcab
. Les périodes que nous calculerons sont:
'a', 1
'ab', 2
'abca', 3
'abcabcab', 3
Nous allons en fait simplement sortir le tableau des périodes, c'est-à-dire [1, 2, 3, 3]
.
Pour une puissance positive donnée de deux n
, considérez toutes les chaînes binaires possibles S
. Rappelons qu'une chaîne binaire est simplement une chaîne de 1
s et 0
s donc il y a exactement de 2^n
telles chaînes (c'est à dire 2
à la puissance n
). Pour chacun, nous pouvons calculer ce tableau de périodes.
Le défi consiste à écrire du code qui prend
n
(une puissance de deux) en entrée et calcule le nombre de tableaux distincts.
Les réponses pour n = 1, 2, 4, 8, 16, 32, 64, 128
sont:
1, 2, 6, 32, 320, 6025, 216854, 15128807
L'ensemble complet de tableaux de périodes distincts pour n = 4
est:
1, 1, 1
1, 1, 3
1, 1, 4
1, 2, 2
1, 2, 3
1, 2, 4
But
Je vais exécuter votre code sur mon ordinateur exécutant Ubuntu pendant 10 minutes. Votre score est le plus élevé n
pour lequel votre code se termine pendant cette période. Dans le cas d'une égalité, la réponse qui complète le plus grand n
gain conjoint le plus rapide. Dans le cas où il y a égalité en moins d'une seconde sur le chronométrage, la première réponse publiée l'emporte.
Langues et bibliothèques
Vous pouvez utiliser toutes les langues et bibliothèques disponibles que vous aimez. Veuillez inclure une explication complète sur la façon d'exécuter / compiler votre code sous Linux si possible. »
Votre code doit en fait calculer les réponses et non pas, par exemple, simplement afficher des valeurs précalculées.
Entrées principales
- 2 minutes et 21 secondes pour n = 128 en C # par Peter Taylor
- 9 secondes pour n = 32 en rouille par isaacg
n
, l'accepteriez-vous? Il n'est pas bien défini où se situe la frontière entre le codage en dur et l'informatique réelle.
abcab
. Tout sauf les 3 dernières lettres est abcab
. Celles-ci correspondent et la suppression d'un plus petit nombre de lettres ne correspond pas.