Czytaj kolor na mój sposób

16

Różne systemy mają różne sposoby opisywania kolorów, nawet jeśli wszystkie mówią w przestrzeni RGBA. Preferowany może być programista front-end, który zna CSS #RRGGBBAA. Ale programiści Androida mogą preferować #AARRGGBB. Podczas obsługi formatu pliku AAS #AABBGGRRjest potrzebny. To zbyt mylące. Może potrzebujemy programu, który może konwertować różne formaty kolorów.

Wejście:

Dane wejściowe zawierają 3 części:

  • Kolor do przekształcenia (np. #1459AC0F), Ciąg rozpoczynający się od ostrego znaku, #po którym następuje 8 cyfr szesnastkowych.
  • Format danego koloru (np. #RRGGBBAA), Ciąg rozpoczynający się od, #po którym następuje 8 liter, które dzielą się na 4 różne grupy, a każda grupa jest jedną z RR/ GG/ BB/ AA.
  • Format do konwersji.

Wynik:

  • Wydrukuj kolor w przekonwertowanym formacie

Przypadki testowe:

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

Wejście / wyjście nie rozróżnia wielkości liter. Możesz wejść / wyjść w dowolny dopuszczalny sposób.

Zasady:

To jest kod golfowy, najkrótsze (w bajtach) kody każdej wygranej językowej

tsh
źródło
AARRGGBBjest obiektywnie najlepszym formatem kolorów. Jeśli coś oczekuje 24 bitów, RRGGBBa AARRGGBBzamiast tego dajesz 32 bity , może po prostu zignorować górny bajt i nadal działać.
12Me21
2
Kolor DEADBEEF wygląda trochę jak łosoś.
Magic Octopus Urn
1
Od lat jestem front-dev web developerem i do dziś nie słyszałem o #RRGGBBAA. Chciałbym, żeby więcej przeglądarek go wspierało.
DasBeasto
@ 12Me21 Następne pytanie brzmi, która endianizm jest lepsza.
tsh

Odpowiedzi:

10

APL (Dyalog Unicode) , 6 bajtów SBCS

Pełny program Monituje o STDIN dla oryginału, następnie celu, a następnie koloru. Wyświetla wynik do STDOUT.

⍞[⍞⍋⍞]

Wypróbuj online!

   monit o oryginał

⍞⍋ zapytaj o cel i znajdź indeksy w oryginale, które przekształcą go w cel

⍞[] Monituj o Kolor i użyj wyżej uzyskanych wskaźników, aby zmienić kolejność Kolorów

Adám
źródło
8

JavaScript (ES6), 53 52 bajty

Zapisano 1 bajt dzięki @tsh

Staje wejścia jako 3 różnych parametrach: (Color, From, To).

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

Wypróbuj online!

Arnauld
źródło
(C,F,T)=>T.replace(/\w/g,(x,i)=>C[F.search(x)-~i%2])zapisz jeden bajt
tsh
@tsh Nice one. ^^
Arnauld
5

Stax , 8 bajtów

ç▼☺↔kàÅJ

Uruchom i debuguj

Ten program pobiera dane wejściowe w tym formacie.

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

Oto skomentowana nie rozpakowana wersja tego samego programu.

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

Uruchom ten

rekurencyjny
źródło
4

Python 2 , 59 bajtów

lambda c,o,t:'#'+''.join(c[o.find(v):][:2]for v in t[1::2])

Wypróbuj online!

TFeld
źródło
4

Retina 0.8.2 , 33 bajty

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

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

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

Dla każdej pary identycznych znaków spójrz wstecz na kolejną kopię tej pary, a następnie na 9. i 8. postać i zastąp parę tymi znakami. Jest to możliwe tylko dla par znaków w formacie docelowym i zastępuje je pożądanym wynikiem.

.*#
#

Usuń kolor i format źródłowy.

Neil
źródło
3

Haskell , 108 104 100 94 87 bajtów

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

Wypróbuj online!


Stara wersja

Dziękujemy Laikoni za skrócenie 6 bajtów poprzez znalezienie krótszego sposobu użycia 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

Wypróbuj online!

Wyjaśnienie:

  • gdy pfunkcja „Analizuje” ciąg ignorując wiodącą# i powracających grup (list) 2 znaków.
  • (!)użytkownik pobiera jako dane wejściowe kolor i format sygnału wejściowego i zwraca funkcję, której parametr wyjściowy format i zwraca przekonwertowany kolor. Okazało się, że wersja pointfree była krótsza, ale zacząłem od wersji bardziej czytelnej:

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

Wypróbuj online!

Cristian Lupascu
źródło
3

Perl 5 -p , 33 32 27 bajtów

Podaj dane w kolejności: cel, oryginał, liczba

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

Wypróbuj online!

Dla każdego znaku na wejściu znajdź ten sam znak parzystą liczbę miejsc do przodu, a następnie przejdź o 10 znaków do przodu i weź ten znak jako zamiennik. Jeśli nie możesz wykonać tych kroków, zastąp je niczym.

    +--even-+----10---+   
    |       |         |
#AARRGGBB #RRGGBBAA #12345678
    |    >-will get removed-<
    v
    2
Ton Hospel
źródło
2

05AB1E , 10 bajtów

2FI2ô™J}I‡

Wypróbuj online!


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.

Działa to, ponieważ zmieniam dane wejściowe z:

AARRGGBB

Do:

AaRrGgBb

Tak więc każda wartość jest mapowana jednoznacznie, więc mogę użyć transliteracji.

Argumenty są odwrócone.

Urna Magicznej Ośmiornicy
źródło
2

Java 10, 179 105 102 bajtów

(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;}

Ogromne -77 bajtów dzięki @ OlivierGrégoire .

Wyjaśnienie:

Wypróbuj online.

(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
Kevin Cruijssen
źródło
1
105 bajtów Buduje ciąg z celu poprzez znalezienie elementu docelowego w formacie źródłowym.
Olivier Grégoire,
@ OlivierGrégoire Wiedziałem, że byłoby to możliwe bez tej nieznośnej mapy. Wielkie dzięki, -74 bajty tutaj!
Kevin Cruijssen
102 bajty , przechodząc na Javę 10, która jest teraz obsługiwana w TIO.
Olivier Grégoire
2

J , 5 bajtów

/:i./

Lewym argumentem jest kolor. Właściwym argumentem jest macierz znaków, w której pierwszy wiersz jest formatem docelowym, a drugi wiersz jest formatem oryginalnym. Wypróbuj online!

FrownyFrog
źródło
1

CJam, 14 bajtów

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

Wypróbuj online!

Dane wejściowe to tablica w odwrotnej kolejności.

{
 `#\      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
źródło
0

Python 2, 62 bajty

lambda c,s,e:[c[s.index(e[i]):][:2]for i in range(1,len(e),2)]
sonrad10
źródło
0

SmileBASIC, 144 bajty

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
źródło
0

Czerwony , 154 120 114 bajtów

func[c o t][g: func[q][parse q[skip collect 4 keep 2 skip]]
prin"#"foreach p g t[prin pick g c index? find g o p]]

Wypróbuj online!

Galen Iwanow
źródło
0

Galaretka , 6 bajtów

ẹЀQị⁵

Wypróbuj online!

Pełny program

Argument 1: Oryginalny
argument 2: Docelowy
argument 3: Kolor

Erik the Outgolfer
źródło
0

C (brzęk) , 89 bajtów

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

Wypróbuj online!

Pobiera wartość wejściową w a, w formacie wejściowym i wyjściowym w iformacie o. Zwraca wartość wb

Drobne oszustwo: zapisywanie wyniku bzamiast drukowania w celu zaoszczędzenia bajtów. Pytanie tego nie zabrania.

C (brzęk) , 100 bajtów

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

Wypróbuj online!

C (gcc) , 181 bajtów

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

Wypróbuj online!

Tworzy RGBAwartość w c[]tablicy na podstawie formatu i, a następnie drukuje w oformacie

GPS
źródło
Zaproponuj char*a,b[10],*i,*o;f(x)zamiast char *a,b[10],*i,*o;f(x,y)i x+=2)bcopy(a+(long)index(i,o[x])-i,b+x,2);zamiastb[x++]=a[y=index(i,o[x])-i],b[x++]=a[y+1]);
ceilingcat
0

Clojure 1.8, 156 bajtów

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

Nie golfił

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

Wypróbuj online nie ma wsparcia Clojure 1.8. Bardzo dziwny!

Jozuego
źródło
0

Perl 6 , 55 51 46 bajtów

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

Wypróbuj online!

Pobiera na wejściu listę (kolor, oryginał, cel). Dzieli każdy ciąg wejściowy na komponenty, tworzy klucze źródłowe odwzorowujące wartości skrótu na wartości kolorów, wyszukuje wartości kolorów w kolejności klawiszy docelowych, a następnie formatuje wynik.

nwellnhof
źródło