Làm cách nào để chuyển đổi HEX2 sang RGBA?


11

Thế giới nghệ thuật đầy màu sắc, nhưng thế giới của mạng thậm chí còn đầy đủ hơn thế giới nghệ thuật của những màu sắc khác biệt và đó là kết xuất. Đó là lý do tại sao chúng ta cần biết cách chuyển đổi một loại định dạng màu sang loại khác.

Thách thức là hiển nhiên:

Viết chương trình / hàm hơn là chuyển đổi mã HEX đã cho ( #00ff0080ví dụ) thành RGBA (như rgba(0, 255, 0, 0.5)).

Quy tắc:

  • Các thư viện / tích hợp bên ngoài để chuyển đổi HEX sang RGBA không được phép. Tuy nhiên, jQuery và cú pháp thay thế như thế là chấp nhận được.
  • Quy tắc đầu vào / đầu ra tiêu chuẩn được áp dụng.
  • Định dạng của alpha có thể nằm trong khoảng (1 == 100%) hoặc khác (100 == 100%) không thực sự quan trọng.
  • Đầu ra là linh hoạt , miễn là nó trả về 4 giá trị được chuyển đổi (dưới dạng Chuỗi, Mảng, Danh sách, lựa chọn của bạn).
  • Bạn có thể chọn lấy đầu vào mà không cần #vào đầu. Do đó, bạn có thể lấy đầu vào là một trong hai #RRGGBBAAhoặc RRGGBBAA. Bạn có thể giả sử rằng mã hex (không bao gồm #) sẽ luôn dài 8 ký tự.
  • Bạn nên chia tất cả các giá trị cho 255, bao gồm cả alpha. Độ chính xác thập phân tối thiểu (đối với alpha sẽ là 2 chữ số thập phân).

Các trường hợp thử nghiệm

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

Chấm điểm

, mã có số byte ít nhất sẽ thắng.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Dennis

1
Chúng tôi có bắt buộc phải lấy "mã hex" làm chuỗi không? Bạn nói rằng chúng ta có thể lấy nó mà không cần dẫn đầu #, trong trường hợp đó, nó sẽ chỉ là một giá trị nguyên 32 bit. Có hợp pháp để lấy nó như vậy?
Cody Grey

Câu trả lời:


4

JavaScript (ES6), 73 54 50 byte

(Đã lưu một số byte nhờ @LeakyNun, thử thách được chỉnh sửa và @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, có vẻ như chúng tôi có thông số cuối cùng cho việc này bây giờ để bạn có thể cập nhật câu trả lời của mình.
Xù xì

Cũng như nhận xét của @ Shaggy, bạn có thể lưu một vài byte bằng cách sử dụng evalthay vì parseInt:s=>s.match(/../g).map((x,i)=>eval('0x'+x)/(i-3?1:255))
Craig Ayre

@CraigAyre, evallà một thay thế tuyệt vời parseIntcho mục đích chơi gôn, cảm ơn!
Rick Hitchcock

@RickHitchcock, đừng lo! Bạn cũng có thể cạo một vài byte từ regex bằng cách sử dụng /../g. Bạn có thể giảm nó hơn nữa bằng cách sử dụng replacehơn match/map
Craig Ayre

Ồ, tôi thấy các quy tắc đã thay đổi, vì vậy dấu thăng ban đầu không còn cần thiết nữa.
Rick Hitchcock

3

Japt , 13 byte

Đưa đầu vào dưới dạng một chuỗi, không có đầu #. Xuất giá trị rgba dưới dạng một mảng.

ò ®nG
pUo /#ÿ

Kiểm tra nó


Giải trình

Chúng tôi mặc nhiên lấy chuỗi làm đầu vào thông qua biến U.
"00ff0080"

ò

Chia chuỗi thành một mảng các phần tử có độ dài 2.
["00","ff","00","80"]

®nG

Ánh xạ qua mảng và chuyển đổi từng phần tử từ chuỗi 16 cơ sở sang số thập phân. Do dòng mới sau đây, mảng đó được gán ngầm cho biến U.
[0,255,0,128]

Uo

Pop phần tử cuối cùng từ mảng.
128

/#ÿ

Chia cho 255.
0.5019607843137255

p

Đẩy kết quả trở lại Usau đó ngầm xuất ra mảng cuối cùng.
[0,255,0,0.5019607843137255]


2

PHP , 63 byte

Đầu ra dưới dạng mảng

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

Hãy thử trực tuyến!

PHP , 80 byte

Đầu ra dưới dạng giá trị rgba, Đầu vào không có #

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

Hãy thử trực tuyến!

PHP , 88 byte

Đầu ra dưới dạng giá trị rgba, Đầu vào với #

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

Hãy thử trực tuyến!


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

Hãy thử trực tuyến!

Nỗ lực khác của tôi đạt mức 145 byte . Tôi không phải là một tay golf C, nên điều này có thể ngắn hơn.


2

05AB1E , 9 byte

2ôH`255/)

Hãy thử trực tuyến!

Ít nhất chúng tôi có những người ủng hộ như Emigna thường sử dụng một số ý nghĩa thông thường ... (đó là những gì bạn nhận được khi chơi golf cả ngày và sau đó bạn bắt đầu sản xuất những thứ như 2ô16öRć255/¸ìRಠ_ಠ)


5 byte ngắn hơn:2ôH`žz/)
Emigna

@Emigna Tuy nhiên, thách thức đã kết thúc ...
Erik the Outgolfer

1

Thạch , 15 14 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Ø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 nhờ @EricTheOutgolfer


1

PHP, 72 byte

Phiên bản đầu ra mảng của Jörg hè là không thể đánh bại; Nhưng có những lựa chọn khác:

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

Chạy như ống với -F. #không quan trọng, đầu ra csv đơn giản

hoặc 73 byte (chạy với -R):

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

74 byte với khoảng trắng:

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

không đơn giản, 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

Chuỗi thập lục phân được chuyển đổi thành một số bằng cách sử dụng VAL (), sau đó RGBREAD trích xuất từng byte. #L là hằng số có giá trị 256.

RGBREAD được thiết kế để trích xuất các kênh từ một màu ARGB, nhưng thực sự nó chỉ chia một số nguyên 4 byte thành 4 byte riêng biệt, vì vậy thứ tự không thành vấn đề.


Tôi luôn thích nhìn thấy các phản hồi cơ bản , nhưng tôi sợ rằng phản hồi này có thể không hợp lệ, vì nó sử dụng tích hợp để chuyển đổi hệ thập lục phân sang rgba
Taylor Scott

Tôi nghĩ rằng nó không được tính là một hex-> rgba dựng sẵn bởi vì nó đòi hỏi một bước bổ sung để chuyển đổi chuỗi hex thành một số nguyên.
12Me21

Trên thực tế, nhìn lại nó, tôi nghĩ bạn đã đúng, việc chuyển đổi rõ ràng từ hex sang int sẽ làm cho nó hợp lệ.
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(",")}

