Bagaimana cara mengubah HEX2 ke RGBA?

11

Dunia seni penuh warna, tetapi dunia jaringan bahkan lebih penuh daripada dunia seni warna yang berbeda dan renderingnya. Itu sebabnya kita perlu tahu bagaimana mengkonversi satu jenis format warna ke yang lain.

Tantangannya jelas:

Tulis program / fungsi daripada mengonversi kode HEX yang diberikan ( #00ff0080, misalnya) ke RGBA (seperti rgba(0, 255, 0, 0.5)).

Aturan:

  • Pustaka / built-in eksternal untuk mengonversi HEX ke RGBA tidak diizinkan. Namun, pengganti jQuery dan sintaksis seperti itu dapat diterima.
  • Aturan Input / Output standar berlaku.
  • Format alfa bisa antara (1 == 100%) atau yang lain (100 == 100%) itu tidak terlalu penting.
  • Outputnya fleksibel , asalkan mengembalikan 4 nilai yang dikonversi (sebagai String, Array, List, pilihan Anda).
  • Anda dapat memilih untuk mengambil input tanpa #di awal. Karenanya, Anda dapat mengambil input baik sebagai #RRGGBBAAatau RRGGBBAA. Anda dapat mengasumsikan bahwa kode hex (tidak termasuk #) akan selalu sepanjang 8 karakter.
  • Anda harus membagi semua nilai dengan 255, termasuk alfa. Ketepatan desimal minimum (untuk alpha akan menjadi 2 tempat desimal).

Uji Kasus

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

Mencetak gol

, kode dengan jumlah byte terkecil yang menang.

Obsdarek
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Dennis
1
Apakah kita diharuskan untuk mengambil "kode hex" sebagai string ? Anda mengatakan bahwa kita dapat mengambilnya tanpa yang terdepan #, dalam hal ini hanya akan menjadi nilai integer 32-bit. Apakah sah untuk menganggapnya demikian?
Cody Gray

Jawaban:

4

JavaScript (ES6), 73 54 50 byte

(Menyimpan beberapa byte berkat @LeakyNun, tantangan yang diedit, dan @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
sumber
Rick, sepertinya kami memiliki spesifikasi final untuk ini sekarang sehingga Anda dapat memperbarui jawaban Anda.
Shaggy
Serta komentar @ Shaggy Anda dapat menyimpan beberapa byte dengan menggunakan evalalih-alih parseInt:s=>s.match(/../g).map((x,i)=>eval('0x'+x)/(i-3?1:255))
Craig Ayre
@CraigAyre, evaladalah alternatif yang bagus parseIntuntuk keperluan golf, terima kasih!
Rick Hitchcock
@RickHitchcock, jangan khawatir! Anda juga dapat mencukur beberapa byte dari regex menggunakan /../g. Anda mungkin dapat menguranginya lebih jauh dengan menggunakan replacelebih dari match/map
Craig Ayre
Oh, saya melihat peraturan telah berubah, jadi tanda awal pound tidak lagi diperlukan.
Rick Hitchcock
3

Japt , 13 byte

Mengambil input sebagai string, tanpa yang memimpin #. Output nilai rgba sebagai array.

ò ®nG
pUo /#ÿ

Menguji


Penjelasan

Kami secara implisit mengambil string sebagai input melalui variabel U.
"00ff0080"

ò

Pisahkan string menjadi array elemen dengan panjang 2.
["00","ff","00","80"]

®nG

Peta di atas array dan konversi setiap elemen dari string basis 16 ke angka desimal. Karena baris baru berikut ini, array itu secara implisit ditugaskan ke variabel U.
[0,255,0,128]

Uo

Pop elemen terakhir dari array.
128

/#ÿ

Membaginya dengan 255.
0.5019607843137255

p

Dorong hasilnya kembali ke dalam Ulalu secara implisit mengeluarkan array terakhir.
[0,255,0,0.5019607843137255]

Shaggy
sumber
2

PHP , 63 byte

Keluaran sebagai array

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

Cobalah online!

PHP , 80 byte

Output sebagai nilai rgba, Input tanpa #

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

Cobalah online!

PHP , 88 byte

Output sebagai nilai rgba, Input dengan #

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

Cobalah online!

Jörg Hülsermann
sumber
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.);}

