Big or Little Endian

57

Napisz program lub funkcję, która generuje polecenie Lif działające na małej architekturze endian lub polecenie Bif działające na dużej architekturze endian. Wyjście małych liter llub bjest również dopuszczalne.

Brak danych wejściowych.

Punktacja to kodowanie w golfa, więc wygrywa kod z najmniejszą liczbą bajtów.

Edycja: Zgodnie z poniższymi komentarzami wyjaśniam, że wpis musi być w stanie działać na dowolnej architekturze.

Uważam, że jest na to tylko jedna odpowiedź, która wyraźnie wskazuje, że tak jest.

Liam
źródło
1
Pamięć pudełka. Nie jestem pewien, co masz na myśli
Liam,
7
Myślę, że jest to interesujące wyzwanie (i daleko poza normę), ale bardzo trudno będzie je przetestować. Zwłaszcza, że ​​większość kodu ostatecznie będzie bardzo specyficzna dla platformy.
DJMcMayhem
7
Tak, myślę, że będzie to interesujące, ponieważ mam nadzieję, że jest to coś, z czym esolangi i języki gry w golfa mają trudniejszy czas niż „normalne” języki. Mam wrażenie, że nie będzie to takie trudne do zweryfikowania. W najgorszym przypadku powinny być one możliwe do zweryfikowania ręcznie
Liam,
2
Chyba odpowiedź na podstawie konkretnego kodu maszynowego jest zabroniona? W przeciwnym razie B0 4C C3, która jest mov al, 'L' / retlub unsigned char f(){ return 'L'; }byłaby poprawną odpowiedzią x86.
Margaret Bloom
5
Brawo! dla wyzwania golfowego, w którym języki programowania ogólnego zastosowania mogą być konkurencyjne.
PellMell,

Odpowiedzi:

42

Python, 33 bajty

import sys
exit(sys.byteorder[0])

sys.byteorderjest albo 'little'lub 'big'(a dla tych z was, którzy będą czytać to zdanie bez patrzenia na kod, [0]znaczy wziąć pierwszy znak).

Anders Kaseorg
źródło
Wyzwanie mówi, że wyjście musi być Li B(lub wariant z małymi literami), a nie całe słowo.
user2428118
43
Dlatego mówi sys.byteorder[0], tj. Pierwszy znak byteorder.
s3lph
36

C, 26 bajtów

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

Przyjmuje intznaki 32-bitowe i ASCII. Testowany na amd64 (little-endian) i mips (big-endian).

GCC, 23 bajty

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

Sugerowane przez feersum. Wartość stałych wieloznakowych zależy od implementacji, ale wydaje się, że działa w GCC. Testowane na tych samych architekturach.

Anders Kaseorg
źródło
7
Krótszy jest, a='B\0\0L';że \0s można zastąpić bajtami zerowymi.
feersum
1
@feersum Endianness stałych wieloznakowych wydaje się być zależny od implementacji. Normalnie nie martwiłbym się tak bardzo w golfie kodowym, ale to wyzwanie polega na rozróżnieniu między implementacjami.
Anders Kaseorg,
Czy ten kod działa obecnie w czymś innym niż GCC?
feersum
1
@feersum C89 pozwala na jedno i drugie.
Anders Kaseorg,
1
Używając xlc (VisualAge C ++ Professional / C dla kompilatora AIX, wersja 6) na RS6000 z systemem AIX 5.2, 26-bajtowy program z powodzeniem drukuje „B”
Jerry Jeremiah
24

MATLAB / Octave, 24 bajty

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

Ta computerfunkcja informuje o komputerze, na którym działa. Trzecim wyjściem jest endianness: Llub odpowiednio Bdla little- lub big-endian.

Wypróbuj na Ideone .

Luis Mendo
źródło
1
co. To jest coś dla przepełnienia stosu, nie wiedziałem tego!
Brain Guider
20

JavaScript ES6, 50 bajtów

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

Nie wiem, kto zdecydował, że to dobry pomysł na TypedArray sprzeciwia się narazić rodzimych endianness interpretera, ale tutaj jesteśmy.

