Від Rgb до Cmyk


9

Давши 3 байти або RGB як вхідні дані, обчисліть найближчі значення CMYK та виведіть їх.

  • створити або функцію з параметрами та поверненим значенням, або програму, яка працює на stdin / stdout
  • використовуйте кольоровий профіль на ваш вибір, але надайте посилання
  • вхід може бути або окремими числовими значеннями в діапазоні [0; 255], або шестизначною шістнадцятковою рядком
  • вихід має бути окремим числовим значенням, що становить або [0; 1], або [0; 100]
  • стандартний код гольфу: без лазівки , найкоротший виграш коду
  • екстравагантні ідеї вітаються

вибіркові дані:

input             output
108,174,106       [0.3793103448275862, 0.0, 0.3908045977011494, 0.3176470588235294]
0,0,0             0,0,0,1
170,255,238       33,0,7,0  
0x0088ff          1,0.4667,0,0
[250,235,215]     [0,6,14,1.96]  
#123456           .7907,.3953,0,.6627
  • Не Каліброване картографування - це добре і, мабуть, найпростіше
  • Не потрібно перевіряти вхід; поплавці дозволені (від 0 до 255), але можуть бути і округлими
  • Формат виводу повинен бути чітко коментованим або очевидним; тобто:
    1. CMYK у тому порядку
    2. не має значення відсоток [0; 100] чи чисті числа [0; 1]
  • Тестування повинно включати тривіальний приклад [0,0,0].

На цьому веб-сайті є найбільше цифр онлайн-інструментів, які я міг знайти. Хтось знає інструмент, який дає більше 4 цифр?


4
Чи можете ви навести кілька прикладів входів / виходів?
Кевін Кройсейсен

8
@KevinCruijssen Просто бічна примітка, але я не думаю, що саме так ви використовуєте ± ...
Leaky Nun

1
Ласкаво просимо на сайт! Це гідний виклик, але це трохи незрозуміло. Я голосую за те, щоб закрити, як незрозуміло, що ви просите, але якщо ви поясніть алгоритм їх перетворення та надати кілька тестових випадків, я відмовусь від свого голосу.
Джеймс

2
@KevinCruijssen У розділі прислівника написано південноафриканський . Це не використовується таким чином у стандартній англійській мові. Ми використовуємо ~.
mbomb007

1
Повідомлення про закрите голосування дещо вводить в оману, оскільки воно випливає з наших кореневих запитань, але насправді "було затримано як незрозуміло, що ви просите". У коментарях було декілька запитів на роз'яснення, до яких не зверталися: конкретно, чи дозволені введення та виведення у вигляді плаваючих значень між 0 та 1 (чи повинні бути цілі числа від 0 до 255), як конверсія насправді працює, і чи можете ви включити деякі тестові випадки.
Мартін Ендер

Відповіді:


8

Діалог APL , 16 15 байт

1-⊢(÷,255÷⍨⊢)⌈/

1 мінус 1-
X, поділений на ÷ Y , далі ,255 ділення 255÷⍨ Y , де
  X є самим собою (тобто список значень RGB), і
   Y - max/⌈(значення RGB).

{J=max(R,G,B)C=1RJM=1GJY=1BJK=1J255

СпробуйтеAPL!

Кредити:
 ∘ -1 байт на ngn .


Коли PPCG отримує MathJax?
Ніл


+1 для ! Nice смайлик
програміст5000

1
@ programmer5000 Дякую Ви знайдете його в майже всіх моїх кодах-гольфах. Він поміняє місцями аргументи функції зліва. Інші смайлики APL - це та . Сподіваюсь, ми отримаємо і скоро.
Adám

@ Adám зробив би мене щасливим!
програміст5000

8

C # , 88 86 85 84 байт

(r,g,b)=>{float[]a={r,g,b,1};var j=a.Max();a[3]=j*j/255;return a.Select(x=>1-x/j);};

вихід для 108,174,106:

0.3793104
0
0.3908046
0.3176471

Оскільки OP дозволяє функціонувати, я представив лише лямбда. Ви можете знайти демонстраційну версію на .NetFiddle . Я не гольфіст, дописую заради розваги. Також це моя перша відповідь \ о /. Не соромтесь коментувати будь-які покращення :)

Кудос до Лікі монахині за формулою.

застереження: це не працює для [0,0,0] (дякую Тіту)


