Напишите программу, которая проверяет, является ли целое число степенью 2.
Пример ввода:
8
Образец вывода:
Yes
Пример ввода:
10
Образец вывода:
No
Правила:
Не используйте
+
,-
операции.Используйте какой-нибудь поток ввода, чтобы получить число. Входные данные не должны изначально храниться в переменной.
Самый короткий код (в байтах) выигрывает.
Вы можете использовать любой ответ «ложь / ложь» (например, true
/ false
). Вы можете предположить, что номер ввода больше, чем 0
.
pred
Функция, когда применяется к целому числу п, п - возвращает 1. Существуют такие функции, как это, которые являются тонкими маскирует вокруг запрещенного оператора, также запрещено?)
или в большинстве языков на основе c '--
.Ответы:
GolfScript, 6 символов, без уменьшений
Вот решение, которое не использует
x & (x-1)
метод в любой форме. Он используетx & (x/3)
вместо этого. ;-) Выводит,0
если false,1
если true.Объяснение:
~
обнуляет входную строку, чтобы превратить ее в число,.
дублирует его (для последующего&
),3/
делит его на три (обрезая),&
вычисляет побитовое И деленного значения с оригиналом, которое будет равно нулю тогда и только тогда, когда входное значение равно нулю или степени два (т. е. установлен не более одного бита), и!
логически отрицает это, отображая ноль в одно, а все остальные значения в ноль.Заметки:
Согласно разъясненным правилам, ноль не является допустимым вводом , поэтому этот код в порядке, даже если он выводит,
1
если ввод равен нулю.Если разрешен оператор декремента GolfScript
(
, то достаточно 5-символьного решения,~.(&!
размещенного aditsu . Однако, похоже, что это противоречит духу правил , если не букве.Я придумал эту
x & (x/3)
хитрость несколько лет назад в списке рассылки Fun With Perl. (Я уверен, что я не первый, кто обнаружил это, но я (заново) изобрел его самостоятельно.) Вот ссылка на оригинальный пост , включая доказательство того, что он действительно работает.источник
7/3 = 2 (0010)
, так7 & 2 = 0111 & 0010 = 0010
что явно последний бит не 1APL (7)
Да, это 7 байтов . Предположим на данный момент, что я использую кодовую страницу IBM 907 вместо Unicode, и тогда каждый символ является байтом :)
т.е.
0 = mod(log(input(),2),1)
источник
Indeterminate
когда я пытаюсь это сделать.GolfScript, 11 (для 1 (true) и 0 (false))
Поместите число в стек и затем бегите.
GolfScript, 22 (для Да / Нет)
Мне нравится, как преобразование
1
/0
вYes
/No
занимает столько же кода, сколько и сам вызов: DПредупреждение: ЧРЕЗВЫЧАЙНО неэффективно;) Он отлично работает для чисел до 10000, но как только вы достигнете такого высокого уровня, вы начнете замечать небольшое отставание.
Объяснение:
.,
: превращаетсяn
вn 0..n
(.
дубликат,,
диапазон 0..n){2\?}
: к силе 2%
: отобразить "мощность 2" на "0..n", чтобы оно сталоn [1 2 4 8 16 ...]
?0>
: проверяет, содержит ли массив число (0 больше индекса)источник
.,{2\?}%?0<'YesNo'3/=
:; также я думаю, что вы обманываете, спрашивая «Поместите число в стек», вы должны начать с~
.Mathematica 28
Для целых степеней 2, числитель логарифма с основанием 2 будет 1 (это означает, что логарифм является дробной единицей).
Здесь мы немного изменим функцию, чтобы отобразить предполагаемый ввод. Мы используем
#
вместоInput[]
и добавить,&
чтобы определить чистую функцию. Он возвращает тот же ответ, который будет возвращен, если пользователь введет число в вышеуказанной функции.Тестирование нескольких номеров одновременно.
источник
Perl 6 (17 символов)
Эта программа получает строку из
get
функции STDIN , вычисляет логарифм с основанием 2 на нем (log(2)
) и проверяет, делится ли результат на 1 (%%1
где%%
делится на оператор). Не так коротко, как решение GolfScript, но я нахожу это приемлемым (GolfScript все равно выигрывает), но намного быстрее (даже учитывая, что Perl 6 сейчас медленный).источник
+
и-
запрещены для этой задачи, заключается в том, что еслиx & (x - 1)
равен равен0
, тоx
имеет степень 2.x&~(~0*x)
все еще работает. Это всего на 2 символа длиннее.Октава (
1523)РЕДАКТИРОВАТЬ: Обновлено из-за требования ввода пользователя;
Позволяет пользователю ввести значение и вывести 1 для true, 0 для false.
Протестировано в Octave, должно работать и в Matlab.
источник
Р,
1311Основано на решении Perl. Возвращает
FALSE
илиTRUE
.Параметр
i
представляет входную переменную.Альтернативная версия с пользовательским вводом:
источник
GolfScript, 5
Выходы 1 для истины, 0 для ложных. Основано на идее user3142747:
Примечание:
(
это декремент, надеюсь, он не считается как-
:).Если это так (и комментарии ОП предполагают, что это возможно), пожалуйста, обратитесь к решению Илмари Каронена .
Для вывода Y / N добавьте
'NY'1/=
в конце (еще 7 байтов).источник
Python, 31
источник
bin(input()).rfind('1')<3
2==
потому что я полагал, что это должно работать и для неположительных чисел. Это явно не требуется правилами, так что ...print bin(input()).count('1')<2
в общей сложности 31 символов, но это слишком похоже на ваш.С, 48
источник
*
имеет более высокий приоритет, чем двоичный&
, вам не нужны парены. И если возвращаемое значение принимается (только что спросил)exit(x&x*-1)
будет намного короче.-
:x*-1
.-
запрещен только оператор .Я решил использовать другой подход, основанный на подсчете численности населения или поперечной сумме числа (число 1-бит). Идея состоит в том, что все степени двух имеют ровно один
1
бит, а никакое другое число не имеет. Я добавил версию JavaScript, потому что нашел ее забавной, хотя она, безусловно, не выиграет ни одного соревнования по гольфу.J,
1415 символов (выходы 0 или 1)JavaScript, 76 символов (выводит true или false)
источник
Зажим ,
987Читает число из стандартного ввода.
Объяснение:
Начнем с,
Z
=0
,W
=2
иO
= 1. Это позволяет размещатьW
иO
рядом друг с другом, тогда как использование2
и1
будет интерпретироваться как число 21 без разделительного пробела (нежелательный дополнительный символ). В Clip функция modulo (%
) работаетv
с нецелыми числами, поэтому, чтобы определить, является ли какое-либо значение целым числом, вы проверяете, является лиv
mod 1 = 0. Используя синтаксис Clip, это записывается как=0%v1
. Тем не менее, поскольку булевы значения хранятся как1
(или что-то еще), и0
проверка, что-то равно,0
просто «не» это. Для этого у Клипа есть!
оператор. В моем кодеv
естьlnx2
.x
это вход от стандартного ввода,n
преобразует строку в число иlab
является основойb
журналаa
. Программа поэтому переводит (более читабельно) в0 = ((log base 2 of parseInt(readLine)) mod 1)
.Примеры:
выходы
а также
выходы
Редактировать 1: заменить
0
,1
и2
сZ
,O
иW
.Изменить 2: заменено
=Z
на!
.Также:
Пиф , 5
Сжимает версию Clip еще больше, так как Pyth имеет Q для уже оцененного ввода и функцию log2 (a) вместо обычного log (a, b).
источник
Javascript (37)
Простой скрипт, который просто делит на 2 несколько раз и проверяет остаток.
источник
for
циклом (также 37 символов)for(i=prompt();i>1;i/=2){}alert(i==1)
Математика (21)
Без ввода это немного короче
источник
⌊#⌋==#&@Log2@Input[]
Log2@Input[]~Mod~1==0
.JavaScript,
4140 символовКак это работает: вы берете логарифм по основанию 2, используя
l(prompt()) / l(2)
, и если этот результат по модулю 1 равен нулю, то это степень 2.Например: взяв логарифм 8 на основе
2
, вы получите3
.3 modulo 1
равно 0, так что это возвращает истину.Взяв логарифм 7 на основании 2, вы получите
2.807354922057604
.2.807354922057604 modulo 1
равно0.807354922057604
, так что это возвращает ложь.источник
Math.log
будет делать это уже : «Каждая из следующих функций объекта Math применяет абстрактный операторJavaScript, 35
Работает на байты.
46-символьная версия , работает для 16-битных чисел.
Трюк работает в большинстве динамических языков.
Объяснение: Преобразовать число в основание 2, интерпретировать эту строку как основание 10, выполнить по модулю 9, чтобы получить сумму цифр, которая должна быть 1.
источник
0x2ff
, что в базе 21111111111
?+1
,!alert(!(Number.MAX_VALUE%prompt()))
Perl 5.10+, 13 + 1 = 14 символов
Использует тот же метод из старого потока FWP, что и моя запись GolfScript . Печатает,
1
если на входе есть степень двойки, а в противном случае - пустая строка.Нужно бежать с
perl -nE
;n
стоит один дополнительный символ , в общей сложности 14 символов. Кроме того, вот 18-символьная версия, которая не нуждается вn
:источник
питон 3, 38
питон, 32
Тем не менее, код не работает в каждой версии.
Обратите внимание, что решение работает и для 0 (выведите False).
источник
==
на&
?Рубин - 17 символов (четвертая попытка)
Мой лучший результат - это слияние ответа @ steenslag с моим собственным. Ниже приведены мои предыдущие попытки.
Рубин - 19 символов (третья попытка)
Рубин - 22 символа (вторая попытка)
Рубин - 24 символа (первая попытка)
источник
К / Кона (
2417)Возвращает 1, если истина, и 0, если ложь. Любая степень 2 имеет один бит, равный 1:
(это распечатывает все степени 2 (от 0 до 9) в двоичном виде)
Итак, я суммирую все компоненты двоичного выражения
x
и посмотрим, равно ли оно 1; если да, тоx=2^n
нет.... знал, что могу сделать его меньше
источник
C # (54 символа)
источник
Int32
, а неToInt32
...int
вместоInt32
2 символов меньше.Ребму (9 символов)
Тест
Rebmu - сжатый диалект Rebol. Код по сути:
альтернатива
14 символов - у Ребму нет разбитого по кусочкам И ~
В Реболе:
источник
GTB , 46 байт
источник
Python, 35
Не использует не только +/- операции, но и любые математические операции, кроме преобразования в двоичную форму.
Другие вещи (интересные, но не для конкурса):
У меня также есть версия регулярного выражения (61) :
(Идея нравится, но функция импорта и сопоставления делает ее слишком длинной)
И хорошая, но скучная битовая версия операций (31) :
(да, он короче, но для декремента используется ~ -x - операция)
источник
Python 2,7 (
30293937)РЕДАКТИРОВАТЬ: Обновлено из-за требования ввода пользователя;
Грубая сила, попробуйте разделить до = 1 (успех) или <1 (неудача)
источник
not a%2
можно записать какa%2==0
. Конечно, это будет длиннее во многих языках, но не в Python.a%2<1
.2.
удаления у вас есть пробел , который сохранит байт!Python (33)
источник
int(bin(input()*2)[3:])<1
также работает из оболочки Python только с 25 символами.Руби,
33,28, 25источник
APL (12 для 0/1, 27 для да / нет)
или, если мы должны вывести текст:
Прочитайте в A. Сформируйте вектор 0..A, затем вектор 2 0 ..2 A (да, это намного больше, чем необходимо), затем вектор, сравнивающий A с каждым из них (в результате получается вектор из 0 и самое большее один 1), затем xor это (в APL нет оператора xor, но ≠, примененный к логическим значениям, будет действовать как единое целое.) Теперь у нас есть 0 или 1.
Чтобы получить ДА или НЕТ: умножьте 0 или 1 на 3, отбросьте это количество символов из «ДА», а затем возьмите первые 3 символа.
источник
C 65 байт
источник
main(k){...
неявнуюint
типизацию. Это может быть UB, но это код гольф. НИКОГДА не используйте что-то подобное в производстве, конечно.Хаскелл (
5250)источник