Anders Kaseorg
źródło
5
Ludzie WebGL uważali, że dobrym pomysłem jest uniknięcie konieczności konwersji endianizmu podczas przechodzenia na GPU. Prawie wszyscy inni uważali to za głupie… :(
gsnedders
11

C, 36 35 bajtów

1 bajt dzięki @algmyr i @owacoder.

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

Kredyty tutaj .

Nie przetestowano, ponieważ nie mam maszyny big-endian.

Leaky Nun
źródło
2
Czy specyfikacja C zezwala na funkcję z jednym argumentem main?
CodesInChaos
@codesinchaos tak to robi. Będzie to liczba podanych argumentów wiersza poleceń. Zwykle używa się tutaj, aby inicjować zmienną, 1ponieważ nie podano danych wejściowych (a nazwa programu zawsze liczy się jako pierwszy argument)
Liam
2
@Liam: Jeśli dozwolone jest cokolwiek innego niż 0 lub 2, implementacja jest zdefiniowana w C11.
1
Lub main(a){putchar("BL"[*(char*)&a]);}.
owacoder
2
Jeśli bałagan z konwencją wezwanie idzie w dół do 31: main(char a){putchar("BL"[a]);}.
Andrea Biondo
8

Mathematica, 22

{B,L}[[$ByteOrdering]]

Prawdopodobnie łamie to pewną zasadę dotyczącą nieużywania wbudowanej funkcji, ale tak naprawdę nie interesuje mnie alternatywa dla Rube Goldberging.

Mr.Wizard
źródło
1
Wbudowane są w porządku (większość z nich również ich używa)
Liam
2
I jeszcze raz Mathematica ma wbudowane!
gcampbell
3
Myślę, że to jest fragment kodu, a nie program lub funkcja, i powinieneś dodać, &aby uczynić go funkcją. (Ale może istnieć spór dotyczący tego, co stanowi „program”.)
Anders Kaseorg
1
@Anders Nie jestem tak naprawdę zaznajomiony z obecnymi standardami PCG (jeśli kiedykolwiek tak było), ale jedną z zalet interpretowanego języka IMHO jest to, że fragment jest programem. Można to uruchomić w sposób niezależny, jak każdy inny program w Mathematica .
Mr.Wizard
1
@ Mr.Wizard Zauważ, że „program” w Mathematica odnosi się do samodzielnego skryptu (który wymaga wyraźnego drukowania), podczas gdy ta odpowiedź korzysta z REPL.
LegionMammal978
8

C, 27

Jeden bajt dłużej, ale tutaj i tak:

f(){putchar(htons(19522));}
Cyfrowa trauma
źródło
Działa dobrze, czy możesz mi to wyjaśnić.
ABcDexter
3
@ABcDexter binarne rozszerzenie 19522 to 1001100 01000010(spacja do oddzielenia bajtów). Teraz, jeśli weźmiesz każdy bajt, przekonwertujesz z powrotem na bazę 10 i sprawdzisz tabelę ASCII, zobaczysz, że ta sekwencja bajtów jest równoważna LB. htonsbędzie , co robi , i putcharbędzie drukować tylko LSB. W systemach big-endian, to znaczy Bw little-endian htonszmieniłby bajty, tak jak LSB L.
Kroltan
Wymienić 19522z 'LB'ostrzeżenia kompilator -1 bajt.
Stan Strum
8

Kod maszynowy PowerPC - 20 bajtów

PowerPC jest bi-endianem (endianness można ustawić przy uruchomieniu), więc ten kod powinien być zgodny z żądaniem wyzwania dotyczącym możliwości uruchamiania zarówno na maszynach BE, jak i LE. Jest to funkcja, która zwraca 1 'L' lub 'B'zależy od aktualnie ustawionej endianizmu.

Jako funkcja AFAICT jest zgodny z SVR4 PowerPC ABI (używany przez Linuksa na ppc32), PowerOpen ABI (używany np. Przez AIX) i OS X ABI. W szczególności polega on tylko na tym, że GPR 0 jest lotnym rejestrem scratch, a GPR 3 służy do zwracania „małych” wartości.

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

Teraz wygląda to tak:

  • MSR są wczytywane do rejestru GP 0; MSR zawiera w bicie 31 ustawienia endianizmu (0 = duży endian; 1 = mały endian);
  • rlwinmEkstrakty prostu nieco: przyjmuje wartość w GPR0, R Otates l EFT do 1 miejsca (tak, że teraz w pozycji 0) i m zadaje się z 1 (maski generowany przez 31,31 2 ); wynik jest umieszczany w rejestrze GP 3;
  • pomnóż wynik przez 10 i sumę 66 ( 'B') (10 to różnica między 'L'i'B' )
  • w końcu wróć do dzwoniącego

Notatki

  1. tak, pytanie wymaga wydruku , ale nie jest jasne, jak powinienem drukować rzeczy w asemblerze, które powinny działać niezmodyfikowane w różnych systemach operacyjnych. =)
  2. dla zainteresowanych zobacz rlwinm dokumentację ; wiedząc prawie nic o PowerPC, uważałem tego rodzaju instrukcje za niezwykle interesujące.

    Aktualizacja 2018 : Raymond Chen publikuje serię o architekturze PowerPC, znajdziesz tutaj jego świetny post na temat rlwinmi przyjaciół.

