ใหญ่หรือน้อย Endian


57

เขียนโปรแกรมหรือฟังก์ชั่นที่ให้ผลลัพธ์Lถ้าเรียกใช้บนสถาปัตยกรรม endian เล็ก ๆ น้อย ๆ หรือBถ้าเรียกใช้บนสถาปัตยกรรม endian ขนาดใหญ่ ตัวพิมพ์เล็กlหรือbเป็นที่ยอมรับ

ไม่มีอินพุต

การให้คะแนนคือโค้ดกอล์ฟดังนั้นโค้ดที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ

แก้ไข: ตามความคิดเห็นด้านล่างฉันชี้แจงว่ารายการจะต้องสามารถทำงานบนสถาปัตยกรรมใดก็ได้

ฉันเชื่อว่ามีคำตอบเดียวที่ส่งผลกระทบต่อและคำตอบนั้นระบุอย่างชัดเจนว่าเป็นกรณีนี้


1
หน่วยความจำของกล่อง ฉันไม่แน่ใจว่าคุณหมายความว่าอย่างไร
— Liam

7
ฉันคิดว่านี่เป็นความท้าทายที่น่าสนใจ (และเป็นวิธีที่ไม่ได้มาตรฐาน) แต่มันยากมากที่จะทดสอบ โดยเฉพาะอย่างยิ่งเนื่องจากรหัสส่วนใหญ่จะจบลงด้วยการเป็นแพลตฟอร์มที่เฉพาะเจาะจงมาก
— DJMcMayhem

7
ใช่ฉันคิดว่ามันจะน่าสนใจเพราะหวังว่ามันจะเป็นสิ่งที่ esolangs และภาษาการเล่นกอล์ฟมีช่วงเวลาที่ยากลำบากกว่าภาษา 'ปกติ' ฉันมีความรู้สึกว่าพวกเขาจะไม่ยากที่จะตรวจสอบ กรณีเลวร้ายที่สุดพวกเขาควรตรวจสอบด้วยมือ
— เลียม

2
ฉันเดาคำตอบตามรหัสเครื่องเฉพาะถูกห้ามหรือไม่ มิฉะนั้นB0 4C C3ซึ่งคือmov al, 'L' / retหรือunsigned char f(){ return 'L'; }จะเป็นคำตอบ x86 ที่ถูกต้อง
— Margaret Bloom

5
ไชโย! สำหรับการแข่งขันกอล์ฟรหัสซึ่งภาษาการเขียนโปรแกรมเอนกประสงค์สามารถแข่งขันได้
— PellMell

คำตอบ:


42

Python ขนาด 33 ไบต์

import sys
exit(sys.byteorder[0])

sys.byteorderเป็นอย่างใดอย่างหนึ่ง'little'หรือ'big'(และสำหรับผู้ที่จะอ่านประโยคนี้โดยไม่ต้องดูรหัส[0]หมายถึงใช้อักขระตัวแรก)


ความท้าทายบอกว่าผลลัพธ์จะต้องเป็นLและB(หรือตัวแปรตัวพิมพ์เล็ก) ไม่ใช่ทั้งคำ
— user2428118

43
นั่นเป็นเหตุผลที่มันพูดว่าคือถ่านแรกของsys.byteorder[0] byteorder
— s3lph

36

C, 26 ไบต์

a=66<<24|76;f(){puts(&a);}

ถือว่าintอักขระ32 บิตและ ASCII ทดสอบกับ amd64 (little-endian) และ mips (big-endian)

GCC 23 ไบต์

00000000: 613d 2742 0000 4c27 3b66 2829 7b70 7574  a='B..L';f(){put
00000010: 7328 2661 293b 7d                        s(&a);}

แนะนำโดย feersum ค่าของค่าคงที่แบบหลายตัวอักษรนั้นขึ้นอยู่กับการนำไปใช้ แต่ดูเหมือนว่าจะใช้งานได้ใน GCC ทดสอบกับสถาปัตยกรรมเดียวกัน


7
Shorter is a='B\0\0L';ตัว\0s สามารถถูกแทนที่ด้วย null bytes
— feersum

1
@feersum ความเอนเอียงของค่าคงที่แบบหลายอักขระดูเหมือนว่าจะขึ้นอยู่กับการใช้ ปกติฉันจะไม่กังวลเกี่ยวกับเรื่องนี้มากนักในการเล่นกอล์ฟ แต่ความท้าทายนี้เกี่ยวกับความแตกต่างระหว่างการนำไปใช้งาน
— Anders Kaseorg

ปัจจุบันรหัสนี้ใช้งานเป็นอย่างอื่นที่ไม่ใช่ GCC หรือไม่
— feersum

