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.


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

24

Python - 46 Zeichen

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

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.


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.


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.


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

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

2

Ruby, 43 Zeichen

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

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]]

2

05AB1E, 17 12 Bytes (nicht konkurrierend)

‘NO…Ü‘#EbÂQè

-5 Bytes dank Adnan.

Probieren Sie es online!


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

Perl (73)

Keine Umkehrung der Zeichenfolge:

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

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

1

Bash, 55 Zeichen

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

Nun, technisch gesehen ist das bash und dc und rev :-)


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

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

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


1

Pyth, 18 Bytes

%2>"YNEOS"!qJ.BQ_J

Auch 18 Bytes:

@,"NO""YES"qJ.BQ_J

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.


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.


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.


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");}}


-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";

2
Die Aufgabe erfordert ein vollständiges Programm.
Joey
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.