Representasi biner dari angka adalah palindrome atau bukan?

16

Tulis program lengkap untuk mengetahui apakah representasi biner dari angka tersebut adalah palindrome atau bukan?

Sample Input
5

Sample Output
YES

Cetak YESjika representasi biner adalah palindrom dan NOsebaliknya.

fR0DDY
sumber
Apa yang harus menjadi output ketika itu bukan palindrome?
Dogbert
@dogbert Seharusnya 'TIDAK' tanpa tanda kutip.
fR0DDY
Bagaimana Anda tahu itu palindrom? Karena nilai dari nol pertama sampai akhir "string" adalah palindromic? Ini baunya sangat buruk bagi saya, sebagai tantangan.
jcolebrand
1
Sama seperti saya menjawab <3 gnibbler, itu sebenarnya bukan solusi terpendek, dan setiap pertanyaan yang ditandai [kode-golf] harus memilih solusi terpendek sebagai pemenang.
Chris Jester-Young
Masukan diberikan bagaimana?
Joey

Jawaban:

5

Golfscript - 22 karakter

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

Python - 46 karakter

n=bin(input())[2:]
print'YNEOS'[n!=n[::-1]::2]
gnibbler
sumber
Wow. Apa yang [n!=n[::-1]::2]harus dilakukan
Dogbert
2
@Dogbert, n [:: - 1] adalah slice. Indeks awal dan akhir kosong, jadi artinya seluruh string. Stepsize adalah -1, jadi ketika Anda melihat [:: - 1] ini adalah cara singkat untuk membalikkan string / daftar dll. Jadi n! = N [:: - 1] Benar (yaitu 1) ketika n tidak sebuah palindrome. Karenanya ketika n adalah palindrom, Anda mendapatkan 'YNEOS' [0 :: 2] - mulai dari 0 dan ambil setiap karakter ke-2. Ketika n bukan palindrome, Anda mendapatkan 'YNEOS' [1 :: 2] - mulai dari 1 dan ambil setiap karakter kedua :)
gnibbler
Saya pikir orang-orang memberikan suara untuk trik slice :), memang demikian. : P +1
st0le
4

Ruby, 41 39

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

Berkat "% b"% Michael Kohl mendapat trik.

steenslag
sumber
Sangat bagus, saya sangat suka ini! +1 untuk menggunakan pesawat ruang angkasa dengan cara yang kreatif :-)
Michael Kohl
4

C 84 81 74 Karakter

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

Itu tidak menggunakan fungsi seperti string terbalik.

fR0DDY
sumber
Tidak bisakah Anda menyimpan beberapa karakter berubah r<<=1menjadi r*=2, v>>=1menjadi v/=2dan {}ke dalam ;?
@paxdiablo Memang. Berubah Terima kasih banyak.
fR0DDY
r*=2,r|=v&1-> r=r*2|v&1(-2)
Titus
dan memindahkan istilah itu ke badan loop menghemat byte lain.
Titus
3

Javascript - 79 77 karakter

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

Informasi lebih lanjut

prompt()*1 : Trik cepat untuk mengonversi string menjadi angka.

.toString(2) : Begitulah cara Anda mengkonversi ke biner di javascript.

a.split("").reverse().join("") : Tidak ada dukungan asli untuk membalikkan string, jadi Anda harus mengkonversi string ke array dan array ke string.

("[part1]" - "[part 2]")?"YES":"NO": -adalah pengganti untuk !=menghemat 1 char.

HoLyVieR
sumber
1
Penjelasan yang bagus.
TehShrike
2

PHP - 41

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

Uji:

php 713.php <<< 5
YES
php 713.php <<< 6
NO
Arnaud Le Blanc
sumber
4
Jika Anda akan menggunakan panggilan shell untuk mendapatkan input, lebih baik gunakan m4alih-alih catmenyimpannya. Ada juga pgdan dd(yang menulis beberapa byte ke stderr).
Nabb
Sudahkah Anda mencobanya di Windows? ;)
Titus
2

Perl, 45 karakter

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

sumber
2

Ruby, 43 karakter