1
@feersum C89อนุญาตให้ทั้งคู่
— Anders Kaseorg

1
การใช้ xlc (VisualAge C ++ Professional / C สำหรับ AIX Compiler, เวอร์ชัน 6) บน RS6000 ที่รัน AIX 5.2 โปรแกรม 26 ไบต์พิมพ์ "B" ได้สำเร็จ
— Jerry Jeremiah

24

MATLAB / Octave, 24 ไบต์

[~,~,e]=computer;disp(e)

computerฟังก์ชั่นให้ข้อมูลเกี่ยวกับดีคอมพิวเตอร์จะทำงานบน เอาท์พุทที่สามคือ endianness: LหรือBสำหรับน้อยหรือใหญ่ endian ตามลำดับ

ลองบน Ideone


1
อะไร. นี่คือสัญญาณสำหรับ stackoverflow ที่ฉันไม่รู้นี่!
— Brain Guider

20

JavaScript ES6, 50 ไบต์

_=>"BL"[new Int8Array(Int16Array.of(1).buffer)[0]]

ฉันไม่รู้ว่าใครเป็นคนตัดสินใจว่ามันเป็นความคิดที่ดีสำหรับวัตถุTypedArrayที่จะเปิดเผยความเป็นพื้นเมืองดั้งเดิมของล่าม แต่ที่นี่เราเป็น


