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

счет

, выигрывает код с наименьшим количеством байтов.

Obsdarek
источник
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Деннис
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))
Крейга Эйра
@CraigAyre, evalотличная альтернатива parseIntдля игры в гольф, спасибо!
Рик Хичкок
@RickHitchcock, не беспокойся! Вы также можете сократить пару байтов с помощью регулярного выражения /../g. Вы могли бы уменьшить его еще больше, используя replaceболее match/map
Крейг Эйр
О, я вижу, что правила изменились, поэтому начальный знак фунта больше не требуется.
Рик Хичкок
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

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 байтов . Я не очень большой игрок в гольф, так что это может быть короче.

Конор О'Брайен
источник
2

05AB1E , 9 байт

2ôH`255/)

Попробуйте онлайн!

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

Эрик Outgolfer
источник
На 5 байт короче:2ôH`žz/)
Emigna
@Emigna Тем не менее проблема была закрыта ...
Эрик 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

fireflame241
источник
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?>)
Titus
источник
1

Excel, 99 байт

=HEX2DEC(LEFT(A1,2))&","&HEX2DEC(MID(A1,3,2))&","&HEX2DEC(MID(A1,5,2))&","&HEX2DEC(RIGHT(A1,2))/256
Wernisch
источник
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 отдельных байта, поэтому порядок не имеет значения.

12Me21
источник
Мне всегда нравится видеть базовые ответы, но я боюсь, что этот ответ может быть недействительным, поскольку он использует встроенную функцию для преобразования шестнадцатеричного в rgba
Тейлор Скотт
Я думаю, что он не считается встроенным hex-> rgba, потому что для преобразования шестнадцатеричной строки в целое число требуется дополнительный шаг.
12Me21
На самом деле, глядя на это снова, я думаю, что вы правы, явное преобразование из hex в int сделало бы его действительным.
Тейлор Скотт
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 
streetster
источник
0

APL (Dyalog) , 24 байта

требует ⎕IO←0 по умолчанию во многих системах. Запрашивает ввод в верхнем регистре без #.

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

Попробуйте онлайн!

⎕D,⎕AD igits следует A lphabet

⍞⍳⍨ запросить ввод текста (мнемоника: консоль с кавычками) и найти запросить кавычками индекс каждой буквы в этом

4 2⍴R- форма в виде четырехрядной двухколоночной матрицы

 транспонировать (потому что базовое преобразование работает по столбцам)

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

 yield (служит для разделения 3 и 16)

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

Адам
источник
0

Ябасич , 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
Тейлор Скотт
источник
0

Vim, 46 байт

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

Принимает ввод без #и возвращает, печатая на экране.

Герман Л
источник