puts((n="%b"%gets)==n.reverse ? "YES":"NO")
Michael Kohl
sumber
Hemat 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
sumber
2

05AB1E, 17 12 byte (tidak bersaing)

‘NO…Ü‘#EbÂQè

-5 byte terima kasih kepada Adnan.

Cobalah online!

akrolit
sumber
Hai bagus! Saya mencoba sedikit golf dan datang ke 12 byte ‘NO…Ü‘#EbÂQè:).
Adnan
Bagus! Saya masih tidak tahu cara menggunakan / membuat string terkompresi. Juga, saya tidak tahu fungsi itu bin()ada
acrolith
2
Sebenarnya ada contoh terperinci di sini , jika Anda tertarik :).
Adnan
Jawaban ini tidak bersaing karena pertanyaan mendahului bahasa.
Okx
1

Python (51)

n=bin(input())[2:]
print'YES'if n==n[::-1]else'NO'
Hoa Long Tam
sumber
Anda bisa['NO','YES'][n==n[::-1]]
Karl Napf
1

Perl (73)

Tidak ada string terbalik:

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

sumber
1

Perl (127)

Yang ini membangun semua palindrom hingga 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

sumber
1

Bash, 55 karakter

C=`dc<<<$1\ 2op`;[ $C = `rev<<<$C` ]&&echo YES||echo NO
ninjalj
sumber
Nah, secara teknis itu bash dan dc dan rev :-)
1

J - 33 karakter

13 : ';(]-:|.)#:y{''YES'';''NO'''
MPelletier
sumber
1

J: 24

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

misalnya:

   ((-:|.)#: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
sumber
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
sumber
Jangan lupa: Di Haskell, ini akan bekerja dengan angka yang sangat besar.
FUZxxl
2
Ahm, itu sebenarnya 79 karakter. ;-)
Michael Kohl
1

C (77 byte)

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

UJI

Pemurah
sumber
1

Pyth, 18 byte

%2>"YNEOS"!qJ.BQ_J

Juga 18 byte:

@,"NO""YES"qJ.BQ_J
drobilc
sumber
1

PHP, tidak bersaing

Saya ingin melakukannya tanpa menggunakan string sama sekali.

solusi berulang, 78 byte

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

solusi rekursif, 113 byte

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;

Jika npalindrom biner, bagian atas x atau bagian bawah juga merupakan palindrom biner dan sebaliknya.


port jawaban C yang sangat baik dari fR0DDY , 58 byte

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

pembalikan biner. Telur Columbus.

Titus
sumber
1

Retina , 80 78 byte (tidak bersaing)

Hitungan byte mengasumsikan penyandian ISO 8859-1.

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

^(.*)¶\1

Cobalah online

Konversikan ke unary. Ubah itu menjadi biner. Potong jumlahnya menjadi dua dan hapus digit tengah jika ada. Membalik babak pertama. Cocokkan jika kedua bagiannya sama.

mbomb007
sumber
1

Jelly , 12 byte (tidak bersaing)

BṚ⁼Bị“YES“NO

Cobalah online!

Penjelasan:

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

Sebelum mencetak, strfungsi Python dipetakan melalui daftar, dan kemudian elemen-elemen digabungkan, sehingga Anda melihat YESatau NO.

Erik the Outgolfer
sumber
0

Haxe, 164 byte

Hanya berfungsi dengan platform sistem (php, neko, cpp, dll.). Mengambil input melalui argumen baris perintah.

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
sumber
0

Matlab, 71 byte

function paly(n)
v=de2bi(n);
if v==v(numel(v):-1:1)
'YES'
else
'NO'
end
digital-Ink
sumber
1
Selamat datang di PPCG!
Martin Ender
-1

Java, 97 85 karakter

return Integer.toBinaryString(i).equals(new StringBuffer(s).reverse()+"")?"YES":"NO";
    String s = Integer.toBinaryString (i);
    return s.equals (StringBuffer baru .reverse () + "")? "YA": "TIDAK";
Oktavianus A. Damiean
sumber
2
Tugas memanggil program lengkap.
Joey