Von Rgb nach Cmyk

9

Berechnen Sie bei 3 Bytes oder RGB als Eingabe die nächsten CMYK-Werte und geben Sie sie aus.

  • Erstellen Sie entweder eine Funktion mit Parametern und einem Rückgabewert oder ein Programm, das mit stdin / stdout arbeitet
  • Verwenden Sie das Farbprofil Ihrer Wahl, geben Sie jedoch eine Referenz an
  • Die Eingabe kann entweder separate numerische Werte im Bereich [0; 255] oder eine 6-stellige Hex-Zeichenfolge sein
  • Die Ausgabe sollte separate numerische Werte sein, die entweder [0; 1] oder [0; 100] reichen.
  • Standard Code Golf: Keine Lücken , kürzester Code gewinnt
  • extravagante Ideen sind willkommen

Beispieldaten:

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
  • Nicht kalibriertes Mapping ist in Ordnung und wahrscheinlich das einfachste
  • Keine Eingabevalidierung erforderlich; Floats sind erlaubt (von 0 bis 255), können aber auch gerundet sein
  • Das Ausgabeformat sollte entweder klar kommentiert oder offensichtlich sein. dh:
    1. CMYK in dieser Reihenfolge
    2. spielt keine Rolle, ob Prozentsatz [0; 100] oder reine Zahlen [0; 1]
  • Das Testen sollte das triviale Beispiel [0,0,0] enthalten.

Diese Seite hat die meisten Ziffern an Online-Tools, die ich finden konnte. Kennt jemand ein Werkzeug, das mehr als 4 Ziffern gibt?

Titus
quelle
4
Können Sie einige Beispiele für Ein- / Ausgänge nennen?
Kevin Cruijssen
8
@ KevinCruijssen Nur eine Randnotiz, aber ich glaube nicht, dass Sie so verwenden ± ...
Leaky Nun
1
Willkommen auf der Seite! Dies ist eine anständige Herausforderung, aber ein bisschen unklar. Ich stimme ab, um zu schließen, was Sie fragen, aber wenn Sie den Algorithmus erklären, um sie zu konvertieren und einige Testfälle bereitzustellen, werde ich meine Stimme zurückziehen.
James
2
@ KevinCruijssen In der Adverb-Sektion steht Südafrikanisch . Es wird im Standard-Englisch nicht so verwendet. Wir benutzen ~.
mbomb007
1
Die Nachricht über die enge Abstimmung ist etwas irreführend, da sie aus unseren Q & A-Wurzeln stammt, aber tatsächlich "als unklar auf Eis gelegt wurde, was Sie fragen". In den Kommentaren gab es einige Anfragen zur Klärung, die nicht angesprochen wurden: Insbesondere, ob Ein- und Ausgänge als Gleitkommazahlen zwischen 0 und 1 zulässig sind (oder ob es sich um Ganzzahlen von 0 bis 255 handeln muss), wie die Konvertierung tatsächlich funktioniert, und ob Sie einige Testfälle einschließen könnten.
Martin Ender

Antworten:

8

Dyalog APL , 16 15 Bytes

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

1 minus 1-
X geteilt durch ÷ Y , gefolgt von ,255 geteilt durch 255÷⍨ Y , wobei
  X selbst ist (dh die Liste der RGB-Werte) und
  Y das Maximum /⌈(der RGB-Werte) ist.

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

TryAPL!

Credits:
 ∘ -1 Byte von ngn .

Adam
quelle
Wann bekommt PPCG MathJax?
Neil
+1 für ! Nettes Emoticon
Programmierer5000
1
@ programmer5000 Danke. Sie finden das in so ziemlich allen meinen Code-Golfspielen. Es tauscht die Argumente der Funktion nach links. Andere APL-Emoticons sind und . Ich hoffe , wir bekommen und bald.
Adám
@ Adám würde mich glücklich machen!
Programmierer5000
8

C # , 88 86 85 84 Bytes

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

Ausgabe für 108,174,106:

0.3793104
0
0.3908046
0.3176471

Da OP die Funktion erlaubt, habe ich nur das Lambda eingereicht. Eine laufende Demo finden Sie auf .NetFiddle . Ich bin kein Golfer, ich poste zum Spaß. Es ist auch meine erste Antwort \ o /. Fühlen Sie sich frei, jede Verbesserung zu kommentieren :)

Ein großes Lob an Leaky Nun für die Formel.

Vorbehalt: Es funktioniert nicht für [0,0,0] (danke Titus)

aloisdg wechselt zu codidact.com
quelle
1
1.0-x/j? Das kannst du doch nicht 1-x/j?
Erik der Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ ja ich kann! Es war eine Pause von einer Erfahrung. Das Ziel war es, automatisch zu verdoppeln. Ich entferne es.
Aloisdg wechselt zu codidact.com
1
Sie brauchen es sowieso nicht für die Subtraktion. Auch scheinen Sie nicht wieder zu verwenden a[3], und Sie scheinen nicht eine feste Größe für angeben a, so können Sie tun , {r,g,b}und a[3]=j*j(weil sowieso, 1 * a = a).
Erik der Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Ich verwende amit dem select(). Wenn ich so benutze, a[3]werde ich außer Reichweite sein und werfen, nicht wahr?
Aloisdg wechselt zu codidact.com
1
Tolle erste Antwort und willkommen bei PPCG! Wenn Sie Ihre Sprache und Ihre Bytes in einer größeren Schrift wie die anderen Antworten anzeigen möchten (was hier normalerweise der Standard ist), können Sie ein #vor der Zeile einfügen. :)
Kevin Cruijssen
4

