Convertir les valeurs CMJN en RVB

9

Étant donné les codes de couleur en CMJN, convertissez-les en valeur RVB.

Entrée:
chaîne de 4 entiers (allant de 0 à 100) séparés par un espace

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

Production:

#141592
#ABCDEF
#F49043 

Le code le plus court gagne!

CONSEIL: Pour convertir CMJN en RVB, vous pouvez utiliser une formule telle que:

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)   

et utilisez ces trois variables pour obtenir la valeur au #RRGGBBformat

Étais-je
la source
1
Peut - on prendre des CMYKvaleurs telles que décimales de 0la 1ou est - il nécessaire de le faire 0pour 100?
HyperNeutrino
1
De plus, sommes-nous censés entrer plusieurs codes CMJN à la fois ou un seul et les convertir?
HyperNeutrino
7
Pouvons-nous prendre l'entrée comme une liste de nombres ou doit-elle être une chaîne délimitée?
Business Cat
7
L'entrée / sortie que vous avez fournie ne correspond pas à la formule, comment devrions-nous gérer l'arrondi?
Rod
2
@Rod Il n'est pas encore clair comment les imprécisions en virgule flottante doivent être gérées.
Erik the Outgolfer

Réponses:

2

Python 3 , 100 98 octets

-2 octets grâce à Rod.

lambda s:'#'+''.join('%02X'%int(.0255*(100-int(i))*(100-int(s.split()[3])))for i in s.split()[:3])

Essayez-le en ligne!

totalement humain
la source
Jouer aux maths. o0 Merci!
2017
2

Gelée , 24 octets

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

Un programme complet qui imprime le résultat.

Essayez-le en ligne!

Remarque: l' arrondi plutôt que le revêtement de sol peut être utilisé en insérant les deux octets de code +.entre 255et .

Comment?

Ḳ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
Jonathan Allan
la source
Une autre façon d'arrondir serait de _.Ċremplacer +.Ḟ... mais cette dernière est peut-être plus largement utilisée.
Erik the Outgolfer
2

Rétine , 103 octets

\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|;

^
#

Essayez-le en ligne! Remarque: Ce code est très lent, alors ne martelez pas le serveur de Dennis. Explication:

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

Convertissez chaque nombre en unaire et soustrayez de 100.

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

Multipliez tous les nombres par le dernier nombre, qui est supprimé.

1
51$*

Multipliez par 51, de sorte qu'une fois que nous divisons par 2000, nous obtenons 100 * 100 * 51 / 2000 = 255comme souhaité.

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

Diviser par 32000 et plancher diviser le reste par 2000, générant ainsi une paire de valeurs de base 16, bien que malheureusement elles-mêmes toujours écrites en base 10.

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

Convertir de la base 10 à la base 16.

^
#

Insérez l'interligne #.

Neil
la source
2

Java 8, 166 octets

s->{int i=0,c[]=java.util.Arrays.stream(s.split(" ")).mapToInt(Byte::new).toArray();for(s="#";i<3;)s+=s.format("%02X",(int)(.0255*(100-c[i++])*(100-c[3])));return s;}

Essayez-le en ligne!

Justin Mariner
la source
2

Javascript (ES6), 106 octets

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>

nderscore
la source
2

C ++ (gcc) , 169 166 octets

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

Essayez-le en ligne!

Utilisation de la formule optimisée. Ajouté +.5pour convertir CMJN = 0 0 0 0correct en RVB =0xffffff ce qui n'est pas nécessaire.

Karl Napf
la source
1

Python 3 , 114 110 108 106 106 104 octets

  • @xnor a enregistré 4 octets: code inutile supprimé
  • @rod a sauvé 2 octets: formule plus courte
  • enregistré 2 + 2 octets: range[3]as [0,1,2], indésirables []supprimés
n=input().split()
print('#'+''.join(hex(int(.0255*(100-int(n[i]))*(100-int(n[3]))))[2:]for i in[0,1,2]))

Essayez-le en ligne!

officialaimm
la source
1

Ruby , 92 + 1 pour l'indicateur -p = 93 octets

gsub(/(.+) (.+) (.+) (.+)/){'#%X%X%X'%[$1,$2,$3].map{|n|255*(1-n.to_i/1e2)*(1-$4.to_i/1e2)}}

Essayez-le en ligne!

Alexis Andersen
la source
1

Perl 5 , 58 52 + 1 (-a) = 59 53 octets

printf"#%2X%2X%2X",map{.0255*(100-$_)*(100-$F[3])}@F

Essayez-le en ligne!

Xcali
la source
0

Javascript, 104 octets

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``

Exemple d'extrait de code:

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

Herman L
la source
0

q / kdb +, 55 octets

Solution:

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

Exemples:

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"

Explication:

Assez simple, a volé l' 0.0255astuce à d'autres solutions (merci!). L'évaluation se fait de droite à gauche.

"#",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

Remarques:

Par défaut, les nombres de tours coûteraient 3 octets (_)au sol avant d'être convertis.

streetster
la source
0

05AB1E , 18 octets

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

Essayez-le en ligne!

-1 grâce à kalsowerus .

A des inexactitudes en virgule flottante, donc les résultats peuvent être décalés d'un, mais la formule de la question est utilisée.

Erik le Outgolfer
la source
Vous pouvez enregistrer un octet: $c'est la même chose que
kalsowerus
@kalsowerus Eh bien, pas exactement, mais cela fonctionnerait dans ce cas ...
Erik the Outgolfer
Ah input
oui
0

Haskell, 165 octets

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']
Sergii Martynenko Jr
la source
0

Fortran, 156 octets

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
Zongor
la source