Основываясь на нотации «двоичный, но с двойками», упомянутой в этом видеофильме с числовыми файлами , напишите функцию, которая принимает в качестве входного значения одно число и выводит все варианты этого числа в «двоичной» системе, где разрешены двойки.
правила
- Код должен быть только функцией / методом, а не полной программой
- Ввод - это целое число, переданное в качестве единственного параметра функции
- Выходные данные - все допустимые изменения входного числа, преобразованного в двоичную запись, но с двойным
- Выходные данные - это возвращаемое значение функции, но они могут быть в любом удобном для вас формате, если они очевидны (например, 3 дюйма, 3 строки, строка с разделителями-запятыми / пробелами, массив значений и т. Д.), Порядок не важен
- В том маловероятном случае, если язык содержит встроенную функцию для достижения результата, он запрещен
- Самый короткий код в байтах - победитель
Пояснения к выводу
Например, если вы передали число 9
, вы можете преобразовать его в двоичное число как 1001
, но если вы разрешите 2
s в каждой позиции, вы также можете записать его как 201
(т.е. 2*4 + 0*2 + 1*1
) или 121
(т.е. 1*4 + 2*2 + 1*1
), как показано в этой таблице:
+----+----+----+----+
| 8s | 4s | 2s | 1s |
+----+----+----+----+
| 1 | 0 | 0 | 1 |
| 0 | 2 | 0 | 1 |
| 0 | 1 | 2 | 1 |
+----+----+----+----+
Поэтому, если она пройдена 9
, ваша функция должна будет вернуть три числа 1001
, 201
и 121
.
Формат и порядок не имеют значения, так долго , как это очевидно (то есть [121,201,1001]
, "0201 0121 1001"
, ("1001","121","201")
являются действительными результаты , когда дается ввод 9
).
Примеры
2
=>10, 2
9
=>1001, 201, 121
10
=>1010, 210, 202, 1002, 122
23
=>2111, 10111
37
=>100101, 20101, 100021, 20021, 12101, 12021, 11221
источник
Ответы:
GolfScript (25 байт) / CJam (
1917 байт)GolfScript:
Это создает анонимную функцию (см. Мета-обсуждение о допустимости анонимных функций ).
Онлайн демо
Прямой перевод на CJam (спасибо Мартину Бюттнеру за то, что он побрил пару персонажей)
рассечение
Причина операции возведения в квадрат состоит в том, что нам нужно выполнить итерацию до максимально возможного значения, троичное представление которого, интерпретируемое в двоичном формате, равно
^
. Поскольку2 = 10
«нормальное» двоичное представление^
является тем, которое имеет значение. Если мы конвертируем это в троичное, мы обнаружим, что «худшие» случаи - это степени 2. Оптимальным подходом было бы привести аргумент к силеln 3/ln 2 ~= 1.585
, но квадрат намного короче.источник
Python 2 (59 байт)
(Большое спасибо @grc, @xnor и @PeterTaylor за помощь в чате)
Простая рекурсия, вызов с
S(23)
или подобное.объяснение
Общая идея заключается в том, что если
n
двоичное разложение заканчивается на a1
, то любое псевдобинарное («двоичное, но с двойками») расширение также должно заканчиваться на a1
. В противном случае это может закончиться0
или2
.Следовательно, мы смотрим на последний бит
n
, делим и разветвляем соответственно.рассечение
Переменные:
n
: Число, которое мы хотим найти псевдобинарные разложенияB
: Псевдобинарная строка строится справа налевоисточник
Bash + coreutils, 77
(Это TABсимвол в выражении grep.)
Это немного изгибает это правило:
«В том маловероятном случае, когда язык содержит встроенную функцию для достижения результата, это запрещено»
Оказывается, это
dc
имеет обратную сторону того, что нам нужно встроить. Например, если мы установим для входной базы значение 2 и введем двоичное число с двойками, оно будет правильно проанализировано. (Точно так же, если режим ввода - база 10, AF анализируются как десятичные "цифры" 10-15).seq
создает список всех десятичных чисел вплоть до стандартного двоичного представления n, анализируемого как десятичное число. Затем все числа, которые содержат что-либо кроме {0,1,2}, отфильтровываются. Затемdc
анализирует оставшиеся числа как двоичные, чтобы увидеть, какие из них вернутся к n.Функции Bash могут «возвращать» только скалярные целые числа 0-255. Так что я позволю себе распечатать список в STDOUT как мой способ «возвращения». Это идиоматично для сценариев оболочки.
Выход:
источник
Хаскелл, 82
это просто перебор. это очень неэффективно, потому что ожидается, что он сократит до 3 ^ n возможностей.
источник
Желе , 10 байт, языковые проблемы
Попробуйте онлайн!
Непрерывное решение до числа гипербитов, равного входному значению (этот формат известен как «гипербинарный»). Таким образом, это невероятно неэффективно, работает в O (3 n ).
объяснение
источник
PHP, 138 байт
Сломать
источник
C ++, 159 байт
Проверьте это здесь
источник
к, 21 байт
Использует тот же метод, что и в ответе Golfscript Питера Тейлора
Примеры:
источник