Rgb'den Cmyk'e


9

Giriş olarak 3 bayt veya RGB verildiğinde, en yakın CMYK değerlerini hesaplayın ve çıktılarını alın.

  • parametreleri ve dönüş değeri olan bir işlev veya stdin / stdout üzerinde çalışan bir program oluşturun
  • istediğiniz renk profilini kullanın, ancak referans verin
  • girdi, [0; 255] aralığındaki ayrı sayısal değerler veya 6 basamaklı onaltılık dize olabilir
  • çıktı, [0; 1] veya [0; 100] arasında değişen ayrı sayısal değerler olmalıdır
  • standart kod golf: boşluk yok , en kısa kod kazanır
  • abartılı fikirler bekliyoruz

örnek veri:

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
  • Kalibre edilmemiş haritalama iyi ve muhtemelen en kolay
  • Giriş doğrulaması gerekmez; şamandıralara izin verilir (0 ila 255 arasında), ancak yuvarlanabilir
  • Çıktı formatı açıkça yorumlanmış veya açık olmalıdır; yani:
    1. CMYK bu sırayla
    2. yüzde [0; 100] veya saf sayıların [0; 1] olması önemli değildir
  • Test önemsiz örneği içermelidir [0,0,0].

Bu site , bulabildiğim en fazla çevrimiçi araca sahip. 4 basamaktan fazlasını veren bir araç bilen var mı?


4
Bazı örnek giriş / çıkışlar verebilir misiniz?
Kevin Cruijssen

8
@KevinCruijssen Sadece bir yan not, ancak ± bu şekilde kullandığınızı sanmıyorum ± ...
Leaky Nun

1
Siteye Hoşgeldiniz! Bu iyi bir meydan okuma, ama biraz belirsiz. Sorduğunuz şeyi belirsiz olarak kapatmak için oy kullanıyorum, ancak bunları dönüştürmek ve bazı test senaryoları sağlamak için algoritmayı açıklarsanız, oyumu geri çekeceğim.
James

2
@KevinCruijssen Zarf bölümünde Güney Afrikalı diyor . Standart İngilizce'de bu şekilde kullanılmaz. Biz kullanıyoruz ~.
mbomb007

1
Yakın oy mesajı biraz yanıltıcıdır, çünkü Soru-Cevap köklerimizden kaynaklanmaktadır, ancak gerçekten "ne soruyorsunuz belirsiz tutulur". Yorumlarda ele alınmayan birkaç açıklama talebi vardı: özellikle 0 ile 1 arasında yüzer olarak giriş ve çıkışlara izin verilip verilmediği (veya 0 ile 255 arasında tam sayı olması gerekip gerekmediği), dönüşümün gerçekten nasıl çalıştığı, ve bazı test senaryoları ekleyip ekleyemeyeceğiniz.
Martin Ender

Yanıtlar:


8

Dyalog APL , 16 15 bayt

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

1 eksi 1-
X bölü ÷ Y , ardından ,255 bölü 255÷⍨ Y , burada
  X kendisidir (yani RGB değerleri listesi) ve
  Y maksimadır /⌈(RGB değerlerinin).

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

TryAPL!

Kredi: ngn
 tarafından ∘ -1 bayt .


PPCG ne zaman MathJax alıyor?
Neil


İçin +1 ! Güzel ifade
programmer5000

1
@ programmer5000 Teşekkür ederim. Bunu hemen hemen tüm kod golflerimde bulacaksınız. Fonksiyonun argümanlarını soluna değiştirir. Diğer APL ifadeleri ve . Bence alırsınız umut ve yakında.
Adam

@ Adám beni mutlu eder!
programcı5000

8

C # , 88 86 85 84 bayt

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

çıktı 108,174,106:

0.3793104
0
0.3908046
0.3176471

OP fonksiyona izin verdiğinden, sadece lambda'yı gönderdim. .NetFiddle'da çalışan bir demo bulabilirsiniz . Ben golfçü değilim, eğlence için gönderiyorum. Ayrıca, bu benim ilk cevabım \ o /. Herhangi bir gelişme yorum yapmaktan çekinmeyin :)

Formül için Leaky Nun şerefine.

uyarı: [0,0,0] için işe yaramıyor (teşekkür ederim Titus)


1
1.0-x/j? Kesinlikle yapamaz 1-x/jmısın?
Outgolfer Erik

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ evet yapabilirim! Bir deneyim bir dinlenme oldu. Amaç, otomatik olarak ikiye katlanmaktı. Kaldırıyorum.
aloisdg taşınma codidact.com

