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.


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:



24

Python - 46 znaków

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

Ł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ę.


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.


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.


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

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

2

Ruby, 43 znaki

puts((n="%b"%gets)==n.reverse ? "YES":"NO")

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]]

2

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

‘NO…Ü‘#EbÂQè

-5 bajtów dzięki Adnan.

Wypróbuj online!


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

Perl (73)

Brak ciągu wstecznego:

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

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

1

Bash, 55 znaków

C=`dc<<<$1\ 2op`;[ $C = `rev<<<$C` ]&&echo YES||echo NO

Cóż, technicznie to bash i dc oraz rev :-)


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

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

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

Pyth, 18 bajtów

%2>"YNEOS"!qJ.BQ_J

Również 18 bajtów:

@,"NO""YES"qJ.BQ_J

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.


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.


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.


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


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

2
Zadanie wymaga pełnego programu.
Joey,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.