Vous obtenez les valeurs RVB d'une couleur. Votre tâche est simple: calculer la teinte, dans la définition la plus simple.
Supposons que les canaux avec la valeur la plus élevée, la moyenne et la plus basse sont X, Y, Z (qui sont soit rouges, verts ou bleus) et leurs valeurs sont x, y, z. La teinte de cette couleur est (h (X) -h (Y)) * (1 + (xy) / (xz)) / 2 + h (Y), où:
h(red) = 0 (or 360 if one of X or Y is blue)
h(green) = 120
h(blue) = 240
L'entrée se compose de 3 entiers de 0 à 255 qui ne sont pas tous égaux, dans un ordre cohérent. La sortie peut être des flottants ou des entiers arrondis vers le haut ou vers le bas, ce qui ne doit pas nécessairement être cohérent. Si la partie entière de la sortie est 0 ou 360, vous pouvez imprimer l'un ou l'autre.
Vous ne pouvez pas appeler de fonction intégrée pour les conversions d'espace colorimétrique, y compris les conversions implicites, par exemple lors de la manipulation d'une image.
C'est du code-golf. Le code le plus court gagne.
Exemples
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)
modifier
Vous n'êtes pas obligé de suivre la formule exacte, mais vous n'avez qu'à donner le même résultat que la formule ci-dessus. Je voudrais également voir quelques réponses jouant la formule elle-même.
Réponses:
Pyth, 27 octets
Manifestation. Harnais de test.
Fomula tirée de Wikipédia .
Essentiellement, les étapes sont les suivantes:
.<QJxQKeSQ
: Place la plus grande valeur au début de la liste.-Ft
: Prenez la différence des deux autres valeurs.-KhSQ
: Soustrayez la valeur minimale de la valeur maximale.c
: Divisez 2 par 3.+ ... yJ
Ajoutez deux fois l'index de la valeur maximale dans la liste (0 si R, 2 si G, 4 si B).% ... 6
: Mod 6, pour résoudre les problèmes de négatifs.*60
: Multipliez par 60 pour convertir en degrés et imprimer.la source
C #,
188210206197191 octetsMerci à Sok pour avoir économisé 4 octets et à SLuck49 pour en avoir économisé 15!
la source
z
qu'une seule fois dans le calcul de sortie et que vous ne l'utilisez pas dans les calculs précédents, vous supprimez la variable et changez la sortie enreturn(int)((c-d)*(1+(x-y)/(double)(x-a[0]))/2+d);
, vous économisant 4 octets.c
et lesd
affectations et dans le retour comme celui - cic=x==g?1:(x==b?2:(y==b?3:0)),d=y==g?1:(y==b?2:(x==b?3:0))
, puisreturn(int)((c-d)*120*(1+(x-y)/(double)(x-a[0]))/2+d*120);
pour sauver 4 octets.double
? Si vous le faites, vous pouvez l'utiliser à la place(x-a[0])*1D
pour enregistrer 5 autres octets.*1D
multiplication est une bonne astuce!System.Array
pour 6 autres octets.Pyth,
41555351 octetsUne entrée est attendue dans le formulaire
r,g,b
. Voici une explication:4 octets enregistrés grâce à @Jakube et @isaacg
la source
m*120d
->*L120
, enregistrereeJ
enK
ligne pour enregistrer un autre octet.L
opérateur générait automatiquement une plage sur un int, chaque jour est un jour shcool semble-t-il: o) Merci!Javascript (ES6),
1451151081009790 octetsRenvoie des flotteurs. Attribuez à une fonction à utiliser.
30 octets enregistrés en insérant tout dans une seule séquence d'opérateur ternaire et en attendant la fin pour normaliser à 0-360.
Merci à edc65, Vasu Adari et ETHproductions pour économiser encore plus d'octets.
JSFiddle avec tests. Essayez dans Firefox.
Si la suppression de la déclaration de fonction
h=
n'est pas légale, ajoutez 2 octets.la source
return
. Je pense que la suppression de la déclaration de fonction (h=
) est également légale, ramenant le total à 100.%6)*60
et de son partenaire de l'autre côté. De plus, l'utilisation de la force brute sur l'ajout (au lieu d'en ajouter 6 à la fin) économiserait en fait un octet par rapport à votre configuration actuelle.(((x==r?(g-b)/m:x==g?2+(b-r)/m:4+(r-g)/m)+6)%6)*60
deviendrait(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)
Octave,
656050 octetsEdit: 10 octets enregistrés grâce à pawel.boczarski
Une solution approximative ...
Essai
Octave, 107 octets
Ma solution originale (exacte) ...
Code:
Expliqué:
Cette fonction prend un vecteur contenant les valeurs R, G, B en entrée
c
et trie l'entrée en ordre croissantb
contient les valeurs triées [z, y, x]i
contient le plan RVB associé à chaque valeur de bLe vecteur
h
est rempli avec les valeurs60*[6, 2, 4]
=[360, 120, 240]
(mais 3 octets de moins)i(1) == 3
), auquel cas la première valeur de teinte devient nulle(i)
pour réorganiserh
dans l'[h(Z), h(Y), h(X)]
ordreDe là, c'est juste une transcription directe de la formule. Vous pouvez l'essayer ici .
la source
@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360)
est dix octets plus court que la définition avecfunction
mot-clé.r=
avant la fonction anonyme pour l'appeler, non?(@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360))([127 247 103])
:, ou affirmer que vous pouvez utiliser uneans
variable juste après la définition de la fonction anonyme, de sorte que l'affectation n'est pas nécessaire pour que la définition de la fonction soit complète. Dans un défi ( codegolf.stackexchange.com/questions/54945 ), une poignée de la fonction de bibliothèque Matlab existante a été publiée comme solution complète.ans
dans l'exemple. Merci encore!Pyth, 55
Je sais que la réponse de @ Sok bat la mienne, mais puisque j'ai fini la mienne juste après qu'il / elle a posté, je pensais que je posterais toujours. C'était la première fois que j'utilisais Pyth, donc je suis sûr d'avoir fait des erreurs évidentes.
L'entrée devrait être
r, g, b
. Vous pouvez l'essayer ici .la source
255,165,245
.PowerShell,
232226222161 octetsVoir l'historique des révisions pour les versions précédentes
Hoo boy, voyons si je peux traverser ça. Depuis
\n
compte la même chose que;
j'ai laissé la ligne se rompt pour plus de clarté.La première ligne prend trois entrées
$args
et les stocke dans$r, $g, $b
. Nous n'utiliserons vraiment que$b
plus tard, mais nous avons besoin des trois pour que les|sort
travaux fonctionnent correctement. Cela fait$z, $y, $x
le plus petit au plus grand des arguments d'entrée.Les deux lignes suivantes sont configurées
$c
et$d
en utilisant plusieurs appels d'index dans un tableau pour définir les nombres de manière appropriée. Travaillant de l'extérieur vers l'intérieur, si$x
est-eq
ual$g
(c'est- à -dire que le vert était le plus grand), nous définissons$c=1
... sinon, si$x
est-n
ote
qual à$b
(c.- à -d., Le bleu n'était pas le plus grand)$c
est l'un0
ou l' autre ou3
dépend si le bleu était le deuxième plus grand ... autre,$c=2
. Ensembles logiques similaires$d
.Nous calculons et imprimons ensuite la sortie avec ce qui suit, qui est juste l'algorithme du défi joué un peu.
la source
$z
lors du calcul de$c
ou$d
, et vous ne l'utilisez qu'une seule fois dans le calcul de sortie, alors pouvez-vous vous débarrasser$z
complètement et le remplacer par$a[0]
?Rubis,
1179694 octetsCode:
()
et en utilisant les variables r, g, b.Exemples:
la source
SWI-Prolog, 133 octets
Exemple:
a([255,165,245],Hue).
sortiesHue = 306.666666666666 .
Cela utilise la formule suivante:
Max = max(R,G,B)
,Min = min(R,G,B)
.Max = R
,U = 0
. Sinon , siMax = G
,U = 2
. AutreU = 4
.Max = R
,I = G
etJ = B
. Sinon , siMax = G
,I = B
etJ = R
. SinonI = R
etJ = G
.Z = U + (I - J)/(Max - Min)
Hue
est soitZ
ouZ + 360
siZ < 0
.la source
Perl 5,
138132119 octetsCode:
Remarques:
Certes, Perl ne peut pas gagner un tel défi avec tout le golf Pyth'oresque. Mais je me demandais si cela était possible avec une seule étape de calcul. Merci au module qui a bien fonctionné. :)
Tester:
la source
C ++ 276 octets
la source
H
fonction seule dans la réponse, car dans le code-golf, une fonction autonome est une réponse légitime, équivalente à un programme complet, vide méta discussion: meta.codegolf.stackexchange.com/questions/2419/… . Cela rendra votre réponse plus compétitive (économisez 100 octets dans votre cas). Vous êtes toujours encouragé à laisser la version "complète" du programme sous la solution pour simplifier les tests.127 247 103
renvoie une valeur non valide-120
au lieu de110
.R, 125 octets
Très similaire à la solution Octave de bécher. Sortie en virgule flottante.
Code:
Exemples:
la source
Python, 154 octets
Accepte une liste de valeurs. Je ne sais pas si cela peut être décomposé davantage. Ici, il n'est pas golfé:
la source
JavaScript 108
Méthode alternative.
JavaScript 194
Utilisation de la méthode d'exemple.
la source