A representação binária de um número é palíndromo ou não?

16

Escreva um programa completo para descobrir se a representação binária de um número é palíndromo ou não?

Sample Input
5

Sample Output
YES

Imprima YESse a representação binária for palíndromo ou NOnão.

fR0DDY
fonte
Qual deve ser a saída quando é não um palíndromo?
318 Dogbert
@dogbert Deve ser 'NÃO' sem as aspas.
FR0DDY
Como você sabe que é um palíndromo? Como os valores do primeiro diferente de zero até o final da "string" são palíndricos? Isso cheira muito mal para mim, como um desafio.
9132 jcolebrand
11
Da mesma forma que a resposta de <3 gnibbler, não é realmente a solução mais curta, e qualquer pergunta marcada [code-golf] deve escolher a solução mais curta como a vencedora.
21411 Chris-Jester-Young
Entrada é dada como?
Joey

Respostas:

5

Golfscript - 22 caracteres

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

Python - 46 caracteres

n=bin(input())[2:]
print'YNEOS'[n!=n[::-1]::2]
mordedor
fonte
Uau. O que [n!=n[::-1]::2]faz?
Dogbert
2
@Dogbert, n [:: - 1] é uma fatia. Os índices inicial e final estão vazios, portanto, significa toda a cadeia. O tamanho da etapa é -1; portanto, quando você vê [:: - 1], é uma maneira curta de reverter uma string / lista etc. Portanto, n! = N [:: - 1] é True (ou seja, 1) quando n não é um palíndromo. Portanto, quando n é um palíndromo, você obtém 'YNEOS' [0 :: 2] - comece em 0 e pegue cada segundo caractere. Quando n não é um palíndromo, você obtém 'YNEOS' [1 :: 2] - inicie com 1 e pegue todos os segundos caracteres :) #
gnibbler
Acho que as pessoas estão votando no truque das fatias :), com razão. : P +1
st0le
4

Ruby, 41 39

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

Graças ao "% b"% de Michael Kohl, o truque.

steenslag
fonte
Muito bom, eu gosto muito disso! +1 para usar a nave espacial de forma criativa :-)
Michael Kohl
4

C 84 81 74 Caracteres

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

Ele não usa nenhuma função como string reverse.

fR0DDY
fonte
Você não poderia salvar algumas personagens mudando r<<=1para r*=2, v>>=1em v/=2e {}em ;?
@paxdiablo De fato. Changed. Muito obrigado.
FR0DDY
r*=2,r|=v&1-> r=r*2|v&1(-2)
Tito
e mover esse termo para o corpo do loop salva outro byte.
Titus
3

Javascript - 79 77 caracteres

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

Mais Informações

prompt()*1 : Truque rápido para converter string em número.

.toString(2) : É assim que você converte para binário em javascript.

a.split("").reverse().join("") : Não há suporte nativo para reverter a sequência, portanto, você deve converter a sequência em matriz e a matriz em sequência.

("[part1]" - "[part 2]")?"YES":"NO": -é um substituto para !=salvar 1 caractere.

HoLyVieR
fonte
11
Excelente explicação.
precisa saber é o seguinte
2

PHP - 41

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

Teste:

php 713.php <<< 5
YES
php 713.php <<< 6
NO
Arnaud Le Blanc
fonte
4
Se você usar chamadas de shell para obter a entrada, use-a em m4vez de catsalvar uma. Há também pge dd(que grava alguns bytes no stderr).
Nabb
Você já tentou isso no Windows? ;)
Tito
2

Perl, 45 caracteres

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

fonte
2

Ruby, 43 caracteres

puts((n="%b"%gets)==n.reverse ? "YES":"NO")
Michael Kohl
fonte
Salve 2:puts (n="%b"%gets)==n.reverse ? :YES: :NO
Phrogz 02/03
2

Windows PowerShell, 67

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

05AB1E, 17 12 bytes (não concorrente)

‘NO…Ü‘#EbÂQè

-5 bytes graças a Adnan.

Experimente online!

acrólito
fonte
Hey nice! Eu tentei jogar um pouco e cheguei a 12 bytes ‘NO…Ü‘#EbÂQè:).
Adnan
Ótimo! Ainda não sei como usar / criar seqüências de caracteres compactadas. Além disso, eu não sabia que a função bin()existia
acrolith 25/09/16
2
Na verdade, há um exemplo detalhado aqui , se você estiver interessado :).
Adnan
Esta resposta não é competitiva, pois a pergunta é anterior ao idioma.
Okx
1

Python (51)

n=bin(input())[2:]
print'YES'if n==n[::-1]else'NO'
Hoa Long Tam
fonte
Você pode['NO','YES'][n==n[::-1]]
Karl Napf 03/11
1

Perl (73)

Sem seqüência reversa:

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

fonte
1

Perl (127)

Este constrói todos os palíndromos até 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

fonte
1

Bash, 55 caracteres

C=`dc<<<$1\ 2op`;[ $C = `rev<<<$C` ]&&echo YES||echo NO
ninjalj
fonte
Bem, tecnicamente desse bash e dc e rev :-)
1

J - 33 caracteres

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

J: 24

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

por exemplo:

   ((-:|.)#: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
fonte
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
fonte
Não se esqueça: em Haskell, isso funcionará com números realmente grandes.
FUZxxl
2
Ahm, na verdade são 79 caracteres. ;-) #
933 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");}

TESTE

Quixotesco
fonte
1

Pitão, 18 bytes

%2>"YNEOS"!qJ.BQ_J

Também 18 bytes:

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

PHP, não competindo

Eu queria fazer isso sem usar strings.

solução iterativa, 78 bytes

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

solução recursiva, 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;

Se né um palíndromo binário, a metade superior ou a metade inferior também é um palíndromo binário e vice-versa.


uma porta da excelente resposta C de fR0DDY , 58 bytes

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

um reverso binário. Ovo de Colombo.

Titus
fonte
1

Retina , 80 78 bytes (não concorrente)

A contagem de bytes assume a codificação ISO 8859-1.

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

^(.*)¶\1

Experimente online

Converta para unário. Converta isso em binário. Corte o número ao meio e remova um dígito do meio, se houver um. Inverta a primeira metade. Combine se as duas metades forem iguais.

mbomb007
fonte
1

Gelatina , 12 bytes (não concorrente)

BṚ⁼Bị“YES“NO

Experimente online!

Explicação:

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

Antes de imprimir, a strfunção do Python é mapeada através de uma lista e os elementos são concatenados, para que você veja YESou NO.

Erik, o Outgolfer
fonte
0

Haxe, 164 bytes

Funciona apenas com plataformas de sistema (php, neko, cpp, etc.). Recebe entrada através de argumentos de linha de comando.

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

Matlab, 71 bytes

function paly(n)
v=de2bi(n);
if v==v(numel(v):-1:1)
'YES'
else
'NO'
end
digital-Ink
fonte
11
Bem-vindo ao PPCG!
Martin Ender
-1

Java, 97 85 caracteres

return Integer.toBinaryString(i).equals(new StringBuffer(s).reverse()+"")?"YES":"NO";
    String s = Integer.toBinaryString (i);
    return s.equals (new StringBuffer (s) .reverse () + "")? "SIM": "NÃO";
Otaviano A. Damiean
fonte
2
A tarefa exige um programa completo.
Joey