... Ah lo siento, no hay palomitas de maíz aquí, solo POPCNT.
Escriba el programa o la función más corta que tome un número ny genere todos los enteros de 0 a 2 n - 1, en orden ascendente de número de 1 bits en la representación binaria de los números (popcount). No se permiten duplicados.
El orden de los números con el mismo popcount está definido por la implementación.
Por ejemplo, para n = 3, todos estos resultados son válidos:
0, 1, 2, 4, 3, 5, 6, 7
[0, 4, 1, 2, 5, 3, 6, 7]
0 4 2 1 6 5 3 7
El formato de entrada y salida está definido por la implementación para permitir el uso de funciones de lenguaje para mejorar el código. Hay algunas restricciones en la salida:
- Los números deben salir en formato decimal.
La salida debe contener un separador razonable entre los números (separador final permitido, pero no inicial).
Avance de línea (
\n), pestaña (\t), espacio,,,.,;,|,-,_,/son separador bastante razonable. No me importan espacios adicionales para una impresión bonita, pero no use letras o dígitos como separadores.- Los números y separadores pueden estar rodeados por
[ ],{ }o cualquier matriz o notación de lista. - No imprima nada más no mencionado anteriormente.
Prima
Multiplique su puntaje por 0.5 si su solución puede generar el número sobre la marcha. El espíritu de este bono es que si fuera a convertir directamente su solución de impresión en un generador, el generador solo usa como máximo la memoria O (n) donde n es el número de bits como se definió anteriormente. (No tiene que convertir su solución en generador). Tenga en cuenta que si bien impongo n <= 28, la memoria necesaria para almacenar todos los números aún crece exponencialmente, y una solución de clasificación ingenua acumularía al menos 4 GB de memoria en n = 28.
Agregue alguna explicación simple de cómo funciona su solución antes de reclamar este bono.