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 wie1¹
— 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.