Возьмите положительное целое число n в качестве входных данных и выведите (некоторые из них) десятичные числа, которые можно создать с использованием n битов, упорядоченных следующим образом:
Сначала перечислите все числа, которые могут быть созданы только с одним 1
, а остальные 0
в двоичном представлении (отсортированы), затем все числа, которые можно создать с двумя последовательными 1
, остальные 0
, затем три последовательных 1
и так далее.
Посмотрим, как это выглядит при n = 4 :
0001 - 1
0010 - 2
0100 - 4
1000 - 8
0011 - 3
0110 - 6
1100 - 12
0111 - 7
1110 - 14
1111 - 15
Таким образом, выходные данные для n = 4 : 1, 2, 4, 8, 3, 6, 12, 7, 14, 15 (необязательный формат вывода).
Тестовые случаи:
n = 1
1
n = 2
1 2 3
n = 3
1, 2, 4, 3, 6, 7
n = 8
1, 2, 4, 8, 16, 32, 64, 128, 3, 6, 12, 24, 48, 96, 192, 7, 14, 28, 56, 112, 224, 15, 30, 60, 120, 240, 31, 62, 124, 248, 63, 126, 252, 127, 254, 255
n = 17
1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 3, 6, 12, 24, 48, 96, 192, 384, 768, 1536, 3072, 6144, 12288, 24576, 49152, 98304, 7, 14, 28, 56, 112, 224, 448, 896, 1792, 3584, 7168, 14336, 28672, 57344, 114688, 15, 30, 60, 120, 240, 480, 960, 1920, 3840, 7680, 15360, 30720, 61440, 122880, 31, 62, 124, 248, 496, 992, 1984, 3968, 7936, 15872, 31744, 63488, 126976, 63, 126, 252, 504, 1008, 2016, 4032, 8064, 16128, 32256, 64512, 129024, 127, 254, 508, 1016, 2032, 4064, 8128, 16256, 32512, 65024, 130048, 255, 510, 1020, 2040, 4080, 8160, 16320, 32640, 65280, 130560, 511, 1022, 2044, 4088, 8176, 16352, 32704, 65408, 130816, 1023, 2046, 4092, 8184, 16368, 32736, 65472, 130944, 2047, 4094, 8188, 16376, 32752, 65504, 131008, 4095, 8190, 16380, 32760, 65520, 131040, 8191, 16382, 32764, 65528, 131056,16383, 32766, 65532, 131064, 32767, 65534, 131068, 65535, 131070, 131071
Это код-гольф , поэтому выигрывает самый короткий код на каждом языке !
Хорошие объяснения приветствуются , в том числе и для решений на «обычных языках»!
code-golf
sorting
base-conversion
binary
Стьюи Гриффин
источник
источник
Ответы:
Python , 53 байта
Попробуйте онлайн!
Рекурсивная функция генерирует отсортированный список как предварительный порядок перехода по этому дереву (пример с
n=4
):Левые ветви удваивают значение, а правые ветви
i->i*2+1
существуют и существуют только для нечетныхi
. Итак, предварительный заказ на не-листья естьT(i)=[i]+T(i*2)+i%2*T(i*2+1)
.Дерево заканчивается на глубине
n
, гдеn
находится вход. Это достигается уменьшениемn
с каждым шагом вниз и остановкой, когда он равен 0.Альтернативная стратегия заключалась бы в том, чтобы ограничиться значениями, которые
i
превышают2**n
, а не отслеживать глубину. Я обнаружил, что это на один байт длиннее:источник
[f]
забавное прикосновение, не могу сказать, что видел это раньше.Желе , 6 байт
Это дает право на мнимый бонус .
Попробуйте онлайн!
Как это работает
источник
Ẇ
является идеальным встроенным решением для этой задачи, и оно реализовано таким образом, что результаты находятся в правильном порядке для этой задачи. Хорошо сделано :-)Mathematica, 40 байт
Каждое число в желаемом списке является разностью двух степеней 2, поэтому мы просто генерируем их по порядку, используя,
Table
а затем выравниваем список. Я думаю, что это зарабатывает воображаемый бонус Стьюи Гриффин :)Mathematica, 35 байт
Порт Денниса алгоритм Желе . Я не знал об
Subsequences
этом до этого! (Я также не видел, чтобы мили опубликовали этот точный ответ ... иди, проголосуй!)источник
JavaScript (ES6),
595855 байтПолная программа, которая принимает данные через подсказку и оповещает каждый номер подряд. Это также дает право на мнимый бонус .
Тестовый фрагмент
(Примечание: использует
console.log
вместоalert
)Показать фрагмент кода
источник
JavaScript (ES6),
5551 байтВозвращает разделенный пробелами список целых чисел.
Мнимый бонус дружелюбен.
Отформатировано и прокомментировано
Контрольные примеры
Показать фрагмент кода
источник
Python 2 ,
6461 байт-3 байта благодаря Денису
Попробуйте онлайн!
источник
Mathematica, 35 байт
источник
Python 2 ,
656358 байтПопробуйте онлайн!
источник
(2<<i)-1<<j
... и вы уже поняли это. Отличная работа! Кроме того, хорошая работа по избавлению от двойных диапазоновHaskell , 37 байт
Попробуйте онлайн!
источник
Haskell, 47 байтов
Пример использования:
f 4
->[1,2,4,8,3,6,12,7,14,15]
. Попробуйте онлайн! ,Как это работает: для каждого числа
b
в[1..n]
, начните с2^b-1
и повторно двойным значением и приниматьn-b+1
элементы из этого списка.источник
05AB1E , 6 байтов
Попробуйте онлайн! или как тестовый набор
объяснение
Использует трюк со списком-суммой, как показано в ответе Денниса «Желе»
источник
Groovy,
9089 байтБинарное преобразование настолько тупо в заводной.
-1 спасибо Гурупаду Мамадапуру
источник
{(1..<2**it)...
сохраняет байт.Pyth, 7 байт
Попробуйте онлайн.
Использует алгоритм Денниса.
источник
Утилиты Bash + Unix, 51 байт
Попробуйте онлайн!
Ввод n передается в качестве аргумента.
Используйте seq для печати всех чисел с n или менее цифрами. (Это числа с базовыми 10, так что здесь много дополнительных чисел. Это расточительно и отнимает много времени, но это кодовый гольф!)
Призыв к grep сохраняет только те числа, которые состоят ровно из 1 с, а затем 0.
Затем используйте sort -r, чтобы отсортировать их в обратном лексикографическом порядке.
Наконец, dc устанавливается на вход base 2 - он помещает отсортированные числа в стек, а затем печатает стек сверху вниз. (Это печатает последний элемент, помещенный первым, и т. Д., Поэтому я использую сортировку -r вместо просто сортировки.)
Исправлена ошибка: я опустил опцию -f% .f в seq, которая требуется для целых чисел от 1000000 и далее. (Спасибо @TobySpeight за указание на проблему.)
источник
dc<<<2i`seq $[10**7-1]|grep ^1*0*$|sort -r`f | wc -
только сообщает 12 значений. Я думаю, что вы хотитеgrep ^1[01]*$
вместо этого.Mathematica / Mathics , 69 байтов
Попробуйте онлайн!
источник
Perl 6 , 38 байт
Как это работает
Т.е. он строит числа вот так:
Код:
Perl 6 , 44 байта
Это был мой первый подход, прежде чем я подумал о (на самом деле более простом) решении с битовым сдвигом выше.
Как это работает
Т.е. он строит числа вот так:
источник
Haskell
5946 байтЯ начал с
f n=[0..n]>>= \b->take(n-b).iterate(*2).sum.map(2^)$[0..b]
от ответа Ними выше получил понимание, которое
sum.map(2^)$[0..x]
может быть сведено к2^x-1
Заканчивая с
e n=[1..n]>>= \x->map(\y->2^y*(2^x-1))[0..n-x]
[1..n] - список с количеством последовательных битов, которые мы хотим пролистать`
>> = - полностью переведенный для каждого элемента в списке слева, передать его в функцию справа и объединить все результаты
\ x -> - объявление лямбда-функции с одним аргументом
map xy - применяет функцию x ко всем членам списка y
В нашем случае x = (\ y-> 2 ^ y * (2 ^ x-1)) - другая лямбда-функция 2 ^ y * (2 ^ x-1)). Эта формула возникает из умножения на два, добавляя ноль вправо в двоичном виде (например, с 0001 по 0010). 2 ^ x - 1 - это количество бит, с которыми мы работаем. поэтому для 11 у нас есть 2 ^ 0 * 3 (т.е. вообще не сдвигаться) == 0011, затем 2 ^ 1 * 3 = 0110, затем 2 ^ 2 * 3 - 1100.
[0..nx] Составляет список того, сколько раз мы можем сдвинуть биты. Если мы работаем с одним 1, то, глядя на 0001, мы хотим сместить 3 раза (4-1). Если мы работаем два 11, мы хотим 4-2 и так далее.
источник
Python 3, 59 байт
Примечание: это было сделано независимо от решений ovs и Dennis , хотя это очень похоже на оба.
Как это работает:
Попробуйте онлайн!
Советы (как кодирование, так и наличные) всегда приветствуются!
источник
Japt , 11 байт
Проверьте это онлайн!
объяснение
Это в значительной степени использует подход @ Dennis:
источник
Python ,
6159 байтПопробуйте онлайн!
источник
PHP,
59 5653 байтапринимает данные от STDIN; беги с
-R
.сломать
источник
$argn
очень хорошую идею. После прочтения вопроса у меня в голове есть решение с более чем 200J , 19 байт
При этом используется тот же метод в @Dennis' растворе .
Попробуйте онлайн!
объяснение
источник
Python 3, 91 байт
Полная программа с выводом через запятую + пробел, как указано.
Объяснение:
Звездная нотация распаковывает списки. Так
print(*[1,2,3])
же, какprint(1,2,3)
. Передайтеint()
конструктору строку последовательных 1.-~b
оцениваетb+1
, но вам не нужно заключать его в квадратные скобки при умножении строки.Сдвиг полученного целого числа все большее число раз.
print()
имеет необязательный аргумент sep, указывающий строку для вставки между каждым элементом в распакованном списке.источник
Java 7, 108 байт
Удваивает начальное значение, если результат меньше, чем
2^n
. После этого обновляет начальное значение, чтобы быть(initial_value * 2) + 1
и начинается снова оттуда, пока оно в конечном итоге не достигнет(2^n)-1
.например для
n=4
:Попробуйте онлайн!
источник
Рубин, 50 байтов
Я попробовал некоторые «умные» подходы, но это, кажется, самый короткий (буквально следуйте инструкциям)
Объяснение:
Каждая итерация начинается с 2 ^ n-1 и умножается на 2, пока не будет достигнут верхний предел. Ничего особенного, просто базовая математика.
источник
QBIC , 37 байт - мнимый бонус = еще 37 байт ...
Жаль, что я еще не встроил
while-wend
в QBIC ... Объяснение:РЕДАКТИРОВАТЬ: QBIC теперь имеет поддержку для
WHILE
:Это всего 26 байтов! Вот это
WHILE
:источник
MATL,
1918 байт1 байт сохранен благодаря @Luis
Попробуйте онлайн
источник
R ,
694846 байтКаждое десятичное число, соответствующее
i in 1..n
единице в двоичной системе, умножается на2^(0..n-i)
, то есть первыеn-i+1
степени двух (1, 2, 4, ...).Попробуйте онлайн!
источник
Stax , 9 байт
Запускать и отлаживать онлайн!
объяснение
Ну, здесь нет базового преобразования.
Используется распакованная версия (10 байт) для объяснения.
источник
Пакетная, 92 - 0 = 92 байта
Вычитая 0 для мнимого бонуса @ StewieGriffin.
источник