... Ах вибачте, тут немає попкорну, просто POPCNT.
Напишіть найкоротшу програму або функцію, яка бере число nі виведете всі цілі числа від 0 до 2 n - 1, у порядку зростання числа 1 біт у двійковому поданні чисел (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.
Додайте кілька простих пояснень того, як працює ваше рішення, перш ніж вимагати цього бонусу.