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

Wypróbuj online!

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