Целое положительное число N является K- разреженным, если между двумя любыми двумя последовательными единицами в его двоичном представлении есть по крайней мере K 0.
Итак, число 1010101 является 1-разреженным, а 101101 - нет.
Ваша задача - найти следующий 1-разреженный номер для заданного входного номера. Например, если входное значение равно 12 ( 0b1100
), выходное значение должно быть 16 ( 0b10000
), а если входное значение равно 18 ( 0b10010
), выходное значение должно быть 20 ( 0b10100
).
Наименьшая программа или функция (в байтах) побеждает! Стандартные лазейки запрещены.
code-golf
number
arithmetic
base-conversion
binary
articuno
источник
источник
Ответы:
Pyth, 9 байт
x & (x*2) != 0
алгоритма у @alephalphaМоя первая попытка Pyth:
Попробуй здесь
источник
CJam,
1411 байтов3 байта сохранены благодаря DigitalTrauma.
Проверьте это здесь.
объяснение
Это оставляет последний номер в стеке, который автоматически печатается в конце программы.
источник
Python 2, 44 байта
Это полная программа на Python, которая читает на n и печатает ответ. Я думаю, что это довольно хорошо в субконкурсе читаемости.
Результаты теста:
источник
Pyth,
1211 байтовПопробуйте онлайн: Pyth Compiler / Executor .
источник
"11"
в`11
.Mathematica,
4130 байтСохранено 11 байтов благодаря Мартину Бюттнеру.
источник
Perl, 31
Или из командной строки:
источник
APL, 18 байт
Это оценивает монадическую функцию. Попробуй это здесь. Использование:
объяснение
источник
J, 20 знаков
Монадический глагол. Исправлено, чтобы подчиняться правилам.
объяснение
Во-первых, это глагол с пробелами, а затем чуть меньше в гольфе:
Читать:
Я в основном вычисляю, если
1 1
происходит в представлении base-2 ввода. Если это так, я увеличиваю ввод. Это ограничено по мощности, что означает, что оно применяется до тех пор, пока результат больше не изменится.источник
{⍵+∨/2∧/⍵⊤⍨⍵⍴2}⍣=
.Javascript,
2519Используя тот факт, что для 1-разреженного двоичного числа
x&2*x == 0
:источник
JavaScript (ES6), 39
43Нет регулярных выражений, нет строк, рекурсивно:
Итерационная версия:
Это очень просто, просто используя правое смещение, чтобы найти последовательность 11. Когда я нахожу ее, переходите к следующему номеру. Рекурсивная версия напрямую вытекает из итеративной.
Неуправляемый и более очевидный. В гольфе самая сложная часть - это объединение внутренней и внешней петель (при запуске нужно начинать с x до 3)
источник
%4>2
похоже на колдовство из теории чисел, не могли бы вы объяснить || предоставить ссылку?Python 2, 37 байт
Использовал логику
x & 2*x == 0
для 1-разреженного числа.Спасибо @Nick и @CarpetPython.
источник
JavaScript,
756662 байтаСпасибо Мартину Бюттнеру за сохранение 9 байтов и Pietu1998 за 4 байта!
Как это работает: он запускает
for
цикл, начиная сa + 1
тех пор, пока текущее число не является 1-разреженным, и если это так, цикл прерывается, и он возвращает текущее число. Чтобы проверить, является ли число 1-разреженным, он преобразует его в двоичное и проверяет, не содержит ли оно числа11
.Негольфированный код:
источник
Юлия, 40 байт
Это создает анонимную функцию, которая принимает одно целое число в качестве входных данных и возвращает следующее наибольшее 1-разреженное целое число. Чтобы назвать его, дайте ему имя, например
f=n->...
, и сделатьf(12)
.Ungolfed + объяснение:
Примеры:
Предложения и / или вопросы приветствуются как всегда!
источник
> <> (Рыба) , 31 + 3 = 34 байта
Использование:
3 байта добавлено для
-v
флага.источник
JavaScript (ECMAScript 6), 40
По рекурсии:
JavaScript, 56
То же самое без функций стрелок.
источник
Скала, 65 байт
(если требуется именованная функция, решение будет 69 байтов)
источник
Python,
3933 байтаПопробуйте это здесь: http://repl.it/gpu/2
В лямбда-форме (спасибо xnor за игру в гольф):
Стандартный синтаксис функции на этот раз
оказался короче лямбды!источник
f=lambda x:1+x&x/2and f(x+1)or-~x
. Оказывается, что из вас бит-сдвиг вправо, а не влево, вы можете использоватьx/2
вместо,(x+1)/2
потому что разница всегда в нулевых битахx+1
. Спецификация просит программу, хотя.Java, 33 байта.
Использует метод в этом ответе
TIO
источник
Руби, 44
Довольно простой. Лямбда с бесконечным циклом и регулярным выражением для проверки двоичного представления. Я желаю, чтобы
loop
получился и индекс.источник
Matlab (
7774 байта)Заметки:
m+1
до того2*m
, гдеm
находится вход.~any(x)
является ,true
еслиx
содержит все нули или еслиx
пустоисточник
C (32 байта)
Рекурсивная реализация того же алгоритма, что и многие другие ответы.
источник
Perl, 16 байт
Комбинируя
x&2*x
различные ответы (я думаю, что Ник первый) с выходами Nutkiredo
:Проверено в клубнике 5.26.
источник
Japt, 8 байт
Запустите его онлайн.
источник
Желе , 7 байт
Полная программа, принимающая одно неотрицательное целое число, которое печатает положительное целое число (в качестве монадической ссылки она выдает список, содержащий одно положительное целое число).
Попробуйте онлайн!
Как?
Начиная с
v=n+1
и увеличивая, удваивайте,v
чтобы сдвинуть каждый бит вверх на одно место, и побитовое И с,v
а затем выполните логическое НЕ, чтобы проверить,v
является ли 1-разреженным, пока не будет найдено одно такое число.источник
Stax , 5 байт
Запустите и отладьте его
Это работает, используя эту процедуру. Ввод начинается сверху стека.
источник