Есть умные способы определить, является ли число степенью 2. Это больше не интересная проблема, поэтому давайте определим, является ли данное целое число целой степенью -2 . Например:
-2 => yes: (-2)¹
-1 => no
0 => no
1 => yes: (-2)⁰
2 => no
3 => no
4 => yes: (-2)²
правила
Вы можете написать программу или функцию и использовать любой из стандартных методов получения ввода и предоставления вывода.
Ваши входные данные представляют собой одно целое число, а выходные данные должны быть истинным значением, если целое число представляет собой целую степень -2, а в противном случае - ложное значение. Другие выходные данные (например, предупреждающие сообщения) не допускаются.
Применяются обычные правила целочисленного переполнения: ваше решение должно быть в состоянии работать с произвольно большими целыми числами в гипотетической (или, возможно, реальной) версии вашего языка, в которой все целые числа не ограничены по умолчанию, но если ваша программа дает сбой на практике из-за реализации не поддерживает такие большие целые числа, что не делает решение недействительным.
Вы можете использовать любой язык программирования , но учтите, что эти лазейки по умолчанию запрещены.
Выигрышное условие
Это соревнование по коду для игры в гольф : ответ, имеющий наименьшее количество байтов (в выбранной вами кодировке), является победителем.
источник
i
такого, что(-2)^i = 2
-0.5
должны быть действительными, так как это 2 ^ (- 1) .i
как не естественноОтветы:
Mathematica, 22 байта
Попробуйте онлайн! (Использование Mathics вместо этого, где это решение также работает.)
Я некоторое время пытался найти решение с побитовыми операторами, и, хотя один из них определенно существует, я в итоге нашел что-то, что, вероятно, проще:
Max[#,-2#]
умножает входной сигнал на -2, если он отрицательный. Умножение на другой коэффициент -2 не меняет, является ли значение степенью -2 или нет. Но теперь все нечетные степени -2 были превращены в четные степени -2 .Log2@...
и проверить, является ли результат целым числом (чтобы проверить, является ли степень 2 ). Это уже экономит два байтаLog[4,...]
(еще один способ взглянуть на четные степени -2 ).EvenQ
вместоIntegerQ
.источник
Log[4,...]
он длиннееLog2@...
иIntegerQ
длиннееEvenQ
.Желе , 5 байт
Попробуйте онлайн!
Как это работает
источник
Python , 46 байт
-2 байта благодаря @ovs.
Функция с использованием:
Попробуйте онлайн!
источник
print g(8)
печатаетFalse
print g(4)
делает то же самое;
вместо новой строки ... извините за это. Исправлено @FelipeNardiBatistaЖеле , 6 байт
Попробуйте онлайн!
Это основано на том, как Jelly преобразует целое число N в любое произвольное основание B , делая это путем преобразования N в массив, в котором каждое целое число представляет собой цифру d из ( N ) B , которая может иметь значение 0≤ V d < B , Здесь мы будем 0-индексные цифры с правой стороны , так что каждая цифра добавляет V d B D с образованием N . V d < B ⇔ V d B d < BB d = B d +1 , поэтому все возможные Nимеет только одно уникальное представление, если игнорировать ведущие 0 в ( N ) B .
Здесь d = вход, B = -2. N = B d = 1 B d = V d B d ⇔1 = V d ⇔ V d = 1 и, так как мы не добавляя никаких других кратные полномочий B , каждый V будет 0. В настоящее время, массив должен быть 1 соединен с d 0s. Поскольку Jelly 1-indexs слева, мы должны проверить, равен ли 1-й элемент массива 1, а все остальные элементы - 0.
Хм ... все хорошо, верно? Нет? В чем дело? О да, у меня есть идея получше! Во-первых, давайте возьмем сумму всех целых чисел в массиве, рассматривая ее как массив целых чисел, а не число в базе -2. Если это 1, это означает, что есть только один 1, а все другие целые числа равны 0. Так как не может быть начальных нулей, кроме случая 0 -2(где сумма будет 0 ≠ 1 в любом случае), 1-е целое число должно быть ненулевым. Единственное ненулевое целое число в массиве - это 1, поэтому оно должно быть первым. Следовательно, это единственный случай, когда сумма всех целых чисел в массиве будет равна 1, поскольку наименьшая возможная сумма пары натуральных чисел равна Σ {1,1} = 2, поскольку наименьшее натуральное число равно 1 Каждое целое число в базовом представлении неотрицательно, поэтому единственный способ, которым сумма равна 1, состоит в том, чтобы иметь только один 1, а все остальные целые числа равны 0. Поэтому мы можем просто проверить, является ли сумма всех целых чисел в массив равен 1.
Вот что делает код:
источник
Python 2 ,
353432 байтаПопробуйте онлайн!
источник
Python 2 ,
9850 байтПопробуйте онлайн!
источник
Excel,
4036 байтСохранено 4 байта с помощью CallumDA
Excel, конечно, может это сделать, но исправление ошибок добавляет 11 байтов
Вход находится в ячейке
A1
. ВыводTRUE
илиFALSE
Если было разрешено возвращать либо ошибку,
FALSE
либо#NUM!
ошибку для ложных значений, это было бы только 25 байтов:источник
=IFERROR(-2^IMREAL(IMLOG2(A1)),1)=A1
05AB1E , 8 байтов
Попробуйте онлайн! или как тестовый набор
объяснение
источник
ÄLY(småO
за 8.Y(sÄLm¢Z
за 8 ... фигу, все 8.JavaScript (ES6),
37 2824 байтаСохранено 4 байта благодаря Арно.
источник
C (gcc) ,
3429 байтПопробуйте онлайн!
источник
MATL ,
98 байтПопробуйте онлайн! Или проверьте все тестовые случаи .
Как это работает
Рассмотрим ввод
-8
в качестве примераисточник
n
, это создает массив размераn
в качестве промежуточного шага. Хорошая работа, что эффективность не является критерием здесь!Октава , 28 байт
Это определяет анонимную функцию. Подход похож на мой ответ в MATL.
Попробуйте онлайн!
источник
PHP, 41 байт
PHP, 52 байта
PHP, 64 байта
Работа с регулярным выражением
источник
Python 3, 34 байта
источник
JavaScript (ES6), 21 байт
Рекурсивная функция, которая возвращает
0
илиtrue
.Как это работает
Это не включает в себя какой-либо явный тест - например,
n
быть нечетным илиabs(n)
быть меньше единицы - чтобы остановить рекурсию рано, когда ввод не точной степени -2.Мы выходим только тогда, когда
n
оно точно равно1
или0
.Однако это работает, потому что любое число с плавающей запятой IEEE-754 в конечном итоге будет округлено до
0
деления на 2 (или -2) достаточных раза из-за арифметического занижения .Контрольные примеры
Показать фрагмент кода
источник
C (gcc) , 33 байта
Попробуйте онлайн!
источник
Java 7, 55 байт
Объяснение:
Тестовый код:
Попробуй это здесь.
Выход:
источник
boolean c(int n){while(0==n%-2)n/=-2;return 1==n;}
.n=0
в Java это не работает , потому что0%-2==0
будетtrue
и0/-2
будет0
вызывать бесконечный цикл, поэтому я добавил этуn==0?0>1
часть в свой рекурсивный метод.Haskell,
2423 байтаОпределяет функцию,
f
которая возвращает1
для степеней -2 и0
противном случае.Гольф версия моего первого представления на другой вызов .
источник
Javascript (ES7), 45 байт
источник
**
есть.Perl 6 , 21 байт
Попытайся
Expanded:
Обратите внимание, что
0.lsb
возвращается,Nil
который выдает предупреждение при использовании в качестве числа, поэтому используется определенный или оператор//
.(Думать о
//
, как||
с другим уклоном)Вызов метода без инвоканта, где ожидается термин, неявно вызывается
$_
. (.lsb
)Также работает с
.msb
.источник
Пролог (SWI) , 44 байта
Онлайн переводчик
источник
Python , 24 байта
Попробуйте онлайн!
Битовый трюк
k&k-1==0
проверяет,k
является ли степень 2 (илиk==0
). Проверка этогоk=n*n
какn*n&n*n-1==0
говорит нам,abs(n)
является степень 2.Чтобы увидеть, если
n
это сила -2, нам нужно только проверить, чтоn%3==1
. Это работает, потому что mod 3, значение -2 равно 1, поэтому его полномочия равны 1. Напротив, их отрицания равны 2 mod 3, и, конечно, 0 дает 0 mod 3.Мы объединяем чеки
n*n&n*n-1==0
иn%3==1
в одно выражение. Первое можно записать с помощью<1
for==0
, поскольку оно никогда не бывает отрицательным.n%3==1
Эквивалентноn%3%2
, что дает 0 или 1. Таким образом, мы можем объединить ихn*n&n*n-1<n%3%2
.источник
R, 22 байта
Принимает ввод из стандартного ввода, возвращает
TRUE
или,FALSE
соответственно.Я не уверен на 100%, что это правильный ответ, так как он работает только для целых чисел вплоть до предела размера R, и если целые числа не ограничены, он не будет работать. Тем не менее, правила гласят:
В гипотетическом варианте R , который действительно позволяет неограниченные целые числа, то мы могли бы использовать следующий код, для того же счетчику байтов:
Конечно, в реальном R приведенный выше код просто дает
Error in 0:Inf : result would be too long a vector
.источник
до 88 байтов
У меня есть это в файле,
neg2.sh
и он печатает1
для полномочий-2
и в0
противном случаеЯ знаю, что это действительно долго, но это было весело
Тест
объяснение
Основное тело имеет две половины, обе пытаются равняться нулю для степеней
-2
.источник
Юлия 0,5 , 20 байт
Попробуйте онлайн!
источник
Фурье , 53 байта
Я поработаю над гольфом позже, но в общих чертах это так:
Где выход
0
для falsey и1
для truthy .Попробуйте онлайн!
источник
(G*G > X)*X
Casio BASIC , 76 байт
Обратите внимание, что на моем калькуляторе 76 байтов.
Это мое первое предприятие в Casio BASIC ... Я так и не понял, что могу написать такие приличные программы на калькуляторе: D
источник
Python 2.7, 40 байт
Кредиты Mr. Xcoder для оригинального кода длиной 43 байта. Пришлось публиковать отдельный ответ, так как у меня недостаточно репутации, чтобы комментировать.
источник
int(input())
что превысило бы пределdef
подобная функция. Кроме того, в Python 3, вы должны использовать,print()
который будет потрачен впустую 1 байт. Вот почему я выбрал этот путь, потому что в Python 3 он становится длиннее ...Сетчатка , 27 байт
Попробуйте онлайн!
Принимает ввод в унарном виде, что довольно стандартно для Retina. Первые две строки выполняют частичное унарное преобразование в двоичное на основе первых двух строк кода из записи Учебника (любые посторонние
1
s в любом случае приведут к сбою сопоставления), в то время как последняя строка проверяет степень четыре или отрицательную нечетную степень из двух.Попробуйте онлайн!
На этот раз я делаю частичное унарное преобразование в основание четыре. Сила четырех заканчивается так же,
^1_*$
как отрицательные нечетные силы двух заканчиваются как^-11_*$
.Попробуйте онлайн!
На этот раз я просто делю на четыре столько, сколько могу, и проверяю
1
или-11
в конце.Попробуйте онлайн!
Еще один способ деления на четыре. И все равно досадно 27 байт ...
источник
Схема, 60 байт
Рекурсивное решение.
источник