Читайте цвет по-моему

16

Разные системы по-разному описывают цвета, даже если все они говорят в пространстве RGBA. Разработчик внешнего интерфейса, знакомый с CSS, может предпочесть #RRGGBBAA. Но разработчики Android могут предпочесть #AARRGGBB. При обработке формата файла AAS, #AABBGGRRнеобходимо. Это слишком запутанно. Может быть, нам нужна программа, которая может конвертировать различные цветовые форматы.

Входные данные:

Вход содержит 3 части:

  • Цвет, который нужно преобразовать (например #1459AC0F), строка, начинающаяся с острого знака, #за которым следуют 8 шестнадцатеричных цифр.
  • Формат данного цвета (например #RRGGBBAA), строка, начинающаяся с #8 букв, которые попадают в 4 разные группы, и каждая группа является одной из RR/ GG/ BB/ AA.
  • Формат для преобразования в.

Выход:

  • Выведите цвет в преобразованном формате

Тестовые случаи:

Color, OriginalFormat, TargetFormat -> Result
#12345678, #RRGGBBAA, #AARRGGBB -> #78123456
#1A2B3C4D, #RRGGBBAA, #AABBGGRR -> #4D3C2B1A
#DEADBEEF, #AARRGGBB, #GGBBAARR -> #BEEFDEAD

Ввод / вывод нечувствителен к регистру. Вы можете вводить / выводить любым приемлемым способом.

Правила:

Это код гольф, самые короткие (в байтах) коды каждого языка выигрыша

ТТГ
источник
AARRGGBBобъективно лучший цветовой формат. Если что-то ожидает 24-битное значение, RRGGBBа вы AARRGGBBвместо этого задаете 32-битное , оно может просто игнорировать старший байт и все равно работать.
12Me21
2
Цвет DEADBEEF выглядит немного Salmon-y.
Волшебный Осьминог Урна
1
Я уже много лет являюсь разработчиком веб-интерфейса, и до сегодняшнего дня я никогда не слышал о #RRGGBBAA, хотелось бы, чтобы больше браузеров поддерживали его.
DasBeasto
@ 12Me21 И следующий вопрос: какой порядок байтов лучше?
1856 года

Ответы:

10

APL (Dyalog Unicode) , 6 байтов SBCS

Полная программа. Запрашивает STDIN для Оригинал, затем Цель, затем Цвет. Результат печати в STDOUT.

⍞[⍞⍋⍞]

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

   запросить оригинал

⍞⍋ запросить Target и найти индексы в оригинале, которые сделают оригинал в Target

⍞[] Запросите Color и используйте полученные выше индексы для изменения порядка Color

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

JavaScript (ES6), 53 52 байта

Сохранено 1 байт благодаря @tsh

Принимает входной сигнал в виде 3 -х различных параметров: (Color, From, To).

(C,F,T)=>T.replace(/\w/g,(x,i)=>C[F.search(x)-~i%2])

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

Arnauld
источник
(C,F,T)=>T.replace(/\w/g,(x,i)=>C[F.search(x)-~i%2])сохранить один байт
tsh
@tsh Хороший. ^^
Арнаулд
5

Stax , 8 байт

ç▼☺↔kàÅJ

Запустите и отладьте его

Эта программа принимает данные в этом формате.

"{Color}" "{OriginalFormat}" "{TargetFormat}"

Вот прокомментированная распакованная версия той же программы.

u       drop duplicated characters from target format
{       for each character remaining in target format, map using block...
  [     duplicate original format at second position in stack
  |I    get all indices of target character in original format
  xs@   retrieve characters from those indices from the color string
m       perform map
        output implicitly when complete

Запустите этот

рекурсивный
источник
4

Сетчатка 0.8.2 , 33 байта

(.)(?<=(..).{7}\1\1.*)\1
$2
.*#
#

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:

(.)(?<=(..).{7}\1\1.*)\1
$2

Для каждой пары идентичных символов найдите другую копию этой пары, а затем 9-й и 8-й символы до этого и замените пару этими символами. Это возможно только для пар символов в целевом формате и заменяет их желаемым результатом.

.*#
#

Удалите цвет и исходный формат.

Нил
источник
3

Haskell , 108 104 100 94 87 байт

(s,(r@(x,y):z))!c|x==c=(s++[y],z)|(p,q)<-(s,z)!c=(p,r:q)
c%i=fst.(foldl(!)("",zip i c))

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


Старая версия

Спасибо Лайкони за сокращение 6 байт и поиск более короткого способа использования lookup!

f(Just x)=x
p('#':z)=p z
p(x:y:z)=[x,y]:p z
p e=[]
c!i=('#':).(f.(`lookup`zip(p i)(p c))=<<).p

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

Объяснение:

  • то pфункция «разбирает» строка, игнорируя ведущие #и возвращающиеся группы (списки) 2 символов.
  • (!)оператор принимает в качестве входных данных цвета и формат ввода и возвращает функцию , которая принимает в качестве параметра выходного формата и возвращает преобразованный цвет. Оказалось, что точечная версия была короче, но я начал с более читаемой версии:

f c i o='#':concat[x#zip(p<$>[i,c])|x<-p o]

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

Кристиан Лупаску
источник
3

Perl 5 -p , 33 32 27 байт

Введите данные в порядке: цель, оригинал, номер

#!/usr/bin/perl -p
s%.%$2x/(..)+$&(.){10}/g%eg

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

Для каждого символа на входе найдите один и тот же символ на четное число мест вперед, затем оттуда на 10 символов вперед и возьмите этот символ в качестве замены. Если вы не можете выполнить эти шаги, замените их ничем.

    +--even-+----10---+   
    |       |         |
#AARRGGBB #RRGGBBAA #12345678
    |    >-will get removed-<
    v
    2
Тон Хоспел
источник
2

05AB1E , 10 байтов

2FI2ô™J}I‡

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


2F     }   # Loop twice...
  I        # First 2 inputs.
   2ô™     # Title case in pairs of 2.
      J    # Rejoin together.
        I  # Last input (The color).
         ‡ # Transliterate, put color in pattern from a into pattern from b.

Это работает, потому что я изменяю ввод с:

AARRGGBB

Для того, чтобы:

AaRrGgBb

Таким образом, каждое значение отображается однозначно, тогда я могу использовать транслитерацию.

Аргументы поменялись местами.

Урна волшебного осьминога
источник
2

Java 10, 179 105 102 байта

(a,b,c)->{var r="#";for(int i=1,t;i<9;)r+=a.substring(t=b.indexOf(c.substring(i,i+=2)),t+2);return r;}

Колоссальные -77 байт благодаря @ OlivierGrégoire .

Объяснение:

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

(a,b,c)->{            // Method with String as three parameters and return-type
  var r="#";          //  Result-String, starting at "#"
  for(int i=1,t;i<9;  //  Loop `i` from 1 to 9 (exclusive)
    r+=               //   Append the result with:
       a.substring(   //    A substring from the first input,
        t=b.indexOf(  //    where an index is determined in the second input
           c.substring(i,i+=2)),t+2);
                      //    based on a substring of the third input
    return r;}        //  Return the result-String
Кевин Круйссен
источник
1
105 байт Создает строку из цели путем нахождения целевого элемента в исходном формате.
Оливье Грегуар
@ OlivierGrégoire Я знал, что это было бы возможно без этой надоедливой карты. Большое спасибо, -74 байта прямо там!
Кевин Круйссен
102 байта путем переключения на Java 10, который теперь поддерживается на TIO.
Оливье Грегуар,
2

J 5 байт

/:i./

Левый аргумент - это цвет. Правый аргумент - это символьная матрица, где первая строка - это целевой формат, а вторая строка - оригинальный формат. Попробуйте онлайн!

FrownyFrog
источник
1

CJam, 14 байтов

{'#\1f>2f/~er}

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

Ввод - это массив в обратном порядке.

{
 `#\      e# Push '#'+[input array] on to stack
  1f>     e# Remove the '#' symbol from each input string
  2f/     e# Split each input string into an array of substrings of length 2.
  ~       e# Dump the substring-arrays from the container array onto the stack
  er      e# Perform a string replace operation
}     
geokavel
источник
0

Python 2, 62 байта

lambda c,s,e:[c[s.index(e[i]):][:2]for i in range(1,len(e),2)]
sonrad10
источник
0

SmileBASIC, 144 байта

DEF R C,I,O
C[0]="&H
A=R+G+B
RGBREAD VAL(C)OUT VAR(I[1]),VAR(I[3]),VAR(I[5]),VAR(I[7])?"#";RGB(VAR(O[1]),VAR(O[3]),VAR(O[5]),VAR(O[7]))END
12Me21
источник
0

C (лязг) , 89 байт

char *a,b[10],*i,*o;f(x,y){*b=*a;for(x=1;x<8;b[x++]=a[y=index(i,o[x])-i],b[x++]=a[y+1]);}

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

Принимает входное значение в a, в формате в iи в формате в o. Возвращает значение вb

Незначительный чит: сохранение результата bвместо печати для сохранения байтов. Вопрос не запрещает это.

C (лязг) , 100 байт

char *a,b[10],*i,*o;f(x,y){*b=*a;for(x=1;x<8;b[x]=a[y=index(i,o[x])-i],b[x+1]=a[y+1],x+=2);puts(b);}

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

C (gcc) , 181 байт

char *a,*i,*o;c[4],x,y,z;g(x){x=x==82?0:x==71?1:x==66?2:3;}f(){a++;for(;z<2;z++){i=(z?o:i)+1;for(y=0;y<7;z?printf("%s%2X","#"+!!y,c[g(i[y])]):sscanf(a+y,"%2X",&c[g(i[y])]),y+=2);}}

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

Создает RGBAзначение в c[]массиве на основе формата i, затем печатает в oформате

GPS
источник
Предлагаю char*a,b[10],*i,*o;f(x)вместо char *a,b[10],*i,*o;f(x,y)и x+=2)bcopy(a+(long)index(i,o[x])-i,b+x,2);вместоb[x++]=a[y=index(i,o[x])-i],b[x++]=a[y+1]);
потолок кошка
0

Clojure 1,8, 156 байт

(fn[c o t](reduce #(str %(val %2))""(sort-by key(reduce-kv #(let[s(clojure.string/index-of t(nth o %2))](assoc %(if(contains? % s)(inc s)s)%3)){}(vec c)))))

Ungolfed

  (fn [c o t]
    (reduce
     #(str % (val %2))
     ""
     (sort-by key
              (reduce-kv
               #(let [s (clojure.string/index-of t (nth o %2))]
                  (assoc %
                         (if (contains? % s) (inc s) s)
                         %3))
               {}
               (vec c)))))

Попробуйте онлайн не имеет поддержки Clojure 1.8. Очень странный!

Джошуа
источник
0

Perl 6 , 55 51 46 байт

{[~] %(@^b Z=>@^a){@^c}}o*.map(*.comb(/\w?./))

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

Принимает (цветной, оригинальный, целевой) список в качестве входных данных. Разбивает каждую входную строку на компоненты, создает исходные ключи Hash, сопоставляющие значения цвета, ищет значения цвета в целевом порядке ключей, а затем форматирует результат.

nwellnhof
источник