Big atau Little Endian

57

Tulis program atau fungsi yang menghasilkan Lif dijalankan pada arsitektur endian kecil atau Bjika dijalankan pada arsitektur big endian. Output huruf kecil latau bjuga 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.

Liam
sumber
1
Memori kotak. Saya tidak yakin apa yang Anda maksud
Liam
7
Saya pikir ini adalah tantangan yang menarik (dan ini jauh dari norma) tetapi akan sangat sulit untuk mengujinya. Terutama karena sebagian besar kode akan menjadi platform yang sangat spesifik.
DJMcMayhem
7
Ya saya pikir itu akan menarik karena mudah-mudahan itu adalah sesuatu yang memiliki kesulitan dengan bahasa esolang dan golf daripada bahasa 'normal'. Saya merasa mereka tidak akan sulit untuk memverifikasi. Kasus terburuk mereka harus diverifikasi dengan tangan
Liam
2
Saya kira jawaban berdasarkan kode mesin tertentu dilarang? Kalau tidak B0 4C C3, yang mana mov al, 'L' / retatau unsigned char f(){ return 'L'; }, akan menjadi jawaban x86 yang valid.
Margaret Bloom
5
Bravo! untuk tantangan kode golf di mana bahasa pemrograman serba guna dapat kompetitif.
PellMell

Jawaban:

42

Python, 33 byte

import sys
exit(sys.byteorder[0])

sys.byteorderadalah salah satu 'little'atau 'big'(dan bagi Anda yang akan membaca kalimat ini tanpa melihat kode, [0]berarti mengambil karakter pertama).

Anders Kaseorg
sumber
Tantangannya mengatakan output harus Ldan B(atau varian huruf kecil), bukan keseluruhan kata.
user2428118
43
Itu sebabnya katanya sys.byteorder[0], yaitu char pertama byteorder.
s3lph
36

C, 26 byte

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

Diasumsikan 32-bit intdan karakter ASCII. Diuji pada amd64 (little-endian) dan 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);}

Disarankan oleh feersum. Nilai konstanta multi-karakter bergantung pada implementasi, tetapi ini tampaknya bekerja di GCC. Diuji pada arsitektur yang sama.

Anders Kaseorg
sumber
7
Lebih pendek a='B\0\0L';The \0s bisa diganti dengan nol byte.
feersum
1
@feersum Endianness dari konstanta multi-karakter tampaknya tergantung pada implementasi. Saya biasanya tidak terlalu khawatir tentang hal itu dalam kode golf, tetapi tantangan ini adalah tentang membedakan antara implementasi.
Anders Kaseorg
Apakah kode ini saat ini berfungsi selain GCC?
feersum
1
@feersum C89 memungkinkan keduanya.
Anders Kaseorg
1
Menggunakan xlc (VisualAge C ++ Professional / C untuk AIX Compiler, Versi 6) pada RS6000 yang menjalankan AIX 5.2, program 26 byte berhasil mencetak "B"
Jerry Jeremiah
24

MATLAB / Oktaf, 24 byte

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

The computerFungsi memberikan informasi tentang, baik, komputer itu berjalan pada. Output ketiga adalah endianness: Latau Buntuk endianness kecil atau besar.

Cobalah di Ideone .

Luis Mendo
sumber
1
apa. Ini adalah sesuatu untuk stackoverflow, saya tidak tahu ini!
Brain Guider
20

JavaScript ES6, 50 byte

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

Saya tidak tahu siapa yang memutuskan itu adalah ide yang baik untuk objek TypedArray untuk mengekspos endianness asli dari penerjemah, tetapi di sinilah kita.

