No CSS, as cores podem ser especificadas por um "trigêmeo hexadecimal" - um número hexadecimal de três bytes (seis dígitos) em que cada byte representa os componentes vermelho, verde ou azul da cor. Por exemplo, #FF0000
é completamente vermelho e é equivalente a rgb(255, 0, 0)
.
As cores também podem ser representadas pela notação abreviada que usa três dígitos hexadecimais. A abreviação se expande para o formato de seis dígitos duplicando cada dígito. Por exemplo, #ABC
torna-se #AABBCC
.
Como há menos dígitos na abreviação hexadecimal, menos cores podem ser representadas.
O desafio
Escreva um programa ou função que utilize um código de cores hexadecimal de seis dígitos e produz o código de cores de três dígitos mais próximo.
Aqui está um exemplo:
- Código hexadecimal de entrada: # 28a086
- Componente vermelho
- 0x28 = 40 (decimal)
- 0x22 = 34
- 0x33 = 51
- 0x22 está mais próximo, então o primeiro dígito do código de cor abreviado é 2
- Componente verde
- 0xa0 = 160
- 0x99 = 153
- 0xaa = 170
- 0x99 está mais próximo, então o segundo dígito é 9
- Componente azul
- 0x86 = 134
- 0x77 = 119
- 0x88 = 136
- 0x88 está mais próximo, então o terceiro dígito é 8
- O código de cor reduzido é # 298 (que se expande para # 229988)
Seu programa ou função deve aceitar como entrada um código de cores hexadecimal de seis dígitos anexado #
e gerar um código de cores de três dígitos anexado #
.
Exemplos
- # FF0000 → # F00
- # 00FF00 → # 0F0
- # D913C4 → # D1C
- # C0DD39 → # BD3
- # 28A086 → # 298
- # C0CF6F → # BC7
Pontuação
Este é um desafio do código-golfe, por isso vence a resposta mais curta do seu idioma! Aplicam-se regras padrão.
fonte
#
adicionar algo ao desafio.Respostas:
JavaScript (ES6), 55 bytes
Experimente online!
fonte
05AB1E , 13 bytes
Experimente online!
Quão?
fonte
ć
decapitar " Essa é outra maneira de descrevê-lo, lol. : D Boa resposta, porém, +1 de mim.Japonês , 16 bytes
Experimente ou execute todos os casos de teste
fonte
Conjunto 8088, IBM PC DOS,
59.58 bytesListagem desmontada:
Executável autônomo do PC DOS. A entrada é via linha de comando, a saída é para o console.
A maior parte do comprimento do código está lidando com a conversão da E / S da cadeia hexadecimal necessária em bytes, pois o código de máquina DOS / x86 não possui recursos internos para isso.
E / S:
Faça o download e teste o HEXCLR.COM ou
xxd
hexdump:fonte
Retina 0.8.2 , 88 bytes
Experimente online! O link inclui casos de teste. Explicação:
Emparelhe os dígitos hexadecimais.
Converta cada dígito separadamente em decimal.
Converta cada dígito decimal em unário.
Conclua a conversão hexadecimal do par de dígitos.
Adicione 8 e divida por 17.
Converta de volta para hexadecimal.
fonte
PHP ,
7567 bytesExperimente online! ou verifique todos os casos de teste .
fonte
Python 3 ,
727068 bytesExperimente online!
Este é um porto de Grzegorz Oledzkis resposta original , que eu o ajudei a jogar golfe.
Dois recursos do Python 3 nos ajudam a economizar bytes:
-2 bytes thanx para Jonathan Allan
fonte
(int(x[i:i+2],16)+8)//17
salva 2Geléia ,
2019 bytesExperimente online!
fonte
C # (compilador interativo do Visual C #) , 81 bytes
Experimente online!
fonte
Wolfram Language (Mathematica) ,
6348 bytesExperimente online!
-15 bytes graças a attinat ! Substituindo
StringJoin
com<>
e comprimindo a sintaxe.RGBColor@#
converte a sequência de entrada em uma cor do formulárioRGBColor[r, g, b]
com três argumentos de ponto flutuante no intervalo 0..1.Round[15 List @@ %]
multiplica a lista de três argumentos por 15 e os arredonda para o número inteiro mais próximo. Agora temos uma lista de três valores inteiros correspondentes aos três dígitos hexadecimais desejados.%~IntegerString~16
converte essa lista de três números inteiros em uma lista de três seqüências hexadecimais de um caractere cada."#"<>%
precede um#
caractere e une todos esses caracteres.fonte
MathGolf ,
1912 bytesSaída como lista de caracteres. Se isso não for permitido, um rastreamento adicional
y
adicional para associar a lista de caracteres a uma sequência.-7 bytes graças a @maxb , desde que eu olhei além de um builtin (
2ô_2<\1>]
para2/
).Experimente online.
Explicação:
fonte
Ruby (2.5.3),
45,44, 42 bytesEDIT: salvou um byte porque não precisamos de um grupo de caracteres para o segundo caractere na regex (inspirado na resposta de Neil)
EDIT 2: salvou 2 bytes porque a sintaxe lambda do dash rocket não precisa de colchetes ao redor do argumento
fonte
-p
sinalizador e outros 2 usando em$&
vez de um argumento dentro do bloco: tio.run/##KypNqvz/…Python 2 (
10910197858374 bytes)A "distância mais próxima" é tratada pela divisão por 17 e arredondamento.
Melhorias:
-8 bytes usando o
int(...+.5)
truque em vez deint(round(...))
-4 bytes usando a compreensão da lista em vez de
map()
-1 byte por codificação
#
na saída (obrigado @movatica)-10 bytes por não usar
re.findall("..",...)
favor da emenda explícita de String-2 bytes por não usar a compreensão da lista, mas uma expressão de gerador embutido em
join
(obrigado @movatica)-1 byte, sem emendar o
:7
final da parte azul-9 bytes por melhor iteração sobre cores - ou seja, iterando sobre índices, não caracteres reais (obrigado @movatica)
fonte
'#'
vez dex[0]
.''.join(...)
, pois ela também lida com uma expressão geradora. Basta remover o[]
e salvar mais 2 bytes :)range(1,6,2)
é ainda melhor com[1,3,5]
lambda x:'#'+''.join(hex((int(x[i:i+2],16)+8)/17)[2:]for i in[1,3,5])
-> 69 bytesPerl 5
-p
,3534 bytes@nwellnhof salvou um byte
Experimente online!
Lê de STDIN, substitui cada par de itens que não
#
possui o caractere único apropriado, usando o método de divisão por 17 para encontrar o mais próximo e, em seguida, gera implicitamente (-p
) o resultado.fonte
Python 3, 67 bytes
fonte
Vermelho , 103 bytes
Experimente online!
Descobriu-se que a versão atual do Red do Linux não tem uma implementação da
hex-to-rgb
função, é por isso que eu faço a conversão básica "manualmente" :)Isso funciona bem no console da GUI vermelha no Windows:
Vermelho , 94 bytes
fonte
Perl 6 , 35 bytes
Experimente online!
fonte
Carvão , 22 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
fonte
R , 57 bytes
Experimente online!
fonte
Pitão , 20 bytes
Experimente aqui.
NOTA: Caso o link acima apresente um
ImportError
, vá aqui ; atualmente existe um erro na página "oficial" e esta é uma solução temporária da Maltysen . Esse link pode parar de funcionar depois que o oficial for corrigido.fonte
Quarto (gforth) , 87 bytes
Experimente online!
Explicação
#
)#
0x11
) para obter o valor mais próximo para o componente reduzidoCódigo Explicação
fonte
Stax , 13 bytes
Execute e depure
fonte
K4 , 39 bytes
Solução:
Explicação:
Usa a mesma estratégia que muitas dessas respostas (por exemplo, adicione 8, divida por 17):
Extra:
"#",{x@*16\:a?&/a:abs(17*!16)-16/:x?y}[.Q.nA]@/:3 2#1_
- minha ideia original por 54 bytesfonte