RgbからCmykへ


9

入力として3バイトまたはRGBを指定して、最も近いCMYK値を計算し、出力します。

  • パラメータと戻り値を持つ関数、またはstdin / stdoutを操作するプログラムを作成する
  • 選択したカラープロファイルを使用しますが、参照を提供します
  • 入力は、範囲[0; 255]の個別の数値または6桁の16進文字列のいずれかです。
  • 出力は、[0; 1]または[0; 100]の範囲の個別の数値である必要があります
  • 標準コードゴルフ:抜け穴なし、最短コード勝利
  • 贅沢なアイデアは大歓迎です

サンプルデータ:

input             output
108,174,106       [0.3793103448275862, 0.0, 0.3908045977011494, 0.3176470588235294]
0,0,0             0,0,0,1
170,255,238       33,0,7,0  
0x0088ff          1,0.4667,0,0
[250,235,215]     [0,6,14,1.96]  
#123456           .7907,.3953,0,.6627
  • 未調整のマッピングは問題なく、おそらく最も簡単です
  • 入力検証は不要です。floatは許可されます(範囲は0〜255)が、丸められることもあります
  • 出力形式は、明確にコメントされているか、明白である必要があります。つまり:
    1. この順序でCMYK
    2. パーセンテージ[0; 100]でも純粋な数値[0; 1]でもかまいません
  • テストには簡単な例[0,0,0]を含める必要があります。

このサイトには、私が見つけることができる最も多くの数のオンラインツールがあります。4桁を超えるツールを知っている人はいますか?


4
入力/出力の例をいくつか教えていただけますか?
Kevin Cruijssen

8
@KevinCruijssen余談ですが、±の使い方はそうは思いません...
Leaky Nun

1
サイトへようこそ!これはまともな挑戦ですが、少し不明確です。私はあなたが何を求めているのかを不明確にするように投票しますが、それらを変換するアルゴリズムを説明し、いくつかのテストケースを提供する場合、私は投票を撤回します。
ジェームズ

2
@KevinCruijssen副詞セクションでは、南アフリカ語です。標準の英語ではそのようには使用されません。使用しています~
mbomb007 2016年

1
近い投票メッセージは、Q&Aのルーツに由来するため、少し誤解を招くメッセージですが、それは確かに、「あなたが何を求めているのか不明確なため、保留にされました」。対処されなかったコメントの明確化の要求がいくつかありました:具体的には、0と1の間の浮動小数点数としての入力と出力が許可されているか(または0から255の整数でなければならないか)、変換が実際にどのように機能するか、いくつかのテストケースを含めることができるかどうか。
マーティンエンダー2016

回答:


8

Dyalog APL16 15 バイト

1-⊢(÷,255÷⍨⊢)⌈/

1マイナス1-
Xはで割っ÷ Y続いて、,分割255 255÷⍨ Y
  Xは、それ自体で(すなわち、RGB値のリスト)、および
  Yは最大である/⌈(RGB値)。

{J=max(R,G,B)C=1RJM=1GJY=1BJK=1J255

TryAPL!

クレジット:ngnで
 ∘-1バイト。


PPCGはいつMathJaxを取得しますか?
Neil


+1 !素敵な絵文字
programmer5000

1
@ programmer5000ありがとうございます。あなたはほとんどすべての私のコードゴルフでそれを見つけるでしょう。関数の引数を左側に入れ替えます。その他のAPLの顔文字がある。私は、我々が得るいただければ幸いですし、すぐに。
アダム

@アダムは私を幸せにするでしょう!
programmer5000

8

C#88 86 85 84バイト

(r,g,b)=>{float[]a={r,g,b,1};var j=a.Max();a[3]=j*j/255;return a.Select(x=>1-x/j);};

の出力108,174,106

0.3793104
0
0.3908046
0.3176471

OPは関数を許可するので、ラムダのみを送信しました。.NetFiddleで実行中のデモを見つけることができます。私はゴルファーではありません。楽しみのために投稿します。また、それが私の最初の答えです\ o /。改善点があればコメントしてください:)

数式のLeaky Nunへの称賛。

注意:[0,0,0]では機能しません(Titusに感謝)


