数字的二进制表示是回文吗?


16

编写一个完整的程序以查找数字的二进制表示形式是否为回文式?

Sample Input
5

Sample Output
YES

YES如果二进制表示形式是回文,NO则打印。


如果不是回文,应该输出什么?
Dogbert

@dogbert不带引号的情况下应该为'NO'。
fR0DDY 2011年

您怎么知道这是回文?因为从第一个非零到“字符串”末尾的值是回文的?作为挑战,这对我来说真的很难闻。
jcolebrand

1
就像我<3个小问题的答案一样,它实际上并不是最短的解决方案,任何标记为[code-golf]的问题都应选择最短的解决方案作为赢家。
克里斯·杰斯特·杨

输入是怎么给出的?
乔伊(Joey)

Answers:



24

Python-46个字符

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

哇。怎么[n!=n[::-1]::2]办?
Dogbert

2
@ Dogbert,n [::-1]是一个切片。开始和结束索引为空,因此表示整个字符串。步长为-1,因此,当您看到[::-1]时,这是反转字符串/列表等的简短方法。因此,当n不等于时,n!= n [::-1]为True(即1)。回文。因此,当n是回文集时,您会得到'YNEOS'[0 :: 2]-从0开始,每隔2个字符取一个。当n不是回文时,您会得到“ YNEOS” [1 :: 2]-从1开始并隔第二个字符:)
gnibbler

我认为人们赞成切片技巧:),是的。:P +1
st0le 2011年

4

红宝石,41 39

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

感谢Michael Kohl的“%b”%get技巧。


很好,我非常喜欢!+1以创造性的方式使用飞船:-)
Michael Kohl

4

C 84 81 74个字符

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

它不使用任何函数,例如反向字符串。


您是否可以保存一些更改r<<=1r*=2v>>=1变为v/=2{}变为的字符;

@paxdiablo确实。变了 非常感谢。
fR0DDY

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

并将该术语移到循环主体中可节省另一个字节。
泰特斯(Titus)2016年

3

Javascript- 79 77个字符

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

更多信息

prompt()*1 :将字符串转换为数字的快速技巧。

.toString(2) :这就是您在javascript中转换为二进制文件的方式。

a.split("").reverse().join("") :没有反向字符串的本机支持,因此您必须将字符串转换为数组,并将数组转换为字符串。

("[part1]" - "[part 2]")?"YES":"NO"-是一种替代!=,以节省1个字符。


1
很好的解释。
2011年

2

PHP-41

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

测试:

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

4
如果要使用shell调用获取输入,则最好使用m4而不是cat保存输入。还有pgand dd(将一些字节写入stderr)。
Nabb 2011年

您在Windows上尝试过吗?;)
Titus

2

Perl,45个字符

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


2

Windows PowerShell,67

('NO','YES')[($a=[Convert]::ToString("$input",2))-eq-join$a[64..0]]

2

05AB1E,17 12字节(非竞争)

‘NO…Ü‘#EbÂQè

-5字节感谢Adnan。

在线尝试!


嘿,真好!我试了一下,结果达到了12个字节‘NO…Ü‘#EbÂQè:)。
阿德南

大!我仍然不知道如何使用/制作压缩字符串。另外,我不知道该功能是否bin()存在
Acrolith

2
如果您有兴趣,实际上这里有一个详细的示例:)。
阿德南

由于该问题早于该语言,因此该答案没有竞争力。
Okx


1

佩尔(73)

没有字符串反向:

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

1

Perl(127)

这个构造了所有回文数达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个字符

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

好吧,从技术上讲,这是bash and dc rev :-)


1

J:24

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

例如:

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

哈斯克尔(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

不要忘记:在Haskell中,这将适用于非常大的数字。
FUZxxl 2011年

2
Ahm,实际上是79个字符。;-)
Michael Kohl


1

Pyth,18个字节

%2>"YNEOS"!qJ.BQ_J

同样是18个字节:

@,"NO""YES"qJ.BQ_J

1

PHP,不竞争

我想完全不使用字符串。

迭代解决方案,78字节

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

递归解决方案,113字节

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是二元回文,则上半部分或下半部分也是二元回文,反之亦然。


来自fR0DDY的出色C答案的端口,58个字节

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

二进制反向。哥伦布蛋。


1

视网膜80 78字节(非竞争)

字节数假定为ISO 8859-1编码。

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

^(.*)¶\1

在线尝试

转换为一元。将其转换为二进制。将数字切成两半,如果有中间数字,则将其删除。颠倒前半部分。如果两个相等,则匹配。


1

果冻,12个字节(无竞争)

BṚ⁼Bị“YES“NO

在线尝试!

说明:

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

在打印之前,Python的str功能通过列表进行映射,然后将元素串联在一起,因此您将看到YESNO


0

Haxe,164个字节

Works only with system platforms (php, neko, cpp, etc.). Takes input through command line arguments.

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 characters

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
The task calls for a full program.
Joey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.