Escreva um programa ou função que produza um L
if executado em uma pequena arquitetura endian ou um B
if executado em uma arquitetura big endian. Saída em minúsculas l
ou b
também é aceitável.
Não há entrada.
A pontuação é código de golfe, portanto o código com o menor número de bytes vence.
Editar: conforme os comentários abaixo, estou esclarecendo que a entrada deve ser capaz de executar em qualquer arquitetura.
Eu acredito que há apenas uma resposta que isso afeta, e essa resposta indicou claramente que esse é o caso.
B0 4C C3
, qual émov al, 'L' / ret
ouunsigned char f(){ return 'L'; }
seria uma resposta x86 válida.Respostas:
Python, 33 bytes
sys.byteorder
é um'little'
ou ou'big'
(e para aqueles de vocês que lerão esta frase sem olhar o código,[0]
significa assumir o primeiro caractere).fonte
L
eB
(ou a variante minúscula), não a palavra inteira.sys.byteorder[0]
, ou seja, o primeiro caractere debyteorder
.C, 26 bytes
Assume caracteres de 32 bits
int
e ASCII. Testado em amd64 (little-endian) e mips (big-endian).GCC, 23 bytes
Sugerido por feersum. O valor das constantes com vários caracteres depende da implementação, mas isso parece funcionar no GCC. Testado nas mesmas arquiteturas.
fonte
a='B\0\0L';
O\0
s pode ser substituído por bytes nulos.MATLAB / oitava, 24 bytes
A
computer
função fornece informações sobre o computador em que está sendo executado. A terceira saída é endianness:L
ouB
para little ou big-endian, respectivamente.Experimente em Ideone .
fonte
JavaScript ES6, 50 bytes
Não sei quem decidiu que era uma boa ideia os objetos TypedArray exporem o endianness nativo do intérprete, mas aqui estamos.
fonte
C,
3635 bytes1 byte graças a @algmyr e @owacoder.
Créditos aqui .
Não testado, pois não tenho uma máquina big-endian.
fonte
main
função de um argumento ?1
porque nenhuma entrada é dada (e o nome do programa sempre conta como o primeiro argumento)main(a){putchar("BL"[*(char*)&a]);}
.main(char a){putchar("BL"[a]);}
.Mathematica, 22
Isso provavelmente quebra alguma regra sobre o não uso de uma função interna, mas não estou realmente interessado em usar o rube goldberging como alternativa.
fonte
&
para torná-lo uma função. (Mas pode haver desacordo sobre o que constitui um “programa”.)C, 27
Um byte a mais, mas aqui está assim mesmo:
fonte
1001100 01000010
(espaço para separar bytes). Agora, se você pegar cada byte, converter novamente para a base 10 e verificar a tabela ASCII, verá que essa sequência de bytes é equivalente aLB
.htons
fará o queputchar
quiser e imprimirá apenas o LSB. Nos sistemas big-endian, isto éB
, no little-endian,htons
terão invertido os bytes, assim é o LSBL
.19522
com'LB'
para avisos do compilador e byte -1.Código da máquina PowerPC - 20 bytes
O PowerPC é bi-endian (o endianness pode ser configurado na inicialização), portanto, esse código deve estar em conformidade com a solicitação de desafio de poder executar as máquinas BE e LE. Esta é uma função que retorna 1
'L'
ou'B'
depende da endianness atualmente definida.Como função, o AFAICT está em conformidade com o SVR4 PowerPC ABI (usado pelo Linux no ppc32), o PowerOpen ABI (usado, por exemplo, pelo AIX) e o OS X ABI. Em particular, ele se baseia apenas no fato de que o GPR 0 é um registro temporário volátil e o GPR 3 é usado para retornar valores "pequenos".
Agora, é assim:
rlwinm
extractos apenas um pouco: leva o valor em GPR0, r Otates l eft por um lugar (de modo que agora está na posição 0) e m pede-o com um (a máscara geradas por aqueles 31,31 2 ); o resultado é colocado no registro GP 3;'B'
) (10 é a diferença entre'L'
e'B'
)Notas
para os interessados, consulte a documentação do rlwinm ; sabendo quase nada sobre o PowerPC, achei este tipo de instruções extremamente interessante.
Atualização de 2018 : Raymond Chen está publicando uma série sobre a arquitetura PowerPC, você pode encontrar aqui seu ótimo post sobre
rlwinm
& friends.fonte
Java 8,
96, 6452 bytesUm golfe com base nesta resposta SO . Todo o crédito vai para @LeakyNun e @AlanTuning. Java mantém a sequência de perdas.
96 bytes:
64 bytes:
Não testado b / c Não tenho acesso a uma máquina big-endian.
fonte
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 colocando um número na ordem de bytes padrão do sistema e comparando-o com um número compactado na ordem de bytes little-endian.
fonte
(G) Em diante, 24 bytes
Supõe que as células tenham 32 bits (e que o seu quarto intérprete suporta os prefixos base de Gforth ). Ele simplesmente armazena o número 0x4200004C na memória e, em seguida, exibe o byte na extremidade inferior.
fonte
C, 34 bytes
Isso pressupõe a codificação de caracteres ASCII
Ligue sem argumento.
Explicação:
Na chamada,
a
será 1.*(char*)a
acessa o primeiro byte dea
, que nas plataformas little-endian será 1, nas plataformas big-endian será 0.Em plataformas big endian, esse código passará 66 + 10 * 0 = 66 para
putchar
. 66 é o código ASCII paraB
. Em plataformas little-endian, ele passará 66 + 10 * 1 = 76, que é o código ASCII paraL
.fonte
C #,
6052 bytesC # é surpreendentemente competitivo neste.
Créditos ao Groo para a sintaxe C # 6.
60 bytes:
fonte
char e=>System.BitConverter.IsLittleEndian?'L':'B';
claro que isso (assim como a resposta Java) não imprime o valor.Julia,
2419 bytesEsta é uma função anônima que não recebe entrada e retorna a
Char
. Para chamá-lo, atribua-o a uma variável. Ele assume que os números inteiros são de 64 bits.A
ntoh
função converte a endianidade do valor passado a ele da ordem de bytes da rede (big endian) para a usada pelo computador host. Nas máquinas big endian,ntoh
é a função de identidade, pois não há conversão a ser feita. Em pequenas máquinas endian, os bytes são trocados, portantontoh(5) == 360287970189639680
. O que também é, talvez mais legível, igual a:0000010100000000000000000000000000000000000000000000000000000000
em binário.Se mudarmos o resultado de
ntoh(5)
55, obteremos 0 em máquinas endian grandes e 10 em máquinas endian pequenas. Adicionando isso à constante de caractere'B'
, obteremos'B'
ou'L'
para grandes ou pequenas máquinas endian, respectivamente.Economizou 5 bytes graças a FryAmTheEggman e Dennis!
fonte
()->ntoh(5)>>55+'B'
:?f()='L'-ntoh(10)%16
ef()='L'-ntoh(10)&10
deve funcionar em todas as plataformas.PHP 5.6,
4131 bytes (thx para isertusernamehere)<?=unpack(S,"\x01\x00")[1]-1?B:L;
PHP 7, 41 bytes
echo unpack('S',"\x01\x00")[1]-1?'B':'L';
Ideia roubada de: https://stackoverflow.com/a/24785578/2496717
fonte
<?=unpack(S,"\x01\x00")[1]-1?B:L;
.Lisp comum, 27 bytes
Testado em SBCL e ECL. Para uma abordagem portátil, deve-se usar recursos triviais .
A
#+
notação é uma condição de tempo de leitura , que lê o próximo formulário apenas se a expressão condicional for avaliada como verdadeira. Aqui, a condição é o#+big-endian
texto completo , o que significa que o teste será satisfeito se a:big-endian
palavra - chave pertencer à*FEATURES*
lista (uma lista que contém, entre outras coisas, informações específicas da plataforma). A seguinte expressão é'B
, que é lida ou ignorada de acordo com o resultado do teste. Se sua plataforma é big-endian e você escreve o formulário acima no REPL, é exatamente como se você tivesse escrito o seguinte:(NB.
CL-USER>
É o prompt)O corpo de uma função é implícito
PROGN
, significando que somente a avaliação da última expressão é retornada. Assim, o acima realmente retorna símboloB
. Se, no entanto, a condição de tempo de leitura for avaliada como falsa, o formulário será lido como se você tivesse escrito:... que simplesmente retorna o símbolo
L
.fonte
ARMv6 e posterior: código de máquina de 20 bytes
Não testado, pois não tenho uma máquina adequada à mão. O bit 9 do CPSR fornece a capacidade de carga / armazenamento atual.
fonte
BX lr
, é?) Em vez deputchar
, porquer0
é o registro adequado para o resultado retornado.Perl 5, 21 + 1 = 22 bytes
Corra com
perl -E
.Testado em amd64 (little-endian) e mips (big-endian).
fonte
-E
sinalização é realmente necessária na contagem de bytes? Você pode apenas dizer que usa o Perl 5.10 (já que osay
comando está disponível nesta versão)use 5.10.0;
tem muitos mais bytes!-E
opção ou ause
instrução forsay
.-E
é "grátis" no PPCG. Não há necessidade de adicionar nada.-n
e-p
não são)R,
2823 bytes.Platform$endian
retornabig
se executado em big endian elittle
se em pouco. Aqui, usandosubstr
, ele retorna a primeira letra da saída,b
ou seja, oul
.Como
endian
é o único objeto que começa com ume
objeto contido.Platform
, podemos reduzi-lo graças à correspondência parcial com o seguinte código de 23 bytes:fonte
Clojure,
4644 bytesEsta é uma função que usa o Java embutido para obter o endianness da máquina. Em seguida, obtenha a representação da string que será ou
"LITTLE_ENDIAN"
ou"BIG_ENDIAN"
e pegue o primeiro caractere de qualquer string escolhida e retorne-a.Economizou 2 bytes graças a @ cliffroot .
fonte
#(nth(str(java.nio.ByteOrder/nativeOrder))0)
é 2 bytes mais curtoRubi,
3130 caracteres.Hmm, deve ser uma maneira melhor. Conte 5 caracteres a menos se o caractere não precisar ser produzido, pois acho que outras soluções omitem a impressão. ou seja, remova a parte "puts" se você não quiser nada impresso.
fonte
?L
e?B
no lugar deputs :L
eputs "B"
puts [76,66].pack("s")[0]
vai funcionar.puts [76,66].pack("s>")[0]
. Isso significa que é possível não estar trabalhando em big endian por algum motivo que eu não entendo bem. Mas este parece funcionar (derivado da sua solução)puts [19522].pack("s>")[0]
. WDYT? Gostaria de saber se posso encontrar algum lugar para avaliar em big endian.Bash (e outros shells unix), 32 (33) bytes
Primeira e segunda tentativa:
Graças a Dennis, versão mais curta:
O
echo
utilitário gera uma nova linha, com valor hexadecimal0A
, e nenhuma outra saída. Pois<<<a
é61 0A
.O
od
utilitário, por padrão, interpreta a entrada como palavras de dois bytes, preenchida com zero se o número de bytes for ímpar e convertida em octal. Isso resulta na saída do eco interpretado como0A 00
, que é convertido em005000
big-endian ou000012
little-endian.61 0A
torna005141
- se em little-endian e060412
em big-endian. O resultado completo do od também inclui dados de endereço e tamanho o que significa que não pode usar0
,1
ou2
para o teste.O comando está bem definido para expor a persistência do sistema. Do padrão :
Notas de compatibilidade
Não tenho certeza se colocar
echo|od
aspas sem aspas duplas em volta deles [o que resulta em um argumento de três palavras paracase
] é suportado em todos os sistemas. Não tenho certeza se todos os sistemas suportam scripts de shell sem nova linha final. Tenho quase certeza, mas não 100%, do comportamento de od ao adicionar o byte de preenchimento em sistemas big-endian. Se necessário,echo a
pode ser usado para as versões portáteis. Todos os scripts funcionam em bash, ksh e zsh, e os portáteis funcionam em hífen.fonte
[[
od<<<a|grep -q 5&&echo L||echo B
deve funcionar no Bash e em outros.echo|od
imprimi0000000\n005000\n0000001
como você esperava.od -a
.PHP, 16 bytes
Isso usa dois truques não usados nas duas respostas existentes do PHP:
^
) funciona em cadeias de caracteres e o resultado é apenas o da cadeia mais curta, evitando a necessidade de um operador ternário ou de indexação de cadeias.fonte
Nó, 42 bytes
Pro: existe um builtin. Con: nomes de propriedades são muito longos
fonte
PowerShell, 44 bytes
O caractere 66 é
B
e 10 caracteres depois é o número 76L
,. Um valor booleano de "true" se torna1
quando convertido em um número.BitConverter
é uma classe .NET padrão.fonte
Raquete,
3528 bytes'B
ou'L
respectivamente. Deixe-me saber se isso não é específico o suficiente :)fonte
PHP, 22 bytes
fonte
Haskell (usando tipos numéricos com tamanho restrito somente ao GHC), 75 bytes
(não testado em uma arquitetura big-endian, mas parece que deveria funcionar!)
fonte
K, 15 bytes
Explicação;
fonte
Bash, 27 bytes
䉌
( L + 424C ) é codificado como três bytes UTF-8:E4 89 8C
.Supõe-se que
iconv
use a função glibc e que um código de idioma UTF-8 seja usado.fonte