Napisz program lub funkcję, która generuje polecenie L
if działające na małej architekturze endian lub polecenie B
if działające na dużej architekturze endian. Wyjście małych liter l
lub b
jest 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.
B0 4C C3
, która jestmov al, 'L' / ret
lubunsigned char f(){ return 'L'; }
byłaby poprawną odpowiedzią x86.Odpowiedzi:
Python, 33 bajty
sys.byteorder
jest 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).źródło
L
iB
(lub wariant z małymi literami), a nie całe słowo.sys.byteorder[0]
, tj. Pierwszy znakbyteorder
.C, 26 bajtów
Przyjmuje
int
znaki 32-bitowe i ASCII. Testowany na amd64 (little-endian) i mips (big-endian).GCC, 23 bajty
Sugerowane przez feersum. Wartość stałych wieloznakowych zależy od implementacji, ale wydaje się, że działa w GCC. Testowane na tych samych architekturach.
źródło
a='B\0\0L';
że\0
s można zastąpić bajtami zerowymi.MATLAB / Octave, 24 bajty
Ta
computer
funkcja informuje o komputerze, na którym działa. Trzecim wyjściem jest endianness:L
lub odpowiednioB
dla little- lub big-endian.Wypróbuj na Ideone .
źródło
JavaScript ES6, 50 bajtów
Nie wiem, kto zdecydował, że to dobry pomysł na TypedArray sprzeciwia się narazić rodzimych endianness interpretera, ale tutaj jesteśmy.
źródło
C,
3635 bajtów1 bajt dzięki @algmyr i @owacoder.
Kredyty tutaj .
Nie przetestowano, ponieważ nie mam maszyny big-endian.
źródło
main
?1
ponieważ nie podano danych wejściowych (a nazwa programu zawsze liczy się jako pierwszy argument)main(a){putchar("BL"[*(char*)&a]);}
.main(char a){putchar("BL"[a]);}
.Mathematica, 22
Prawdopodobnie łamie to pewną zasadę dotyczącą nieużywania wbudowanej funkcji, ale tak naprawdę nie interesuje mnie alternatywa dla Rube Goldberging.
źródło
&
aby uczynić go funkcją. (Ale może istnieć spór dotyczący tego, co stanowi „program”.)C, 27
Jeden bajt dłużej, ale tutaj i tak:
źródło
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żnaLB
.htons
będzie , co robi , iputchar
będzie drukować tylko LSB. W systemach big-endian, to znaczyB
w little-endianhtons
zmieniłby bajty, tak jak LSBL
.19522
z'LB'
ostrzeżenia kompilator -1 bajt.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.
Teraz wygląda to tak:
rlwinm
Ekstrakty 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;'B'
) (10 to różnica między'L'
i'B'
)Notatki
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
rlwinm
i przyjaciół.źródło
Java 8,
96, 6452 bajtówGolf oparty na tej SO odpowiedzi . Wszystkie zasługi należą do @LeakyNun i @AlanTuning. Java utrzymuje pasmo przegranych.
96 bajtów:
64 bajty:
Untested b / c Nie mam dostępu do maszyny big-endian.
źródło
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 bajtówDział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.
źródło
(G) Dalej, 24 bajty
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.
źródło
C, 34 bajty
Zakłada to kodowanie znaków ASCII
Zadzwoń bez argumentów.
Wyjaśnienie:
Na wezwanie
a
będzie 1.*(char*)a
dostęp do pierwszego bajtua
, 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 dlaB
. Na platformach little-endian przekaże 66 + 10 * 1 = 76, co jest kodem ASCIIL
.źródło
C #,
6052 bajtówC # jest w tym przypadku zaskakująco konkurencyjny.
Podziękowania dla Groo za składnię C # 6.
60 bajtów:
źródło
char e=>System.BitConverter.IsLittleEndian?'L':'B';
oczywiście to (podobnie jak odpowiedź Java) tak naprawdę nie drukuje wartości.Julia,
2419 bajtówJest 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.ntoh
Funkcja 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 Endianntoh
jest funkcja tożsamości, ponieważ nie ma konieczności konwersji. Na małych komputerach Endian bajty są zamieniane, więcntoh(5) == 360287970189639680
. Co jest również, być może bardziej czytelne, równe:0000010100000000000000000000000000000000000000000000000000000000
w 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!
źródło
()->ntoh(5)>>55+'B'
:?f()='L'-ntoh(10)%16
if()='L'-ntoh(10)&10
powinien działać na wszystkich platformach.PHP 5.6,
4131 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
źródło
<?=unpack(S,"\x01\x00")[1]-1?B:L;
.Common Lisp, 27 bajtów
Testowany na SBCL i ECL. W przypadku podejścia przenośnego należy używać funkcji trywialnych .
#+
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-endian
tekst, co oznacza, że test jest spełniony, jeśli:big-endian
sł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ł:(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 symbolB
. Jeśli jednak warunek czasu odczytu ma wartość false, formularz brzmi tak, jakby napisano:... który po prostu zwraca symbol
L
.źródło
ARMv6 i nowsze wersje: 20 bajtów kodu maszynowego
Nie przetestowano, ponieważ nie mam odpowiedniej maszyny do ręki. Bit 9 CPSR podaje aktualną endianiczność ładowania / przechowywania.
źródło
BX lr
prawda?)putchar
, Ponieważr0
jest to odpowiedni rejestr zwracanych wyników.Perl 5, 21 + 1 = 22 bajtów
Uruchom z
perl -E
.Testowany na amd64 (little-endian) i mips (big-endian).
źródło
-E
flaga jest naprawdę niezbędna w liczbie bajtów? Możesz po prostu powiedzieć, że używasz Perla 5.10 (ponieważsay
polecenie jest dostępne w tej wersji)use 5.10.0;
jest o wiele więcej bajtów!-E
przełącznika lubuse
instrukcji dlasay
.-E
jest „darmowy” w PPCG. Nie musisz nic dodawać.-n
i-p
nie są)R,
2823 bajtów.Platform$endian
zwraca,big
jeśli działa na big endian ilittle
jeśli jest mało. Tutaj, używającsubstr
, zwraca pierwszą literę wyniku, więc albob
albol
.Jest
endian
to jedyny obiekt zaczynający się ode
zawartego w obiekcie,.Platform
możemy go zmniejszyć dzięki częściowemu dopasowaniu do następującego 23-bajtowego kodu:źródło
Clojure,
4644 bajtówJest 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 .
źródło
#(nth(str(java.nio.ByteOrder/nativeOrder))0)
jest 2 bajty krótszyRubin,
3130 znaków.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ć.
źródło
?L
i?B
zamiastputs :L
iputs "B"
puts [76,66].pack("s")[0]
zadział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.Bash (i inne powłoki uniksowe), 32 (33) bajty
Pierwsza i druga próba:
Dzięki Dennisowi, krótsza wersja:
echo
Narzędzie wysyła do nowej linii, o wartości sześciokątnym0A
, a nie innym wyjściu. Bo<<<a
tak jest61 0A
.od
Narzę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 jako0A 00
, które jest konwertowane na005000
postać big-endian lub000012
little-endian.61 0A
staje się005141
w little-endian i060412
big-endian. Pełne wyjście OD także adres i rozmiar danych co oznacza, że nie można używać0
,1
lub2
do testu.Polecenie jest dobrze zdefiniowane, aby ujawnić endianizm systemu. Od standardu :
Uwagi dotyczące zgodności
Nie jestem pewien, czy wstawianie
echo|od
cudzysłowów bez podwójnych cudzysłowów wokół nich [co skutkuje trzema słowami docase
] 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 potrzebyecho a
moż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.źródło
[[
od<<<a|grep -q 5&&echo L||echo B
powinna działać w Bash i innych.echo|od
drukuje0000000\n005000\n0000001
zgodnie z oczekiwaniami.od -a
.PHP, 16 bajtów
Wykorzystuje dwie sztuczki, które nie są używane w dwóch istniejących odpowiedziach PHP:
^
) 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.źródło
Węzeł, 42 bajty
Pro: jest wbudowany. Przeciw: nazwy właściwości są bardzo długie
źródło
PowerShell, 44 bajty
Charakter 66
B
, a później 10 znaków jest liczba 76L
. Wartość logiczna „prawda” staje się1
rzutowana na liczbę.BitConverter
jest standardową klasą .NET.źródło
Rakieta,
3528 bajtów'B
lub'L
odpowiednio. Daj mi znać, jeśli nie jest to wystarczająco szczegółowe :)źródło
PHP, 22 bajty
źródło
Haskell (przy użyciu typów numerycznych ograniczonych tylko przez GHC), 75 bajtów
(nie testowano na architekturze big-endian, ale wydaje się, że powinna działać!)
źródło
K, 15 bajtów
Wyjaśnienie;
źródło
Bash, 27 bajtów
䉌
( U + 424C ) jest zakodowany jako trzy bajty UTF-8:E4 89 8C
.Zakłada się, że
iconv
używa funkcji z glibc i że używane są ustawienia regionalne UTF-8.źródło