วิธีการแปลง HEX2 เป็น RGBA?


11

โลกแห่งศิลปะเต็มไปด้วยสีสัน แต่โลกของเครือข่ายนั้นยิ่งใหญ่กว่าโลกแห่งศิลปะที่มีสีต่างกันและการเรนเดอร์ นั่นเป็นเหตุผลที่เราจำเป็นต้องรู้วิธีแปลงรูปแบบสีหนึ่งประเภทเป็นรูปแบบอื่น

ความท้าทายปรากฏชัดในตัวเอง:

เขียนโปรแกรม / ฟังก์ชั่นกว่าแปลงรหัสHEX ( #00ff0080เช่น) เป็นRGBA (เช่นrgba(0, 255, 0, 0.5))

กฎ:

  • ไลบรารี่ / บิวด์อินภายนอกสำหรับการแปลง HEX เป็น RGBA ไม่ได้รับอนุญาต อย่างไรก็ตามผู้ทำซ้ำ jQuery และไวยากรณ์เช่นนั้นเป็นที่ยอมรับ
  • ใช้กฎอินพุต / เอาท์พุตมาตรฐาน
  • รูปแบบของอัลฟาสามารถอยู่ระหว่าง (1 == 100%) หรือรูปแบบอื่น ๆ (100 == 100%) ที่ไม่สำคัญจริงๆ
  • เอาท์พุทมีความยืดหยุ่นตราบใดที่มันคืนค่าที่แปลง 4 (เป็น String, Array, List, ตัวเลือกของคุณ)
  • คุณอาจเลือกที่จะรับอินพุตโดยไม่ต้อง#เริ่มต้น ดังนั้นคุณสามารถใช้การป้อนข้อมูลเป็นอย่างใดอย่างหนึ่งหรือ#RRGGBBAA RRGGBBAAคุณสามารถสมมติว่ารหัสฐานสิบหก (ไม่รวม#) จะมีความยาว 8 ตัวอักษร
  • คุณควรหารค่าทั้งหมดด้วย 255 รวมถึงอัลฟา ความแม่นยำทศนิยมขั้นต่ำ (สำหรับอัลฟาจะเป็นทศนิยม 2 ตำแหน่ง)

กรณีทดสอบ

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

เกณฑ์การให้คะแนน

รหัสที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Dennis

1
เราจำเป็นต้องใช้ "hex code" เป็นสตริงหรือไม่? คุณบอกว่าเราสามารถทำได้โดยไม่มีผู้นำ#ในกรณีนี้มันจะเป็นค่าจำนวนเต็ม 32 บิต มันถูกกฎหมายหรือไม่
โคดี้เกรย์

คำตอบ:


4

JavaScript (ES6), 73 54 50 ไบต์

(บันทึกบางไบต์ด้วย @LeakyNun ความท้าทายที่แก้ไขและ @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 ดูเหมือนว่าเรามีข้อมูลจำเพาะขั้นสุดท้ายสำหรับตอนนี้เพื่อให้คุณสามารถอัปเดตคำตอบของคุณ
Shaggy

เช่นเดียวกับความคิดเห็นของ @ Shaggy คุณสามารถบันทึกไม่กี่ไบต์โดยใช้evalแทนparseInt:s=>s.match(/../g).map((x,i)=>eval('0x'+x)/(i-3?1:255))
Craig Ayre

@CraigAyre evalเป็นทางเลือกที่ยอดเยี่ยมparseIntสำหรับการเล่นกอล์ฟขอบคุณ!
Rick Hitchcock

@ RickHitchcock ไม่ต้องกังวล! นอกจากนี้คุณยังสามารถโกนคู่ของไบต์จาก regex /../gโดยใช้ คุณอาจจะสามารถลดได้อีกโดยใช้replaceเกินmatch/map
Craig Ayre

โอ้ฉันเห็นกฎมีการเปลี่ยนแปลงดังนั้นเครื่องหมายปอนด์เริ่มต้นไม่จำเป็นต้องใช้อีกต่อไป
Rick Hitchcock

3

Japt , 13 ไบต์

#จะเข้าเป็นสตริงโดยไม่ต้องชั้นนำ ส่งออกค่า rgba เป็นอาร์เรย์

ò ®nG
pUo /#ÿ

ทดสอบมัน


คำอธิบาย

เราโดยปริยายใช้สตริงเป็น input Uผ่านตัวแปร
"00ff0080"

ò

แยกสตริงออกเป็นอาร์เรย์ขององค์ประกอบความยาว 2
["00","ff","00","80"]

®nG

แม็พเหนืออาร์เรย์และแปลงแต่ละองค์ประกอบจากสตริง 16 ฐานเป็นตัวเลขทศนิยม Uเพราะการขึ้นบรรทัดใหม่ต่อไปนี้อาร์เรย์ที่ถูกกำหนดโดยปริยายให้กับตัวแปร
[0,255,0,128]

Uo

ป๊อปองค์ประกอบสุดท้ายจากอาร์เรย์
128

/#ÿ

หารด้วย 255
0.5019607843137255

p

กดผลลัพธ์กลับเข้าไปUโดยปริยายแล้วส่งออกอาเรย์สุดท้าย
[0,255,0,0.5019607843137255]


2

PHP , 63 ไบต์

เอาต์พุตเป็นอาร์เรย์

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

ลองออนไลน์!

PHP , 80 ไบต์

เอาต์พุตเป็นค่า rgba, อินพุตโดยไม่ต้อง #

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

ลองออนไลน์!

PHP , 88 ไบต์

เอาต์พุตเป็นค่า rgba, อินพุตด้วย #

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

ลองออนไลน์!


2

C (gcc) , 139 ไบต์

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

ลองออนไลน์!

ความพยายามอื่น ๆ ของฉันโอเวอร์คล็อกที่145 ไบต์ ฉันไม่ใช่นักกอล์ฟ C มากนักดังนั้นนี่อาจสั้นกว่านี้


2

05AB1E , 9 ไบต์

2ôH`255/)

ลองออนไลน์!

อย่างน้อยเราก็มีผู้สนับสนุนอย่างEmignaที่ใช้สามัญสำนึกบางอย่าง ... (นั่นคือสิ่งที่คุณได้รับจากการเล่นกอล์ฟทั้งวันและจากนั้นคุณเริ่มสร้างสิ่งต่าง ๆ เช่น2ô16öRć255/¸ìRಠ_ಠ)


สั้นลง 5 ไบต์:2ôH`žz/)
Emigna

@Emigna ความท้าทายถูกปิด แต่ ...
Erik the Outgolfer

1

เยลลี่ , 15 14 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

Ø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 ไบต์ขอบคุณ @EricTheOutgolfer


1

PHP, 72 ไบต์

เวอร์ชันเอาต์พุตอาร์เรย์ของJörgไม่สามารถเอาชนะได้ แต่มีตัวเลือกอื่น ๆ :

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

-Fทำงานเป็นท่อด้วย #ไม่สำคัญเอาต์พุต csv ธรรมดา

หรือ73 ไบต์ (ทำงานด้วย-R):

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

74 ไบต์ด้วยช่องว่าง:

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

ไม่ธรรมดา81 ไบต์ :

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



1

SmileBASIC ขนาด 50 ไบต์

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

สตริงเลขฐานสิบหกจะถูกแปลงเป็นตัวเลขโดยใช้ VAL () จากนั้น RGBREAD จะแยกแต่ละไบต์ #L เป็นค่าคงที่ที่มีค่า 256

RGBREAD ได้รับการออกแบบมาเพื่อแยกช่องสัญญาณจากสี ARGB แต่จริงๆแล้วมันจะแยกจำนวนเต็ม 4 ไบต์เป็น 4 ไบต์แยกกันดังนั้นลำดับจึงไม่สำคัญ


ฉันชอบที่จะเห็นการตอบสนองขั้นพื้นฐานเสมอแต่ฉันกลัวว่าคำตอบนี้อาจไม่ถูกต้องเนื่องจากมันใช้ตัวแปลงเลขฐานสิบหกเป็น rgba ในตัว
Taylor Scott

ฉันคิดว่ามันไม่นับเป็น hex-> rgba builtin เพราะต้องการขั้นตอนพิเศษในการแปลงสตริง hex เป็นจำนวนเต็ม
12Me21

ที่จริงแล้วเมื่อมองดูอีกครั้งฉันคิดว่าคุณพูดถูกการแปลงอย่างชัดเจนจากฐานสิบหกเป็น int จะทำให้ถูกต้อง
Taylor Scott




0

q / kdb +, 43 ไบต์

วิธีการแก้:

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

ตัวอย่าง:

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

คำอธิบาย:

{                                         } / 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 ไบต์

ต้องการ⎕IO←0ซึ่งเป็นค่าเริ่มต้นในหลาย ๆ ระบบ #แจ้งสำหรับการป้อนข้อมูลเป็นตัวพิมพ์ใหญ่โดยไม่ต้อง

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

ลองออนไลน์!

⎕D,⎕AD igits ตามด้วยA lphabet

⍞⍳⍨ ความพร้อมในการป้อนข้อความ (ความจำ: คอนโซลโดยอ้างข้อความ) และหาɩ nDex ของแต่ละตัวอักษรที่

4 2⍴r eshape เป็นสี่แถวสองคอลัมน์เมทริกซ์

 ไขว้ (เพราะการแปลงฐานทำงานในแนวคอลัมน์)

16⊥ ประเมินว่าเป็นฐานสิบหก

 ผลผลิต (ทำหน้าที่แยก 3 และ 16)

256÷⍨@3 แบ่ง 4 THองค์ประกอบโดย 256



0

Yabasic , 96 ไบต์

อีกคำตอบรับอินพุตเป็นสตริงและเอาต์พุตไปยังคอนโซล

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

ลองออนไลน์!


?คุณสามารถบันทึกไบต์โดยเอาแบ่งบรรทัดก่อน
12Me21

0

Excel VBA ขนาด 90 ไบต์

ฟังก์ชันหน้าต่าง VBE แบบไม่ระบุชื่อแบบทันทีที่รับอินพุตจากช่วง[A1]และผลลัพธ์ไปยังหน้าต่างทันที VBE

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.