แปลงค่า 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ค่าเป็นทศนิยมจาก0ถึง1หรือจำเป็นต้องทำ0เพื่อ100?
HyperNeutrino

1
นอกจากนี้เราควรใส่รหัส CMYK หลายรหัสพร้อมกันหรือเพียงครั้งเดียวและแปลงเป็นรหัสหรือไม่
HyperNeutrino

7
เราสามารถรับอินพุตเป็นรายการตัวเลขหรือต้องเป็นตัวคั่นสตริงหรือไม่?
ธุรกิจ Cat

7
อินพุต / เอาต์พุตที่คุณระบุไม่ตรงกับสูตรเราควรจัดการกับการปัดเศษอย่างไร
ร็อด

2
@Rod มันค่อนข้างชัดเจนว่าการจัดการกับความไม่ถูกต้องของเลขทศนิยมนั้นเป็นอย่างไร
Erik the Outgolfer

คำตอบ:




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

^
#

ลองออนไลน์! หมายเหตุ: รหัสนี้ช้ามากดังนั้นโปรดอย่าใช้เซิร์ฟเวอร์ของเดนนิส คำอธิบาย:

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

แปลงตัวเลขแต่ละตัวเป็น unary และลบออกจาก 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

C ++ (gcc) , 169 166 ไบต์

#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]ตามที่[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 ไบต์(_)ถึงพื้นแทนก่อนที่จะส่งสัญญาณให้สั้น


0

05AB1E , 18 ไบต์

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

ลองออนไลน์!

-1 ขอบคุณที่kalsowerus

มีความไม่ถูกต้องที่เป็นทศนิยมดังนั้นผลลัพธ์อาจไม่ตรงกับความเป็นจริง แต่จะใช้สูตรในคำถาม


คุณสามารถบันทึกไบต์: $เป็นเช่นเดียวกับ
kalsowerus

@kalsowerus เอ่อไม่เหมือนกัน แต่มันจะใช้ได้ในกรณีนี้ ...
Erik the Outgolfer

โอ้ถูกต้อง .. ฉันไม่แน่ใจว่าจะป้อนข้อมูลใดinputเมื่อมีหลายรายการ
kalsowerus


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.