Ваша задача, если вы решите ее принять, состоит в том, чтобы, учитывая целое число K >= 1
, найти неотрицательные целые числа A
и выполнить так, чтобы выполнялось B
хотя бы одно из двух следующих условий:
K = 2^A + 2^B
K = 2^A - 2^B
Если не существует таких A
и B
ваша программа может вести себя любым способом. (Чтобы уточнить, A
и B
может быть равным.)
Контрольные примеры
Часто существует несколько решений для числа, но вот несколько:
K => A, B
1 => 1, 0
15 => 4, 0 ; 16 - 1 = 15
16 => 5, 4 ; 32 - 16 = 16; also 3, 3: 8 + 8 = 16
40 => 5, 3 ; 2^5 + 2^3 = 40
264 => 8, 3
17179867136 => 34, 11 ; 17179869184 - 2048 = 17179867136
Последний тест, 17179867136
, должны работать менее чем за 10 секунд на любой относительно современной машины. Это код гольфа, поэтому выигрывает самая короткая программа в байтах. Вы можете использовать полную программу или функцию.
16
, и так5,4
и3,3
в силе.A
,B
быть отрицательным? (например,-1, -1
для 1)Ответы:
Желе ,
1110 байтПрименение трюка с трюком из ответа Python от @xnor
Протестируйте его в TryItOnline
Все тестовые примеры также есть в TryItOnline
Как?
источник
Python 2, 43 байта
Скажи это
n==2^a ± 2^b
сa>b
. Тогда наибольший коэффициент степени 2n
равен2^b
, и мы можем найти его, используя хитрость2^b = n&-n
. Это позволяет нам вычислять2^b + n
, что равно2^a + 2 * 2^b
или просто2^a
. Любой из них имеет такую же длину в битах, как иa
*. Итак, мы выводим битовые длиныn&-n
и(n&-n)+n
, вычисленные по длинам их двоичных представлений. Python 3 на один байт длиннее для пареновfor k in(n,0)]
.* Кроме того, что
2^a + 2^b
сa==b+1
имеет одну длинную битовую длину, но это нормально , потому что мы можем интерпретировать это , как2^(a+1)-2^b
.источник
n=4
или8
или16
пожалуйста.f(2**n)
возвращается(n+1,n)
и2**(n+1)-2**n=2**n
поэтому проблем нет.bin()
в Python?0b
, отсюда и-3
.JavaScript (ES6), 73 байта
Для случая вычитания первое число - это количество цифр в двоичном представлении, а второе число - это число завершающих нулей. Для случая сложения вычитаем 1 из первого числа. Если двоичное представление - все 1 с, сопровождаемые некоторыми 0, тогда случай сложения принимается, в противном случае принимается случай вычитания. 36-байтовый порт версии @ xnor, которая работает только для B≤30 в JavaScript:
источник
n=>[n,0].map(k=>((n&-n)+k).toString(2).length-1)
обе версии возвращаются[34,11]
в последнем тестовом примере (я использую FF 48).Perl,
524932 байтаСтарое решение (49 байт)
Включает +1 для
-p
Внесите свой вклад в STDIN:
pow2.pl
Однако использование алгоритма xnor и добавление кручения дает 32 байта:
Просто код:
Это страдает от серьезной ошибки округления, потому что
13/9 = 1.444...
она немного выше1/log 2 = 1.44269...
(log
сама по себе также имеет ошибку округления, но она настолько меньше, что мы можем ее обернуть при анализе 13/9). Но так как любое2**big - 2** small
исправляется2** big
до журнала, это не имеет значения, и вычисление для2**big + 2 * 2**small
сокращается, поэтому также безопасно. И на другой стороне диапазона2**n+2**(n-1)
не увеличивается достаточно в диапазоне[0,64]
(я не могу должным образом в любом случае поддерживать больше, чем целочисленный диапазон из-за использования&
), чтобы привести к неверному результату (1.5
однако, для большого числа множитель будет слишком далеко).источник
Брахилог , 23 байта
Попробуйте онлайн!
Это намного быстрее, чем требуется, например, это все еще меньше 10 секунд на TIO .
объяснение
Это в основном прямая транскрипция формулы без оптимизации:
источник
Python, 69 байт
Тесты на Ideone
Поскольку недопустимый ввод может делать все что угодно, мы знаем, что если для входа задано ровно 2 бита, то это сумма этих двух степеней 2, а в противном случае (если они действительны) это будет цикл с некоторым количеством битов (включая возможность только 1 бит) и будет разница между следующей наивысшей мощностью 2, чем MSB и набор LSB.
источник
JAVA 7,
142,140134 БАЙТАЭто мой первый пост на PPCG! Я был бы очень признателен за отзывы на гольф Подсказок
Благодаря замороженный для сохранения 2 байта
UNGOLF
ideone
источник
40=2**3+2**5
, например. Глядя на это, я не понимаю, почему нет, может быть, я допустил ошибку транскрипции ...1
вместо объявления переменной для него?for(int i=-1,j;[...]
Mathematica,
5754 байтаСохранено 3 байта благодаря LegionMammal978!
Фактически распечатывает все 1 соответствующие пары {a, b}.
2Log@#+1
верхняя граница для наибольшего значения,a
которое может появиться при представлении ввода#
(жесткая верхняя граница - это Log [2 #] / Log [2] = 1,44 ... Log [#] + 1). Работает практически мгновенно на тестовом вводе и менее чем за четверть секунды (на моем новом, но стандартном компьютере) на 100-значных входах.1 Разрешение
a
начать со значения по умолчанию 1 вместо 0 сохраняет два байта; он пропускает выход {0,0}, когда на входе 2, но находит выход {2,1} в этом случае, что достаточно хорошо.источник
If[Abs[2^a-#]==2^b,Print@{a,b}]
может быть заменен на,Abs[2^a-#]==2^b&&Print@{a,b}
чтобы сохранить 3 байта.)MATL ,
2322 байтаПопробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Perl 6 , 41 байт
(Алгоритм бесстыдно скопирован из ответа Perl 5 )
Объяснение:
Использование:
источник
PHP, 73 байта
Я мог бы скопировать решение Джонатана Pyhton 2 для 54 байтов (+13 служебных данных),
но хотел придумать что-то другое.
сохранить в файл, затем выполнить с помощью
php
илиphp-cgi
.печатает
a
иb
разделяется подчеркиванием, что-либо без решения.отличительное решение, 96 байт
печатает
a
иb
разделяется подчеркиванием; единственное подчеркивание без решения.Он даже сообщает об операции для еще 11 байтов:
просто замените первое подчеркивание в коде на
'-+'[!$m[2]]
.источник
PHP, 117 байт
Расширенная версия 4 случая
укороченная версия объединяет Варианты 1 и 3 и имеет значение для Варианта 3, и в обеих версиях Вариант 4 не дает выходных данных.
источник