Python, 46 Bytes

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

Erfordert, dass die Eingabe in Python 2 schwebt, ziemlich sicher, dass dies in 3 nicht der Fall ist.

Arfie
quelle
3

JavaScript (ES6), 58 51 Byte

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

Akzeptiert ein Array [R, G, B](addiert 7 Bytes für separate Parameter) und gibt ein Array [C, M, Y, K]mithilfe der nicht kalibrierten Farbzuordnung zurück.

Neil
quelle
Sind Sie sicher mit der Bestellung CYMK bei Ihrer zweiten Antwort? sieht für mich wie CMYK aus.
Titus
2) Wissen Sie, warum das Verteilen von aInhalten den Inhalt verwechselt? Das ist komisch. 3) Haben Sie [0,0,0] getestet? Keine Ausnahme in ES, sieht aber wie eine Division durch Null aus.
Titus
Entschuldigung, sie waren beide CMY, das war meine Schuld. Jetzt wurden auch die [0,0,0] Fälle behoben.
Neil
4) Probieren Sie [...a,m=Math.max(...a)]Ihre Array-Lösung aus. 5) Können Sie den anderen mit einem Array als Eingabe weiter spielen? Erwägen Sie die Verwendung von a.0etc. anstelle von .map.
Titus
@Titus Ich habe mir jetzt einen völlig neuen Ansatz ausgedacht, der tatsächlich die CMYK-Reihenfolge bevorzugt und auch 7 Bytes spart!
Neil
3

Mathematica, 36 28 33 Bytes

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

Nach der Liberalisierung der E / A-Formate weiter Golf gespielt: List@@#~ColorConvert~"CMYK"&

Anonyme Funktion, die macht, was gefragt wird.

Die alte Funktion akzeptiert drei Argumente von 0 bis 255 (alles, was über diesen Bereich hinausgeht, wird automatisch auf diesen Bereich begrenzt) und gibt ein Array von "CMYK" -Werten zwischen 0.und zurück1.

Beispiel (für alte Funktion):

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

Da Arrays als Eingabe zulässig sind, werden 33 Bytes:

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

Natürlich funktioniert die eingebaute Funktion {0, 0, 0}ordnungsgemäß und kehrt zurück {0, 0, 0, 1}.

LLlAMnYP
quelle
1) Zur Verdeutlichung: Eingabewerte müssen in [0; 255] sein. wird die Frage in einer Minute bearbeiten, 2) Bitte testen Sie [0,0,0]. 3) Sollte das nicht sein /255?
Titus
@Titus Sie haben Recht, es ist 255, kann im Moment nicht alle Probleme beheben, ich werde die Dinge so
schnell wie möglich
@Titus behoben
LLlAMnYP
2

Bash + ImageMagick, 69 Bytes

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

Beispiel:

$ ./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
quelle
2

SmileBASIC, 73 72 Bytes

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

Könnte viel kürzer sein.

12Me21
quelle
Wolltest du schreiben J=MAX(R,G,B)?
Andrakis
Ja Dankeschön.
12Me21
2

Pyth, 24 21 18 24 21 Bytes

Das Leben ist in der Tat eine Rundreise.

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

Testsuite.

Beispieleingabe: 108,174,106

Beispielausgabe: [0.3793103448275862, 0.0, 0.3908045977011494, 0.3176470588235294]

Beispieleingabe: 0,0,0

Beispielausgabe: [0, 0, 0, 1.0]

Verwendete Formel:

{J.=meinx(R.,G,B.)C.=1- -R.J.M.=1- -GJ.Y.=1- -B.J.K.=1- -J.255

Alte Formel: http://i.stack.imgur.com/ZtPD6.gif

Alte Formel: http://i.stack.imgur.com/Nqi9F.gif

Undichte Nonne
quelle
schönes Golfen. Lust auf einen Zusammenbruch?
Titus
2

Lithp , 114 Bytes

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

Probieren Sie es online aus!

  • 6 Bytes gespeichert (das vergessen max eine beliebige Anzahl von Argumenten erforderlich ist)

Ich bin mir nicht ganz sicher, ob das richtig ist. Die ersten beiden Ergebnisse mit den Beispieldaten sind korrekt, der Rest jedoch nicht (siehe die Online-Test ).

Verwendet die beschriebene Implementierung wie folgt:

{J.=meinx(R.,G,B.)C.=1- -R.J.M.=1- -GJ.Y.=1- -B.J.K.=1- -J.255

Andrakis
quelle
1

PHP 7, 123 110 105 Bytes

Eingabe als RGB-Farbe 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]);

