ใหญ่หรือน้อย 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.