Matteo Italia
źródło
7

Java 8, 96, 64 52 bajtów

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

Golf oparty na tej SO odpowiedzi . Wszystkie zasługi należą do @LeakyNun i @AlanTuning. Java utrzymuje pasmo przegranych.

96 bajtów:

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

64 bajty:

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

Untested b / c Nie mam dostępu do maszyny big-endian.

niebieski
źródło
1
char e(){return(""+java.nio.ByteOrder.nativeOrder()).charAt(0);}
Leaky Nun
char e(){return(""+java.nio.Bits.byteOrder()).charAt(0);}
Leaky Nun
@LeakyNun Nie widzę bitów w API Java, a kiedy go uruchamiam, daje mi komunikat: „Bity nie są publiczne w java.nio”
Blue
Och, więc dobrze.
Leaky Nun
52 bajty, jeśli używasz lambda! ()->(""+java.nio.ByteOrder.nativeOrder()).charAt(0);
Shaun Wild,
6

Perl, 38 36 bajtów

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

Działa poprzez umieszczenie liczby w domyślnej kolejności bajtów w systemie i porównanie jej z liczbą spakowaną w kolejności bajtów little-endian.

spaghetto
źródło
6

(G) Dalej, 24 bajty

here $4200004C , c@ emit

Zakłada, że ​​komórki mają 32 bity (i że twój interpreter Forth obsługuje podstawowe prefiksy Gfortha ). Po prostu przechowuje liczbę 0x4200004C w pamięci, a następnie wyświetla bajt na dolnym końcu.

jwodder
źródło
5

C, 34 bajty

Zakłada to kodowanie znaków ASCII

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

Zadzwoń bez argumentów.

Wyjaśnienie:

Na wezwanie abędzie 1. *(char*)adostęp do pierwszego bajtu a, który na platformach little-endian będzie wynosił 1, na platformach big-endian będzie wynosił 0.

Na platformach big-endian ten kod przekaże zatem 66 + 10 * 0 = 66 do putchar. 66 to kod ASCII dla B. Na platformach little-endian przekaże 66 + 10 * 1 = 76, co jest kodem ASCII L.

celtschk
źródło
5

C #, 60 52 bajtów

C # jest w tym przypadku zaskakująco konkurencyjny.

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

Podziękowania dla Groo za składnię C # 6.

60 bajtów:

char e(){return System.BitConverter.IsLittleEndian?'L':'B';}
BgrWorker
źródło
Przy pomocy składni C # 6 możesz ją trochę skrócić: char e=>System.BitConverter.IsLittleEndian?'L':'B';oczywiście to (podobnie jak odpowiedź Java) tak naprawdę nie drukuje wartości.
Groo,
Witamy w Programowaniu Puzzle i Code Golf! To miła pierwsza odpowiedź.
Alex A.,
5

Julia, 24 19 bajtów

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

Jest to anonimowa funkcja, która nie pobiera danych wejściowych i zwraca a Char. Aby go wywołać, przypisz go do zmiennej. Zakłada się, że liczby całkowite są 64-bitowe.

ntohFunkcja przekształca bajt wartości przekazanego do niej z sieciowej kolejności bajtów (big endian) do tej stosowanej przez komputer. Na dużych komputerach Endian ntohjest funkcja tożsamości, ponieważ nie ma konieczności konwersji. Na małych komputerach Endian bajty są zamieniane, więc ntoh(5) == 360287970189639680. Co jest również, być może bardziej czytelne, równe: 0000010100000000000000000000000000000000000000000000000000000000w systemie binarnym.

Jeśli poprawimy nieco wynik o ntoh(5)55, otrzymamy 0 na dużych komputerach Endian i 10 na małych komputerach Endian. Dodając to do stałej postaci 'B', otrzymamy odpowiednio 'B'lub 'L'dla dużych lub małych maszyn Endian.

