Da Rgb a Cmyk


9

Dato 3 byte o RGB come input, calcola i valori CMYK più vicini e li emette.

  • crea una funzione con parametri e valore di ritorno o un programma che opera su stdin / stdout
  • usa il profilo colore di tua scelta, ma fornisci un riferimento
  • l'input può essere valori numerici separati nell'intervallo [0; 255] o una stringa esadecimale a 6 cifre
  • l'output dovrebbe essere valori numerici separati che vanno tra [0; 1] o [0; 100]
  • codice standard golf: nessuna scappatoia , il codice più corto vince
  • idee stravaganti sono benvenute

dati di esempio:

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
  • La mappatura non calibrata va bene e probabilmente la più semplice
  • Nessuna convalida di input richiesta; i float sono ammessi (compresi tra 0 e 255), ma possono anche essere arrotondati
  • Il formato di output deve essere chiaramente commentato o ovvio; vale a dire:
    1. CMYK in questo ordine
    2. non importa se percentuale [0; 100] o numeri puri [0; 1]
  • I test dovrebbero includere l'esempio banale [0,0,0].

Questo sito ha il maggior numero di strumenti online che ho potuto trovare. Qualcuno conosce uno strumento che fornisce più di 4 cifre?


4
Potresti dare alcuni esempi di ingressi / uscite?
Kevin Cruijssen,

8
@KevinCruijssen Solo una nota a margine, ma non penso che sia così che usi ± ...
Leaky Nun

1
Benvenuti nel sito! Questa è una sfida decente, ma è un po 'poco chiara. Sto votando per chiudere come poco chiaro quello che stai chiedendo, ma se spieghi l'algoritmo per convertirli e fornisci alcuni casi di prova, ritirerò il mio voto.
James,

2
@KevinCruijssen Nella sezione avverbio, dice sudafricano . Non è usato in questo modo nell'inglese standard. Usiamo ~.
mbomb007,

1
Il messaggio di voto ravvicinato è un po 'fuorviante, perché deriva dalle nostre radici di domande e risposte, ma in effetti è stato "sospeso come poco chiaro ciò che stai chiedendo". Ci sono state un paio di richieste di chiarimenti nei commenti che non sono state affrontate: in particolare se sono consentiti input e output come float tra 0 e 1 (o se deve essere un numero intero compreso tra 0 e 255), come funziona effettivamente la conversione, e se è possibile includere alcuni casi di test.
Martin Ender,

Risposte:


8

Dyalog APL , 16 15 byte

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

1 meno 1-
X diviso per ÷ Y , seguito da ,255 che divide 255÷⍨ Y , dove
  X è esso stesso (ovvero l'elenco dei valori RGB) e
  Y è il massimo /⌈(dei valori RGB).

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

TryAPL!

Crediti:
 ∘ -1 byte per ngn .


Quando PPCG sta ottenendo MathJax?
Neil,


+1 per ! Emoticon piacevole
programmatore

1
@ programmer5000 Grazie. Lo troverai praticamente in tutti i miei code-golf. Scambia gli argomenti della funzione alla sua sinistra. Altre emoticon APL sono e . Spero che arriveremo e presto.
Adám,

@Adám mi renderebbe felice!
programmatore

8

C # , 88 86 85 84 byte

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

uscita per 108,174,106:

0.3793104
0
0.3908046
0.3176471

Poiché OP consente la funzione, ho inviato solo lambda. Puoi trovare una demo in esecuzione su .NetFiddle . Non sono un giocatore di golf, invio per divertimento. Inoltre, è la mia prima risposta \ o /. Sentiti libero di commentare qualsiasi miglioramento :)

Complimenti a Leaky Nun per la formula.

avvertenza: non funziona per [0,0,0] (grazie Tito)


1
1.0-x/j? Non puoi sicuramente farlo 1-x/j?
Erik the Outgolfer,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ sì, posso! È stato un periodo di riposo per esperienza. L'obiettivo era raddoppiare automaticamente il cast. Lo rimuovo.
aloisdg si trasferisce su codidact.com il