1
1.0-x/j?きっとできないの1-x/j
Erik the Outgolfer 2016年

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀはい、できます!体験からの休憩でした。目標は、自動キャストしてダブルになることでした。削除します。
aloisdgがcodidact.comに移動2016年

1
とにかくあなたはそれを引き算に必要としません。また、あなたは再使用にいないようだa[3]、とあなたは固定サイズを指定していないようですaあなたが行うことができますので、{r,g,b}a[3]=j*j(、とにかく、ため1 * a = a)。
Erik the Outgolfer 2016年

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀで再利用aしていselect()ます。a[3]私がこのように使用すると、範囲外になってスローされますよね?
aloisdgがcodidact.comに移動2016年

1
素晴らしい最初の答えであり、PPCGへようこそ!言語とバイトを他の回答のように大きなフォントで表示する場合(通常はここでは標準です)、#行の前にを追加できます。:)
Kevin Cruijssen 2016年

4

Python、46バイト

lambda*c:[1-i/max(c)for i in c]+[1-max(c)/255]

Python 2では入力がfloatである必要があり、3ではそうでないことをかなり確認してください。


3

JavaScript(ES6)、58 51バイト

a=>[...a.map(e=>1-e/m||1,m=Math.max(...a)),1-m/255]

配列を受け入れ[R, G, B](個別のパラメーターに7バイトを追加)[C, M, Y, K]、未調整のカラーマッピングを使用して配列を返します。


2番目の回答の注文CYMKでよろしいですか?私にはCMYKのように見えます。
タイタス2016

2)なぜaその内容が混ざり合って広がるのか知っていますか?これは奇妙です。3)[0,0,0]をテストしましたか?ESでは例外はありませんが、ゼロによる除算のように見えます。
タイタス

すみません、どちらもCMYでした。それが私のせいでした。[0,0,0]ケースも修正しました。
Neil

4)[...a,m=Math.max(...a)]アレイソリューションを試します。5)配列を入力として使用して、もう1つをさらにゴルフできますか?のa.0代わりになどを使用することを検討してください.map
タイタス2016

@Titus CMYK順序を実際に優先し、7バイトも節約する完全に新しいアプローチを思いついた!
Neil

3

Mathematica、 36 28 33バイト