Zaoszczędź 5 bajtów dzięki FryAmTheEggman i Dennis!

Alex A.
źródło
Dla wersji 32-bitowej musiałbyś zmienić 55 na 23 (również 5 w 16-bitowej wersji powinno być 7, mój błąd). Myślę, że Dennis miał na myśli coś takiego ()->ntoh(5)>>55+'B':?
FryAmTheEggman
1
f()='L'-ntoh(10)%16i f()='L'-ntoh(10)&10powinien działać na wszystkich platformach.
Dennis
5

PHP 5.6, 41 31 bajtów (thx na isertusernamehere)

<?=unpack(S,"\x01\x00")[1]-1?B:L;

PHP 7, 41 bajtów

echo unpack('S',"\x01\x00")[1]-1?'B':'L';

Pomysł skradziony z: https://stackoverflow.com/a/24785578/2496717

Pinoniq
źródło
Można zapisać 10 bajtów : <?=unpack(S,"\x01\x00")[1]-1?B:L;.
inserttusernamehere
5

Common Lisp, 27 bajtów

Testowany na SBCL i ECL. W przypadku podejścia przenośnego należy używać funkcji trywialnych .

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

#+Notacja jest warunek odczytu czasu , który odczytuje następną postać tylko wtedy, gdy wyrażenie warunkowe ocenia się prawdą. Tutaj warunkiem jest cały #+big-endiantekst, co oznacza, że ​​test jest spełniony, jeśli :big-endiansłowo kluczowe należy do *FEATURES*listy (lista zawierająca między innymi informacje dotyczące platformy). Następujące wyrażenie to 'B, które jest albo odczytywane, albo pomijane zgodnie z wynikiem testu. Jeśli twoja platforma jest big-endian i piszesz powyższy formularz w REPL, jest tak, jakbyś napisał:

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

(NB. CL-USER>To monit)

Ciało funkcji jest niejawne PROGN, co oznacza, że ​​zwracana jest tylko ocena ostatniego wyrażenia. Więc powyższe rzeczywiście zwraca symbol B. Jeśli jednak warunek czasu odczytu ma wartość false, formularz brzmi tak, jakby napisano:

CL-USER>(lambda()'L)

... który po prostu zwraca symbol L.

rdzeń rdzeniowy
źródło
Fragmenty nie są dozwolone; zamiast tego napisz pełne programy lub funkcje.
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Zaktualizowano, dzięki
coredump
Uwaga: Fragmenty są dozwolone tylko wtedy, gdy zostało to wyraźnie dozwolone przez PO.
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Czy możesz podać referencje? Są tutaj inne odpowiedzi REPL i / lub fragmenty powłoki, a ten meta post sugeruje, że domyślnie odpowiedzi REPL mogą być prawidłowe. Dzięki.
coredump
5

ARMv6 i nowsze wersje: 20 bajtów kodu maszynowego

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)

Nie przetestowano, ponieważ nie mam odpowiedniej maszyny do ręki. Bit 9 CPSR podaje aktualną endianiczność ładowania / przechowywania.

użytkownik1908704
źródło
Zamiast tego możesz użyć zwrotu z funkcji ( BX lrprawda?) putchar, Ponieważ r0jest to odpowiedni rejestr zwracanych wyników.
anatolyg
Rzeczywiście, to (właściwie MOV pc, lr) było w jednej z moich poprzednich edycji. Jest to jednak zgodne ze specyfikacją drukowania listu, a nie tylko jego zwracania.
user1908704,
Być może źle czytam odniesienie, ale myślę, że można to zrobić w kodowaniu instrukcji „kciuk 2”. Oznaczałoby to, że pierwsza instrukcja pozostała 32-bitowa („kodowanie T1” na stronie F7-2720 podręcznika ARM v8, co oznaczałoby, że to 0xF3EF_8000); drugi ma również 32 bity (kodowanie operandu jest nieco dziwne, ale można to zrobić przy ustawieniu „i: imm3” na 0010 i „imm8” na 00000010, co daje ogólną instrukcję 0xF010_2F02). Przed trzecim instrukcji, musimy wstawić „ITE EQ” (0xBF0C) kontrolować warunki dotyczące najbliższych dwóch instrukcji MOV, które stają 0x204C i ...
Jules
... 0x2042 (oszczędność 2 bajtów ogółem). Ostateczna instrukcja BL jest trochę trudna do przedstawienia, ponieważ bity adresu, którego nie znamy, są rozproszone między bitami instrukcji, którą znamy, ale jest to również kodowanie 32-bitowe, więc wynik byłby mieć łącznie 18 bajtów (F3 EF 80 00 F0 10 2F 02 BF 0C 20 4C 20 42 F? ?? ???). Wierzę, że to zmienia architekturę na ARMv8 i nowsze, chociaż może działać w ARMv7 (?).
Jules
4

