... Ah désolé, pas de pop-corn ici, juste POPCNT.
Écrivez le programme ou la fonction la plus courte qui prend un nombre net 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.