Dari Rgb ke Cmyk

9

Diberi 3 byte atau RGB sebagai input, hitung nilai CMYK terdekat, dan hasilkan.

  • buat fungsi dengan parameter dan nilai balik atau program yang beroperasi pada stdin / stdout
  • gunakan profil warna pilihan Anda, tetapi berikan referensi
  • input dapat berupa nilai numerik yang terpisah dalam rentang [0; 255] atau string hex 6 digit
  • output harus berupa nilai numerik terpisah yang berkisar antara [0; 1] atau [0; 100]
  • golf kode standar: tidak ada celah , kode terpendek menang
  • ide-ide mewah dipersilakan

contoh data:

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
  • Pemetaan yang tidak dikalibrasi baik-baik saja dan mungkin paling mudah
  • Tidak diperlukan validasi input; pelampung diperbolehkan (berkisar dari 0 hingga 255), tetapi juga dapat dibulatkan
  • Format output harus baik komentar jelas atau jelas; yaitu:
    1. CMYK dalam urutan itu
    2. tidak masalah jika persentase [0; 100] atau angka murni [0; 1]
  • Pengujian harus mencakup contoh sepele [0,0,0].

Situs ini memiliki digit alat online terbanyak yang bisa saya temukan. Adakah yang tahu alat yang memberi lebih dari 4 digit?

Titus
sumber
4
Bisakah Anda memberikan beberapa contoh input / output?
Kevin Cruijssen
8
@KevinCruijssen Hanya catatan, tapi saya tidak berpikir itu yang Anda gunakan ± ...
Leaky Nun
1
Selamat datang di situs ini! Ini adalah tantangan yang layak, tetapi agak tidak jelas. Saya memberikan suara untuk menutup sebagai tidak jelas apa yang Anda minta, tetapi jika Anda menjelaskan algoritme untuk mengonversikannya dan memberikan beberapa kasus uji, saya akan menarik kembali suara saya.
James
2
@KevinCruijssen Di bagian kata keterangan, tertulis Afrika Selatan . Tidak digunakan seperti itu dalam bahasa Inggris standar. Kami menggunakan ~.
mbomb007
1
Pesan suara dekat agak menyesatkan, karena berasal dari akar T&J kami, tetapi memang "ditunda karena tidak jelas apa yang Anda tanyakan". Ada beberapa permintaan untuk klarifikasi dalam komentar yang tidak ditanggapi: secara spesifik apakah input dan output sebagai float antara 0 dan 1 diperbolehkan (atau apakah harus bilangan bulat dari 0 hingga 255), bagaimana konversi sebenarnya bekerja, dan apakah Anda dapat memasukkan beberapa kasus uji.
Martin Ender

Jawaban:

8

Dyalog APL , 16 15 byte

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

1 dikurangi 1-
X dibagi dengan ÷ Y , diikuti oleh ,255 membagi 255÷⍨ Y , di mana
  X itu sendiri (yaitu daftar nilai RGB), dan
  Y adalah maks /⌈(dari nilai RGB).

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

TryAPL!

Kredit:
 ∘ -1 byte oleh ngn .

Adm
sumber
Kapan PPCG mendapatkan MathJax?
Neil
+1 untuk ! Emoticon yang bagus
programmer5000
1
@ programmer5000 Terima kasih. Anda akan menemukannya di hampir semua kode-golf saya. Ini menukar argumen fungsi ke kiri. Emoticon APL lainnya adalah dan . Saya harap kita akan mendapatkannya dan segera.
Adm
@ Adám akan membuatku bahagia!
programmer5000
8

C # , 88 86 85 84 byte

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

output untuk 108,174,106:

0.3793104
0
0.3908046
0.3176471

Karena OP mengizinkan fungsi, saya hanya mengirimkan lambda. Anda dapat menemukan demo yang sedang berjalan di .NetFiddle . Saya bukan pegolf, saya memposting untuk bersenang-senang. Juga, ini adalah jawaban pertama saya \ o /. Jangan ragu untuk berkomentar perbaikan apa pun :)

Kudos to Leaky Nun untuk formula.

peringatan: itu tidak berhasil untuk [0,0,0] (terima kasih Titus)

