¿Cómo convertir HEX2 a RGBA?

11

El mundo del arte está lleno de color, pero el mundo de la red es aún más completo que el mundo del arte de diferentes colores y sus representaciones. Es por eso que necesitamos saber cómo convertir un tipo de formato de color a otro.

El desafío es evidente:

Escriba un programa / función que convierta un código HEX dado ( #00ff0080por ejemplo) a RGBA (como rgba(0, 255, 0, 0.5)).

Reglas:

  • Las bibliotecas externas / incorporadas para convertir HEX a RGBA no están permitidas. Sin embargo, los reemplazos de sintaxis y jQuery como ese son aceptables.
  • Se aplican las reglas estándar de entrada / salida.
  • El formato del alfa puede ser entre (1 == 100%) u otro (100 == 100%) que no es realmente importante.
  • La salida es flexible , siempre que devuelva los 4 valores convertidos (como una cadena, matriz, lista, su elección).
  • Puede optar por tomar la entrada sin el #al principio. Por lo tanto, puede tomar la entrada como #RRGGBBAAo RRGGBBAA. Puede suponer que el código hexadecimal (excluyendo el #) siempre tendrá 8 caracteres de longitud.
  • Debe dividir todos los valores por 255, incluido el alfa. La precisión decimal mínima (para el alfa será de 2 decimales).

Casos de prueba

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

Puntuación

, gana el código con la menor cantidad de bytes.

Obsdarek
fuente
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Dennis
1
¿Estamos obligados a tomar el "código hexadecimal" como una cadena ? Usted dice que podemos tomarlo sin el inicio #, en cuyo caso sería solo un valor entero de 32 bits. ¿Es legal tomarlo así?
Cody Gray

Respuestas:

4

JavaScript (ES6), 73 54 50 bytes

(Ahorré algunos bytes gracias a @LeakyNun, el desafío editado, y @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
fuente
Rick, parece que tenemos las especificaciones finales para esto ahora, así que puedes actualizar tu respuesta.
Shaggy
Además del comentario de @ Shaggy, puede guardar algunos bytes utilizando en evallugar de parseInt:s=>s.match(/../g).map((x,i)=>eval('0x'+x)/(i-3?1:255))
Craig Ayre
@CraigAyre, evales una gran alternativa parseIntpara jugar al golf, ¡gracias!
Rick Hitchcock
@RickHitchcock, ¡no te preocupes! También puede eliminar un par de bytes de la expresión regular utilizando /../g. Es posible que pueda reducirlo aún más usando replaceOver match/map
Craig Ayre
Oh, veo que las reglas han cambiado, por lo que ya no es necesario el signo inicial de la libra.
Rick Hitchcock
3

Japt , 13 bytes

Toma la entrada como una cadena, sin el inicio #. Emite el valor rgba como una matriz.

ò ®nG
pUo /#ÿ

Pruébalo


Explicación

Tomamos implícitamente la cadena como entrada a través de la variable U.
"00ff0080"

ò

Divida la cadena en una matriz de elementos de longitud 2.
["00","ff","00","80"]

®nG

Asigne sobre la matriz y convierta cada elemento de una cadena base 16 en un número decimal. Debido a la siguiente nueva línea, esa matriz se asigna implícitamente a la variable U.
[0,255,0,128]

Uo

Pop el último elemento de la matriz.
128

/#ÿ

Dividirlo por 255.
0.5019607843137255

p

Empuje el resultado de nuevo a la Usalida implícita de la matriz final.
[0,255,0,0.5019607843137255]

Lanudo
fuente
2

PHP , 63 bytes

Salida como matriz

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

Pruébalo en línea!

PHP , 80 bytes

Salida como valor rgba, entrada sin #

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

Pruébalo en línea!

PHP , 88 bytes

Salida como valor rgba, entrada con #

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

Pruébalo en línea!

Jörg Hülsermann
fuente
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.);}

Pruébalo en línea!

Mi otro intento registró 145 bytes . No soy un gran jugador de golf C, por lo que esto podría ser más corto

Conor O'Brien
fuente
2

05AB1E , 9 bytes

2ôH`255/)

Pruébalo en línea!

Al menos tenemos partidarios como Emigna para usar a menudo algo de sentido común ... (eso es lo que obtienes para jugar golf todo el día y luego comienzas a producir cosas como 2ô16öRć255/¸ìRಠ_ಠ)

Erik el Outgolfer
fuente
5 bytes más cortos:2ôH`žz/)
Emigna
@Emigna Sin embargo, el desafío se ha cerrado ...
Erik the Outgolfer
1

Jalea , 15 14 bytes

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

Pruébalo en línea!

Cómo 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 gracias a @EricTheOutgolfer

fireflame241
fuente
1

PHP, 72 bytes

La versión de salida de la matriz de Jörg es inmejorable; Pero hay otras opciones:

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

Ejecutar como tubería con -F. #no importa, salida csv simple

o 73 bytes (ejecutar con -R):

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

74 bytes con los espacios:

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

no tan simple, 81 bytes :

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

Excel, 99 bytes

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

SmileBASIC, 50 bytes

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

La cadena hexadecimal se convierte en un número usando VAL (), luego RGBREAD extrae cada byte. #L es una constante con el valor 256.

RGBREAD está diseñado para extraer los canales de un color ARGB, pero realmente divide un entero de 4 bytes en 4 bytes separados, por lo que el orden no importa.

12Me21
fuente
Siempre me gusta ver respuestas básicas , pero me temo que esta respuesta puede ser inválida, ya que utiliza un incorporado para convertir hexadecimal a rgba
Taylor Scott
Creo que no cuenta como un hexadecimal-> rgba incorporado porque requiere un paso adicional para convertir la cadena hexadecimal en un entero.
12Me21
En realidad, mirándolo de nuevo, creo que tienes razón, la conversión explícita de hexadecimal a int lo haría válido.
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(",")}

Esta es una función. Ejecútalo usando

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

q / kdb +, 43 bytes

Solución:

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

Ejemplo:

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

Explicación:

{                                         } / 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 
callejero
fuente
0

APL (Dyalog) , 24 bytes

Requiere ⎕IO←0cuál es el predeterminado en muchos sistemas. Solicita entrada como mayúscula sin #.

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

Pruébalo en línea!

⎕D,⎕AD igits seguido por A lphabet

⍞⍳⍨solicite  la entrada de texto (mnemónico: consola con cita) y encuentre el índice ɩ de cada letra en ese

4 2⍴r forma como matriz de cuatro filas y dos columnas

 transposición (porque la conversión base funciona en columnas)

16⊥ evaluar como base dieciséis

 rendimiento (sirve para separar 3 y 16)

256÷⍨@3 dividir el elemento por 256

Adán
fuente
0

Yabasic , 96 bytes

Otra respuesta ; Toma entrada como cadena y salidas a la consola.

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

Pruébalo en línea!

Taylor Scott
fuente
Puede guardar un byte eliminando el salto de línea anterior ?.
12Me21
0

Excel VBA, 90 bytes

Una función de ventana inmediata anónima de VBE que toma la entrada del rango [A1]y las salidas a la ventana inmediata de VBE.

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

Vim, 46 bytes

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

Toma entrada sin el #y regresa imprimiendo en la pantalla.

Herman L
fuente