Anders Kaseorg
sumber
5
Orang-orang WebGL berpikir itu adalah ide yang bagus, untuk menghindari keharusan mengkonversi endianness ketika beralih ke GPU. Hampir semua orang menganggapnya bodoh… :(
gsnedders
11

C, 36 35 byte

1 byte berkat @algmyr dan @owacoder.

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

Kredit di sini .

Tidak diuji karena saya tidak punya mesin big-endian.

Biarawati Bocor
sumber
2
Apakah spesifikasi C memungkinkan fungsi satu argumen main?
CodesInChaos
@codesinchaos ya itu. Ini akan menjadi jumlah argumen baris perintah yang diberikan. Biasanya di sini digunakan untuk menginisiasi variabel 1karena tidak ada input yang diberikan (dan nama program selalu dianggap sebagai argumen pertama)
Liam
2
@Liam: Jika sesuatu selain 0 atau 2 diizinkan implementasi didefinisikan dalam C11.
1
Atau main(a){putchar("BL"[*(char*)&a]);}.
owacoder
2
Jika Anda berantakan dengan konvensi panggilan itu turun ke 31: main(char a){putchar("BL"[a]);}.
Andrea Biondo
8

Mathematica, 22

{B,L}[[$ByteOrdering]]

Ini mungkin melanggar beberapa aturan tentang tidak menggunakan fungsi built-in tapi saya tidak benar-benar tertarik dengan rube goldberging alternatif.

Tuan Penyihir
sumber
1
Built-in baik-baik saja (sebagian besar jawaban juga menggunakannya)
Liam
2
Dan sekali lagi, Mathematica memiliki fitur bawaan!
gcampbell
3
Saya pikir ini adalah cuplikan, bukan program atau fungsi, dan Anda harus menambahkannya &agar berfungsi. (Tapi mungkin ada ketidaksepakatan tentang apa yang merupakan "program".)
Anders Kaseorg
1
@ Anders Saya tidak begitu akrab dengan standar saat ini untuk PCG (jika saya pernah) tetapi IMHO satu keuntungan dari bahasa yang ditafsirkan adalah bahwa potongan adalah sebuah program. Ini dapat dijalankan dengan cara yang berdiri sendiri seperti halnya program lain di Mathematica .
Mr.Wizard
1
@ Mr.Wizard Perhatikan bahwa "program" dalam Mathematica merujuk ke skrip mandiri (yang memerlukan pencetakan eksplisit), sedangkan jawaban ini menggunakan REPL.
LegionMammal978
8

C, 27

Satu byte lagi, tapi ini dia:

f(){putchar(htons(19522));}
Trauma Digital
sumber
Ini bekerja dengan baik, bisa tolong jelaskan kepada saya.
ABcDexter
3
@ ABcDexter perluasan biner tahun 19522 adalah 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 dengan LB. htonsakan melakukan tugasnya , dan putcharhanya akan mencetak LSB. Dalam sistem big-endian, itu akan menjadi B, di little-endian, htonsakan membalik byte, sehingga LSB L.
Kroltan
Ganti 19522dengan 'LB'untuk peringatan kompiler dan -1 byte.
Stan Strum
8

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

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

Sekarang begini:

  • yang MSR dibaca ke GP mendaftar 0; MSR berisi bit 31 pengaturan endianness (0 = big endian; 1 = little endian);
  • rlwinmekstrak 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;
  • kalikan hasilnya dengan 10 dan jumlah 66 ( 'B') (10 adalah perbedaan antara 'L'dan 'B')
  • akhirnya, kembali ke penelepon

Catatan

  1. ya, pertanyaannya adalah meminta untuk mencetak , tetapi tidak jelas bagaimana saya harus mencetak barang dalam perakitan yang diharapkan untuk berjalan tanpa dimodifikasi pada sistem operasi yang berbeda. =)
  2. 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.

Matteo Italia
sumber
7

Java 8, 96, 64 52 byte

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

Sebuah golf berdasarkan jawaban SO ini . Semua kredit diberikan ke @LeakyNun dan @AlanTuning. Java terus mempertahankan kekalahan.

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);}

Tidak teruji b / c Saya tidak punya akses ke mesin big-endian.

Biru
sumber
1
char e(){return(""+java.nio.ByteOrder.nativeOrder()).charAt(0);}
Leaky Nun
char e(){return(""+java.nio.Bits.byteOrder()).charAt(0);}
Leaky Nun
@ LeakyNun Saya tidak melihat Bits di Java API, dan ketika saya menjalankannya memberi saya "Bits tidak umum di java.nio"
Biru
Oh, baiklah kalau begitu.
Leaky Nun
52 byte jika Anda menggunakan lambda! ()->(""+java.nio.ByteOrder.nativeOrder()).charAt(0);
Shaun Wild
6

Perl, 38 36 byte

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

