숫자의 이진 표현은 회문입니까?


16

숫자의 이진 표현이 회문인지 아닌지를 찾기 위해 완전한 프로그램을 작성 하시겠습니까?

Sample Input
5

Sample Output
YES

YES이진 표현이 회문 또는 NO기타 인 경우 인쇄 합니다 .


회문 이 아닌 경우 출력은 무엇입니까 ?
Dogbert

@dogbert 따옴표없이 'NO'여야합니다.
fR0DDY

이것이 회문임을 어떻게 알 수 있습니까? 0이 아닌 첫 번째부터 "문자열"의 끝까지의 값이 회 문식이기 때문에? 이것은 도전으로 나에게 정말 나쁜 냄새가납니다.
jcolebrand

1
내가 <3 gnibbler의 대답처럼, 실제로 가장 짧은 해결책은 아니며 [code-golf] 태그가 붙은 질문은 가장 짧은 해결책을 승자로 선택해야합니다.
Chris Jester-Young

입력 방법은 무엇입니까?
Joey

답변:


5

골프 스크립트-22 자

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

24

파이썬-46 자

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

와. 무엇을 [n!=n[::-1]::2]합니까?
Dogbert

2
@Dogbert, n [::-1]은 슬라이스입니다. 시작 및 끝 색인은 비어 있으므로 전체 문자열을 의미합니다. stepsize는 -1이므로 [::-1]이 표시되면 문자열 / 목록 등을 반대로 전환하는 짧은 방법입니다. 따라서 n이 아닌 경우 n! = n [::-1]은 True (예 : 1)입니다. 회문. 따라서 n이 회 문인 경우 'YNEOS'[0 :: 2]를 얻습니다. 0에서 시작하여 두 번째 문자를 모두받습니다. n이 회문이 아닌 경우 'YNEOS'[1 :: 2]-1에서 시작하여 매 초마다 문자를 가져
옵니다.

나는 사람들이 슬라이스 트릭에 투표한다고 생각합니다. :), 그렇습니다. : P +1
st0le

4

루비, 41 39

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

Michael Kohl의 "% b"% s 트릭 덕분에.


아주 좋은, 나는 이것을 많이 좋아한다! 창조적 인 방법으로 우주선을 사용하는 +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*=2, v>>=1v/=2{};?

@paxdiablo 실제로. 변경되었습니다. 고마워
fR0DDY

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

이 용어를 루프 본문으로 이동하면 다른 바이트가 절약됩니다.
Titus

3

자바 스크립트 -79 77 자

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

추가 정보

prompt()*1 : 문자열을 숫자로 변환하는 빠른 트릭.

.toString(2) : 자바 스크립트에서 바이너리로 변환하는 방법입니다.

a.split("").reverse().join("") : There is no native support to reverse string, so you have to convert string to array and array to string.

("[part1]" - "[part 2]")?"YES":"NO" : - is a replacement for != to save 1 char.


1
Excellent explanation.
TehShrike

2

PHP - 41

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

Test:

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

4
If you're going to use shell calls to get the input, might as well use m4 instead of cat to save one. There's also pg and dd (which writes some bytes to stderr).
Nabb

Have You tried that on Windows? ;)
Titus

2

Perl, 45 characters

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

2

Ruby, 43 characters

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

Save 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 bytes (non-competing)

‘NO…Ü‘#EbÂQè

-5 bytes thanks to Adnan.

Try it online!


Hey nice! I tried to golf it a bit and came to 12 bytes ‘NO…Ü‘#EbÂQè :).
Adnan

Great! I still don't know how to use/make compressed strings. Also, I didn't know the function bin() existed
acrolith

2
There is actually a detailed example here, if you are interested :).
Adnan

This answer is non-competing since the question predates the language.
Okx


1

Perl (73)

No string reverse:

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

1

Perl (127)

This one constructs all palindromes up to 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 chars

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

Well, technically that's bash and dc and rev :-)


1

J: 24

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

eg:

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

Don't forget: In Haskell, this will work with really big numbers.
FUZxxl

2
Ahm, that's actually 79 characters. ;-)
Michael Kohl

1

C (77 bytes)

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

TEST


1

Pyth, 18 bytes

%2>"YNEOS"!qJ.BQ_J

Also 18 bytes:

@,"NO""YES"qJ.BQ_J

1

PHP, not competing

I wanted to do it without using strings at all.

iterative solution, 78 bytes

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

recursive solution, 113 bytes

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;

If n is a binary palindrome, the upper half xor the lower half is also a binary palindrome and vice versa.


a port of the excellent C answer from fR0DDY, 58 bytes

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

a binary reverse. Columbus´ egg.


1

Retina, 80 78 bytes (non-competing)

Byte count assumes ISO 8859-1 encoding.

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

^(.*)¶\1

Try it online

Convert to unary. Convert that to binary. Cut the number in half and remove a middle digit if there is one. Reverse the first half. Match if both halves are equal.


1

Jelly, 12 bytes (non-competing)

BṚ⁼Bị“YES“NO

Try it online!

Explanation:

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

Before printing, Python's str function is mapped through a list, and then the elements are concatenated, so you see YES or NO.


0

Haxe, 164 bytes

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.