Perl 5, 21 + 1 = 22 bajtów

Uruchom z perl -E.

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

Testowany na amd64 (little-endian) i mips (big-endian).

Anders Kaseorg
źródło
Czy -Eflaga jest naprawdę niezbędna w liczbie bajtów? Możesz po prostu powiedzieć, że używasz Perla 5.10 (ponieważ saypolecenie jest dostępne w tej wersji)
Paul Picard
1
@PaulPicard Ale use 5.10.0;jest o wiele więcej bajtów!
Anders Kaseorg,
1
@PaulPicard Twój punkt jest błędny. Perl 5.10 wymaga -Eprzełącznika lubuse instrukcji dla say.
Anders Kaseorg,
3
-Ejest „darmowy” w PPCG. Nie musisz nic dodawać.
Ven
1
(jednak -ni -pnie są)
Ven
4

R, 28 23 bajtów

substr(.Platform$endian,1,1)

.Platform$endianzwraca, bigjeśli działa na big endian i littlejeśli jest mało. Tutaj, używając substr, zwraca pierwszą literę wyniku, więc albo balbol .

Jest endianto jedyny obiekt zaczynający się ode zawartego w obiekcie, .Platformmożemy go zmniejszyć dzięki częściowemu dopasowaniu do następującego 23-bajtowego kodu:

substr(.Platform$e,1,1)
plannapus
źródło
3

Clojure, 46 44 bajtów

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

Jest to funkcja korzystająca z wbudowanego oprogramowania Java w celu uzyskania endianizmu maszyny. Następnie uzyskać reprezentację ciąg tego, który będzie albo "LITTLE_ENDIAN"czy "BIG_ENDIAN"i wziąć pierwszy znak dowolny łańcuch jest wybrany i że powrotu.

Zaoszczędzono 2 bajty dzięki @ cliffroot .

mile
źródło
Czym tak naprawdę jest clojure, czy to seplenienie czy java?
Leaky Nun
@LeakyNun Może praktyczny LISP współpracujący z Javą? Trudno powiedzieć.
mile
#(nth(str(java.nio.ByteOrder/nativeOrder))0)jest 2 bajty krótszy
cliffroot
3

Rubin, 3130 znaków.

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

Hmm, musi być lepszy sposób. Policz 5 znaków mniej, jeśli znak nie musi być wyprowadzany, ponieważ myślę, że inne rozwiązania pomijają drukowanie. tzn. usuń część „puts”, jeśli nie chcesz niczego drukować.

akostadinov
źródło
Jeśli dobrze pamiętam, po Ruby 1.9, można użyć ?Li ?Bzamiast puts :Liputs "B"
Sherlock9
Myślę, że puts [76,66].pack("s")[0]zadziała.
Wayne Conrad
@ Sherlock9, dzięki, jeden char mniej. @WayneConrad, Być może dodaj swoją odpowiedź, nie mam pod ręką dużej maszyny Endian do testowania, ale działa na małej endianie. Ale zmieniając w ten sposób nie działa: puts [76,66].pack("s>")[0]. Oznacza to, że możliwe jest, aby nie pracować nad big endianem z jakiegoś powodu, którego nie rozumiem dobrze. Ale ten wydaje się działać (pochodzi z twojego rozwiązania) puts [19522].pack("s>")[0]. WDYT? Zastanawiam się, czy mogę znaleźć miejsce do oceny na Big Endian.
akostadinov
Niestety, brakuje mi również maszyny typu big-endian do przetestowania.
Wayne Conrad
3

Bash (i inne powłoki uniksowe), 32 (33) bajty

Pierwsza i druga próba:

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

Dzięki Dennisowi, krótsza wersja:

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

echoNarzędzie wysyła do nowej linii, o wartości sześciokątnym 0A, a nie innym wyjściu. Bo <<<atak jest 61 0A.

