Lớn hay nhỏ cuối


57

Viết chương trình hoặc hàm tạo ra một Lif chạy trên một kiến ​​trúc endian nhỏ hoặc Bnếu chạy trên một kiến ​​trúc endian lớn. Đầu ra chữ thường lhoặc bcũng được chấp nhận.

Không có đầu vào.

Ghi điểm là mã golf, vì vậy mã có ít byte nhất sẽ thắng.

Chỉnh sửa: Theo các bình luận bên dưới, tôi làm rõ rằng mục nhập phải có thể chạy trên một trong hai kiến ​​trúc.

Tôi tin rằng chỉ có một câu trả lời mà điều này ảnh hưởng và câu trả lời đó đã chỉ ra rõ ràng rằng đây là trường hợp.


1
Bộ nhớ của hộp. Tôi không chắc ý của bạn là gì
Liam

7
Tôi nghĩ rằng đây là một thử thách thú vị (và nó vượt quá chuẩn mực) nhưng sẽ cực kỳ khó để kiểm tra nó. Đặc biệt là vì hầu hết các mã sẽ kết thúc cực kỳ cụ thể nền tảng.
DJMcMayhem

7
Vâng tôi nghĩ nó sẽ rất thú vị bởi vì hy vọng đó là thứ mà những người esolang và ngôn ngữ chơi golf gặp khó khăn hơn so với các ngôn ngữ 'bình thường'. Tôi có cảm giác rằng họ sẽ không khó để xác minh. Trường hợp xấu nhất họ phải kiểm chứng bằng tay
Liam

2
Tôi đoán một câu trả lời dựa trên một mã máy cụ thể bị cấm? Nếu không B0 4C C3, đó là mov al, 'L' / rethoặc unsigned char f(){ return 'L'; }, sẽ là một câu trả lời x86 hợp lệ.
Margaret Bloom

5
Bravo! cho một thách thức golf mã trong đó các ngôn ngữ lập trình đa năng có thể cạnh tranh.
PellMell

Câu trả lời:


42

Python, 33 byte

import sys
exit(sys.byteorder[0])

sys.byteorder'little'hoặc 'big'(và đối với những người bạn sẽ đọc câu này mà không cần nhìn vào mã, [0]có nghĩa là lấy ký tự đầu tiên).


Thách thức nói rằng đầu ra phải là LB(hoặc biến thể chữ thường), không phải toàn bộ từ.
dùng2428118

43
Đó là lý do tại sao nó nói sys.byteorder[0], tức là char đầu tiên của byteorder.
s3lph

36

C, 26 byte

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

Giả sử các intký tự 32-bit và ASCII. Đã thử nghiệm trên amd64 (little endian) và mips (big-endian).

GCC, 23 byte

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

Được đề xuất bởi frageum. Giá trị của hằng số đa ký tự phụ thuộc vào triển khai, nhưng điều này dường như hoạt động trong GCC. Đã thử nghiệm trên cùng một kiến ​​trúc.


7
Ngắn hơn là a='B\0\0L';Các \0s có thể được thay thế bằng byte null.
frageum

1
@feersum Độ bền của các hằng số đa ký tự dường như phụ thuộc vào việc thực hiện. Tôi thường không lo lắng về điều đó trong môn đánh gôn, nhưng thách thức này là phân biệt giữa các lần thực hiện.
Anders Kaseorg

Liệu mã này hiện đang hoạt động trong một cái gì đó ngoài GCC?
frageum

1
@feersum C89 cho phép cả hai.
Anders Kaseorg

1
Sử dụng xlc (VisualAge C ++ Professional / C cho Trình biên dịch AIX, Phiên bản 6) trên RS6000 chạy AIX 5.2, chương trình 26 byte in thành công "B"
Jerry Jeremiah

24

MATLAB / Octave, 24 byte

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

Các computerchức năng cung cấp thông tin về, tốt, máy tính nó đang chạy trên. Đầu ra thứ ba là endianness: Lhoặc Btương ứng với ít hoặc cuối lớn.

Hãy thử nó trên Ideone .


1
gì. Điều này đôi khi cho stackoverflow, tôi không biết điều này!
não

20

JavaScript ES6, 50 byte

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

Tôi không biết ai đã quyết định rằng đó là một ý tưởng tốt cho các đối tượng TypedArray để phơi bày tính cuối cùng của người phiên dịch, nhưng chúng ta ở đây.


