Konvertieren Sie CMYK-Werte in RGB


9

Konvertieren Sie die in CMYK angegebenen Farbcodes in den RGB-Wert.

Eingabe:
Zeichenfolge mit 4 Ganzzahlen (von 0 bis 100), getrennt durch Leerzeichen

86 86 0 43
28 14 0 6
0 41 73 4

Ausgabe:

#141592
#ABCDEF
#F49043 

Der kürzeste Code gewinnt!

TIPP: Zum Konvertieren von CMYK in RGB können Sie folgende Formeln verwenden:

Red   = 255 x (1 - Cyan/100)    x (1 - Black/100)   
Green = 255 x (1 - Magenta/100) x (1 - Black/100)   
Blue  = 255 x (1 - Yellow/100)  x (1 - Black/100)   

und verwenden Sie diese drei Variablen, um den Wert im #RRGGBBFormat zu erhalten


1
Können wir CMYKWerte als Dezimalzahlen aus 0zu 1oder ist es erforderlich , zu tun 0zu 100?
HyperNeutrino

1
Sollen wir auch mehrere CMYK-Codes gleichzeitig oder nur einen eingeben und konvertieren?
HyperNeutrino

7
Können wir die Eingabe als eine Liste von Zahlen nehmen oder muss es eine begrenzte Zeichenfolge sein?
Business Cat

7
Die von Ihnen bereitgestellte Eingabe / Ausgabe stimmt nicht mit der Formel überein. Wie sollen wir mit der Rundung umgehen?
Rod

2
@ Rod Es ist noch etwas unklar, wie mit Gleitkomma-Ungenauigkeiten umgegangen werden soll.
Erik der Outgolfer

Antworten:




2

Gelee , 24 Bytes

ḲV÷ȷ2ạ1×Ṫ$×255ḞṃØHṙ1¤ṭ”#

Ein vollständiges Programm, das das Ergebnis druckt.

Probieren Sie es online aus!

Hinweis: Durch Einfügen der beiden Codebytes +.zwischen 255und kann anstelle von Bodenbelägen eine Rundung verwendet werden .

Wie?

ḲV÷ȷ2ạ1×Ṫ$×255ḞṃØHṙ1¤ṭ”# - Main link: list of character, s
Ḳ                        - split at spaces (makes a list of lists of characters)
 V                       - evaluate as Jelly code (makes a list of the decimal numbers)
   ȷ2                    - literal 100
  ÷                      - divide (vectorises to yield [C/100, M/100, Y/100, K/100])
     ạ1                  - absolute difference with 1 -> [1-(C/100),...]
         $               - last two links as a monad:
        Ṫ                -   tail (this is 1-(K/100))
       ×                 -   multiply (vectorises across the other three)
          ×255           - multiply by 255 (vectorises)
              Ḟ          - floor to the nearest integer
                    ¤    - nilad followed by link(s) as a nilad:
                ØH       -   hex-digit yield = "0123456789ABCDEF"
                  ṙ1     -   rotate left by 1 -> "123456789ABCDEF0"
               ṃ         - base decompress (use those as the digits for base length (16))
                      ”# - literal character '#'
                     ṭ   - tack
                         - implicit print

Ein anderer Weg zum Runden wäre _.Ċstatt +.Ḟ... aber letzterer wird vielleicht häufiger verwendet.
Erik der Outgolfer

2

Netzhaut , 103 Bytes

\d+
$*1;100$*
(1*);\1

1(?=.* (1*))|1
$1
1
51$*
(1{32000})*(1{2000})*1*.
;$#1;$#2
T`d`L`1\d
;B\B|;

^
#

Probieren Sie es online aus! Hinweis: Dieser Code ist sehr langsam, also hämmern Sie bitte nicht auf Dennis 'Server. Erläuterung:

\d+
$*1;100$*
(1*);\1

Konvertiere jede Zahl in unär und subtrahiere von 100.

1(?=.* (1*))|1
$1

Multiplizieren Sie alle Zahlen mit der letzten Zahl, die gelöscht wird.

1
51$*

Mit 51 multiplizieren, so dass wir nach dem Teilen durch 2000 100 * 100 * 51 / 2000 = 255wie gewünscht erhalten.

(1{32000})*(1{2000})*1*.
;$#1;$#2

Teilen Sie durch 32000 und teilen Sie den Rest durch 2000, wodurch ein Paar von Basis-16-Werten erzeugt wird, obwohl sie leider selbst noch in Basis 10 geschrieben sind.

T`d`L`1\d
;B\B|;

Konvertieren Sie von Basis 10 zu Basis 16.

^
#

Fügen Sie die Führung ein #.



2

Javascript (ES6), 106 Bytes

f=
(s,z=s.split` `,k=z.pop())=>'#'+z.map(x=>('0'+(.0255*(100-x)*(100-k)+.5|0).toString(16)).slice(-2)).join``
<input id=i value="28 14 0 6"/><button onclick="o.innerHTML=f(i.value)"/>Go</button>
<pre id=o></pre>


