จาก Rgb ถึง Cmyk


9

รับ 3 ไบต์หรือ RGB เป็นอินพุตคำนวณค่า CMYK ที่ใกล้ที่สุดและส่งออก

  • สร้างฟังก์ชั่นที่มีพารามิเตอร์และค่าส่งคืนหรือโปรแกรมที่ทำงานบน stdin / stdout
  • ใช้โปรไฟล์สีที่คุณเลือก แต่ให้ข้อมูลอ้างอิง
  • อินพุตอาจเป็นค่าตัวเลขที่แยกกันในช่วง [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
  • การทำแผนที่ที่ไม่ได้รับการปรับแต่งนั้นใช้ได้และอาจเป็นวิธีที่ง่ายที่สุด
  • ไม่จำเป็นต้องมีการตรวจสอบอินพุต อนุญาตให้ลอยได้ (ตั้งแต่ 0 ถึง 255) แต่อาจถูกปัดเศษ
  • รูปแบบผลลัพธ์ควรมีความเห็นชัดเจนหรือชัดเจน เช่น:
    1. CMYK ตามลำดับที่
    2. ไม่สำคัญว่าจะเป็นเปอร์เซ็นต์ [0; 100] หรือจำนวนที่แท้จริง [0; 1]
  • การทดสอบควรมีตัวอย่างเล็ก ๆ น้อย ๆ [0,0,0]

ไซต์นี้มีเครื่องมือออนไลน์จำนวนมากที่สุดที่ฉันสามารถหาได้ ไม่มีใครรู้เครื่องมือที่ให้มากกว่า 4 หลัก?


4
คุณสามารถให้ตัวอย่างอินพุต / เอาท์พุตได้ไหม?
Kevin Cruijssen

8
@KevinCruijssen เพียงบันทึกด้าน แต่ผมไม่คิดว่าวิธีที่คุณใช้± ...
รั่วนูน

1
ยินดีต้อนรับสู่เว็บไซต์! นี่เป็นความท้าทายที่ดี แต่ก็ไม่มีความชัดเจน ฉันลงคะแนนให้ปิดอย่างไม่ชัดเจนในสิ่งที่คุณถาม แต่ถ้าคุณอธิบายอัลกอริทึมในการแปลงพวกเขาและให้กรณีทดสอบบางอย่างฉันจะถอนการลงคะแนนของฉัน
James

2
@KevinCruijssen ในส่วนคำวิเศษณ์ก็กล่าวว่าเซาท์แอฟริกัน มันไม่ได้ใช้แบบนั้นในภาษาอังกฤษมาตรฐาน ~เราใช้
mbomb007

1
ข้อความการโหวตอย่างใกล้ชิดนั้นทำให้เข้าใจผิดเล็กน้อยเพราะมันเกิดจากรากคำถามและคำตอบของเรา แต่มันก็จริง "วางไว้ไม่ชัดเจนในสิ่งที่คุณถาม" มีคำขอให้ชี้แจงสองสามข้อในความคิดเห็นที่ไม่ได้กล่าวถึง: อนุญาตให้อินพุตและเอาต์พุตเป็นลอยตัวระหว่าง 0 ถึง 1 หรือไม่ (หรือต้องเป็นจำนวนเต็มตั้งแต่ 0 ถึง 255) การแปลงใช้งานได้จริงหรือไม่ และคุณสามารถรวมกรณีทดสอบได้หรือไม่
Martin Ender

คำตอบ:


8

Dyalog APL , 16 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!

เครดิต:
 ∘ -1 ไบต์โดยNGN


PPCG จะได้รับ MathJax เมื่อใด
Neil


+1 สำหรับ! อิโมติคอนที่ดี
programmer5000

1
@ programmer5000 ขอบคุณ คุณจะพบว่าหนึ่งในรหัสกอล์ฟของฉันทั้งหมด มันสลับอาร์กิวเมนต์ของฟังก์ชันไปทางซ้าย อีโมติคอน APL อื่น ๆ ที่มีและ ฉันหวังว่าเราจะได้รับและในไม่ช้า
2560

@ Adám จะทำให้ฉันมีความสุข!
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] (ขอบคุณติตัส)


1
1.0-x/j? คุณก็ไม่สามารถทำอะไร1-x/j?
Erik the Outgolfer

@ ใช่ฉันทำได้! มันเป็นการพักผ่อนจากประสบการณ์ เป้าหมายคือการร่ายอัตโนมัติเป็นสองเท่า ฉันลบมัน
aloisdg กำลังย้ายไปยัง codidact.com

1
คุณไม่จำเป็นต้องใช้มันสำหรับการลบ แต่อย่างใด นอกจากนี้คุณดูเหมือนจะไม่ได้ใช้ซ้ำa[3]และคุณไม่ได้ระบุขนาดที่แน่นอนสำหรับaดังนั้นคุณจึงสามารถทำได้{r,g,b}และa[3]=j*j(เพราะยังไงก็ตาม1 * a = a)
Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀฉันกำลังนำด้วยa select()ถ้าฉันใช้a[3]แบบนี้ฉันจะออกนอกระยะและโยนฉันจะไม่ทำอย่างนั้นหรือ
aloisdg กำลังย้ายไปยัง codidact.com

1
คำตอบแรกที่ดีและยินดีต้อนรับสู่ PPCG! หากคุณต้องการแสดงภาษาและไบต์ของคุณในแบบอักษรขนาดใหญ่เช่นคำตอบอื่น ๆ (ซึ่งโดยปกติคือมาตรฐานที่นี่) คุณสามารถเพิ่ม#ด้านหน้าของบรรทัดได้ :)
Kevin Cruijssen

4

Python ขนาด 46 ไบต์

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