5
คน WebGL คิดว่ามันเป็นความคิดที่ดีที่จะหลีกเลี่ยงการแปลง endianness เมื่อส่งผ่านไปยัง GPU ค่อนข้างทุกคนอื่นคิดว่ามันโง่… :(
— gsnedders

11

C, 36 35 ไบต์

1 ไบต์ต้องขอบคุณ @algmyr และ @owacoder

main(a){printf(*(char*)&a?"L":"B");}
main(a){putchar(66+10**(char*)&a);}
main(a){putchar("BL"[*(char*)&a]);}

เครดิตที่นี่

ยังไม่ทดลองเนื่องจากฉันไม่มีเครื่องจักรขนาดใหญ่


2
C spec อนุญาตmainฟังก์ชันหนึ่งอาร์กิวเมนต์หรือไม่
— CodesInChaos

@codesinchaos ใช่มันเป็นเช่นนั้น มันจะเป็นจำนวนของอาร์กิวเมนต์บรรทัดคำสั่งที่กำหนด ปกติที่นี่จะใช้ในการมีตัวแปรริเริ่ม1เพราะไม่มีการป้อนข้อมูลจะได้รับ (และชื่อโปรแกรมเสมอนับเป็นอาร์กิวเมนต์แรก)
— เลียม

2
@Liam: หากมีสิ่งใดนอกเหนือจาก 0 หรือ 2 จะได้รับการกำหนดไว้ใน C11

1
main(a){putchar("BL"[*(char*)&a]);}หรือ
— owacoder

2
ถ้าคุณยุ่งกับการประชุมโทรมันลงไป main(char a){putchar("BL"[a]);}31:
— Andrea Biondo

8

Mathematica, 22

{B,L}[[$ByteOrdering]]

นี่อาจจะเป็นการทำลายกฎบางอย่างเกี่ยวกับการไม่ใช้ฟังก์ชั่นในตัว แต่ฉันไม่ได้สนใจที่จะรูเบอร์ทองคำเป็นทางเลือก


1
Built-ins จะมีการปรับ (คำตอบส่วนใหญ่จะใช้พวกเขามากเกินไป)
— เลียม

2
และอีกครั้งที่ Mathematica มีในตัว!
— gcampbell

3
ฉันคิดว่านี่เป็นตัวอย่างไม่ใช่โปรแกรมหรือฟังก์ชั่นและคุณควรเพิ่ม&เพื่อทำให้เป็นฟังก์ชัน (แต่อาจมีความขัดแย้งในสิ่งที่ถือเป็น "โปรแกรม")
— Anders Kaseorg

1
@Anders ฉันไม่คุ้นเคยกับมาตรฐานปัจจุบันสำหรับ PCG (ถ้าฉันเคยเป็น) แต่ IMHO ข้อได้เปรียบอย่างหนึ่งของภาษาที่ตีความคือสนิปเพตเป็นโปรแกรม นี้สามารถทำงานในลักษณะที่ยืนอยู่คนเดียวมากที่สุดเท่าที่โปรแกรมอื่น ๆ ในMathematica
— Mr.Wizard

1
@ Mr.Wizard โปรดทราบว่า "โปรแกรม" ใน Mathematica หมายถึงสคริปต์แบบสแตนด์อโลน (ซึ่งต้องมีการพิมพ์อย่างชัดเจน) ในขณะที่คำตอบนี้ใช้ REPL
— LegionMammal978

8

C, 27

หนึ่งไบต์ยาวขึ้น แต่ที่นี่มันคือ:

f(){putchar(htons(19522));}

มันใช้ได้ดีคุณช่วยอธิบายให้ฉันหน่อยได้ไหม
— ABcDexter

3
@ABcDexter การขยายตัวแบบไบนารีของ 19522 คือ1001100 01000010(ช่องว่างเพื่อแยกไบต์) ตอนนี้ถ้าคุณใช้เวลาในแต่ละไบต์, แปลงกลับไปที่ฐาน 10 และตรวจสอบตาราง ASCII LBที่คุณจะเห็นว่าลำดับไบต์นี้จะเทียบเท่ากับ htonsจะทำสิ่งนั้นและputcharจะพิมพ์ LSB เท่านั้น ในระบบ big-ว่าจะเป็นBในน้อย endian, htonsจะได้พลิกไบต์ดังนั้น LSB Lคือ
— Kroltan

แทนที่19522ด้วย'LB'สำหรับคำเตือนคอมไพเลอร์และ -1 ไบต์
— Stan Strum

8

รหัสเครื่อง PowerPC - 20 ไบต์

PowerPC เป็น bi-endian (endianness สามารถตั้งค่าเมื่อเริ่มต้น) ดังนั้นรหัสนี้ควรเป็นไปตามคำขอความท้าทายในการเรียกใช้ทั้งบนเครื่อง BE และ LE นี่คือฟังก์ชั่นที่ส่งกลับ1 'L'หรือ'B'ขึ้นอยู่กับ endianness ที่ตั้งค่าไว้ในปัจจุบัน

เป็นฟังก์ชั่น AFAICT ซึ่งเป็นไปตาม SVR4 PowerPC ABI (ใช้โดย Linux บน ppc32), PowerOpen ABI (ใช้โดย AIX) และ OS X ABI โดยเฉพาะอย่างยิ่งมันขึ้นอยู่กับความจริงที่ว่า GPR 0 เป็นตัวลงทะเบียนรอยขีดข่วนแบบระเหยและ GPR 3 ถูกใช้เพื่อส่งกลับค่า "เล็ก"

00000000 <get_endian>:
   0:   7c 00 00 a6     mfmsr   r0
   4:   54 03 0f fe     rlwinm  r3,r0,1,31,31
   8:   1c 63 00 0a     mulli   r3,r3,10
   c:   38 63 00 42     addi    r3,r3,66
  10:   4e 80 00 20     blr

ตอนนี้มันเป็นเช่นนี้:

  • MSRจะอ่านใน GP ทะเบียน 0; MSR มีการตั้งค่าบิต endianness ที่ 31 (0 = endianness ขนาดใหญ่ 1 = endian น้อย);
  • rlwinmแยกเพียงบิตนั้น: มันต้องใช้ค่าใน GPR0, r otates l eft โดย 1 สถานที่ (เพื่อให้ตอนนี้อยู่ในตำแหน่ง 0) และmถามด้วย 1 (หน้ากากที่สร้างโดย 31,31 2 ); ผลลัพธ์จะถูกใส่ใน GP register 3
  • คูณผลลัพธ์ด้วย 10 กับผลรวม 66 ( 'B') (10 คือความแตกต่างระหว่าง'L'และ'B')
  • ในที่สุดให้กลับไปที่ผู้โทร

หมายเหตุ

  1. ใช่คำถามขอให้พิมพ์แต่ยังไม่ชัดเจนว่าฉันควรพิมพ์สิ่งต่าง ๆ ในแอสเซมบลีที่คาดว่าจะเรียกใช้ unmodified บนระบบปฏิบัติการที่แตกต่างกันอย่างไร =)
  2. สำหรับผู้ที่สนใจดูเอกสารrlwinm ; ถัดจากการรู้อะไรเกี่ยวกับ PowerPC ฉันพบว่าคำแนะนำประเภทนี้น่าสนใจมาก

    2018 ปรับปรุง : เรย์มอนด์เฉินถูกเผยแพร่ชุดเกี่ยวกับสถาปัตยกรรม PowerPC ที่คุณสามารถหาที่นี่โพสต์ที่ยอดเยี่ยมของเขาเกี่ยวกับrlwinm& เพื่อน


7

Java 8, 96, 64 52 ไบต์

()->(""+java.nio.ByteOrder.nativeOrder()).charAt(0);

สนามกอล์ฟตามคำตอบ SOนี้ เครดิตทั้งหมดไปที่ @LeakyNun และ @AlanTuning Java เก็บแนวการสูญเสีย