Bekerja dengan mengemas nomor dalam urutan byte default sistem dan membandingkannya dengan nomor yang dikemas dalam urutan byte little-endian.

sebuah spaghetto
sumber
6

(G) Keempat, 24 byte

here $4200004C , c@ emit

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.

jwodder
sumber
5

C, 34 byte

Ini mengasumsikan pengkodean karakter ASCII

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

Panggilan tanpa argumen.

Penjelasan:

Saat panggilan, aakan 1. *(char*)amengakses byte pertama a, 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 untuk B. Pada platform little-endian, itu akan melewati 66 + 10 * 1 = 76, yang merupakan kode ASCII untuk L.

celtschk
sumber
5

C #, 60 52 byte

C # ternyata sangat kompetitif dalam hal ini.

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

Kredit ke Groo untuk sintaks C # 6.

60 byte:

char e(){return System.BitConverter.IsLittleEndian?'L':'B';}
BgrWorker
sumber
Dengan sintaks C # 6 Anda dapat mempersingkatnya sedikit:, char e=>System.BitConverter.IsLittleEndian?'L':'B';tentu saja ini (dan juga jawaban Java) tidak benar-benar mencetak nilai.
Groo
Selamat Datang di Programming Puzzles & Code Golf! Ini jawaban pertama yang bagus.
Alex A.
5

Julia, 24 19 byte

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

Ini adalah fungsi anonim yang tidak mengambil input dan mengembalikan a Char. Untuk menyebutnya, tetapkan ke variabel. Diasumsikan bahwa bilangan bulat 64-bit.

The ntohfungsi mengkonversi endianness dari nilai yang dikirimkan ke dari urutan byte jaringan (big endian) dengan yang digunakan oleh komputer host. Pada mesin big endian, ntohadalah fungsi identitas karena tidak ada konversi yang harus dilakukan. Pada mesin endian kecil, byte ditukar, jadi ntoh(5) == 360287970189639680. Yang juga, mungkin lebih mudah dibaca, sama dengan: 0000010100000000000000000000000000000000000000000000000000000000dalam 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!

Alex A.
sumber
Untuk 32 bit Anda harus mengubah 55 ke 23 (juga 5 dalam 16 bit yang seharusnya 7, kesalahan saya). Saya pikir Dennis berarti sesuatu seperti ()->ntoh(5)>>55+'B':?
FryAmTheEggman
1
f()='L'-ntoh(10)%16dan f()='L'-ntoh(10)&10harus bekerja pada semua platform.
Dennis
5

PHP 5.6, 41 31 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

Pinoniq
sumber
Anda dapat menyimpan 10 byte : <?=unpack(S,"\x01\x00")[1]-1?B:L;.
masukkan nama pengguna
5

Gangguan Umum, 27 byte

Diuji pada SBCL dan ECL. Untuk pendekatan portabel, seseorang harus menggunakan fitur-fitur sepele .

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

The #+notasi adalah kondisi read-waktu , yang berbunyi bentuk berikutnya hanya jika mengevaluasi ekspresi kondisional untuk benar. Di sini syaratnya adalah seluruh #+big-endianteks yang berarti bahwa pengujian terpenuhi jika :big-endiankata 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:

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

(NB. CL-USER>Adalah prompt)

Badan fungsi adalah implisit PROGN, artinya hanya evaluasi dari ekspresi terakhir yang dikembalikan. Jadi simbol pengembalian sebenarnya di atas B. Namun, jika kondisi baca-waktu dinilai false, formulir terbaca seolah-olah Anda menulis:

CL-USER>(lambda()'L)

... yang mengembalikan simbol L.

coredump
sumber
Cuplikan tidak diizinkan; tulislah program atau fungsi lengkap sebagai gantinya.
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Diperbarui, terima kasih
coredump
Catatan: Cuplikan hanya diizinkan jika diizinkan secara eksplisit oleh OP.
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Bisakah Anda memberikan referensi untuk ini? Ada jawaban REPL lainnya di sini dan / atau cuplikan shell dan posting meta ini akan menyarankan bahwa jawaban REPL bisa ok secara default. Terima kasih.
coredump
5

ARMv6 dan yang lebih baru: 20 byte kode mesin

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)

Tidak teruji, karena saya tidak punya mesin yang cocok. Bit 9 dari CPSR memberikan load / store endianness saat ini.

