Читати кольори по-моєму


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 І наступне питання - яка випромінювання краща.
tsh

Відповіді:


10

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

Повна програма. Підказки на STDIN для оригіналу, потім ціль, потім колір. Друкує результат для STDOUT.

⍞[⍞⍋⍞]

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

   підказка для оригіналу

⍞⍋ підкажіть для "Ціль" і знайдіть індекси в "Оригінал", які перетворили б "Оригінал" у "Ціль"

⍞[] Підкажіть для 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])

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


(C,F,T)=>T.replace(/\w/g,(x,i)=>C[F.search(x)-~i%2])зберегти один байт
tsh

@tsh Хороший. ^^
Арнальд

5

Стакс , 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))

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


Стара версія

Дякуємо Laikoni за скорочення 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 символів.
  • (!)оператор приймає в якості вхідних даних кольору і формат введення і повертає функцію , яка приймає в якості параметра вихідного формату і повертає перетворений колір. Виявилося, що версія pointfree була коротшою, але я почав з більш читаною версії:

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.
Олів'є Грегоар


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
}     


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




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форматі


Запропонувати 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]);
roofcat

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)))))

Безумовно

  (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?./))

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

Бере список (кольоровий, оригінальний, цільовий) як вхідний. Розбиває кожен вхідний рядок на компоненти, створює хеш-зіставлення вихідних клавіш на кольорові значення, шукає значення кольорів у цільовому порядку клавіш, а потім форматує результат.

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