96 ไบต์:

 char e(){return java.nio.ByteOrder.nativeOrder().equals(java.nio.ByteOrder.BIG_ENDIAN)?'b':'l';}

64 ไบต์:

char e(){return(""+java.nio.ByteOrder.nativeOrder()).charAt(0);}

b / c ที่ยังไม่ทดลองฉันไม่สามารถเข้าถึงเครื่องจักรขนาดใหญ่ได้


1
char e(){return(""+java.nio.ByteOrder.nativeOrder()).charAt(0);}
— Leun Nun

char e(){return(""+java.nio.Bits.byteOrder()).charAt(0);}
— Leun Nun

@LeakyNun ฉันไม่เห็น Bits ใน Java API และเมื่อฉันเรียกใช้มันจะทำให้ฉัน "Bits ไม่ใช่แบบสาธารณะใน java.nio"
— Blue

โอ้ไม่เป็นไร
— Leun Nun

52 ไบต์ถ้าคุณใช้แลมบ์ดา! ()->(""+java.nio.ByteOrder.nativeOrder()).charAt(0);
— Shaun Wild

6

Perl, 38 36 ไบต์

say+(pack"L",1 eq pack"V",1)?"L":"B"

ทำงานโดยการบรรจุหมายเลขในลำดับไบต์เริ่มต้นของระบบและเปรียบเทียบกับหมายเลขที่บรรจุตามลำดับไบต์แบบ little-endian


6

(G) Forth, 24 ไบต์

here $4200004C , c@ emit

สมมติว่าเซลล์เป็น 32 บิต (และล่าม Forth ของคุณรองรับคำนำหน้าพื้นฐานของ Gforth ) มันเพียงเก็บหมายเลข 0x4200004C ในหน่วยความจำแล้วแสดงไบต์ที่ระดับต่ำสุด


5

C, 34 ไบต์

นี่ถือว่าการเข้ารหัสอักขระ ASCII

main(a){putchar(66+10**(char*)a);}

โทรโดยไม่มีข้อโต้แย้ง

คำอธิบาย:

ทางโทรศัพท์aจะเป็น 1 *(char*)aเข้าถึงไบต์แรกaซึ่งบนแพลตฟอร์มขนาดเล็กจะเป็น 1 โดยบนแพลตฟอร์มขนาดใหญ่จะเป็น 0

บนแพลตฟอร์ม big-รหัสนี้จึงจะผ่าน 66 + 10 * 0 = putchar66 66 เป็นรหัส ASCII Bสำหรับ บนแพลตฟอร์มน้อย endian ก็จะผ่าน 66 + 10 * 1 = 76 ซึ่งเป็นรหัส ASCII Lสำหรับ


5

C #, 60 52 ไบต์

C # มีการแข่งขันที่น่าประหลาดใจในครั้งนี้

char e=>System.BitConverter.IsLittleEndian?'L':'B';

เครดิตไปที่ Groo สำหรับไวยากรณ์ C # 6

60 ไบต์:

char e(){return System.BitConverter.IsLittleEndian?'L':'B';}

ด้วยไวยากรณ์ C # 6 คุณสามารถย่อให้สั้นลงได้: char e=>System.BitConverter.IsLittleEndian?'L':'B';แน่นอนว่านี่ (รวมถึงคำตอบ Java) ไม่ได้พิมพ์ค่าจริง
— Groo

ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! นี่เป็นคำตอบแรกที่ดี
— Alex A.

5

Julia, 24 19 ไบต์

()->ntoh(5)>>55+'B'

Charนี้เป็นฟังก์ชั่นที่ไม่ระบุชื่อที่ใช้เวลาไม่ป้อนข้อมูลและการส่งกลับ หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร มันถือว่าเป็นจำนวนเต็ม 64- บิต

ntohฟังก์ชันแปลง endianness ของค่าที่ส่งไปได้จากเครือข่ายเพื่อ byte (endian ใหญ่) กับที่ใช้โดยโฮสต์คอมพิวเตอร์ บนเครื่อง endian ขนาดใหญ่ntohเป็นฟังก์ชันตัวตนเนื่องจากไม่มีการแปลงให้ทำ บนเครื่อง endian ntoh(5) == 360287970189639680น้อยไบต์จะสลับดังนั้น ซึ่งก็อาจจะอ่านได้มากขึ้นเท่ากับ: 0000010100000000000000000000000000000000000000000000000000000000ในไบนารี

