Tulis program atau fungsi yang menghasilkan L
if dijalankan pada arsitektur endian kecil atau B
jika dijalankan pada arsitektur big endian. Output huruf kecil l
atau b
juga dapat diterima.
Tidak ada input.
Skor adalah kode golf, jadi kode dengan byte paling sedikit menang.
Sunting: Sesuai komentar di bawah ini, saya mengklarifikasi bahwa entri harus dapat berjalan pada arsitektur mana pun.
Saya percaya bahwa hanya ada satu jawaban yang mempengaruhi hal ini, dan jawaban itu dengan jelas menunjukkan bahwa inilah masalahnya.
B0 4C C3
, yang manamov al, 'L' / ret
atauunsigned char f(){ return 'L'; }
, akan menjadi jawaban x86 yang valid.Jawaban:
Python, 33 byte
sys.byteorder
adalah salah satu'little'
atau'big'
(dan bagi Anda yang akan membaca kalimat ini tanpa melihat kode,[0]
berarti mengambil karakter pertama).sumber
L
danB
(atau varian huruf kecil), bukan keseluruhan kata.sys.byteorder[0]
, yaitu char pertamabyteorder
.C, 26 byte
Diasumsikan 32-bit
int
dan karakter ASCII. Diuji pada amd64 (little-endian) dan mips (big-endian).GCC, 23 byte
Disarankan oleh feersum. Nilai konstanta multi-karakter bergantung pada implementasi, tetapi ini tampaknya bekerja di GCC. Diuji pada arsitektur yang sama.
sumber
a='B\0\0L';
The\0
s bisa diganti dengan nol byte.MATLAB / Oktaf, 24 byte
The
computer
Fungsi memberikan informasi tentang, baik, komputer itu berjalan pada. Output ketiga adalah endianness:L
atauB
untuk endianness kecil atau besar.Cobalah di Ideone .
sumber
JavaScript ES6, 50 byte
Saya tidak tahu siapa yang memutuskan itu adalah ide yang baik untuk objek TypedArray untuk mengekspos endianness asli dari penerjemah, tetapi di sinilah kita.
sumber
C,
3635 byte1 byte berkat @algmyr dan @owacoder.
Kredit di sini .
Tidak diuji karena saya tidak punya mesin big-endian.
sumber
main
?1
karena tidak ada input yang diberikan (dan nama program selalu dianggap sebagai argumen pertama)main(a){putchar("BL"[*(char*)&a]);}
.main(char a){putchar("BL"[a]);}
.Mathematica, 22
Ini mungkin melanggar beberapa aturan tentang tidak menggunakan fungsi built-in tapi saya tidak benar-benar tertarik dengan rube goldberging alternatif.
sumber
&
agar berfungsi. (Tapi mungkin ada ketidaksepakatan tentang apa yang merupakan "program".)C, 27
Satu byte lagi, tapi ini dia:
sumber
1001100 01000010
(ruang untuk memisahkan byte). Sekarang jika Anda mengambil setiap byte, konversikan kembali ke basis 10 dan periksa tabel ASCII, Anda akan melihat bahwa urutan byte ini setara denganLB
.htons
akan melakukan tugasnya , danputchar
hanya akan mencetak LSB. Dalam sistem big-endian, itu akan menjadiB
, di little-endian,htons
akan membalik byte, sehingga LSBL
.19522
dengan'LB'
untuk peringatan kompiler dan -1 byte.Kode mesin PowerPC - 20 byte
PowerPC bersifat bi-endian (endianness dapat diatur pada saat startup), jadi kode ini harus sesuai dengan permintaan tantangan untuk dapat menjalankan keduanya pada mesin BE dan LE. Ini adalah fungsi yang mengembalikan 1
'L'
atau'B'
tergantung pada endianness yang ditetapkan saat ini.Sebagai fungsi, AFAICT sesuai dengan SVR4 PowerPC ABI (digunakan oleh Linux pada ppc32), PowerOpen ABI (digunakan misalnya oleh AIX) dan OS X ABI. Secara khusus, itu hanya bergantung pada fakta bahwa GPR 0 adalah register awal yang mudah menguap, dan GPR 3 digunakan untuk mengembalikan nilai "kecil".
Sekarang begini:
rlwinm
ekstrak hanya sedikit: dibutuhkan nilai dalam GPR0, r otate l eft oleh 1 tempat (sehingga sekarang berada di posisi 0) dan m bertanya dengan 1 (topeng yang dihasilkan oleh 31,31 2 ); hasilnya dimasukkan ke dalam register GP 3;'B'
) (10 adalah perbedaan antara'L'
dan'B'
)Catatan
bagi mereka yang tertarik, lihat dokumentasi rlwinm ; mengetahui apa-apa tentang PowerPC, saya menemukan instruksi semacam ini sangat menarik.
Pembaruan 2018 : Raymond Chen menerbitkan serangkaian tentang arsitektur PowerPC, Anda dapat menemukan di sini postingannya yang hebat tentang
rlwinm
& teman-teman.sumber
Java 8,
96, 6452 byteSebuah golf berdasarkan jawaban SO ini . Semua kredit diberikan ke @LeakyNun dan @AlanTuning. Java terus mempertahankan kekalahan.
96 byte:
64 byte:
Tidak teruji b / c Saya tidak punya akses ke mesin big-endian.
sumber
char e(){return(""+java.nio.ByteOrder.nativeOrder()).charAt(0);}
char e(){return(""+java.nio.Bits.byteOrder()).charAt(0);}
()->(""+java.nio.ByteOrder.nativeOrder()).charAt(0);
Perl,
3836 byteBekerja dengan mengemas nomor dalam urutan byte default sistem dan membandingkannya dengan nomor yang dikemas dalam urutan byte little-endian.
sumber
(G) Keempat, 24 byte
Asumsikan bahwa sel-selnya adalah 32 bit (dan bahwa penerjemah Forth Anda mendukung awalan dasar Gforth ). Ini hanya menyimpan angka 0x4200004C dalam memori dan kemudian menampilkan byte di bagian bawah.
sumber
C, 34 byte
Ini mengasumsikan pengkodean karakter ASCII
Panggilan tanpa argumen.
Penjelasan:
Saat panggilan,
a
akan 1.*(char*)a
mengakses byte pertamaa
, yang pada platform little-endian akan menjadi 1, pada platform big-endian akan menjadi 0.Pada platform big-endian, kode ini akan melewati 66 + 10 * 0 = 66 hingga
putchar
. 66 adalah kode ASCII untukB
. Pada platform little-endian, itu akan melewati 66 + 10 * 1 = 76, yang merupakan kode ASCII untukL
.sumber
C #,
6052 byteC # ternyata sangat kompetitif dalam hal ini.
Kredit ke Groo untuk sintaks C # 6.
60 byte:
sumber
char e=>System.BitConverter.IsLittleEndian?'L':'B';
tentu saja ini (dan juga jawaban Java) tidak benar-benar mencetak nilai.Julia,
2419 byteIni adalah fungsi anonim yang tidak mengambil input dan mengembalikan a
Char
. Untuk menyebutnya, tetapkan ke variabel. Diasumsikan bahwa bilangan bulat 64-bit.The
ntoh
fungsi mengkonversi endianness dari nilai yang dikirimkan ke dari urutan byte jaringan (big endian) dengan yang digunakan oleh komputer host. Pada mesin big endian,ntoh
adalah fungsi identitas karena tidak ada konversi yang harus dilakukan. Pada mesin endian kecil, byte ditukar, jadintoh(5) == 360287970189639680
. Yang juga, mungkin lebih mudah dibaca, sama dengan:0000010100000000000000000000000000000000000000000000000000000000
dalam biner.Jika kita menggeser sedikit hasil
ntoh(5)
dengan 55, kita akan mendapatkan 0 pada mesin endian besar dan 10 pada mesin endian kecil. Menambahkan itu ke konstanta karakter , masing-masing'B'
kita akan mendapatkan'B'
atau'L'
untuk mesin endian besar atau kecil.Disimpan 5 byte berkat FryAmTheEggman dan Dennis!
sumber
()->ntoh(5)>>55+'B'
:?f()='L'-ntoh(10)%16
danf()='L'-ntoh(10)&10
harus bekerja pada semua platform.PHP 5.6,
4131 byte (thx to isertusernamehere)<?=unpack(S,"\x01\x00")[1]-1?B:L;
PHP 7, 41 byte
echo unpack('S',"\x01\x00")[1]-1?'B':'L';
Ide dicuri dari: https://stackoverflow.com/a/24785578/2496717
sumber
<?=unpack(S,"\x01\x00")[1]-1?B:L;
.Gangguan Umum, 27 byte
Diuji pada SBCL dan ECL. Untuk pendekatan portabel, seseorang harus menggunakan fitur-fitur sepele .
The
#+
notasi adalah kondisi read-waktu , yang berbunyi bentuk berikutnya hanya jika mengevaluasi ekspresi kondisional untuk benar. Di sini syaratnya adalah seluruh#+big-endian
teks yang berarti bahwa pengujian terpenuhi jika:big-endian
kata kunci termasuk dalam*FEATURES*
daftar (daftar yang berisi antara lain informasi platform-spesifik). Ungkapan berikut adalah'B
, yang dibaca atau dilewati sesuai dengan hasil tes. Jika platform Anda adalah big-endian dan Anda menulis formulir di atas dalam REPL, itu persis seperti Anda menulis yang berikut:(NB.
CL-USER>
Adalah prompt)Badan fungsi adalah implisit
PROGN
, artinya hanya evaluasi dari ekspresi terakhir yang dikembalikan. Jadi simbol pengembalian sebenarnya di atasB
. Namun, jika kondisi baca-waktu dinilai false, formulir terbaca seolah-olah Anda menulis:... yang mengembalikan simbol
L
.sumber
ARMv6 dan yang lebih baru: 20 byte kode mesin
Tidak teruji, karena saya tidak punya mesin yang cocok. Bit 9 dari CPSR memberikan load / store endianness saat ini.
sumber
BX lr
, bukan?) Bukanputchar
, karenar0
register yang tepat untuk hasil yang dikembalikan.Perl 5, 21 + 1 = 22 byte
Jalankan dengan
perl -E
.Diuji pada amd64 (little-endian) dan mips (big-endian).
sumber
-E
flag benar-benar diperlukan dalam hitungan byte? Anda bisa mengatakan Anda menggunakan Perl 5.10 (karenasay
perintah tersedia dalam versi ini)use 5.10.0;
masih banyak lagi byte!-E
saklar atauuse
pernyataan untuksay
.-E
"gratis" di PPCG. Tidak perlu menambahkan apa pun.-n
dan-p
tidak)R,
2823 byte.Platform$endian
kembalibig
jika dijalankan pada big endian danlittle
jika sedikit. Di sini, menggunakansubstr
, ia mengembalikan huruf pertama dari output, jadib
ataul
.Seperti
endian
satu-satunya objek yang dimulai dengan objek yange
terkandung dalam.Platform
kita dapat menguranginya berkat pencocokan sebagian dengan kode 23 byte berikut:sumber
Clojure,
4644 byteIni adalah fungsi yang menggunakan Java builtin untuk mendapatkan endianness dari mesin. Kemudian dapatkan representasi string dari yang akan menjadi salah satu
"LITTLE_ENDIAN"
dan"BIG_ENDIAN"
dan ambil karakter pertama dari string mana pun yang dipilih dan kembalikan itu.Disimpan 2 byte berkat @ cliffroot .
sumber
#(nth(str(java.nio.ByteOrder/nativeOrder))0)
lebih pendek 2 byteRubi,
3130 karakter.Hmm, pasti cara yang lebih baik. Hitung 5 karakter lebih sedikit jika char tidak perlu di-output karena saya pikir solusi lain menghilangkan pencetakan. yaitu menghapus bagian "menempatkan" jika Anda tidak ingin apa pun dicetak.
sumber
?L
dan?B
menggantikanputs :L
danputs "B"
puts [76,66].pack("s")[0]
akan berhasil.puts [76,66].pack("s>")[0]
. Itu artinya adalah mungkin untuk tidak mengerjakan big endian karena alasan tertentu saya tidak mengerti dengan baik. Tapi yang ini sepertinya berhasil (berasal dari solusi Anda)puts [19522].pack("s>")[0]
. WDYT? Saya bertanya-tanya apakah saya dapat menemukan tempat untuk mengevaluasi pada big endian.Bash (dan shell unix lainnya), 32 (33) byte
Upaya pertama dan kedua:
Berkat Dennis, versi yang lebih pendek:
The
echo
utilitas output baris baru, dengan nilai hex0A
, dan tidak ada output lainnya. Untuk<<<a
itu61 0A
.The
od
utilitas, secara default, menafsirkan masukan sebagai kata-kata dua-byte, nol-empuk jika jumlah byte adalah aneh, dan bertobat untuk oktal. Ini menghasilkan output dari gema yang ditafsirkan sebagai0A 00
, yang dikonversi menjadi005000
big-endian atau000012
little-endian.61 0A
menjadi005141
little-endian dan060412
big-endian. Output penuh od juga termasuk alamat dan data ukuran yang berarti kita tidak bisa menggunakan0
,1
atau2
untuk ujian.Perintah didefinisikan dengan baik untuk mengekspos endianness sistem. Dari standar :
Catatan kompatibilitas
Saya tidak yakin apakah menempatkan
echo|od
backquote tanpa tanda kutip ganda di sekitarnya [yang menghasilkan argumen tiga kata untukcase
] didukung pada semua sistem. Saya tidak yakin apakah semua sistem mendukung skrip shell tanpa mengakhiri baris baru. Saya sebagian besar pasti tetapi tidak 100% dari perilaku od dengan menambahkan byte padding pada sistem big-endian. Jika perlu,echo a
bisa digunakan untuk versi portable. Semua skrip bekerja dalam bash, ksh, dan zsh, dan yang portabel bekerja di dash.sumber
[[
od<<<a|grep -q 5&&echo L||echo B
harus bekerja di Bash dan lainnya.echo|od
mencetak0000000\n005000\n0000001
seperti yang Anda harapkan.od -a
.PHP, 16 byte
Ini menggunakan dua trik yang tidak digunakan dalam dua jawaban PHP yang ada:
^
) bekerja pada string, dan hasilnya hanya sepanjang string yang lebih pendek, menghindari kebutuhan untuk pengindeksan string atau operator ternary.sumber
Node, 42 byte
Pro: ada builtin. Con: nama properti sangat panjang
sumber
PowerShell, 44 byte
Karakter 66 adalah
B
, dan 10 karakter kemudian adalah nomor 76L
,. Nilai Boolean "true" menjadi1
ketika dilemparkan ke angka.BitConverter
adalah kelas .NET standar.sumber
Racket,
3528 byte'B
atau'L
masing - masing. Beritahu saya jika ini tidak cukup spesifik :)sumber
PHP, 22 byte
sumber
Haskell (menggunakan tipe numerik terbatas ukuran GHC saja), 75 byte
(tidak diuji pada arsitektur big-endian, tetapi sepertinya itu harus bekerja!)
sumber
K, 15 byte
Penjelasan;
sumber
Bash, 27 byte
䉌
( U + 424C ) dikodekan sebagai tiga UTF-8 byte:E4 89 8C
.Diasumsikan bahwa
iconv
menggunakan fungsi dari glibc dan bahwa UTF-8 lokal digunakan.sumber