Il s’agit là d’un nouveau défi , qui vise à adapter les exigences d’E / S à nos normes récentes. Ceci est fait dans le but de permettre à plus de langues de participer à un défi concernant cette séquence populaire. Voir ce méta post pour une discussion de la rediffusion.
La séquence de Kolakoski est une séquence amusante auto-référentielle, qui a l'honneur d'être la séquence OEIS A000002 (et beaucoup plus facile à comprendre et à mettre en œuvre que A000001). La séquence commence par 1 , consiste uniquement en 1 s et 2 s et l'élément de séquence a (n) décrit la longueur du n- ième passage de 1 s ou 2 s dans la séquence. Ceci définit de manière unique la séquence à être (avec une visualisation des parcours en dessous):
1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,2,1,1,2,...
= === === = = === = === === = === === = = === = = === === = === =
1, 2, 2, 1,1, 2, 1, 2, 2, 1, 2, 2, 1,1, 2, 1,1, 2, 2, 1, 2, 1,...
Votre tâche consiste bien entendu à mettre en œuvre cette séquence. Vous pouvez choisir l’un des trois formats suivants:
- Prenez une entrée n et sortez le n- ième terme de la séquence, n commençant à 0 ou à 1 .
- Prendre une entrée n et délivrer en sortie les termes jusqu'à et y compris le n ième terme de la séquence, où n commence soit de 0 ou 1 ( à savoir , soit imprimer la première n ou le premier n + 1 termes).
- Afficher les valeurs de la séquence indéfiniment.
Dans les deuxième et troisième cas, vous pouvez choisir n’importe quel format de liste raisonnable et non ambigu. C'est bien s'il n'y a pas de séparateur entre les éléments, car ils sont toujours un seul chiffre par définition.
Dans le troisième cas, si votre soumission est une fonction, vous pouvez également renvoyer une liste infinie ou un générateur dans les langues qui les prennent en charge.
Vous pouvez écrire un programme ou une fonction et utiliser n’importe laquelle de nos méthodes standard de réception d’entrée et de sortie. Notez que ces failles sont interdites par défaut.
C'est du code-golf , donc la réponse valide la plus courte - mesurée en octets - est gagnante.
Réponses:
Gelée , 7 octets
C'est un programme complet qui imprime les n premiers termes.
Essayez-le en ligne!
Comment ça fonctionne
Exemple d'exécution
Soit n = 5 .
La première invocation de la chaîne se répète 1, 2 de manière cyclique pour atteindre la longueur 5 , puis chaque élément 5 fois, et finalement tronque le résultat à la longueur 5 .
Cela donne une liste de longueur 5 . Le premier élément est le premier élément de la séquence de Kolakoski.
La deuxième invocation de la chaîne se répète 1, 2 de manière cyclique pour atteindre la longueur 5 , puis répète le k ème élément j fois, où j est le k ème élément de la liste précédente et tronque finalement le résultat à la longueur 5 .
Cela donne une autre liste de longueur 5 . Les deux premiers éléments sont les deux premiers éléments de la séquence de Kolakoski.
Le processus se poursuit pendant trois autres itérations.
Ce sont les cinq premiers éléments de la séquence de Kolakoski.
la source
Python 2 , 51 octets
Imprime indéfiniment. Construit la liste au
l
fur et à mesure de son itération. Pour chaque entréex
del
, ajoute desx
copies de1
ou2
, selon ce qui est opposé au dernier élément actuel.La principale difficulté concerne le fragment auto-référentiel initial
[1,2,2]
. Ce code n'imprime que l'initiale1,2
et procède de là. L'impression supplémentaire coûte 12 octets. Sans ça:39 octets , deux premières entrées manquantes:
Une autre approche consiste à initialiser spécialement les deux premières entrées. Nous initialisons
l
de[0,0,2]
manière à ce que les deux premières entrées ne provoquent pas d’ajout, maisprint x or n
soient imprimées commen
.51 octets
Une autre solution consiste à initialiser
l=[1]
, suivre l’alternance manuellementn
et corriger l’impression:51 octets
Sans le
(l==[1,1])+
, tout fonctionne sauf les séquences imprimées qui commencent1,1,2
au lieu de1,2,2
. Il doit y avoir un meilleur moyen de reconnaître que nous en sommes à la deuxième étape.Et un autre correctif étrange, également le même nombre d'octets:
51 octets
la source
Wumpus ,
13 à11 octetsEssayez-le en ligne!
Imprime la séquence indéfiniment sans séparateurs.
Je suis vraiment surpris par la brièveté de la situation.
Explication
L'idée de base est de conserver la séquence sur la pile et d'utiliser à plusieurs reprises l'élément le plus en bas pour générer une autre exécution, puis l'imprimer. Nous abusons effectivement de la pile comme une file d'attente ici. Nous pouvons également enregistrer quelques octets en travaillant
0
et1
(en incrémentant uniquement pour la sortie) au lieu de1
et2
, car nous n'avons ainsi pas besoin d'initialiser explicitement la pile avec un1
et nous pouvons utiliser la négation logique pour basculer entre les deux valeurs.la source
Brachylog ,
30 26 25 23 17 1614 octetsAffiche les n premières valeurs. Utilise la "variable de sortie"
.
pour l'entrée et génère la "variable d'entrée"?
. Essayez-le en ligne!Explication
Je suis assez satisfait du résultat déclaratif: le programme est en gros une description de haut niveau de la liste de sortie et de sa relation avec l'entrée.
Étant donné
{1|2}ᵐ
que les listes d'essais sont répertoriées dans l'ordre lexicographique, la sortie commence par 1.la source
Coque , 10 octets
Retourne les n premières valeurs. Essayez-le en ligne!
Explication
Pour l'entrée 20, le processus se déroule comme suit:
la source
Java 10,
15510810510097 octetsImprime indéfiniment sans délimiteur.
-3 octets après un conseil indirect de @Neil .
-5 octets grâce à @MartinEnder .
-3 octets convertissant Java 8 en Java 10.
Explication:
Essayez-le en ligne (expire après 60 secondes sur TIO).
la source
[1,2,2]
et à partir de là) et j'ai écrit la réponse de 155 octets (qui est maintenant jouée au golf en utilisant un String au lieu de la liste).(3-i)
au lieu de(1+i%2)
?i
n'est pas 1 ou 2, c'est l'index de chaîne.Gelée , 10 octets
Retourne le n ème terme.
Essayez-le en ligne!
Comment ça fonctionne
la source
Haskell , 33 octets
Essayez-le en ligne!
Ørjan Johansen a économisé 7 octets en utilisant un motif irréfutable pour forcer le préfixe.
la source
n:
au début de l’expression, vous n’avez pas besoin de savoirx
s’il existe pour produire la premièren
. Mais il faut que le modèle soit paresseux pour éviter que la fonction ne le vérifie avant d’arriver àn:
.Gol> <> ,
87 octetsEssayez-le en ligne!
Explication
Ceci est un port de ma réponse Wumpus . Gol> <> est fondamentalement le langage qui possède toutes les fonctionnalités nécessaires pour porter la réponse Wumpus (spécifiquement, des zéros implicites au bas de la pile, "dupliqué" implémenté "Pop, push, push" et une commande de rotation de pile), mais :
00.
pour revenir au début.K
, qui est "pop N, puis dupliquer le prochain élément N fois", qui peut remplacer?=
, en sauvegardant un autre octet.Ainsi, la cartographie de Wumpus à Gol> <> devient:
la source
Shakespeare Programming Language ,
594 583572 octetsMerci à Ed Wynn pour -10 octets!
Essayez-le en ligne!
Il s’agit d’une version de la solution ungolfée d’ Ed Wynn qui a débuté à partir de la solution de 828 octets qu’il a liée dans les commentaires pour ensuite devenir un peu cinglée.
Explication:
la source
> <> ,
1312 octetsEssayez-le en ligne!
Une réponse du port Wumpus de Martin Ender . Malheureusement, il
><>
n’ya pas de commande d’incrémentation ou d’inversion ni de 0 implicite au bas de la pile, ce qui le rend un peu plus long.la source
JavaScript,
67666058525150 octetsEh bien, mon cerveau me démangeait plus qu'il ne l'aurait dû! Retire le thème
n
terme, indexé par 0.5 + 1 octets sauvés grâce à tsh grattant mon cerveau qui pique!
Essaye-le
L'extrait ci-dessous affichera les 50 premiers termes.
Afficher l'extrait de code
Explication
C’est l’une des rares occasions où nous pouvons déclarer certaines variables en dehors du champ de notre fonction, les modifier au sein de la fonction et pouvoir toujours les réutiliser lors d’appels ultérieurs de la fonction.
la source
n=>(g=s=>s[n]||g(s+(++x%2+1)*(10*s[x]-9)))('122',x=1)
s='122',x=1,g=n=>s[n]||g(n,s+=(++x%2+1)*(10*s[x]-9))
considéré comme une soumission valide?s[n]||
était un cas clair de ne pas voir le bois pour les arbres! Votre deuxième suggestion ne serait toutefois pas valable, car la fonction ne pourrait être appelée qu'une fois;s
&x
besoin d'être initialisé à chaque appel.s
etx
pas touché par d' autres codes entre chaque invoque (qui est par défaut).s[x]+0-9
est un joli tourPython (2 et 3),
65 à60 octetsRenvoie la n ième entrée, 0-indexé.
Alternative (65 octets):
la source
[1,2,2]
comme valeur de départ dans lasum
Haskell , 48 octets
-1 octet grâce à nimi. -2 octets grâce à Lynn.
Essayez-le en ligne!
Répétez chaque élément sa position mod 2 + 1 fois.
la source
c=1:2:c
brainfuck , 61 octets
Essayez-le en ligne!
Imprime les nombres comme codes de caractères indéfiniment. Pour plus de clarté, voici une version imprimée en chiffres (à l’exception des deux premiers éléments, qui sont assez faciles à vérifier).
Comment ça fonctionne:
la source
05AB1E ,
12 à9 octets3 octets sauvés grâce à Grimy
Imprime les n premiers éléments.
Essayez-le en ligne!
Explication
la source
2L[2LÞsÅΓ
.∞[2LÞsÅΓ
.Δ2LÞsÅΓI∍
pour une version qui imprime les n premiers éléments avec l'entrée n.05AB1E , 15 octets
Essayez-le en ligne! ou avec une limite d'itération
Explication
la source
¸«
,=
les imprimerait pour 2 octets enregistrés.ƵLS[NÌ©èF®É>=
, pas besoin de duper si vous ne consommez pas.Python 3 ,
5554 octetsEssayez-le en ligne!
la source
J , 12 octets
Fonction à un seul argument prenant n et produisant les n premiers termes. Essayez-le en ligne!
Je viens d’améliorer ma vieille réponse à la vieille question.
I.
est un verbe qui prend un tableau de nombres et crée une liste d’index, de sorte que si le k- ème élément du tableau est n , l’indice k apparaît n fois. Nous allons l'utiliser pour amorcer la séquence de Kolakowski à partir d'une graine initiale. Chaque étape se déroulera comme suit:Si nous effectuons cette opération (
1+2|I.
) encore et encore à partir de 10, cela ressemble à ceci:Remarquez comment nous obtenons de plus en plus de termes corrects, et après un certain temps, les n premiers termes sont corrigés. Il est difficile de décrire avec précision le nombre d'itérations nécessaires pour s'installer, mais il semble être approximativement logarithmique en n , donc si nous l'exécutons n fois (
^:]
), tout devrait bien se passer. (Consultez ces autres séquences OEIS pour plus d'informations: longueurs de génération , sommes partielles .)Une fois cela fait, tout ce que nous avons à faire est d’utiliser les n premiers termes
$
. La construction$v
de n'importe quel verbev
est un exemple de crochet, et le donnern
comme argument s'exécuteran $ (v n)
.Voici l'ancienne version 13 octets qui est beaucoup moins de gaspillage de temps et de l' espace:
($1+2|I.)^:_~
. Elle tronque l'entrée à chaque étape, ce qui permet d'exécuter autant de fois que nécessaire pour régler, au lieu de procéder de manière linéaire plusieurs fois.la source
I.
. J'ai toujours voulu voir la fonctionnalité de copie utilisée dans certains golfs.Fueue , 30 octets
Fueue est un esolang basé sur une file d'attente dans lequel le programme en cours et ses données sont tous deux dans la même file d'attente. L'exécution s'effectue tour à tour par la file d'attente et la programmation nécessite beaucoup de synchronisation pour empêcher toute exécution au mauvais moment.
Essayez-le en ligne!
Ce qui précède imprime une liste interminable de chiffres sous forme de codes de contrôle. Pour 34 octets, il peut imprimer les chiffres réels:
Essayez-le en ligne!
Le reste de l'explication utilise la dernière version.
Résumé des éléments de la Fueue
La file d'attente Fueue peut contenir les types d'éléments suivants:
)
fonction ne les débloque , et~
(permuter deux éléments suivants),:
(dupliquer l’élément suivant) et)
(débloquer le bloc suivant).Vue d'ensemble de haut niveau
Pendant la boucle principale du programme, la file d'attente est composée de:
[49]
et[50:]
, respectivement.Trace de bas niveau des 10 premières commandes
Procédure pas à pas d'une itération de boucle principale complète
Un espace facultatif a été inséré pour séparer les commandes.
Cycle 1:
49
impressions1
.)
est inactif, en attente d'être rapproché du bloc de la boucle principale.50
impressions2
.:
duplique le bloc de boucle principal (qui nécessite une copie pour l'auto-réplication).Cycle 2:
)
débloque le premier bloc de la boucle principale pour qu’il commence à exécuter le cycle suivant.Cycle 3:
[50:]
représente le premier chiffre produit dans la chaîne,2
non débloqué. Ce qui suit)
finira par le faire après que le reste de la boucle principale l'aura parcourue.~)~:~
est un golfé (en utilisant un échange et une copie) un délai d’un cycle de~)~~
.[[49]:~))~:~~]
est inactif.~
permute le bloc de boucle principale suivant au-delà du[50:]
bloc de chiffres.Cycle 4:
)
attend encore,~)~
produit~)
,~
swaps[[49]:~))~:~~]
passé le[50:]
bloc de chiffres.Cycle 5:
~
swaps)
passé le[50:]
bloc de chiffres.Cycle 6: Le premier
)
débloque maintenant le[50:]
bloc de chiffres, le suivant)
débloque le sous-programme[[49]:~))~:~~]
.Cycle 7:
50
imprime2
,:
duplique le[49]
bloc de chiffres qui vient d'être produit , créant ainsi une série de deux1
secondes.:~))~:~
est un délai d'un cycle de~~))~:
.~
permute le bloc de boucle principale restant après le premier[49]
.Cycle 8:
~~))
est un délai d'un cycle de)~)
.~
swaps:
passé l'heure actuelle traversée[49]
.Cycle 9:
~
swaps)
passé[49]
.:
duplique le bloc de la boucle principale.Cycle 10: Le premier
)
débloque le[49]
bloc de chiffres qui vient d’être traversé, le second)
redémarre la boucle principale pour parcourir la suivante (voir ci-dessus au début de la file d’attente).la source
x86,
4137353328 octetsJ'ai eu beaucoup de plaisir à déconner avec différentes instructions x86, car il s'agit de ma première réponse x86 "non triviale". En fait, j’ai d’abord appris les x86-64 et j’ai économisé de nombreux octets en convertissant mon programme au format 32 bits.
Il s’avère que l’algorithme que j’ai utilisé chez OEIS pousse les valeurs dans un tableau, ce qui le rend disponible pour x86 et le stockage des valeurs sur la pile (notez que MIPS n’a pas d’instructions de pile).
Actuellement, le programme prend des
N
valeurs en entréeecx
et renvoie une adresse dansebp
un tableau avec le nième élément représentant la nième valeur de la séquence. Je suppose que le retour sur la pile et le calcul des valeurs supplémentaires sont valables (nous considérons quand même ce qui est au-delà du tableau comme une ordure).Changelog
-4 octets en calculant
x = 2 - n%2
àxor
chaque itération-2 octets en utilisant la boucle do-while au lieu de while.
-2 octets en poussant les valeurs initiales 1, 2, 2 en utilisant
eax
-5 octets en ne stockant pas
n
explicitement mais en exécutant desN
temps de boucleObjdump:
la source
C (gcc) ,
7271656462 octets-9 octets grâce à @ceilingcat
Essayez-le en ligne!
Génère des valeurs de la séquence indéfiniment (option 3 du challenge)
la source
for($x=$y=-1;;$y=$y+1|$f&.5*$x^=$f=$y&-$y-2)echo$x&1?:2;
. 2)50-x%2
devrait économiser un octet pour vous. 3) j'ai essayé de le faire fonctionner avecx=y=1
; mais ne pouvait pas obtenir les opérations à ce jour. Peut tu?Perl 5 , 36 octets
Encore une modification triviale de la solution classique TPR (0,3):
Affiche les séries de
0
àn
Essayez-le en ligne!
la source
Javascript ES6 -
717068 octets1 bit sauvé grâce à Neil
Tanks to Shaggy pour avoir corrigé mon erreur, également pour avoir économisé 1 bit.
la source
x=0
lieu dex=1
), mais @Shaggy a effectivement raison: cela ne fonctionne pas dans sa forme actuelle (j'ai ajouté,i=100;i-->0
temporairement le pour voir les 100 premiers éléments, au lieu de devoir attendez 60 secondes avant de voir une sortie). Aucune idée pourquoi cela ne fonctionne pas, cependant. JS n'est pas mon truc.1.
initialiserx
à 0 au lieu de 1 (comme l'a mentionné @KevinCruijssen) et2.
vérifier si lex
caractère de la chaîne, qui ne peut jamais être que 1 ou 2, est supérieur à 49.(_[x]*10-9)
que(_[x]>1?11:1)
Appleseed , 89 octets
Définit une fonction
K
qui ne prend aucun argument et retourne la séquence de Kolakoski sous forme de liste infinie.Essayez-le en ligne!Cette approche a été inspirée par la réponse de Haskell de totalementhuman . Mon approche originale était plus longue et était probablement O (2 ^ n). : ^ P
Ungolfed
La liste de retour commence par
(1 2)
. Après cela, pour générer le reste (en lisant de l'intérieur):(kolakoski)
pour obtenir la liste de séquences de Kolakoski (en raison d'une évaluation paresseuse, peu importe que la liste n'ait pas encore été générée)(cycle (list 1 2))
crée une liste infinie(1 2 1 2 1 2 ...)
repeat-val
. Cela répétera le1
ou2
de lacycle
liste une ou deux fois en fonction de la valeur associée dans la liste Kolakoski. Résultat:((1) (2 2) (1 1) ...)
flatten
cette liste dans(1 2 2 1 1 ...)
(concat (list 1 2)
, donc nous avonsdrop
les deux premiers de la liste générée pour éviter les doublons.la source
Stax , 12 octets
Exécuter et déboguer
Ceci est la représentation ascii du même programme.
Il étend la séquence x fois, où x est l'entrée. Ensuite, il sort le xième élément, indexé par 0.
Voici une solution bonus de 12 octets qui produit une sortie sous forme de flux infini. Appuyez sur Run pour commencer.
la source
R, 63 octets ou 61 octets
Mise en œuvre 1: imprime le n ième terme de la séquence.
Mise en œuvre 2: affiche les n premiers termes de la séquence.
(La différence est seulement dans la dernière ligne.)
Oui, oui, vous pouvez vous plaindre que ma solution est inefficace, qu'elle calcule vraiment plus de termes que nécessaire, mais quand même ...
Mise à jour: Merci à @Giuseppe pour avoir réduit de 9 octets.
la source
a=c(a,rep(2-n%%2,a[n]))
place de la deuxièmefor
boucle pour supprimer quelques octets.Shakespeare Programming Language, 575 octets (mais défectueux) ou 653 ou 623 octets
Dans la catégorie SPL, très disputée, cela battrait l'entrée actuelle de Jo King (583 octets), sauf qu'elle est défectueuse: tout d'abord, elle ne fonctionne pas dans la version TIO (implémentation du site Web SPL) - mais elle fonctionne dans le Perl version , alors peut-être que ce n'est pas un défaut grave. Deuxièmement, les deux premiers chiffres ne sont pas imprimés. Si nous admettions ce défaut dans la solution de Jo King, cette solution défectueuse aurait une longueur de 553 octets, ce qui est supérieur à ma solution défectueuse.
Ma solution échoue sous TIO pour deux raisons: nous essayons de nous baser sur une pile vide qui renvoie zéro quand elle est sautée; et nous passons à la première scène, avec "[Enter Ford and Puck]" même si personne n’a quitté la scène. Ce ne sont que des avertissements dans la version Perl. Si je corrige ces erreurs et que je mets les deux premiers chiffres, j'atteins 653 octets:
Essayez-le en ligne!
Je peux générer la séquence complète dans l'implémentation Perl en utilisant 623 octets:
Toutefois, je tiens à souligner que cette solution est rapide comparée à de nombreuses autres solutions et utilise des quantités logarithmiques de mémoire plutôt que de stocker la liste complète. (Ceci est similaire à la solution C de vazt, à laquelle elle est liée de manière lointaine.) Cela ne fait aucune différence pour le golf, mais j'en suis néanmoins satisfait. Vous pouvez générer un million de chiffres en une minute environ en Perl (par exemple, si vous passez à sed et wc pour obtenir un nombre de chiffres), l'autre solution pouvant vous donner quelques milliers de chiffres.
Explication
Nous stockons une séquence de variables dans l'ordre: pile de Puck (de bas en haut), valeur de Puck, valeur de Ford, pile de Ford (de haut en bas). Hormis les valeurs zéro aux extrémités (le zéro à gauche pouvant provenir d'une pile vide), chaque valeur est le chiffre généré à la génération suivante, suivi de 2 si la génération suivante a besoin d'un autre enfant de ce parent. Lorsque nous avons N valeurs non nulles dans la séquence, nous générons tous les enfants jusqu'à la N-ième génération incluse, dans une sorte de parcours d'arbre en profondeur d'abord. Nous imprimons des valeurs uniquement de la N-ième génération. Lorsque la N-ième génération est complètement générée, les valeurs stockées sont en fait les valeurs de départ pour les générations 2 à (N + 1). Nous ajoutons donc un 2 à gauche et recommençons, générant cette fois le (N + 1). ) -th génération.
Donc, un aperçu: Scène X: Quand nous arrivons ici, c’est le début d’un nouveau parcours. Rondelle == 0. Nous mettons éventuellement ce zéro sur la pile de Puck et fixons Puck = 2. Scène L: Si Ford == 0, nous avons atteint la génération d’impression. Sinon, allez à V. Pour l'impression, si 2 ont été ajoutés à la valeur de Puck, supprimez-les et imprimez-les deux fois; sinon, imprimez-le une fois. Scène M: Il s’agit d’une boucle dans laquelle nous basculons à plusieurs reprises sur la valeur de Puck et remontons dans la séquence. On répète jusqu'à atteindre la fin (Puck == 0), auquel cas on passe à X, ou on atteint une valeur qui nécessite un autre enfant (Puck> 2), auquel cas on soustrait le supplément de 2 et on avance dans V. Scène V: Ici nous allons en avant. Si Puck vaut 2 ou 4, la génération suivante contiendra deux enfants du parent actuel, donc Ford + = 2. Avancez dans la séquence. Allez à L pour vérifier la terminaison.
la source
axo , 13 octets
Essayez-le en ligne!
Explication
Cela a commencé comme port d'une solution alternative dans ma réponse à Wumpus :
Cela a abouti à 18 octets. J'ai fini par jouer aux 13 octets que vous voyez ci-dessus pour l'adapter davantage au fonctionnement d'axo. Cette version à 13 octets a finalement inspiré l'amélioration de Wumpus jusqu'à 11 octets, elle est donc maintenant plus proche de cette version.
Comme dans Wumpus, dans l'itération i , le bas de la pile contient un (i) -1 et le haut, le premier élément de la i ème exécution, mais nous travaillons toujours avec 0 et 1 , à l'exception de l'impression.
la source
Ruby ,
4539 octetsimprime indéfiniment
Essayez-le en ligne!
Essayez-le avec une fonction d'impression surchargée qui vous permet de choisir un séparateur et le nombre d'éléments imprimés
la source