pengguna1908704
sumber
Anda dapat menggunakan pengembalian dari fungsi ( BX lr, bukan?) Bukan putchar, karena r0register yang tepat untuk hasil yang dikembalikan.
anatolyg
Memang, itu (sebenarnya MOV pc, lr) ada di salah satu suntingan saya sebelumnya. Namun ini memenuhi spesifikasi untuk mencetak surat itu, bukan hanya mengembalikannya.
user1908704
Saya mungkin membaca referensi yang salah, tapi saya pikir ini bisa dilakukan dalam instruksi encoding "thumb 2". Ini berarti instruksi pertama tetap 32 bit ("encoding T1" pada halaman F7-2720 dari manual referensi ARM v8, yang akan membuatnya 0xF3EF_8000); yang kedua juga 32 bit (pengkodean operan agak aneh, tetapi dapat dilakukan dengan "i: imm3" diatur ke 0010 dan "imm8" ke 00000010, yang memberikan instruksi keseluruhan 0xF010_2F02). Sebelum instruksi ketiga, kita perlu memasukkan "ITE EQ" (0xBF0C) untuk mengontrol kondisi pada dua instruksi MOV berikutnya, yang menjadi 0x204C dan ...
Jules
... 0x2042 (hemat 2 byte secara keseluruhan). Kemudian instruksi BL terakhir agak sulit untuk diwakili karena bit-bit alamat yang kita tidak tahu akhirnya tersebar di antara bit-bit instruksi yang kita tahu, tetapi juga merupakan encoding 32-bit, sehingga hasilnya akan menjadi total 18 byte (F3 EF 80 00 F0 10 2F 02 BF 0C 20 4C 20 42 F? ?? ?? ?? ??). Saya percaya ini mengubah arsitektur ke ARMv8 dan yang lebih baru, meskipun mungkin berfungsi di ARMv7 (?).
Jules
4

Perl 5, 21 + 1 = 22 byte

Jalankan dengan perl -E.

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

Diuji pada amd64 (little-endian) dan mips (big-endian).

Anders Kaseorg
sumber
Apakah -Eflag benar-benar diperlukan dalam hitungan byte? Anda bisa mengatakan Anda menggunakan Perl 5.10 (karena sayperintah tersedia dalam versi ini)
Paul Picard
1
@PaulPicard Tetapi use 5.10.0;masih banyak lagi byte!
Anders Kaseorg
1
@ PaulPicard Poin Anda salah. Perl 5.10 memerlukan -Esaklar atau usepernyataan untuk say.
Anders Kaseorg
3
-E"gratis" di PPCG. Tidak perlu menambahkan apa pun.
Ven
1
(Namun -ndan -ptidak)
Ven
4

R, 28 23 byte

substr(.Platform$endian,1,1)

.Platform$endiankembali bigjika dijalankan pada big endian dan littlejika sedikit. Di sini, menggunakan substr, ia mengembalikan huruf pertama dari output, jadi batau l.

Seperti endiansatu-satunya objek yang dimulai dengan objek yang eterkandung dalam .Platformkita dapat menguranginya berkat pencocokan sebagian dengan kode 23 byte berikut:

substr(.Platform$e,1,1)
plannapus
sumber
3

Clojure, 46 44 byte

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

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

mil
sumber
Apa sebenarnya clojure, apakah itu lisp atau java?
Leaky Nun
@ LeakyNun Mungkin LISP praktis yang bekerja dengan Java? Sulit dikatakan.
mil
#(nth(str(java.nio.ByteOrder/nativeOrder))0)lebih pendek 2 byte
cliffroot
3

Rubi, 3130 karakter.

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

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.

akostadinov
sumber
Jika saya ingat dengan benar, setelah Ruby 1.9, Anda dapat menggunakan ?Ldan ?Bmenggantikan puts :Ldanputs "B"
Sherlock9
Saya pikir puts [76,66].pack("s")[0]akan berhasil.
Wayne Conrad
@ Sherlock9, terima kasih, kurang satu char. @WayneConrad, Mungkin tambahkan jawaban Anda, saya tidak punya mesin endian besar untuk menguji tetapi pada endian kecil itu berfungsi. Tetapi mengubah seperti ini tidak bekerja: 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.
akostadinov
Sayangnya, saya juga tidak memiliki mesin big-endian untuk diuji.
Wayne Conrad
3