aloisdg pindah ke codidact.com
sumber
1
1.0-x/j? Anda pasti tidak bisa melakukannya 1-x/j?
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ ya saya bisa! Itu adalah istirahat dari pengalaman. Tujuannya adalah untuk melemparkan otomatis ke ganda. Saya menghapusnya.
aloisdg pindah ke codidact.com
1
Anda tidak perlu untuk mengurangi. Selain itu, Anda tampaknya tidak menggunakan kembali a[3], dan Anda tampaknya tidak menentukan ukuran tetap untuk a, sehingga Anda dapat melakukannya {r,g,b}dan a[3]=j*j(karena, bagaimanapun, 1 * a = a).
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Saya menggunakan kembali adengan select(). Jika saya menggunakan a[3]seperti ini saya akan keluar dari jangkauan dan melempar, bukan?
aloisdg pindah ke codidact.com
1
Jawaban pertama yang bagus dan selamat datang di PPCG! Jika Anda ingin menampilkan bahasa dan byte Anda dalam font yang lebih besar seperti jawaban lain (yang biasanya merupakan standar di sini), Anda dapat menambahkan a #di depan baris. :)
Kevin Cruijssen
4

Python, 46 byte

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

Membutuhkan input untuk mengapung di Python 2, cukup yakin itu tidak dalam 3.

Arfie
sumber
3

JavaScript (ES6), 58 51 byte

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

Menerima array [R, G, B](tambahkan 7 byte untuk parameter terpisah) dan mengembalikan array [C, M, Y, K]menggunakan pemetaan warna yang tidak dikalibrasi.

Neil
sumber
Anda yakin dengan pesanan CYMK pada jawaban kedua Anda? Sepertinya CMYK bagi saya.
Titus
2) Apakah Anda tahu mengapa penyebaran konten abercampur? Ini aneh. 3) Sudahkah Anda menguji [0,0,0]? Tidak terkecuali di ES, tetapi terlihat seperti pembagian dengan nol.
Titus
Maaf, mereka berdua CMY, itu salah saya. Sekarang juga memperbaiki kasus [0,0,0].
Neil
4) Coba [...a,m=Math.max(...a)]di solusi array Anda. 5) Bisakah Anda golf yang lain lebih lanjut menggunakan array sebagai input? Pertimbangkan untuk menggunakan a.0dll. Daripada .map.
Titus
@ Titus Saya telah datang dengan pendekatan yang sama sekali baru sekarang yang sebenarnya lebih suka pesanan CMYK dan menyimpan 7 byte juga!
Neil
3

Mathematica, 36 28 33 byte

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

Setelah liberalisasi format I / O, bermain golf lebih lanjut: List@@#~ColorConvert~"CMYK"&

Fungsi anonim, yang melakukan apa yang diminta.

Fungsi lama mengambil tiga argumen dari 0 hingga 255 (apa pun di luar rentang ini akan secara otomatis terpotong ke kisaran ini) dan mengembalikan array nilai "CMYK" antara 0.dan1.

Contoh (untuk fungsi lama):

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

Karena array diizinkan sebagai input, 33 byte:

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

Tentu saja yang built-in menangani fungsi {0, 0, 0}dengan baik dan kembali {0, 0, 0, 1}.

LLlAMnYP
sumber
1) Untuk memperjelas: nilai input harus dalam [0; 255]. akan mengedit pertanyaan dalam satu menit, 2) Silakan uji [0,0,0]. 3) Bukankah seharusnya begitu /255?
Titus
@Titus Anda benar, 255 nya, tidak bisa mengatasi semua masalah saat ini, saya akan memperbaiki hal-hal yang paling mudah
LLlAMnYP
@Titus memperbaikinya
LLlAMnYP
2

Bash + ImageMagick, 69 byte

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

Contoh:

$ ./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%)
Marco
sumber
2

SmileBASIC, 73 72 byte

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

Bisa jadi jauh lebih pendek.

12Me21
sumber
Apakah Anda bermaksud menulis J=MAX(R,G,B)?
Andrakis
Ya terima kasih.
12Me21
2

Pyth, 24 21 18 24 21 byte

Hidup itu perjalanan bolak-balik.

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

Suite uji.

Input sampel: 108,174,106

Output sampel: [0.3793103448275862, 0.0, 0.3908045977011494, 0.3176470588235294]

Input sampel: 0,0,0

Output sampel: [0, 0, 0, 1.0]

Formula yang digunakan:

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

Formula lama: http://i.stack.imgur.com/ZtPD6.gif

Formula lama: http://i.stack.imgur.com/Nqi9F.gif

Biarawati Bocor
sumber
golf bagus. merawat gangguan?
Titus
2

Lithp , 114 byte

#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))))

Cobalah online!

  • Disimpan 6 byte (lupa yang maxmembutuhkan sejumlah argumen)

Saya tidak yakin ini benar. Dua hasil pertama dengan data sampel sudah benar, tetapi sisanya tidak (lihat Coba online .)

Penggunaan implementasi dijelaskan dengan baik sebagai berikut:

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

Andrakis
sumber
1

PHP 7, 123 110 105 byte

Input sebagai warna 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]);

