Como converter HEX2 para RGBA?

11

O mundo da arte é cheio de cores, mas o mundo da rede é ainda mais cheio do que o mundo da arte de cores diferentes e suas representações. É por isso que precisamos saber como converter um tipo de formato de cor para outro.

O desafio é evidente:

Escreva um programa / função que converta um determinado código HEX ( #00ff0080, por exemplo) em RGBA (como rgba(0, 255, 0, 0.5)).

Regras:

  • Bibliotecas externas / built-ins para converter HEX em RGBA não são permitidas. No entanto, substitutos jQuery e sintaxe são aceitáveis.
  • Aplicam-se as regras de entrada / saída padrão.
  • O formato do alfa pode estar entre (1 == 100%) ou outro (100 == 100%) que não é realmente importante.
  • A saída é flexível , desde que retorne os 4 valores convertidos (como String, Array, List, sua escolha).
  • Você pode optar por receber a entrada sem a #no início. Portanto, você pode receber entradas como #RRGGBBAAou RRGGBBAA. Você pode assumir que o código hexadecimal (excluindo o #) sempre terá 8 caracteres.
  • Você deve dividir todos os valores por 255, incluindo o alfa. A precisão decimal mínima (para o alfa será de 2 casas decimais).

Casos de teste

Input:  00ff0080
Output: 0, 255, 0, 0.5

Pontuação

, vence o código com a menor quantidade de bytes.

Obsdarek
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Dennis
1
Somos obrigados a usar o "código hexadecimal" como uma string ? Você diz que podemos aceitá-lo sem a liderança #; nesse caso, seria apenas um valor inteiro de 32 bits. É legal tomá-lo assim?
Cody Grey

Respostas:

4

JavaScript (ES6), 73 54 50 bytes

(Salvou alguns bytes graças a @LeakyNun, o desafio editado e a @CraigAyre.)

s=>s.match(/../g).map((c,i)=>('0x'+c)/(i-3?1:255))

let f=

s=>s.match(/../g).map((c,i)=>('0x'+c)/(i-3?1:255))

console.log(f('00ff0080'));

Rick Hitchcock
fonte
Rick, parece que agora temos as especificações finais para isso, para que você possa atualizar sua resposta.
Shaggy
Além do comentário de @ Shaggy, você pode salvar alguns bytes usando, em evalvez de parseInt:s=>s.match(/../g).map((x,i)=>eval('0x'+x)/(i-3?1:255))
Craig Ayre
@CraigAyre, evalé uma ótima alternativa parseIntpara fins de golfe, obrigado!
Rick Hitchcock
@ RickHitchcock, não se preocupe! Você também pode raspar alguns bytes do regex usando /../g. Você pode reduzi-lo ainda mais usando replaceover match/ /map
Craig Ayre
Ah, eu vejo que as regras mudaram, então o sinal de libra inicial não é mais necessário.
Rick Hitchcock
3

Japonês , 13 bytes

Recebe a entrada como uma string, sem a liderança #. Emite o valor rgba como uma matriz.

ò ®nG
pUo /#ÿ

Teste-o


Explicação

Nós assumimos implicitamente a string como entrada via variável U.
"00ff0080"

ò

Divida a sequência em uma matriz de elementos de comprimento 2.
["00","ff","00","80"]

®nG

Mapeie a matriz e converta cada elemento de uma cadeia 16 básica em um número decimal. Por causa da seguinte nova linha, essa matriz é atribuída implicitamente à variável U.
[0,255,0,128]

Uo

Pop o último elemento da matriz.
128

/#ÿ

Divida por 255.
0.5019607843137255

p

Empurre o resultado de volta para a Usaída final implicitamente.
[0,255,0,0.5019607843137255]

Shaggy
fonte
2

PHP , 63 bytes

Saída como matriz

$h=array_map(hexdec,str_split($argn,2));$h[3]/=255;print_r($h);

Experimente online!

PHP , 80 bytes

Saída como valor rgba, Entrada sem #

$h=array_map(hexdec,str_split($argn,2));$h[3]/=255;echo"rgba(",join(",",$h),")";

Experimente online!

PHP , 88 bytes

Saída como valor rgba, Entrada com #

for(;$i<7;)$h[]=hexdec($argn[++$i].$argn[++$i]);$h[3]/=255;echo"rgba(",join(",",$h),")";

Experimente online!

Jörg Hülsermann
fonte
2

C (gcc) , 139 bytes

C(x){x=x>57?x-87:x-48;}
#define Z C(h[i])*16+C(h[++i]))
i;f(char*h){printf("rgba(");for(i=0;i<6;i++)printf("%i, ",Z;printf("%g)",(Z/256.);}

Experimente online!

Minha outra tentativa chegou a 145 bytes . Eu não sou um jogador de golfe C, então isso provavelmente poderia ser mais curto.

Conor O'Brien
fonte
2

05AB1E , 9 bytes

2ôH`255/)

Experimente online!

Pelo menos, temos adeptos como Emigna que costumam usar o bom senso ... (é o que você ganha no golfe o dia todo e começa a produzir coisas como 2ô16öRć255/¸ìRಠ_ಠ)

Erik, o Outgolfer
fonte
5 bytes mais curtos:2ôH`žz/)
Emigna 29/06
@Emigna O desafio foi encerrado, no entanto ...
Erik the Outgolfer
1

Geléia , 15 14 bytes

Øhi$€’s2ḅ⁴÷4¦⁹

Experimente online!

Como funciona

Øhi$€’s2ḅ⁴÷4¦⁹ - main link, takes input without # and all lowercase
   $€             - to each input character:
  i               - return its 1-based index in
Øh                - the string "0123456789abcdef"
     ’            - decrement (otherwise 0 is mapped to 1 and f to 16)
      s2          - split the characters into groups of two
        ḅ⁴        - convert from base 16 to decimal
           4¦     - on the fourth element:
          ÷       - divide by
             ⁹    - 256

-1 byte graças a @EricTheOutgolfer

fireflame241
fonte
1

PHP, 72 bytes

A versão de saída do array da Jörg é imbatível; mas há outras opções:

<?=($a=hexdec($argn))>>24,",",255&$a>>16,",",255&$a>>8,",",(255&$a)>256;

Corra como cano com -F. #não importa, saída csv simples

ou 73 bytes (executados com -R):

for($a=hexdec($argn);$i++<4;)echo(255&$a>>32-8*$i)/($i<4?:256),","[$i>3];

74 bytes com os espaços:

<?=($a=hexdec($argn))>>24,$c=", ",255&$a>>16,$c,255&$a>>8,$c,(255&$a)>256;

não é tão simples, 81 bytes :

rgba(<?=($a=hexdec($argn))>>24,$c=", ",255&$a>>16,$c,255&$a>>8,$c,(255&$a)/256?>)
Titus
fonte
1

Excel, 99 bytes

=HEX2DEC(LEFT(A1,2))&","&HEX2DEC(MID(A1,3,2))&","&HEX2DEC(MID(A1,5,2))&","&HEX2DEC(RIGHT(A1,2))/256
Wernisch
fonte
1

SmileBASIC, 50 bytes

INPUT H$RGBREAD VAL("&H"+H$)OUT R,G,B,A?R,G,B,A/#L

A cadeia hexadecimal é convertida em um número usando VAL () e o RGBREAD extrai cada byte. #L é uma constante com o valor 256.

O RGBREAD foi projetado para extrair os canais de uma cor ARGB, mas na verdade ele apenas divide um número inteiro de 4 bytes em 4 bytes separados, para que a ordem não seja importante.

12Me21
fonte
Eu sempre gosto de ver básicas respostas, mas temo que esta resposta pode ser inválido, uma vez que utiliza um construído em para converter hexadecimal para rgba
Taylor Scott
Eu acho que não conta como um hex-> rgba embutido porque requer uma etapa extra para converter a string hexadecimal em um número inteiro.
precisa saber é
Na verdade, olhando novamente, acho que você está certo, a conversão explícita de hex para int tornaria válida.
Taylor Scott
0

JS ES2015, 84 bytes

$=>{a=[1,3,5,7].map(b=>eval("0x"+$.substr(b,2)));a[3]=(a[3]/256);return a.join(",")}

isso é uma função. Execute-o usando

( CODE )("#00ff0080")
Евгений Новиков
fonte
0

q / kdb +, 43 bytes

Solução:

{(16 sv'(.Q.n,6#.Q.a)?/:2 cut x)%1 1 1 256}

Exemplo:

q){(16 sv'(.Q.n,6#.Q.a)?/:2 cut x)%1 1 1 256}"00ff0080"
0 255 0 0.5

Explicação:

{                                         } / anonymous lambda function
                        2 cut x             / split input into 2-char length lists
                     ?/:                    / returns index where (each-right) item is found in 'the list'
        (           )                       / 'the list'
              6#.Q.a                        / Q.a is lowercase alphabet, 6# takes first 6 chars
         .Q.n,                              / Q.n is "012..89", so prepend this onto the "abcdef"                         
  16 sv'                                    / converts each index from base 16 to base 10
 (                            )%1 1 1 256   / divide this output by 1,1,1,256 to get alpha in 0..1 range 
rua
fonte
0

APL (Dyalog) , 24 bytes

Requer ⎕IO←0qual é o padrão em muitos sistemas. Solicita entrada como maiúscula sem #.

256÷⍨@316⊥⍉4 2⍴⍞⍳⍨⎕D,⎕A

Experimente online!

⎕D,⎕AD igits seguido de A lphabet

⍞⍳⍨ prompt para entrada de texto (mnemônico: consola com citações) e encontrar a ɩ NDEX de cada carta em que

4 2⍴r eshape como matriz de quatro linhas e duas colunas

 transpor (porque a conversão base funciona em colunas)

16⊥ avaliar como base dezesseis

 rendimento (serve para separar 3 e 16)

256÷⍨@3 dividir a 4 th elemento por 256

Adão
fonte
0

Python 2 , 54 bytes

lambda h:[int(h[i-2:i],16)/2.**(8&i)for i in(2,4,6,8)]

Experimente online!

TFeld
fonte
0

Yabasic , 96 bytes

Mais uma resposta ; Leva a entrada como sequência e sai para o console.

Input""a$
For i=1To 7Step 2
?Dec(Mid$(a$,i,2))/(j+1);
If i=5Then j=255Fi
If i<7Then?", ";Fi
Next

Experimente online!

Taylor Scott
fonte
Você pode salvar um byte removendo a quebra de linha antes ?.
12Me21
0

Excel VBA, 90 bytes

Uma função de janela imediata anônima do VBE que recebe entrada do intervalo [A1]e sai para a janela imediata do VBE.

For i=1To 7Step 2:[B1]=i:?[Hex2Dec(Mid(A1,B1,2))]/IIf(i=7,256,1)&""+IIf(i<7,", ","");:Next
Taylor Scott
fonte
0

Vim, 46 bytes

:s/../$((16#&)) /g␊iecho ␛$hhi*100/255␛:w !sh␊

Recebe as entradas sem os #retornos e imprime na tela.

Herman L
fonte