Вступление
Эта задача требует от вас установить конечные нули двоичного представления целых чисел 010101…
, это лучше всего объяснить на примере:
Учитывая целое число 400
, первый шаг должен преобразовать это в двоичный файл:
110010000
Как мы видим, пятый бит является наименее значимым 1
битом, поэтому начиная с него мы заменяем младшие нули на 0101
:
110010101
Наконец, мы конвертируем это обратно в десятичное: 405
Вызов
Дано целое положительное число вернуть / вывести соответствующее результирующее значение определенного выше процесса.
правила
- Эта последовательность определена только для целых чисел хотя бы с одним
1
битом, поэтому входное значение всегда будет ≥ 1 - Вы можете взять ввод в виде строки, список цифр (десятичных) вместо
- Вам не нужно обрабатывать неверные данные
Testcases
Вот еще несколько тестов с промежуточными шагами (их не нужно распечатывать / возвращать):
In -> … -> … -> Out
1 -> 1 -> 1 -> 1
2 -> 10 -> 10 -> 2
3 -> 11 -> 11 -> 3
4 -> 100 -> 101 -> 5
24 -> 11000 -> 11010 -> 26
29 -> 11101 -> 11101 -> 29
32 -> 100000 -> 101010 -> 42
192 -> 11000000 -> 11010101 -> 213
400 -> 110010000 -> 110010101 -> 405
298 -> 100101010 -> 100101010 -> 298
n
максимальная сила 2, которая делит вход, то ответ прост(input) + ceil((2^n - 2)/3)
Ответы:
Python 3 , 20 байт
Попробуйте онлайн!
объяснение
Взять хотя
192
бы пример. Его двоичная форма есть11000000
, и нам нужно преобразовать его в11010101
.Отметим, что нам нужно добавить
10101
к числу. Это геометрический ряд (4^0 + 4^1 + 4^2
), который имеет замкнутую форму как(4^3-1)/(4-1)
. Это то же самое, что и4^3//3
где//
обозначает целочисленное деление.Если бы это было так
101010
, то это все равно был бы геометрический ряд (2×4^0 + 2×4^1 + 2×4^2
), что2×4^3//3
по причинам, указанным выше.Во всяком случае,
4^3
и2×4^3
будет просто наименее значимым битом, который мы получаем с помощьюn&-n
:Мы замечаем, что дополнением
n
является00111111
. Если мы добавим один, он станет01000000
, и он будет перекрываться только сn=11000000
самой младшей цифрой. Обратите внимание, что «дополнить и добавить один» это просто отрицание.источник
lambda n:(n&-n)//3+n
тоже работает? Проходит все тестовые примеры , но, по моей интуиции, оно не должно быть действительным, верно?Желе , 5 байт
Попробуйте онлайн!
На этот раз подход Лики Нун (по крайней мере, я немного помог ему в этом: P)
Желе , 7 байт
Попробуйте онлайн!
Использует фантастический подход JungHwan Мин при косвенной помощи от Мартина Эндера .
источник
&N:3|
. Поздравляем; ты победил Денниса в желе! (Но не совсем вне игры в гольф.)Wolfram Language (Mathematica) ,
36282624 байта-8 байтов благодаря @MartinEnder и -2 байта благодаря @ Mr.Xcoder
Попробуйте онлайн!
Нам нужно только найти число конечных нулей на входе, найти число с чередующимися
0
s и1
s длиной на единицу меньше, и добавить его к входу.Так,
400 -> 11001000 -> 110010000 + 0000 -> 110010101 + 101 -> 405
Явная формула для
n
числа с чередованием1
s и0
s была дана в A000975 в OEIS. Мы можем использовать числоn
th, поскольку никакие два разных числа не могут иметь одинаковую длину в двоичном коде и иметь чередующиеся цифры.источник
2^#~IntegerExponent~2
это(BitXor[#,#-1]+1)/2
#+⌊(#~BitAnd~-#)/3⌋&
вместо этого.J ,
1918 байтПопробуйте онлайн!
Быстрое объяснение
Это старый ответ, но по природе он очень похож на текущий, он просто по-разному учитывает конечные нули. Смотрите комментарии для ссылки, объясняющей, как это работает.
Другие ответы:
Предыдущий ответ (19 байт).
Дольше, чем должно быть, потому что
\
идет справа налево.источник
+(2|-.i.@#.-.)&.#:
#.~
подсчитывает количество конечных истин , поэтому нам нужно#.~ -. #:
посчитать количество конечных нулейЮлия 0,6 , 12 байт
Попробуйте онлайн!
источник
((!n=(n|n))&-n)/3
, и!n=(((n|n)&(-n))/3)
т. Д.|
он похож+
и&
похож*
. Поэтомуn|n&-n÷3
разбирается какn | ((n&-n) ÷3)
.JavaScript (ES6),
4039 байтПринимает ввод как 32-разрядное целое число.
Контрольные примеры
Показать фрагмент кода
источник
05AB1E ,
1385 байтСохранено 5 байтов благодаря аккуратной формуле Mr. Xcoder и JungHwan Min.
Сохранено еще 3 благодаря Mr. Xcoder.
Попробуйте онлайн!
объяснение
источник
(<bitwise and here>3÷+
должно работать на ~ 5 байтов.R ,
7158 байтспасибо NofP за -6 байт
Попробуйте онлайн!
Предполагается, что ввод является 32-разрядным целым числом. R в
double
любом случае имеет только 32-разрядные целые числа со знаком (приведение к нему происходит при переполнении целого числа) и 64-разрядные или беззнаковые целые числа отсутствуют.источник
which.max(n):1-1
чтобы!cumsum(n)
получить 65-байтовое решениебрейкфук , 120 байт
Попробуйте онлайн!
Начинается со значения в текущей ячейке и заканчивается в ячейке с выходным значением. Очевидно, не будет работать с числами выше 255, поскольку это предел ячеек для типичного мозгового слуха, но сработает, если вы предполагаете бесконечный размер ячейки.
источник
PowerShell , 168 байт
Попробуйте онлайн!
Уч. Преобразование в / из двоичного кода и нарезка массивов не являются сильными сторонами PowerShell.
Вводит
$n
в виде числа. Мы немедленноconvert
отправляем двоичную базу2
и сохраняем ее в$a
. Далее у нас есть конструкция if / else. Предложение if проверяет, имеет ли a значениеregex
Match
против 1 или более0
s в конце строки ('0+$'
)index
в месте, большем чем0
(т. Е. В начале двоичной строки). Если это так, у нас есть с чем поработать,else
мы просто выводим число.Внутри
if
мы срезаемx
первые цифры и объединяем+
их с оставшимися цифрами. Тем не менее, для оставшихся цифр мы перебираем их и вместо этого выбираем либо a,0
либо1
вывод, используя$i++%2
для выбора. Это дает нам010101...
шаблон вместо0
s в конце. Затем мы-join
возвращаем это обратно в строку и$c
превращаем обратно вInt32
базу2
.В любом случае число остается в конвейере и вывод неявен.
источник
APL + WIN, 43 байта
Подсказки для ввода с экрана
источник
PowerShell ,
4136 байтПопробуйте онлайн! или проверить все контрольные примеры
Порт Лики Нун Python ответ .
Сохранено 5 байтов благодаря Leaky Nun
источник
PHP , 47 байт
Попробуйте онлайн!
На самом деле просто еще один порт решения @Leaky Nun
источник
Perl 5 , 54 байта
Попробуйте онлайн!
источник
Python 3 , 56 байт
Попробуйте онлайн!
Пока не очень доволен этим, но я действительно не хотел использовать формулу ... -2 благодаря Роду . -1 спасибо Джонатану Фреху .
источник
eval(...)
вместо того,int(...,2)
чтобы сохранить байт.Рубин , 15 байт
Еще один порт подход Лики Нун.
Попробуйте онлайн!
источник
Ржавчина , 18 байт
Подход Лики Нун
Попробуйте онлайн!
источник
AWK , 24 байта
Порт ответа JungHwan Min's Mathmatica
Попробуйте онлайн!
источник
JavaScript ES6, 13 байт
источник
C, 56 байтов
Попробуйте онлайн!
C (gcc), 50 байтов
Попробуйте онлайн!
5148 байтов , используя решение Arnauld в :Спасибо @ l4m2 за сохранение трех байтов!
Попробуйте онлайн!
43 с gcc:
Попробуйте онлайн!
источник
0xAAAAAAAA
=>-1u/3*2
Pari / GP , 19 байт
Подход Лики Нун.
Попробуйте онлайн!
источник
Желе , 13 байт
Попробуйте онлайн!
объяснение
Возьмем 24 в качестве примера ввода.
источник