Binäre Darstellung einer Zahl ist Palindrom oder nicht?

16

Schreiben Sie ein vollständiges Programm, um festzustellen, ob die Binärdarstellung einer Zahl palindrom ist oder nicht.

Sample Input
5

Sample Output
YES

Gibt aus, YESob die binäre Darstellung palindrom ist oder NOnicht.

fR0DDY
quelle
Was soll die Ausgabe sein, wenn es kein Palindrom ist?
Dogbert
@dogbert Es sollte 'NEIN' ohne die Anführungszeichen sein.
8.
Woher weißt du, dass es ein Palindrom ist? Weil die Werte von der ersten ungleich Null bis zum Ende der "Zeichenkette" palindrom sind? Das riecht wirklich schlecht für mich als Herausforderung.
Jcolebrand
1
So sehr ich <3 knabbere, es ist eigentlich nicht die kürzeste Lösung, und jede mit [Code-Golf] markierte Frage sollte die kürzeste Lösung als Gewinner auswählen.
Chris Jester-Young
Input wird gegeben wie?
Joey

Antworten:

5

Golfscript - 22 Zeichen

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

Python - 46 Zeichen

n=bin(input())[2:]
print'YNEOS'[n!=n[::-1]::2]
Knabberzeug
quelle
Beeindruckend. Was macht [n!=n[::-1]::2]das?
Dogbert
2
@Dogbert, n [:: - 1] ist ein Slice. Der Start- und der Endindex sind leer, das heißt, die gesamte Zeichenfolge. Die Schrittweite ist -1. Wenn Sie also [:: - 1] sehen, ist dies ein kurzer Weg, um eine Zeichenfolge / Liste usw. umzukehren. Also ist n! = N [:: - 1] wahr (dh 1), wenn n nicht wahr ist ein Palindrom. Wenn n ein Palindrom ist, erhalten Sie daher 'YNEOS' [0 :: 2] - beginnen Sie bei 0 und nehmen Sie jedes zweite Zeichen. Wenn n kein Palindrom ist, bekommst du 'YNEOS' [1 :: 2] - beginne bei 1 und nimm jedes zweite Zeichen :)
gnibbler
Ich denke, die Leute stimmen für den Slice-Trick :), zu Recht. : P +1
st0le
4

Ruby, 41 39

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

Dank Michael Kohls "% b" erhält% Trick.

steenslag
quelle
Sehr schön, das gefällt mir sehr gut! +1 für die kreative Nutzung des Raumschiffs :-)
Michael Kohl
4

C 84 81 74 Zeichen

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

Es wird keine Funktion wie String Reverse verwendet.

fR0DDY
quelle
Könntest du nicht ein paar Charaktere speichern, die sich r<<=1in r*=2, v>>=1in v/=2und {}in ändern ;?
@paxdiablo In der Tat. Geändert. Danke vielmals.
Freitag,
r*=2,r|=v&1-> r=r*2|v&1(-2)
Titus
Wenn Sie diesen Begriff in den Hauptteil der Schleife verschieben, wird ein weiteres Byte gespeichert.
Titus
3

Javascript - 79 77 Zeichen

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

Mehr Informationen

prompt()*1 : Schneller Trick, um eine Zeichenfolge in eine Zahl umzuwandeln.

.toString(2) : So konvertieren Sie in Javascript in eine Binärdatei.

a.split("").reverse().join("") : Es gibt keine native Unterstützung für das Umkehren von Zeichenfolgen. Sie müssen daher Zeichenfolgen in Arrays und Arrays in Zeichenfolgen konvertieren.

("[part1]" - "[part 2]")?"YES":"NO": -ist ein Ersatz für !=1 Zeichen zu sparen.

HoLyVieR
quelle
1
Hervorragende Erklärung.
TehShrike
2

PHP - 41

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

Prüfung:

php 713.php <<< 5
YES
php 713.php <<< 6
NO
Arnaud Le Blanc
quelle
4
Wenn Sie Shell-Aufrufe verwenden, um die Eingabe abzurufen, können Sie diese auch verwenden, m4anstatt sie catzu speichern. Es gibt auch pgund dd(der einige Bytes in stderr schreibt).
Nabb
Haben Sie das unter Windows versucht? ;)
Titus
2