หากเราเปลี่ยนผลการค้นหาเป็นntoh(5)55 เราจะได้รับ 0 สำหรับเครื่องจักรขนาดใหญ่และ 10 สำหรับเครื่องจักรเล็ก ๆ น้อย ๆ การเพิ่มเข้าไปในค่าคงที่ของตัวละคร'B'เราจะได้รับ'B'หรือ'L'สำหรับเครื่องจักร endian ขนาดเล็กหรือใหญ่ตามลำดับ

บันทึก 5 ไบต์ด้วย FryAmTheEggman และ Dennis!


สำหรับ 32 บิตคุณจะต้องเปลี่ยน 55 เป็น 23 (เช่น 5 ใน 16 บิตหนึ่งควรได้ 7, ความผิดพลาดของฉัน) ผมคิดว่าเดนนิสหมายถึงสิ่งที่ชอบ()->ntoh(5)>>55+'B'?
— FryAmTheEggman

1
f()='L'-ntoh(10)%16และf()='L'-ntoh(10)&10ควรทำงานกับทุกแพลตฟอร์ม
— Dennis


5

Common Lisp, 27 ไบต์

ทดสอบกับ SBCL และ ECL สำหรับวิธีการแบบพกพาหนึ่งควรใช้คุณสมบัติที่น่ารำคาญ

(lambda()'L #+big-endian'B)

#+สัญกรณ์เป็นเงื่อนไขในการอ่านเวลาที่อ่านรูปแบบต่อไปเท่านั้นถ้านิพจน์เงื่อนไขการประเมินผลให้เป็นจริง นี่คือเงื่อนไขคือ#+big-endianข้อความทั้งหมดซึ่งหมายความว่าการทดสอบนั้นเป็นที่พอใจถ้า:big-endianคำหลักเป็นของ*FEATURES*รายการ (รายการที่มีข้อมูลเฉพาะแพลตฟอร์มอื่น ๆ ) นิพจน์ต่อไปนี้คือ'Bซึ่งอ่านหรือข้ามไปตามผลลัพธ์ของการทดสอบ หากแพลตฟอร์มของคุณใหญ่และคุณเขียนแบบฟอร์มด้านบนใน REPL มันจะเหมือนกับว่าคุณเขียนสิ่งต่อไปนี้:

CL-USER>(lambda()'L 'B)

(NB. CL-USER>เป็นพรอมต์)

ร่างกายของฟังก์ชั่นเป็นนัยPROGNซึ่งหมายความว่าเฉพาะการประเมินผลของการแสดงออกครั้งสุดท้ายจะถูกส่งกลับ Bดังนั้นข้างต้นจริงผลตอบแทนที่สัญลักษณ์ อย่างไรก็ตามหากเงื่อนไขการอ่านประเมินว่าเป็นเท็จรูปแบบจะอ่านราวกับว่าคุณเขียน:

