Bash (y otros shells de Unix), 32 (33) bytes
Primer y segundo intento:
case `echo|od` in *5*)echo B;;*)echo L;;esac # portable
[[ `echo|od` =~ 5 ]]&&echo B||echo L # non-portable
Gracias a Dennis, versión más corta:
od<<<a|grep -q 5&&echo L||echo B # non-portable
echo|od|grep -q 5&&echo B||echo L # portable
La echo
utilidad genera una nueva línea, con valor hexadecimal 0A
, y ninguna otra salida. Pues <<<a
lo es 61 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 como 0A 00
, que se convierte en 005000
big-endian o 000012
en little-endian. 61 0A
se convierte 005141
en little-endian y 060412
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 utilizar 0
, 1
o 2
para la prueba.
El comando está bien definido para exponer la resistencia del sistema. De la norma :
El orden de bytes utilizado al interpretar los valores numéricos está definido por la implementación, pero debe corresponder al orden en el que se almacena una constante del tipo correspondiente en la memoria del sistema.
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 para case
] 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.