La rappresentazione binaria di un numero è palindromo o no?


16

Scrivi un programma completo per scoprire se la rappresentazione binaria di un numero è palindromo o no?

Sample Input
5

Sample Output
YES

Stampa YESse la rappresentazione binaria è palindromo e NOnon.


Quale dovrebbe essere l'output quando non è un palindromo?
— Dogbert,

@dogbert Dovrebbe essere 'NO' senza virgolette.
— fR0DDY,

Come fai a sapere che è un palindromo? Perché i valori dal primo diverso da zero alla fine della "stringa" sono palindromici? Questo ha un cattivo odore per me, come una sfida.
— jcolebrand,

1
Proprio come la risposta di I <3 gnibbler, in realtà non è la soluzione più breve e qualsiasi domanda taggata [code-golf] dovrebbe scegliere la soluzione più corta come vincitore.
— Chris Jester-Young,

Input è dato come?
— Joey

Risposte:


5

Golfscript - 22 caratteri

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

24

Python - 46 caratteri

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

Wow. Cosa fa [n!=n[::-1]::2]?
— Dogbert,

2
@Dogbert, n [:: - 1] è una sezione. Gli indici di inizio e fine sono vuoti, quindi significa l'intera stringa. Il passo è -1, quindi quando vedi [:: - 1] è un modo breve per invertire una stringa / lista ecc. Quindi n! = N [:: - 1] è True (cioè 1) quando n non è un palindromo. Pertanto, quando n è un palindromo, ottieni "YNEOS" [0 :: 2] - inizia da 0 e prendi ogni 2 ° carattere. Quando n non è un palindromo ottieni "YNEOS" [1 :: 2] - inizia da 1 e prendi ogni secondo carattere :)
— gnibbler

Penso che le persone stiano votando per il trucco della fetta :), giustamente. : P +1
— st0le

4

Ruby, 41 39

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

Grazie a "% b"% di Michael Kohl il trucco si fa.


Molto bello, mi piace molto! +1 per l'utilizzo dell'astronave in modo creativo :-)
— Michael Kohl

4

C 84 81 74 personaggi

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

Non utilizza alcuna funzione come l'inverso della stringa.


Non potresti salvare alcuni personaggi cambiando r<<=1in r*=2, v>>=1in v/=2e {}in ;?

@paxdiablo Infatti. Cambiato. Molte grazie.
— fR0DDY,

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

e spostando quel termine nel corpo del loop si salva un altro byte.
— Tito,

3

Javascript - 79 77 caratteri

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

Maggiori informazioni

prompt()*1 : Trucco rapido per convertire la stringa in numero.

.toString(2) : Ecco come convertire in binario in javascript.

a.split("").reverse().join("") : Non esiste alcun supporto nativo per invertire la stringa, quindi è necessario convertire la stringa in array e array in string.

("[part1]" - "[part 2]")?"YES":"NO": -è un sostituto per !=salvare 1 carattere.


1
Spiegazione eccellente.
— TehShrike

2

PHP - 41

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

Test:

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

4
Se hai intenzione di usare le chiamate shell per ottenere l'input, puoi anche usarlo m4invece di catsalvarne uno. C'è anche pge dd(che scrive alcuni byte su stderr).
— Nabb,

L'hai provato su Windows? ;)
— Tito,

2

Perl, 45 caratteri

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

2

Rubino, 43 caratteri

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

Salva 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 byte (non concorrenti)

‘NO…Ü‘#EbÂQè

-5 byte grazie ad Adnan.

Provalo online!


Ehi bello! Ho provato a golf un po 'e sono arrivato a 12 byte ‘NO…Ü‘#EbÂQè:).
— Adnan,

Grande! Non so ancora come usare / creare stringhe compresse. Inoltre, non sapevo che bin()esistesse la funzione
— acrolith,

2
In realtà c'è un esempio dettagliato qui , se sei interessato :).
— Adnan,

Questa risposta non è competitiva poiché la domanda precede la lingua.
— Okx,


1

Perl (73)

Nessuna stringa inversa:

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

1

Perl (127)

Questo costruisce tutti i palindromi fino a 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 caratteri

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

Beh, tecnicamente che di bash e dc e rev :-)


1

J: 24

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

per esempio:

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

Non dimenticare: in Haskell funzionerà con numeri davvero grandi.
— FUZxxl,

2
Ah, in realtà sono 79 personaggi. ;-)
— Michael Kohl


1

Pyth, 18 byte

%2>"YNEOS"!qJ.BQ_J

Anche 18 byte:

@,"NO""YES"qJ.BQ_J

1

PHP, non in competizione

Volevo farlo senza usare affatto le stringhe.

soluzione iterativa, 78 byte

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

soluzione ricorsiva, 113 byte

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è un palindromo binario, la metà superiore xo la metà inferiore è anche un palindromo binario e viceversa.


una porta della risposta C eccellente da fR0DDY , 58 byte

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

un rovescio binario. Uovo di Colombo.


1

Retina , 80 78 byte (non concorrenti)

Il conteggio dei byte presuppone la codifica ISO 8859-1.

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

^(.*)¶\1

Provalo online

Converti in unario. Converti quello in binario. Taglia il numero a metà e rimuovi una cifra centrale se ce n'è una. Invertire la prima metà. Abbina se entrambe le metà sono uguali.


1

Gelatina , 12 byte (non competitiva)

BṚ⁼Bị“YES“NO

Provalo online!

Spiegazione:

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

Prima di stampare, la strfunzione di Python viene mappata attraverso un elenco, quindi gli elementi vengono concatenati, in modo da vedere YESo NO.


0

Haxe, 164 byte

Funziona solo con piattaforme di sistema (php, neko, cpp, ecc.). Accetta input tramite argomenti della riga di 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 caratteri

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

2
L'attività richiede un programma completo.
— Joey
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.