introduction
La séquence de Gijswijt ( A090822 ) est connue pour être vraiment, VRAIMENT lente. Pour illustrer:
- Les 3 premiers apparaissent dans le 9ème terme (d'accord).
- Les 4 premiers apparaissent au 220ème trimestre (loin, mais faisables).
- Les 5 premiers apparaissent à (approximativement) le 10 ^ (10 ^ 23) ème terme (tout simplement pas).
- Personne ne sait vraiment où sont les 6 premiers ... on soupçonne que c'est au ...
2 ^ (2 ^ (3 ^ (4 ^ 5))) e terme.
Vous pouvez supposer que vous n'aurez pas à traiter avec un nombre à deux chiffres.
La séquence est générée comme suit:
- Le premier terme est 1.
- Chaque terme après cela est la quantité de "blocs" de répétition qui le précède (s'il y a plusieurs "blocs" de répétition, la plus grande quantité de blocs de répétition est utilisée).
Pour clarifier, voici les premiers termes.
1 -> 1, 1
(un bloc répétitif ( 1
), donc le chiffre enregistré est 1
)
1, 1 -> 1, 1, 2
(deux blocs répétitifs ( 1
), donc le chiffre enregistré est 2
)
1, 1, 2 -> 1, 1, 2, 1
(un bloc répétitif ( 2
ou 1, 1, 2
), donc le chiffre enregistré est 1
)
1, 1, 2, 1 -> 1, 1, 2, 1, 1
(vous avez eu l'idée)
1, 1, 2, 1, 1 -> 1, 1, 2, 1, 1, 2
1, 1, 2, 1, 1, 2 -> 1, 1, 2, 1, 1, 2, 2
(deux blocs répétitifs ( 1, 1, 2
), donc le chiffre enregistré est 2
)
Tâche
Votre tâche consiste, comme indiqué dans la question, à générer n chiffres de la séquence de Gijswijt.
Instructions
- L'entrée sera un entier
n
. - Votre code peut sortir les chiffres sous n'importe quelle forme (une liste, plusieurs sorties, etc.).
C'est le code golf, donc le code le plus court en octets l'emporte.
._
fonction et les autres fonctions utiles en Pyth.CJam,
33313027 octetsMerci à Peter Taylor d'avoir économisé 1 octet.
Testez-le ici.
Explication
la source
CJam (
30 29 2724 octets)Démo en ligne
Il s'agit vraiment d'un effort conjoint avec Martin.
e`
Martin utilise intelligemment l'encodage de longueur d'exécution ( ) pour identifier les répétitions.W$
pour simplifier la gestion de la pile$W>+
un boîtier spécial, comme expliqué dans la dissection ci-dessousMa première approche de 30 octets:
Démo en ligne
Dissection
la source
Haskell, 97 octets
La troisième ligne définit une fonction anonyme qui prend un entier et retourne une liste d'entiers. Voyez-le en action.
Explication
La fonction d'assistance
f
construit la séquence à l'envers, en vérifiant récursivement si la séquence précédente commence par un bloc répété.k
est le nombre de répétitions etp
la longueur du bloc.la source
Pyth,
4138 octetsEssayez-le en ligne!
la source
Rétine ,
6660 octetsL'entrée est un entier unaire utilisant
!
comme chiffre (bien que cela puisse être changé en n'importe quel autre caractère non numérique). La sortie est simplement une chaîne de chiffres.Essayez-le en ligne! (Alternativement, pour plus de commodité, voici une version qui prend une entrée décimale. )
À des fins de test, cela peut être accéléré beaucoup avec une petite modification, ce qui permet de tester l'entrée 220 en moins d'une minute:
Essayez-le en ligne! ( Version décimale. )
Si vous souhaitez tester des nombres encore plus grands, il est préférable de simplement lui fournir une entrée massive et de mettre un
:
après l'initiale+
. Cela fera en sorte que Retina imprime la séquence actuelle à chaque fois qu'elle termine le calcul d'un nouveau chiffre (avec tous les chiffres décalés un par un).Explication
La solution consiste en une seule substitution d'expression régulière, qui est appliquée à l'entrée de manière répétée jusqu'à ce que le résultat cesse de changer, ce qui se produit dans ce cas parce que l'expression régulière ne correspond plus. Au
+
début introduit cette boucle. Il1
s'agit d'une limite qui indique à Retina de ne remplacer que la première correspondance (ceci n'est pertinent que pour la toute première itération). À chaque itération, la scène en remplace une!
(à partir de la gauche) par le chiffre suivant de la séquence.Comme d'habitude, si vous avez besoin d'une introduction sur l'équilibrage des groupes, je vous renvoie à ma réponse SO .
Voici une version annotée de l'expression régulière. Notez que l'objectif est de capturer le nombre maximum de blocs répétés en groupe
1
.Enfin, après tout cela, nous réécrivons
$1
(supprimant ainsi le!
) ainsi que le nombre de captures dans le groupe avec$#1
lequel correspond au nombre maximum de répétitions.la source
Rubis, 84 octets
La réponse Retina m'a inspiré à faire une solution basée sur les expressions rationnelles pour trouver la meilleure séquence au lieu de compter les séquences dans un tableau, mais avec moins de génie (les regards négatifs avec des quantificateurs ne semblent pas être autorisés dans Ruby, donc je doute Je pourrais porter la réponse de Retina directement de toute façon)
Étant donné une séquence déjà générée
s
, il mappe touti
de1
às.length
(an
été utilisé dans ce cas pour économiser des octets depuisn>=s.length
) et utilise ensuite cette expression régulière pour aider à calculer le nombre de répétitions d'une sous-séquence de longueuri
:Si une correspondance est trouvée de cette longueur, il calcule le nombre de répétitions en divisant la longueur de la correspondance donnée
$&
pari
la longueur de la sous-séquence; si aucune correspondance n'a été trouvée, elle est traitée comme1
. La fonction recherche ensuite le nombre maximal de répétitions de ce mappage et ajoute ce nombre à la fin de la chaîne.la source