1
Yine de çıkartmak için buna ihtiyacınız yok. Ayrıca, yeniden kullanmıyorsunuz a[3]ve için sabit bir boyut belirtmiyorsunuz a, böylece yapabilirsiniz {r,g,b}ve a[3]=j*j(çünkü, zaten 1 * a = a).
Outgolfer Erik

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ aile tekrar kullanıyorum select(). Eğer bu şekilde kullanırsam a[3]menzil dışında ve fırlatacağım, olmaz mı?
aloisdg taşınma codidact.com

1
Büyük ilk cevap ve PPCG'ye hoş geldiniz! Dilinizi ve baytlarınızı diğer yanıtlar gibi daha büyük bir yazı tipinde görüntülemek istiyorsanız (genellikle burada standarttır), #satırın önüne bir ekleyebilirsiniz . :)
Kevin Cruijssen

4

Python, 46 bayt

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

Girişin Python 2'de yüzmesini gerektirir, 3'te olmadığından emin olun.


3

JavaScript (ES6), 58 51 bayt

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

Bir diziyi kabul eder [R, G, B](ayrı parametreler için 7 bayt ekleyin) ve [C, M, Y, K]kalibre edilmemiş renk eşlemesini kullanarak bir dizi döndürür .


İkinci cevabınızdaki CYMK siparişinden emin misiniz? bana CMYK gibi geliyor.
Titus

2) aKarışımların içeriğinin neden yayıldığını biliyor musunuz ? Bu çok garip. 3) [0,0,0] test ettiniz mi? ES'de istisna yoktur, ancak sıfıra bölünme gibi görünür.
Titus

Üzgünüm, ikisi de CMY, bu benim hatamdı. Şimdi [0,0,0] vaka da düzeltildi.
Neil

4) [...a,m=Math.max(...a)]Dizi çözümünüzü deneyin . 5) Bir diziyi girdi olarak kullanarak diğerini golf edebilir misiniz? a.0Bunun yerine vb .map. Kullanmayı düşünün .
Titus

@Titus CMYK sırasını tercih eden ve 7 baytlık tasarruf sağlayan tamamen yeni bir yaklaşım geliştirdim!
Neil

3

Mathematica, 36 28 33 bayt

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

I / O formatlarının serbestleştirilmesinden sonra, daha da ileri gitti: List@@#~ColorConvert~"CMYK"&

Anonim işlev, sorulan şeyi yapar.

Eski işlev 0'dan 255'e kadar üç argüman alır (bu aralığın ötesinde bir şey otomatik olarak bu aralığa kırpılır) arasında "CMYK" değer dizisi döndürür 0.ve1.

Örnek (eski işlev için):

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

Dizilere giriş olarak izin verildiğinden, 33 bayt:

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

Tabii ki yerleşik fonksiyon kolları {0, 0, 0}düzgün ve iadeler {0, 0, 0, 1}.


1) Açıklığa kavuşturmak için: giriş değerleri [0; 255] içinde olmalıdır. soruyu bir dakika içinde düzenleyecek, 2) Lütfen [0,0,0] 'u test edin. 3) Olmamalı /255mı?
Titus

@Titus haklısın, 255 yaşında, şu anda tüm sorunları çözemiyor, işleri en kısa
sürede düzeltirim

@Titus düzelttim
LLlAMnYP

2

Bash + ImageMagick, 69 bayt

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

Misal:

$ ./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 bayt

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

Çok daha kısa olabilirdi.


Bunu yazmak J=MAX(R,G,B)mı istediniz ?
Andrakis

Evet teşekkür ederim.
12

2

Pyth, 24 21 18 24 21 bayt

Hayat gerçekten bir yolculuktur.

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

Test odası.

Örnek giriş: 108,174,106

Örnek çıktı: [0.3793103448275862, 0.0, 0.3908045977011494, 0.3176470588235294]

Örnek giriş: 0,0,0

Örnek çıktı: [0, 0, 0, 1.0]

Kullanılan formül:

