Remarquez que lorsque je dis "nier", je veux dire remplacer tous les zéros (c'est-à-dire une négation au niveau du bit)
La séquence Thue-Morse va comme 01101001
La façon dont vous le générez est:
Commencez par prendre 0. Niez ce qui reste et ajoutez-le à la fin.
Alors, prends 0
. Niez-le et ajoutez-le à la fin -01
Ensuite, prenez cela et niez-le et ajoutez cela à la fin - 0110
Etc.
Une autre propriété intéressante de ceci est que la distance entre les zéros crée une chaîne "irrationnelle" et non répétitive.
Donc:
0110100110010110
|__|_||__||_|__|
2 1 0 2 01 2 <------------Print this!
Pouvez-vous écrire un programme qui, lors de la saisie de n, produira les n premiers chiffres de la chaîne à imprimer?
C'est le golf de code, donc le plus petit nombre d'octets gagne!
Réponses:
Gelée, 9 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
Python
32,104928884 octetsIl s'agit d'une solution assez rudimentaire basée sur la construction d'une séquence ternaire Thue-Morse à partir de zéro. Cette séquence est identique à celle demandée, bien que quelqu'un d'autre devra écrire une explication plus approfondie de la raison. En tout cas, cette séquence n'est qu'une modification triviale de celle-ci, A036580 .
Edit: changé la boucle for en une compréhension de liste, changé d'une fonction en un programme, et changé le tout en Python 2. Merci à Dennis pour son aide au golf.
la source
Julia,
5650 octetsIl s'agit d'une fonction anonyme qui accepte un entier et renvoie un tableau d'entiers. Pour l'appeler, affectez-le à une variable.
Nous générons la séquence Thue-Morse permutée en bits en commençant par un entier
m = 1
, puis nous ajoutons1-m
àm
un tableau desn+1
heures, oùn
est l'entrée. Cela génère plus de termes que nous n'en avons besoin. Nous localisons ensuite celles qui utilisentfind(m)
, obtenons la différence entre les valeurs consécutives en utilisantdiff
et soustrayons 1 élément par élément. Prendre les premiersn
termes du tableau résultant nous donne ce que nous voulons.Enregistré 6 octets et résolu un problème grâce à Dennis!
la source
PowerShell, 102 octets
Un peu d'une manière différente de calculer. PowerShell ne dispose pas d'un moyen simple pour "obtenir tous les indices de ce tableau où la valeur à cet index est telle ou telle ", nous devons donc être légèrement créatifs.
Ici, nous utilisons A001969 , les "nombres avec un nombre pair de 1 dans leur expansion binaire", qui donne complètement par coïncidence les indices des 0 dans la séquence Thue-Morse. ;-)
Le
filter
calcule ce nombre. Par exemple,x 4
donnerait9
. Nous bouclons ensuite simplement à partir0
de notre entrée$args[0]
, en soustrayant1
car nous sommes indexés sur zéro, et chaque itération de la boucle affiche la différence entre le nombre suivant et le nombre actuel. La sortie est ajoutée au pipeline et sortie implicitement avec des retours à la ligne.Exemple
la source
Haskell, 42 octets
Exemple d'utilisation:
(`take`l) 7
->[2,1,0,2,0,1,2]
.Il est une mise en œuvre de
a036585_list
partir A036585 décalée vers le bas à0
,1
et2
. Golf:concat (map f l)
c'estf =<< l
etf 0=[0,1,2]; f 1=[0,2]; f 2=[1]
c'est([[0..2],[0,2],[1]]!!)
.Remarque:
l
est la séquence infinie. Il faut 10 octets, soit environ 25% pour implémenter la fonction de prise en premier desn
éléments.la source
Mathematica,
796870 octetsla source
n<3
.MATL ,
1411 octetsEssayez-le en ligne!
Comme l'a souligné @TimmyD dans sa réponse , la séquence souhaitée est donnée par les différences consécutives de A001969 . Cette dernière peut à son tour être obtenue sous la forme de la séquence de Thue-Morse plus 2 * n . Par conséquent, la séquence souhaitée est donnée par les (différences consécutives de la séquence de Thue-Morse) plus un .
En revanche, la séquence Thue-Morse peut être obtenue comme le nombre de uns dans la représentation binaire de n , à partir de n = 0.
la source
05AB1E ,
1413 octetsCode:
Explication:
Essayez-le en ligne!
la source
Python, 69 octets
Le
i
terme e de cette séquence est1+t(i+1)-t(i)
, oùt
est la fonction Thue-Morse. Le code l'implémente récursivement, ce qui est plus court quela source
Mathematica, 65 octets
Beats mon autre réponse, mais ne bat pas l'extra-
version golféeépicée. Maintenant, normalement, je colle mon code entre guillemets, puis je le retire car Mathematica aime ajouter des espaces à votre code (qui ne font rien) mais il ne dérange jamais les chaînes, mais cela ne fonctionne pas pour le code qui a lui-même des guillemets ...Quoi qu'il en soit, j'utilise simplement la magie intégrée pour cela. La sortie est une chaîne.
la source
Mathematica, 58 octets
la source
1;;#
peut être remplacé simplement;;#
.Position
.)Perl, 45 + 2 = 47 octets
Nécessite le drapeau
-p
et-a
:Port de @ Sherlock9 réponse
9 octets enregistrés grâce à Ton
la source
-a
option vous donne une copie gratuite de l'entrée, donc$_=2;s/./(1,20,210)[$&]/ge until/.{@F}/;$_=$&
-p
avec-E
:say$&
à la fin si nous supposons que Perl> v5.18JavaScript (ES6),
7367 octetsPort de @ Sherlock9's answer.
edit: 6 octets enregistrés grâce à @WashingtonGuedes.
la source
!s[n]
à la place des.length<n
? Ou peut-être justes[n]
avec?:
inversé?CJam (19 octets)
Démo en ligne
Cela utilise l'approche consistant à incrémenter les différences successives entre les éléments de la séquence de Thue-Morse.
Mon approche la plus courte utilisant des règles de réécriture est de 21 octets:
(Attention: lent). Cela code les règles de réécriture
comme
la source
Rubis, 57 octets
Un port de réponse Python de xnor. Les changements se situent principalement dans la déclaration ternaire
t
à la place de laand
raison d'0
être véridique dans Ruby, et d'utiliser(1..n).map
et1+t[i]-t[i-1]
d'économiser des octets par rapport à l'importation directe de la compréhension de la liste.la source
0
est véridique? Comment ça marche??Mathematica (
presquenon verbal),107110 octetsLa séquence est générée par l'application répétée d'une règle de remplacement. Une autre règle le transforme en sortie souhaitée. Si suffisamment de personnes sont intéressées, je vais vous expliquer en détail.
version non alphanumérique
comme suggéré par CatsAreFluffy.
la source
$
et remplacez0
parx-x
(où x est une séquence inutilisée de$
) (et utilisez(x-x)!
pour 1 (idem)), nous ne sommes pas alphanumériques.{x__}
au lieu de_[x__]
$[_]:=-/;
(les deux par émulation de compteur)