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


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.