从Rgb到Cmyk


9

给定3字节或RGB作为输入,计算最接近的CMYK值并输出。

  • 创建带有参数和返回值的函数或在stdin / stdout上运行的程序
  • 使用您选择的颜色配置文件,但提供参考
  • 输入可以是[0; 255]范围内的单独数值,也可以是6位十六进制字符串
  • 输出应为[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
欢迎光临本站!这是一个不错的挑战,但还不清楚。我投票决定不清楚您要问的内容,但是如果您解释将其转换的算法并提供一些测试用例,我将撤回表决。
詹姆斯(James)

2
@KevinCruijssen在副词部分中说“ South African”。在标准英语中并没有使用这种方式。我们使用~
mbomb007 '16

1
亲密投票的消息有点误导人,因为它源于我们问答的根源,但确实是“由于不清楚您要问的内容而被搁置”。注释中有两处要求澄清的请求,这些请求没有得到解决:具体来说,是否允许输入和输出以0到1之间的浮点数(或是否必须是0到255之间的整数),转换的实际工作方式,以及是否可以包含一些测试用例。
Martin Ender

Answers:


8

Dyalog APL16 15 字节

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

1减去1-
X除以÷ Y,再乘以,255除以255÷⍨ Y ,其中
  X本身(即RGB值列表),
  Y是最大值/⌈(RGB值)。

{J=maX[RGC=1个-[RĴ中号=1个-GĴÿ=1个-Ĵķ=1个-Ĵ255

试试APL!

学分:
 ∘-1个字节,单位为ngn


PPCG何时获得MathJax?
尼尔


+1 !精美的图释
程序员

1
@ programmer5000谢谢。您几乎会在我的所有代码高尔夫球中找到一个。它将函数的参数交换到其左侧。其他APL表情符号是。我希望我们能得到很快。
2015年

@Adám 会让我开心!
程序员

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允许功能,因此我仅提交了lambda。您可以在.NetFiddle上找到正在运行的演示。我不是高尔夫球手,我发贴是为了好玩。另外,这是我的第一个答案\ o /。随时评论任何改进:)

该公式向Leaky Nun表示敬意。

注意:[0,0,0]无效(谢谢泰特斯)


1
1.0-x/j?你肯定不能吗1-x/j
暴民埃里克

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ是的,我可以!这是一次休息。目标是自动转换为两倍。我将其删除。
aloisdg移至codidact.com,2016年

1
无论如何,您不需要减法。另外,您似乎并没有重复使用a[3],也似乎没有为指定一个固定大小a,因此您可以使用{r,g,b}and a[3]=j*j(因为无论如何,1 * a = a)。
暴民埃里克

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ我正在重复a使用select()。如果我这样使用,a[3]我会超出范围并抛出,对吗?
aloisdg移至codidact.com,2016年

1
伟大的第一答案,欢迎来到PPCG!如果要像其他答案一样以较大的字体显示语言和字节(通常是此处的标准),则可以#在该行的前面添加一个。:)
Kevin Cruijssen

4

Python,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]使用未校准的颜色映射返回一个数组。


您确定第二个答案的订单为CYMK吗?在我看来就像CMYK。
泰特斯(Titus)

2)你知道为什么传播会a混淆其内容吗?真奇怪 3)您测试过[0,0,0]吗?ES中也不例外,但看起来像被零除。
泰特斯(Titus)

抱歉,他们都是CMY,这是我的错。现在还修复了[0,0,0]的情况。
尼尔

4)尝试[...a,m=Math.max(...a)]使用阵列解决方案。5)您能否使用数组作为输入来进一步打高尔夫球?考虑使用a.0etc.代替.map
泰特斯

@Titus我现在想出了一种全新的方法,它实际上更喜欢CMYK顺序并且也节省了7个字节!
尼尔

3

Mathematica, 36 28 33字节

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

I / O格式自由化之后,进一步发展: List@@#~ColorConvert~"CMYK"&

匿名函数,执行要求的操作。

旧函数接受0到255之间的三个参数(超出此范围的任何值都会自动裁剪到该范围),并返回介于0.和之间的“ CMYK”值数组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)

@Titus你说的对,它的255目前无法解决所有问题,我会尽早解决问题
LLlAMnYP '16

@Titus修复了它
LLlAMnYP '16

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)吗?
Andrakis

是的,谢谢。
17Me21年

2

Pyth,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]

使用的公式:

{Ĵ=一个X[RGC=1个-[RĴ中号=1个-GĴÿ=1个-Ĵķ=1个-Ĵ255

旧公式:http//i.stack.imgur.com/ZtPD6.gif

旧公式:http//i.stack.imgur.com/Nqi9F.gif


打高尔夫球不错。关心故障?
泰特斯

2

Lithp,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任何数量的参数)

我不太确定这是对的。带有样本数据的前两个结果是正确的,但其余的则不正确(请参阅在线尝试。)

使用很好地描述的实现如下:

{Ĵ=一个X[RGC=1个-[RĴ中号=1个-GĴÿ=1个-Ĵķ=1个-Ĵ255


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范围。

感谢Titus,节省了很多字节。

用法示例:

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

在线测试


输入为十六进制颜色#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颜色作为输入#123456,以0...1范围的十进制形式输出CMYK 。

用法示例:

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不需要引用(将产生通知,但这些通知不会显示在默认配置中)。
泰特斯(Titus),

另外,请提供可以使用的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。我添加了@以禁止显示警告。
马里奥(Mario)

我发现了我的错误:$n/0INF,但是0/0NAN(也在PHP 7.0中)。您可以使用保存4个字节str_replace(NAN,0,$s)或使用保存6个字节strtr($s,["NAN"=>0)
泰特斯

@Titus非常感谢,我不知道如何正确使用strtr()
马里奥(Mario)

1

PHP,不竞争

我太想发表自己的想法了。

RGB输入,74字节

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

或68个字节,输出中带有尾随逗号:remove [$i>3]

用运行php -r '<code>' <red-value> <green-value> <blue-value>

十六进制输入,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

该方法将为RGB输入占用75个字节:
替换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:错误:我没有被声明。3)+0:错误:您的三元运算符似乎已关闭。那不应该是i>0?i>1?i>2
Titus

但是还有打高尔夫球的潜力;我在ANSI C中找到-25个字节,在C99中找到另一个-19个字节。这里有2个字节:j>0?摆脱循环的字节数为17,拆分j定义的字节数为6 。
泰特斯(Titus)

为该函数添加另一个+3:它返回除int之外的其他值,因此需要返回类型(F *)。但是我发现另一个字节可以在C99中打高尔夫球。
泰特斯(Titus)

@Titus如果我没记错的话,j>0?j:1可以j+!j达到-3个字节。
艾伯特·伦肖

而且我认为该C宏是不正确的:1-x/1for 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。设置ssub咖喱.1备后用,j以折叠amax

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]]]

您能提供二氧化钛吗?
泰特斯(Titus),

@Titus:不幸的是,Hoon没有TiO网站。
RenderSettings'2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.