Bash (dan shell unix lainnya), 32 (33) byte

Upaya pertama dan kedua:

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

Berkat Dennis, versi yang lebih pendek:

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

The echoutilitas output baris baru, dengan nilai hex 0A, dan tidak ada output lainnya. Untuk <<<aitu 61 0A.

The odutilitas, 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 sebagai 0A 00, yang dikonversi menjadi 005000big-endian atau 000012little-endian. 61 0Amenjadi 005141little-endian dan 060412big-endian. Output penuh od juga termasuk alamat dan data ukuran yang berarti kita tidak bisa menggunakan 0, 1atau 2untuk ujian.

Perintah didefinisikan dengan baik untuk mengekspos endianness sistem. Dari standar :

Urutan byte yang digunakan ketika menginterpretasikan nilai-nilai numerik adalah implementasi-didefinisikan, tetapi harus sesuai dengan urutan di mana konstanta dari tipe yang sesuai disimpan dalam memori pada sistem.

Catatan kompatibilitas

Saya tidak yakin apakah menempatkan echo|odbackquote tanpa tanda kutip ganda di sekitarnya [yang menghasilkan argumen tiga kata untuk case] 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 abisa digunakan untuk versi portable. Semua skrip bekerja dalam bash, ksh, dan zsh, dan yang portabel bekerja di dash.

Random832
sumber
Tidak ada perubahan yang diperlukan; cukup masukkan satu shell yang berfungsi di dalam bahasa kepala dan Anda sudah siap.
Dennis
1
@Dennis Saya seperti melakukan semacam analisis ... meskipun itu lebih menyenangkan jika saya melakukan menemukan sesuatu yang non-standar yang mendapat jawaban yang lebih pendek di bash atau zsh dari yang lain. Mungkin saya akan melihat apa yang dapat dilakukan dengan[[
Random832
1
Tidak ada yang salah dengan analisisnya. Paragraf terakhir hanya terdengar seperti Anda tidak yakin apakah jawaban khusus shell valid ... od<<<a|grep -q 5&&echo L||echo Bharus bekerja di Bash dan lainnya.
Dennis
Saya mengujinya dalam VM big-endian, dan echo|odmencetak 0000000\n005000\n0000001seperti yang Anda harapkan.
Dennis
@ user17752 Karena endianness tidak mempengaruhi output dari od -a.
Acak 832
3

PHP, 16 byte

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

Ini menggunakan dua trik yang tidak digunakan dalam dua jawaban PHP yang ada:

  1. Nilai yang diteruskan ke paket () atau membongkar () dapat berupa apa saja, bukan hanya 0 atau 1.
  2. Operator XOR bitwise ( ^) bekerja pada string, dan hasilnya hanya sepanjang string yang lebih pendek, menghindari kebutuhan untuk pengindeksan string atau operator ternary.
Tolong berdiri
sumber
2

Node, 42 byte

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

Pro: ada builtin. Con: nama properti sangat panjang

Downgoat
sumber
2

PowerShell, 44 byte

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

Karakter 66 adalah B, dan 10 karakter kemudian adalah nomor 76 L,. Nilai Boolean "true" menjadi 1ketika dilemparkan ke angka. BitConverteradalah kelas .NET standar.

Ben N
sumber
1

Racket, 35 28 byte

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

'Batau 'Lmasing - masing. Beritahu saya jika ini tidak cukup spesifik :)

Winny
sumber
1

PHP, 22 byte

<?=ord(pack(S,1))?L:B;
Anders Kaseorg
sumber
1

Haskell (menggunakan tipe numerik terbatas ukuran GHC saja), 75 byte

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

(tidak diuji pada arsitektur big-endian, tetapi sepertinya itu harus bekerja!)

Jules
sumber
1

K, 15 byte

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

Penjelasan;

    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
Chromozorz
sumber
1

Bash, 27 byte

iconv -tucs2<<<䉌|head -c1

( U + 424C ) dikodekan sebagai tiga UTF-8 byte: E4 89 8C.

Diasumsikan bahwa iconvmenggunakan fungsi dari glibc dan bahwa UTF-8 lokal digunakan.

Tolong berdiri
sumber