Binarna reprezentacja liczby to palindrom, czy nie?

16

Napisz pełny program, aby dowiedzieć się, czy binarna reprezentacja liczby jest palindromem, czy nie?

Sample Input
5

Sample Output
YES

Drukuj, YESjeśli reprezentacja binarna jest palindromem i NOinaczej.

fR0DDY
źródło
Jaka powinna być moc, kiedy to nie palindrom?
Dogbert
@dogbert Powinno być „NIE” bez cudzysłowów.
fR0DDY
Skąd wiesz, że to palindrom? Ponieważ wartości od pierwszego niezerowego do końca „łańcucha” są palindromiczne? To dla mnie naprawdę brzydko pachnie.
jcolebrand
1
Chociaż odpowiedź <3 gnibblera, nie jest tak naprawdę najkrótszym rozwiązaniem, a każde pytanie oznaczone [kodem golfa] powinno wybrać najkrótsze rozwiązanie jako zwycięzcę.
Chris Jester-Young,
Dane wejściowe są podane w jaki sposób?
Joey

Odpowiedzi:

5

Golfscript - 22 znaki

~2base.-1%="YES""NO"if
Nabb
źródło
24

Python - 46 znaków

n=bin(input())[2:]
print'YNEOS'[n!=n[::-1]::2]
gnibbler
źródło
Łał. Co ma [n!=n[::-1]::2]zrobić?
Dogbert
2
@Dogbert, n [:: - 1] to plasterek. Indeksy początkowy i końcowy są puste, więc oznacza to cały ciąg. Wielkość kroku wynosi -1, więc gdy zobaczysz [:: - 1], jest to krótki sposób na odwrócenie łańcucha / listy itp. Więc n! = N [:: - 1] ma wartość True (tj. 1), gdy n nie jest palindrom. Dlatego gdy n jest palindromem, dostajesz „YNEOS” [0 :: 2] - zacznij od 0 i weź co 2 znak. Kiedy n nie jest palindromem, dostajesz „YNEOS” [1 :: 2] - zacznij od 1 i weź co drugą postać :)
gnibbler
Myślę, że ludzie głosują na lewę :), słusznie. : P +1
st0le
4

Ruby, 41 39

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

Dzięki „% b”% Michaela Kohla dostaje sztuczkę.

steenslag
źródło
Bardzo miło, bardzo to lubię! +1 za kreatywne wykorzystanie statku kosmicznego :-)
Michael Kohl
4

C 84 81 74 znaków

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

Nie używa żadnej funkcji, takiej jak ciąg znaków do tyłu.

fR0DDY
źródło
Czy nie możesz zapisać kilku znaków zmieniających się r<<=1w r*=2, v>>=1w v/=2i {}na ;?
@paxdiablo Rzeczywiście. Zmieniono Wielkie dzięki.
fR0DDY
r*=2,r|=v&1-> r=r*2|v&1(-2)
Tytus
a przeniesienie tego terminu do korpusu pętli oszczędza kolejny bajt.
Tytus
3

JavaScript - 79 77 znaków

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

Więcej informacji

prompt()*1 : Szybka sztuczka polegająca na konwersji ciągu na liczbę.

.toString(2) : Tak konwertujesz na binarny w javascript.

a.split("").reverse().join("") : Nie ma natywnej obsługi odwrotnego ciągu, więc należy przekonwertować ciąg na tablicę i tablicę na ciąg.

("[part1]" - "[part 2]")?"YES":"NO": -zastępuje, !=aby zapisać 1 znak.

HoLyVieR
źródło
1
Doskonałe wyjaśnienie.
TehShrike
2

PHP - 41

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

Test:

php 713.php <<< 5
YES
php 713.php <<< 6
NO
Arnaud Le Blanc
źródło
4
Jeśli zamierzasz użyć wywołań powłoki, aby uzyskać dane wejściowe, równie dobrze możesz użyć m4zamiast catje zapisać. Jest też pgi dd(co zapisuje niektóre bajty do stderr).
Nabb,
Czy próbowałeś tego w systemie Windows? ;)
Tytus
2

Perl, 45 znaków

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

źródło
2

Ruby, 43 znaki

