La représentation binaire d'un nombre est-elle palindrome ou non?

16

Ecrire un programme complet pour savoir si la représentation binaire d'un nombre est palindrome ou non?

Sample Input
5

Sample Output
YES

Imprimer YESsi la représentation binaire est palindrome et NOautre.

fR0DDY
la source
Quelle devrait être la sortie quand ce n'est pas un palindrome?
Dogbert
@dogbert Cela devrait être 'NON' sans les guillemets.
fR0DDY
Comment savez-vous que c'est un palindrome? Parce que les valeurs du premier non nul à la fin de la "chaîne" sont palindromiques? Cela me sent vraiment mauvais, comme un défi.
jcolebrand
1
Tout comme la réponse de <3 gnibbler, ce n'est pas vraiment la solution la plus courte, et toute question étiquetée [code-golf] devrait choisir la solution la plus courte en tant que gagnant.
Chris Jester-Young
L'entrée est donnée comment?
Joey

Réponses:

5

Golfscript - 22 caractères

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

Python - 46 caractères

n=bin(input())[2:]
print'YNEOS'[n!=n[::-1]::2]
grignoteur
la source
Sensationnel. Que fait [n!=n[::-1]::2]-il?
Dogbert
2
@Dogbert, n [:: - 1] est une tranche. Les index de début et de fin sont vides, cela signifie donc la chaîne entière. La taille du pas est -1, donc quand vous voyez [:: - 1] c'est un court chemin pour inverser une chaîne / liste etc. Donc n! = N [:: - 1] est True (ie 1) quand n n'est pas un palindrome. Par conséquent, lorsque n est un palindrome, vous obtenez 'YNEOS' [0 :: 2] - commencez à 0 et prenez chaque 2ème caractère. Lorsque n n'est pas un palindrome, vous obtenez 'YNEOS' [1 :: 2] - commencez à 1 et prenez chaque deuxième caractère :)
gnibbler
Je pense que les gens votent pour le truc de la tranche :), à juste titre. : P +1
st0le
4

Rubis, 41 39

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

Merci à Michael Kohl, "% b"% obtient un truc.

steenslag
la source
Très sympa, j'aime beaucoup ça! +1 pour avoir utilisé le vaisseau spatial de manière créative :-)
Michael Kohl
4

C 84 81 74 Caractères

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

Il n'utilise aucune fonction comme la chaîne inverse.

fR0DDY
la source
Ne pourriez-vous pas enregistrer quelques caractères se transformant r<<=1en r*=2, v>>=1en v/=2et {}en ;?
@paxdiablo En effet. Modifié. Merci beaucoup.
fR0DDY
r*=2,r|=v&1 -> r=r*2|v&1 (-2)
Titus
et déplacer ce terme vers le corps de la boucle économise un autre octet.
Titus
3

Javascript - 79 77 caractères

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

Plus d'information

prompt()*1 : Astuce rapide pour convertir une chaîne en nombre.

.toString(2) : Voilà comment vous convertissez en binaire en javascript.

a.split("").reverse().join("") : Il n'y a pas de support natif pour inverser la chaîne, vous devez donc convertir la chaîne en tableau et le tableau en chaîne.

("[part1]" - "[part 2]")?"YES":"NO": -est un remplacement pour !=enregistrer 1 caractère.

HoLyVieR
la source
1
Excellente explication.
TehShrike
2

PHP - 41

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

Tester:

php 713.php <<< 5
YES
php 713.php <<< 6
NO
Arnaud Le Blanc
la source
4
Si vous allez utiliser des appels shell pour obtenir l'entrée, vous pourriez aussi bien utiliser m4au lieu d' caten enregistrer un. Il y a aussi pget dd(qui écrit quelques octets dans stderr).
Nabb
Avez-vous essayé cela sous Windows? ;)
Titus
2

Perl, 45 caractères

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

la source
2

Ruby, 43 caractères

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

05AB1E, 17 12 octets (non concurrent)

‘NO…Ü‘#EbÂQè

-5 octets grâce à Adnan.

Essayez-le en ligne!

acrolithe
la source
Hé bien! J'ai essayé de jouer au golf un peu et je suis arrivé à 12 octets ‘NO…Ü‘#EbÂQè:).
Adnan
Génial! Je ne sais toujours pas comment utiliser / créer des chaînes compressées. De plus, je ne savais pas que la fonction bin()existait
acrolith
2
Il y a en fait un exemple détaillé ici , si vous êtes intéressé :).
Adnan
Cette réponse n'est pas concurrente puisque la question est antérieure à la langue.
Okx
1

Python (51)

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

Perl (73)

Pas de chaîne inversée:

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

la source
1

Perl (127)

Celui-ci construit tous les palindromes jusqu'à 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

la source
1

Bash, 55 caractères

C=`dc<<<$1\ 2op`;[ $C = `rev<<<$C` ]&&echo YES||echo NO
ninjalj
la source
Eh bien, techniquement, c'est bash et dc et rev :-)
1

J - 33 caractères

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

J: 24

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

par exemple:

   ((-:|.)#: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
la source
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
la source
N'oubliez pas: à Haskell, cela fonctionnera avec de très gros nombres.
FUZxxl
2
Ahm, c'est en fait 79 caractères. ;-)
Michael Kohl
1

C (77 octets)

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

TESTER

Chimérique
la source
1

Pyth, 18 octets

%2>"YNEOS"!qJ.BQ_J

Aussi 18 octets:

@,"NO""YES"qJ.BQ_J
drobilc
la source
1

PHP, pas en compétition

Je voulais le faire sans utiliser de cordes du tout.

solution itérative, 78 octets

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

solution récursive, 113 octets

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;

S'il ns'agit d'un palindrome binaire, la moitié supérieure xou la moitié inférieure est également un palindrome binaire et vice versa.


un port de l'excellente réponse C de fR0DDY , 58 octets

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

un revers binaire. Oeuf de Columbus.

Titus
la source
1

Rétine , 80 78 octets (non concurrent)

Le nombre d'octets suppose un codage ISO 8859-1.

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

^(.*)¶\1

Essayez-le en ligne

Convertissez en unaire. Convertissez cela en binaire. Coupez le nombre en deux et supprimez un chiffre du milieu s'il y en a un. Inversez la première moitié. Match si les deux moitiés sont égales.

mbomb007
la source
1

Gelée , 12 octets (non concurrent)

BṚ⁼Bị“YES“NO

Essayez-le en ligne!

Explication:

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

Avant l'impression, la strfonction de Python est mappée à travers une liste, puis les éléments sont concaténés, donc vous voyez YESou NO.

Erik le Outgolfer
la source
0

Haxe, 164 octets

Fonctionne uniquement avec les plates-formes système (php, neko, cpp, etc.). Prend des entrées via des arguments de ligne de commande.

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
la source
0

Matlab, 71 octets

function paly(n)
v=de2bi(n);
if v==v(numel(v):-1:1)
'YES'
else
'NO'
end
encre numérique
la source
1
Bienvenue chez PPCG!
Martin Ender
-1

Java, 97 85 caractères

return Integer.toBinaryString(i).equals(new StringBuffer(s).reverse()+"")?"YES":"NO";
    String s = Integer.toBinaryString (i);
    return s.equals (nouveau StringBuffer (s) .reverse () + "")? "YES": "NO";
Octavian A. Damiean
la source
2
La tâche nécessite un programme complet.
Joey