CL-USER>(lambda()'L)

... Lซึ่งก็จะส่งกลับสัญลักษณ์


ไม่อนุญาตให้ใช้ตัวอย่าง เขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบแทน
— Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀอัปเดตขอบคุณ
— coredump

หมายเหตุ: อนุญาตให้มีตัวอย่างข้อมูลเท่านั้นหากได้รับอนุญาตจาก OP อย่างชัดเจน
— Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀคุณสามารถให้การอ้างอิงสำหรับสิ่งนี้ได้หรือไม่? มีคำตอบ REPL อื่น ๆ จากที่นี่และ / หรือตัวอย่างข้อมูลเชลล์และโพสต์เมตานี้จะแนะนำว่าคำตอบ REPL อาจใช้ได้ตามค่าเริ่มต้น ขอบคุณ
— coredump

5

ARMv6 และใหม่กว่า: รหัสเครื่อง 20 ไบต์

0xE10F1000 : MRS   r0,CPSR        ; read current status register
0xE3110C02 : TST   r0,#1<<9       ; set Z flag if bit 9 set
0x03A0004C : MOVEQ r0,#'L'        ; return 'L' if Z clear
0x13A00042 : MOVNE r0,#'B'        ; return 'B' if Z set
0xEBxxxxxx : BL    putchar        ; print it (relative branch)

ยังไม่ทดลองเนื่องจากฉันไม่มีเครื่องจักรที่เหมาะสม บิตที่ 9 ของ CPSR ให้การโหลดปัจจุบัน / endianness ปัจจุบัน


คุณสามารถใช้การส่งคืนจากฟังก์ชัน ( BX lrใช่ไหม) แทนputcharเพราะr0เป็นการลงทะเบียนที่เหมาะสมสำหรับผลลัพธ์ที่ส่งคืน
— anatolyg

แน่นอนว่า (จริงๆแล้ว MOV pc, lr) เป็นหนึ่งในการแก้ไขก่อนหน้าของฉัน อย่างไรก็ตามสิ่งนี้ตรงตามข้อกำหนดเพื่อพิมพ์จดหมายไม่ใช่แค่ส่งคืน
— user1908704

ฉันอาจกำลังอ่านการอ้างอิงที่ไม่ถูกต้อง แต่ฉันคิดว่าสิ่งนี้สามารถทำได้ในการเข้ารหัสคำสั่ง "นิ้วหัวแม่มือ 2" นี่หมายความว่าคำสั่งแรกยังคงอยู่ที่ 32 บิต ("การเข้ารหัส T1" ในหน้า F7-2720 ของคู่มืออ้างอิง ARM v8 ซึ่งจะทำให้เป็น 0xF3EF_8000); ที่สองคือ 32 บิต (การเข้ารหัสตัวถูกดำเนินการเป็นบิตที่แปลกประหลาด แต่สามารถทำได้ด้วย "i: imm3" ตั้งค่าเป็น 0010 และ "imm8" ถึง 00000010 ซึ่งให้คำแนะนำโดยรวมของ 0xF010_2F02) ก่อนการเรียนการสอนที่สามเราจำเป็นต้องแทรก "ITE EQ" (0xBF0C) เพื่อควบคุมเงื่อนไขในคำสั่ง MOV สองตัวถัดไปซึ่งกลายเป็น 0x204C และ ...
— Jules

... 0x2042 (รวมการบันทึก 2 ไบต์) จากนั้นคำสั่ง BL สุดท้ายก็ยากที่จะแทนเพราะบิตของที่อยู่ซึ่งเราไม่รู้ว่ากระจัดกระจายอยู่ท่ามกลางบิตของคำสั่งที่เรารู้ แต่มันก็เป็นการเข้ารหัสแบบ 32 บิตดังนั้นผลลัพธ์จะ รวมเป็น 18 ไบต์ (F3 EF 80 00 F0 10 2F 02 BF 0C 20 4C 20 42 F? ?? ?? ??) ฉันเชื่อว่าสิ่งนี้เปลี่ยนสถาปัตยกรรมเป็น ARMv8 และใหม่กว่าแม้ว่ามันอาจจะทำงานใน ARMv7 (?)
— จูลส์

4

Perl 5, 21 + 1 = 22 ไบต์

perl -Eทำงานด้วย

say ord pack(S,1)?L:B

ทดสอบกับ amd64 (little-endian) และ mips (big-endian)


-Eจำเป็นต้องใช้การตั้งค่าสถานะในจำนวนไบต์หรือไม่ คุณสามารถบอกได้ว่าคุณใช้ Perl 5.10 (เนื่องจากsayคำสั่งมีให้บริการในรุ่นนี้)
— Paul Picard

1
@PaulPicard แต่use 5.10.0;มีอีกหลายไบต์!
— Anders Kaseorg

1
@PaulPicard จุดของคุณผิด Perl 5.10 ต้องใช้-Eสวิทช์หรืองบuse say
— Anders Kaseorg

3
-Eคือ "ฟรี" บน PPCG ไม่จำเป็นต้องเพิ่มอะไรอีก
— Ven

1
(อย่างไร-nและ-pไม่ได้)
— Ven

4

R, 28 23 ไบต์

substr(.Platform$endian,1,1)

.Platform$endianผลตอบแทนbigถ้าวิ่งบน endian ใหญ่และlittleถ้าน้อย ที่นี่ใช้substrก็จะส่งกลับตัวอักษรตัวแรกของการส่งออกดังนั้นทั้งหรือbl

ในฐานะที่endianเป็นวัตถุเดียวที่เริ่มต้นด้วยวัตถุที่มีeอยู่ใน.Platformเราสามารถลดขอบคุณการจับคู่บางส่วนกับรหัส 23 ไบต์ต่อไปนี้:

substr(.Platform$e,1,1)

3

Clojure, 46 44 ไบต์

#(nth(str(java.nio.ByteOrder/nativeOrder))0)

นี่คือฟังก์ชั่นที่ใช้ Java builtin เพื่อรับค่า endianness ของเครื่อง จากนั้นได้รับการเป็นตัวแทนสตริงของมันซึ่งจะเป็นอย่างใดอย่างหนึ่ง"LITTLE_ENDIAN"หรือ"BIG_ENDIAN"และใช้ตัวอักษรตัวแรกของสตริงแล้วแต่จำนวนใดจะถูกเลือกและกลับว่า

ที่บันทึกไว้ 2 ไบต์ขอบคุณที่ @ cliffroot


clojure คืออะไรจริง ๆ มันกระเพื่อมหรือ java?
— Leun Nun

@LeakyNun บางที LISP ที่ใช้งานได้จริงกับ Java? มันยากที่จะพูด.
— ระยะทาง

#(nth(str(java.nio.ByteOrder/nativeOrder))0)สั้นลง 2 ไบต์
— หน้าผา

3

ทับทิม, วันที่ 3130 ตัวอักษร

puts [1].pack("s")>"\01"??L:?B

อืมต้องเป็นวิธีที่ดีกว่า นับ 5 ตัวอักษรน้อยลงถ้า char ไม่จำเป็นต้องเอาท์พุทเพราะฉันคิดว่าวิธีการแก้ปัญหาอื่นละเว้นการพิมพ์ เช่นลบส่วน "ใส่" ถ้าคุณไม่ต้องการพิมพ์อะไรเลย


หากฉันจำได้อย่างถูกต้องหลังจาก Ruby 1.9 คุณสามารถใช้?Lและ?Bแทนที่ puts :Lและputs "B"
— Sherlock9

ฉันคิดว่าputs [76,66].pack("s")[0]จะทำงาน
— Wayne Conrad

@ Sherlock9 ขอบคุณหนึ่งตัวอักษรน้อยลง @WayneConrad อาจจะเพิ่มคำตอบของคุณฉันไม่มีเครื่องจักรขนาดใหญ่ที่อยู่ใกล้มือที่จะทำการทดสอบ แต่การเปลี่ยนแปลงเช่นนี้ไม่ได้ผล: puts [76,66].pack("s>")[0]. นั่นหมายความว่าเป็นไปได้ที่จะไม่ทำงานกับ endian ใหญ่ด้วยเหตุผลบางอย่างที่ฉันไม่เข้าใจดี แต่อันนี้ดูเหมือนว่าจะทำงาน puts [19522].pack("s>")[0](มาจากวิธีการแก้ปัญหาของคุณ) WDYT? ฉันสงสัยว่าฉันสามารถหาสถานที่เพื่อประเมินเกี่ยวกับ endian ใหญ่ได้ไหม
— akostadinov

อนิจจาฉันยังขาดเครื่องจักรขนาดใหญ่เพื่อทดสอบ
— Wayne Conrad

3

Bash (และเชลล์ unix อื่น ๆ ), 32 (33) ไบต์

ความพยายามครั้งแรกและครั้งที่สอง:

case `echo|od` in *5*)echo B;;*)echo L;;esac # portable
[[ `echo|od` =~ 5 ]]&&echo B||echo L         # non-portable

