... Ах, извините, здесь нет попкорна, просто POPCNT.
Напишите самую короткую программу или функцию, которая принимает число, n
и выведите все целые числа от 0 до 2 n - 1 в порядке возрастания числа 1 бит в двоичном представлении чисел (popcount). Дубликаты не допускаются.
Порядок чисел с одним и тем же popcount определяется реализацией.
Например, для n = 3
, все эти выходные данные действительны:
0, 1, 2, 4, 3, 5, 6, 7
[0, 4, 1, 2, 5, 3, 6, 7]
0 4 2 1 6 5 3 7
Формат ввода и вывода определяется реализацией, что позволяет использовать возможности языка для дальнейшего совершенствования кода. Есть несколько ограничений на вывод:
- Числа должны быть выведены в десятичном формате.
Выходные данные должны содержать разумный разделитель между числами (конечный разделитель разрешен, но не ведущий).
Линия подачи (
\n
), вкладка (\t
), пространство,,
,.
,;
,|
,-
,_
,/
вполне разумны сепаратор. Я не против дополнительных мест для красивой печати, но не используйте буквы или цифры в качестве разделителей.- Номера и сепараторы могут быть окружены
[ ]
,{ }
или любого массива или списка обозначений. - Не печатайте ничего, что не указано выше.
бонус
Умножьте ваш счет на 0,5, если ваше решение может генерировать число на лету. Суть этого бонуса заключается в том, что если вы должны были напрямую преобразовать свое решение для печати в генератор, генератор использует не более O (n) памяти, где n - это количество бит, как определено выше. (Вам не нужно конвертировать ваше решение в генератор). Обратите внимание, что, хотя я навязываю n <= 28, память, необходимая для хранения всех чисел, по-прежнему растет в геометрической прогрессии, и простое решение для сортировки потребовало бы минимум 4 ГБ памяти при n = 28.
Пожалуйста, добавьте простое объяснение того, как работает ваше решение, прежде чем претендовать на этот бонус.