ต้องป้อนข้อมูลให้ลอยใน Python 2 ค่อนข้างแน่ใจว่ามันไม่ได้อยู่ใน 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]โดยใช้การจับคู่สีที่ไม่ได้ปรับเทียบ


คุณแน่ใจด้วยคำสั่ง CYMK ในคำตอบที่สองของคุณ ดูเหมือน CMYK กับฉัน
ติตัส

2) คุณรู้ไหมว่าเหตุใดการแพร่กระจายของการaรวมเนื้อหาเข้าด้วยกัน นี่มันแปลก 3) คุณได้ทำการทดสอบ [0,0,0]? ไม่มีข้อยกเว้นใน ES แต่ดูเหมือนหารด้วยศูนย์
ติตัส

ขออภัยพวกเขาเป็นทั้ง CMY นั่นเป็นความผิดของฉัน ตอนนี้แก้ไขกรณี [0,0,0]
Neil

4) ลองใช้[...a,m=Math.max(...a)]โซลูชันอาเรย์ของคุณ 5) คุณสามารถตีอีกอันหนึ่งโดยใช้อาร์เรย์เป็นอินพุตได้หรือไม่? พิจารณาใช้a.0อื่น ๆ .mapแทน
ติตัส

@Titus ฉันได้พบกับวิธีการใหม่ที่สมบูรณ์ซึ่งตอนนี้ชอบการสั่งซื้อ CMYK และประหยัด 7 ไบต์ด้วยเช่นกัน!
Neil

3

มาติกา 36 28 33 ไบต์

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

หลังจากเปิดเสรีรูปแบบ I / O แล้ว List@@#~ColorConvert~"CMYK"&

ฟังก์ชั่นไม่ระบุชื่อที่ทำในสิ่งที่ถูกถาม

ฟังก์ชั่นเก่าใช้เวลาสามข้อโต้แย้งจาก 0 ถึง 255 (อะไรเกินกว่าช่วงนี้จะถูกตัดโดยอัตโนมัติในช่วงนี้) และส่งกลับอาร์เรย์ของค่า "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) โปรดทดสอบ [0,0,0] 3) /255ไม่ควรเป็นเช่นนั้น?
Titus

@Titus คุณพูดถูก 255 มันไม่สามารถแก้ไขปัญหาทั้งหมดได้ในขณะนี้ฉันจะแก้ไขสิ่งต่าง ๆ โดยเร็วที่สุด
LLlAMnYP

@Titus แก้ไขมัน
LLlAMnYP

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)?
Andrakis

ใช่ขอบคุณ.
12Me21

2

Pyth, 24 21 18 24 21 ไบต์

ชีวิตคือการเดินทางไปกลับแน่นอน

= cR255Q + mc - 1dK-1JeSQJJK 
= 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=ม.ax(R,G,B)=1-RJM=1-GJY=1-BJK=1-J255

สูตรเก่า: http://i.stack.imgur.com/ZtPD6.gif

สูตรเก่า: http://i.stack.imgur.com/Nqi9F.gif


กอล์ฟที่ดี สนใจการสลาย?
Titus

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จะมีอาร์กิวเมนต์เท่าใดก็ได้)

ฉันไม่แน่ใจว่านี้ถูกต้อง ผลลัพธ์สองรายการแรกที่มีข้อมูลตัวอย่างนั้นถูกต้อง แต่ส่วนที่เหลือไม่ได้ (ดูที่ลองออนไลน์ )

ใช้การนำไปปฏิบัติที่อธิบายไว้เป็นอย่างดีดังต่อไปนี้:

{J=ม.ax(R,G,B)=1-RJM=1-GJY=1-BJK=1-J255


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ช่วง

จำนวนไบต์ที่บันทึกไว้ต้องขอบคุณ 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 #123456และส่งออก CMYK เป็นทศนิยมใน0...1ช่วง

ตัวอย่างการใช้งาน:

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)
ติตัส

@Titus ขอบคุณสำหรับ$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)ไบต์ด้วย
ติตัส

@Tios ยอดเยี่ยมขอบคุณฉันไม่สามารถหาวิธีการใช้อย่างถูกต้อง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>ทำงานด้วย

อินพุต 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ทำงานด้วย

วิธีการที่จะใช้เวลา 75 ไบต์สำหรับการป้อนข้อมูล RGB:
แทนที่ด้วย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: ข้อผิดพลาด: ฉันไม่ได้ประกาศ 3) +0: ข้อผิดพลาด: ตัวดำเนินการที่ประกอบไปด้วยคนของคุณดูไม่ออก ไม่ควรเป็นเช่นนั้นi>0?i>1?i>2
ติตัส

แต่มีศักยภาพในการเล่นกอล์ฟอยู่บ้าง ฉันพบ -25 ไบต์ใน ANSI C และอีก -19 ใน C99 2 ไบต์อยู่ที่นี่: j>0?, 17 ในการกำจัดลูปและ 6 ในการแยกjคำจำกัดความ
ติตัส

เพิ่มอีก +3 สำหรับฟังก์ชั่น: มันจะส่งกลับสิ่งอื่นที่นอกเหนือจาก int ดังนั้นจำเป็นต้องใช้ชนิดส่งคืน ( F *) แต่ฉันพบอีกหนึ่งไบต์ที่จะเล่นกอล์ฟใน C99
ติตัส

@Titus หากฉันไม่เข้าใจผิดj>0?j:1สามารถj+!jไปให้ถึง -3 bytes ได้
Albert Renshaw

และฉันคิดว่า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แกงกะหรี่กับ.1ในภายหลังและjจะพับมากกว่าด้วยamax

แผนที่มากกว่าaโดยการหารแต่ละองค์ประกอบมีjการหาขั้นต่ำที่และ 1 ปกติน่านแล้วลบ s1 เพิ่ม1-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.