1
Non è necessario per la sottrazione comunque. Inoltre, non sembri riutilizzare a[3]e non sembri specificare una dimensione fissa per a, quindi puoi farlo {r,g,b}e a[3]=j*j(perché, comunque, 1 * a = a).
Erik the Outgolfer,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Sto riutilizzando acon select(). Se lo uso in a[3]questo modo, andrò fuori portata e lancio, vero?
aloisdg si trasferisce su codidact.com il

1
Ottima prima risposta e benvenuto in PPCG! Se si desidera visualizzare la lingua e i byte in un carattere più grande come le altre risposte (che di solito è lo standard qui), è possibile aggiungere un #davanti alla riga. :)
Kevin Cruijssen il

4

Python, 46 byte

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

Richiede che l'input sia float in Python 2, abbastanza sicuro che non lo sia in 3.


3

JavaScript (ES6), 58 51 byte

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

Accetta una matrice [R, G, B](aggiungi 7 byte per parametri separati) e restituisce una matrice [C, M, Y, K]usando la mappatura dei colori non calibrata.


Sei sicuro con l'ordine CYMK sulla tua seconda risposta? mi sembra CMYK.
Tito

2) Sai perché la diffusione di amescola il suo contenuto? Questo è strano. 3) Hai provato [0,0,0]? Nessuna eccezione in ES, ma sembra una divisione per zero.
Tito,

Scusate, erano entrambi CMY, è stata colpa mia. Ora risolto anche i casi [0,0,0].
Neil,

4) Prova [...a,m=Math.max(...a)]nella tua soluzione array. 5) Puoi giocare a golf l'altro usando un array come input? Valuta di usare a.0ecc. Anziché .map.
Tito,

@Titus Ho escogitato un approccio completamente nuovo, che in realtà preferisce l'ordine CMYK e salva anche 7 byte!
Neil,

3

Matematica, 36 28 33 byte

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

Dopo la liberalizzazione dei formati I / O, ho continuato a giocare a golf: List@@#~ColorConvert~"CMYK"&

Funzione anonima, che fa ciò che viene chiesto.

La vecchia funzione accetta tre argomenti da 0 a 255 (qualsiasi cosa al di fuori di questo intervallo verrà automaticamente tagliata a questo intervallo) e restituisce una matrice di valori "CMYK" tra 0.e1.

Esempio (per la vecchia funzione):

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

Poiché le matrici sono consentite come input, 33 byte:

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

Naturalmente i built-in maniglie funzioni {0, 0, 0}correttamente e ritorni {0, 0, 0, 1}.


1) Per chiarire: i valori di input devono essere in [0; 255]. modificherà la domanda in un minuto, 2) Prova [0,0,0]. 3) Non dovrebbe essere /255?
Tito,

@Titus hai ragione, sono 255, al momento non posso risolvere tutti i problemi, risolverò le cose al più presto
LLlAMnYP

@Titus l'ha risolto
LLlAMnYP il

2

Bash + ImageMagick, 69 byte

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

Esempio:

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

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

Potrebbe essere molto più breve.


Intendevi scrivere J=MAX(R,G,B)?
Andrakis,

Si Grazie.
maggio 21

2

Pyth, 24 21 18 24 21 byte

La vita è un viaggio di andata e ritorno, in effetti.

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

Suite di test.

Input di esempio: 108,174,106

Uscita campione: [0.3793103448275862, 0.0, 0.3908045977011494, 0.3176470588235294]

Input di esempio: 0,0,0

Uscita campione: [0, 0, 0, 1.0]

Formula utilizzata:

{J=mun'X(R,sol,B)C=1-RJM=1-solJY=1-BJK=1-J255

Vecchia formula: http://i.stack.imgur.com/ZtPD6.gif

Vecchia formula: http://i.stack.imgur.com/Nqi9F.gif


bel golf. ti preoccupi per un guasto?
Tito,

2

Lithp , 114 byte

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

Provalo online!

  • 6 byte salvati (dimenticato che maxaccetta un numero qualsiasi di argomenti)

Non sono del tutto sicuro che sia giusto. I primi due risultati con i dati di esempio sono corretti, ma il resto no (vedere la sezione Provalo online ).

Utilizza l'implementazione descritta come segue:

{J=mun'X(R,sol,B)C=1-RJM=1-solJY=1-BJK=1-J255


1

PHP 7, 123 110 105 byte

Input come colore RGB 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]);