Gibt CMYK-Werte als Dezimalzahl aus 0...1 .

Dank Titus wurden viele Bytes gespeichert.

Beispielnutzung:

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

Online testen


Eingabe als HEX-Farbe #123456, 202 Bytes

$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 Bytes für die Funktion zur Verhinderung der Division durch Null, wahrscheinlich golfbar oder entfernbar.

Ruft als Eingabe-RGB-Farbe als HEX ab #123456und gibt CMYK als Dezimalbereich aus 0...1.

Beispielnutzung:

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
quelle
separate numeric valuesbedeutet, dass Sie statt usw. einfach nehmen $h=$argv;und verwenden können . Ich mag den Trick; Aber gibt das nicht Warnungen aus? ist wahrscheinlich kürzer als und benötigt keine Anmerkung (gibt Hinweise aus, aber diese werden in der Standardkonfiguration nicht angezeigt). $h[1]$h[0]NANstrtrstr_replaceNAN
Titus
Bitte geben Sie auch die PHP-Version an, in der dies funktioniert. Sie funktioniert weder in PHP 7 (wo 1/0Ergebnisse resultieren INF) noch in PHP 5 ( 1/0=> false).
Titus
@Titus Danke für den sehr interessanten $argvArray-Tipp in der Kommandozeile! Ich habe die PHP-Version hinzugefügt. Es funktioniert mit, NANweil, wenn Sie es verwenden str_replace, die Zahl implizit in eine Zeichenfolge konvertiert wird, damit sie ausgegeben NANwird. Wenn Sie diesen Link überprüfen , werden Sie feststellen, dass sie NANaufgrund von str_replace("INF"statt ausgibt str_replace("NAN". Ich konnte es nicht zum Laufen bringen strtr. Ich habe das hinzugefügt @, um die Warnungen zu unterdrücken.
Mario
Ich fand mein Fehler: $n/0ist INF, aber 0/0ist NAN(auch in PHP 7.0). Sie können 4 Bytes mit str_replace(NAN,0,$s)oder 6 Bytes mit speichern strtr($s,["NAN"=>0).
Titus
@Titus Vielen Dank, ich konnte nicht herausfinden, wie man es richtig benutzt strtr();
Mario
1

PHP, nicht konkurrierend

Ich war einfach zu versucht, meine eigenen zu posten.

RGB-Eingang, 74 Bytes

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

oder 68 Bytes mit einem nachgestellten Komma in der Ausgabe: entfernen [$i>3].

Laufen Sie mit php -r '<code>' <red-value> <green-value> <blue-value>.

HEX-Eingang, 100 Bytes

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

Laufen Sie mit php -nr '<code>' RRGGBB.

Dieser Ansatz würde 75 Bytes für die RGB-Eingabe benötigen:
Ersetzen foreach($a=array_map...as$c)durch foreach($a=$argv as$c)if($i++).

Titus
quelle
0

C 155 Bytes

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

Ich versuche herauszufinden, wie es möglich ist, mehr Golf zu spielen.

Verwendungszweck:

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

Ausgabe:

0.379310
0.000000
0.390805
0.317647
Giacomo Garabello
quelle
1) +3: Fehler: Die Funktion sollte das Ergebnis zurückgeben, nicht drucken. (Entschuldigung, ich habe das gerade gesehen) 2) +4: Fehler: Ich bin nicht deklariert. 3) +0: Fehler: Ihre ternären Operatoren scheinen ausgeschaltet zu sein. sollte das nicht seini>0?i>1?i>2
Titus
aber es gibt ein gewisses Golfpotential; Ich fand -25 Bytes in ANSI C und weitere -19 in C99. 2 Bytes sind hier : j>0?, 17 beim Entfernen der Schleife und 6 beim Aufteilen der jDefinition.
Titus
Fügen Sie weitere +3 für die Funktion hinzu: Sie gibt etwas anderes als int zurück, daher ist ein Rückgabetyp erforderlich ( F *). Aber ich habe in C99 ein anderes Byte gefunden, um Golf zu spielen.
Titus
@Titus Wenn ich mich nicht irre, j>0?j:1kann es sein j+!j, -3 Bytes zu erreichen.
Albert Renshaw
Und ich denke, das CMakro ist falsch: 1-x/1für j==0? Ich denke das sollte sein 1-(j>0?x/j:1).
Titus
0

Hoon , 110 Bytes

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

Verwenden Sie die Gleitkomma-Bibliothek mit einfacher Genauigkeit. Erstellen Sie eine neue generische Funktion, die benötigt wird a. Setzen Sie sauf subcurried mit .1für später, und jzum Umklappen amit max.

Ordnen Sie adie Abbildung zu j, indem Sie jedes Element mit teilen , das Minimum davon und 1 ermitteln, um NaN zu normalisieren, und dann 1 mit subtrahieren s. Am 1-j/255Ende dieser Liste hinzufügen.

> =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]]]
RenderSettings
quelle
Können Sie bitte ein TiO bereitstellen?
Titus
@Titus: Hoon hat leider keine TiO-Seite.
RenderSettings