En commençant par la chaîne ABC
, considérez le résultat de l'ajout répétitif de la dernière moitié de lui-même (en utilisant la plus grande moitié si la longueur est impaire).
Nous obtenons la progression:
ABC
ABCBC
ABCBCCBC
ABCBCCBCCCBC
ABCBCCBCCCBCBCCCBC
etc...
Laisser S
représenter la chaîne infinie résultante (ou séquence) que les résultats que cette procédure est répétée pour toujours.
Objectif
Le but de ce défi de code est de trouver l'index de la première occurrence de runs de C
's in S
.
C'est facile au début: C
se produit d'abord à l'index 2
, CC
à 4
, CCC
à 7
, CCCC
à 26
, mais CCCCC
est tout au long à l'index 27308
! Après cela, ma mémoire s'épuise.
Le gagnant sera la soumission qui génère correctement les indices les plus exécutés (dans l'ordre, à partir de C
). Vous pouvez utiliser n'importe quel type d'algorithme, mais assurez-vous de l'expliquer si vous n'utilisez pas la force brute de base. L'entrée et la sortie peuvent être dans n'importe quel format facile à comprendre.
Remarque importante: je ne sais pas officiellement si S
contient réellement toutes les séries de C
. Cette question est dérivée de celle-ci sur le Mathematics Stack Exchange , dans laquelle l'auteur n'a pas trouvé non CCCCCC
plus. Je suis curieux de savoir si quelqu'un ici peut. (Cette question est à son tour basée sur ma question initiale sur le sujet .)
Si vous pouvez prouver que tous les runs ne se C
produisent pas, S
vous gagnerez automatiquement car cette question ne sera plus valide. Si personne ne peut le prouver ni le trouver, CCCCCC
le gagnant sera la personne qui peut obtenir la borne inférieure la plus élevée de l'index CCCCCC
(ou quelle que soit la plus grande course non résolue si elle CCCCCC
est trouvée).
Mise à jour: bravo énormes à isaacg et res qui ont trouvé CCCCCC
à l'indice astronomique de 2.124 * 10 ^ 519. À ce rythme, je ne peux pas imaginer trouver CCCCCCC
avec une méthode qui repose sur la force brute. Bon travail les gars!
la source
CCCCC
index 27308, mais plus tard, il semble que vous ne savez pas où cela se produit pour la première fois. Vous vouliez direCCCCCC
?Réponses:
Trouvé à 2,124 * 10 ^ 519.
Indice précis est 2124002227156710537549582070283786072301315855169987260450819829164756027922998360364044010386660076550764749849261595395734745608255162468143483136030403857241667604197146133343367628903022619551535534430377929831860918493875279894519909944379122620704864579366098015086419629439009415947634870592393974557860358412680068086381231577773140182376767811142988329838752964017382641454691037714240414750501535213021638601291385412206075763857490254382670426605045419312312880204888045665938646319068208885093114686859061215
Trouvé par res, en utilisant (l'ancienne version de) le code ci-dessous, après 3,5 heures de recherche.
Autour de cet index, la chaîne est:
...BCCBCBCCCBCCCCCCBCCB...
Pour vérifier, modifiez la ligne indiquée dans le code ci-dessous pour commencer à 2946, au lieu de 5. La vérification prend 20 secondes.
Mise à jour: programme amélioré. L'ancien programme a recherché ~ 10 fois plus d'emplacements que nécessaire.
La nouvelle version trouve le
CCCCCC
en seulement 33 minutes.Comment le code fonctionne: Fondamentalement, je ne regarde que les régions qui correspondent aux extrémités des chaînes incrémentielles, et je calcule les lettres en revenant récursivement à la chaîne d'origine. Notez qu'il utilise une table de mémos, qui peut remplir votre mémoire. Mettez un bouchon sur la longueur de la table mémo si nécessaire.
Courant maximum recherché: 4000 itérations
CCCCCC
trouvé à itération (s): 2946la source
sys.setrecursionlimit(4000)
etULIMIT=4000
, a trouvé (en environ 3,5 heures sur mon système) la première occurrence de CCCCCC à index = 2,124 * 10 ^ 519. L'index exact se trouve dans le commentaire suivant ...Trouvé à 2,124 * 10 ^ 519.
Le code rubis suivant a été utilisé pour la recherche
CCCCCC
.L'index est le même que dans la réponse de @isaacg .
Le temps d'exécution du code ci-dessus pour 6 est de l'ordre de dix secondes sur mon ordinateur. Néanmoins, il est toujours à la recherche d'une réponse
CCCCCCC
(si vous voulez l'essayer vous-même, réglez constantSEARCH
sur7
).Vous pouvez utiliser
getc
pour trouver le caractère à une position spécifiquei
comme cela se fait dans la dernière ligne où la chaîne autour de l'index est imprimée.la source
(Pas une réponse, mais trop long pour un commentaire.)
Ce qui suit est une traduction Python du programme Ruby de @ Howard (accéléré par un facteur proche de 3 en n'en ayant qu'un
getc
dans la boucle de recherche). Sur mon système, cela trouve le premier C ^ 6 en 3 secondes. En 93 heures, il ne trouve aucun C ^ 7 dans 231 000 itérations, donc le premier C ^ 7 (s'il existe) doit se produire après les 10 ^ 40677 positions les plus à gauche dans la chaîne infinie.la source