... Ah désolé, pas de pop-corn ici, juste POPCNT.
Écrivez le programme ou la fonction la plus courte qui prend un nombre n
et sortez tous les entiers de 0 à 2 n - 1, dans l'ordre croissant du nombre de 1 bits dans la représentation binaire des nombres (popcount). Aucun doublon autorisé.
L'ordre des nombres avec le même nombre est défini par l'implémentation.
Par exemple, pour n = 3
, toutes ces sorties sont valides:
0, 1, 2, 4, 3, 5, 6, 7
[0, 4, 1, 2, 5, 3, 6, 7]
0 4 2 1 6 5 3 7
Le format d'entrée et de sortie est défini par l'implémentation pour permettre l'utilisation de fonctionnalités linguistiques pour approfondir le code. Il y a quelques restrictions sur la sortie:
- Les nombres doivent être sortis au format décimal.
La sortie doit contenir un séparateur raisonnable entre les nombres (séparateur de fin autorisé, mais pas en tête).
Saut de ligne (
\n
), onglet (\t
), l' espace,,
,.
,;
,|
,-
,_
,/
sont tout à fait raisonnable séparateur. Cela ne me dérange pas d'espaces supplémentaires pour une jolie impression, mais n'utilisez pas de lettres ou de chiffres comme séparateurs.- Les nombres et les séparateurs peuvent être entourés par
[ ]
,{ }
ou n'importe quel tableau ou notation de liste. - N'imprimez rien d'autre que ce qui est indiqué ci-dessus.
Prime
Multipliez votre score par 0,5 si votre solution peut générer le nombre à la volée. L'esprit de ce bonus est que si vous deviez convertir directement votre solution d'impression en un générateur, le générateur n'utilise au maximum que de la mémoire O (n) où n est le nombre de bits tel que défini ci-dessus. (Vous n'avez pas besoin de convertir votre solution en générateur). Notez que bien que j'impose n <= 28, la mémoire nécessaire pour stocker tous les nombres augmente toujours de façon exponentielle, et une solution de tri naïf monopoliserait au moins 4 Go de mémoire à n = 28.
Veuillez ajouter quelques explications simples sur le fonctionnement de votre solution avant de réclamer ce bonus.
Réponses:
Pyth, 9 octets
o
rder par les
um de la représentation de base 2 (jN2
) sur la plage (U
) de2 ^ Q
.(
Q
=eval(input())
).Essayez-le ici.
la source
Python 2, 75 * 0,5 = 37,5
v
Génère à plusieurs reprises le prochain plus élevé avec le même POPCOUNT par cet algorithme de twiddling de bits .En fait, il s'est avéré plus facile de les générer en diminuant le nombre de pop, puis d'imprimer le complément pour le faire augmenter. De cette façon, puis
v
déborde2**n
, nous supprimons simplement tout sauf lesn
bits avec&N
oùN=2**n-1
supprimons , et cela donne le plus petit nombre de popcount inférieur. De cette façon, nous pouvons simplement faire une boucle. Il existe probablement une meilleure solution qui trouve directement le numéro inférieur suivant avec le même POPCOUNT.En raison d'un problème de clôture, nous devons commencer par
v=2**(n+1)-1
pour que l'opération se produisev=N-1
sur la première boucle.Sortie pour
4
:la source
console.log()
vsprint
). Peut-être que le truc est trop lourd.v=N-~N
J, 19 personnages, pas de bonus.
2 ^ y
- deux au pouvoir dey
.i. 2 ^ y
- les entiers de0
à(2 ^ y) - 1
.#: i. 2 ^ y
- chacun de ces nombres entiers représentés en base deux.+/"1 #: i. 2 ^ y
- les sommes de chaque représentation(i. 2 ^ y) /: +/"1 #: i. 2 ^ y
- le vecteuri. 2 ^ y
trié par ordre des éléments du vecteur précédent, notre réponse.la source
Python, 63 caractères
la source
C 179 * 0,5 = 89,5
EDIT: 157 * 0,5 = 78,5
EDIT: 132 * 0,5 = 66
ou un format un peu plus agréable:
Ce qu'il fait?
calcule le dernier nombre à afficher (pow (2, n) - 1)
la boucle externe itère sur le nombre de bits (donc 0 à n-1) tandis que la boucle interne ne compte que de 0 à m
Sur x86, il y a l'instruction POPCNT qui peut être utilisée pour compter les bits définis. GCC et les compilateurs compatibles peuvent prendre en charge la fonction __builtin_popcount qui compile essentiellement cette instruction.
la source
CJam, 13 octets
Implémentation assez simple.
Comment ça marche :
Essayez-le en ligne ici
la source
Mathematica,
5046.
la source
JavaScript (ES6) 41 (82 * 0,5)
Le plus simple, le golf
Non golfé
Tester dans la console Firefox / FireBug
la source
Bash + coreutils, 66
Un pour vous aider à démarrer:
la source
sort
prend beaucoup de temps. Avec n = 28,sort
il faudra trier 2 ^ 28 lignes / ~ 13 Go de données.Haskell, (87 * 0,5) = 43,5
Exemple d'utilisation:,
f 4
qui génère[0,1,2,4,8,3,5,9,6,10,12,7,11,13,14,15]
Fonctionnement: ni tri ni itération répétée sur [0..2 ^ n-1] et recherche de nombres contenant i 1s.
Les
#
fonctions d'assistance prennent deux paramètresa
etb
construisent une liste de chaque nombre composé dea
1 et deb
0. La fonction principalef
appelle#
chaque combinaison dea
etb
oùa+b
est égaln
, en commençant par aucun 1 etn
0 pour avoir les nombres dans l'ordre. Grâce à la paresse de Haskell, toutes ces listes n'ont pas à être entièrement construites en mémoire.la source
++
ena#b
moyenne que le côté gauche ( ce qui pourrait être grande) doit être entièrement puis copiés avant le premier élément du résultat est produit, violant ainsi les exigences de la prime?Ruby 47 caractères
Tout comme celui en Python de @KeithRandall:
la source
Mathematica, 26
Exemple:
la source
Perl, 64/2 = 32
Parcourez simplement les plages de
[0..2^n-1]
n + 1
temps. Dans chaque itération, imprimez uniquement les nombres dont le nombre de 1 bits est égal à la variable d'itération ($i
). Les bits sont comptés en comptant1
's (y/1//
) dans le nombre converti en chaîne binaire avecsprintf
.Testez- moi .
Perl, 63
Approche de tri:
la source
Java 8, 205
la source
C ++ 11, 117 caractères:
Non golfé:
Explication:
Créez un ensemble de paires int, int. Le premier entier est le nombre de bits, le second est le nombre. Les paires se comparent en fonction de leur premier paramètre, donc l'ensemble est trié par nombre de bits.
la source