Schreiben Sie ein Programm oder eine Funktion, die eine L
if-Ausführung auf einer Little-Endian-Architektur oder eine B
if-Ausführung auf einer Big-Endian-Architektur ausgibt . Die Ausgabe in Kleinbuchstaben l
oder b
ist ebenfalls akzeptabel.
Es erfolgt keine Eingabe.
Das Scoring ist Codegolf, also gewinnt der Code mit den wenigsten Bytes.
Bearbeiten: Gemäß den Kommentaren unten stelle ich klar, dass der Eintrag auf beiden Architekturen ausgeführt werden kann.
Ich glaube, dass es nur eine Antwort gibt, die davon betroffen ist, und diese Antwort hat deutlich gezeigt, dass dies der Fall ist.
B0 4C C3
dasmov al, 'L' / ret
oderunsigned char f(){ return 'L'; }
eine gültige x86-Antwort.Antworten:
Python, 33 Bytes
sys.byteorder
ist entweder'little'
oder'big'
(und für diejenigen unter Ihnen, die diesen Satz lesen, ohne auf den Code zu achten,[0]
bedeutet das, das erste Zeichen zu nehmen).quelle
L
undB
(oder die Kleinbuchstabenvariante) nicht das gesamte Wort sein muss.sys.byteorder[0]
, dh der erste Char vonbyteorder
.C 26 Bytes
Nimmt 32-Bit-
int
und ASCII-Zeichen an. Getestet auf amd64 (Little-Endian) und mips (Big-Endian).GCC, 23 Bytes
Vorgeschlagen von feersum. Der Wert von Konstanten mit mehreren Zeichen ist implementierungsabhängig, dies scheint jedoch in GCC zu funktionieren. Auf den gleichen Architekturen getestet.
quelle
a='B\0\0L';
Das\0
s kann durch null Bytes ersetzt werden.MATLAB / Octave, 24 Bytes
Die
computer
Funktion gibt Auskunft über den Computer, auf dem sie läuft. Die dritte Ausgabe ist Endianness:L
oderB
für Little- bzw. Big-Endian.Probieren Sie es auf Ideone .
quelle
JavaScript ES6, 50 Byte
Ich weiß nicht, wer entschieden hat, dass es für TypedArray- Objekte eine gute Idee ist , die native Endianness des Interpreters aufzudecken, aber hier sind wir.
quelle
C,
3635 Bytes1 Byte danke an @algmyr und @owacoder.
Credits hier .
Ungetestet, da ich keine Big-Endian-Maschine habe.
quelle
main
Funktion mit einem Argument zu ?1
weil keine Eingabe erfolgt (und der Programmname gilt immer als erstes Argument)main(a){putchar("BL"[*(char*)&a]);}
.main(char a){putchar("BL"[a]);}
.Mathematica, 22
Dies verstößt wahrscheinlich gegen eine Regel, die besagt, dass keine eingebaute Funktion verwendet wird, aber ich bin nicht wirklich daran interessiert, eine Alternative für das Rube Goldberging zu finden.
quelle
&
, um es zu einer Funktion zu machen. (Es kann jedoch zu Meinungsverschiedenheiten kommen, was ein „Programm“ ausmacht.)C 27
Ein Byte länger, aber hier ist es trotzdem:
quelle
1001100 01000010
(Leerzeichen, um Bytes zu trennen). Wenn Sie nun jedes Byte nehmen, zurück zur Basis 10 konvertieren und die ASCII-Tabelle überprüfen, werden Sie sehen, dass diese Byte-Sequenz äquivalent zu istLB
.htons
wird nicht sein Ding , undputchar
wird das LSB nur drucken. In Big-Endian-Systemen hat dasB
in Little-Endianhtons
die Bytes gekippt, so wie es das LSB istL
.19522
durch'LB'
für Compiler-Warnungen und -1 Byte.PowerPC-Maschinencode - 20 Byte
PowerPC ist Bi-Endian (die Endian-Funktion kann beim Start eingerichtet werden), daher sollte dieser Code der Anforderung entsprechen, sowohl auf BE- als auch auf LE-Computern ausgeführt werden zu können. Dies ist eine Funktion, die 1 zurückgibt
'L'
oder'B'
von der aktuell eingestellten Endianzahl abhängt.Als Funktion entspricht AFAICT dem SVR4 PowerPC ABI (von Linux auf ppc32 verwendet), dem PowerOpen ABI (von AIX verwendet) und dem OS X ABI. Insbesondere beruht es nur auf der Tatsache, dass GPR 0 ein flüchtiges Scratch-Register ist und GPR 3 verwendet wird, um "kleine" Werte zurückzugeben.
Nun geht es so:
rlwinm
Extrakte nur das Bit: es den Wert in GPR0 nimmt, r Otates l inks um 1 Stelle (so dass nun in der Position 0) und m fragt es mit 1 (der Maske durch jene 31,31 erzeugten 2 ); das Ergebnis wird in das GP-Register 3 eingetragen;'B'
) (10 ist die Differenz zwischen'L'
und'B'
)Anmerkungen
für interessierte siehe die rlwinm- dokumentation; Da ich so gut wie nichts über PowerPC wusste, fand ich diese Art von Anweisungen äußerst interessant.
Update 2018 : Raymond Chen veröffentlicht eine Reihe über die PowerPC-Architektur. Sie finden hier seinen großartigen Beitrag über
rlwinm
& friends.quelle
Java 8,
96, 64,52 BytesEin Golf basierend auf dieser SO Antwort . Das gesamte Guthaben geht an @LeakyNun und @AlanTuning. Java behält die Pechsträhne.
96 Bytes:
64 Bytes:
Ungetestetes B / C Ich habe keinen Zugriff auf eine Big-Endian-Maschine.
quelle
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 BytesPackt eine Zahl in der Standard-Bytereihenfolge des Systems und vergleicht sie mit einer Zahl in Little-Endian-Bytereihenfolge.
quelle
(G) Viertens 24 Bytes
Geht davon aus, dass die Zellen 32 Bits sind (und dass Ihr Forth - Interpreter unterstützt gforth der Basis Präfixe ). Es speichert einfach die Nummer 0x4200004C im Speicher und zeigt dann das Byte am unteren Ende an.
quelle
C 34 Bytes
Dies setzt eine ASCII-Zeichencodierung voraus
Rufen Sie ohne Argument an.
Erläuterung:
Auf Abruf
a
wird 1.*(char*)a
auf das erste Byte von zugegriffena
, auf Little-Endian-Plattformen 1, auf Big-Endian-Plattformen 0.Auf Big-Endian-Plattformen wird dieser Code daher 66 + 10 * 0 = 66 an übergeben
putchar
. 66 ist der ASCII-Code fürB
. Auf Little-Endian-Plattformen wird 66 + 10 * 1 = 76 übergeben. Dies ist der ASCII-Code fürL
.quelle
C #,
6052 BytesC # ist in dieser Hinsicht überraschend wettbewerbsfähig.
Dank an Groo für die C # 6-Syntax.
60 Bytes:
quelle
char e=>System.BitConverter.IsLittleEndian?'L':'B';
Natürlich wird der Wert durch diese (sowie die Java-Antwort) nicht gedruckt.Julia,
2419 BytesDies ist eine anonyme Funktion, die keine Eingabe annimmt und a zurückgibt
Char
. Um es aufzurufen, weisen Sie es einer Variablen zu. Es wird davon ausgegangen, dass Ganzzahlen 64-Bit sind.Die
ntoh
Funktion konvertiert die Endianzahl des an sie übergebenen Werts von der Netzwerk-Byte-Reihenfolge (Big Endian) in die vom Host-Computer verwendete. Auf Big-Endian-Rechnernntoh
ist die Identitätsfunktion, da keine Konvertierung durchgeführt werden muss. Auf Little-Endian-Rechnern werden die Bytes also getauschtntoh(5) == 360287970189639680
. Was vielleicht auch lesbarer ist gleich:0000010100000000000000000000000000000000000000000000000000000000
in binär.Wenn wir das Ergebnis
ntoh(5)
um 55 nach rechts verschieben , erhalten wir 0 auf Big-Endian-Maschinen und 10 auf Little-Endian-Maschinen. Wenn'B'
wir das zur Zeichenkonstante hinzufügen , erhalten wir'B'
bzw.'L'
für Big- oder Little-Endian-Maschinen.5 Bytes gespart dank FryAmTheEggman und Dennis!
quelle
()->ntoh(5)>>55+'B'
:?f()='L'-ntoh(10)%16
undf()='L'-ntoh(10)&10
sollte auf allen Plattformen funktionieren.PHP 5.6,
4131 Bytes (Danke an isertusernamehere)<?=unpack(S,"\x01\x00")[1]-1?B:L;
PHP 7, 41 Bytes
echo unpack('S',"\x01\x00")[1]-1?'B':'L';
Die Idee wurde gestohlen von: https://stackoverflow.com/a/24785578/2496717
quelle
<?=unpack(S,"\x01\x00")[1]-1?B:L;
.Common Lisp, 27 Bytes
Getestet auf SBCL und ECL. Für einen portablen Ansatz sollte man Trivial-Features verwenden .
Die
#+
Notation ist eine Lesezeitbedingung , die das nächste Formular nur dann liest, wenn der bedingte Ausdruck als wahr ausgewertet wird. Hier ist die Bedingung der gesamte#+big-endian
Text, was bedeutet, dass der Test erfüllt ist, wenn das:big-endian
Schlüsselwort zur*FEATURES*
Liste gehört (eine Liste, die unter anderem plattformspezifische Informationen enthält). Der folgende Ausdruck wird'B
je nach Testergebnis entweder gelesen oder übersprungen. Wenn Ihre Plattform Big-Endian ist und Sie das obige Formular in die REPL schreiben, ist es genau so, als hätten Sie Folgendes geschrieben:(Anm.
CL-USER>
Ist die Eingabeaufforderung)Der Körper einer Funktion ist implizit
PROGN
, was bedeutet, dass nur die Auswertung des letzten Ausdrucks zurückgegeben wird. Also die oben gibt tatsächlich SymbolB
. Wenn die Lesezeitbedingung jedoch false ergibt, lautet das Formular so, als ob Sie Folgendes geschrieben hätten:... was einfach das Symbol zurückgibt
L
.quelle
ARMv6 und höher: 20 Byte Maschinencode
Ungetestet, da ich keine passende Maschine zur Hand habe. Bit 9 des CPSR gibt die aktuelle Lade- / Speicherendzeit an.
quelle
BX lr
oder?)putchar
, Da diesr0
das richtige Register für das zurückgegebene Ergebnis ist.Perl 5, 21 + 1 = 22 Bytes
Laufen Sie mit
perl -E
.Getestet auf amd64 (Little-Endian) und mips (Big-Endian).
quelle
-E
Flag für die Byteanzahl wirklich erforderlich? Sie können einfach sagen, dass Sie Perl 5.10 verwenden (da dersay
Befehl in dieser Version verfügbar ist)use 5.10.0;
viel mehr Bytes!-E
Schalter oder dieuse
Anweisung fürsay
.-E
ist bei PPCG "kostenlos". Sie müssen nichts hinzufügen.-n
und-p
nicht)R
2823 Bytes.Platform$endian
Gibt zurück,big
wenn es auf Big Endian undlittle
auf Little ausgeführt wird. Hier wird mitsubstr
entwederb
oder der erste Buchstabe der Ausgabe zurückgegebenl
.Da
endian
es das einzige Objekt ist, das mit eineme
in object enthaltenen Objekt beginnt,.Platform
können wir es durch teilweise Übereinstimmung mit dem folgenden 23-Byte-Code reduzieren:quelle
Clojure,
4644 BytesDies ist eine Funktion, die das Java-Builtin verwendet, um die Endianness der Maschine zu ermitteln. Holen Sie sich dann die String-Darstellung davon, die entweder
"LITTLE_ENDIAN"
oder ist,"BIG_ENDIAN"
und nehmen Sie das erste Zeichen des gewählten Strings und geben Sie das zurück.2 Bytes gespart dank @ cliffroot gespart .
quelle
#(nth(str(java.nio.ByteOrder/nativeOrder))0)
ist 2 Bytes kürzerRubin,
3130 Zeichen.Hmm, muss ein besserer Weg sein. Zählen Sie 5 Zeichen weniger, wenn das Zeichen nicht ausgegeben werden muss, da meines Erachtens andere Lösungen das Drucken unterlassen. dh entfernen Sie den Teil "Puts", wenn Sie nicht möchten, dass etwas gedruckt wird.
quelle
?L
und?B
anstelle von verwendenputs :L
undputs "B"
puts [76,66].pack("s")[0]
wird funktionieren.puts [76,66].pack("s>")[0]
. Das bedeutet, dass es aus irgendeinem Grund, den ich nicht gut verstehe, möglich ist, nicht an Big Endian zu arbeiten. Aber dieser scheint zu funktionieren (abgeleitet von Ihrer Lösung)puts [19522].pack("s>")[0]
. WDYT? Ich frage mich, ob ich einen Ort finden kann, an dem ich Big Endian bewerten kann.Bash (und andere Unix-Shells), 32 (33) Bytes
Erster und zweiter Versuch:
Dank Dennis, kürzere Version:
Das
echo
Dienstprogramm gibt eine Newline mit Hex-Wert0A
und keine andere Ausgabe aus. Für<<<a
es ist61 0A
.Das
od
Dienstprogramm interpretiert die Eingabe standardmäßig als Zwei-Byte-Wörter, die bei ungerader Byteanzahl mit Nullen aufgefüllt und in Oktal umgewandelt werden. Dies führt dazu, dass die Ausgabe des Echos als interpretiert wird0A 00
, das in einen005000
Big-Endian oder einen000012
Little-Endian konvertiert wird .61 0A
wird005141
in Little-Endian und060412
in Big-Endian. Die vollständige Ausgabe von od enthält auch Adress- und Größendaten, die wir nicht verwenden0
können1
, oder2
für den Test.Der Befehl ist genau definiert, um die Endianität des Systems aufzudecken. Aus dem Standard :
Kompatibilitätshinweise
Ich bin mir nicht sicher, ob ich
echo|od
Anführungszeichen ohne Anführungszeichen einfügen sollcase
] auf allen Systemen unterstützt wird. Ich bin nicht sicher, ob alle Systeme Shell-Skripte ohne Zeilenumbruch unterstützen. Ich bin mir größtenteils sicher, aber nicht 100% des Verhaltens von od beim Hinzufügen des Füllbytes auf Big-Endian-Systemen. Bei Bedarfecho a
kann für die tragbaren Versionen verwendet werden. Alle Skripte funktionieren in bash, ksh und zsh, und die portablen Skripte funktionieren in dash.quelle
[[
od<<<a|grep -q 5&&echo L||echo B
sollte in Bash und anderen funktionieren.echo|od
gedruckt0000000\n005000\n0000001
.od -a
.PHP, 16 Bytes
Dabei werden zwei Tricks verwendet, die in den beiden vorhandenen PHP-Antworten nicht verwendet werden:
^
) arbeitet mit Zeichenfolgen, und das Ergebnis ist nur so lang wie die kürzere Zeichenfolge, sodass weder eine Zeichenfolgenindizierung noch ein ternärer Operator erforderlich sind.quelle
Knoten, 42 Bytes
Pro: Es gibt eine eingebaute. Con: Eigenschaftsnamen sind sehr lang
quelle
PowerShell, 44 Byte
Character 66 ist
B
, und 10 Zeichen später ist die Nummer 76,L
. Ein Boolescher Wert von "true" wird,1
wenn er in eine Zahl umgewandelt wird.BitConverter
ist eine Standard .NET Klasse.quelle
Schläger,
3528 Bytes'B
oder'L
sind. Lassen Sie mich wissen, wenn dies nicht spezifisch genug ist :)quelle
PHP, 22 Bytes
quelle
Haskell (bei Verwendung von numerischen GHC-Typen mit Größenbeschränkung), 75 Byte
(Nicht auf einer Big-Endian-Architektur getestet, aber es scheint, als sollte es funktionieren!)
quelle
K, 15 Bytes
Erläuterung;
quelle
Bash, 27 Bytes
䉌
( U + 424C ) ist in drei UTF-8-Bytes codiert:E4 89 8C
.Es wird angenommen, dass
iconv
die Funktion von glibc verwendet wird und dass ein UTF-8-Gebietsschema verwendet wird.quelle