1
1.0-x/j? Ви точно не можете зробити 1-x/j?
Ерік Аутгольфер

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ так, я можу! Це був відпочинок від досвіду. Мета полягала в тому, щоб автоматичний кидок подвоївся. Я його знімаю.
aloisdg переходить на codidact.com

1
Вам це не потрібно для віднімання в будь-якому випадку. Крім того, ви, здається, не використовуєте повторно a[3], і вам не здається вказати фіксований розмір для a, так що ви можете це зробити {r,g,b}і a[3]=j*j(тому що так чи інакше 1 * a = a).
Ерік Аутгольфер

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Я повторно використовувати aз select(). Якщо я буду використовувати a[3]таке, я вийду за межі поля та кину, не буду?
aloisdg переходить на codidact.com

1
Чудова перша відповідь і ласкаво просимо до PPCG! Якщо ви хочете відобразити мову та байти шрифтом більшого розміру, як і інші відповіді (що зазвичай тут є стандартним), ви можете додати #перед рядком. :)
Кевін Круїссен

4

Пітон, 46 байт

lambda*c:[1-i/max(c)for i in c]+[1-max(c)/255]

Потрібно, щоб вхід був плаває в Python 2, досить впевнений, що він не в 3.


3

JavaScript (ES6), 58 51 байт

a=>[...a.map(e=>1-e/m||1,m=Math.max(...a)),1-m/255]

Приймає масив [R, G, B](додайте 7 байт для окремих параметрів) і повертає масив, [C, M, Y, K]використовуючи каліброване кольорове відображення.


Ви впевнені у замовленні СУМК у другій відповіді? мені схоже на CMYK
Тит

2) Чи знаєте ви, чому розповсюдження aсумішей збільшує його вміст? Це дивно. 3) Ви протестували [0,0,0]? Не виняток в ES, але виглядає як поділ на нуль.
Тит

Вибачте, вони обидва CMY, це була моя вина. Тепер також виправлені [0,0,0] випадки.
Ніл

4) Спробуйте [...a,m=Math.max(...a)]в своєму масиві рішення. 5) Чи можете ви додатково гольфу, використовуючи масив як вхідний? Подумайте про використання a.0тощо замість .map.
Тит

@Titus Я придумав абсолютно новий підхід, який фактично віддає перевагу порядку CMYK і заощаджує 7 байт!
Ніл

3

Математика, 36 28 33 байти

