Come convertire HEX2 in RGBA?


11

Il mondo dell'arte è pieno di colori, ma il mondo della rete è ancora più pieno del mondo dell'arte di colori diversi e dei suoi rendering. Ecco perché dobbiamo sapere come convertire un tipo di formato colore in un altro.

La sfida è evidente:

Scrivi un programma / funzione che converte un determinato codice HEX ( #00ff0080, ad esempio) in RGBA (come rgba(0, 255, 0, 0.5)).

Regole:

  • Le librerie / i built-in esterni per la conversione di HEX in RGBA non sono consentiti. Tuttavia, i sostituti jQuery e sintassi del genere sono accettabili.
  • Si applicano le regole standard di input / output.
  • Il formato dell'alfa può essere tra (1 == 100%) o l'altro (100 == 100%) che non è molto importante.
  • L'output è flessibile , purché restituisca i 4 valori convertiti (come String, Array, List, a scelta).
  • Puoi scegliere di prendere l'input senza #all'inizio. Quindi, puoi prendere input come #RRGGBBAAo RRGGBBAA. Puoi presumere che il codice esadecimale (escluso il #) sarà sempre lungo 8 caratteri.
  • Dovresti dividere tutti i valori per 255, incluso l'alfa. La precisione decimale minima (per l'alfa sarà di 2 decimali).

Casi test

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

punteggio

, vince il codice con il minor numero di byte.


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Dennis,

1
È necessario prendere il "codice esadecimale" come stringa ? Dici che possiamo prenderlo senza il comando iniziale #, nel qual caso sarebbe solo un valore intero a 32 bit. È legale prenderlo come quello?
Cody Gray,

Risposte:


4

JavaScript (ES6), 73 54 50 byte

(Salvati alcuni byte grazie a @LeakyNun, la sfida modificata e @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, sembra che ora abbiamo le specifiche finali per questo in modo da poter aggiornare la tua risposta.
Shaggy,

Oltre al commento di @ Shaggy puoi salvare alcuni byte usando evalinvece di parseInt:s=>s.match(/../g).map((x,i)=>eval('0x'+x)/(i-3?1:255))
Craig Ayre,

@CraigAyre, evalè un'ottima alternativa ai parseIntfini del golf, grazie!
Rick Hitchcock,

@RickHitchcock, non preoccuparti! Puoi anche radere un paio di byte dal regex usando /../g. Potresti essere in grado di ridurlo ulteriormente usando replaceover match/map
Craig Ayre il

Oh, vedo che le regole sono cambiate, quindi il segno di cancelletto iniziale non è più richiesto.
Rick Hitchcock,

3

Japt , 13 byte

Accetta l'input come stringa, senza il comando iniziale #. Emette il valore rgba come un array.

ò ®nG
pUo /#ÿ

Provalo


Spiegazione

Prendiamo implicitamente la stringa come input tramite variabile U.
"00ff0080"

ò

Dividi la stringa in una matrice di elementi di lunghezza 2.
["00","ff","00","80"]

®nG

Mappare sull'array e convertire ogni elemento da una stringa di base 16 in un numero decimale. A causa della seguente nuova riga, quell'array è assegnato implicitamente alla variabile U.
[0,255,0,128]

Uo

Pop l'ultimo elemento dall'array.
128

/#ÿ

Dividilo per 255.
0.5019607843137255

p

Inserire nuovamente il risultato e Uquindi implicitamente emettere l'array finale.
[0,255,0,0.5019607843137255]


2

PHP , 63 byte

Uscita come matrice

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

Provalo online!

PHP , 80 byte

Uscita come valore rgba, Ingresso senza #

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

Provalo online!

PHP , 88 byte

Uscita come valore rgba, Ingresso con #

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

Provalo online!


2

C (gcc) , 139 byte

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

Provalo online!

Il mio altro tentativo è arrivato a 145 byte . Non sono un gran giocatore di golf in C, quindi questo potrebbe essere più breve.



1

Gelatina , 15 14 byte

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

Provalo online!

Come funziona

Ø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 grazie a @EricTheOutgolfer


1

PHP, 72 byte

La versione di output dell'array di Jörg è imbattibile; ma ci sono altre opzioni:

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

Esegui come pipe con -F. #non importa, semplice output CSV

o 73 byte (eseguito con -R):

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

74 byte con gli spazi:

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

non così semplice, 81 byte :

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


1

Excel, 99 byte

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

1

SmileBASIC, 50 byte

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

La stringa esadecimale viene convertita in un numero usando VAL (), quindi RGBREAD estrae ogni byte. #L è una costante con il valore 256.

RGBREAD è progettato per estrarre i canali da un colore ARGB, ma in realtà divide semplicemente un numero intero di 4 byte in 4 byte separati, quindi l'ordine non ha importanza.


Mi piace sempre vedere le risposte di base , ma temo che questa risposta potrebbe non essere valida, poiché utilizza un built-in per convertire esadecimali in rgba
Taylor Scott

Penso che non conti come un hex-> rgba incorporato perché richiede un passaggio aggiuntivo per convertire la stringa esadecimale in un numero intero.
Me21

In realtà, guardandolo di nuovo, penso che tu abbia ragione, la conversione esplicita da hex a int lo renderebbe valido.
Taylor Scott,


0

JS ES2015, 84 byte

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

questa è una funzione. Eseguilo usando

( CODE )("#00ff0080")


0

q / kdb +, 43 byte

Soluzione:

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

Esempio:

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

Spiegazione:

{                                         } / 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 

0

APL (Dyalog) , 24 byte

Richiede il ⎕IO←0valore predefinito su molti sistemi. Richiede l'immissione in maiuscolo senza #.

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

Provalo online!

⎕D,⎕AD igits seguita da un alfabeto

⍞⍳⍨ richiede l'inserimento di testo (mnemonico: console con virgolette) e trova ɩ ndex di ogni lettera

4 2⍴r eshape come quattro riga di matrice a due colonne

 trasporre (perché la conversione di base funziona in modo colonna)

16⊥ valutare come base sedici

 rendimento (serve per separare 3 e 16)

256÷⍨@3 dividere il 4 ° elemento per 256



0

Yabasic , 96 byte

Ancora un'altra risposta di ; Accetta input come stringa e output sulla 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

Provalo online!


È possibile salvare un byte rimuovendo l'interruzione di linea prima ?.
12Me21

0

Excel VBA, 90 byte

Una funzione di finestra immediata VBE anonima che accetta input dall'intervallo [A1]e genera nella finestra immediata VBE.

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

0

Vim, 46 byte

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

Accetta input senza #e ritorna stampando sullo schermo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.