Você é desenvolvedor da Web e seu chefe decidiu atualizar o site da empresa. Ele decidiu que menos cor é melhor, mas ele quer que o site tenha a mesma aparência. Você decide justamente que ele não tem idéia do que está falando, mas vai tentar de qualquer maneira, porque está entediado. Como a empresa possui milhares de páginas da Web e cada uma possui seu próprio CSS, você decide escrever um script para fazer as alterações necessárias. Não é necessário analisar o HTML .
Atualmente, todas as páginas usam uma sequência como rgb(255,0,0)
para uma cor. Dadas as três valores decimais que representam os valores RGB de um atributo de cor CSS (nessa ordem), retorno ou imprimir a representação de cadeia mais curta do que a cor, de tal forma que é utilizável para CSS assim: color:<your-result-here>;
.
Aqui está uma tabela completa de palavras-chave CSS Color válidas . Eles não diferenciam maiúsculas de minúsculas.
Exemplos:
Observe que as cores podem ser definidas com 12 ou 24 bits. O padrão #ABC
é uma versão mais curta do #AABBCC
. Chuck Norris é uma cor .
Seu programa terá apenas 3 números inteiros, não uma string (com exceção do "bônus" mencionado posteriormente).
0, 0, 0 -> #000 (same as #000000, but shorter)
255, 0, 0 -> red
0, 128, 128 -> TEAL
139, 0, 0 -> DarkRed (OR #8B0000)
72, 61, 139 -> #483D8B
255, 255, 254 -> #fffffe
255, 85, 255 -> #f5f (same as #ff55ff, but shorter)
Pontuação / Regras
- O menor código vence!
- As brechas padrão não são permitidas , com exceção dos embutidos.
- -50% bytes (o bônus é arredondado para baixo) se você aceitar qualquer * seletor de cores válido e imprimir o menor. Então
DarkSlateBlue
seria saída#483D8B
,#F00
saídasred
, etc.- * Isso inclui apenas RGB, códigos hexadecimais e nomes.
- Observe que algumas cores têm nomes alternativos devido ao X11 (como
Fuchsia
eMagenta
, ouCyan
eAqua
). Os nomes alternativos estão incluídos na lista vinculada de palavras-chave de cores CSS, de acordo com o padrão W3.
- CSS3 é Turing completo . Isso valeria uma recompensa.
Editar:
- EXECUTE SEU CÓDIGO NOS CASOS DE TESTE!
#000
? E se menos de 6 dígitos são permitidos, por que não#0
? w3schools.com/cssref/css_colors.asp , o CSSRespostas:
Perl, 212 - 50% = 106 bytes
Com novas linhas adicionadas:
Casos de teste
Saída
Perl, sem bônus, 144 bytes
Com novas linhas adicionadas:
Graphics::ColorNames
não é um módulo básico, mas existe desde 2001. Pode ser necessário instalá-lo via:A representação hexadecimal é preferida se o nome da cor tiver o mesmo comprimento.
Casos de teste
Saída
fonte
C # 6277 bytes / 2 bônus = 264
EDIT: Woot! Finalmente recebi a resposta bônus com uma pontuação mais baixa que a resposta básica!
Eu escrevi apenas uma função. Requer uma
using
declaração (incluída).O C # possui uma boa lista de cores conhecidas para trabalhar, mas insiste em incluir o canal Alpha. As cores conhecidas também incluem todas as cores do sistema, duas das quais com nomes com menos de 7 caracteres, portanto, elas precisam ser removidas.
Aqui está a solução bônus, suportando formatos como:
12, 34, 56
#123
#123456
DarkSlateBlue
Completamente jogado:
Recuo e novas linhas para maior clareza:
C #, 265 bytes
Aqui está a solução básica.
Recuo e novas linhas para maior clareza:
fonte
Mathematica
207 242500-250 = 250 bytesAtualização:
funciona com entradas que consistem em triplos rgb, nomes de cores ou números hexadecimais.
A saída com profundidade de cor (12 bits) agora funciona bem, graças a um excelente artigo sobre Redução de profundidade de bit de cor . A idéia básica é que, se um RGB triplo {r, g, b}, em que r, g e b estiverem no intervalo de 0 a 255, (por exemplo, hex 00-ff), possa ser representado sem perda como um número em o intervalo de 0 a 15 (ou seja, 0-f), pode-se usar o número hexadecimal de 3 dígitos em vez do número de 6 dígitos. Acontece que isso ocorrerá sempre que 17 (ie 255/15) divide r, g e b.
Somente funções internas são usadas. O Mathematica possui regras para substituir nomes de cores HTML por triplos RGB. Por exemplo, uma regra é
"Teal"-> RGBColor[0, 128, 128]
. Quando essas regras são invertidas, os valores rgb (recalibrados para o intervalo, {0, 255}) podem ser substituídos por nomes de cores.Exemplos
Código não comentado e comentado
(* regras para substituir um nome de cor por uma amostra de cor, por exemplo,
RGBColor{255,17,0}
(* regras para substituir uma lista de 3 números inteiros pelo respectivo nome de cor, se houver um. E as mesmas regras, invertidas. *)
(* testa se uma cor hexadecimal de 24 bits pode ser representada como uma cor de 12 bits sem perda.
reduce
pode alterar a expressão de 24 bits para uma expressão de 12 bits. *)(* A lista RGB foi alterada para um número hexadecimal *)
(* Número hexadecimal alterado para lista RGB. *)
(* Mais conversões *)
(* escolhe a menor expressão CSS válida de uma cor *)
(* converte qualquer entrada em uma lista RGB e chama
f
*)fonte
FF
na Base 16? Então isso deve fazer#FFFFFF
, que é mais longo que o branco. Estou achando#000
incomum, mas analisarei as peculiaridades do CSS para ter certeza.#FFF
é igual a#FFFFFF
(todos os bits um) que é igual awhite
. Além disso,#0
é inválido porque não é nem 24 bits nem 12 bitsCoffeeScript,
411 404 388 384382/2 = 191UPD: Certeza de que é o resultado final
Espero que esteja tudo bem de usar
window.document.*
. Verifique argb
função eeval
ligue.Resultado dos testes
Código comentado
Isso economizará alguns bytes.
q
A função colocará a cor de entradadocument.body.style.color
e será compilada comorgb(...)
. Também armazenará o resultado comohexColor:inputColor
emd
. Observe oeval
uso.rgb(100,100,100)
é uma chamada de função JavaScript válida com três argumentos numéricos.rgb
A função converterá argumentos em uma notação HEX 24/12 única (como#fff
,#f0f0f0
).Divida a string em uma matriz de nomes de cores, crie um objeto de pesquisa.
E retorne HEX se não houver uma variante mais curta
d
.fonte
Caneta,
238234/2 = 117Mais solução semelhante a CSS! A caneta já possui um ótimo suporte para manipulação de cores, portanto, a função desejada é muito pequena e não é muito praticada.
f(c){for n in split(' ''navy green teal indigo maroon purple olive gray sienna brown silver peru tan orchid plum violet khaki azure wheat beige salmon linen tomato coral orange pink gold bisque snow ivory red'){lookup(n)==c?c=s(n):c}}
Teste aqui
fonte
Matlab 617
Muito pré-processamento e codificação. O conjunto mínimo de nomes de cores que você deve considerar são esses. Pena que o Matlab não possui nomes de cores integrados = /
fonte
r=0;g=16;b=0;
lá, embora não seja contado na sua pontuação.Python 3,
857795 bytesA necessidade de especificar manualmente todas as cores aceitas necessárias aumentou a contagem de bytes neste: /
c(a)
leva um argumento,,a
que vem na forma dergb(#,#,#)
. A partir disso, o rgb e os colchetes são removidos e a sequência é dividida por vírgulas em uma matriz.c(x,y,z)
leva 3 ints, os valores r, g e b da cor rgb para processar. Reunimos essas informações em uma matriza
. Em seguida, usamos a função interna do Python,hex
que converte um número da Base 10 em um número da Base 16 em nossa matriz e criamos uma string hexadecimal (isso é feito nofor
loop). Asif
instruções convertem cores como000000
para000
e substituem as cores conhecidas usando um dicionário.Aqui está (obrigado a @undergroundmonorail pela dica sobre
;
Python):Versão antiga:
Talvez eu adicione o bônus, ainda não sei. Definitivamente poderia fazer com 50% de bytes de desconto!
-Toastrackenigma
fonte
;
, salvando o recuo. por exemplo:a=a[4:-1].split(",");b=""
. qualquerif
,else
,for
,while
bloco, etc com apenas uma linha pode ser escrita comoif b in k:b=k[b]
.Finalmente, você pode perder muito do seu espaço em branco no meio de linhas, por exemplok = {
->k={
ereturn "color:
->return"color:
re.findall()
(também será necessárioimport re
): pastebin.com/rQHqgxXSJavaScript (ES6),
499611Editar Adicionados os casos de teste na pergunta
Nota: Eu mantive apenas os nomes de cores menores que o equivalente hexadecimal.
Nota 2: isso certamente pode ser jogado mais ...Menos golfe
fonte
{f00:"red";"008000":"green"}
.