Sie erhalten die RGB-Werte einer Farbe. Ihre Aufgabe ist einfach: in der einfachsten Definition den Farbton zu berechnen.
Angenommen, die Kanäle mit dem höchsten, mittleren und niedrigsten Wert sind X, Y, Z (entweder rot, grün oder blau) und ihre Werte sind x, y, z. Der Farbton dieser Farbe ist (h (X) -h (Y)) * (1 + (xy) / (xz)) / 2 + h (Y), wobei:
h(red) = 0 (or 360 if one of X or Y is blue)
h(green) = 120
h(blue) = 240
Die Eingabe besteht aus 3 Ganzzahlen von 0 bis 255, die in einer konsistenten Reihenfolge nicht alle gleich sind. Die Ausgabe kann floaten oder ganze Zahlen sein, die entweder auf- oder abgerundet werden, was nicht konsistent sein muss. Wenn der ganzzahlige Teil der Ausgabe 0 oder 360 ist, können Sie einen von ihnen drucken.
Sie können keine integrierten Funktionen für Farbraumkonvertierungen aufrufen, einschließlich impliziter Konvertierungen, z. B. während Sie ein Bild bearbeiten.
Das ist Code-Golf. Kürzester Code gewinnt.
Beispiele
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)
Bearbeiten
Sie müssen nicht die exakte Formel befolgen, sondern müssen nur das gleiche Ergebnis wie die obige Formel liefern. Ich möchte auch einige Antworten sehen, die die Formel selbst Golf spielen.
Antworten:
Pyth, 27 Bytes
Demonstration. Kabelbaum testen.
Fomula aus Wikipedia .
Im Wesentlichen sind die Schritte:
.<QJxQKeSQ
: Bringe den größten Wert an den Anfang der Liste.-Ft
: Nehmen Sie die Differenz der beiden anderen Werte.-KhSQ
: Den Minimalwert vom Maximalwert abziehen.c
: 2 durch 3 teilen.+ ... yJ
Addieren Sie den doppelten Index des Maximalwerts in der Liste (0, wenn R, 2, wenn G, 4, wenn B).% ... 6
: Mod 6, um Probleme mit Negativen zu beheben.*60
: Mit 60 multiplizieren, um in Grad umzurechnen und zu drucken.quelle
C #
188210206197191 BytesDanke an Sok für das Speichern von 4 Bytes und an SLuck49 für das Speichern von 15!
quelle
z
die Ausgabeberechnung nur einmal verwenden und in den vorhergehenden Berechnungen nicht verwenden, können Sie die Variable entfernen und die Ausgabe in ändernreturn(int)((c-d)*(1+(x-y)/(double)(x-a[0]))/2+d);
, wodurch Sie 4 Byte sparen.c
undd
Zuweisungen und in die Rückgabe wie diesec=x==g?1:(x==b?2:(y==b?3:0)),d=y==g?1:(y==b?2:(x==b?3:0))
und dannreturn(int)((c-d)*120*(1+(x-y)/(double)(x-a[0]))/2+d*120);
4 Byte zu speichern.double
? In diesem Fall können Sie stattdessen(x-a[0])*1D
weitere 5 Byte speichern.*1D
Multiplikation ist ein netter Trick!System.Array
für weitere 6 Bytes qualifizieren.Pyth,
41555351 BytesEingaben werden im Formular erwartet
r,g,b
. Hier ist eine Erklärung:4 Bytes gespart, dank @Jakube und @isaacg
quelle
m*120d
->*L120
Speichern ,eeJ
umK
ein weiteres Byte inline zu speichern.L
Operator einen Bereich auf einem Int automatisch generiert, jeder Tag ist ein Shcool-Tag, wie es scheint: o) Danke!Javascript (ES6),
1451151081009790 BytesGibt floats zurück. Weisen Sie eine zu verwendende Funktion zu.
Es wurden 30 Bytes gespart, indem alles in eine einzelne ternäre Operatorsequenz eingefügt und bis zum Ende gewartet wurde, um auf 0-360 zu normalisieren.
Dank edc65, Vasu Adari und ETHproductions, die noch mehr Bytes eingespart haben.
JSFiddle mit Tests. Versuchen Sie es in Firefox.
Wenn das Entfernen der Funktionsdeklaration
h=
nicht zulässig ist, fügen Sie 2 Byte hinzu.quelle
return
. Ichh=
%6)*60
und den Partner auf der anderen Seite loswerden . Außerdem würde die Verwendung von Brute Force für die Addition (anstatt 6 am Ende hinzuzufügen) tatsächlich ein Byte gegenüber Ihrer aktuellen Konfiguration sparen.(((x==r?(g-b)/m:x==g?2+(b-r)/m:4+(r-g)/m)+6)%6)*60
würde werden(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)
Oktave,
656050 BytesBearbeiten: 10 Bytes dank pawel.boczarski gespeichert
Eine ungefähre Lösung ...
Testlauf
Oktave, 107 Bytes
Meine ursprüngliche (exakte) Lösung ...
Code:
Erklärt:
Diese Funktion nimmt einen Vektor als Eingabe, der die R-, G- und B-Werte enthält,
c
und sortiert die Eingabe in aufsteigender Reihenfolgeb
enthält die sortierten Werte [z, y, x]i
enthält die RGB-Ebene, die jedem Wert in b zugeordnet istDer Vektor
h
wird mit den Werten gefüllt60*[6, 2, 4]
=[360, 120, 240]
(aber 3 Bytes kürzer)i(1) == 3
). In diesem Fall wird der erste Farbtonwert zu Null(i)
neu zu ordnenh
in[h(Z), h(Y), h(X)]
OrdnungVon dort ist es nur eine direkte Transkription der Formel. Sie können es hier ausprobieren .
quelle
@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360)
ist zehn Bytes kürzer als die Definition mit demfunction
Schlüsselwort.r=
vor der anonymen Funktion, um sie aufzurufen, oder?(@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360))([127 247 103])
oder argumentieren, dass Sie dieans
Variable direkt nach der Definition der anonymen Funktion verwenden können, sodass die Zuweisung nicht erforderlich ist, damit die Funktionsdefinition vollständig ist. In einer Herausforderung ( codegolf.stackexchange.com/questions/54945 ) wurde ein Handle der vorhandenen Matlab-Bibliotheksfunktion als vollständige Lösung veröffentlicht.ans
im Beispiel verwenden. Danke noch einmal!Pyth, 55
Ich weiß, dass @ Soks Antwort meine übertrifft, aber da ich meine direkt nach dem Posten beendet habe, dachte ich, ich würde immer noch posten. Ich habe Pyth zum ersten Mal verwendet, daher habe ich sicher einige offensichtliche Fehler gemacht.
Die Eingabe wird erwartet
r, g, b
. Sie können es hier ausprobieren .quelle
255,165,245
.PowerShell,
232226222161 BytesSiehe Revisionsverlauf für frühere Versionen
Hallo Junge, mal sehen, ob ich das durchgehen kann. Da gilt
\n
das gleiche wie;
Verlassen der Zeile zur Verdeutlichung ein.Die erste Zeile nimmt die Eingabe als drei
$args
und speichert sie in$r, $g, $b
. Wir werden es wirklich erst$b
später benutzen , aber wir brauchen alle drei, damit es|sort
angemessen funktioniert. Dies macht$z, $y, $x
das kleinste zum größten der Eingabeargumente.Die nächsten beiden Zeilen werden eingerichtet
$c
und$d
mithilfe mehrerer Index-in-ein-Array-Aufrufe, um die Zahlen entsprechend festzulegen. Arbeiten von außen nach innen, wenn$x
es-eq
angebracht ist$g
(dh grün die größte war), stellen wir$c=1
... sonst, wenn$x
ist-n
ote
qual zu$b
(dh blau war nicht der größte)$c
ist entweder0
oder3
je nachdem , ob blau die zweite war größte ... sonst$c=2
. Ähnliche Logiksätze$d
.Wir berechnen und drucken dann die Ausgabe mit dem folgenden Wert, der nur der Algorithmus aus der Herausforderung ist, die ein wenig gespielt wurde.
quelle
$z
beim Berechnen nicht$c
oder$d
und Sie verwenden es nur einmal in der Ausgabeberechnung. Können Sie es also$z
vollständig entfernen und durch ersetzen$a[0]
?Rubin,
1179694 BytesCode:
()
und Verwenden der Variablen r, g, b eingespart.Beispiele:
quelle
SWI-Prolog, 133 Bytes
Beispiel:
a([255,165,245],Hue).
AusgängeHue = 306.666666666666 .
Dies verwendet die folgende Formel:
Max = max(R,G,B)
,Min = min(R,G,B)
.Max = R
,U = 0
. Else , wennMax = G
,U = 2
. ElseU = 4
.Max = R
,I = G
undJ = B
. Sonst wennMax = G
,I = B
undJ = R
. SonstI = R
undJ = G
.Z = U + (I - J)/(Max - Min)
Hue
ist entwederZ
oderZ + 360
wennZ < 0
.quelle
Perl 5,
138132119 BytesCode:
Bemerkungen:
Sicher kann Perl eine solche Herausforderung nicht mit all dem Pyth'oresque-Golfen gewinnen. Aber ich habe mich gefragt, ob dies mit nur einem Rechenschritt möglich ist. Dank des Moduls hat das gut geklappt. :)
Prüfung:
quelle
C ++ 276 Bytes
quelle
H
Funktion in der Antwort in Ruhe lassen, da in Code-Golf eine Standalone-Funktion eine legitime Antwort ist, die einem vollständigen Programm entspricht . Dies wird Ihre Antwort wettbewerbsfähiger machen (sparen Sie 100 Bytes in Ihrem Fall). Sie werden weiterhin aufgefordert, die "vollständige" Programmversion unter der Lösung zu belassen, um das Testen zu vereinfachen.127 247 103
liefert einen ungültigen Wert-120
anstelle von110
.R, 125 Bytes
Sehr ähnlich zu Beakers Octave-Lösung. Gleitkomma-Ausgabe.
Code:
Beispiele:
quelle
Python, 154 Bytes
Akzeptiert eine Liste von Werten. Ich bin mir nicht sicher, ob dies weiter abgebaut werden kann. Hier ist es ungolfed:
quelle
JavaScript 108
Alternative Methode.
JavaScript 194
Verwenden Sie die Beispielmethode.
quelle