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)   

これらの3つの変数を使用して、値を#RRGGBBフォーマットで取得します


1
CMYK値を0to から小数として取得できますか、それとも1toにする必要がありますか?0100
HyperNeutrino 2017年

1
また、複数のCMYKコードを一度に入力するのですか、それとも1つだけ入力して変換するのですか?
HyperNeutrino 2017年

7
入力を数値のリストとして取得できますか、それとも区切り文字列である必要がありますか?
ビジネス猫

7
入力した入力/出力が式と一致しません。丸めをどのように処理する必要がありますか?
ロッド

2
@Rod浮動小数点の不正確さをどのように処理するかは、まだはっきりしていません。
Erik the Outgolfer 2017

回答:




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

丸めのもう1つの方法_.Ċ+.Ḟ...の代わりですが、後者はおそらくより広く使用されています。
Erik the Outgolfer 2017

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の値のペアが生成されます。

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

オンラインでお試しください!

最適化された式を使用します。CMYK = 正しいをRGB = に変換するために追加さ+.5れましたが、0 0 0 00xffffffこれは必要ありません。


1

Pythonの3114の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]))

オンラインでお試しください!





0

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

ノート:

デフォルトで数値を丸めると、(_)代わりにshortにキャストする前に3バイトがフロアにかかります。


0

05AB1E、18バイト

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

オンラインでお試しください!

-1 kalsowerusに感謝します

浮動小数点の不正確さがあるため、結果は1つずれる可能性がありますが、質問の式が使用されます。


バイトを保存できます。これ$
kalsowerusの

@kalsowerusまあ、そうではありませんが、この場合は機能します...
アウトゴルファのエリック

右ああ..私は確信している入力じゃない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.