ขอบคุณเดนนิสรุ่นที่สั้นกว่า:

od<<<a|grep -q 5&&echo L||echo B  # non-portable
echo|od|grep -q 5&&echo B||echo L # portable

echoยูทิลิตี้เอาท์พุทขึ้นบรรทัดใหม่ที่มีค่า hex 0Aและไม่มีการส่งออกอื่น ๆ สำหรับมันเป็น<<<a61 0A

odยูทิลิตี้โดยค่าเริ่มต้นตีความการป้อนข้อมูลที่เป็นคำสองไบต์ศูนย์เบาะถ้าจำนวนไบต์เป็นเลขคี่และแปลงไปเป็นฐานแปด สิ่งนี้ส่งผลให้เอาท์พุตของเสียงก้องถูก interpred 0A 00ซึ่งถูกแปลง005000เป็น big-endian หรือ000012ใน little-endian 61 0Aกลายเป็นคน005141ตัวเล็ก ๆ และคนหัว060412โต เอาท์พุทเต็มรูปแบบของ od ยังรวมถึงที่อยู่และข้อมูลขนาดหมายความว่าเราไม่สามารถใช้0, 1หรือ2สำหรับการทดสอบ

คำสั่งได้รับการกำหนดอย่างดีเพื่อให้เห็นถึง endianness ของระบบ จากมาตรฐาน :

ลำดับไบต์ที่ใช้เมื่อตีความค่าตัวเลขกำหนดการใช้งาน แต่จะสอดคล้องกับลำดับที่ค่าคงที่ประเภทที่สอดคล้องกันถูกเก็บไว้ในหน่วยความจำบนระบบ

บันทึกความเข้ากันได้

ฉันไม่แน่ใจว่าจะใส่echo|odbackquotes โดยไม่ต้องใส่เครื่องหมายอัญประกาศคู่ล้อมรอบ [ซึ่งผลลัพธ์ในอาร์กิวเมนต์สามคำถึงcase] ได้รับการสนับสนุนในทุกระบบ ฉันไม่แน่ใจว่าทุกระบบรองรับเชลล์สคริปต์โดยไม่ต้องยกเลิกบรรทัดใหม่ ฉันแน่ใจว่าส่วนใหญ่ แต่ไม่ 100% ของพฤติกรรมของ od ด้วยการเพิ่ม padding byte ในระบบขนาดใหญ่ หากจำเป็นecho aสามารถใช้สำหรับรุ่นพกพา สคริปต์ทั้งหมดทำงานใน bash, ksh และ zsh และสคริปต์แบบพกพาทำงานได้อย่างรวดเร็ว


