Rgb से Cmyk तक


9

इनपुट के रूप में 3 बाइट्स या आरजीबी को देखते हुए, निकटतम सीएमवाईके मूल्यों की गणना करें और उन्हें आउटपुट करें।

  • या तो मापदंडों और रिटर्न वैल्यू के साथ एक फ़ंक्शन बनाएं या एक प्रोग्राम जो स्टड / स्टडआउट पर संचालित होता है
  • अपनी पसंद के रंग प्रोफ़ाइल का उपयोग करें, लेकिन एक संदर्भ प्रदान करें
  • इनपुट या तो अलग-अलग संख्यात्मक मान हो सकते हैं [0; 255] या 6 अंकों की हेक्स स्ट्रिंग
  • आउटपुट अलग-अलग संख्यात्मक मान होना चाहिए [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
  • Uncalibrated मैपिंग ठीक है और शायद सबसे आसान है
  • कोई इनपुट सत्यापन आवश्यक नहीं है; फ़्लोट्स की अनुमति है (0 से 255 तक), लेकिन इसे भी गोल किया जा सकता है
  • आउटपुट प्रारूप या तो स्पष्ट रूप से टिप्पणी या स्पष्ट होना चाहिए; अर्थात:
    1. उस क्रम में सी.एम.वाई.के.
    2. प्रतिशत [0; 100] या शुद्ध संख्या [0; 1] से कोई फर्क नहीं पड़ता
  • परीक्षण में तुच्छ उदाहरण शामिल होना चाहिए [0,0,0]।

इस साइट में ऑनलाइन टूल के सबसे अधिक अंक हैं जो मुझे मिल सकते हैं। क्या कोई ऐसा उपकरण जानता है जो 4 से अधिक अंक देता है?


4
क्या आप कुछ उदाहरण इनपुट / आउटपुट दे सकते हैं?
केविन क्रूज़सेन

8
@ केविनक्रूजसेन सिर्फ एक साइड नोट है, लेकिन मुझे नहीं लगता कि आप ± का उपयोग कैसे करते हैं ...
लीक नुन्

1
साइट पर आपका स्वागत है! यह एक अच्छी चुनौती है, लेकिन यह थोड़ा अस्पष्ट है। मैं यह स्पष्ट करने के लिए मतदान कर रहा हूं कि आप क्या पूछ रहे हैं, लेकिन अगर आप उन्हें बदलने और कुछ परीक्षण-मामलों को प्रदान करने के लिए एल्गोरिथम की व्याख्या करते हैं, तो मैं अपना वोट वापस लूंगा।
जेम्स

2
@ केविनक्रूजसेन क्रिया विशेषण अनुभाग में, यह दक्षिण अफ्रीकी कहता है । यह मानक अंग्रेजी में उस तरह से उपयोग नहीं किया जाता है। हम उपयोग करते हैं ~
mbomb007

1
करीबी वोट संदेश थोड़ा भ्रामक है, क्योंकि यह हमारे क्यू एंड ए जड़ों से उपजा है, लेकिन यह वास्तव में "स्पष्ट रूप से पकड़ में आया कि आप क्या पूछ रहे हैं"। टिप्पणियों में स्पष्टीकरण के लिए कुछ अनुरोध थे जिन्हें संबोधित नहीं किया गया था: विशेष रूप से कि क्या इनपुट और आउटपुट 0 और 1 के बीच फ़्लोट के रूप में हैं (या इसे 0 से 255 तक पूर्णांक होना है), रूपांतरण वास्तव में कैसे काम करता है, और क्या आप कुछ परीक्षण मामलों को शामिल कर सकते हैं।
मार्टिन एंडर

जवाबों:


8

डायलॉग एपीएल , 16 15 बाइट्स

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

1 माइनस 1-
X को ÷ Y से विभाजित किया गया, उसके बाद ,255 को विभाजित किया गया 255÷⍨ Y , जहां
  X स्वयं है (यानी RGB मानों की सूची), और
  Y अधिकतम /⌈(RGB मानों का) है।

{जे=एक्स(आर,जी,बी)सी=1-आरजे=1-जीजेY=1-बीजे=1-जे255

TryAPL!

क्रेडिट:।
 -1 बाइट नगन द्वारा ।


PPCG को MathJax कब मिल रहा है?
नील


+1 के लिए ! अच्छा इमोटिकॉन
प्रोग्रामर

1
@ programmer5000 धन्यवाद। आपको पता चलेगा कि मेरे सभी कोड-गोल्फ में बहुत अधिक है। यह फ़ंक्शन के तर्कों को उसके बाईं ओर स्वैप करता है। अन्य एपीएल इमोटिकॉन्स हैं और । मुझे आशा है कि हम मिल जाएगा और जल्द ही।
आदम

@ Adám मुझे खुश कर देगा!
प्रोग्रामर

8

सी # , 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

चूंकि ओपी फंक्शन की अनुमति देता है इसलिए मैंने केवल लैम्बडा जमा किया। आप .NetFiddle पर एक रनिंग डेमो पा सकते हैं । मैं एक गोल्फ खिलाड़ी नहीं हूं, मैं मनोरंजन के लिए पोस्ट करता हूं। इसके अलावा, यह मेरा पहला उत्तर है। किसी भी सुधार पर टिप्पणी करने के लिए स्वतंत्र महसूस करें :)

सूत्र के लिए कुदोस से लीके नन।

चेतावनी: यह काम नहीं करता है [0,0,0] (धन्यवाद टाइटस)


1
1.0-x/j? आप निश्चित रूप से नहीं कर सकते 1-x/j?
आउटगोल्फ

@ E @Gʀɪᴋᴛʜᴇ हाँ मैं कर सकता हूँ! यह एक अनुभव से एक आराम था। लक्ष्य ऑटो कास्ट को दोगुना करना था। मैं इसे हटा देता हूं।
aloisdg

1
आप इसे कहीं भी घटाव के लिए जरूरत नहीं है। इसके अलावा, आप फिर से उपयोग a[3]नहीं करते हैं , और आप के लिए एक निश्चित आकार निर्दिष्ट नहीं करते हैं a, तो आप कर सकते हैं {r,g,b}और a[3]=j*j(क्योंकि, वैसे भी, 1 * a = a)।
आउटगॉल्फ

@ E @Gʀɪᴋᴛʜᴇ मैं इसके aसाथ पुन: उपयोग कर रहा हूं select()। अगर मैं a[3]इस तरह का उपयोग करता हूं तो मैं सीमा से बाहर हो जाऊंगा और फेंक दूंगा, नहीं?
aloisdg

1
PPCG में शानदार पहला उत्तर और आपका स्वागत है! यदि आप अपनी भाषा और बाइट्स को अन्य उत्तरों की तरह एक बड़े फ़ॉन्ट में प्रदर्शित करना चाहते हैं (जो आमतौर पर यहाँ मानक है), तो आप #लाइन के सामने एक जोड़ सकते हैं । :)
केविन क्रूज़सेन

4

पायथन, 46 बाइट्स

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

पाइथन 2 में फ़्लोट होने के लिए इनपुट की आवश्यकता होती है, निश्चित रूप से यह 3 में नहीं है।


3

जावास्क्रिप्ट (ईएस 6), 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]रंग वाले मैपिंग का उपयोग करके एक सरणी देता है ।


