การแทนค่าไบนารีของตัวเลขคือ palindrome หรือไม่?


16

เขียนโปรแกรมเต็มรูปแบบเพื่อค้นหาว่าการแสดงเลขฐานสองของตัวเลขเป็น Palindrome หรือไม่?

Sample Input
5

Sample Output
YES

พิมพ์YESหากการเป็นตัวแทนไบนารีคือ palindrome และNOอื่น ๆ


สิ่งที่ควรส่งออกเมื่อมันไม่ได้เป็น Palindrome
Dogbert

@dogbert มันควรเป็น 'ไม่' โดยไม่มีเครื่องหมายคำพูด
fR0DDY

คุณจะรู้ได้อย่างไรว่าเป็นอาการปวดท้อง เพราะค่าจากไม่ใช่ศูนย์แรกถึงจุดสิ้นสุดของ "สตริง" เป็น palindromic? นี่เป็นกลิ่นที่เลวร้ายสำหรับฉันอย่างมาก
jcolebrand

1
มากที่สุดเท่าที่ฉัน <3 คำตอบ gnibbler มันไม่ใช่ทางออกที่สั้นที่สุดและคำถามที่ติดแท็ก [code-golf] ควรเลือกทางออกที่สั้นที่สุดในฐานะผู้ชนะ
Chris Jester-Young

การป้อนข้อมูลจะได้รับอย่างไร
โจอี้

คำตอบ:



24

Python - 46 ตัวอักษร

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

ว้าว. อะไร[n!=n[::-1]::2]ทำอย่างไร
Dogbert

2
@Dogbert, n [:: - 1] เป็นชิ้น ดัชนีเริ่มต้นและสิ้นสุดว่างเปล่าดังนั้นจึงหมายถึงสตริงทั้งหมด stepize คือ -1 ดังนั้นเมื่อคุณเห็น [:: - 1] มันเป็นวิธีสั้น ๆ ในการย้อนสตริง / list ฯลฯ ดังนั้น n! = n [:: - 1] เป็น True (เช่น 1) เมื่อ n ไม่ palindrome ดังนั้นเมื่อ n เป็น palindrome คุณจะได้รับ 'YNEOS' [0 :: 2] - เริ่มต้นที่ 0 และรับตัวละครทุกตัวที่สอง เมื่อ n ไม่ใช่ palindrome คุณจะได้รับ 'YNEOS' [1 :: 2] - เริ่มต้นที่ 1 และรับตัวละครทุกวินาที :)
gnibbler

ฉันคิดว่าคนโหวตให้กับเคล็ดลับชิ้น :) ใช่แล้ว : P +1
st0le

4

ทับทิม, 41 39

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

ขอขอบคุณ Michael% ที่ "% b" ได้รับเล่ห์เหลี่ยม


เยี่ยมมากฉันชอบสิ่งนี้มาก! +1 สำหรับการใช้ยานอวกาศด้วยวิธีที่สร้างสรรค์ :-)
Michael Kohl

4

C 84 81 74 ตัวละคร

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

มันไม่ได้ใช้ฟังก์ชั่นใด ๆ เช่นกลับสตริง


ไม่สามารถที่คุณจะบันทึกตัวอักษรไม่กี่เปลี่ยนแปลงr<<=1เข้าr*=2, v>>=1เข้าv/=2และ{}ออกเป็น;?

@paxdiablo แน่นอน การเปลี่ยนแปลง ขอบคุณมาก.
fR0DDY

r*=2,r|=v&1-> r=r*2|v&1(-2)
ติตัส

และการย้ายคำนั้นไปที่เนื้อความของลูปจะบันทึกไบต์อื่น
ติตัส

3

Javascript - 79 77 ตัวอักษร

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

ข้อมูลมากกว่านี้

prompt()*1 : เคล็ดลับด่วนในการแปลงสตริงเป็นตัวเลข

.toString(2) : นั่นคือวิธีที่คุณแปลงเป็นไบนารี่ใน javascript

a.split("").reverse().join("") : ไม่มีการสนับสนุนดั้งเดิมเพื่อย้อนกลับสตริงดังนั้นคุณต้องแปลงสตริงเป็นอาร์เรย์และอาร์เรย์เป็นสตริง