Cobalah online!

Upaya saya yang lain mencatatkan 145 byte . Saya tidak terlalu pegolf C, jadi ini mungkin bisa lebih pendek.

Conor O'Brien
sumber
2

05AB1E , 9 byte

2ôH`255/)

Cobalah online!

Setidaknya kami memiliki pendukung seperti Emigna yang sering menggunakan akal sehat ... (itulah yang Anda dapatkan untuk bermain golf sepanjang hari dan kemudian Anda mulai memproduksi barang-barang seperti 2ô16öRć255/¸ìRಠ_ಠ)

Erik the Outgolfer
sumber
5 byte lebih pendek:2ôH`žz/)
Emigna
@Emigna Tantangannya telah ditutup namun ...
Erik the Outgolfer
1

Jelly , 15 14 byte

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

Cobalah online!

Bagaimana itu bekerja

Ø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 terima kasih kepada @EricTheOutgolfer

fireflame241
sumber
1

PHP, 72 byte

Versi keluaran array Jörg tidak terkalahkan; tetapi ada opsi lain:

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

Jalankan sebagai pipa dengan -F. #tidak masalah, output csv polos

atau 73 byte (dijalankan dengan -R):

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

74 byte dengan spasi:

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

tidak begitu polos, 81 byte :

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

Ditumpuk , 47 45 41 byte

[2#<$unhexmap(1::256)/', '#`'rgba(@id)'!]

Cobalah online!

Conor O'Brien
sumber
1

Excel, 99 byte

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

SmileBASIC, 50 byte

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

String heksadesimal dikonversi ke angka menggunakan VAL (), kemudian RGBREAD mengekstrak setiap byte. #L adalah konstanta dengan nilai 256.

RGBREAD dirancang untuk mengekstrak saluran dari warna ARGB, tetapi sebenarnya hanya membagi integer 4 byte menjadi 4 byte terpisah, sehingga urutannya tidak masalah.

12Me21
sumber
Saya selalu suka melihat respons dasar , tetapi saya khawatir respons ini mungkin tidak valid, karena menggunakan bawaan untuk mengubah heksadesimal menjadi rgba
Taylor Scott
Saya pikir itu tidak dihitung sebagai hex-> rgba builtin karena membutuhkan langkah ekstra untuk mengubah string hex menjadi integer.
12Me21
Sebenarnya, melihatnya lagi, saya pikir Anda benar, konversi eksplisit dari hex ke int akan membuatnya valid.
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(",")}

ini sebuah fungsi. Jalankan menggunakan

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

q / kdb +, 43 byte

Larutan:

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

Contoh:

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

Penjelasan:

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

APL (Dyalog) , 24 byte

Membutuhkan ⎕IO←0yang default pada banyak sistem. Meminta input sebagai huruf besar tanpa #.

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

Cobalah online!

⎕D,⎕AD igits diikuti oleh A lphabet

⍞⍳⍨ meminta input teks (mnemonik: konsol dengan kutipan) dan temukan ɩ ndex dari setiap huruf di dalamnya

4 2⍴r eshape sebagai empat baris dua kolom matriks

 transpose (karena konversi basis berfungsi secara kolom)

16⊥ mengevaluasi sebagai basis enam belas

 hasil (berfungsi untuk memisahkan 3 dan 16)

256÷⍨@3 bagilah elemen ke 4 dengan 256

Adm
sumber
0

Python 2 , 54 byte

lambda h:[int(h[i-2:i],16)/2.**(8&i)for i in(2,4,6,8)]

Cobalah online!

TFeld
sumber
0

Yabasic , 96 byte

Namun jawaban lainnya ; Mengambil input sebagai string dan output ke konsol.

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

Cobalah online!

Taylor Scott
sumber
Anda dapat menyimpan byte dengan menghapus baris sebelumnya ?.
12Me21
0

Excel VBA, 90 byte

Fungsi jendela langsung VBE anonim yang mengambil input dari kisaran [A1]dan output ke jendela langsung VBE.

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

Vim, 46 byte

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

Mengambil input tanpa #dan kembali dengan mencetak di layar.

Herman L.
sumber