{J=mbirx(R,,G,,B)C=1-R,JM=1-G,JY=1-BJK=1-J255

Eski formül: http://i.stack.imgur.com/ZtPD6.gif

Eski formül: http://i.stack.imgur.com/Nqi9F.gif


güzel golf. arızaya dikkat etmek?
Titus

2

Lithp , 114 bayt

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

Çevrimiçi deneyin!

  • 6 bayt kaydedildi ( maxherhangi bir sayıda argüman alan unutuldu )

Bunun doğru olduğundan emin değilim. Örnek verilerle ilk iki sonuç doğrudur, ancak geri kalanı doğru değildir (bkz . Çevrimiçi deneyin .)

Güzel bir şekilde açıklanan uygulamayı aşağıdaki gibi kullanır:

{J=mbirx(R,,G,,B)C=1-R,JM=1-G,JY=1-BJK=1-J255


1

PHP 7, 123 110 105 bayt

RGB rengi olarak giriş 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 değerlerini ondalık olarak verir 0...1 aralıkta .

Titus sayesinde çok sayıda bayt kurtardı.

Örnek kullanım:

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

Çevrimiçi test edin


HEX rengi olarak giriş #123456, 202 bayt

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

Sıfırla bölünmeyi önlemek için işlev için 54 bayt, muhtemelen golf edilebilir veya çıkarılabilir.

HEX olarak giriş RGB rengi olarak alır #123456ve 0...1aralıkta CMYK değerini ondalık olarak verir .

Örnek kullanım:

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 valuesaraçlar sadece alabilir $h=$argv;ve kullanımı $h[1]yerine $h[0]vb ben gibi NANhile; ama bu uyarı vermiyor mu? strtrmuhtemelen daha kısadır str_replaceve NANhiçbir değere ihtiyaç duymaz (Bildirimler verir, ancak bunlar varsayılan yapılandırmada görüntülenmez).
Titus

Ayrıca, lütfen bunun içinde çalıştığı PHP sürümünü sağlayın. PHP 7'de ( 1/0sonuçların olduğu yerde INF) veya PHP 5'te ( 1/0=> false) bulunmaz .
Titus

@Titus $argvKomut satırındaki çok ilginç dizi ipucu için teşekkürler ! PHP sürümünü ekledim. İle çalışır NANçünkü str_replacesayıyı dolaylı olarak dize dönüştürür, böylece çıktı verir NAN, aslında bu bağlantıyı kontrol ederseniz NAN, str_replace("INF"bunun yerine çıktısını göreceksiniz str_replace("NAN". Kullanarak çalıştıramadım strtr. Ben @uyarıları bastırmak için ekledi .
Mario

Hatamı bulundu: $n/0olduğunu INFancak 0/0olduğunu NAN(PHP 7.0 ayrıca). İle 4 bayt str_replace(NAN,0,$s)veya ile 6 bayt kaydedebilirsiniz strtr($s,["NAN"=>0).
Titus

@Titus çok teşekkürler, düzgün bir şekilde nasıl kullanılacağını anlayamadım strtr();
Mario

1

PHP, rakip değil

Kendimi göndermek için çok cazip davrandım.

RGB girişi, 74 bayt

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

veya çıkışta sonda virgül bulunan 68 bayt: kaldır [$i>3].

İle çalıştırın php -r '<code>' <red-value> <green-value> <blue-value>.

HEX girişi, 100 bayt

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

İle çalıştırın php -nr '<code>' RRGGBB.

Bu yaklaşım RGB girişi için 75 bayt alacaktı:
yerine foreach($a=array_map...as$c)ile foreach($a=$argv as$c)if($i++).


0

C, 155 bayt

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

Golfün nasıl mümkün olabileceğini anlamaya çalışıyorum.

Kullanımı:

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

Çıktı:

0.379310
0.000000
0.390805
0.317647

1) +3: hata: işlev sonucu döndürmeli, yazdırmamalı. (üzgünüm sadece gördüm) 2) +4: hata: beyan edilmedi. 3) +0: hata: üçlü operatörleriniz kapalı görünüyor. bu olmamalıi>0?i>1?i>2
Titus

ancak bazı golf potansiyelleri vardır; ANSI C'de -25 bayt ve C99'da başka bir -19 buldum. 2 bayt burada:, j>0?döngüden kurtulmada 17 ve jtanımı bölmede 6 .
Titus

işlev için başka bir +3 ekleyin: int dışında bir şey döndürür, bu nedenle bir dönüş türü gereklidir ( F *). Ama C99'da golf için başka bir bayt buldum.
Titus

@Titus Eğer yanılmıyorsam, -3 bayt elde etmek j>0?j:1olabilir j+!j.
Albert Renshaw

Bence Cmakro yanlış: 1-x/1için j==0? Bence öyle olmalı 1-(j>0?x/j:1).
Titus

0

Hoon , 110 bayt

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

Tek hassas kayan noktalı kitaplığı kullanın. Süren yeni bir genel işlev oluşturun a. Set siçin subbirlikte curried .1ve sonrası için jüzerinde katlama için abirliktemax .

Üzerinde Harita a, her öğe, bölerek jdaha sonra 1 çıkarma, NaN normalleştirmek için bu ve 1 asgari bulma s. 1-j/255Listenin sonuna ekleyin .

> =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]]]

Lütfen bir TiO sağlayabilir misiniz?
Titus

@Titus: Hoon'un maalesef bir TiO sitesi yok.
RenderSettings
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.