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


16

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

Sample Input
5

Sample Output
YES

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


Каким должен быть вывод, когда это не палиндром?
— Догберт

@ Dogbert Это должно быть "НЕТ" без кавычек.
— fR0DDY

Откуда ты знаешь, что это палиндром? Потому что значения от первого ненулевого до конца «строки» являются палиндромными? Это пахнет очень плохо для меня, как вызов.
— Jcolebrand

1
Хотя я и отвечаю <3 gnibbler, на самом деле это не самое короткое решение, и любой вопрос с тегом [code-golf] должен выбрать самое короткое решение в качестве победителя.
— Крис Шутер-Янг

Ввод дан как?
— Джои

Ответы:



24

Python - 46 символов

n=bin(input())[2:]
print'YNEOS'[n!=n[::-1]::2]

Вау. Что делает [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"% получает хитрость.


Очень мило, мне это очень нравится! +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");}

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


Не могли бы вы сохранить несколько персонажей, превращающихся 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 символа.


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

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

‘NO…Ü‘#EbÂQè

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

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


Эй, мило! Я попытался немного поиграть в гольф и получил 12 байтов ‘NO…Ü‘#EbÂQè:).
— Аднан

Большой! Я до сих пор не знаю, как использовать / создавать сжатые строки. Кроме того, я не знал, что функция bin()существует
— акролит

2
Существует на самом деле подробный пример здесь , если вы заинтересованы :).
— Аднан

Этот ответ не конкурирует, так как вопрос предшествует языку.
— Okx


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

Ну, технически это bash и есть, dc и rev :-)


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

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

Не забывайте: в Haskell это будет работать с действительно большими числами.
— FUZxxl

2
Ах, это на самом деле 79 символов. ;-)
— Michael Kohl



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;

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


1

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

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

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

^(.*)¶\1

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

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


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.


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");}}


-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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.