क्या आप अपने दूसरे उत्तर पर आदेश CYMK के साथ सुनिश्चित हैं? मेरे लिए सीएमवाईके जैसा दिखता है।
टाइटस

2) क्या आप जानते हैं कि aइसकी सामग्री के मिश्रण का प्रसार क्यों होता है? यह अजीब है। 3) क्या आपने परीक्षण किया है [0,0,0]? ईएस में कोई अपवाद नहीं है, लेकिन शून्य से एक विभाजन की तरह दिखता है।
टाइटस

क्षमा करें, वे दोनों सीएमवाई थे, यही मेरी गलती थी। अब [0,0,0] मामले भी तय कर दिए।
नील

4) [...a,m=Math.max(...a)]अपने सरणी समाधान में प्रयास करें । 5) क्या आप इनपुट के रूप में एक सरणी का उपयोग करके दूसरे को आगे बढ़ा सकते हैं? के a.0बजाय उपयोग करने पर विचार करें .map
टाइटस

@Titus मैं अब पूरी तरह से नए दृष्टिकोण के साथ आया हूं जो वास्तव में CMYK आदेश पसंद करता है और 7 बाइट्स भी बचाता है!
नील

3

मेथेमेटिका, 36 28 33 बाइट्स

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

I / O स्वरूपों के उदारीकरण के बाद, और आगे बढ़े: List@@#~ColorConvert~"CMYK"&

अनाम फ़ंक्शन, जो पूछा जाता है वह करता है।

वर्ष समारोह 255 0 से तीन तर्क लेता है (इस सीमा से परे कुछ भी स्वचालित रूप से इस श्रृंखला के लिए काटा गया हो जाएगा) और के बीच "सीएमवाईके" मूल्यों की एक सरणी देता है 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) कृपया परीक्षण करें [0,0,0]। 3) ऐसा नहीं होना चाहिए /255?
टाइटस

@ आप सही हैं, इसकी 255, इस समय सभी मुद्दों को संबोधित नहीं कर सकते हैं, मैं जल्द से जल्द सुविधा पर चीजों को ठीक कर दूँगा
LLLAMnYP

@ टिट्स ने इसे ठीक किया
एलएलएलएएमएनवाईपी

2

बैश + इमेजमैजिक, 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

स्माइलबासिक, 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)?
एंड्राकिस

हाँ धन्यवाद।
12M2121

2

पायथ, 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]

उपयोग किया गया सूत्र:

{जे=एक्स(आर,जी,बी)सी=1-आरजे=1-जीजेY=1-बीजे=1-जे255

पुराना फॉर्मूला: http://i.stack.imgur.com/ZtPD6.gif

पुराना फॉर्मूला: http://i.stack.imgur.com/Nqi9F.gif


अच्छी गोल्फिंग। एक टूटने के लिए देखभाल?
टाइटस

2

लिथप , 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किसी भी संख्या में तर्क)