odNarzędzie domyślnie interpretuje jako wejście dwubajtowych słów, zero-wyściełane, jeśli liczba jest nieparzysta liczba bajtów i konwertuje do ósemkowym. Powoduje to, że wyjście echa jest interpretowane jako 0A 00, które jest konwertowane na 005000postać big-endian lub 000012little-endian. 61 0Astaje się 005141w little-endian i 060412big-endian. Pełne wyjście OD także adres i rozmiar danych co oznacza, że nie można używać 0, 1lub 2do testu.

Polecenie jest dobrze zdefiniowane, aby ujawnić endianizm systemu. Od standardu :

Kolejność bajtów używana podczas interpretacji wartości liczbowych jest zdefiniowana w implementacji, ale powinna odpowiadać kolejności, w jakiej stała odpowiedniego typu jest przechowywana w pamięci w systemie.

Uwagi dotyczące zgodności

Nie jestem pewien, czy wstawianie echo|odcudzysłowów bez podwójnych cudzysłowów wokół nich [co skutkuje trzema słowami do case] jest obsługiwane we wszystkich systemach. Nie jestem pewien, czy wszystkie systemy obsługują skrypty powłoki bez kończącego znaku nowej linii. Jestem w większości pewien, ale nie 100% zachowania OD po dodaniu bajtu wypełniającego w systemach big-endian. W razie potrzeby echo amożna go użyć w wersjach przenośnych. Wszystkie skrypty działają w bash, ksh i zsh, a te przenośne działają w desce rozdzielczej.

Losowo 832
źródło
Żadna ze zmian nie jest konieczna; po prostu włóż jedną powłokę, w której działa, w nagłówek języka i gotowe.
Dennis
1
@Dennis Lubię przeprowadzać tego rodzaju analizy ... chociaż jest to bardziej zabawne, jeśli ja jest znaleźć coś niestandardowego, co daje krótszą odpowiedź w bash lub zsh niż w innych. Może zobaczę, co da się zrobić[[
Random832,
1
Nie ma nic złego w analizie. Ostatni akapit brzmiał tak, jakbyś nie był pewien, czy odpowiedź specyficzna dla powłoki jest prawidłowa ... od<<<a|grep -q 5&&echo L||echo Bpowinna działać w Bash i innych.
Dennis
Przetestowałem to na dużej maszynie wirtualnej i echo|oddrukuje 0000000\n005000\n0000001zgodnie z oczekiwaniami.
Dennis
@ user17752 Ponieważ endianness nie wpływa na wynik od -a.
Random832
3

PHP, 16 bajtów

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

Wykorzystuje dwie sztuczki, które nie są używane w dwóch istniejących odpowiedziach PHP:

  1. Wartość przekazywana do pack () lub unpack () może być dowolna, nie tylko 0 lub 1.
  2. Bitowy operator XOR ( ^) działa na łańcuchach, a wynik jest tylko tak długi jak łańcuch krótszy, unikając potrzeby indeksowania łańcucha lub operatora trójskładnikowego.
Proszę wstać
źródło
2

Węzeł, 42 bajty

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

Pro: jest wbudowany. Przeciw: nazwy właściwości są bardzo długie

Downgoat
źródło
2

PowerShell, 44 bajty

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

Charakter 66 B, a później 10 znaków jest liczba 76 L. Wartość logiczna „prawda” staje się 1rzutowana na liczbę. BitConverterjest standardową klasą .NET.

Ben N.
źródło
1

Rakieta, 35 28 bajtów

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

'Blub 'Lodpowiednio. Daj mi znać, jeśli nie jest to wystarczająco szczegółowe :)

Winny
źródło
1

PHP, 22 bajty

<?=ord(pack(S,1))?L:B;
Anders Kaseorg
źródło
1

Haskell (przy użyciu typów numerycznych ograniczonych tylko przez GHC), 75 bajtów

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

(nie testowano na architekturze big-endian, ale wydaje się, że powinna działać!)

Jules
źródło
1

K, 15 bajtów

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

Wyjaśnienie;

    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
źródło
1

Bash, 27 bajtów

iconv -tucs2<<<䉌|head -c1

( U + 424C ) jest zakodowany jako trzy bajty UTF-8:E4 89 8C .

Zakłada się, że iconvużywa funkcji z glibc i że używane są ustawienia regionalne UTF-8.

Proszę wstać
źródło