将CMYK值转换为RGB


9

给定CMYK中的颜色代码,将其转换为RGB值。

输入:
4个整数字符串(0到100之间),以空格分隔

86 86 0 43
28 14 0 6
0 41 73 4

输出:

#141592
#ABCDEF
#F49043 

最短的代码胜出!

提示:要将CMYK转换为RGB,可以使用以下公式:

Red   = 255 x (1 - Cyan/100)    x (1 - Black/100)   
Green = 255 x (1 - Magenta/100) x (1 - Black/100)   
Blue  = 255 x (1 - Yellow/100)  x (1 - Black/100)   

并使用这三个变量来获取#RRGGBB格式值


1
我们可以采取CMYK值小数从01或做它需要0100
HyperNeutrino

1
另外,我们是否应该一次输入多个CMYK码,或者仅输入一个并转换?
HyperNeutrino

7
我们可以将输入作为数字列表还是必须是定界字符串?
Business Cat

7
您提供的输入/输出与公式不匹配,还应该如何处理舍入?
Rod

2
@Rod还不清楚如何处理浮点错误。
大公埃里克(Erik the Outgolfer)

Answers:




2

果冻,24 字节

ḲV÷ȷ2ạ1×Ṫ$×255ḞṃØHṙ1¤ṭ”#

打印结果的完整程序。

在线尝试!

注意:可通过+.255和之间插入两个字节的代码来使用舍入而不是下限

怎么样?

ḲV÷ȷ2ạ1×Ṫ$×255ḞṃØHṙ1¤ṭ”# - Main link: list of character, s
Ḳ                        - split at spaces (makes a list of lists of characters)
 V                       - evaluate as Jelly code (makes a list of the decimal numbers)
   ȷ2                    - literal 100
  ÷                      - divide (vectorises to yield [C/100, M/100, Y/100, K/100])
     ạ1                  - absolute difference with 1 -> [1-(C/100),...]
         $               - last two links as a monad:
        Ṫ                -   tail (this is 1-(K/100))
       ×                 -   multiply (vectorises across the other three)
          ×255           - multiply by 255 (vectorises)
              Ḟ          - floor to the nearest integer
                    ¤    - nilad followed by link(s) as a nilad:
                ØH       -   hex-digit yield = "0123456789ABCDEF"
                  ṙ1     -   rotate left by 1 -> "123456789ABCDEF0"
               ṃ         - base decompress (use those as the digits for base length (16))
                      ”# - literal character '#'
                     ṭ   - tack
                         - implicit print

舍入的另一种方法是_.Ċ代替+.Ḟ...,但是后者可能被更广泛地使用。
暴民埃里克(Erik the Outgolfer)

2

视网膜,103字节

\d+
$*1;100$*
(1*);\1

1(?=.* (1*))|1
$1
1
51$*
(1{32000})*(1{2000})*1*.
;$#1;$#2
T`d`L`1\d
;B\B|;

^
#

在线尝试!注意:此代码非常慢,因此请不要锤打Dennis的服务器。说明:

\d+
$*1;100$*
(1*);\1

将每个数字转换为一元并从100中减去。

1(?=.* (1*))|1
$1

将所有数字乘以最后一个被删除的数字。

1
51$*

乘以51,因此一旦我们除以2000,就可以得到100 * 100 * 51 / 2000 = 255所需的值。

(1{32000})*(1{2000})*1*.
;$#1;$#2

除以32000,然后将余数除以2000,则生成一对以16为底的值,尽管遗憾的是它们本身仍以10为底。

T`d`L`1\d
;B\B|;

从10转换为16

^
#

插入开头#



2

Javascript(ES6),106个字节

f=
(s,z=s.split` `,k=z.pop())=>'#'+z.map(x=>('0'+(.0255*(100-x)*(100-k)+.5|0).toString(16)).slice(-2)).join``
<input id=i value="28 14 0 6"/><button onclick="o.innerHTML=f(i.value)"/>Go</button>
<pre id=o></pre>


2

C ++(gcc)169166字节

#import<iostream>
#import<iomanip>
#define F(x)int(.0255*(100-x)*(100-k))
int main(){
int c,m,y,k;
std::cin>>c>>m>>y>>k;
std::cout<<"#"<<std::hex<<F(c)<<F(m)<<F(y);
}

在线尝试!

使用优化的公式。添加+.5了将CMYK = 0 0 0 0正确转换为RGB =的功能0xffffff,这不是必需的。


1

Python 3中114个110 108 106 104字节

  • @xnor保存了4个字节:删除了不必要的代码
  • @rod保存2个字节:较短的公式
  • 保存2 + 2字节:range[3]as [0,1,2],不需要[]删除
n=input().split()
print('#'+''.join(hex(int(.0255*(100-int(n[i]))*(100-int(n[3]))))[2:]for i in[0,1,2]))

在线尝试!



1

Javascript,104个字节

s=>"#"+[0,1,2].map(n=>("0"+((255-2.55*s[n])*(1-s[3]/100)|0).toString(16)).slice(-2),s=s.split` `).join``

示例代码段:

f=

s=>"#"+[0,1,2].map(n=>("0"+((255-2.55*s[n])*(1-s[3]/100)|0).toString(16)).slice(-2),s=s.split` `).join``

console.log(f("86 86 0 43"))
console.log(f("28 14 0 6"))
console.log(f("0 41 73 4"))




0

q / kdb +,55个字节

解:

"#",raze{(last($)0x0 vs)each"h"$.0255*x[3]*x 0 1 2}100-

例子:

q)"#",raze{(last($)0x0 vs)each"h"$.0255*x[3]*x 0 1 2}100-86 86 0 43
"#141491"
q)"#",raze{(last($)0x0 vs)each"h"$.0255*x[3]*x 0 1 2}100-28 14 0 6
"#adcef0"
q)"#",raze{(last($)0x0 vs)each"h"$.0255*x[3]*x 0 1 2}100-0 41 73 4
"#f59042"

说明:

相当简单,0.0255从其他解决方案中偷了把戏(谢谢!)。评估从右到左执行。

"#",raze {(last string 0x0 vs) each "h"$ .0255 * a[3] * a 0 1 2}100- / ungolfed
         {                                                     }     / lambda function
                                                                100- / subtract from 100 (vector)
                                                        a 0 1 2      / index into a at 0, 1 and 2 (CMY)
                                                 a[3]                / index into at at 3 (K)
                                                      *              / multiply together
                                         .0255 *                     / multiply by 0.255
                                    "h"$                             / cast to shorts
          (                  ) each                                  / perform stuff in brackets on each list item
                       0x0 vs                                        / converts to hex, 1 -> 0x0001
                string                                               / cast to string, 0x0001 -> ["00", "01"]
           last                                                      / take the last one, "01"
    raze                                                             / join strings together
"#",                                                                 / prepend the hash

笔记:

默认情况下,四舍五入数字将花费3个字节(_)作为下限,而强制转换为short。




0

Fortran,156个字节

PROGRAM C
REAL,DIMENSION(4,3)::d
READ(*,*)((d(i,j),i=1,4),j=1,3)
WRITE(*,'((A,3(Z2)))')(35,(INT(.0255*(100-d(i,j))*(100-d(4,j))),i=1,3),j=1,3)
END PROGRAM C
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.