Leia cores do meu jeito

16

Sistemas diferentes têm maneiras diferentes de descrever cores, mesmo que todos falem no espaço RGBA. Um desenvolvedor front-end familiarizado com CSS pode preferir #RRGGBBAA. Mas os desenvolvedores do Android podem preferir #AARRGGBB. Ao manipular o formato de arquivo AAS, #AABBGGRRé necessário. Isso é muito confuso. Talvez precisemos de um programa que possa converter entre diferentes formatos de cores.

Entrada:

A entrada contém 3 partes:

  • A cor a ser transformada (por exemplo #1459AC0F), uma sequência que começa com um sinal nítido #seguido por 8 dígitos hexadecimais.
  • O formato da cor fornecida (por exemplo #RRGGBBAA), uma sequência iniciada #por 8 letras, que se enquadram em 4 grupos diferentes e cada grupo é um de RR/ GG/ BB/ AA.
  • O formato para o qual converter.

Resultado:

  • Saída da cor no formato convertido

Casos de teste:

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

Entrada / saída não diferenciam maiúsculas de minúsculas. Você pode entrada / saída de qualquer maneira aceitável.

Regras:

Esse é o código de golfe, os códigos mais curtos (em bytes) de cada idioma

tsh
fonte
AARRGGBBé objetivamente o melhor formato de cor. Se algo espera 24 bits RRGGBBe você dá 32 bits AARRGGBB, pode ignorar o byte superior e continuar funcionando.
12Me21
2
A cor DEADBEEF parece um pouco Salmon-y.
Urna de polvo mágico
1
Sou um desenvolvedor web front-end há anos e nunca tinha ouvido falar em #RRGGBBAA até hoje, gostaria que mais navegadores o suportassem.
DasBeasto 22/03
@ 12Me21 E a próxima pergunta é qual endianness é melhor.
tsh

Respostas:

10

APL (Dyalog Unicode) , SBCS de 6 bytes

Programa completo. Solicita no STDIN o Original, o Destino e a Cor. Imprime o resultado em STDOUT.

⍞[⍞⍋⍞]

Experimente online!

   solicitação de Original

⍞⍋ solicitar Target e encontrar os índices no Original que tornariam Original no Target

⍞[] Solicite cores e use os índices obtidos acima para reordenar cores

Adão
fonte
8

JavaScript (ES6), 53 52 bytes

Guardado 1 byte graças a @tsh

Toma entrada como 3 parâmetros distintos: (Color, From, To).

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

Experimente online!

Arnauld
fonte
(C,F,T)=>T.replace(/\w/g,(x,i)=>C[F.search(x)-~i%2])salvar um byte
tsh
@tsh Nice. ^^
Arnauld 22/03
5

Stax , 8 bytes

ç▼☺↔kàÅJ

Execute e depure

Este programa recebe entrada neste formato.

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

Aqui está a versão descompactada e não empacotada comentada do mesmo programa.

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

Execute este

recursivo
fonte
4

Python 2 , 59 bytes

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

Experimente online!

TFeld
fonte
4

Retina 0.8.2 , 33 bytes

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

Experimente online! O link inclui casos de teste. Explicação:

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

Para cada par de caracteres idênticos, procure outra cópia desse par e, em seguida, o nono e o oitavo caracteres antes e substitua o par por esses caracteres. Isso só é possível para os pares de caracteres no formato de destino e os substitui pelo resultado desejado.

.*#
#

Exclua a cor e o formato de origem.

Neil
fonte
3

Haskell , 108 104 100 94 87 bytes

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

Experimente online!


Versão antiga

Agradecemos a Laikoni por reduzir 6 bytes, encontrando uma maneira mais curta de usar 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

Experimente online!

Explicação:

  • a pfunção "analisa" uma string ignorando os #grupos inicial e retornado (listas) de 2 caracteres.
  • o (!)operador toma como entrada a cor e o formato de entrada e retorna uma função que assume como parâmetro o formato de saída e retorna a cor convertida. Descobriu-se que a versão pointfree era mais curta, mas comecei com a versão mais legível:

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

Experimente online!

Cristian Lupascu
fonte
3

Perl 5 -p , 33 32 27 bytes

Dê entrada na ordem: destino, original, número

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

Experimente online!

Para cada caractere na entrada, encontre o mesmo caractere com um número par de lugares para a frente e, a partir daí, prossiga com mais 10 caracteres e leve esse caractere como substituto. Se você não pode executar essas etapas, substitua por nada.

    +--even-+----10---+   
    |       |         |
#AARRGGBB #RRGGBBAA #12345678
    |    >-will get removed-<
    v
    2
Ton Hospel
fonte
2

05AB1E , 10 bytes

2FI2ô™J}I‡

Experimente 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.

Isso funciona porque eu altero a entrada de:

AARRGGBB

Para:

AaRrGgBb

Portanto, cada valor é mapeado exclusivamente, para que eu possa usar o transliterado.

Os argumentos são invertidos.

Urna de polvo mágico
fonte
2

Java 10, 179 105 102 bytes

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

Surpreendente -77 bytes graças a @ OlivierGrégoire .

Explicação:

Experimente 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
fonte
1
105 bytes Cria a cadeia de caracteres do destino localizando o elemento de destino no formato de origem.
Olivier Grégoire
@ OlivierGrégoire Eu sabia que seria possível sem esse mapa traquina. Muito obrigado, -74 bytes aqui!
Kevin Cruijssen 22/03
102 bytes , alternando para o Java 10, que agora é suportado no TIO.
Olivier Grégoire
2

J , 5 bytes

/:i./

O argumento da esquerda é a cor. O argumento correto é uma matriz de caracteres em que a primeira linha é o formato de destino e a segunda linha é o formato original. Experimente online!

FrownyFrog
fonte
1

CJam, 14 bytes

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

Experimente Online!

Entrada é uma matriz na ordem inversa.

{
 `#\      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
fonte
0

Python 2, 62 bytes

lambda c,s,e:[c[s.index(e[i]):][:2]for i in range(1,len(e),2)]
sonrad10
fonte
0

SmileBASIC, 144 bytes

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
fonte
0

Vermelho , 154 120 114 bytes

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

Experimente online!

Galen Ivanov
fonte
0

Gelatina , 6 bytes

ẹЀQị⁵

Experimente online!

Programa completo.

Argumento 1:
Argumento original 2:
Argumento de destino 3: Cor

Erik, o Outgolfer
fonte
0

C (clang) , 89 bytes

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

Experimente online!

Recebe o valor de entrada a, no formato in ie out, no formato in o. Retorna o valor emb

Fraude menor: armazenar o resultado em bvez de imprimir para salvar bytes. A pergunta não a desaprova.

C (clang) , 100 bytes

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

Experimente online!

C (gcc) , 181 bytes

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

Experimente online!

Cria um RGBAvalor na c[]matriz com base no formato ie depois imprime no oformato

GPS
fonte
Sugerir em char*a,b[10],*i,*o;f(x)vez de char *a,b[10],*i,*o;f(x,y)e em x+=2)bcopy(a+(long)index(i,o[x])-i,b+x,2);vez deb[x++]=a[y=index(i,o[x])-i],b[x++]=a[y+1]);
tetocat
0

Clojure 1.8, 156 bytes

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

Experimente online não tem suporte ao Clojure 1.8. Muito estranho!

Joshua
fonte
0

Perl 6 , 55 51 46 bytes

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

Experimente online!

Leva uma lista (cor, original, destino) como entrada. Divide cada sequência de entrada em componentes, cria chaves de origem de mapeamento Hash para valores de cores, pesquisa valores de cores na ordem das chaves de destino e formata o resultado.

Nwellnhof
fonte