Output nilai CMYK dalam 0...1rentang desimal .

Menyimpan banyak byte berkat Titus.

Penggunaan sampel:

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

Tes online


Input sebagai warna HEX #123456, 202 byte

$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 byte untuk fungsi untuk mencegah pembagian dengan nol, mungkin golf atau dapat dilepas.

Dimasukkan sebagai warna RGB sebagai HEX #123456dan menghasilkan CMYK sebagai desimal di0...1 .

Penggunaan sampel:

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
Mario
sumber
separate numeric valuesberarti Anda bisa $h=$argv;menggunakan dan menggunakan $h[1]alih-alih $h[0]dll. Saya suka NANtriknya; tetapi bukankah itu menghasilkan peringatan? strtrmungkin lebih pendek dari str_replace, dan NANtidak memerlukan qotation (akan menghasilkan Pemberitahuan, tetapi itu tidak ditampilkan dalam konfigurasi default).
Titus
Juga, berikan versi PHP tempat kerjanya. Ini tidak dalam PHP 7 (di mana 1/0hasil INF) atau dalam PHP 5 ( 1/0=> false).
Titus
@Titus Terima kasih atas $argvtip array yang sangat menarik di command line! Saya menambahkan versi PHP. Ini berfungsi dengan baik NANkarena ketika Anda menggunakannya str_replacesecara implisit mengkonversi angka ke string sehingga menghasilkan NAN, sebenarnya jika Anda memeriksa di tautan ini , Anda akan melihat bahwa itu menghasilkan NANkarena str_replace("INF"bukan str_replace("NAN". Saya tidak bisa membuatnya bekerja menggunakan strtr. Saya menambahkannya @untuk menekan peringatan.
Mario
Saya menemukan kesalahan saya: $n/0is INF, but 0/0is NAN(juga dalam PHP 7.0). Anda dapat menyimpan 4 byte dengan str_replace(NAN,0,$s)atau 6 byte dengan strtr($s,["NAN"=>0).
Titus
@ Titus terima kasih banyak, saya tidak tahu cara menggunakannya dengan benar strtr();
Mario
1

PHP, tidak bersaing

Saya terlalu tergoda untuk memposting sendiri.

Input RGB, 74 byte

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

atau 68 byte dengan tanda koma di output: hapus [$i>3].

Jalankan dengan php -r '<code>' <red-value> <green-value> <blue-value>.

Input HEX, 100 byte

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

Jalankan dengan php -nr '<code>' RRGGBB.

Pendekatan itu akan membutuhkan 75 byte untuk input RGB:
ganti foreach($a=array_map...as$c)dengan foreach($a=$argv as$c)if($i++).

Titus
sumber
0

C, 155 byte

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

Saya mencoba mencari tahu bagaimana mungkin golf lebih banyak.

Pemakaian:

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

Keluaran:

0.379310
0.000000
0.390805
0.317647
Giacomo Garabello
sumber
1) +3: kesalahan: fungsi harus mengembalikan hasilnya, bukan mencetaknya. (maaf saya baru saja melihatnya) 2) +4: error: saya tidak dideklarasikan. 3) +0: error: operator ternary Anda tampak tidak aktif. bukankah itu seharusnyai>0?i>1?i>2
Titus
tetapi ada beberapa potensi golf; Saya menemukan -25 byte di ANSI C, dan -19 di C99. 2 byte ada di sini:, j>0?17 dalam menghilangkan loop, dan 6 dalam memisahkan jdefinisi.
Titus
tambahkan +3 lainnya untuk fungsi: ini mengembalikan sesuatu yang lain dari int, jadi diperlukan tipe pengembalian ( F *). Tapi saya menemukan byte lain untuk bermain golf di C99.
Titus
@Itus Jika saya tidak salah, j>0?j:1bisa j+!jmencapai -3 byte.
Albert Renshaw
Dan saya pikir Cmakro tidak benar: 1-x/1untuk j==0? Saya pikir seharusnya begitu 1-(j>0?x/j:1).
Titus
0

Hoon , 110 byte

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

Gunakan perpustakaan floating-point presisi tunggal. Buat fungsi generik baru yang diperlukan a. Atur suntuk subdigosok dengan .1untuk nanti, dan juntuk melipat adenganmax .

Peta lebih adengan membagi setiap elemen dengan j, menemukan minimum itu dan 1 untuk menormalkan NaN, kemudian kurangi 1 dengan s. Tambahkan 1-j/255ke akhir daftar itu.

> =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]]]
Pengaturan rendering
sumber
Bisakah Anda memberikan TiO?
Titus
@Titus: Hoon tidak memiliki situs TiO, sayangnya.
RenderSettings