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 2016 년

1
또한 여러 CMYK 코드를 한 번에 또는 한 번에 입력하여 변환해야합니까?
HyperNeutrino 2016 년

7
입력을 숫자 목록으로 가져 오거나 구분 된 문자열이어야합니까?
비즈니스 고양이

7
입력 한 입력 / 출력이 공식과 일치하지 않으며 반올림을 어떻게 처리해야합니까?
Rod

2
@Rod 부동 소수점 부정확성을 어떻게 처리해야하는지 아직 불분명합니다.
Outgolfer Erik

답변:




2

젤리 , 24 바이트

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

결과를 인쇄하는 전체 프로그램.

온라인으로 사용해보십시오!

참고 :+.사이에 2 바이트의 코드를 삽입하여 바닥이 아닌 반올림을 사용할 수 있습니다 .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

반올림하는 또 다른 방법은 _.Ċ대신 +.Ḟ...하지만 후자가 더 널리 사용될 수 있습니다.
Outgolfer Erik

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$*

우리가 2000으로 나누면 100 * 100 * 51 / 2000 = 255원하는대로 얻을 수 있도록 51을 곱하십시오 .

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

32000으로 나누고 층을 나머지를 2000으로 나누면 슬프게도 여전히 10 진법으로 작성된 16 진법 값 쌍이 생성됩니다.

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

10 진법에서 16 진법으로 변환합니다.

^
#

선행을 삽입하십시오 #.



2

자바 스크립트 (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);
}

온라인으로 사용해보십시오!

최적화 된 공식을 사용합니다. CMYK = 를 RGB =로 올바르게 변환하기 위해 추가되었습니다+.50 0 0 00xffffff .


1

파이썬 3 , 114110108106104 바이트

  • @xnor 저장 4 바이트 : 불필요한 코드 삭제
  • @로드 저장 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

자바 스크립트, 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 바이트가 필요 합니다.


0

05AB1E , 18 바이트

$#т/-¤s¨*255*hJ'#ì

온라인으로 사용해보십시오!

kalsowerus 에게 -1 감사합니다 .

부동 소수점 부정확성이 있으므로 결과가 하나씩 나타날 수 있지만 문제의 공식이 사용됩니다.


당신은 바이트를 저장할 수 있습니다 $처럼 동일
kalsowerus

@kalsowerus 음, 정확히는 아니지만이 경우에는 효과가있을 것입니다.
Erik the Outgolfer

오 맞아 .. input여러 입력이 있을 때 어떤 입력이 있는지 확실하지 않습니다
kalsowerus

0

하스켈, 165 바이트

q=(1-).(/100)
x!y=h$ceiling$q x*(q y)*255
f c m y k=concat["#",c!k,m!k,y!k]
h x|x<16=[s!!x]|0<1=(h((x-m)`quot`16))++[s!!m] where m=x`mod`16
s=['0'..'9']++['a'..'f']

0

포트란, 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.