Двійкове представлення числа є паліндром чи ні?


16

Напишіть повну програму, щоб дізнатись, чи є двійкове представлення числа паліндром чи ні?

Sample Input
5

Sample Output
YES

Роздрукуйте, YESякщо двійкове представлення паліндром та NOінше.


Яким повинен бути вихід, якщо це не паліндром?
Догберт

@dogbert Це має бути "НІ" без лапок.
fR0DDY

Звідки ти знаєш, що це паліндром? Тому що значення від першого ненуля до кінця "рядка" є паліндромними? Це дуже пахне для мене, як виклик.
jcolebrand

1
Наскільки я відповідь <3 гніблера, це насправді не найкоротший варіант вирішення, і будь-яке питання, позначене тегом [код-гольф], повинно вибрати найвище рішення як переможця.
Кріс Єстер-Янг

Введення задано як?
Джої

Відповіді:



24

Пітон - 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 за творчий спосіб використання космічного корабля :-)
Michael Kohl

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
Відмінне пояснення.
TehShrike

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).
Nabb

Ви пробували це в Windows? ;)
Тіт

2

Perl, 45 символів

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


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()існує
acrolith

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 символів. ;-)
Майкл Коль



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є двійковий паліндром, верхня половина xor нижня половина також є бінарним паліндром і навпаки.


порт відмінної відповіді на C від fR0DDY , 58 байт

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

двійковий реверс. Яйце Колумба.


1

Сітківка , 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

Хакс, 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

Ява, 97 85 символів

return Integer.toBinaryString(i).equals(new StringBuffer(s).reverse()+"")?"YES":"NO";
    Рядок s = Integer.toBinaryString (i);
    повернути s.equals (нові StringBuffer (s) .reverse () + "")? "ТАК": "НІ";

2
Завдання вимагає повноцінної програми.
Joey
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.