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÷⍨@3⊢16⊥⍉4 2⍴⍞⍳⍨⎕D,⎕A

Provalo online!

⎕D,⎕A D 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.