Prenez un entier positif n comme entrée et indiquez (parmi certains) les nombres décimaux pouvant être créés à l'aide de n bits, classés de la manière suivante:
Commencez par lister tous les nombres pouvant être créés avec un seul 1
et le reste 0
dans la représentation binaire (triés), puis tous les nombres pouvant être créés avec deux consécutives 1
, les autres 0
, trois consécutives 1
, etc.
Voyons à quoi cela ressemble pour n = 4 :
0001 - 1
0010 - 2
0100 - 4
1000 - 8
0011 - 3
0110 - 6
1100 - 12
0111 - 7
1110 - 14
1111 - 15
Ainsi, la sortie pour n = 4 est la suivante: 1, 2, 4, 8, 3, 6, 12, 7, 14, 15 (format de sortie optionnel).
Cas de test:
n = 1
1
n = 2
1 2 3
n = 3
1, 2, 4, 3, 6, 7
n = 8
1, 2, 4, 8, 16, 32, 64, 128, 3, 6, 12, 24, 48, 96, 192, 7, 14, 28, 56, 112, 224, 15, 30, 60, 120, 240, 31, 62, 124, 248, 63, 126, 252, 127, 254, 255
n = 17
1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 3, 6, 12, 24, 48, 96, 192, 384, 768, 1536, 3072, 6144, 12288, 24576, 49152, 98304, 7, 14, 28, 56, 112, 224, 448, 896, 1792, 3584, 7168, 14336, 28672, 57344, 114688, 15, 30, 60, 120, 240, 480, 960, 1920, 3840, 7680, 15360, 30720, 61440, 122880, 31, 62, 124, 248, 496, 992, 1984, 3968, 7936, 15872, 31744, 63488, 126976, 63, 126, 252, 504, 1008, 2016, 4032, 8064, 16128, 32256, 64512, 129024, 127, 254, 508, 1016, 2032, 4064, 8128, 16256, 32512, 65024, 130048, 255, 510, 1020, 2040, 4080, 8160, 16320, 32640, 65280, 130560, 511, 1022, 2044, 4088, 8176, 16352, 32704, 65408, 130816, 1023, 2046, 4092, 8184, 16368, 32736, 65472, 130944, 2047, 4094, 8188, 16376, 32752, 65504, 131008, 4095, 8190, 16380, 32760, 65520, 131040, 8191, 16382, 32764, 65528, 131056,16383, 32766, 65532, 131064, 32767, 65534, 131068, 65535, 131070, 131071
C'est du code-golf , donc le code le plus court dans chaque langue gagne!
Les bonnes explications sont vivement encouragées , y compris pour les solutions dans les "langages normaux"!
code-golf
sorting
base-conversion
binary
Stewie Griffin
la source
la source
Réponses:
Python , 53 octets
Essayez-le en ligne!
La fonction récursive génère la liste triée sous forme de promenade de pré-commande dans cet arbre (exemple avec
n=4
):Les branches de gauche doublent la valeur et les branches de droite n'existent
i->i*2+1
et n'existent que pour les impairsi
. Donc, la marche de pré-commande pour les non-feuilles estT(i)=[i]+T(i*2)+i%2*T(i*2+1)
.L'arbre se termine en profondeur
n
, où sen
trouve l'entrée. Ceci est réalisé en décrémentantn
à chaque pas en bas et en s’arrêtant quand il est 0.Une autre stratégie serait de mettre fin aux valeurs qui
i
dépassent2**n
plutôt que de suivre la profondeur. J'ai trouvé que c'était un octet de plus:la source
[f]
une touche amusante, je ne peux pas dire que j'ai déjà vu ça auparavant.Gelée , 6 octets
Cela qualifie pour le bonus imaginaire .
Essayez-le en ligne!
Comment ça marche
la source
Ẇ
est un idéal intégré pour ce défi, et il est mis en œuvre pour que les résultats soient dans le bon ordre pour ce défi. Bien fait :-)Mathematica, 40 octets
Chaque nombre dans la liste désirée est la différence de deux puissances de 2, nous les générons simplement dans l’ordre en utilisant
Table
puis aplatissant la liste. Je pense que cela mérite le bonus imaginaire de Stewie Griffin :)Mathematica, 35 octets
Un port de l'algorithme Jelly de Dennis . Je ne savais pas
Subsequences
avant ça! (Je n'ai pas vu non plus que Miles avait posté cette réponse exacte ... allez-y!)la source
JavaScript (ES6),
595855 octetsUn programme complet qui prend une entrée par une invite et alerte chaque numéro successivement. Cela se qualifie également pour le bonus imaginaire .
Extrait de test
(Note: utilise
console.log
au lieu dealert
)Afficher l'extrait de code
la source
JavaScript (ES6),
5551 octetsRetourne une liste d'entiers séparés par des espaces.
Bonus imaginaire convivial.
Formaté et commenté
Cas de test
Afficher l'extrait de code
la source
Python 2 ,
6461 octets-3 octets grâce à Dennis
Essayez-le en ligne!
la source
Mathematica, 35 octets
la source
Python 2 ,
656358 octetsEssayez-le en ligne!
la source
(2<<i)-1<<j
... et vous l'avez déjà compris. Bon travail! En outre, bon travail pour se débarrasser des gammes doublesHaskell , 37 octets
Essayez-le en ligne!
la source
Haskell, 47 octets
Exemple d'utilisation:
f 4
->[1,2,4,8,3,6,12,7,14,15]
. Essayez-le en ligne! .Comment ça marche: pour chaque nombre
b
dans[1..n]
, commencez par2^b-1
et doublez plusieurs fois la valeur et prenez desn-b+1
éléments de cette liste.la source
05AB1E , 6 octets
Essayez-le en ligne! ou en tant que suite de tests
Explication
Utilise le truc de la sous-somme comme indiqué dans la réponse de Dennis à Jelly
la source
Groovy,
9089 octetsLa conversion binaire est tellement stupide en groovy.
-1 grâce à Gurupad Mamadapur
la source
{(1..<2**it)...
enregistre un octet.Pyth, 7 octets
Essayez-le en ligne.
Utilise l'algorithme de Dennis.
la source
Utilitaires Bash + Unix, 51 octets
Essayez-le en ligne!
L'entrée n est passée dans un argument.
Utilisez seq pour imprimer tous les nombres de n chiffres ou moins. (Ce sont des chiffres en base 10, donc il y a beaucoup de chiffres supplémentaires ici. C'est une perte de temps et de perte de temps, mais c'est du code golf!)
L'appel à grep ne conserve que les nombres composés précisément de 1, suivis de 0.
Ensuite, utilisez sort -r pour les trier par ordre lexicographique inverse.
Enfin, le courant continu est réglé sur l’entrée base 2: il pousse les nombres triés sur une pile, puis l’imprime de haut en bas. (Ceci imprime le dernier élément poussé en premier, etc., c'est pourquoi j'utilise plutôt -r au lieu de simplement trier.)
Correction d'un bug: j'avais omis l'option -f% .f dans seq, qui est requise pour les nombres entiers à partir de 1000000. (Merci à @TobySpeight pour avoir signalé qu'il y avait un problème.)
la source
dc<<<2i`seq $[10**7-1]|grep ^1*0*$|sort -r`f | wc -
seulement 12 valeurs sont rapportées. Je pense que tu veux à lagrep ^1[01]*$
place.Mathematica / Mathics , 69 octets
Essayez-le en ligne!
la source
Perl 6 , 38 octets
Comment ça marche
C'est-à-dire qu'il construit les nombres comme ceci:
Le code:
Perl 6 , 44 octets
C’était ma première approche avant de penser à la solution de transfert de bits (en réalité plus simple) ci-dessus.
Comment ça marche
C'est-à-dire qu'il construit les nombres comme ceci:
la source
Haskell
5946 octetsJ'ai commencé avec
f n=[0..n]>>= \b->take(n-b).iterate(*2).sum.map(2^)$[0..b]
de la réponse de nimi ci-dessus a gagné la perspicacité qui
sum.map(2^)$[0..x]
peut être condensée à2^x-1
Finir avec
e n=[1..n]>>= \x->map(\y->2^y*(2^x-1))[0..n-x]
[1..n] - liste avec le nombre de bits consécutifs que nous voulons parcourir`
>> = --roughly traduit pour chaque élément de la liste de gauche, le passer à la fonction de droite et concaténer tous les résultats
\ x -> - déclaration de fonction lambda avec un argument
carte xy - applique la fonction x à tous les membres de la liste y
Dans notre cas x = (\ y-> 2 ^ y * (2 ^ x-1)) - une autre fonction lambda 2 ^ y * (2 ^ x-1)). Cette formule découle de la multiplication par deux en ajoutant un zéro à droite en binaire (exemple 0001 à 0010). 2 ^ x - 1 est le nombre de bits avec lequel nous travaillons. Donc, pour 11, nous avons 2 ^ 0 * 3 (c'est-à-dire qu'il ne faut pas changer du tout) == 0011, puis 2 ^ 1 * 3 = 0110, puis 2 ^ 2 * 3 - 1100.
[0..nx] Construit la liste du nombre de fois où nous pouvons décaler les bits. Si nous travaillons avec un seul 1, puis sur 0001, nous souhaitons passer trois fois (4-1). Si nous travaillons deux 11 nous voulons 4-2 et ainsi de suite.
la source
Python 3, 59 octets
Note: ceci a été fait indépendamment des solutions de ovs et de Dennis , même si c'est très similaire aux deux.
Comment ça marche:
Essayez-le en ligne!
Les pourboires (codage et espèces) sont toujours les bienvenus!
la source
Japt , 11 octets
Testez-le en ligne!
Explication
Ceci utilise assez bien l'approche de @ Dennis:
la source
Python ,
6159 octetsEssayez-le en ligne!
la source
PHP,
59 5653 octetsprend les entrées de STDIN; courir avec
-R
.panne
la source
$argn
très bonne idée. Après avoir lu la question, j'ai en tête une solution de plus de 200 octetsJ , 19 octets
Ceci utilise la même méthode dans la solution de @Dennis .
Essayez-le en ligne!
Explication
la source
Python 3, 91 octets
Programme complet, avec sortie séparée par des virgules + espaces, comme spécifié.
Explication:
La notation étoile décompresse les listes. Ainsi
print(*[1,2,3])
est la même chose queprint(1,2,3)
. Passez auint()
constructeur une chaîne de '1 consécutifs.-~b
évalue àb+1
, mais vous n'avez pas à l'entourer de crochets pour multiplier une chaîne.Décalage binaire de l'entier produit un nombre croissant de fois.
print()
a l'argument optionnel sep, spécifiant la chaîne à insérer entre chaque élément de la liste décompressée.la source
Java 7, 108 octets
Double la valeur initiale tant que le résultat est inférieur à
2^n
. Ensuite, met à jour la valeur initiale(initial_value * 2) + 1
et recommence à partir de là jusqu'à ce qu'elle atteigne(2^n)-1
.par exemple pour
n=4
:Essayez-le en ligne!
la source
Ruby, 50 octets
J'ai essayé des approches "intelligentes", mais cela semble être la plus courte (suivez littéralement les instructions)
Explication:
Chaque itération commence par 2 ^ n-1 et se multiplie par 2 jusqu'à ce que la limite supérieure soit atteinte. Rien d'extraordinaire, juste des mathématiques de base.
la source
QBIC , 37 octets - bonus imaginaire = encore 37 octets ...
Dommage que je n'ai pas encore intégré
while-wend
QBIC ... Explication:EDIT: QBIC a maintenant un support pour
WHILE
:Ce n'est que 26 octets! Voici le
WHILE
:la source
MATL,
1918 octets1 octet enregistré grâce à @Luis
Essayez-le en ligne
la source
R ,
694846 octetsChaque nombre décimal correspondant à
i in 1..n
ceux du système binaire est multiplié par2^(0..n-i)
, c'est-à-dire les premièresn-i+1
puissances de deux (1, 2, 4, ...).Essayez-le en ligne!
la source
Stax , 9 octets
Exécuter et déboguer en ligne!
Explication
Eh bien, il n’ya pas de conversion de base ici.
Utilise la version décompressée (10 octets) pour expliquer.
la source
Lot, 92 - 0 = 92 octets
Soustraire 0 pour le bonus imaginaire de @ StewieGriffin.
la source