List@@ColorConvert[{##}/255,"CMYK"]&

Після лібералізації форматів вводу / виводу, гольф далі: List@@#~ColorConvert~"CMYK"&

Анонімна функція, яка робить те, що просять.

Стара функція приймає три аргументи від 0 до 255 (все, що перевищує цей діапазон, буде автоматично відрізане до цього діапазону) і повертає масив значень "CMYK" між 0.і1.

Приклад (для старої функції):

List @@ ColorConvert[{##}/255, "CMYK"] &[108, 174, 106]
{0.37931, 0., 0.390805, 0.320313}

Оскільки масиви дозволені як вхідні дані, 33 байти:

List@@ColorConvert[#/255,"CMYK"]&

Звичайно , ці вбудовані функції ручки {0, 0, 0}правильно і повертається {0, 0, 0, 1}.


1) Для уточнення: вхідні значення повинні бути в [0; 255]. відредагуйте питання через хвилину, 2) Будь ласка, протестуйте [0,0,0]. 3) Чи не повинно це бути /255?
Тит

@Titus ти маєш рацію, його 255, наразі не вдається вирішити всі проблеми, я все виправляю якнайшвидше
LLlAMnYP

@Titus виправив це
LLlAMnYP

2

Bash + ImageMagick, 69 байт

convert "xc:$1[1x1]" -colorspace cmyk txt:-|grep -o '([^)]*)'|head -1

Приклад:

$ ./rgb2cmyk.sh "#6CAE6A"
(38%,0%,39%,32%)

$ ./rgb2cmyk.sh "#000000"
(0%,0%,0%,100%)

$ ./rgb2cmyk.sh "#AAFFEE"
(33%,0%,7%,0%)

$ ./rgb2cmyk.sh "#0088ff"
(100%,47%,0%,0%)

$ ./rgb2cmyk.sh "#FAEBD7"
(0%,6%,14%,2%)

$ ./rgb2cmyk.sh "#123456"
(79%,40%,0%,66%)

2

SmileBASIC, 73 72 байти

INPUT R,G,B
J=MAX(R,G,B)IF!J THEN?0,0,0,1 ELSE?1-R/J,1-G/J,1-B/J,1-J/255

Може бути набагато коротше.


Ти мав на увазі писати J=MAX(R,G,B)?
Андракіс

Так дякую.
12Me21

2

Піта, 24 21 18 24 21 байт

Життя, дійсно, поїздка в два рази.

= cR255Q + mc - 1dK-1JeSQJQK 
= cR255Q + mc-JeSQdJQ-1J 
+ mc-JeSQdJQ-1cJ255 
+ mc-JeSQd + J ^ T_15Q-1cJ255
+ m-1? JeSQcdJ1Q-1cJ255

Тестовий набір.

Зразок введення: 108,174,106

Вибірка зразка: [0.3793103448275862, 0.0, 0.3908045977011494, 0.3176470588235294]

Зразок введення: 0,0,0

Вибірка зразка: [0, 0, 0, 1.0]

Використовувана формула:

{J=мах(R,Г,Б)С=1-RJМ=1-ГJY=1-БJК=1-J255

Стара формула: http://i.stack.imgur.com/ZtPD6.gif

Стара формула: http://i.stack.imgur.com/Nqi9F.gif


приємний гольф. піклуєтесь про поломку?
Тит

2

Літп , 114 байт

#R,G,B::((var J(max R G B))(if(!= 0 J)((list(- 1(/ R J))(- 1(/ G J))(- 1(/ B J))(- 1(/ J 255))))((list 0 0 0 1))))

Спробуйте в Інтернеті!

  • Збережено 6 байт (забув, що maxбере будь-яку кількість аргументів)

Я не зовсім впевнений, що це правильно. Перші два результати із зразковими даними є правильними, а решта - ні (див. Спробуйте в Інтернеті .)

Використовується описана реалізація як слід:

{J=мах(R,Г,Б)С=1-RJМ=1-ГJY=1-БJК=1-J255


1

PHP 7, 123 110 105 байт

Введіть як колір RGB 100 240 75

$j=max($h=$argv);echo strtr(@(1-$h[1]/$j).",".@(1-$h[2]/$j).",".@(1-$h[3]/$j).",".(1-$j/255),["NAN"=>0]);

Виводить значення CMYK у вигляді десяткових знаків у 0...1 діапазоні.

Збережено багато байт завдяки Титу.

Використання зразка:

php -r '$j=max($h=$argv...' 100 240 75
0.58333333333333,0,0.6875,0.058823529411765

php -r '$j=max($h=$argv...' 255 255 255
0,0,0,0

php -r '$j=max($h=$argv...' 0 255 0
1,0,1,0

php -r '$j=max($h=$argv...' 0 0 0 
0,0,0,1

Тестуйте онлайн


Вхід у кольорі HEX #123456, 202 байти

$h=str_split(substr($argv[1],-6),2);$j=max($r=hexdec($h[0]),$g=hexdec($h[1]),$b=hexdec($h[2]));echo z($r,$j),",",z($g,$j),",",z($b,$j),",",1-$j/255;function z($c,$y){return is_nan(@($c/$y))?0:1-$c/$y;}

54 байти для функції для запобігання поділу на нуль, ймовірно, пограбуючи або знімним.

Отримує колір вхідного RGB як HEX #123456та виводить CMYK як десятковий 0...1діапазон.

Використання зразка:

php -r '$h=str_split...' '#000000'
0,0,0,1

php -r '$h=str_split...' '#ffffff'
0,0,0,0

php -r '$h=str_split...' '#123456'
0.7906976744186,0.3953488372093,0,0.66274509803922

php -r '$h=str_split...' '#ffff00'
0,0,1,0

separate numeric valuesзначить, ви можете просто брати $h=$argv;і використовувати $h[1]замість і $h[0]т. д. Мені подобається NANтрюк; але хіба це не попередження? strtrймовірно, коротше str_replaceі NANне потребує котирування (дасть сповіщення, але вони не відображаються у конфігурації за замовчуванням).
Тит

Також, будь ласка, надайте версію PHP, в якій працює. Він не в PHP 7 (де 1/0результати в INF) або PHP 5 ( 1/0=> false).
Тит

@Titus Дякую за дуже цікаву $argvпідказку масиву в командному рядку! Я додав PHP-версію. Це працює з NANтим, що коли ви користуєтесь str_replaceним, неявно перетворює число в рядок, щоб воно виводило NAN, насправді, якщо ви перейдете за цим посиланням , ви побачите, що воно виводиться NANчерез str_replace("INF"замість цього str_replace("NAN". Я не міг змусити це працювати strtr. Я додав, @щоб придушити попередження.
Маріо

Я виявив свою помилку: $n/0є INF, але 0/0є NAN(також у PHP 7.0). Ви можете зберегти 4 байти str_replace(NAN,0,$s)або 6 байт за допомогою strtr($s,["NAN"=>0).
Тит

@Titus велике спасибі, я не міг зрозуміти, як правильно користуватися strtr();
Маріо

1

PHP, не конкуруючи

Я просто надто спокусився розмістити своє.

Вхід RGB, 74 байти

for(;$i++<4;)echo$i<4?($j=max($argv))?1-$argv[$i]/$j:0:1-$j/255,","[$i>3];

або 68 байт із комою у висновку: видалити [$i>3] .

Бігайте з php -r '<code>' <red-value> <green-value> <blue-value> .

HEX-вхід, 100 байт

foreach($a=array_map(hexdec,str_split($argv[1],2))as$c)echo($j=max($a))?1-$c/$j:0,",";echo 1-$j/255;  

Бігайте з php -nr '<code>' RRGGBB .

Цей підхід зайняв би 75 байт для введення RGB:
замініть foreach($a=array_map...as$c)на foreach($a=$argv as$c)if($i++).


0

C, 155 байт

#define C(x) 1-x/(j>0?j:1)
#define F float
i=0;F j;f(F r,F g,F b){j=(r>g?r:g)>b?(r>g?r:g):b;for(;i++<4;)printf("%f\n",i>1?i>2?i>3?1-j/255:C(b):C(g):C(r));}

Я намагаюся розібратися, як можливо більше гольфу.

Використання:

#define C(x) 1-x/(j>0?j:1)
#define F float
i=0;F j;f(F r,F g,F b){j=(r>g?r:g)>b?(r>g?r:g):b;for(;i++<4;)printf("%f\n",i>1?i>2?i>3?1-j/255:C(b):C(g):C(r));}
main(){
    f(108,174,106);
}

Вихід:

0.379310
0.000000
0.390805
0.317647

1) +3: помилка: функція повинна повертати результат, а не друкувати. (вибачте, що я щойно це побачив) 2) +4: error: i не оголошено. 3) +0: помилка: ваші потрійні оператори здаються вимкненими. цього не повинно бутиi>0?i>1?i>2
Тіт

але є певний потенціал для гольфу; Я знайшов -25 байт в ANSI C, а ще -19 в C99. Тут розміщено 2 байти:, j>0?17 - для позбавлення від циклу і 6 - для розбиття jвизначення.
Тит

додайте ще +3 для функції: вона повертає щось інше, ніж int, тому тип повернення потрібен ( F *). Але я знайшов ще один байт для гольфу далеко в C99.
Тит

@Titus Якщо я не помиляюся, j>0?j:1можна j+!jдосягти -3 байти.
Альберт Реншо

І я думаю, що Cмакрос невірний: 1-x/1для j==0? Я думаю, що так і має бути 1-(j>0?x/j:1).
Тит

0

Хун , 110 байт

=>
rs
|*
a/*
=+
[s=(cury sub .1) j=(roll a max)]
(welp (turn a |*(* (s (min .1 (div +< j))))) (s (div j .255)))

Використовуйте єдину точну бібліотеку з плаваючою комою. Створіть нову загальну функцію, яка займає a. Встановіть, sщоб subпоповнитись .1згодом, іj складання більш aзmax .

Зіставте карту a, розділивши кожен елемент на j, знайдіть мінімум цього та 1 для нормалізації NaN, а потім відніміть 1 s. Додати 1-j/255в кінці цього списку.

> =f =>
  rs
  |*
  a/*
  =+
  [s=(cury sub .1) j=(roll a max)]
  (welp (turn a |*(* (s (min .1 (div +< j))))) (s (div j .255)))
> (f (limo ~[.108 .174 .106]))
[i=.3.7931037e-1 t=[i=.0 t=[i=.3.908046e-1 .3.1764704e-1]]]
> (f (limo ~[.0 .0 .0]))
[i=.0 t=[i=.0 t=[i=.0 .1]]]

Чи можете ви надати TiO, будь ласка.
Тит

@Titus: На жаль, у Hoon немає сайту TiO.
Налаштування візуалізації
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.