Desafio
Aqui está um simples.
Escreva uma função ou programa quando receber um número na base 10 como entrada, ele retornará ou imprimirá o valor desse número em hexadecimal .
Exemplos
15 -> F
1000 -> 3E8
256 -> 100
Regras
- Nenhuma função hexadecimal incorporada, seja qual for
- As letras podem ser minúsculas ou maiúsculas
- Você só precisa se preocupar com números inteiros não negativos, negativos ou decimais irritantes
- Ele deve funcionar com qualquer número arbitrariamente grande até o limite do tipo padrão do idioma.
- Nova linha não obrigatória
- Como sempre, esse é um código de golfe , e o código mais curto medido em bytes vence!
code-golf
math
base-conversion
hexadecimal
Cara aleatório
fonte
fonte
000003E8
?Respostas:
APL (Dyalog APL) , 17 bytes
Deve ser executado com
⎕IO←0
, que é padrão em muitos sistemas APL.Experimente online!
(⎕D,⎕A)[
…]
D igits concatenados para A lphabet, depois indexados por…16⊥⍣¯1
o inverso de 16-Base-para-Número, ou seja, Número-para-Base-16⊢
aplicado a⎕
entrada numéricafonte
Código da máquina de Turing, 412 bytes
Como sempre, estou usando a sintaxe da tabela de regras definida aqui. Você pode testá-lo nesse site ou, alternativamente, usando esta implementação java.
Faz a contagem regressiva da entrada na base 10 e conta a partir de 0 na base 16. Ao diminuir o zero, apaga o bloco de entrada e termina.
fonte
10*n + 33
instruções para concluir qualquer arbitrárion
. Eu não entendo o código embora.Java,
9289 bytesfonte
Javascript,
4943 bytes.6 bytes salvos pelo usuário81655 .
Teste aqui .
Isso tem dois zeros à esquerda, o que é permitido pelas regras.
Aqui está uma versão sem zeros à esquerda: (47 bytes).
Teste aqui .
Ambos usam exatamente a mesma abordagem que minha resposta em Python .
fonte
i&15
será convertido automaticamente para inteiro, eliminando decimais. Não precisa de~~
h=i=>i&&h(i>>4)+"0123456789abcdef"[i&15]
CJam,
2221 bytesObrigado a @ MartinBüttner por jogar fora um byte!
Experimente online!
Como funciona
fonte
ri{Gmd_9>7*sc+\}h;]W%
Pitão,
33262120 bytesEssa foi engraçada.
Experimente online.
Explicado:
fonte
C (função), 51
A função recursiva recebe um número inteiro de entrada como parâmetro:
Driver de teste:
fonte
Haskell,
5958434139 bytesExemplo de uso:
sequence(s<$s)!!) $ 1000
->"00000000000003E8"
.Isso cria uma lista de todos os números hexadecimais com até 16 dígitos hexadecimais. Felizmente, isso acontece em ordem, para que possamos simplesmente escolher o
n
th.Edit: @Mauris espremido para fora 2 bytes. Obrigado!
fonte
s="0123456789ABCDEF";(sequence(s<$s)!!)
dc, 37
Divmods recursivamente por 16, empurrando o restante para a pilha até que não haja mais nada para dividir. Em seguida, imprima cada elemento da pilha, usando divmod por 10 para obter dígitos AF. Provavelmente mais detalhes amanhã ... (e espero que menos bytes).
fonte
Python,
5958 bytes1 byte salvo pelo CarpetPython
Correr como:
print h(15)
Teste aqui (Ideone.com).
Explicação:
fonte
h=lambda i:(i>15 and h(i/16)or'')+"0123456789abcdef"[i%16]
.h=lambda i:(i>15 and h(i/16)or'')+chr(48+i%16+i%16/10*7)
C (gcc) ,
4544 bytesExperimente online!
fonte
Bash (função), 62
Agradecemos a @manatwork por sugerir o uso de recursão.
fonte
h(){ x=({0..9} {A..F});echo `(($1>15))&&h $[$1/16]`${x[$1%16]}; }
()
vez de em{ ;}
torno do corpo da função economiza ainda mais :)Perl 6 ,
5348 bytesIsso cria uma sequência de valores divididos por Número inteiro (
div
), até que o resultado0
exclua o0
da sequênciaEm seguida, cruza (
X
) essa sequência usando o operador de módulo (%
) com16
Ele usa esses valores como índices em uma lista nivelada que consiste em dois intervalos
0..9
e'A'..'Z'
Finalmente, concatena (
~
) usando oR
operador meta (reverse )Se isso resultar em um valor False (string vazia), retorne
0
Uso:
fonte
MATL , 27 bytes
Isso usa a versão 5.1.0 do idioma / compilador, que é anterior a esse desafio.
Exemplo
Explicação
fonte
, 31 caracteres / 62 bytes
Try it here (Firefox only).
Ok, eu descobri mais algumas coisas que jogavam golfe.
Explicação
É essencialmente a mesma solução que a solução ES6 do @ SuperJedi224 - mas com algo diferente.
Está vendo
⩥ḊĀⒸª⩥⁽ṁṇ⸩⨝
? Essa é uma maneira muito elegante de escrever"0123456789ABCDEF"
.⩥Ḋ
cria um intervalo de 0 a 10,Ⓒª⩥⁽ṁṇ⸩
cria um intervalo de 65 a 71 e o converte em uma sequência de caracteres ASCII, eĀ...⨝
concatena os dois intervalos e os une em uma sequência. Esta foi provavelmente a parte mais legal da minha solução.Versão não competitiva de bônus, 24 caracteres / 45 bytes
Eu decidi adicionar uma string de alfabeto, como em Pyth.
fonte
sed, 341 bytes
Não é a linguagem óbvia para esse desafio, mas tem a vantagem de oferecer suporte a números de entrada de até (dependendo da sua implementação) entre 4000 dígitos e o limite da memória (virtual) disponível do seu sistema. Eu converti o RSA-1024 em hexadecimal em cerca de 0,6 segundos, para que ele se adapte razoavelmente bem.
Ele funciona usando divisão sucessiva por dois, acumulando a cada 4 bits de transporte em um dígito hexadecimal. Usamos caracteres que não são letras para representar nossa saída, para que sempre acumulemos carry entre a entrada decimal e a saída hexadecimal e convertemos em hexadecimal convencional no final.
fonte
PHP,
65 66 64 + 1 6259 bytesfunção de impressão recursiva, imprime um zero inicial (insira
>16
antes&&
para removê-lo)programas, 64 bytes +1 para
-R
(executar como canal com-nR
)requer PHP 5.6 ou posterior (o 5.5 não pode indexar literais de cadeias)
ou
requer PHP 5.6 ou 7.0 (7.1 entende índices de string negativos)
Execute como pipe
-nR
ou experimente-os online .fonte
echo+$s
para a entrada 0+
sinal corta a saída na primeira letra ... então ...?:0
Julia, 55 bytes
Esta é a implementação básica da função recursiva. Ele aceita um número inteiro e retorna uma string.
Se a entrada for menor que 15, divida-a no chão por 16 e recorra, caso contrário, pegue a sequência vazia. Coloque isso na frente do caractere hexadecimal selecionado adequadamente.
fonte
Pyre , 98 bytes
Fazer isso em um idioma sem operadores aritméticos provavelmente foi um erro.
Use assim:
Ungolfed:
fonte
Ruby, 48 caracteres
(Cópia do Loovjo 's resposta Python .)
Exemplo de execução:
fonte
Sério, 35 bytes
Hex Dump:
Experimente Online
Explicação:
Observe que
;7ªD+@9<7*+c
é equivalente a4ª▀E
, o que economizaria 8 bytes, mas pensei que talvez uma função que empurre os dígitos da base b como uma string possa ser considerada muito "um built-in heaxadecimal".fonte
Javascript ES6,
6458 bytesEconomizou 6 bytes graças a ן nɟuɐɯɹɐ ן oɯ e user81655.
fonte
v=>eval('for(z="";v;v=v/16|0)z="0123456789ABCDEF"[v%16]+z')
v=>{for(z="";v>0;v=v/16|0)z=btoa``Ó]·ã»óÐ1``[v%16]+z;return z}
(os dois tildes são únicos) ==> 64 caracteres, 71 bytes. Não vale a pena.v=v/16|0
é apenas uma maneira complexa de escreverv>>=4
.Befunge-93, 58
Na primeira vez em que realizamos um desafio de golfe em Befunge, aposto que há uma linha para isso, que é mais curta, já que todos esses espaços no meio da segunda linha parecem um desperdício.
Você pode passar por aqui . Explicação parcial:
&
: Receber entrada.:88+%
: Pegue o restante do módulo 16."0"+
: Adicione-o ao valor ASCII de 0.:"9"`
: Se o resultado for maior que o valor ASCII de 9 ...7*+
: Adicione 7 para convertê-lo em uma letra.\
: Salve o caractere resultante na pilha.8/2/
: Divida por 16, arredondando para baixo.:!#|_
: Saia do loop se o resultado for 0.#
: Caso contrário, volte ao passo do módulo.>:#,_@
(empacotando): Depois de terminar, imprima a pilha na ordem LIFO.fonte
> <> , 46 + 3 = 49 bytes
Isso teria sido mais curto se> <> tivesse divisão inteira, que agora temos que emular subtraindo o módulo 1. Ainda assim, acho que isso usa algumas dicas bem legais de truques!
Experimente online!
Explicação
Primeiro loop
O primeiro loop executa o algoritmo clássico de conversão para hexadecimal. Faz o módulo 16 (
:f1+%
) e verifica se o resultado é <10 (:a(?
). Caso contrário, precisamos adicionar 7 (7+
) para ir das casas decimais para o alfabeto maiúsculo na tabela ASCII. Senão, podemos prosseguir adicionando o valor ASCII para 0 ("0"+
) e deslocando o caractere a ser enviado para a parte inferior da pilha, porque teremos que enviá-los na ordem inversa. O valor superior é então substituído pelo resultado da divisão inteira por 16. Isso é emulado calculando a / b - (a / b)% 1 (f1+,:1%-
). Quando o loop termina, a pilha contém os caracteres hexadecimais na ordem de saída reversa e um 0.Segundo loop
O segundo loop inverte a lista e verifica se o elemento superior é 0. Se for, sabemos que todos os itens diferentes de zero foram impressos e devemos terminar. Senão, produzimos o caractere e invertemos a lista novamente para preparar a próxima iteração. A
:
entrada do segundo loop duplicará o 0 que não tem efeito.fonte
SpecBAS - 110 bytes
Isso usa um algoritmo que encontrei no WikiHow (segundo método).
As seqüências de caracteres no SpecBAS são baseadas em 1, daí a
+1
escolha do elemento correto.fonte
C (clang) , 83 bytes
Experimente online!
Solução alternativa em C
fonte
Ruby, 40 bytes
Roubado deInspirado pela resposta do manatwork, mas usando uma brecha interessante para torná-lo mais curto.fonte
REXX,
8078 bytesfonte
C, 48 bytes
Isso não é totalmente original, retirei 5 bytes da versão digital Trauma.
fonte
APL (NARS), caracteres 34, bytes 68
teste:
fonte