Вам даны значения RGB цвета. Ваша задача проста: рассчитать оттенок, в самом простом определении.
Скажем, каналы с наивысшим, средним и наименьшим значениями - это X, Y, Z (красные, зеленые или синие), а их значения - x, y, z. Оттенок этого цвета (h (X) -h (Y)) * (1 + (xy) / (xz)) / 2 + h (Y), где:
h(red) = 0 (or 360 if one of X or Y is blue)
h(green) = 120
h(blue) = 240
Входные данные состоят из 3 целых чисел от 0 до 255, которые не все равны в любом последовательном порядке. Выходными данными могут быть числа с плавающей запятой или целые числа, округленные вверх или вниз, что не обязательно должно быть согласованным. Если целая часть вывода равна 0 или 360, вы можете распечатать любой из них.
Вы не можете вызывать встроенные функции для преобразования цветового пространства, включая неявные преобразования, например, при манипулировании изображением.
Это код-гольф. Самый короткий код выигрывает.
Примеры
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)
редактировать
Вы не должны следовать точной формуле, но должны дать тот же результат, что и вышеприведенная формула. Я также хотел бы увидеть ответы на некоторые вопросы по самой формуле.
Ответы:
Pyth, 27 байт
Демонстрация. Тестовый жгут.
Фомула взята из Википедии .
По сути, следующие шаги:
.<QJxQKeSQ
: Повернуть наибольшее значение в начало списка.-Ft
: Возьмите разницу двух других значений.-KhSQ
: Вычесть минимальное значение из максимального значения.c
: Разделить 2 на 3.+ ... yJ
Добавьте дважды индекс максимального значения в списке (0, если R, 2, если G, 4, если B).% ... 6
: Мод 6, чтобы исправить проблемы с негативами.*60
: Умножьте на 60, чтобы преобразовать в градусы, и напечатайте.источник
C #,
188210206197191 байтСпасибо Соку за сохранение 4 байта и SLuck49 за сохранение 15!
источник
z
один раз в выходных вычислениях, и вы не используете его в предыдущих вычислениях, вы покончили с переменной и изменили выходные данные наreturn(int)((c-d)*(1+(x-y)/(double)(x-a[0]))/2+d);
, сэкономив вам 4 байта.c
иd
заданий и в возвращении , как это ,c=x==g?1:(x==b?2:(y==b?3:0)),d=y==g?1:(y==b?2:(x==b?3:0))
а затем ,return(int)((c-d)*120*(1+(x-y)/(double)(x-a[0]))/2+d*120);
чтобы сохранить 4 байта.double
? Если вы это сделаете, вы можете использовать это,(x-a[0])*1D
чтобы сохранить еще 5 байтов.*1D
умножение - хороший трюк!System.Array
на еще 6 байтов.Pyth,
41555351 байтВвод ожидается в форме
r,g,b
. Вот объяснение:Сохранено 4 байта благодаря @Jakube и @isaacg
источник
m*120d
->*L120
, сохранитьeeJ
вK
строке, чтобы сохранить еще один байт.L
оператор автоматически генерирует диапазон для int, каждый день - школьный, кажется: o) Спасибо!Javascript (ES6),
1451151081009790 байтВозвращает поплавки. Назначьте функцию для использования.
Сохранение 30 байтов путем встраивания всего в одну троичную последовательность операторов и ожидания до нормализации конца до 0-360.
Спасибо edc65, Vasu Adari и ETHproductions за сохранение еще большего количества байтов.
JSFiddle с тестами. Попробуй в Firefox.
Если удаление объявления функции
h=
недопустимо, добавьте 2 байта.источник
return
. Я считаю, что удаление объявления функции (h=
) также является законным, в результате чего общее количество сокращается до 100.%6)*60
и его партнера с другой стороны. Кроме того, использование грубой силы при сложении (вместо добавления 6 в конце) фактически сохранит один байт по сравнению с текущей настройкой.(((x==r?(g-b)/m:x==g?2+(b-r)/m:4+(r-g)/m)+6)%6)*60
станет(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)
Октава,
656050 байтРедактировать: 10 байтов сохранено благодаря pawel.boczarski
Примерное решение ...
Тестовый забег
Октава, 107 байт
Мое оригинальное (точное) решение ...
Код:
Разъяснение:
Эта функция принимает вектор, содержащий значения R, G, B, в качестве входных данных
c
и сортирует входные данные в порядке возрастанияb
содержит отсортированные значения [z, y, x]i
содержит плоскость RGB, связанную с каждым значением в bВектор
h
заполняется значениями60*[6, 2, 4]
знак равно[360, 120, 240]
(но на 3 байта короче)i(1) == 3
), в этом случае значение первого оттенка становится нулевым(i)
для перегруппировкиh
в[h(Z), h(Y), h(X)]
порядокОттуда это просто прямая транскрипция формулы. Вы можете попробовать это здесь .
источник
@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360)
на десять байтов короче, чем определение сfunction
ключевым словом.r=
анонимная функция перед тем, чтобы ее вызывать, верно?(@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360))([127 247 103])
или утверждать, что вы можете использоватьans
переменную сразу после того, как анонимная функция была определена, так что присваивание не требуется для завершения определения функции. В одном вызове ( codegolf.stackexchange.com/questions/54945 ) описатель существующей функции библиотеки Matlab был опубликован как полное решение.ans
в примере. Еще раз спасибо!Pyth, 55
Я знаю, что ответ @ Sok превосходит мой, но так как я закончил свой, сразу после того, как он / она опубликовал сообщение, я подумал, что все равно оставлю сообщение. Это был мой первый раз, когда я использовал Pyth, поэтому я уверен, что допустил некоторые очевидные ошибки.
Ввод ожидается
r, g, b
. Вы можете попробовать это здесь .источник
255,165,245
.PowerShell,
232226222161 байтСмотрите историю изменений для предыдущих версий
Ха, мальчик, посмотрим, смогу ли я пройти через это. Так как
\n
считается так же, как;
я оставил, строка разбивается для ясности.Первая строка принимает входные данные как три
$args
и сохраняет их в$r, $g, $b
. Мы на самом деле собираемся использовать только$b
позже, но нам нужны все три, так что|sort
работает должным образом. Это делает$z, $y, $x
самый маленький-самый большой из входных аргументов.Следующие две строки устанавливаются
$c
и$d
с помощью нескольких вызовов index-in-a-array для установки чисел соответствующим образом. Работать извне, если$x
это-eq
необходимо$g
(то есть, зеленый был самым крупным), мы устанавливаем$c=1
... еще, если$x
есть-n
ВЗe
каче к$b
(то есть, синий не самый большой)$c
либо0
или в3
зависимости , если синий был вторым по величине ... еще$c=2
. Подобные логические множества$d
.Затем мы рассчитываем и распечатываем вывод с помощью следующего, который является всего лишь алгоритмом задачи.
источник
$z
при расчете$c
или$d
, и вы используете его только один раз в расчете выхода, так что вы можете$z
полностью избавиться и заменить его на$a[0]
?Руби,
1179694 байтаКод:
()
и использования переменных r, g, b.Примеры:
источник
SWI-Пролог, 133 байта
Пример:
a([255,165,245],Hue).
выходыHue = 306.666666666666 .
Это использует следующую формулу:
Max = max(R,G,B)
,Min = min(R,G,B)
.Max = R
,U = 0
. Иначе еслиMax = G
,U = 2
. ElseU = 4
.Max = R
,I = G
иJ = B
. Иначе , еслиMax = G
,I = B
иJ = R
. ОстальноеI = R
аJ = G
.Z = U + (I - J)/(Max - Min)
Hue
этоZ
или,Z + 360
еслиZ < 0
.источник
Perl 5,
138132119 байтКод:
Примечания:
Конечно, Perl не может выиграть такой вызов со всеми играми в Pyth'oreque. Но я задавался вопросом, возможно ли это сделать только с одним шагом вычисления. Благодаря модулю, который хорошо сработал. :)
Тест:
источник
C ++ 276 байт
источник
H
функцию в ответе одну, так как в code-golf автономная функция - это правильный ответ, эквивалентный полной программе, см. Мета-обсуждение: meta.codegolf.stackexchange.com/questions/2419/… . Это сделает ваш ответ более конкурентоспособным (сэкономьте 100 байтов в вашем случае). Вам по-прежнему рекомендуется оставить «полную» версию программы под решением, чтобы упростить тестирование.127 247 103
выдает недопустимое значение-120
вместо110
.R 125 байтов
Очень похоже на решение Octave мензурки. Выход с плавающей точкой.
Код:
Примеры:
источник
Python, 154 байта
Принимает список значений. Не уверен, что это можно сломать дальше. Вот это не разгромлено:
источник
JavaScript 108
Альтернативный метод.
JavaScript 194
Используя пример метода.
источник