ไม่จำเป็นต้องทำการเปลี่ยนแปลงใด ๆ เพียงแค่ใส่หนึ่งเชลล์ที่มันทำงานในส่วนหัวของภาษา
— Dennis

1
@Dennis ผมชอบทำชนิดของการวิเคราะห์ว่า ... แม้ว่ามันจะสนุกมากขึ้นถ้าฉันทำหาบางสิ่งบางอย่างที่ไม่ได้มาตรฐานที่ได้รับคำตอบที่สั้นลงในทุบตีหรือ zsh กว่าคนอื่น ๆ บางทีฉันอาจจะเห็นสิ่งที่สามารถทำได้ด้วย[[
— Random832

1
ไม่มีอะไรผิดปกติกับการวิเคราะห์ ย่อหน้าสุดท้ายฟังดูเหมือนว่าคุณไม่แน่ใจว่าคำตอบเฉพาะเชลล์นั้นถูกต้องหรือไม่ ... od<<<a|grep -q 5&&echo L||echo Bควรทำงานใน Bash และอื่น ๆ
— Dennis

ฉันทดสอบใน VM ขนาดใหญ่และecho|odพิมพ์0000000\n005000\n0000001ตามที่คุณคาดหวัง
— Dennis

@ user17752 เพราะ endianness od -aไม่ได้ส่งผลกระทบต่อการส่งออกของ
— Random832

3

PHP, 16 ไบต์

<?=pack(S,14)^B;

ใช้สองเทคนิคที่ไม่ได้ใช้ในคำตอบ PHP สองคำตอบที่มีอยู่:

  1. ค่าที่ส่งผ่านไปยัง pack () หรือ unpack () สามารถเป็นอะไรก็ได้ไม่ใช่แค่ 0 หรือ 1
  2. ตัวดำเนินการ XOR bitwise ( ^) ทำงานบนสตริงและผลลัพธ์นั้นยาวเพียงแค่สตริงที่สั้นกว่าเท่านั้นโดยหลีกเลี่ยงความจำเป็นในการสร้างดัชนีสตริงหรือตัวดำเนินการที่ประกอบไปด้วยสามส่วน

2

โหนด, 42 ไบต์

n=>require('os').endianness()[0]

Pro: มีแบบบิลท์อิน คอนดิชั่น: ชื่อคุณสมบัติยาวมาก


2

PowerShell ขนาด 44 ไบต์

[char](66+10*[BitConverter]::IsLittleEndian)

ตัวละครที่ 66 Bและ 10 ตัวอักษรต่อมาเป็นจำนวน L76, ค่าบูลีนของ "true" จะกลายเป็น1เมื่อร่ายไปที่ตัวเลข BitConverterเป็นคลาส NET. มาตรฐาน


1

แร็กเก็ต, 35 28 ไบต์

(if(system-big-endian?)'B'L)

'Bหรือ'Lตามลำดับ แจ้งให้เราทราบหากนี่ไม่เจาะจงพอ :)



1

Haskell (ใช้ประเภทตัวเลขที่ จำกัด ขนาดโดย GHC เท่านั้น) 75 ไบต์

import Unsafe.Coerce
import GHC.Int
f="BL"!!fromEnum(unsafeCoerce 1::Int8)

(ไม่ได้ทดสอบกับสถาปัตยกรรมขนาดใหญ่ แต่ดูเหมือนว่ามันควรจะทำงาน!)


1

K, 15 ไบต์

    ("bl")@*6h$-8!`
    ,"l"

คำอธิบาย;

    From right to left;
    -8!`       /serialises the back tick and returns (0x010000000a000000f500)
    6h$-8!`    /This casts the result to `int which is type 6h(could have used `int$-8!`) - the result is (1 0 0 0 10 0 0 0 245 0i)
    *6h$-8!`   /* means first, we take the first item which is 1. Since it will be either 1 or 0, we can use it to index (@) into the two element list on the left i.e. ("bl")1 returns "l" and ("bl")0 returns b

1

Bash, 27 ไบต์

iconv -tucs2<<<䉌|head -c1

䉌( U + 424C ) จะถูกเข้ารหัสเป็นสาม UTF-8 E4 89 8Cไบต์:

มีการสันนิษฐานว่าiconvใช้ฟังก์ชันจาก glibc และมีการใช้โลแคล UTF-8

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