Двоичное представление числа это палиндром или нет?

16

Напишите полную программу, чтобы узнать, является ли двоичное представление числа палиндромом или нет?

Sample Input
5

Sample Output
YES

Выведите, YESесли двоичное представление является палиндромом и NOиначе.

fR0DDY
источник
Каким должен быть вывод, когда это не палиндром?
Догберт
@ Dogbert Это должно быть "НЕТ" без кавычек.
fR0DDY
Откуда ты знаешь, что это палиндром? Потому что значения от первого ненулевого до конца «строки» являются палиндромными? Это пахнет очень плохо для меня, как вызов.
Jcolebrand
1
Хотя я и отвечаю <3 gnibbler, на самом деле это не самое короткое решение, и любой вопрос с тегом [code-golf] должен выбрать самое короткое решение в качестве победителя.
Крис Шутер-Янг
Ввод дан как?
Джои

Ответы:

24

Python - 46 символов

n=bin(input())[2:]
print'YNEOS'[n!=n[::-1]::2]
gnibbler
источник
Вау. Что делает [n!=n[::-1]::2]?
Догберт
2
@ Dogbert, n [:: - 1] - это срез. Начальный и конечный индексы пусты, поэтому это означает целую строку. Размер шага равен -1, поэтому, когда вы видите [:: - 1], это короткий способ перевернуть строку / список и т. Д. Так что n! = N [:: - 1] - это Истина (т. Е. 1), когда n не палиндром. Поэтому, когда n - палиндром, вы получаете 'YNEOS' [0 :: 2] - начинайте с 0 и берите каждый второй символ. Когда n не является палиндромом, вы получаете 'YNEOS' [1 :: 2] - начинайте с 1 и берите каждый второй символ :)
gnibbler
Я думаю, что люди голосуют за уловку среза :), правильно. : P +1
st0le
4

Руби, 41 39

$><<%w(YES NO)[(n="%b"%$*)<=>n.reverse]

Благодаря Майклу Колю "% b"% получает хитрость.

steenslag
источник
Очень мило, мне это очень нравится! +1 за творческое использование космического корабля :-)
Майкл Кол
4

C 84 81 74 персонажа

r;main(v,x){for(scanf("%d",&v),x=v;v;v/=2)r=r*2|v&1;puts(r-x?"NO":"YES");}

Он не использует никаких функций, таких как обратная строка.

fR0DDY
источник
Не могли бы вы сохранить несколько персонажей, превращающихся r<<=1в r*=2, v>>=1в v/=2и {}в ;?
@paxdiablo Действительно. Изменено. Большое спасибо.
fR0DDY
r*=2,r|=v&1-> r=r*2|v&1(-2)
Титус
и перемещение этого термина в тело цикла сохраняет еще один байт.
Титус
3

Javascript - 79 77 символов

alert((a=(prompt()*1).toString(2))-a.split("").reverse().join("")?"NO":"YES")

Дополнительная информация

prompt()*1 : Быстрый трюк для преобразования строки в число.

.toString(2) Это то, как вы конвертируете в двоичный файл в JavaScript.

a.split("").reverse().join("") : Нет встроенной поддержки для обращения строки, поэтому вам нужно преобразовать строку в массив и массив в строку.

("[part1]" - "[part 2]")?"YES":"NO": -замена для !=сохранения 1 символа.

HoLyVieR
источник
1
Отличное объяснение.
ТехШрик
2

PHP - 41

<?=strrev($n=decbin(`cat`))==$n?@YES:@NO;

Тестовое задание:

php 713.php <<< 5
YES
php 713.php <<< 6
NO
Арно Ле Блан
источник
4
Если вы собираетесь использовать вызовы оболочки для получения ввода, можно также использовать его m4вместо catсохранения. Там также pgи dd(который записывает несколько байтов в stderr).
Набб
Вы пробовали это на Windows? ;)
Титус
2

Perl, 45 символов

$_=sprintf'%b',shift;
print reverse==$_?YES:NO

источник
2

Рубин, 43 символа

puts((n="%b"%gets)==n.reverse ? "YES":"NO")
Майкл Коля
источник
Сохранить 2:puts (n="%b"%gets)==n.reverse ? :YES: :NO
Phrogz
2

Windows PowerShell, 67

('NO','YES')[($a=[Convert]::ToString("$input",2))-eq-join$a[64..0]]
детеныш
источник
2

05AB1E, 17 12 байт (не конкурирующих)

‘NO…Ü‘#EbÂQè

-5 байт благодаря Аднану.

Попробуйте онлайн!

акролит
источник
Эй, мило! Я попытался немного поиграть в гольф и получил 12 байтов ‘NO…Ü‘#EbÂQè:).
Аднан
Большой! Я до сих пор не знаю, как использовать / создавать сжатые строки. Кроме того, я не знал, что функция bin()существует
акролит
2
Существует на самом деле подробный пример здесь , если вы заинтересованы :).
Аднан
Этот ответ не конкурирует, так как вопрос предшествует языку.
Okx
1

