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.