Escriba un programa o función que genere un L
if ejecutado en una pequeña arquitectura endian o un B
if ejecutado en una gran arquitectura endian. Salida en minúscula l
o b
también es aceptable.
No hay entrada
La puntuación es el código de golf, por lo que gana el código con la menor cantidad de bytes.
Editar: según los comentarios a continuación, aclaro que la entrada debe poder ejecutarse en cualquier arquitectura.
Creo que solo hay una respuesta a la que esto afecta, y esa respuesta ha indicado claramente que este es el caso.
B0 4C C3
lo contrario , cuál esmov al, 'L' / ret
ounsigned char f(){ return 'L'; }
sería una respuesta x86 válida.Respuestas:
Python, 33 bytes
sys.byteorder
es uno'little'
o'big'
(y para aquellos de ustedes que leerán esta oración sin mirar el código,[0]
significa tomar el primer carácter).fuente
L
yB
(o la variante en minúscula), no la palabra completa.sys.byteorder[0]
, es decir, el primer personaje debyteorder
.C, 26 bytes
Asume caracteres de 32 bits
int
y ASCII. Probado en amd64 (little-endian) y mips (big-endian).CCG, 23 bytes
Sugerido por feersum. El valor de las constantes de varios caracteres depende de la implementación, pero parece funcionar en GCC. Probado en las mismas arquitecturas.
fuente
a='B\0\0L';
El\0
s se puede reemplazar con bytes nulos.MATLAB / Octave, 24 bytes
La
computer
función proporciona información sobre, bueno, la computadora en la que se está ejecutando. El tercer resultado es endianness:L
oB
para little-o big-endian respectivamente.Pruébalo en Ideone .
fuente
JavaScript ES6, 50 bytes
No sé quién decidió que era una buena idea para los objetos TypedArray exponer la resistencia nativa del intérprete, pero aquí estamos.
fuente
C,
3635 bytes1 byte gracias a @algmyr y @owacoder.
Créditos aquí .
Sin probar ya que no tengo una máquina big endian.
fuente
main
?1
porque no se proporciona ninguna entrada (y el nombre del programa siempre cuenta como el primer argumento)main(a){putchar("BL"[*(char*)&a]);}
.main(char a){putchar("BL"[a]);}
.Mathematica, 22
Esto probablemente rompe alguna regla sobre no usar una función incorporada, pero no estoy realmente interesado en buscar una alternativa.
fuente
&
para que sea una función. (Pero puede haber desacuerdo sobre lo que constituye un "programa".)C, 27
Un byte más, pero aquí está de todos modos:
fuente
1001100 01000010
(espacio para separar bytes). Ahora, si toma cada byte, vuelva a convertirlo en base 10 y verifique la tabla ASCII, verá que esta secuencia de bytes es equivalente aLB
.htons
hará lo suyo yputchar
solo imprimirá el LSB. En los sistemas big-endian, eso seráB
, en little-endian,htons
habrá volteado los bytes, por lo que el LSB esL
.19522
con'LB'
advertencias del compilador y -1 byte.Código de máquina PowerPC: 20 bytes
PowerPC es bi-endian (la endianness se puede configurar al inicio), por lo que este código debe cumplir con la solicitud de desafío de poder ejecutar tanto en máquinas BE como LE. Esta es una función que devuelve 1
'L'
o'B'
depende de la endianness configurada actualmente.Como función, AFAICT conforma el SVR4 PowerPC ABI (usado por Linux en ppc32), el PowerOpen ABI (usado por ejemplo por AIX) y el OS X ABI. En particular, se basa solo en el hecho de que GPR 0 es un registro de cero volátil, y GPR 3 se utiliza para devolver valores "pequeños".
Ahora, va así:
rlwinm
extractos sólo un poco: se toma el valor en GPR0, r Otates l eft por 1 lugar (de modo que ahora está en la posición 0) y m pide con 1 (la máscara generada por los 31,31 2 ); el resultado se coloca en el registro GP 3;'B'
) (10 es la diferencia entre'L'
y'B'
)Notas
Para aquellos interesados, consulte la documentación de rlwinm ; Sin saber nada sobre PowerPC, este tipo de instrucciones me pareció extremadamente interesante.
Actualización 2018 : Raymond Chen está publicando una serie sobre la arquitectura PowerPC, puede encontrar aquí su gran publicación sobre
rlwinm
& amigos.fuente
Java 8,
96, 6452 bytesUn golf basado en esta respuesta SO . Todo el crédito va a @LeakyNun y @AlanTuning. Java mantiene la racha perdedora.
96 bytes:
64 bytes:
No probado b / c No tengo acceso a una máquina big endian.
fuente
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 bytesFunciona empacando un número en el orden de bytes predeterminado del sistema y comparándolo con un número empaquetado en orden de bytes little endian.
fuente
(G) Adelante, 24 bytes
Asume que las celdas son de 32 bits (y que su intérprete de Forth admite los prefijos base de Gforth ). Simplemente almacena el número 0x4200004C en la memoria y luego muestra el byte en el extremo inferior.
fuente
C, 34 bytes
Esto supone la codificación de caracteres ASCII
Llama sin discusión.
Explicación:
En llamada,
a
será 1.*(char*)a
accede al primer byte dea
, que en plataformas little endian será 1, en plataformas big endian será 0.En plataformas big-endian, este código pasará 66 + 10 * 0 = 66 a
putchar
. 66 es el código ASCII paraB
. En plataformas little endian, pasará 66 + 10 * 1 = 76, que es el código ASCIIL
.fuente
C #,
6052 bytesC # es sorprendentemente competitivo en este caso.
Créditos a Groo para la sintaxis C # 6.
60 bytes:
fuente
char e=>System.BitConverter.IsLittleEndian?'L':'B';
por supuesto, esto (así como la respuesta de Java) en realidad no imprime el valor.Julia,
2419 bytesEsta es una función anónima que no toma entrada y devuelve a
Char
. Para llamarlo, asígnelo a una variable. Se supone que los enteros son de 64 bits.La
ntoh
función convierte la endianidad del valor que se le pasa del orden de bytes de la red (big endian) a la utilizada por la computadora host. En las máquinas Big Endian,ntoh
es la función de identidad ya que no hay conversión que hacer. En pequeñas máquinas endian, los bytes se intercambian, entoncesntoh(5) == 360287970189639680
. Que también es, quizás más legible, igual a:0000010100000000000000000000000000000000000000000000000000000000
en binario.Si desplazamos un poco a la derecha el resultado de
ntoh(5)
55, obtendremos 0 en máquinas endian grandes y 10 en máquinas endian pequeñas. Agregando eso a la constante de caracteres'B'
, obtendremos'B'
o'L'
para máquinas endian grandes o pequeñas, respectivamente.¡Ahorró 5 bytes gracias a FryAmTheEggman y Dennis!
fuente
()->ntoh(5)>>55+'B'
:?f()='L'-ntoh(10)%16
yf()='L'-ntoh(10)&10
debería funcionar en todas las plataformas.PHP 5.6,
4131 bytes (thx a isertusernamehere)<?=unpack(S,"\x01\x00")[1]-1?B:L;
PHP 7, 41 bytes
echo unpack('S',"\x01\x00")[1]-1?'B':'L';
Idea robada de: https://stackoverflow.com/a/24785578/2496717
fuente
<?=unpack(S,"\x01\x00")[1]-1?B:L;
.Lisp común, 27 bytes
Probado en SBCL y ECL. Para un enfoque portátil, uno debe usar funciones triviales .
La
#+
notación es una condición de tiempo de lectura , que lee la siguiente forma solo si la expresión condicional se evalúa como verdadera. Aquí la condición es el#+big-endian
texto completo, lo que significa que la prueba se cumple si la:big-endian
palabra clave pertenece a la*FEATURES*
lista (una lista que contiene, entre otras cosas, información específica de la plataforma). La siguiente expresión es'B
, que se lee o se omite de acuerdo con el resultado de la prueba. Si su plataforma es big-endian y escribe el formulario anterior en el REPL, es exactamente como si hubiera escrito lo siguiente:(NB.
CL-USER>
Es el aviso)El cuerpo de una función es implícito
PROGN
, lo que significa que solo se devuelve la evaluación de la última expresión. Así el símbolo rendimientos superiores realidadB
. Sin embargo, si la condición de tiempo de lectura se evalúa como falsa, el formulario se lee como si usted hubiera escrito:... que simplemente devuelve el símbolo
L
.fuente
ARMv6 y posterior: código de máquina de 20 bytes
No probado, ya que no tengo una máquina adecuada a mano. El bit 9 del CPSR proporciona la capacidad de carga / almacenamiento actual.
fuente
BX lr
es así?) En lugar deputchar
, porquer0
es el registro adecuado para el resultado devuelto.Perl 5, 21 + 1 = 22 bytes
Corre con
perl -E
.Probado en amd64 (little-endian) y mips (big-endian).
fuente
-E
realmente necesaria la bandera en el recuento de bytes? Solo puede decir que usa Perl 5.10 (ya que elsay
comando está disponible en esta versión)use 5.10.0;
hay muchos más bytes!-E
cambio o lause
declaración parasay
.-E
es "gratis" en PPCG. No es necesario agregar nada.-n
y-p
no lo son)R,
2823 bytes.Platform$endian
regresabig
si se ejecuta en big endian y si se ejecutalittle
en pequeño. Aquí, usandosubstr
, devuelve la primera letra de la salida, entoncesb
ol
.Como
endian
es el único objeto que comienza con une
objeto contenido.Platform
, podemos reducirlo gracias a la coincidencia parcial con el siguiente código de 23 bytes:fuente
Clojure,
4644 bytesEsta es una función que utiliza la función Java incorporada para obtener la resistencia de la máquina. Luego obtenga la representación de cadena que será o
"LITTLE_ENDIAN"
o"BIG_ENDIAN"
y tome el primer carácter de la cadena elegida y devuélvala.Guardado 2 bytes gracias a @ cliffroot .
fuente
#(nth(str(java.nio.ByteOrder/nativeOrder))0)
es 2 bytes más cortoRubí,
3130 caracteresHmm, debe ser una mejor manera. Cuente 5 caracteres menos si el carácter no necesita ser emitido, ya que creo que otras soluciones omiten la impresión. es decir, elimine la parte "pone" si no desea imprimir nada.
fuente
?L
y?B
en lugar deputs :L
yputs "B"
puts [76,66].pack("s")[0]
que funcionaráputs [76,66].pack("s>")[0]
. Eso significa que es posible no estar trabajando en Big Endian por alguna razón que no entiendo bien. Pero este parece funcionar (derivado de su solución)puts [19522].pack("s>")[0]
. WDYT? Me pregunto si puedo encontrar un lugar para evaluar en Big Endian.Bash (y otros shells de Unix), 32 (33) bytes
Primer y segundo intento:
Gracias a Dennis, versión más corta:
La
echo
utilidad genera una nueva línea, con valor hexadecimal0A
, y ninguna otra salida. Pues<<<a
lo es61 0A
.La
od
utilidad, por defecto, interpreta la entrada como palabras de dos bytes, rellena con ceros si el número de bytes es impar, y convierte a octal. Esto hace que la salida del eco se interprete como0A 00
, que se convierte en005000
big-endian o000012
en little-endian.61 0A
se convierte005141
en little-endian y060412
en big-endian. La salida completa de OD también incluye la dirección y tamaño de los datos que significa que no podemos utilizar0
,1
o2
para la prueba.El comando está bien definido para exponer la resistencia del sistema. De la norma :
Notas de compatibilidad
No estoy seguro si poner
echo|od
comillas traseras sin comillas dobles alrededor de ellas [lo que da como resultado un argumento de tres palabras paracase
] es compatible con todos los sistemas. No estoy seguro de si todos los sistemas admiten scripts de shell sin nueva línea de terminación. Estoy casi seguro, pero no el 100% del comportamiento de od al agregar el byte de relleno en los sistemas big-endian. Si es necesario,echo a
se puede usar para las versiones portátiles. Todos los scripts funcionan en bash, ksh y zsh, y los portátiles funcionan en el tablero.fuente
[[
od<<<a|grep -q 5&&echo L||echo B
debería funcionar en Bash y otros.echo|od
imprime0000000\n005000\n0000001
como esperabas.od -a
.PHP, 16 bytes
Esto usa dos trucos que no se usan en las dos respuestas PHP existentes:
^
) funciona en cadenas, y el resultado es tan largo como la cadena más corta, evitando la necesidad de una indexación de cadena o un operador ternario.fuente
Nodo, 42 bytes
Pro: hay un incorporado. Con: los nombres de propiedad son muy largos
fuente
PowerShell, 44 bytes
Carácter 66 es
B
, y 10 caracteres más tarde es el número 76,L
. Un valor booleano de "verdadero" se convierte1
cuando se convierte en un número.BitConverter
es una clase estándar de .NET.fuente
Raqueta,
3528 bytes'B
o'L
respectivamente. Avísame si esto no es lo suficientemente específico :)fuente
PHP, 22 bytes
fuente
Haskell (utilizando tipos numéricos de tamaño restringido solo para GHC), 75 bytes
(no probado en una arquitectura big endian, ¡pero parece que debería funcionar!)
fuente
K, 15 bytes
Explicación;
fuente
Bash, 27 bytes
䉌
( U + 424C ) se codifica como tres UTF-8 bytes:E4 89 8C
.Se supone que
iconv
usa la función de glibc y que se usa un entorno local UTF-8.fuente