मुझे यकीन नहीं है कि यह सही है। नमूना डेटा के साथ पहले दो परिणाम सही हैं, लेकिन बाकी नहीं हैं (देखें इसे ऑनलाइन प्रयास करें ।)

निम्नानुसार अच्छी तरह से वर्णित कार्यान्वयन का उपयोग करता है:

{जे=एक्स(आर,जी,बी)सी=1-आरजे=1-जीजेY=1-बीजे=1-जे255


1

PHP 7, 123 110 105 बाइट्स

आरजीबी रंग के रूप में इनपुट 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]);

0...1रेंज में दशमलव के रूप में आउटपुट CMYK मान ।

टाइटस की बदौलत बहुत सारे बाइट्स बचे।

नमूना उपयोग:

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

ऑनलाइन टेस्ट करें


हेक्स रंग के रूप में इनपुट #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 बाइट्स शून्य से विभाजन को रोकने के लिए, शायद गोल्फ या हटाने योग्य।

HEX के रूप में इनपुट RGB रंग के रूप में हो जाता है #123456और 0...1रेंज में CMYK को दशमलव के रूप में आउटपुट करता है ।

नमूना उपयोग:

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किसी भी प्रकार की सूचना की आवश्यकता नहीं है (नोटिस प्राप्त करेंगे, लेकिन उन डिफ़ॉल्ट डिफ़ॉल्ट में प्रदर्शित नहीं होते हैं)।
टाइटस

इसके अलावा, कृपया PHP संस्करण प्रदान करें जो इसमें काम करता है। यह PHP 7 में नहीं है (जहां 1/0परिणाम INF) और न ही PHP 5 ( 1/0=> false) में।
टाइटस

@ $argvकमांड लाइन में बहुत दिलचस्प सरणी टिप के लिए धन्यवाद ! मैंने PHP संस्करण जोड़ा। यह तब काम करता है NANक्योंकि जब आप इसका उपयोग str_replaceकरते हैं तो यह संख्या को स्ट्रिंग में परिवर्तित कर देता है इसलिए यह आउटपुट करता है NAN, वास्तव में यदि आप इस लिंक पर जांच करते हैं , तो आप देखेंगे कि यह आउटपुट के NANकारण हैstr_replace("INF" करने के बजाय str_replace("NAN"। मैं इसका उपयोग करके काम नहीं कर सका strtr। मैंने @चेतावनियों को दबाने के लिए जोड़ा ।
मारियो

मुझे मेरी गलती मिली: $n/0है INF, लेकिन 0/0हैNAN (PHP 7.0 में भी)। आप 4 बाइट्स के साथ str_replace(NAN,0,$s)या 6 बाइट्स के साथ बचा सकते हैं strtr($s,["NAN"=>0)
टाइटस

@ महान धन्यवाद, मैं समझ नहीं पाया कि कैसे ठीक से उपयोग करें 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 बाइट्स: निकालें [$i>3]

के साथ भागो php -r '<code>' <red-value> <green-value> <blue-value>

हेक्स इनपुट, 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

आरजीबी इनपुट के लिए यह दृष्टिकोण 75 बाइट्स ले जाएगा: के साथ
बदलें ।foreach($a=array_map...as$c)foreach($a=$argv as$c)if($i++)


0

सी, 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: त्रुटि: मैं घोषित नहीं है। 3) +0: त्रुटि: आपके टर्नरी ऑपरेटर बंद लग रहे हैं। कि नहीं होना चाहिएi>0?i>1?i>2
टाइटस

लेकिन कुछ गोल्फ की क्षमता है; मैंने ANSI C में -25 बाइट्स, और C99 में एक और -19 पाया। 2 बाइट्स यहां हैं: j>0?लूप से छुटकारा पाने में 17, और jपरिभाषा को विभाजित करने में 6 ।
टाइटस

फ़ंक्शन के लिए एक और +3 जोड़ें: यह इंट के अलावा कुछ और लौटाता है, इसलिए रिटर्न प्रकार की आवश्यकता होती है ( F *)। लेकिन मुझे C99 में गोल्फ के लिए एक और बाइट मिली।
टाइटस

@Titus अगर मैं गलत नहीं हूँ, -3 बाइट्स प्राप्त करने के लिए j>0?j:1हो सकता j+!jहै।
अल्बर्ट रेनशॉ

और मुझे लगता है कि Cमैक्रो गलत है: के 1-x/1लिए 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। सेट sकरने के लिए subसाथ curried .1, और बाद में के लिए jखत्म हो गया तह के aसाथmax

aप्रत्येक तत्व के साथ विभाजन करके मानचित्र j, NaN को सामान्य करने के लिए उस का न्यूनतम और 1 का पता लगाएं, फिर 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 प्रदान कर सकते हैं।
टाइटस

@ टिट्स: हून के पास टीआईओ साइट नहीं है, दुर्भाग्य से।
रेंडसेटिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.