Як конвертувати 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

Оцінка балів

, виграє код з найменшою кількістю байтів.


Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
Денніс

1
Чи потрібно від нас приймати "шістнадцятковий код" як рядок ? Ви говорите, що ми можемо прийняти його без ведучого #, і в цьому випадку це було б просто 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'));


Рік, схоже, у нас є остання специфікація для цього, щоб ви могли оновити свою відповідь.
Кудлатий

Як і коментар @ Shaggy, ви можете зберегти кілька байт, використовуючи evalзамість parseInt:s=>s.match(/../g).map((x,i)=>eval('0x'+x)/(i-3?1:255))
Craig Ayre

@CraigAyre, evalце чудова альтернатива parseIntдля цілей гольфу, дякую!
Рік Хічкок

@ RickHitchcock, не хвилюйся! Ви також можете голити пару байтів з регулярного вираження, використовуючи /../g. Можливо, ви зможете зменшити її ще більше, використовуючи replaceнад match/map
Craig Ayre

О, я бачу, правила змінилися, тому початковий знак фунта більше не потрібен.
Рік Хічкок

3

Japt , 13 байт

Приймає введення як рядок, без ведучого #. Виводить значення rgba як масив.

ò ®nG
pUo /#ÿ

Перевірте це


Пояснення

Ми неявно приймаємо рядок як вхід через змінну 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

05AB1E , 9 байт

2ôH`255/)

Спробуйте в Інтернеті!

Принаймні, у нас є прихильники на кшталт Еміньї, які часто використовують здоровий глузд ... (це те, що ти отримуєш для гольфу цілий день, а потім починаєш випускати такі речі, як 2ô16öRć255/¸ìRಠ_ಠ)


На 5 байт коротше:2ôH`žz/)
Emigna

@Emigna Виклик все-таки був закритий ...
Ерік Переможник

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 байти

Вихідна версія масиву Йорга неперевершена; але є й інші варіанти:

<?=($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

Excel, 99 байт

=HEX2DEC(LEFT(A1,2))&","&HEX2DEC(MID(A1,3,2))&","&HEX2DEC(MID(A1,5,2))&","&HEX2DEC(RIGHT(A1,2))/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
Тейлор Скотт

Я думаю, що це не зараховується як hex-> rgba вбудований, оскільки йому потрібен додатковий крок для перетворення шістнадцяткової рядка в ціле число.
12Me21

Насправді, дивлячись на це ще раз, я думаю, що ти маєш рацію, явна конверсія з шестигранної в інту зробить її дійсною.
Тейлор Скотт


0

JS ES2015, 84 байти

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

це функція. Запустити його за допомогою

( CODE )("#00ff0080")


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 запалює, а потім A lphabet

⍞⍳⍨ запит на введення тексту (мнемонічний: консоль з цитатою) і знайдіть ɩ ndex кожної літери в цьому

4 2⍴r сформуйте як чотири рядку матриці двох стовпців

 транспонировать (тому що базове перетворення працює стовпцем)

16⊥ оцінити як базу шістнадцять

 врожайність (служить для розділення 3 і 16)

256÷⍨@3 розділити 4- й елемент на 256




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

0

Vim, 46 байт

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

Здійснює введення без #і повертається, друкуючи на екрані.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.