Se le dan los valores RGB de un color. Su tarea es simple: calcular el tono, en la definición más simple.
Digamos que los canales con el valor más alto, medio y más bajo son X, Y, Z (que son rojos, verdes o azules) y sus valores son x, y, z. El tono de este color es (h (X) -h (Y)) * (1 + (xy) / (xz)) / 2 + h (Y), donde:
h(red) = 0 (or 360 if one of X or Y is blue)
h(green) = 120
h(blue) = 240
La entrada consta de 3 enteros de 0 a 255 que no son todos iguales, en ningún orden consistente. La salida puede ser flotante o números enteros redondeados hacia arriba o hacia abajo, lo que no tiene que ser consistente. Si la parte entera de la salida es 0 o 360, puede imprimir cualquiera de ellos.
No puede llamar a las incorporaciones para conversiones de espacio de color, incluidas las conversiones implícitas, como al manipular una imagen.
Este es el código de golf. El código más corto gana.
Ejemplos
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
No tiene que seguir la fórmula exacta, pero solo tiene que dar el mismo resultado que la fórmula anterior. También me gustaría ver algunas respuestas jugando a la fórmula en sí.
Respuestas:
Pyth, 27 bytes
Demostración. Prueba de arnés.
Fócula tomada de Wikipedia .
Esencialmente, los pasos son:
.<QJxQKeSQ
: Roate el valor más grande al frente de la lista.-Ft
: Tome la diferencia de los otros dos valores.-KhSQ
: Resta el valor mínimo del valor máximo.c
: Divide 2 entre 3.+ ... yJ
Agregue dos veces el índice del valor máximo en la lista (0 si R, 2 si G, 4 si B).% ... 6
: Mod 6, para solucionar problemas con negativos.*60
: Multiplique por 60 para convertir a grados e imprima.fuente
C #,
188210206197191 bytes¡Gracias a Sok por guardar 4 bytes y a SLuck49 por guardar 15!
fuente
z
una vez en el cálculo de salida, y no lo usa en los cálculos anteriores, elimina la variable y cambia la salida areturn(int)((c-d)*(1+(x-y)/(double)(x-a[0]))/2+d);
, ahorrándole 4 bytes.c
y ded
las tareas y en el retorno de esta manerac=x==g?1:(x==b?2:(y==b?3:0)),d=y==g?1:(y==b?2:(x==b?3:0))
y luegoreturn(int)((c-d)*120*(1+(x-y)/(double)(x-a[0]))/2+d*120);
de salvar 4 bytes.double
? Si lo hace, puede usar esto(x-a[0])*1D
para guardar otros 5 bytes.*1D
multiplicación es un buen truco!System.Array
para otros 6 bytes.Pyth
41555351 bytesSe espera la entrada en el formulario
r,g,b
. Aquí hay una explicación:Guardado 4 bytes, gracias a @Jakube y @isaacg
fuente
m*120d
->*L120
, guardareeJ
enK
línea para guardar otro byte.L
operador generaba un rango en un int automáticamente, cada día es un día de escuela parece: o) ¡Gracias!Javascript (ES6),
1451151081009790 bytesDevuelve flotadores. Asignar a una función para usar.
Ahorró 30 bytes al alinear todo en una única secuencia de operador ternario y esperar hasta el final para normalizar a 0-360.
Gracias a edc65, Vasu Adari y ETHproductions por guardar aún más bytes.
JS Violín con pruebas. Prueba en Firefox.
Si eliminar la declaración de función
h=
no es legal, agregue 2 bytes.fuente
return
. Creo que eliminar la declaración de función (h=
) también es legal, lo que reduce el total a 100.%6)*60
y su compañero en el otro lado. Además, el uso de la fuerza bruta en la suma (en lugar de sumar 6 al final) en realidad ahorraría un byte sobre su configuración actual.(((x==r?(g-b)/m:x==g?2+(b-r)/m:4+(r-g)/m)+6)%6)*60
se convertiría(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)
Octava,
656050 bytesEditar: Guardado 10 bytes gracias a pawel.boczarski
Una solución aproximada ...
Prueba de funcionamiento
Octava, 107 bytes
Mi solución original (exacta-ish) ...
Código:
Explicado:
Esta función toma un vector que contiene los valores R, G, B como entrada
c
y ordena la entrada en orden ascendenteb
contiene los valores ordenados [z, y, x]i
contiene el plano RGB asociado con cada valor en bEl vector
h
se rellena con los valores.60*[6, 2, 4]
=[360, 120, 240]
(pero 3 bytes más corto)i(1) == 3
), en cuyo caso el primer valor de tono se convierte en cero(i)
para reorganizarh
en[h(Z), h(Y), h(X)]
ordenA partir de ahí, es solo una transcripción directa de la fórmula. Puedes probarlo aquí .
fuente
@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360)
es diez bytes más corta que la definición con lafunction
palabra clave.r=
función anónima antes de poder llamarla, ¿verdad?(@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360))([127 247 103])
o argumentar que puede usar laans
variable justo después de que se definió la función anónima, de modo que la asignación no es necesaria para que la definición de la función se complete. En un desafío ( codegolf.stackexchange.com/questions/54945 ) se publicó un identificador de la función de biblioteca Matlab existente como solución completa.ans
en la muestra. ¡Gracias de nuevo!Pyth, 55
Sé que la respuesta de @ Sok supera a la mía, pero como terminé la mía justo después de que él / ella publicara, pensé que aún publicaría. Esta fue mi primera vez usando Pyth, así que estoy seguro de que cometí algunos errores obvios.
Se espera que la entrada sea
r, g, b
. Puedes probarlo aquí .fuente
255,165,245
.PowerShell,
232226222161 BytesVer historial de revisiones para versiones anteriores
Hoo boy, veamos si puedo atravesar esto. Ya que
\n
cuenta lo mismo;
que dejé, la línea se interrumpe para mayor claridad.La primera línea toma la entrada como tres
$args
y los almacena en$r, $g, $b
. Realmente solo lo usaremos$b
más tarde, pero necesitamos los tres para que|sort
funcione adecuadamente. Esto hace$z, $y, $x
el argumento de entrada menor a mayor.Las siguientes dos líneas se configuran
$c
y$d
utilizan múltiples llamadas de índice en una matriz para establecer los números de manera adecuada. Trabajando desde afuera hacia adentro, si$x
es-eq
ual a$g
(es decir, el verde era el más grande), nos propusimos$c=1
... otra cosa, si$x
es-n
ote
qual a$b
(es decir, el azul no era el más grande)$c
está bien0
o3
dependiendo de si el azul era el segundo más grande ... otra cosa,$c=2
. Conjuntos lógicos similares$d
.Luego calculamos e imprimimos la salida con lo siguiente, que es solo el algoritmo del desafío jugado un poco.
fuente
$z
al calcular$c
o$d
, y solo lo usas una vez en el cálculo de salida, entonces ¿puedes deshacerte por$z
completo y reemplazarlo por$a[0]
?Ruby,
1179694 bytesCódigo:
()
y usar r, g, b variables.Ejemplos:
fuente
SWI-Prolog, 133 bytes
Ejemplo:
a([255,165,245],Hue).
salidasHue = 306.666666666666 .
Esto usa la siguiente fórmula:
Max = max(R,G,B)
,Min = min(R,G,B)
.Max = R
,U = 0
. Si noMax = G
,U = 2
. De lo contrarioU = 4
.Max = R
,I = G
yJ = B
. Si noMax = G
,I = B
yJ = R
. De lo contrarioI = R
yJ = G
.Z = U + (I - J)/(Max - Min)
Hue
esZ
oZ + 360
siZ < 0
.fuente
Perl 5,
138132119 bytesCódigo:
Observaciones:
Seguramente Perl no puede ganar tal desafío con todo el golf Pyth'oresque. Pero me preguntaba si esto era posible con solo 1 paso de cálculo. Gracias al módulo que funcionó muy bien. :)
Prueba:
fuente
C ++ 276 bytes
fuente
H
función sola en la respuesta, ya que en code-golf una función independiente es una respuesta legítima, equivalente a un programa completo, ver meta discusión: meta.codegolf.stackexchange.com/questions/2419/… . Esto hará que su respuesta sea más competitiva (ahorre 100 bytes en su caso). Todavía se le recomienda dejar la versión "completa" del programa bajo la solución para simplificar las pruebas.127 247 103
produce un valor no válido en-120
lugar de110
.R, 125 bytes
Muy similar a la solución Octave del vaso de precipitados. Salida en coma flotante.
Código:
Ejemplos:
fuente
Python, 154 bytes
Acepta una lista de valores. No estoy seguro si esto puede desglosarse aún más. Aquí no tiene golf:
fuente
JavaScript 108
Metodo alternativo.
JavaScript 194
Usando el método de ejemplo.
fuente