La representación binaria de un número es palíndromo o no?


16

¿Escribir un programa completo para determinar si la representación binaria de un número es palíndromo o no?

Sample Input
5

Sample Output
YES

Imprima YESsi la representación binaria es palíndromo y de lo NOcontrario.


¿Cuál debe ser la salida cuando es no un palíndromo?
Dogbert

@dogbert Debería ser 'NO' sin las comillas.
fR0DDY

¿Cómo sabes que es un palíndromo? ¿Porque los valores desde el primer cero hasta el final de la "cadena" son palindrómicos? Esto me huele muy mal, como un desafío.
jcolebrand

1
Al igual que la respuesta de <3 gnibbler, en realidad no es la solución más corta, y cualquier pregunta etiquetada [código-golf] debería elegir la solución más corta como el ganador.
Chris Jester-Young

La entrada se da cómo?
Joey

Respuestas:


5

Golfscript - 22 caracteres

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

24

Python - 46 caracteres

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

Guau. ¿Qué [n!=n[::-1]::2]hacer?
Dogbert

2
@Dogbert, n [:: - 1] es un segmento. Los índices de inicio y fin están vacíos, por lo que significa la cadena completa. El tamaño del paso es -1, así que cuando ve [:: - 1] es una forma corta de revertir una cadena / lista, etc. Entonces n! = N [:: - 1] es Verdadero (es decir, 1) cuando n no es un palíndromo Por lo tanto, cuando n es un palíndromo, obtienes 'YNEOS' [0 :: 2]: comienza en 0 y toma cada segundo carácter. Cuando n no es un palíndromo, obtienes 'YNEOS' [1 :: 2] - comienza en 1 y toma cada segundo personaje :)
gnibbler

Creo que la gente está votando por el truco del corte :), con razón. : P +1
st0le

4

Rubí, 41 39

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

Gracias al "% b"% de Michael Kohl se engaña.


Muy bien, me gusta mucho esto! +1 por usar la nave espacial de una manera creativa :-)
Michael Kohl

4

C 84 81 74 Personajes

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

No usa ninguna función como string reverse.


¿No podrías salvar a algunos personajes cambiando r<<=1a r*=2, v>>=1dentro v/=2y {}dentro ;?

@paxdiablo De hecho. Cambiado. Muchas gracias.
fR0DDY

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

y mover ese término al cuerpo del bucle guarda otro byte.
Titus

3

Javascript - 79 77 caracteres

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

Más información

prompt()*1 : Truco rápido para convertir una cadena en un número.

.toString(2) : Así es como se convierte a binario en javascript.

a.split("").reverse().join("") : No hay soporte nativo para invertir la cadena, por lo que debe convertir la cadena en matriz y la matriz en cadena.

("[part1]" - "[part 2]")?"YES":"NO": -es un reemplazo para !=guardar 1 char.


1
Excelente explicación
TehShrike

2

PHP - 41

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

Prueba:

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

44
Si va a usar llamadas de shell para obtener la entrada, también podría usarlas en m4lugar de catguardar una. También hay pgy dd(que escribe algunos bytes en stderr).
Nabb

¿Has probado eso en Windows? ;)
Tito

2

Perl, 45 caracteres.

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

2

Ruby, 43 caracteres

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

Ahorro 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 (no competitivos)

‘NO…Ü‘#EbÂQè

-5 bytes gracias a Adnan.

Pruébalo en línea!


Hola bonito Intenté jugar un poco al golf y llegué a 12 bytes ‘NO…Ü‘#EbÂQè:).
Adnan

¡Excelente! Todavía no sé cómo usar / hacer cadenas comprimidas. Además, no sabía que bin()existía la función
acrolith el

2
En realidad, hay un ejemplo detallado aquí , si está interesado :).
Adnan

Esta respuesta no es competitiva ya que la pregunta es anterior al idioma.
Okx


1

Perl (73)

Sin cadena inversa:

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

1

Perl (127)

Éste construye todos los palíndromos hasta 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 caracteres

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

Bueno, técnicamente que de bash y dc y rev :-)


1

J: 24

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

p.ej:

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

No olvides: en Haskell, esto funcionará con números realmente grandes.
FUZxxl

2
Ahm, en realidad son 79 caracteres. ;-)
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");}

PRUEBA


1

Pyth, 18 bytes

%2>"YNEOS"!qJ.BQ_J

También 18 bytes:

@,"NO""YES"qJ.BQ_J

1

PHP, no compitiendo

Quería hacerlo sin usar cadenas en absoluto.

solución 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;

solución 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;

Si nes un palíndromo binario, la mitad superior x la mitad inferior también es un palíndromo binario y viceversa.


un puerto de la excelente respuesta C de fR0DDY , 58 bytes

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

Un reverso binario. Huevo de Colón.


1

Retina , 80 78 bytes (no competitiva)

El recuento de bytes asume la codificación ISO 8859-1.

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

^(.*)¶\1

Pruébalo en línea

Convierte a unario. Convierta eso a binario. Corte el número por la mitad y elimine un dígito del medio si hay uno. Invierta la primera mitad. Haga coincidir si ambas mitades son iguales.


1

Jalea , 12 bytes (no competitiva)

BṚ⁼Bị“YES“NO

Pruébalo en línea!

Explicación:

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, la strfunción de Python se asigna a través de una lista, y luego los elementos se concatenan, para que vea YESo NO.


0

Haxe, 164 bytes

Funciona solo con plataformas de sistema (php, neko, cpp, etc.). Toma entrada a través de argumentos de línea 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");}}


-1

Java, 97 85 caracteres

return Integer.toBinaryString(i).equals(new StringBuffer(s).reverse()+"")?"YES":"NO";
    Cadena s = Integer.toBinaryString (i);
    return s.equals (new StringBuffer (s) .reverse () + "")? "YES": "NO";

2
La tarea requiere un programa completo.
Joey
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.