Bir sayının ikili gösterimi palindrom mu, değil mi?


16

Bir sayının ikili gösteriminin palindrom olup olmadığını bulmak için tam bir program yazın?

Sample Input
5

Sample Output
YES

YESİkili gösterim palindrom ise veya NObaşka bir şekilde yazdırın .


Palindrom olmadığında çıktı ne olmalıdır ?
Dogbert

@dogbert Tırnaklar olmadan 'HAYIR' olmalıdır.
fR0DDY

Bunun bir palindrom olduğunu nereden biliyorsun? Çünkü ilk sıfırdan "string" in sonuna kadar olan değerler palindromik mi? Bu bir meydan okuma olarak benim için gerçekten kötü kokuyor.
jcolebrand

1
Ben <3 gnibbler'ın cevabı, aslında en kısa çözüm değil ve [code-golf] etiketli herhangi bir soru kazanan olarak en kısa çözümü seçmelidir.
Chris Jester-Young

Girdi nasıl verilir?
Joey

Yanıtlar:


5

Golfscript - 22 karakter

~2base.-1%="YES""NO"if

24

Python - 46 karakter

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

Vay. Ne yapar [n!=n[::-1]::2]?
Dogbert

2
@Dogbert, n [:: - 1] bir dilimdir. Başlangıç ​​ve bitiş dizinleri boş olduğundan tüm dizeyi ifade eder. Adım boyutu -1'dir, bu nedenle [:: - 1] öğesini gördüğünüzde, bir dizeyi / listeyi tersine çevirmenin kısa bir yoludur. Bu nedenle n! = N [:: - 1], n olmadığında True'dur (yani 1). bir palindrom. Bu nedenle n bir palindrom olduğunda, 'YNEOS' [0 :: 2] elde edersiniz - 0'dan başlayın ve her 2 karakteri alın. N bir palindrom olmadığında 'YNEOS' alırsınız [1 :: 2] - 1'den başlayın ve her ikinci karakteri alın :)
gnibbler

Sanırım insanlar dilim hilesi için oy veriyor :) Doğru. : P +1
st0le

4

Yakut, 41 39

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

Michael Kohl sayesinde "% b"% aldatıyor.


Çok hoş, bunu çok beğendim! Uzay gemisini yaratıcı bir şekilde kullanmak için +1 :-)
Michael Kohl

4

C 84 81 74 Karakterler

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

Ters dize gibi bir işlev kullanmaz.


Bir kaç karakteri r<<=1içine r*=2, v>>=1içine v/=2ve {}içine girerek kaydedemez misiniz ;?

@paxdiablo Gerçekten. Değiştirildi. Çok teşekkürler.
fR0DDY

r*=2,r|=v&1-> r=r*2|v&1(-2)
Titus

ve bu terimi döngü gövdesine taşımak başka bir bayt kazandırır.
Titus

3

Javascript - 79 77 karakter

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

Daha fazla bilgi

prompt()*1 : Dizeyi sayıya dönüştürmek için hızlı hile.

.toString(2) : Javascript'te ikiliye bu şekilde dönüşürsünüz.

a.split("").reverse().join("") : Dizeyi tersine çevirmek için yerel bir destek yoktur, bu nedenle dizeyi diziye ve dizeyi dizeye dönüştürmeniz gerekir.

("[part1]" - "[part 2]")?"YES":"NO": -Yerine geçer !=1 kömürü kaydedin.


1
Mükemmel açıklama.
TehShrike

2

PHP - 41

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

Ölçek:

php 713.php <<< 5
YES
php 713.php <<< 6
NO

4
Eğer giriş almak için kabuk çağrıları kullanmak gidiyoruz, hem de kullanabilir m4yerine catbirini kurtarmak için. Ayrıca vardır pgve dd(stderr'a bazı baytlar yazar).
Nabb

Bunu Windows'ta denediniz mi? ;)
Titus

2

Perl, 45 karakter

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

2

Ruby, 43 karakter

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

2 Tasarruf: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 bayt (rakip olmayan)

‘NO…Ü‘#EbÂQè

-Adnan sayesinde 5 byte.

Çevrimiçi deneyin!


Hey güzel! Biraz golf yapmaya çalıştım ve 12 byte'a geldim ‘NO…Ü‘#EbÂQè:).
Adnan

Harika! Sıkıştırılmış dizeleri nasıl kullanacağımı / hazırlayacağımı hala bilmiyorum. Ayrıca, işlevin bin()var olduğunu bilmiyordum
acrolith

2
Eğer ilgileniyorsanız, burada detaylı bir örnek var :).
Adnan

Soru dilden önce geldiği için bu cevap rekabet etmiyor.
Okx


1

Perl (73)

Ters dize yok:

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

1

Perl (127)

Bu, 2 ^ 32'ye kadar tüm palindromları oluşturur.

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 karakter

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

Peki, teknik olarak bu bash ve dc ve rev :-)


1

J: 24

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

Örneğin:

   ((-:|.)#: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

Unutmayın: Haskell'de bu çok büyük rakamlarla çalışacaktır.
FUZxxl

2
Ahm, aslında 79 karakter. ;-)
Michael Kohl


1

Pyth, 18 bayt

%2>"YNEOS"!qJ.BQ_J

Ayrıca 18 bayt:

@,"NO""YES"qJ.BQ_J

1

PHP, rakip değil

Dizeleri kullanmadan yapmak istedim.

yinelemeli çözüm, 78 bayt

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

özyinelemeli çözüm, 113 bayt

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;

Eğer nikili palindrom, üst yan XOR alt yarısı, aynı zamanda tam tersi bir ikili palindrom ve yardımcısı olup.


fR0DDY'den gelen mükemmel C cevabının bir portu , 58 bayt

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

ikili ters. Columbus´ yumurtası.


1

Retina , 80 78 bayt (rakip değil)

Bayt sayımı ISO 8859-1 kodlamasını varsayar.

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

^(.*)¶\1

Çevrimiçi deneyin

Tekli'ye dönüştür. Bunu ikili dosyaya dönüştürün. Numarayı ikiye bölün ve varsa ortadaki bir rakamı kaldırın. İlk yarıyı ters çevirin. Her iki yarı da eşitse eşleşir.


1

Jöle , 12 bayt (rakip olmayan)

BṚ⁼Bị“YES“NO

Çevrimiçi deneyin!

Açıklama:

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

Yazdırmadan önce, Python'un strişlevi bir liste ile eşleştirilir ve ardından öğeler birleştirilir, böylece YESveya öğesini görürsünüz NO.


0

Haxe, 164 bayt

Yalnızca sistem platformlarıyla (php, neko, cpp vb.) Çalışır. Komut satırı bağımsız değişkenleri aracılığıyla girdi alır.

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 karakter

return Integer.toBinaryString(i).equals(new StringBuffer(s).reverse()+"")?"YES":"NO";
    Dize s = Tamsayı.toBinaryString (i);
    return s.equals (yeni StringBuffer (s) .reverse () + "")? "EVET": "HAYIR";

2
Görev, tam bir program gerektirir.
Joey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.