đây là một chức năng Chạy nó bằng cách sử dụng

( CODE )("#00ff0080")


0

q / kdb +, 43 byte

Giải pháp:

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

Thí dụ:

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

Giải trình:

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

Yêu cầu ⎕IO←0đó là mặc định trên nhiều hệ thống. Nhắc cho đầu vào là chữ hoa mà không có #.

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

Hãy thử trực tuyến!

⎕D,⎕AD igits theo sau bởi A lph.us

⍞⍳⍨ nhắc nhập văn bản (mnemonic: console with quote) và tìm ɩ ndex của mỗi chữ cái trong đó

4 2⍴r eshape như ma trận bốn hàng hai cột

 chuyển đổi (vì chuyển đổi cơ sở hoạt động theo cột)

16⊥ đánh giá là mười sáu cơ sở

 năng suất (phục vụ để tách 3 và 16)

256÷⍨@3 chia phần tử thứ 4 cho 256



0

Yabasic , 96 byte

Một câu trả lời khác ; Đưa đầu vào dưới dạng chuỗi và đầu ra cho bàn điều khiển.

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

Hãy thử trực tuyến!


Bạn có thể lưu một byte bằng cách loại bỏ ngắt dòng trước đó ?.
12Me21

0

VBA Excel, 90 byte

Một chức năng cửa sổ ngay lập tức VBE ẩn danh nhận đầu vào từ phạm vi [A1]và đầu ra cho cửa sổ ngay lập tức 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␊

Đưa đầu vào mà không có #và trả về bằng cách in trên màn hình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.