Python (51)

n=bin(input())[2:]
print'YES'if n==n[::-1]else'NO'
Хоа Лонг Там
источник
Вы можете['NO','YES'][n==n[::-1]]
Карл Напф
1

Perl (73)

Без обратной строки:

print f(split//,sprintf'%b',shift);
sub f{@_<=1?YES:shift!=pop()?NO:f(@_)}

источник
1

Perl (127)

Этот строит все палиндромы до 2 ^ 32.

sub f{
    my($x,$l)=@_;
    $l+=2,f(($x<<$_)+1+(1<<$l-1),$l)?return 1:0 for 1..15-$l/2;
    $x-$ARGV[0]?0:1
}
print f(0,1)+f(0,0)+f(1,1)?YES:NO

источник
1

Баш, 55 символов

C=`dc<<<$1\ 2op`;[ $C = `rev<<<$C` ]&&echo YES||echo NO
ninjalj
источник
Ну, технически это bash и есть, dc и rev :-)
1

J - 33 символа

13 : ';(]-:|.)#:y{''YES'';''NO'''
MPelletier
источник
1

J: 24

((-:|.)#:x){2 3$'NO YES'

например:

   ((-:|.)#:5){2 3$'NO YES'
YES
   ((-:|.)#:12){2 3$'NO YES'
NO
   ((-:|.)#:125){2 3$'NO YES'
NO
   ((-:|.)#:63){2 3$'NO YES'
YES
Eelvex
источник
1

Хаскелл (79)

0?k=n;n?k=div n 2?(n`mod`2+k*2);f x|x==x?0="YES"|True="No";main=interact$f.read
FUZxxl
источник
Не забывайте: в Haskell это будет работать с действительно большими числами.
FUZxxl
2
Ах, это на самом деле 79 символов. ;-)
Michael Kohl
1

Pyth, 18 байт

%2>"YNEOS"!qJ.BQ_J

Также 18 байтов:

@,"NO""YES"qJ.BQ_J
drobilc
источник
1

PHP, не конкурирующий

Я хотел сделать это без использования строк вообще.

итерационное решение, 78 байт

for($x=log($n=$argv[1],2);$i<$x&($n>>$i^$n>>$x-$i^1);$i++);echo$i<$x/2?NO:YES;

рекурсивное решение, 113 байт

function p($n,$x=0){return$n<2?$n:is_pal(($n&(1<<$x=log($n,2)/2)-1)^$n>>$x+!is_int($x));}echo p($argv[1])?YES:NO;

Если nэто бинарный палиндром, то верхняя половина или нижняя половина также являются бинарным палиндромом и наоборот.


порт отличного C ответа от fR0DDY , 58 байт

for($x=2*$v=$argv[1];$x/=2;$r=$r*2|$x&1);echo$r-$v?NO:YES;

бинарный реверс. Яйцо Колумба.

Titus
источник
1

Retina , 80 78 байт (не конкурирует)

Количество байтов предполагает кодировку ISO 8859-1.

.+
$*
+`(1+)\1
${1}0
01
1
^((.)*?).??((?<-2>.)*$)
$1¶$3
O$^`.(?=.*¶)

^(.*)¶\1

Попробуйте онлайн

Преобразовать в одинарный. Преобразуйте это в двоичный файл. Разрежьте число пополам и удалите среднюю цифру, если она есть. Обратный первый тайм. Матч, если обе половины равны.

mbomb007
источник
1

Желе , 12 байт (не конкурирует)

BṚ⁼Bị“YES“NO

Попробуйте онлайн!

Объяснение:

BṚ⁼Bị“YES“NO Main link. Arguments: z.
B            Binary representation of z.
 Ṛ           Reversed.
   B         Binary representation of z.
  ⁼          Check if x is equal to y.
     “YES“NO [['Y', 'E', 'S'], ['N', 'O']]
    ị        xth element of y (1-indexed).

Перед печатью strфункция Python отображается через список, а затем элементы объединяются, поэтому вы видите YESили NO.

Эрик Outgolfer
источник
0

Haxe, 164 байта

Работает только с системными платформами (php, neko, cpp и т. Д.). Принимает ввод через аргументы командной строки.

class T{static function main(){var r:Dynamic=Std.parseInt(Sys.args()[0]);var s=r.toString(2);trace(s==[for(i in-s.length+1...1)s.charAt(-i)].join('')?"YES":"NO");}}
Yytsi
источник
0

Matlab, 71 байт

function paly(n)
v=de2bi(n);
if v==v(numel(v):-1:1)
'YES'
else
'NO'
end
цифро-Ink
источник
1
Добро пожаловать в PPCG!
Мартин Эндер
-1

Java, 97 85 символов

return Integer.toBinaryString(i).equals(new StringBuffer(s).reverse()+"")?"YES":"NO";
    String s = Integer.toBinaryString (i);
    return s.equals (new StringBuffer (s) .reverse () + "")? "YES": "NO";
Октавиан А. Дамиан
источник
2
Задача требует полной программы.
Joey