Otrzymujesz wartości RGB koloru. Twoje zadanie jest proste: obliczyć odcień w najprostszej definicji.
Powiedz, że kanały o najwyższej, środkowej i najniższej wartości to X, Y, Z (które są albo czerwone, zielone lub niebieskie), a ich wartości to x, y, z. Odcień tego koloru to (h (X) -h (Y)) * (1 + (xy) / (xz)) / 2 + h (Y), gdzie:
h(red) = 0 (or 360 if one of X or Y is blue)
h(green) = 120
h(blue) = 240
Dane wejściowe składają się z 3 liczb całkowitych od 0 do 255, które nie wszystkie są równe, w dowolnej spójnej kolejności. Wyjściem mogą być zmiennoprzecinkowe lub liczby całkowite zaokrąglone w górę lub w dół, co nie musi być spójne. Jeśli całkowita liczba wyjściowa wynosi 0 lub 360, możesz wydrukować jedną z nich.
Nie można wywoływać wbudowanych funkcji konwersji przestrzeni kolorów, w tym konwersji niejawnych, na przykład podczas manipulacji obrazem.
To jest golf golfowy. Najkrótszy kod wygrywa.
Przykłady
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)
Edytować
Nie musisz stosować się do dokładnej formuły, a jedynie dać taki sam wynik jak powyższa formuła. Chciałbym również zobaczyć niektóre odpowiedzi dotyczące samej formuły.
Odpowiedzi:
Pyth, 27 bajtów
Demonstracja. Uprząż testowa.
Fomula pochodzi z Wikipedii .
Zasadniczo kroki są następujące:
.<QJxQKeSQ
: Roate największa wartość na początku listy.-Ft
: Weź różnicę z pozostałych dwóch wartości.-KhSQ
: Odejmij wartość minimalną od wartości maksymalnej.c
: Podziel 2 przez 3.+ ... yJ
Dodaj dwukrotnie indeks maksymalnej wartości z listy (0, jeśli R, 2, jeśli G, 4, jeśli B).% ... 6
: Mod 6, aby naprawić problemy z negatywami.*60
: Pomnóż przez 60, aby przeliczyć na stopnie i wydrukować.źródło
C #,
188210206197191 bajtówDzięki Sok za uratowanie 4 bajtów i SLuck49 za uratowanie 15!
źródło
z
raz w obliczeniach wyjściowych i nie używasz go w poprzednich obliczeniach, usuwasz zmienną i zmieniasz dane wyjściowe nareturn(int)((c-d)*(1+(x-y)/(double)(x-a[0]))/2+d);
, oszczędzając ci 4 bajty.c
id
zadań oraz do zwrotu jak tac=x==g?1:(x==b?2:(y==b?3:0)),d=y==g?1:(y==b?2:(x==b?3:0))
, a następniereturn(int)((c-d)*120*(1+(x-y)/(double)(x-a[0]))/2+d*120);
zapisać 4 bajty.double
? Jeśli tak, możesz użyć tego zamiast tego,(x-a[0])*1D
aby zapisać kolejne 5 bajtów.*1D
pomnożenie jest fajną sztuczką!System.Array
na kolejne 6 bajtów.Pyth
41555351 bajtówDane wejściowe są oczekiwane w formularzu
r,g,b
. Oto wyjaśnienie:Zaoszczędź 4 bajty dzięki @Jakube i @isaacg
źródło
m*120d
->*L120
, zapiszeeJ
doK
inline, aby zapisać kolejny bajt.L
operator automatycznie wygenerował zakres na int, każdy dzień wydaje się świstym dniem: o) Dzięki!JavaScript (ES6),
1451151081009790 bajtówZwraca liczbę zmiennoprzecinkową. Przypisz do funkcji, której chcesz użyć.
Zaoszczędzono 30 bajtów, umieszczając wszystko w jednej sekwencji operatora trójskładnikowego i czekając do końca na normalizację do 0-360.
Dzięki edc65, Vasu Adari i produktom ETH dla oszczędności jeszcze większej liczby bajtów.
JSFiddle z testami. Wypróbuj w przeglądarce Firefox.
Jeśli usunięcie deklaracji funkcji
h=
jest niezgodne z prawem, dodaj 2 bajty.źródło
return
.h=
%6)*60
i partnera po drugiej stronie. Ponadto użycie brutalnej siły przy dodawaniu (zamiast dodawania 6 na końcu) pozwoliłoby zaoszczędzić jeden bajt w stosunku do bieżącej konfiguracji.(((x==r?(g-b)/m:x==g?2+(b-r)/m:4+(r-g)/m)+6)%6)*60
stałby się(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)
Oktawa,
656050 bajtówEdycja: Zapisane 10 bajtów dzięki pawel.boczarski
Przybliżone rozwiązanie ...
Testowe uruchomienie
Oktawa, 107 bajtów
Moje oryginalne (dokładnie takie) rozwiązanie ...
Kod:
Wyjaśnił:
Ta funkcja przyjmuje na wejściu wektor zawierający wartości R, G, B
c
i sortuje dane wejściowe w porządku rosnącymb
zawiera posortowane wartości [z, y, x]i
zawiera płaszczyznę RGB związaną z każdą wartością w bWektor
h
jest zapełniany wartościami60*[6, 2, 4]
=[360, 120, 240]
(ale 3 bajty krótsze)i(1) == 3
), w którym to przypadku pierwsza wartość odcienia staje się zero(i)
aby zmienić kolejnośćh
w[h(Z), h(Y), h(X)]
kolejnościStamtąd jest to prosta transkrypcja formuły. Możesz spróbować tutaj .
źródło
@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360)
jest dziesięć bajtów krótszych niż definicja zefunction
słowem kluczowym.r=
przed anonimową funkcją, aby ją nazwać, prawda?(@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360))([127 247 103])
lub argumentować, że możesz użyćans
zmiennej zaraz po zdefiniowaniu funkcji anonimowej, aby przypisanie nie było konieczne do zakończenia definicji funkcji. W jednym z wyzwań ( codegolf.stackexchange.com/questions/54945 ) uchwyt istniejącej funkcji biblioteki Matlaba został opublikowany jako pełne rozwiązanie.ans
w próbce. Dzięki jeszcze raz!Pyth, 55
Wiem, że odpowiedź @ Soka przewyższa moją, ale ponieważ skończyłem moją zaraz po tym, jak on / ona opublikował, pomyślałem, że nadal będę pisać. To był mój pierwszy raz w Pythonie, więc jestem pewien, że popełniłem oczywiste błędy.
Dane wejściowe powinny być
r, g, b
. Możesz spróbować tutaj .źródło
255,165,245
.PowerShell,
232226222161 bajtówZobacz historię zmian poprzednich wersji
Hoo chłopcze, zobaczmy, czy dam radę przez to przejść. Ponieważ
\n
liczy się tak samo, jak;
zostawiłem, linia łamie się dla jasności.Pierwszy wiersz przyjmuje dane wejściowe jako trzy
$args
i zapisuje je w$r, $g, $b
. Naprawdę będziemy używać$b
dopiero później, ale potrzebujemy wszystkich trzech, więc wszystko|sort
działa poprawnie. To sprawia, że$z, $y, $x
od najmniejszych do największych argumentów wejściowych.Kolejne dwie linie ustawiają
$c
i$d
za pomocą wielu wywołań indeksu do tablicy, aby odpowiednio ustawić liczby. Praca z zewnątrz w, jeśli$x
jest-eq
seksualnego do$g
(czyli zielony był największy), ustawiamy$c=1
... else, jeśli$x
jest-n
ote
qual do$b
(czyli niebieski nie był największy)$c
jest albo0
czy3
w zależności czy niebieski był drugim co do wielkości ... indziej$c=2
. Podobne zestawy logiczne$d
.Następnie obliczamy i drukujemy dane wyjściowe w następujący sposób, który jest tylko algorytmem gry w golfa.
źródło
$z
podczas obliczania$c
lub$d
, i używasz go tylko raz w obliczeniach wyjściowych, więc możesz się go$z
całkowicie pozbyć i zastąpić$a[0]
?Ruby,
1179694 bajtówKod:
()
i użycie zmiennych r, g, b.Przykłady:
źródło
SWI-Prolog, 133 bajty
Przykład:
a([255,165,245],Hue).
wyjściaHue = 306.666666666666 .
Wykorzystuje się następującą formułę:
Max = max(R,G,B)
,Min = min(R,G,B)
.Max = R
,U = 0
. Else ifMax = G
,U = 2
. IndziejU = 4
.Max = R
,I = G
iJ = B
. Else ifMax = G
,I = B
iJ = R
. W przeciwnym razieI = R
iJ = G
.Z = U + (I - J)/(Max - Min)
Hue
jest alboZ
alboZ + 360
jeśliZ < 0
.źródło
Perl 5,
138132119 bajtówKod:
Uwagi:
Z pewnością Perl nie może wygrać takiego wyzwania z całym golfem w Pyth'oresque. Ale zastanawiałem się, czy można to zrobić tylko z 1 krokiem obliczeniowym. Dzięki modułowi, który dobrze się sprawdził. :)
Test:
źródło
C ++ 276 bajtów
źródło
H
funkcję sama odpowiedź, jak w code-golf funkcja samodzielna jest uzasadniony odpowiedź ekwiwalent pełnego programu vide meta dyskusja: meta.codegolf.stackexchange.com/questions/2419/... . To sprawi, że twoja odpowiedź będzie bardziej konkurencyjna (w twoim przypadku zaoszczędź 100 bajtów). Nadal zachęcamy do pozostawienia „pełnej” wersji programu pod rozwiązaniem, aby uprościć testowanie.127 247 103
zwraca niepoprawną wartość-120
zamiast110
.R, 125 bajtów
Bardzo podobny do roztworu Octave zlewki. Wyjście zmiennoprzecinkowe.
Kod:
Przykłady:
źródło
Python, 154 bajty
Akceptuje listę wartości. Nie jestem pewien, czy można to dalej rozbić. Tutaj nie jest golfem:
źródło
JavaScript 108
Metoda alternatywna.
JavaScript 194
Przy użyciu przykładowej metody.
źródło