puts((n="%b"%gets)==n.reverse ? "YES":"NO")
Michael Kohl
źródło
Zaoszczędź 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]]
Joey
źródło
2

05AB1E, 17 12 bajtów (niekonkurujące)

‘NO…Ü‘#EbÂQè

-5 bajtów dzięki Adnan.

Wypróbuj online!

acrolith
źródło
Hej miło! Próbowałem trochę zagrać w golfa i doszedłem do 12 bajtów ‘NO…Ü‘#EbÂQè:).
Adnan
Świetny! Nadal nie wiem, jak używać / tworzyć skompresowane ciągi. Poza tym nie wiedziałem, że ta funkcja bin()istnieje
acrolith
2
Tu jest rzeczywiście szczegółowy przykład tutaj , jeśli jesteś zainteresowany :).
Adnan
Ta odpowiedź nie jest konkurencyjna, ponieważ pytanie poprzedza język.
Okx,
1

Python (51)

n=bin(input())[2:]
print'YES'if n==n[::-1]else'NO'
Hoa Long Tam
źródło
Możesz['NO','YES'][n==n[::-1]]
Karl Napf
1

Perl (73)

Brak ciągu wstecznego:

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

źródło
1

Perl (127)

Ten konstruuje wszystkie palindromy do 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

źródło
1

Bash, 55 znaków

C=`dc<<<$1\ 2op`;[ $C = `rev<<<$C` ]&&echo YES||echo NO
ninjalj
źródło
Cóż, technicznie to bash i dc oraz rev :-)
1

J - 33 znaki

13 : ';(]-:|.)#:y{''YES'';''NO'''
MPelletier
źródło
1

J: 24

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

na przykład:

   ((-:|.)#: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
źródło
1

Haskell (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
źródło
Nie zapomnij: w Haskell będzie to działać z naprawdę dużymi liczbami.
FUZxxl
2
Ahm, to właściwie 79 znaków. ;-)
Michael Kohl
1

C (77 bajtów)

r,t;main(n){for(t=n=atoi(gets(&n));n;r*=2,r|=n%2,n/=2);puts(r-t?"NO":"YES");}

TEST

Donkiszotowski
źródło
1

Pyth, 18 bajtów

%2>"YNEOS"!qJ.BQ_J

Również 18 bajtów:

@,"NO""YES"qJ.BQ_J
drobilc
źródło
1

PHP, nie konkuruje

Chciałem to zrobić bez użycia ciągów.

iteracyjne rozwiązanie, 78 bajtów

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

rozwiązanie rekurencyjne, 113 bajtów

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;

Jeśli njest binarnym palindromem, górna połowa x lub dolna połowa jest również binarnym palindromem i odwrotnie.


port doskonałej odpowiedzi C z fR0DDY , 58 bajtów

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

binarny rewers. Jajko Kolumba.

Tytus
źródło
1

Retina , 80 78 bajtów (niekonkurujące)

Liczba bajtów zakłada kodowanie ISO 8859-1.

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

^(.*)¶\1

Wypróbuj online

Konwertuj na unary. Konwertuj to na binarne. Wytnij liczbę na pół i usuń środkową cyfrę, jeśli taka istnieje. Odwróć pierwszą połowę. Dopasuj, jeśli obie połowy są równe.

mbomb007
źródło
1

Galaretka , 12 bajtów (niekonkurencyjna)

BṚ⁼Bị“YES“NO

Wypróbuj online!

Wyjaśnienie:

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

Przed wydrukowaniem strfunkcja Pythona jest odwzorowywana na liście, a następnie elementy są łączone, aby zobaczyć YESlub NO.

Erik the Outgolfer
źródło
0

Haxe, 164 bajty

Działa tylko z platformami systemowymi (php, neko, cpp itp.). Pobiera dane wejściowe za pomocą argumentów wiersza poleceń.

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
źródło
0

Matlab, 71 bajtów

function paly(n)
v=de2bi(n);
if v==v(numel(v):-1:1)
'YES'
else
'NO'
end
tusz cyfrowy
źródło
1
Witamy w PPCG!
Martin Ender
-1

Java, 97 85 znaków

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";
Oktawian A. Damiean
źródło
2
Zadanie wymaga pełnego programu.
Joey,