Comment convertir HEX2 en RGBA?

11

Le monde de l'art est plein de couleurs, mais le monde du réseau est encore plus plein que le monde de l'art de différentes couleurs et de ses rendus. C'est pourquoi nous devons savoir comment convertir un type de format de couleur en un autre.

Le défi est évident:

Écrivez un programme / une fonction qui convertit un code HEX donné ( #00ff0080, par exemple) en RGBA (comme rgba(0, 255, 0, 0.5)).

Règles:

  • Les bibliothèques externes / intégrées pour convertir HEX en RGBA sont interdites. Cependant, jQuery et les remplaçants de syntaxe comme celui-ci sont acceptables.
  • Les règles d'entrée / sortie standard s'appliquent.
  • Le format de l'alpha peut être compris entre (1 == 100%) ou l'autre (100 == 100%) ce qui n'est pas vraiment important.
  • La sortie est flexible , tant qu'elle renvoie les 4 valeurs converties (en tant que chaîne, tableau, liste, votre choix).
  • Vous pouvez choisir de prendre l'entrée sans le #au début. Par conséquent, vous pouvez prendre l'entrée en tant que #RRGGBBAAou RRGGBBAA. Vous pouvez supposer que le code hexadécimal (à l'exclusion du #) comportera toujours 8 caractères.
  • Vous devez diviser toutes les valeurs par 255, y compris l'alpha. La précision décimale minimale (pour l'alpha sera de 2 décimales).

Cas de test

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

Notation

, le code avec le moins d'octets gagne.

Obsdarek
la source
Les commentaires ne sont pas pour une discussion approfondie; cette conversation a été déplacée vers le chat .
Dennis
1
Sommes-nous tenus de prendre le "code hexadécimal" comme une chaîne ? Vous dites que nous pouvons le prendre sans le début #, auquel cas ce serait juste une valeur entière de 32 bits. Est-il légal de le prendre comme ça?
Cody Gray

Réponses:

4

JavaScript (ES6), 73 54 50 octets

(Enregistré quelques octets grâce à @LeakyNun, le défi édité et @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
la source
Rick, il semble que nous ayons maintenant les spécifications finales pour que vous puissiez mettre à jour votre réponse.
Shaggy
En plus du commentaire de @ Shaggy, vous pouvez économiser quelques octets en utilisant à la evalplace de parseInt:s=>s.match(/../g).map((x,i)=>eval('0x'+x)/(i-3?1:255))
Craig Ayre
@CraigAyre, evalest une excellente alternative au parseIntgolf, merci!
Rick Hitchcock
@RickHitchcock, pas de soucis! Vous pouvez également raser quelques octets de l'expression régulière à l'aide de /../g. Vous pourriez être en mesure de le réduire encore plus en utilisant replaceover match/map
Craig Ayre
Oh, je vois que les règles ont changé, donc le signe dièse initial n'est plus nécessaire.
Rick Hitchcock
3

Japt , 13 octets

Prend l'entrée sous forme de chaîne, sans le début #. Génère la valeur rgba sous forme de tableau.

ò ®nG
pUo /#ÿ

Essaye-le


Explication

Nous prenons implicitement la chaîne en entrée via une variable U.
"00ff0080"

ò

Divisez la chaîne en un tableau d'éléments de longueur 2.
["00","ff","00","80"]

®nG

Mappez sur le tableau et convertissez chaque élément d'une chaîne de base 16 en nombre décimal. En raison de la nouvelle ligne suivante, ce tableau est implicitement affecté à la variable U.
[0,255,0,128]

Uo

Pop le dernier élément du tableau.
128

/#ÿ

Divisez-le par 255.
0.5019607843137255

p

Poussez le résultat dans Upuis sortez implicitement le tableau final.
[0,255,0,0.5019607843137255]

Hirsute
la source
2

PHP , 63 octets

Sortie sous forme de tableau

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

Essayez-le en ligne!

PHP , 80 octets

Sortie en tant que valeur rgba, entrée sans #

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

Essayez-le en ligne!

PHP , 88 octets

Sortie en tant que valeur rgba, entrée avec #

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

Essayez-le en ligne!

Jörg Hülsermann
la source
2

C (gcc) , 139 octets

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.);}

