Chuyển đổi giá trị CMYK sang RGB


9

Cho mã màu trong CMYK, chuyển đổi nó thành giá trị RGB.

Đầu vào:
chuỗi gồm 4 số nguyên (nằm trong khoảng từ 0 đến 100) được phân tách bằng dấu cách

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

Đầu ra:

#141592
#ABCDEF
#F49043 

Mã ngắn nhất sẽ thắng!

GỢI Ý: Để chuyển đổi CMYK sang RGB, bạn có thể sử dụng công thức như:

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)   

và sử dụng ba biến này để có được giá trị ở #RRGGBBđịnh dạng


1
Chúng ta có thể lấy CMYKgiá trị như số thập phân từ 0để 1hoặc là nó cần thiết để làm 0cho 100?
HyperNeutrino

1
Ngoài ra, chúng ta có nên nhập nhiều mã CMYK cùng một lúc hay chỉ một và chuyển đổi nó không?
HyperNeutrino

7
Chúng ta có thể lấy đầu vào làm danh sách các số hay nó phải là một chuỗi phân tách?
Mèo kinh doanh

7
Đầu vào / đầu ra mà bạn cung cấp không khớp với công thức, chúng ta nên xử lý làm tròn số như thế nào?
Rod

2
@Rod Có một chút chưa rõ ràng về cách xử lý các điểm không chính xác.
Erik the Outgolfer

Câu trả lời:




2

Thạch , 24 byte

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

Một chương trình đầy đủ in kết quả.

Hãy thử trực tuyến!

Lưu ý: làm tròn chứ không phải sàn có thể được sử dụng bằng cách chèn hai byte mã +.giữa 255.

Làm sao?

Ḳ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

Một cách khác để làm tròn sẽ _.Ċthay vì +.Ḟ... nhưng cách sau có thể được sử dụng rộng rãi hơn.
Erik the Outgolfer

2

Võng mạc , 103 byte

\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|;

^
#

Hãy thử trực tuyến! Lưu ý: Mã này rất chậm, vì vậy vui lòng không đập máy chủ của Dennis. Giải trình:

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

Chuyển đổi từng số thành unary và trừ từ 100.

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

Nhân tất cả các số với số cuối cùng sẽ bị xóa.

1
51$*

Nhân với 51, để một khi chúng ta chia cho 2000, chúng ta sẽ có được 100 * 100 * 51 / 2000 = 255như mong muốn.

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

Chia cho 32000 và sàn chia phần còn lại cho năm 2000, do đó tạo ra một cặp giá trị cơ sở 16, mặc dù đáng buồn là bản thân chúng vẫn được viết trong cơ sở 10.

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

Chuyển đổi từ cơ sở 10 sang cơ sở 16.

^
#

Chèn hàng đầu #.



2

Javascript (ES6), 106 byte

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) , 169 166 byte

#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);
}

Hãy thử trực tuyến!

Sử dụng công thức tối ưu hóa. Đã thêm +.5để chuyển đổi CMYK = 0 0 0 0chính xác sang RGB =0xffffff không cần thiết.


1

Python 3 , 114 110 108 106 104 byte

  • @xnor đã lưu 4 byte: đã xóa mã không cần thiết
  • @rod lưu 2 byte: công thức ngắn hơn
  • đã lưu 2 + 2 byte: range[3]như đã xóa [0,1,2]không mong muốn[]
n=input().split()
print('#'+''.join(hex(int(.0255*(100-int(n[i]))*(100-int(n[3]))))[2:]for i in[0,1,2]))

Hãy thử trực tuyến!





0

Javascript, 104 byte

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

Đoạn mã ví dụ:

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 byte

Giải pháp:

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

Ví dụ:

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"

Giải trình:

Khá đơn giản, đánh cắp các 0.0255mẹo từ các giải pháp khác (cảm ơn!). Đánh giá được thực hiện từ phải sang trái.

"#",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

Ghi chú:

Các số làm tròn theo mặc định, sẽ tốn 3 byte (_)để thay thế trước khi chuyển thành ngắn.


0

05AB1E , 18 byte

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

Hãy thử trực tuyến!

-1 nhờ kalsowerus .

Có điểm không chính xác, vì vậy kết quả có thể bị lệch, nhưng công thức trong câu hỏi được sử dụng.


Bạn có thể lưu một byte: $giống như
kalsowerus 7/07/17

@kalsowerus Chà, không chính xác, nhưng nó sẽ hoạt động trong trường hợp này ...
Erik the Outgolfer 7/07/17

Ồ đúng rồi .. Tôi không chắc đầu vào là gì inputkhi có nhiều
kalsowerus 7/07/17

0

Haskell, 165 byte

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

Fortran, 156 byte

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.