Đại diện nhị phân của một số là palindrom hay không?


16

Viết một chương trình đầy đủ để tìm xem biểu diễn nhị phân của một số có phải là palindrom hay không?

Sample Input
5

Sample Output
YES

In YESnếu đại diện nhị phân là palindrom và NOcách khác.


Điều gì sẽ là đầu ra khi nó không phải là một palindrom?
Dogbert

@dogbert Nên là 'KHÔNG' nếu không có dấu ngoặc kép.
fR0DDY

Làm thế nào để bạn biết đó là một palindrom? Bởi vì các giá trị từ khác không đầu tiên đến cuối "chuỗi" là palindromic? Điều này có mùi rất tệ với tôi, như một thách thức.
jcolebrand

1
Nhiều như câu trả lời của tôi <3 gnibbler, đây thực sự không phải là giải pháp ngắn nhất và bất kỳ câu hỏi nào được gắn thẻ [code-golf] sẽ chọn giải pháp ngắn nhất là người chiến thắng.
Chris Jester-Young

Đầu vào được đưa ra như thế nào?
Joey

Câu trả lời:


5

Golfscript - 22 ký tự

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

24

Python - 46 ký tự

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

Ồ Không gì [n!=n[::-1]::2]làm gì?
Dogbert

2
@Dogbert, n [:: - 1] là một lát cắt. Các chỉ mục bắt đầu và kết thúc trống, vì vậy nó có nghĩa là toàn bộ chuỗi. Các kích thước là -1, vì vậy khi bạn thấy [:: - 1] thì đó là một cách ngắn để đảo ngược chuỗi / danh sách, v.v ... Vì vậy n! = N [:: - 1] là True (tức là 1) khi n không một palindrom. Do đó, khi n là một bảng màu, bạn nhận được 'YNEOS' [0 :: 2] - bắt đầu từ 0 và nhận mỗi ký tự thứ 2. Khi n không phải là một palindrom, bạn nhận được 'YNEOS' [1 :: 2] - bắt đầu từ 1 và lấy mỗi ký tự thứ hai :)
gnibbler

Tôi nghĩ mọi người đang bỏ phiếu cho trò lừa lát :), đúng vậy. : P +1
st0le

4

Ruby, 41 39

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

Nhờ "% b"% của Michael Kohl bị lừa.


Rất đẹp, tôi thích điều này rất nhiều! +1 để sử dụng tàu vũ trụ theo cách sáng tạo :-)
Michael Kohl

4

C 84 81 74 Nhân vật

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

Nó không sử dụng bất kỳ chức năng như chuỗi ngược.


Bạn không thể lưu một vài ký tự thay đổi r<<=1thành r*=2, v>>=1vào v/=2{}vào ;?

@paxdiablo Thật vậy. Thay đổi. Cảm ơn rất nhiều.
fR0DDY

r*=2,r|=v&1-> r=r*2|v&1(-2)
Tít

và di chuyển thuật ngữ đó đến phần thân của vòng lặp sẽ lưu một byte khác.
Tít

3

Javascript - 79 77 ký tự

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

Thêm thông tin

prompt()*1 : Thủ thuật nhanh để chuyển đổi chuỗi thành số.

.toString(2) : Đó là cách bạn chuyển đổi thành nhị phân trong javascript.

a.split("").reverse().join("") : Không có hỗ trợ riêng để đảo ngược chuỗi, vì vậy bạn phải chuyển đổi chuỗi thành mảng và mảng thành chuỗi.

("[part1]" - "[part 2]")?"YES":"NO": -là sự thay thế !=để tiết kiệm 1 char.


1
Giải thích tuyệt vời.
TehShrike

2

PHP - 41

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

Kiểm tra:

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

4
Nếu bạn sẽ sử dụng các cuộc gọi shell để nhận đầu vào, cũng có thể sử dụng m4thay vì catđể lưu một cuộc gọi. Cũng có pgdd(ghi một số byte vào stderr).
Nabb

Bạn đã thử điều đó trên Windows chưa? ;)
Tít

2

Perl, 45 ký tự

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

2

Ruby, 43 ký tự

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

Tiết kiệm 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 byte (không cạnh tranh)

‘NO…Ü‘#EbÂQè

-5 byte nhờ Adnan.

Hãy thử trực tuyến!


Này tốt đẹp! Tôi đã cố gắng chơi golf một chút và đạt 12 byte ‘NO…Ü‘#EbÂQè:).
Ad Nam

Tuyệt quá! Tôi vẫn không biết cách sử dụng / tạo chuỗi nén. Ngoài ra, tôi không biết chức năng bin()tồn tại
acrolith

2
Thực sự có một ví dụ chi tiết ở đây , nếu bạn quan tâm :).
Ad Nam

Câu trả lời này không cạnh tranh vì câu hỏi có trước ngôn ngữ.
Okx


1

Perl (73)

Không có chuỗi đảo ngược:

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

1

Perl (127)

Điều này xây dựng tất cả các palindromes lên đến 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 ký tự

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

Vâng, về mặt kỹ thuật mà nhân bash dc rev :-)


1

J: 24

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

ví dụ:

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

Đừng quên: Trong Haskell, điều này sẽ hoạt động với những con số thực sự lớn.
FUZxxl

2
Ahm, đó thực sự là 79 ký tự. ;-)
Michael Kohl



1

PHP, không cạnh tranh

Tôi muốn làm điều đó mà không sử dụng chuỗi nào cả.

giải pháp lặp lại, 78 byte

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

giải pháp đệ quy, 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;

Nếu nlà một palindrom nhị phân, nửa trên xor nửa dưới cũng là một palindrom nhị phân và ngược lại.


một cổng của câu trả lời C xuất sắc từ fR0DDY , 58 byte

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

một đảo ngược nhị phân. Trứng Columbus Columbus.


1

Retina , 80 78 byte (không cạnh tranh)

Số lượng byte giả định mã hóa ISO 8859-1.

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

^(.*)¶\1

Dùng thử trực tuyến

Chuyển đổi sang unary. Chuyển đổi nó thành nhị phân. Cắt một nửa số và loại bỏ một chữ số ở giữa nếu có. Đảo ngược nửa đầu. Khớp nếu cả hai nửa bằng nhau.


1

Jelly , 12 byte (không cạnh tranh)

BṚ⁼Bị“YES“NO

Hãy thử trực tuyến!

Giải trình:

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

Trước khi in, strchức năng của Python được ánh xạ qua một danh sách và sau đó các phần tử được nối với nhau, do đó bạn nhìn thấy YEShoặc NO.


0

Haxe, 164 byte

Chỉ hoạt động với các nền tảng hệ thống (php, neko, cpp, v.v.). Đưa đầu vào thông qua các đối số dòng lệnh.

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 ký tự

return Integer.toBinaryString(i).equals(new StringBuffer(s).reverse()+"")?"YES":"NO";
    Chuỗi s = Integer.toBinaryString (i);
    return s.equals (StringBuffer mới (s) .reverse () + "")? "CÓ": "KHÔNG";

2
Nhiệm vụ gọi cho một chương trình đầy đủ.
Joey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.