Essayez-le en ligne!

Mon autre tentative a atteint 145 octets . Je ne suis pas beaucoup un golfeur C, donc cela pourrait probablement être plus court.

Conor O'Brien
la source
2

05AB1E , 9 octets

2ôH`255/)

Essayez-le en ligne!

Au moins, nous avons des supporters comme Emigna qui utilisent souvent du bon sens ... (c'est ce que vous obtenez pour jouer au golf toute la journée et ensuite vous commencez à produire des trucs comme 2ô16öRć255/¸ìRಠ_ಠ)

Erik le Outgolfer
la source
5 octets plus court:2ôH`žz/)
Emigna
@Emigna Le défi est néanmoins clos ...
Erik the Outgolfer
1

Gelée , 15 14 octets

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

Essayez-le en ligne!

Comment ça fonctionne

Ø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 octet grâce à @EricTheOutgolfer

fireflame241
la source
1

PHP, 72 octets

La version de sortie du tableau de Jörg est imbattable; mais il existe d'autres options:

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

Exécuter en tant que tuyau avec -F. #n'a pas d'importance, sortie csv simple

ou 73 octets (exécuté avec -R):

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

74 octets avec les espaces:

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

pas si simple, 81 octets :

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

Excel, 99 octets

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

SmileBASIC, 50 octets

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

La chaîne hexadécimale est convertie en nombre à l'aide de VAL (), puis RGBREAD extrait chaque octet. #L est une constante avec la valeur 256.

RGBREAD est conçu pour extraire les canaux d'une couleur ARGB, mais en réalité il divise simplement un entier de 4 octets en 4 octets séparés, donc l'ordre n'a pas d'importance.

12Me21
la source
J'aime toujours voir les réponses de base , mais je crains que cette réponse ne soit pas valide, car elle utilise une fonction intégrée pour convertir l'hexadécimal en rgba
Taylor Scott
Je pense qu'il ne compte pas comme un hex-> rgba intégré car il nécessite une étape supplémentaire pour convertir la chaîne hexadécimale en un entier.
12Me21
En fait, en y repensant, je pense que vous avez raison, la conversion explicite de hex en int le rendrait valide.
Taylor Scott
0

JS ES2015, 84 octets

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

c'est une fonction. Exécutez-le en utilisant

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

q / kdb +, 43 octets

Solution:

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

Exemple:

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

Explication:

{                                         } / 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 
streetster
la source
0

APL (Dyalog) , 24 octets

Requiert ⎕IO←0ce qui est par défaut sur de nombreux systèmes. Demande d'entrer en majuscules sans #.

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

Essayez-le en ligne!

⎕D,⎕AD igits suivie d' une lphabet

⍞⍳⍨ demander la saisie de texte (mnémonique: console avec guillemet) et trouver le ɩ ndex de chaque lettre

4 2⍴forme de r comme matrice à quatre colonnes et deux colonnes

 transposer (car la conversion de base fonctionne en colonnes)

16⊥ évaluer comme base seize

 rendement (sert à séparer 3 et 16)

256÷⍨@3 diviser le 4 e élément par 256

Adam
la source
0

Yabasic , 96 octets

Encore une autre réponse de ; Prend les entrées sous forme de chaîne et les sorties vers la 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

Essayez-le en ligne!

Taylor Scott
la source
Vous pouvez enregistrer un octet en supprimant le saut de ligne avant ?.
12Me21
0

Excel VBA, 90 octets

Une fonction de fenêtre immédiate VBE anonyme qui prend les entrées de la plage [A1]et les sorties vers la fenêtre immédiate VBE.

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

Vim, 46 octets

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

Prend la saisie sans le #et revient en imprimant sur l'écran.

Herman L
la source