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.

fR0DDY
fuente
¿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
Nabb
fuente
24

Python - 46 caracteres

n=bin(input())[2:]
print'YNEOS'[n!=n[::-1]::2]
gnibbler
fuente
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.

steenslag
fuente
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.

fR0DDY
fuente
¿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.

HoLyVieR
fuente
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
Arnaud Le Blanc
fuente
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

fuente
2

Ruby, 43 caracteres

puts((n="%b"%gets)==n.reverse ? "YES":"NO")
Michael Kohl
fuente
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]]
Joey
fuente
2

05AB1E, 17 12 bytes (no competitivos)

‘NO…Ü‘#EbÂQè

-5 bytes gracias a Adnan.

Pruébalo en línea!

acrolito
fuente
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

Pitón (51)

n=bin(input())[2:]
print'YES'if n==n[::-1]else'NO'
Hoa Long Tam
fuente
Puedes['NO','YES'][n==n[::-1]]
Karl Napf
1

Perl (73)

Sin cadena inversa:

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

fuente
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

fuente
1

Bash, 55 caracteres

C=`dc<<<$1\ 2op`;[ $C = `rev<<<$C` ]&&echo YES||echo NO
ninjalj
fuente
Bueno, técnicamente que de bash y dc y rev :-)
1

J - 33 caracteres

13 : ';(]-:|.)#:y{''YES'';''NO'''
MPelletier
fuente
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
Eelvex
fuente
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
fuente
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

Quijotesco
fuente
1

Pyth, 18 bytes

%2>"YNEOS"!qJ.BQ_J

También 18 bytes:

@,"NO""YES"qJ.BQ_J
drobilc
fuente
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.

Titus
fuente
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.

mbomb007
fuente
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.

Erik el Outgolfer
fuente
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");}}
Yytsi
fuente
0

Matlab, 71 bytes

function paly(n)
v=de2bi(n);
if v==v(numel(v):-1:1)
'YES'
else
'NO'
end
tinta digital
fuente
1
Bienvenido a PPCG!
Martin Ender
-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";
Octavian A. Damiean
fuente
2
La tarea requiere un programa completo.
Joey