2

C ++ (gcc) , 169 166 Bytes

#import<iostream>
#import<iomanip>
#define F(x)int(.0255*(100-x)*(100-k))
int main(){
int c,m,y,k;
std::cin>>c>>m>>y>>k;
std::cout<<"#"<<std::hex<<F(c)<<F(m)<<F(y);
}

Probieren Sie es online aus!

Verwendung der optimierten Formel. Hinzugefügt +.5, um CMYK = 0 0 0 0korrekt in RGB = zu konvertieren,0xffffff was nicht erforderlich ist.


1

Python 3 , 114 110 108 106 104 Bytes

  • @xnor 4 Bytes gespeichert: unnötigen Code gelöscht
  • @rod hat 2 Bytes gespeichert: kürzere Formel
  • 2 + 2 Bytes gespeichert: range[3]as [0,1,2], unerwünscht []entfernt
n=input().split()
print('#'+''.join(hex(int(.0255*(100-int(n[i]))*(100-int(n[3]))))[2:]for i in[0,1,2]))

Probieren Sie es online aus!





0

Javascript, 104 Bytes

s=>"#"+[0,1,2].map(n=>("0"+((255-2.55*s[n])*(1-s[3]/100)|0).toString(16)).slice(-2),s=s.split` `).join``

Beispielcode-Snippet:

f=

s=>"#"+[0,1,2].map(n=>("0"+((255-2.55*s[n])*(1-s[3]/100)|0).toString(16)).slice(-2),s=s.split` `).join``

console.log(f("86 86 0 43"))
console.log(f("28 14 0 6"))
console.log(f("0 41 73 4"))


0

q / kdb +, 55 Bytes

Lösung:

"#",raze{(last($)0x0 vs)each"h"$.0255*x[3]*x 0 1 2}100-

Beispiele:

q)"#",raze{(last($)0x0 vs)each"h"$.0255*x[3]*x 0 1 2}100-86 86 0 43
"#141491"
q)"#",raze{(last($)0x0 vs)each"h"$.0255*x[3]*x 0 1 2}100-28 14 0 6
"#adcef0"
q)"#",raze{(last($)0x0 vs)each"h"$.0255*x[3]*x 0 1 2}100-0 41 73 4
"#f59042"

Erläuterung:

Ziemlich einfach, hat den 0.0255Trick aus anderen Lösungen gestohlen (danke!). Die Auswertung erfolgt von rechts nach links.

"#",raze {(last string 0x0 vs) each "h"$ .0255 * a[3] * a 0 1 2}100- / ungolfed
         {                                                     }     / lambda function
                                                                100- / subtract from 100 (vector)
                                                        a 0 1 2      / index into a at 0, 1 and 2 (CMY)
                                                 a[3]                / index into at at 3 (K)
                                                      *              / multiply together
                                         .0255 *                     / multiply by 0.255
                                    "h"$                             / cast to shorts
          (                  ) each                                  / perform stuff in brackets on each list item
                       0x0 vs                                        / converts to hex, 1 -> 0x0001
                string                                               / cast to string, 0x0001 -> ["00", "01"]
           last                                                      / take the last one, "01"
    raze                                                             / join strings together
"#",                                                                 / prepend the hash

Anmerkungen:

Die Anzahl der Runden würde standardmäßig 3 Byte pro (_)Etage kosten , bevor sie zu kurz geworfen wird.


0

05AB1E , 18 Bytes

$#т/-¤s¨*255*hJ'#ì

Probieren Sie es online aus!

-1 dank kalsowerus .

Hat Gleitkomma-Ungenauigkeiten, so dass die Ergebnisse möglicherweise nacheinander abweichen, aber die Formel in der Frage wird verwendet.


Sie können ein Byte speichern: $ist genau das gleiche wie
kalsowerus

@ kalsowerus Nun, nicht genau, aber es würde in diesem Fall funktionieren ...
Erik der Outgolfer

Oh richtig .. Ich bin nicht sicher, welche Eingabe ist, inputwenn es mehrere geben würde
kalsowerus

0

Haskell, 165 Bytes

q=(1-).(/100)
x!y=h$ceiling$q x*(q y)*255
f c m y k=concat["#",c!k,m!k,y!k]
h x|x<16=[s!!x]|0<1=(h((x-m)`quot`16))++[s!!m] where m=x`mod`16
s=['0'..'9']++['a'..'f']

0

Fortran, 156 Bytes

PROGRAM C
REAL,DIMENSION(4,3)::d
READ(*,*)((d(i,j),i=1,4),j=1,3)
WRITE(*,'((A,3(Z2)))')(35,(INT(.0255*(100-d(i,j))*(100-d(4,j))),i=1,3),j=1,3)
END PROGRAM C
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.