Emette valori CMYK come decimali 0...1nell'intervallo.

Hai salvato molti byte grazie a Titus.

Esempio di utilizzo:

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

Test online


Immettere come colore esadecimale #123456, 202 byte

$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 byte per la funzione per impedire la divisione per zero, probabilmente golfable o rimovibile.

Ottiene come colore RGB di input come HEX #123456e genera CMYK come decimale 0...1nell'intervallo.

Esempio di utilizzo:

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 valuessignifica che puoi semplicemente prendere $h=$argv;e usare $h[1]invece di $h[0]ecc. Mi piace il NANtrucco; ma questo non dà avvertimenti? strtrè probabilmente più breve di str_replacee NANnon necessita di qotation (produrrà Avvisi, ma quelli non vengono visualizzati nella configurazione predefinita).
Tito

Inoltre, si prega di fornire la versione di PHP in cui funziona. Non in PHP 7 (dove 1/0risultati INF) né in PHP 5 ( 1/0=> false).
Tito

@Titus Grazie per l'interessantissimo $argvsuggerimento dell'array nella riga di comando! Ho aggiunto la versione di PHP. Funziona con NANperché quando lo usi str_replaceconverte implicitamente il numero in stringa in modo che emetta NAN, infatti se controlli su questo link , vedrai che viene emesso a NANcausa di str_replace("INF"invece di str_replace("NAN". Non riuscivo a farlo funzionare usando strtr. Ho aggiunto il @per sopprimere gli avvisi.
Mario,

Ho trovato il mio errore: $n/0è INF, ma 0/0è NAN(anche in PHP 7.0). È possibile salvare 4 byte con str_replace(NAN,0,$s)o 6 byte con strtr($s,["NAN"=>0).
Tito,

@Titus, grazie, non sono riuscito a capire come usarlo correttamente strtr();
Mario,

1

PHP, non in competizione

Ero troppo tentato di pubblicare il mio.

Ingresso RGB, 74 byte

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

o 68 byte con una virgola finale nell'output: remove [$i>3].

Corri con php -r '<code>' <red-value> <green-value> <blue-value>.

Ingresso esadecimale, 100 byte

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

Corri con php -nr '<code>' RRGGBB.

Questo approccio richiederebbe 75 byte per l'ingresso RGB:
sostituirlo foreach($a=array_map...as$c)con foreach($a=$argv as$c)if($i++).


0

C, 155 byte

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

Sto cercando di capire come è possibile giocare a golf di più.

Uso:

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

Produzione:

0.379310
0.000000
0.390805
0.317647

1) +3: errore: la funzione dovrebbe restituire il risultato, non stamparlo. (scusate l'ho appena visto) 2) +4: errore: non sono stato dichiarato. 3) +0: errore: i tuoi operatori ternari sembrano spenti. non dovrebbe esserei>0?i>1?i>2
Tito

ma c'è qualche potenziale di golf; Ho trovato -25 byte in ANSI C e un altro -19 in C99. Sono presenti 2 byte: j>0?17 per eliminare il loop e 6 per suddividere la jdefinizione.
Tito,

aggiungi un altro +3 per la funzione: restituisce qualcosa di diverso da int, quindi è necessario un tipo restituito ( F *). Ma ho trovato un altro byte per giocare a golf nel C99.
Tito

@Titus Se non sbaglio, j>0?j:1può essere j+!jquello di raggiungere -3 byte.
Albert Renshaw,

E penso che la Cmacro non sia corretta: 1-x/1per j==0? Penso che dovrebbe essere 1-(j>0?x/j:1).
Tito

0

Hoon , 110 byte

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

Utilizzare la libreria a virgola mobile di precisione singola. Crea una nuova funzione generica che accetta a. Impostare ssu subcurry con .1per dopo e jpiegare aconmax .

Mappare adividendo ogni elemento con j, trovando il minimo di quello e 1 per normalizzare NaN, quindi sottrarre 1 con s. Aggiungi 1-j/255alla fine di tale elenco.

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

Potete fornire un TiO per favore.
Tito

@Titus: Hoon non ha un sito TiO, sfortunatamente.
Impostazioni di rendering
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.