Ecrivez un programme ou une fonction générant un L
if si exécuté sur une architecture little endian ou un B
si exécuté sur une architecture big endian. La sortie en minuscule l
ou b
est également acceptable.
Il n'y a pas d'entrée.
Scoring est un code de golf, donc le code avec le moins d'octets gagne.
Edit: Selon les commentaires ci-dessous, je précise que l'entrée doit pouvoir être exécutée sur l'une ou l'autre architecture.
Je crois qu’il n’ya qu’une réponse à cela et cette réponse a clairement indiqué que c’était le cas.
B0 4C C3
, qui estmov al, 'L' / ret
ouunsigned char f(){ return 'L'; }
serait une réponse x86 valide.Réponses:
Python, 33 octets
sys.byteorder
est soit'little'
ou'big'
(et pour ceux d’entre vous qui liront cette phrase sans regarder le code, cela[0]
signifie prendre le premier caractère).la source
L
etB
(ou la variante minuscule), pas le mot entier.sys.byteorder[0]
, c'est-à-dire le premier caractère debyteorder
.C, 26 octets
Suppose des caractères 32 bits
int
et ASCII. Testé sur amd64 (little-endian) et mips (big-endian).GCC, 23 octets
Proposé par feersum. La valeur des constantes à plusieurs caractères dépend de la mise en œuvre, mais cela semble fonctionner dans GCC. Testé sur les mêmes architectures.
la source
a='B\0\0L';
le\0
s peut être remplacé par des octets nuls.MATLAB / Octave, 24 octets
La
computer
fonction donne des informations sur l'ordinateur sur lequel il tourne. Le troisième résultat est endianness:L
ouB
pour le petit ou le grand endian respectivement.Essayez-le sur Ideone .
la source
JavaScript ES6, 50 octets
Je ne sais pas qui a décidé que c’était une bonne idée que les objets TypedArray exposent l’ endianité native de l’interprète, mais nous y sommes.
la source
C,
3635 octets1 octet grâce à @algmyr et @owacoder.
Crédits ici .
Non testé car je n'ai pas de machine big-endian.
la source
main
fonction à un argument ?1
car aucune entrée n'est donnée (et le nom du programme compte toujours comme premier argument)main(a){putchar("BL"[*(char*)&a]);}
.main(char a){putchar("BL"[a]);}
.Mathematica, 22
Cela déroge probablement à la règle de ne pas utiliser de fonction intégrée, mais je ne suis pas vraiment intéressé par l'option Rube Goldberging.
la source
&
pour en faire une fonction. (Mais il peut y avoir un désaccord sur ce qui constitue un "programme".)C, 27
Un octet de plus, mais le voici quand même:
la source
1001100 01000010
(espace pour séparer les octets). Maintenant, si vous prenez chaque octet, reconvertissez en base 10 et vérifiez la table ASCII, vous verrez que cette séquence d'octets est équivalente àLB
.htons
fera sa chose , etputchar
imprimera seulement le LSB. Dans les systèmes big-endian, ce seraB
, dans le petit-boutian,htons
les octets retournés, de sorte que le LSB l'estL
.19522
par'LB'
pour les avertissements du compilateur et -1 octet.Code machine PowerPC - 20 octets
PowerPC étant bi-endian (l’endianness peut être configuré au démarrage), ce code doit donc être conforme à la demande de challenge de pouvoir s’exécuter sur des machines BE et LE. Cette fonction renvoie 1
'L'
ou'B'
dépend de l’endianité actuellement définie.En tant que fonction, AFAICT est conforme à l’ABI SVPC PowerPC (utilisé par Linux sur ppc32), à l’ABI PowerOpen (utilisée par exemple par AIX) et à l’ABI OS X. En particulier, il se base simplement sur le fait que GPR 0 est un registre de travail volatil et que GPR 3 est utilisé pour renvoyer des "petites" valeurs.
Maintenant, ça se passe comme ça:
rlwinm
extraits juste un peu: il prend la valeur en GPR0, r Otates l auche par 1 place (donc qui est maintenant en position 0) et m demande avec 1 (le masque généré par ceux 31,31 2 ); le résultat est placé dans le registre GP 3;'B'
) (10 étant la différence entre'L'
et'B'
)Remarques
pour les personnes intéressées, voir la documentation rlwinm ; ne connaissant pratiquement rien de PowerPC, j’ai trouvé ce genre d’instructions extrêmement intéressant.
Mise à jour 2018 : Raymond Chen publie une série sur l'architecture PowerPC. Vous trouverez ici son article sur à propos de
rlwinm
& friends.la source
Java 8,
96, 6452 octetsUn golf basé sur cette réponse SO . Tout le mérite revient à @LeakyNun et à @AlanTuning. Java garde la strie perdante.
96 octets:
64 octets:
Untested b / c Je n'ai pas accès à une machine big-endian.
la source
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 octetsFonctionne en plaçant un nombre dans l'ordre des octets par défaut du système et en le comparant à un nombre emballé dans un ordre d'octets little-endian.
la source
(G) Forth, 24 octets
Suppose que les cellules ont 32 bits (et que votre interprète Forth supporte les préfixes de base de Gforth ). Il stocke simplement le nombre 0x4200004C en mémoire, puis affiche l'octet au bas de la liste.
la source
C, 34 octets
Cela suppose le codage de caractères ASCII
Appel sans argument.
Explication:
Sur appel,
a
sera 1.*(char*)a
accède au premier octet dea
, qui sur les plates-formes little-endian sera 1, sur les plates-formes big-endian sera 0.Sur les plates-formes big-endian, ce code passera donc 66 + 10 * 0 = 66 à
putchar
. 66 est le code ASCII pourB
. Sur les plates-formes little-endian, il passera 66 + 10 * 1 = 76, ce qui correspond au code ASCIIL
.la source
C #,
6052 octetsC # est étonnamment compétitif dans celui-ci.
Crédits à Groo pour la syntaxe C # 6.
60 octets:
la source
char e=>System.BitConverter.IsLittleEndian?'L':'B';
bien sûr, ceci (ainsi que la réponse Java) n’imprime pas réellement la valeur.Julia,
2419 octetsC'est une fonction anonyme qui ne prend aucune entrée et retourne un
Char
. Pour l'appeler, assignez-le à une variable. Il suppose que les entiers sont 64 bits.La
ntoh
fonction convertit l’endianité de la valeur qui lui est transmise de l’ordre des octets du réseau (big endian) en celle utilisée par l’ordinateur hôte. Sur les machines Big Endian,ntoh
c’est la fonction d’identité car il n’ya pas de conversion à faire. Sur les machines little endian, les octets sont permutés, doncntoh(5) == 360287970189639680
. Ce qui est aussi, peut-être plus lisiblement, égal à:0000010100000000000000000000000000000000000000000000000000000000
en binaire.Si nous décalons légèrement le résultat de
ntoh(5)
55, nous aurons 0 sur les machines Big Endian et 10 sur les machines Little Endian. En ajoutant cela à la constante de caractère'B'
, nous aurons'B'
ou'L'
pour les grandes ou les petites machines endianes, respectivement.5 octets sauvés grâce à FryAmTheEggman et Dennis!
la source
()->ntoh(5)>>55+'B'
:?f()='L'-ntoh(10)%16
etf()='L'-ntoh(10)&10
devrait fonctionner sur toutes les plateformes.PHP 5.6,
4131 octets (merci à isertusernamehere)<?=unpack(S,"\x01\x00")[1]-1?B:L;
PHP 7, 41 octets
echo unpack('S',"\x01\x00")[1]-1?'B':'L';
Idée volée à: https://stackoverflow.com/a/24785578/2496717
la source
<?=unpack(S,"\x01\x00")[1]-1?B:L;
.Common Lisp, 27 octets
Testé sur SBCL et ECL. Pour une approche portable, il faut utiliser des fonctionnalités triviales .
La
#+
notation est une condition de lecture , qui lit le formulaire suivant uniquement si l'expression conditionnelle est évaluée à true. Ici, la condition est le#+big-endian
texte entier, ce qui signifie que le test est satisfait si le:big-endian
mot - clé appartient à la*FEATURES*
liste (liste contenant notamment des informations spécifiques à la plate-forme). L'expression suivante est'B
, qui est lue ou ignorée en fonction du résultat du test. Si votre plate-forme est big-endian et que vous écrivez le formulaire ci-dessus dans le REPL, c'est exactement comme si vous aviez écrit ce qui suit:(NB.
CL-USER>
Est l'invite)Le corps d'une fonction est implicite
PROGN
, ce qui signifie que seule l'évaluation de la dernière expression est renvoyée. Ainsi , le symbole de retour ci - dessus en faitB
. Cependant, si la condition de temps de lecture est définie sur false, le formulaire se lit comme si vous aviez écrit:... qui retourne simplement le symbole
L
.la source
ARMv6 et versions ultérieures: code machine 20 octets
Non testé, car je n'ai pas de machine appropriée à portée de main. Le bit 9 du CPSR donne l’endianité actuelle de la charge / du magasin.
la source
BX lr
, est-ce que c'est?) Au lieu deputchar
, parce quer0
c'est le registre approprié pour le résultat retourné.Perl 5, 21 + 1 = 22 octets
Courez avec
perl -E
.Testé sur amd64 (little-endian) et mips (big-endian).
la source
-E
drapeau est-il vraiment nécessaire dans le nombre d'octets? Vous pouvez simplement dire que vous utilisez Perl 5.10 (puisque lasay
commande est disponible dans cette version)use 5.10.0;
y a beaucoup plus d'octets!-E
commutateur ou l'use
instruction poursay
.-E
est "gratuit" sur PPCG. Pas besoin d'ajouter quoi que ce soit.-n
et-p
ne le sont pas)R,
2823 octets.Platform$endian
retournebig
si exécuté sur big endian etlittle
si peu. Ici, en utilisantsubstr
, il retourne la première lettre de la sortie, donc soitb
oul
.Comme
endian
c'est le seul objet commençant par une
objet contenu,.Platform
nous pouvons le réduire grâce à une correspondance partielle avec le code de 23 octets suivant:la source
Clojure,
4644 octetsC’est une fonction qui utilise le langage Java intégré pour obtenir l’endianité de la machine. Ensuite, obtenez la représentation sous forme de chaîne qui sera soit
"LITTLE_ENDIAN"
ou"BIG_ENDIAN"
, prenez le premier caractère de la chaîne choisie et renvoyez-le.2 octets sauvés grâce à @ cliffroot .
la source
#(nth(str(java.nio.ByteOrder/nativeOrder))0)
est 2 octets plus courtRubis,
3130 caractères.Hmm, ça doit être un meilleur moyen. Comptez 5 caractères en moins si le caractère n'a pas besoin d'être imprimé, car je pense que d'autres solutions omettent l'impression. c'est-à-dire supprimer la partie "met" si vous ne voulez rien imprimer.
la source
?L
et?B
à la placeputs :L
etputs "B"
puts [76,66].pack("s")[0]
va marcher.puts [76,66].pack("s>")[0]
. Cela signifie qu'il est possible de ne pas travailler sur le Big Endian pour une raison que je ne comprends pas bien. Mais celui-ci semble fonctionner (dérivé de votre solution)puts [19522].pack("s>")[0]
. WDYT? Je me demande si je peux trouver un endroit pour évaluer le big endian.Bash (et autres shells Unix), 32 (33) octets
Première et deuxième tentative:
Merci à Dennis, version plus courte:
L'
echo
utilitaire génère une nouvelle ligne, avec une valeur hexadécimale0A
et aucune autre sortie. Car<<<a
c'est61 0A
.L'
od
utilitaire, par défaut, interprète l'entrée en mots de deux octets, complétée de zéros si le nombre d'octets est impair, et convertit en octal. Il en résulte que la sortie de l'écho est interprétée comme0A 00
convertie005000
en big-endian ou000012
en little-endian.61 0A
devient005141
en little-endian et060412
en big-endian. La sortie complète de od comprend également l' adresse et des données de taille qui signifie que nous ne pouvons pas utiliser0
,1
ou2
pour le test.La commande est bien définie pour exposer l'endianité du système. De la norme :
Notes de compatibilité
Je ne suis pas certain que la mise
echo|od
en place de guillemets arrières sans guillemets [ce qui donne un argument de trois motscase
] soit prise en charge sur tous les systèmes. Je ne suis pas certain que tous les systèmes prennent en charge les scripts shell sans fin de ligne. Je suis en grande partie certain, mais pas à 100%, du comportement d’od en ajoutant l’octet de remplissage sur les systèmes big-endian. Si nécessaire,echo a
peut être utilisé pour les versions portables. Tous les scripts fonctionnent en bash, ksh et zsh, tandis que les scripts portables fonctionnent en tiret.la source
[[
od<<<a|grep -q 5&&echo L||echo B
devrait fonctionner dans Bash et autres.echo|od
imprimé0000000\n005000\n0000001
comme prévu.od -a
.PHP, 16 octets
Cela utilise deux astuces non utilisées dans les deux réponses PHP existantes:
^
) au niveau des bits fonctionne sur les chaînes et le résultat est uniquement aussi long que la chaîne la plus courte, évitant ainsi le recours à un opérateur d'indexation de chaîne ou ternaire.la source
Noeud, 42 octets
Pro: il y a un construit. Contre: les noms de propriété sont très longs
la source
PowerShell, 44 octets
Caractère 66 est
B
, et est ensuite numéro 10 caractères 76,L
. Une valeur booléenne "true" devient1
lors de la conversion en nombre.BitConverter
est une classe .NET standard.la source
Raquette,
35 à28 octets'B
ou'L
respectivement. Faites-moi savoir si ce n'est pas assez spécifique :)la source
PHP, 22 octets
la source
Haskell (utilisant des types numériques avec une taille limitée de GHC), 75 octets
(pas testé sur une architecture big-endian, mais il semble que cela devrait fonctionner!)
la source
K, 15 octets
Explication;
la source
Bash, 27 octets
䉌
( U + 424C ) est codé sous la forme de trois octets UTF-8:E4 89 8C
.On suppose que
iconv
la fonction de glibc est utilisée et que les paramètres régionaux UTF-8 sont utilisés.la source