List@@ColorConvert[{##}/255,"CMYK"]&

I / Oフォーマットの自由化の後、さらにゴルフを続けました。 List@@#~ColorConvert~"CMYK"&

匿名関数、要求された機能を実行します。

古い関数は、0から255までの3つの引数を取ります(この範囲を超えたものは自動的にこの範囲にクリップされます)との間で「CMYK」値の配列を返します0.し、1.

例(古い関数の場合):

List @@ ColorConvert[{##}/255, "CMYK"] &[108, 174, 106]
{0.37931, 0., 0.390805, 0.320313}

入力として配列が許可されているため、33バイト:

List@@ColorConvert[#/255,"CMYK"]&

もちろん組み込み関数は{0, 0, 0}適切に処理して戻ります{0, 0, 0, 1}


1)明確にするために:入力値は[0; 255]でなければなりません。2分で質問が編集されます。2)[0,0,0]をテストしてください。3)それはそうではあり/255ませんか?
タイタス2016

@Titus、あなたが正しい、その255は現時点ではすべての問題に対処できませんが、できるだけ早く修正します
LLlAMnYP

@Titusが修正
LLlAMnYP 2016

2

Bash + ImageMagick、69バイト

convert "xc:$1[1x1]" -colorspace cmyk txt:-|grep -o '([^)]*)'|head -1

例:

$ ./rgb2cmyk.sh "#6CAE6A"
(38%,0%,39%,32%)

$ ./rgb2cmyk.sh "#000000"
(0%,0%,0%,100%)

$ ./rgb2cmyk.sh "#AAFFEE"
(33%,0%,7%,0%)

$ ./rgb2cmyk.sh "#0088ff"
(100%,47%,0%,0%)

$ ./rgb2cmyk.sh "#FAEBD7"
(0%,6%,14%,2%)

$ ./rgb2cmyk.sh "#123456"
(79%,40%,0%,66%)

2

SmileBASIC、73 72バイト

INPUT R,G,B
J=MAX(R,G,B)IF!J THEN?0,0,0,1 ELSE?1-R/J,1-G/J,1-B/J,1-J/255

はるかに短くなる可能性があります。


書くつもりJ=MAX(R,G,B)ですか?
アンドラキス2017

はい、ありがとうございます。
12Me21、2017

2

Pyth、24 21 18 24 21バイト

確かに人生は往復です。

= cR255Q + mc--1dK-1JeSQJQK 
= cR255Q + mc-JeSQdJQ-1J 
+ mc-JeSQdJQ-1cJ255 
+ mc-JeSQd + J ^ T_15Q-1cJ255
+ m-1?JeSQcdJ1Q-1cJ255

テストスイート。

入力例: 108,174,106

出力例: [0.3793103448275862, 0.0, 0.3908045977011494, 0.3176470588235294]

入力例: 0,0,0

出力例: [0, 0, 0, 1.0]

使用された式:

{J=メートルaバツRGBC=1RJM=1GJY=1BJK=1J255

古い式:http : //i.stack.imgur.com/ZtPD6.gif

古い式:http : //i.stack.imgur.com/Nqi9F.gif


素晴らしいゴルフ。故障を気にしますか?
タイタス

2

Lithp、114バイト

#R,G,B::((var J(max R G B))(if(!= 0 J)((list(- 1(/ R J))(- 1(/ G J))(- 1(/ B J))(- 1(/ J 255))))((list 0 0 0 1))))

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

  • 6バイトを保存しました(max任意の数の引数を取ることを忘れました)

これが正しいかどうかはよくわかりません。サンプルデータを使用した最初の2つの結果は正しいですが、残りは正しくありません(「オンラインで試す」を参照してください)。

次のように適切に記述された実装を使用します。

{J=メートルaバツRGBC=1RJM=1GJY=1BJK=1J255


1

PHP 7、123の 110 105バイト

RGBカラーとして入力 100 240 75

$j=max($h=$argv);echo strtr(@(1-$h[1]/$j).",".@(1-$h[2]/$j).",".@(1-$h[3]/$j).",".(1-$j/255),["NAN"=>0]);

CMYK値を0...1範囲内の10進数として出力します。

Titusのおかげで多くのバイトを節約できました。

使用例:

php -r '$j=max($h=$argv...' 100 240 75
0.58333333333333,0,0.6875,0.058823529411765

php -r '$j=max($h=$argv...' 255 255 255
0,0,0,0

php -r '$j=max($h=$argv...' 0 255 0
1,0,1,0

php -r '$j=max($h=$argv...' 0 0 0 
0,0,0,1

オンラインでテストする


HEXカラーとして入力#123456、202バイト

$h=str_split(substr($argv[1],-6),2);$j=max($r=hexdec($h[0]),$g=hexdec($h[1]),$b=hexdec($h[2]));echo z($r,$j),",",z($g,$j),",",z($b,$j),",",1-$j/255;function z($c,$y){return is_nan(@($c/$y))?0:1-$c/$y;}

ゼロによる除算を防止する機能用の54バイト、おそらくゴルフ可能または取り外し可能。

入力RGBカラーとしてHEXとして取得し、#123456CMYKを0...1範囲内の10進数として出力します。

使用例:

php -r '$h=str_split...' '#000000'
0,0,0,1

php -r '$h=str_split...' '#ffffff'
0,0,0,0

php -r '$h=str_split...' '#123456'
0.7906976744186,0.3953488372093,0,0.66274509803922

php -r '$h=str_split...' '#ffff00'
0,0,1,0

separate numeric values手段あなただけ取ることができます$h=$argv;し、使用$h[1]するのではなく、$h[0]など私のようなNANトリック。しかし、それは警告を出しませんか?strtrよりおそらく短いstr_replace、そしてNAN何qotationを必要としない(通知が得られますが、これらはデフォルトの設定では表示されません)。
タイタス

また、これが動作するPHPバージョンを提供してください。これは、PHP 7(1/0結果はINF)でもPHP 5(1/0=> false)でも機能しません。
Titus

@Titus $argvコマンドラインで非常に興味深い配列のヒントをありがとう!PHP版を追加しました。これNANを使用するstr_replaceと、暗黙的に数値を文字列に変換して出力するNANため、実際にはこのリンクで確認するとNAN、のstr_replace("INF"代わりに出力されることがわかりますstr_replace("NAN"。を使用して動作させることができませんでしたstrtr@警告を抑制するためにを追加しました。
マリオ

私は間違いを発見しました:$n/0isですがINF0/0ですNAN(PHP 7.0でも)。で4バイトstr_replace(NAN,0,$s)またはで6バイトを保存できますstrtr($s,["NAN"=>0)
タイタス

@Titusありがとう、適切に使用する方法がわかりませんでしたstrtr()
マリオ

1

PHP、競合しない

自分を投稿したくてたまらなかった。

RGB入力、74バイト

for(;$i++<4;)echo$i<4?($j=max($argv))?1-$argv[$i]/$j:0:1-$j/255,","[$i>3];

または出力の末尾にコンマを付けた68バイト:remove [$i>3]

で実行しphp -r '<code>' <red-value> <green-value> <blue-value>ます。

HEX入力、100バイト

foreach($a=array_map(hexdec,str_split($argv[1],2))as$c)echo($j=max($a))?1-$c/$j:0,",";echo 1-$j/255;  

で実行しphp -nr '<code>' RRGGBBます。

このアプローチは、RGB入力のための75バイトを取る:
置き換えるforeach($a=array_map...as$c)foreach($a=$argv as$c)if($i++)


0

C、155バイト

#define C(x) 1-x/(j>0?j:1)
#define F float
i=0;F j;f(F r,F g,F b){j=(r>g?r:g)>b?(r>g?r:g):b;for(;i++<4;)printf("%f\n",i>1?i>2?i>3?1-j/255:C(b):C(g):C(r));}

ゴルフの可能性をもっと理解しようとしています。

使用法:

#define C(x) 1-x/(j>0?j:1)
#define F float
i=0;F j;f(F r,F g,F b){j=(r>g?r:g)>b?(r>g?r:g):b;for(;i++<4;)printf("%f\n",i>1?i>2?i>3?1-j/255:C(b):C(g):C(r));}
main(){
    f(108,174,106);
}

出力:

0.379310
0.000000
0.390805
0.317647

1)+3:間違い:関数は結果を印刷するのではなく、返す必要があります。(申し訳ありませんが、今見ました)2)+4:エラー:iは宣言されていません。3)+0:エラー:三項演算子がオフになっているようです。それはすべきではありませんi>0?i>1?i>2
タイタス

しかし、ゴルフの可能性がいくつかあります。ANSI Cでは-25バイト、C99では-19バイト見つかりました。2バイトはここにあります:j>0?ループを取り除く場合は、17で、j定義を分割する場合は6 です。
タイタス2016

関数に別の+3を追加します。これはint以外のものを返すため、戻り値の型が必要です(F *)。しかし、私はC99でゴルフをする別のバイトを見つけました。
タイタス

@Titus間違っていない場合は、-3バイトを達成するj>0?j:1ことができj+!jます。
アルバートレンショー2017

そして、私はCマクロが間違っていると思います:1-x/1for j==0?そうだと思います1-(j>0?x/j:1)
タイタス

0

フーン、110バイト

=>
rs
|*
a/*
=+
[s=(cury sub .1) j=(roll a max)]
(welp (turn a |*(* (s (min .1 (div +< j))))) (s (div j .255)))

単精度浮動小数点ライブラリを使用します。を受け取る新しいジェネリック関数を作成しますa。設定するssubしてカレー風味.1、そして後でのためのjオーバー折りたたみにaしてmaxます。

上の地図aと各要素を分割しj、その後で1を引き、はNaNを正規化することと、1の最小値を見つけること、s1-j/255そのリストの最後に追加します。

> =f =>
  rs
  |*
  a/*
  =+
  [s=(cury sub .1) j=(roll a max)]
  (welp (turn a |*(* (s (min .1 (div +< j))))) (s (div j .255)))
> (f (limo ~[.108 .174 .106]))
[i=.3.7931037e-1 t=[i=.0 t=[i=.3.908046e-1 .3.1764704e-1]]]
> (f (limo ~[.0 .0 .0]))
[i=.0 t=[i=.0 t=[i=.0 .1]]]

TiOを提供してください。
タイタス

@Titus:Hoonには残念ながらTiOサイトがありません。
RenderSettings
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.