Perl, 45 Zeichen

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

quelle
2

Ruby, 43 Zeichen

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

05AB1E, 17 12 Bytes (nicht konkurrierend)

‘NO…Ü‘#EbÂQè

-5 Bytes dank Adnan.

Probieren Sie es online!

Akrolith
quelle
Hey schön! Ich habe versucht, ein bisschen Golf zu spielen und bin auf 12 Bytes gekommen ‘NO…Ü‘#EbÂQè:).
Adnan
Groß! Ich weiß immer noch nicht, wie ich komprimierte Zeichenfolgen verwenden soll. Außerdem wusste ich nicht, dass die Funktion bin()existiert
Acrolith
2
Es ist eigentlich ein ausführliches Beispiel hier , wenn Sie interessiert sind :).
Adnan
Diese Antwort ist nicht konkurrierend, da die Frage vor der Sprache liegt.
Ok,
1

Python (51)

n=bin(input())[2:]
print'YES'if n==n[::-1]else'NO'
Hoa Long Tam
quelle
Sie können['NO','YES'][n==n[::-1]]
Karl Napf
1

Perl (73)

Keine Umkehrung der Zeichenfolge:

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

quelle
1

Perl (127)

Dieser konstruiert alle Palindrome bis zu 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

quelle
1

Bash, 55 Zeichen

C=`dc<<<$1\ 2op`;[ $C = `rev<<<$C` ]&&echo YES||echo NO
Ninjalj
quelle
Nun, technisch gesehen ist das bash und dc und rev :-)
1

J - 33 Zeichen

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

J: 24

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

z.B:

   ((-:|.)#: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
quelle
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
quelle
Vergiss nicht: In Haskell funktioniert das mit wirklich großen Zahlen.
FUZxxl
2
Ahm, das sind eigentlich 79 Zeichen. ;-)
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");}

PRÜFUNG

Quixotic
quelle
1

Pyth, 18 Bytes

%2>"YNEOS"!qJ.BQ_J

Auch 18 Bytes:

@,"NO""YES"qJ.BQ_J
drobilc
quelle
1

PHP, nicht im Wettbewerb

Ich wollte es tun, ohne überhaupt Zeichenfolgen zu verwenden.

iterative Lösung, 78 Bytes

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

rekursive Lösung, 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;

Wenn nes sich um ein binäres Palindrom handelt, ist die obere Hälfte x oder die untere Hälfte ebenfalls ein binäres Palindrom und umgekehrt.


ein Port der exzellenten C-Antwort von fR0DDY , 58 Bytes

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

eine binäre Umkehrung. Kolumbus Ei.

Titus
quelle
1

Retina , 80 78 Bytes (nicht konkurrierend)

Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.

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

^(.*)¶\1

Probieren Sie es online aus

In Unary konvertieren. Wandle das in eine Binärdatei um. Schneiden Sie die Zahl in zwei Hälften und entfernen Sie eine mittlere Ziffer, falls es eine gibt. Kehren Sie die erste Hälfte um. Spiel, wenn beide Hälften gleich sind.

mbomb007
quelle
1

Gelee , 12 Bytes (nicht konkurrierend)

BṚ⁼Bị“YES“NO

Probieren Sie es online!

Erläuterung:

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

Vor dem Drucken wird die Python- strFunktion über eine Liste zugeordnet, und die Elemente werden dann verkettet, sodass Sie YESoder sehen NO.

Erik der Outgolfer
quelle
0

Haxe, 164 Bytes

Funktioniert nur mit Systemplattformen (php, neko, cpp usw.). Übernimmt Eingaben über Befehlszeilenargumente.

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
quelle
0

Matlab, 71 Bytes

function paly(n)
v=de2bi(n);
if v==v(numel(v):-1:1)
'YES'
else
'NO'
end
digitale Tinte
quelle
1
Willkommen bei PPCG!
Martin Ender
-1

Java, 97 85 Zeichen

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";
Octavian A. Damiean
quelle
2
Die Aufgabe erfordert ein vollständiges Programm.
Joey