("[part1]" - "[part 2]")?"YES":"NO": -ใช้แทน!=การบันทึก 1 อักขระ


1
คำอธิบายที่ยอดเยี่ยม
TehShrike

2

PHP - 41

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

ทดสอบ:

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

4
หากคุณจะใช้การเรียก shell เพื่อรับอินพุตอาจใช้m4แทนcatการบันทึกหนึ่งครั้ง นอกจากนี้ยังมีpgและdd(ซึ่งเขียนบางไบต์ไปยัง stderr)
Nabb

คุณลองใช้งาน Windows แล้วหรือยัง? ;)
ติตัส

2

Perl, 45 ตัวอักษร

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



2

05AB1E, 17 12 ไบต์ (ไม่ใช่การแข่งขัน)

‘NO…Ü‘#EbÂQè

-5 ไบต์ขอบคุณ Adnan

ลองออนไลน์!


เฮ้! ฉันพยายามตีกอล์ฟแล้วถึง 12 ไบต์‘NO…Ü‘#EbÂQè:)
Adnan

ที่ดี! ฉันยังไม่รู้วิธีใช้ / สร้างสตริงที่บีบอัด นอกจากนี้ฉันไม่ทราบว่ามีฟังก์ชันนี้bin()อยู่หรือไม่
acrolith

2
จริงๆแล้วมีตัวอย่างโดยละเอียดที่นี่ถ้าคุณสนใจ :)
Adnan

คำตอบนี้ไม่ใช่การแข่งขันเนื่องจากคำถามมีมาก่อนภาษา
Okx


1

Perl (73)

ไม่มีการย้อนกลับสตริง:

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

1

Perl (127)

อันนี้สร้าง palindromes ทั้งหมดได้สูงสุด 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 ตัวอักษร

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

ดีในทางเทคนิคว่าbash และ dc และ rev :-)


1

J: 24

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

เช่น:

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

อย่าลืม: ใน Haskell สิ่งนี้จะใช้ได้กับคนจำนวนมากจริงๆ
FUZxxl

2
อ๊ะนั่นคือตัวอักษร 79 ตัว ;-)
Michael Kohl



1

PHP ไม่ใช่การแข่งขัน

ฉันต้องการที่จะทำโดยไม่ต้องใช้สายเลย

โซลูชันวนซ้ำ 78 ไบต์

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

โซลูชันแบบเรียกซ้ำ 113 ไบต์

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;

ถ้าnเป็นไบนารี Palindrome, ครึ่งบนของ xor, ครึ่งล่างยังเป็นไบนารี palindrome และในทางกลับกัน


พอร์ตของคำตอบ C ที่ยอดเยี่ยมจาก fR0DDY , 58 ไบต์

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

ย้อนกลับแบบไบนารี ไข่โคลัมบัส


1

เรติน่า , 80 78 ไบต์ (ไม่แข่งขัน)

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

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

^(.*)¶\1

ลองออนไลน์

แปลงเป็นเอก แปลงเป็นไบนารี่ ตัดตัวเลขครึ่งแล้วลบตัวเลขกลางหากมี กลับครึ่งแรก จับคู่ถ้าทั้งสองแบ่งเท่ากัน


1

เยลลี่ 12 ไบต์ (ไม่แข่งขัน)

BṚ⁼Bị“YES“NO

ลองออนไลน์!

คำอธิบาย:

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

ก่อนที่จะพิมพ์, ธstrฟังก์ชั่นแมปผ่านรายการแล้วองค์ประกอบที่มีการตัดแบ่งเพื่อให้คุณเห็นหรือYESNO


0

Haxe, 164 ไบต์

ใช้งานได้กับแพลตฟอร์มระบบเท่านั้น (php, neko, cpp, ฯลฯ ) รับอินพุตผ่านอาร์กิวเมนต์บรรทัดรับคำสั่ง

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 ตัวอักษร

return Integer.toBinaryString(i).equals(new StringBuffer(s).reverse()+"")?"YES":"NO";
    String s = Integer.toBinaryString (i);
    ส่งคืน s.equals (StringBuffer ใหม่ (.) .reverse () + "")? "YES": "ไม่";

2
งานเรียกร้องให้โปรแกรมเต็มรูปแบบ
โจอี้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.