Jak przekonwertować HEX2 do RGBA?


11

Świat sztuki jest pełen kolorów, ale świat sieci jest jeszcze pełniejszy niż świat sztuki o różnych kolorach i renderingach. Dlatego musimy wiedzieć, jak przekonwertować jeden typ formatu koloru na inny.

Wyzwanie jest oczywiste:

Napisz program / funkcję niż konwertuje dany kod HEX ( #00ff0080na przykład) na RGBA (jak rgba(0, 255, 0, 0.5)).

Zasady:

  • Biblioteki zewnętrzne / wbudowane do konwersji HEX na RGBA są niedozwolone. Jednak jQuery i takie zamienniki składni są dopuszczalne.
  • Obowiązują standardowe zasady wejścia / wyjścia.
  • Format alfa może wynosić między (1 == 100%) lub innym (100 == 100%), co nie jest tak naprawdę ważne.
  • Dane wyjściowe są elastyczne , o ile zwracają 4 skonwertowane wartości (jako ciąg, tablicę, listę, do wyboru).
  • Możesz zdecydować się na wejście bez #początku. Stąd można przyjąć jako wejście albo #RRGGBBAAalbo RRGGBBAA. Możesz założyć, że kod szesnastkowy (z wyłączeniem #) zawsze będzie miał 8 znaków.
  • Powinieneś podzielić wszystkie wartości przez 255, włączając alfę. Minimalna precyzja dziesiętna (dla alfy będą to 2 miejsca dziesiętne).

Przypadki testowe

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

Punktacja

wygrywa kod z najmniejszą liczbą bajtów.


Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Dennis

1
Czy musimy traktować „kod szesnastkowy” jako ciąg ? Mówisz, że możemy wziąć to bez wiodącego #, w którym to przypadku byłaby to tylko 32-bitowa liczba całkowita. Czy jest to zgodne z prawem?
Cody Gray,

Odpowiedzi:


4

JavaScript (ES6), 73 54 50 bajtów

(Zapisano kilka bajtów dzięki @LeakyNun, edytowanemu wyzwaniu i @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, wygląda na to, że mamy teraz ostateczną specyfikację, więc możesz zaktualizować swoją odpowiedź.
Shaggy

Oprócz komentarza @ Shaggy możesz zaoszczędzić kilka bajtów, używając evalzamiast parseInt:s=>s.match(/../g).map((x,i)=>eval('0x'+x)/(i-3?1:255))
Craig Ayre

@CraigAyre, evaljest świetną alternatywą parseIntdla golfistów, dzięki!
Rick Hitchcock

@ RickHitchcock, nie martw się! Możesz także ogolić kilka bajtów z wyrażenia regularnego za pomocą /../g. Możesz być w stanie jeszcze go zmniejszyć, używając replaceover match/map
Craig Ayre

Och, widzę, że zasady się zmieniły, więc początkowy znak funta nie jest już wymagany.
Rick Hitchcock

3

Japt , 13 bajtów

Pobiera dane wejściowe jako ciąg, bez wiodącego #. Zwraca wartość rgba jako tablicę.

ò ®nG
pUo /#ÿ

Sprawdź to


Wyjaśnienie

Pośrednio bierzemy ciąg jako dane wejściowe przez zmienną U.
"00ff0080"

ò

Podziel ciąg na tablicę elementów o długości 2.
["00","ff","00","80"]

®nG

Odwzoruj tablicę i przekonwertuj każdy element z podstawowego ciągu 16 na liczbę dziesiętną. Z powodu następującego nowego wiersza tablica jest domyślnie przypisana do zmiennej U.
[0,255,0,128]

Uo

Usuń ostatni element z tablicy.
128

/#ÿ

Podziel to przez 255.
0.5019607843137255

p

Wepchnij wynik z powrotem do, Ua następnie niejawnie wyślij końcową tablicę.
[0,255,0,0.5019607843137255]


2

PHP , 63 bajty

Dane wyjściowe jako tablica

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

Wypróbuj online!

PHP , 80 bajtów

Wyjście jako wartość rgba, wejście bez #

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

Wypróbuj online!

PHP , 88 bajtów

Dane wyjściowe jako wartość rgba, dane wejściowe za pomocą #

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

Wypróbuj online!


2

C (gcc) , 139 bajtów

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

Wypróbuj online!

Moja druga próba osiągnęła 145 bajtów . Nie jestem wielkim golfistą C, więc prawdopodobnie może być krótszy.



1

Galaretka , 15 14 bajtów

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

Wypróbuj online!

Jak to działa

Ø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 bajt dzięki @EricTheOutgolfer


1

PHP, 72 bajty

Wersja wyjściowa tablicy Jörga jest nie do pobicia; ale są też inne opcje:

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

Uruchom jako potok z -F. #nie ma znaczenia, zwykłe wyjście csv

lub 73 bajty (uruchom z -R):

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

74 bajty ze spacjami:

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

nie takie proste, 81 bajtów :

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


1

Excel, 99 bajtów

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

1

SmileBASIC, 50 bajtów

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

Łańcuch szesnastkowy jest konwertowany na liczbę za pomocą VAL (), a następnie RGBREAD wyodrębnia każdy bajt. #L jest stałą o wartości 256.

RGBREAD jest zaprojektowany do wydobywania kanałów z koloru ARGB, ale tak naprawdę po prostu dzieli 4-bajtową liczbę całkowitą na 4 oddzielne bajty, więc kolejność nie ma znaczenia.


Zawsze lubię widzieć podstawowe odpowiedzi, ale obawiam się, że ta odpowiedź może być nieprawidłowa, ponieważ używa wbudowanego do konwersji szesnastkowej na rgba
Taylor Scott

Myślę, że nie liczy się to jako wbudowane hex-> rgba, ponieważ wymaga dodatkowego kroku, aby przekonwertować ciąg hex na liczbę całkowitą.
12Me21

Właściwie, patrząc na to jeszcze raz, myślę, że masz rację, wyraźna konwersja z hexa na int sprawi, że będzie to poprawne.
Taylor Scott


0

JS ES2015, 84 bajty

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

to jest funkcja. Uruchom za pomocą

( CODE )("#00ff0080")


0

q / kdb +, 43 bajty

Rozwiązanie:

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

Przykład:

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

Wyjaśnienie:

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

Wymaga ⎕IO←0ustawienia domyślnego w wielu systemach. Monituje o wprowadzenie wielkich liter bez #.

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

Wypróbuj online!

⎕D,⎕AD igity, po których następuje A alfabet

⍞⍳⍨ monit o wprowadzenie tekstu (mnemonic: konsola z cytatem) i znajdź w nim tekst każdej litery

4 2⍴R eshape w czterech wierszy macierzy dwukolumnowym

 transponuj (ponieważ podstawowa konwersja działa w kolumnie)

16⊥ oceniać jako szesnaście podstawową

 wydajność (służy do rozdzielenia 3 i 16)

256÷⍨@3 podzielić 4 th elementu 256



0

Yabasic , 96 bajtów

Jeszcze jedna odpowiedź; Pobiera dane wejściowe jako ciąg i dane wyjściowe do konsoli.

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

Wypróbuj online!


Możesz zapisać bajt, usuwając wcześniej podział linii ?.
12Me21

0

Excel VBA, 90 bajtów

Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane wejściowe z zakresu [A1]i dane wyjściowe do bezpośredniego okna 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 bajtów

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

Odbiera dane wejściowe bez #i wraca, drukując na ekranie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.