Você recebe os valores RGB de uma cor. Sua tarefa é simples: calcular o matiz, na definição mais simples.
Digamos que os canais com os valores mais alto, médio e mais baixo sejam X, Y, Z (que são vermelhos, verdes ou azuis) e seus valores sejam x, y, z. O matiz dessa cor é (h (X) -h (Y)) * (1 + (xy) / (xz)) / 2 + h (Y), onde:
h(red) = 0 (or 360 if one of X or Y is blue)
h(green) = 120
h(blue) = 240
A entrada consiste em 3 números inteiros de 0 a 255, que não são todos iguais, em qualquer ordem consistente. A saída pode ser flutuantes ou números inteiros arredondados para cima ou para baixo, o que não precisa ser consistente. Se a parte inteira da saída for 0 ou 360, você poderá imprimir qualquer um deles.
Você não pode chamar builtins para conversões de espaço de cores, incluindo conversões implícitas, como durante a manipulação de uma imagem.
Isso é código-golfe. O menor código vence.
Exemplos
Input: 0 182 255
Output: 197 (or 198)
Input: 127 247 103
Output: 110
Input: 0 0 1
Output: 240
Input: 255 165 245
Output: 307 (or 306)
Editar
Você não precisa seguir a fórmula exata, mas apenas fornecer o mesmo resultado que a fórmula acima. Eu também gostaria de ver algumas respostas jogando a fórmula em si.
Respostas:
Pitão, 27 bytes
Demonstração. Equipamento de teste.
Fomula retirado da Wikipedia .
Essencialmente, as etapas são:
.<QJxQKeSQ
: Posicione o maior valor na frente da lista.-Ft
: Tome a diferença dos outros dois valores.-KhSQ
: Subtraia o valor mínimo do valor máximo.c
: Divida 2 por 3.+ ... yJ
Adicione duas vezes o índice do valor máximo na lista (0 se R, 2 se G, 4 se B).% ... 6
: Mod 6, para corrigir problemas com negativos.*60
: Multiplique por 60 para converter em graus e imprima.fonte
C #,
188210206197191 bytesAgradecimentos a Sok por salvar 4 bytes e a SLuck49 por salvar 15!
fonte
z
uma vez no cálculo da saída e não nos cálculos anteriores, elimina a variável e altera a saída parareturn(int)((c-d)*(1+(x-y)/(double)(x-a[0]))/2+d);
, economizando 4 bytes.c
ed
atribuições e para o retorno como estec=x==g?1:(x==b?2:(y==b?3:0)),d=y==g?1:(y==b?2:(x==b?3:0))
e, em seguida,return(int)((c-d)*120*(1+(x-y)/(double)(x-a[0]))/2+d*120);
para salvar 4 bytes.double
? Se você fizer isso, poderá usar isso(x-a[0])*1D
para salvar outros 5 bytes.*1D
multiplicação é um bom truque!System.Array
por outros 6 bytes.Pyth,
41.555351 bytesA entrada é esperada no formulário
r,g,b
. Aqui está uma explicação:Salvo 4 bytes, graças a @Jakube e @isaacg
fonte
m*120d
->*L120
, salveeeJ
emK
linha para salvar outro byte.L
operador gerava um intervalo em um int automaticamente, todo dia é um dia de folga, parece: o) Obrigado!Javascript (ES6),
1451151081009790 bytesRetorna flutuadores. Atribua a uma função a ser usada.
Economizou 30 bytes inserindo tudo em uma única sequência de operador ternário e aguardando até o final normalizar para 0-360.
Agradecemos a edc65, Vasu Adari e ETHproductions por economizar ainda mais bytes.
JSFiddle com testes. Experimente no Firefox.
Se a remoção da declaração da função
h=
não for legal, adicione 2 bytes.fonte
return
. Eu acredito que remover a declaração de função (h=
) também é legal, diminuindo o total para 100.%6)*60
e de seu parceiro do outro lado. Além disso, o uso de força bruta na adição (em vez de adicionar 6 no final) economizaria um byte na configuração atual.(((x==r?(g-b)/m:x==g?2+(b-r)/m:4+(r-g)/m)+6)%6)*60
se tornaria(x==r?6+(g-b)/m:x==g?8+(b-r)/m:10+(r-g)/m)%6*60
.(r,g,b)=>([m,_,M]=[r,g,b].sort((a,b)=>a-b),C=M-m,(M-r?M-g?r-g+4*C:b-r+2*C:g-b+6*C)/C%6*60)
Oitava,
656050 bytesEdit: salvou 10 bytes graças a pawel.boczarski
Uma solução aproximada ...
Execução de teste
Oitava, 107 bytes
Minha solução original (exata-ish) ...
Código:
Explicado:
Esta função aceita um vetor que contém os valores R, G, B como entrada
c
e classifica a entrada em ordem crescenteb
contém os valores classificados [z, y, x]i
contém o plano RGB associado a cada valor em bO vetor
h
é preenchido com os valores60*[6, 2, 4]
=[360, 120, 240]
(mas 3 bytes mais curto)i(1) == 3
); nesse caso, o primeiro valor de matiz se torna zero(i)
para reorganizarh
em[h(Z), h(Y), h(X)]
ordemA partir daí, é apenas uma transcrição direta da fórmula. Você pode tentar aqui .
fonte
@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360)
é dez bytes mais curto que a definição com afunction
palavra - chave.r=
antes da função anônima para chamá-la, certo?(@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360))([127 247 103])
ou argumentar que você pode usar aans
variável logo após a definição da função anônima, para que a atribuição não seja necessária para que a definição da função seja concluída. Em um desafio ( codegolf.stackexchange.com/questions/54945 ), um identificador da função existente da biblioteca Matlab foi publicado como solução completa.ans
na amostra. Obrigado novamente!Pyth, 55
Eu sei que a resposta de @ Sok é melhor que a minha, mas desde que terminei a minha logo após ele postar, pensei que ainda iria postar. Esta foi a minha primeira vez usando Pyth, então tenho certeza que cometi alguns erros óbvios.
É esperado que a entrada seja
r, g, b
. Você pode tentar aqui .fonte
255,165,245
.PowerShell,
232226222161 bytesConsulte o histórico de revisões para versões anteriores
Hoo garoto, vamos ver se consigo passar por isso. Desde
\n
conta o mesmo que;
eu deixei a linha quebra para maior clareza.A primeira linha recebe a entrada como três
$args
e as armazena$r, $g, $b
. Nós realmente iremos usar$b
mais tarde, mas precisamos dos três para que|sort
funcione adequadamente. Isto faz$z, $y, $x
o menor para o maior dos argumentos de entrada.As próximas duas linhas são configuradas
$c
e$d
usando várias chamadas de indexação em uma matriz para definir os números adequadamente. Trabalhando de fora para dentro, se$x
é-eq
ual a$g
(ie, o verde era o maior), definimos$c=1
... senão, se$x
é-n
ote
qual para$b
(ou seja, o azul não é o maior)$c
é0
ou3
depende se o azul foi o segundo maior ... mais$c=2
,. Conjuntos lógicos semelhantes$d
.Em seguida, calculamos e imprimimos a saída com o seguinte, que é apenas o algoritmo do desafio jogado um pouco.
fonte
$z
no cálculo$c
ou$d
e apenas o utiliza uma vez no cálculo de saída, para se livrar$z
totalmente e substituí-lo por$a[0]
?Ruby,
1179694 bytesCódigo:
()
e usando variáveis r, g, b.Exemplos:
fonte
SWI-Prolog, 133 bytes
Exemplo:
a([255,165,245],Hue).
saídasHue = 306.666666666666 .
Isso usa a seguinte fórmula:
Max = max(R,G,B)
,Min = min(R,G,B)
.Max = R
,U = 0
. SenãoMax = G
, seU = 2
. Outra coisaU = 4
.Max = R
,I = G
eJ = B
. Caso contrárioMax = G
, seI = B
eJ = R
. MaisI = R
eJ = G
.Z = U + (I - J)/(Max - Min)
Hue
é umZ
ouZ + 360
seZ < 0
.fonte
Perl 5,
138132119 bytesCódigo:
Observações:
Certamente Perl não pode vencer esse desafio com todo o golfe pitoresco. Mas me perguntei se isso era possível com apenas uma etapa de cálculo. Graças ao módulo que funcionou bem. :)
Teste:
fonte
Bytes C ++ 276
fonte
H
função sozinha na resposta, pois no code-golf uma função autônoma é uma resposta legítima, equivalente a um programa completo, vide meta-discussão: meta.codegolf.stackexchange.com/questions/2419/… . Isso tornará sua resposta mais competitiva (economize 100 bytes no seu caso). Você ainda deve deixar a versão "completa" do programa sob a solução para simplificar o teste.127 247 103
gera um valor inválido em-120
vez de110
.R, 125 bytes
Muito parecido com a solução Octave do copo. Saída em ponto flutuante.
Código:
Exemplos:
fonte
Python, 154 bytes
Aceita uma lista de valores. Não tenho certeza se isso pode ser quebrado ainda mais. Aqui é ungolfed:
fonte
JavaScript 108
Método alternativo.
JavaScript 194
Usando o método de exemplo.
fonte