5
Mọi người trên WebGL nghĩ rằng đó là một ý tưởng tốt, để tránh phải chuyển đổi tính thời sự khi chuyển sang GPU. Khá nhiều người khác nghĩ nó ngu ngốc :(
gsnedder

11

C, 36 35 byte

1 byte nhờ @algmyr và @owacoder.

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

Tín dụng ở đây .

Chưa được kiểm tra vì tôi không có máy móc lớn.


2
Thông số C có cho phép hàm một đối số mainkhông?
CodeInChaos

@codesinchaos đúng vậy. Nó sẽ là số lượng các đối số dòng lệnh được đưa ra. Thông thường ở đây, nó được sử dụng để có một biến được bắt đầu 1bởi vì không có đầu vào nào được đưa ra (và tên chương trình luôn được tính là đối số đầu tiên)
Liam

2
@Liam: Nếu bất cứ điều gì khác 0 hoặc 2 được cho phép thì việc triển khai được xác định trong C11.

1
Hoặc main(a){putchar("BL"[*(char*)&a]);}.
owacoder

2
Nếu bạn gặp rắc rối với quy ước cuộc gọi, nó sẽ giảm xuống còn 31 : main(char a){putchar("BL"[a]);}.
Andrea Biondo

8

Toán học, 22

{B,L}[[$ByteOrdering]]

Điều này có thể phá vỡ một số quy tắc về việc không sử dụng chức năng tích hợp nhưng tôi không thực sự quan tâm đến việc thay thế vàng.


1
Được xây dựng là tốt (hầu hết các câu trả lời cũng sử dụng chúng)
Liam

2
Và một lần nữa, Mathicala có tích hợp sẵn!
gcampbell

3
Tôi nghĩ rằng đây là một đoạn mã, không phải là một chương trình hoặc chức năng và bạn nên thêm &để biến nó thành một chức năng. (Nhưng có thể có sự bất đồng về những gì cấu thành nên một chương trình
Rằng

1
@Anders Tôi không thực sự quen thuộc với các tiêu chuẩn hiện tại cho PCG (nếu tôi đã từng) nhưng IMHO một lợi thế của ngôn ngữ được diễn giải là đoạn trích một chương trình. Điều này có thể được chạy một cách độc lập nhiều như bất kỳ chương trình nào khác trong Mathematica .
Mr.Wizard

1
@ Mr.Wizard Lưu ý rằng một "chương trình" trong Mathicala đề cập đến một tập lệnh độc lập (yêu cầu in rõ ràng), trong khi câu trả lời này sử dụng REPL.
LegionMammal978

8

C, 27

Một byte dài hơn, nhưng đây là dù sao:

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

Nó hoạt động tốt, bạn có thể vui lòng giải thích cho tôi.
ABcDexter

3
@ABcDexter việc mở rộng nhị phân của 19522 là 1001100 01000010(khoảng trắng để tách byte). Bây giờ nếu bạn lấy từng byte, chuyển đổi trở lại cơ sở 10 và kiểm tra bảng ASCII, bạn sẽ thấy chuỗi byte này tương đương với LB. htonssẽ làm việc của mìnhputcharsẽ chỉ in LSB. Trong các hệ thống endian lớn, điều đó sẽ B, trong endian nhỏ, htonssẽ lật các byte, vì vậy LSB là L.
Kroltan

Thay thế 19522bằng 'LB'các cảnh báo trình biên dịch và -1 byte.
Stan Strum

8

Mã máy PowerPC - 20 byte

PowerPC là bi-endian (endian có thể được thiết lập khi khởi động), vì vậy mã này phải phù hợp với yêu cầu thách thức là có thể chạy cả trên máy BE và LE. Đây là một hàm trả về 1 'L' hoặc 'B'tùy thuộc vào độ bền hiện tại được đặt.

Là một chức năng, AFAICT nó phù hợp với SVR4 PowerPC ABI (được Linux sử dụng trên ppc32), PowerOpen ABI (được sử dụng bởi AIX) và OS X ABI. Cụ thể, nó chỉ dựa vào thực tế rằng GPR 0 là một thanh ghi cào dễ bay hơi và GPR 3 được sử dụng để trả về các giá trị "nhỏ".

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

Bây giờ, nó như thế này:

  • các MSR được đọc vào GP đăng ký 0; MSR chứa ở bit 31 cài đặt endianness (0 = big endian; 1 = little endian);
  • rlwinmchỉ trích xuất bit đó: nó lấy giá trị trong GPR0, r otates l eft 1 vị trí (để bây giờ ở vị trí 0) và m yêu cầu nó với 1 (mặt nạ được tạo bởi 31,31 2 ); kết quả được đưa vào thanh ghi GP 3;
  • nhân kết quả với 10 và tổng 66 ( 'B') (10 là chênh lệch giữa 'L''B')
  • cuối cùng, trở lại với người gọi

Ghi chú

  1. vâng, câu hỏi không yêu cầu in , nhưng không rõ tôi nên in thứ gì trong lắp ráp dự kiến ​​sẽ chạy không thay đổi trên các hệ điều hành khác nhau. =)
  2. Đối với những người quan tâm, xem tài liệu rlwinm ; Không biết gì về PowerPC, tôi thấy loại hướng dẫn này cực kỳ thú vị.

    Cập nhật 2018 : Raymond Chen đang xuất bản một loạt về kiến ​​trúc PowerPC, bạn có thể tìm thấy ở đây bài viết tuyệt vời của anh ấy về rlwinm& bạn bè.


7

Java 8, 96, 64 52 byte

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

Một golf dựa trên câu trả lời SO này . Tất cả tín dụng được chuyển đến @LeakyNun và @AlanTuning. Java giữ cho vệt mất.

96 byte:

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

64 byte:

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

Chưa được kiểm tra b / c Tôi không có quyền truy cập vào một máy cuối lớn.


1
char e(){return(""+java.nio.ByteOrder.nativeOrder()).charAt(0);}
Nữ tu bị rò rỉ

char e(){return(""+java.nio.Bits.byteOrder()).charAt(0);}
Nữ tu bị rò rỉ

@LeakyNun Tôi không thấy Bits trong API Java và khi tôi chạy nó, nó mang lại cho tôi "Bits không công khai trong java.nio"
Blue

Ồ, được rồi.
Nữ tu bị rò rỉ

52 byte nếu bạn sử dụng lambda! ()->(""+java.nio.ByteOrder.nativeOrder()).charAt(0);
Shaun Wild

6

Perl, 38 36 byte

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

Hoạt động bằng cách đóng gói một số theo thứ tự byte mặc định của hệ thống và so sánh nó với một số được đóng gói theo thứ tự byte cuối nhỏ.


6

(G) Forth, 24 byte

here $4200004C , c@ emit

Giả sử rằng các ô là 32 bit (và trình thông dịch Forth của bạn hỗ trợ các tiền tố cơ sở của Gforth ). Nó chỉ đơn giản là lưu trữ số 0x4200004C trong bộ nhớ và sau đó hiển thị byte ở mức thấp.


5

C, 34 byte

Điều này giả định mã hóa ký tự ASCII

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

Gọi mà không tranh luận.

Giải trình:

Khi có cuộc gọi, asẽ có 1. *(char*)atruy cập byte đầu tiên a, trên các nền tảng endian nhỏ sẽ là 1, trên các nền tảng lớn sẽ là 0.

Do đó, trên các nền tảng lớn, mã này sẽ chuyển 66 + 10 * 0 = 66 tới putchar. 66 là mã ASCII cho B. Trên các nền tảng nhỏ, nó sẽ vượt qua 66 + 10 * 1 = 76, đây là mã ASCII L.


5

C #, 60 52 byte

C # là cạnh tranh đáng ngạc nhiên trong cái này.

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

Tín dụng cho Groo cho cú pháp C # 6.

60 byte:

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

Với cú pháp C # 6, bạn có thể rút ngắn nó một chút: char e=>System.BitConverter.IsLittleEndian?'L':'B';tất nhiên điều này (cũng như câu trả lời Java) không thực sự in giá trị.
Groo

Chào mừng bạn đến với Câu đố lập trình & Code Golf! Đây là một câu trả lời đầu tiên tốt đẹp.
Alex A.

5

Julia, 24 19 byte

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

Đây là một hàm ẩn danh không có đầu vào và trả về a Char. Để gọi nó, gán nó cho một biến. Nó giả định rằng số nguyên là 64 bit.

Các ntohchức năng chuyển đổi endianness giá trị được truyền cho nó từ trật tự mạng byte (về cuối lớn) để được sử dụng bởi các máy chủ. Trên các máy endian lớn, ntohlà chức năng nhận dạng do không có chuyển đổi nào được thực hiện. Trên các máy endian nhỏ, các byte được hoán đổi, vì vậy ntoh(5) == 360287970189639680. Đó cũng là, có lẽ dễ đọc hơn, bằng: 0000010100000000000000000000000000000000000000000000000000000000trong nhị phân.

Nếu chúng ta thay đổi đúng kết quả của ntoh(5)55, chúng ta sẽ nhận được 0 trên các máy endian lớn và 10 trên các máy endian nhỏ. Thêm vào hằng số ký tự 'B', chúng ta sẽ nhận được 'B'hoặc 'L'cho các máy endian lớn hoặc nhỏ tương ứng.

Đã lưu 5 byte nhờ FryAmTheEggman và Dennis!


Đối với 32 bit, bạn sẽ phải thay đổi 55 thành 23 (cũng là 5 trong 16 bit nên là 7, lỗi của tôi). Tôi nghĩ Dennis có nghĩa là gì đó : ()->ntoh(5)>>55+'B'?
FryAmTheEggman

1
f()='L'-ntoh(10)%16f()='L'-ntoh(10)&10nên hoạt động trên tất cả các nền tảng.
Dennis


5

Lisp thông thường, 27 byte

Đã thử nghiệm trên SBCL và ECL. Đối với một phương pháp di động, người ta nên sử dụng các tính năng tầm thường .

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

Các #+ký hiệu là một điều kiện đọc thời gian , mà đọc các hình thức tiếp theo chỉ khi biểu thức điều kiện để đánh giá đúng. Ở đây điều kiện là toàn bộ #+big-endianvăn bản có nghĩa là thử nghiệm được thỏa mãn nếu :big-endiantừ khóa thuộc *FEATURES*danh sách (một danh sách chứa trong số những thứ khác thông tin cụ thể về nền tảng). Biểu thức sau đây là 'B, được đọc hoặc bỏ qua theo kết quả của bài kiểm tra. Nếu nền tảng của bạn là big endian và bạn viết mẫu ở trên trong REPL, thì chính xác như thể bạn đã viết như sau:

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

(NB. CL-USER>Là lời nhắc)

Phần thân của hàm là một ẩn PROGN, nghĩa là chỉ đánh giá biểu thức cuối cùng được trả về. Vì vậy, trên thực tế trả về biểu tượng B. Tuy nhiên, nếu điều kiện thời gian đọc đánh giá là sai, biểu mẫu sẽ đọc như thể bạn đã viết:

CL-USER>(lambda()'L)

... mà chỉ đơn giản là trả lại biểu tượng L.


Đoạn trích không được phép; viết chương trình đầy đủ hoặc chức năng thay thế.
Erik the Outgolfer 29/07/2016

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Đã cập nhật, cảm ơn
coredump

Lưu ý: Đoạn mã chỉ được phép nếu được OP cho phép rõ ràng.
Erik the Outgolfer 29/07/2016

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Bạn có thể cung cấp một tài liệu tham khảo cho điều này? Có những câu trả lời REPL khác ở đây và / hoặc đoạn trích vỏ và bài đăng meta này sẽ gợi ý rằng câu trả lời REPL có thể được chấp nhận theo mặc định. Cảm ơn.
coredump

5

ARMv6 trở lên: mã máy 20 byte

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)

Chưa được kiểm tra, vì tôi không có máy phù hợp. Bit 9 của CPSR cung cấp cho tuổi thọ tải / lưu trữ hiện tại.


Bạn có thể sử dụng trả về từ hàm ( BX lr, phải không?) Thay vì putchar, r0là đăng ký thích hợp cho kết quả trả về.
anatolyg

Thật vậy, điều đó (thực sự là MOV pc, lr) là một trong những chỉnh sửa trước đây của tôi. Tuy nhiên, điều này đáp ứng các đặc điểm kỹ thuật để in thư, không chỉ trả lại nó.
dùng1908704

Tôi có thể đọc sai tài liệu tham khảo, nhưng tôi nghĩ rằng điều này có thể được thực hiện trong mã hóa hướng dẫn "ngón tay cái 2". Điều này có nghĩa là lệnh đầu tiên vẫn là 32 bit ("mã hóa T1" trên trang F7-2720 của tài liệu tham khảo ARM v8, sẽ làm cho nó 0xF3EF_8000); cái thứ hai cũng là 32 bit (mã hóa toán hạng hơi kỳ quái, nhưng có thể được thực hiện với "i: imm3" được đặt thành 0010 và "imm8" thành 00000010, cung cấp một lệnh tổng thể là 0xF010_2F02). Trước hướng dẫn thứ ba, chúng ta cần chèn "ITE EQ" (0xBF0C) để kiểm soát các điều kiện trên hai lệnh MOV tiếp theo, trở thành 0x204C và ...
Jules

... 0x2042 (tiết kiệm 2 byte tổng thể). Sau đó, lệnh BL cuối cùng hơi khó biểu diễn vì các bit của địa chỉ mà chúng ta không biết cuối cùng nằm rải rác giữa các bit của lệnh chúng ta biết, nhưng nó cũng là mã hóa 32 bit, do đó, kết quả sẽ là được tổng cộng 18 byte (F3 EF 80 00 F0 10 2F 02 BF 0C 20 4C 20 42 F? ?? ?? ??). Tôi tin rằng điều này thay đổi kiến ​​trúc thành ARMv8 và sau đó, mặc dù nó có thể hoạt động trong ARMv7 (?).
Jules

4

Perl 5, 21 + 1 = 22 byte

Chạy với perl -E.

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

Đã thử nghiệm trên amd64 (little endian) và mips (big-endian).


-Ecờ thực sự cần thiết trong số byte? Bạn chỉ có thể nói rằng bạn sử dụng Perl 5.10 (vì saylệnh này có sẵn trong phiên bản này)
Paul Picard

1
@PaulPicard Nhưng use 5.10.0;còn nhiều byte nữa!
Anders Kaseorg

1
@PaulPicard Quan điểm của bạn là sai. Perl 5.10 yêu cầu -Echuyển đổi hoặc usetuyên bố cho say.
Anders Kaseorg

3
-Elà "miễn phí" trên PPCG. Không cần thêm gì cả.
Ven

1
(tuy nhiên -n-pkhông phải)
Ven

4

R, 28 23 byte

substr(.Platform$endian,1,1)

.Platform$endiantrả về bignếu chạy trên endian lớn và littlenếu ít. Ở đây, bằng cách sử dụng substr, nó trả về chữ cái đầu tiên của đầu ra, hoặc là bhoặc l.

endianđối tượng duy nhất bắt đầu với một eđối tượng .Platformcó trong đối tượng, chúng ta có thể giảm nó nhờ khớp một phần với mã 23 byte sau:

substr(.Platform$e,1,1)

3

Clojure, 46 44 byte

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

Đây là một chức năng sử dụng dựng sẵn Java để có được độ bền của máy. Sau đó, lấy đại diện chuỗi của nó sẽ là "LITTLE_ENDIAN"hoặc "BIG_ENDIAN"và lấy ký tự đầu tiên của bất kỳ chuỗi nào được chọn và trả về chuỗi đó.

Đã lưu 2 byte nhờ @ cliffroot .


Clojure thực sự là gì, nó là lisp hay java?
Nữ tu bị rò rỉ

@LeakyNun Có lẽ một LISP thực tế hoạt động với Java? Khó mà nói ra được.
dặm

#(nth(str(java.nio.ByteOrder/nativeOrder))0)ngắn hơn 2 byte
cliffroot

3

Hồng ngọc 3130 ký tự.

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

Hmm, phải là một cách tốt hơn. Đếm ít hơn 5 ký tự nếu char không cần xuất ra như tôi nghĩ các giải pháp khác bỏ qua in. tức là loại bỏ phần "đặt" nếu bạn không muốn in bất cứ thứ gì.


Nếu tôi nhớ chính xác, sau Ruby 1.9, bạn có thể sử dụng ?L?Bthay thế puts :Lputs "B"
Sherlock9

Tôi nghĩ rằng puts [76,66].pack("s")[0]sẽ làm việc.
Wayne Conrad

@ Sherlock9, cảm ơn, một char ít hơn. @WayneConrad, Có lẽ thêm câu trả lời của bạn, tôi không có máy endian lớn trong tay để kiểm tra nhưng trên endian nhỏ thì nó hoạt động. Nhưng thay đổi như thế này không hoạt động : puts [76,66].pack("s>")[0]. Điều đó có nghĩa là có thể không làm việc trên endian lớn vì một số lý do tôi không hiểu rõ. Nhưng cái này có vẻ hiệu quả (xuất phát từ giải pháp của bạn) puts [19522].pack("s>")[0]. WDYT? Tôi tự hỏi nếu tôi có thể tìm thấy một số nơi để đánh giá về endian lớn.
akostadinov

Than ôi, tôi cũng thiếu một cỗ máy lớn để thử nghiệm.
Wayne Conrad

3

Bash (và các shell unix khác), 32 (33) byte

Nỗ lực thứ nhất và thứ hai:

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

Nhờ Dennis, phiên bản ngắn hơn:

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

Các echotiện ích kết quả đầu ra một dòng mới, với giá trị hex 0A, và không có đầu ra khác. Đối với <<<anó là 61 0A.

Theo odmặc định, tiện ích diễn giải đầu vào dưới dạng các từ hai byte, không đệm nếu số byte là số lẻ và chuyển đổi thành bát phân. Điều này dẫn đến kết quả đầu ra của tiếng vang được hiểu là 0A 00, được chuyển đổi thành âm 005000cuối lớn hoặc 000012cuối nhỏ. 61 0Atrở thành 005141ít endian và 060412lớn endian. Sản lượng đầy od cũng bao gồm địa chỉ và kích thước dữ liệu có nghĩa là chúng ta không thể sử dụng 0, 1hoặc 2cho kỳ thi này.

Lệnh được xác định rõ để hiển thị độ bền của hệ thống. Từ tiêu chuẩn :

Thứ tự byte được sử dụng khi diễn giải các giá trị số được xác định theo thực hiện, nhưng sẽ tương ứng với thứ tự trong đó một hằng số của loại tương ứng được lưu trữ trong bộ nhớ trên hệ thống.

Ghi chú tương thích

Tôi không chắc chắn nếu đưa echo|odvào các backquote không có dấu ngoặc kép xung quanh chúng [dẫn đến một đối số ba từ case] được hỗ trợ trên tất cả các hệ thống. Tôi không chắc chắn nếu tất cả các hệ thống hỗ trợ tập lệnh shell mà không có dòng mới kết thúc. Tôi chủ yếu là chắc chắn nhưng không phải là 100% hành vi của od với việc thêm byte đệm vào các hệ thống lớn. Nếu cần, echo acó thể được sử dụng cho các phiên bản di động. Tất cả các tập lệnh hoạt động trong bash, ksh và zsh, và các tập lệnh di động hoạt động trong dấu gạch ngang.


Không có thay đổi nào là cần thiết; chỉ cần đặt một shell nó hoạt động trong phần đầu ngôn ngữ và bạn đã thiết lập.
Dennis

1
@Dennis Tôi thích làm điều đó loại phân tích ... mặc dù nó thú vị hơn nếu tôi làm tìm một cái gì đó phi tiêu chuẩn mà được một câu trả lời ngắn trong bash hoặc zsh hơn những người khác. Có lẽ tôi sẽ thấy những gì có thể được thực hiện với[[
Random832

1
Không có gì sai với phân tích. Đoạn cuối nghe có vẻ như bạn không chắc chắn nếu câu trả lời dành riêng cho vỏ là hợp lệ ... od<<<a|grep -q 5&&echo L||echo Bnên hoạt động ở Bash và những người khác.
Dennis

Tôi đã thử nghiệm nó trong một máy ảo lớn và echo|odin 0000000\n005000\n0000001như bạn mong đợi.
Dennis

@ user17752 Bởi vì endianness không ảnh hưởng đến đầu ra của od -a.
Random832

3

PHP, 16 byte

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

Điều này sử dụng hai thủ thuật không được sử dụng trong hai câu trả lời PHP hiện có:

  1. Giá trị được truyền cho pack () hoặc unpack () có thể là bất cứ thứ gì, không chỉ 0 hoặc 1.
  2. Toán tử XOR bitwise ( ^) hoạt động trên các chuỗi và kết quả chỉ dài bằng chuỗi ngắn hơn, tránh sự cần thiết phải lập chỉ mục chuỗi hoặc toán tử ternary.

2

Nút, 42 byte

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

Pro: có một nội dung. Con: tên tài sản rất dài


2

PowerShell, 44 byte

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

Ký tự 66 là Bvà 10 ký tự sau là số 76 , L. Giá trị Boolean của "true" trở thành 1khi chuyển thành số. BitConverterlà một lớp .NET tiêu chuẩn.


1

Vợt, 35 28 byte

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

'Bhoặc 'Ltương ứng. Hãy cho tôi biết nếu điều này không đủ cụ thể :)



1

Haskell (sử dụng các loại số bị giới hạn kích thước chỉ GHC), 75 byte

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

(không được thử nghiệm trên một kiến ​​trúc lớn về cuối, nhưng có vẻ như nó phải hoạt động!)


1

K, 15 byte

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

Giải trình;

    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 byte

iconv -tucs2<<<䉌|head -c1

( U + 424C ) được mã hóa dưới dạng ba byte UTF-8 : E4 89 8C.

Giả định rằng iconvsử dụng chức năng từ glibc và sử dụng ngôn ngữ UTF-8.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.