De Rgb para Cmyk

9

Dados 3 bytes ou RGB como entrada, calcule os valores CMYK mais próximos e faça a saída deles.

  • crie uma função com parâmetros e valor de retorno ou um programa que opere em stdin / stdout
  • use o perfil de cores de sua escolha, mas forneça uma referência
  • entrada pode ser valores numéricos separados no intervalo [0; 255] ou uma sequência hexadecimal de 6 dígitos
  • a saída deve ser valores numéricos separados, variando entre [0; 1] ou [0; 100]
  • código de golfe padrão: sem brechas , o código mais curto vence
  • idéias extravagantes são bem-vindas

dados de amostra:

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
  • O mapeamento não calibrado é bom e provavelmente o mais fácil
  • Nenhuma validação de entrada é necessária; flutuadores são permitidos (variando de 0 a 255), mas também podem ser arredondados
  • O formato de saída deve ser claramente comentado ou óbvio; ou seja:
    1. CMYK nessa ordem
    2. não importa se a porcentagem [0; 100] ou os números puros [0; 1]
  • O teste deve incluir o exemplo trivial [0,0,0].

Este site tem o maior número de ferramentas online que eu encontrei. Alguém conhece uma ferramenta que fornece mais de 4 dígitos?

Titus
fonte
4
Você poderia dar alguns exemplos de entradas / saídas?
Kevin Cruijssen
8
@KevinCruijssen Apenas uma nota lateral, mas eu não acho que é assim que você usa ± ... #
Leaky Nun
11
Bem vindo ao site! Este é um desafio decente, mas é um pouco incerto. Estou votando para encerrar o que você está perguntando, mas se você explicar o algoritmo para convertê-los e fornecer alguns casos de teste, retirarei meu voto.
James
2
@KevinCruijssen Na seção de advérbios, diz Sul-Africano . Não é usado dessa maneira no inglês padrão. Nós usamos ~.
mbomb007
11
A mensagem de votação apertada é um pouco enganadora, porque deriva de nossas raízes nas perguntas e respostas, mas foi de fato "colocada em espera, pois não está claro o que você está perguntando". Houve alguns pedidos de esclarecimento nos comentários que não foram abordados: especificamente se são permitidas entradas e saídas como flutuações entre 0 e 1 (ou se devem ser números inteiros de 0 a 255), como a conversão realmente funciona, e se você pode incluir alguns casos de teste.
Martin Ender

Respostas:

8

Dyalog APL , 16 15 bytes

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

1 menos 1-
X dividido por ÷ Y , seguido por ,255 dividindo 255÷⍨ Y , onde
  X é ele próprio (ou seja, a lista de valores RGB) e
  Y é o máximo /⌈(dos valores RGB).

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

TryAPL!

Créditos:
 -1 byte por ngn .

Adão
fonte
Quando o PPCG está obtendo o MathJax?
Neil
+1 para ! Emoticon agradável
programmer5000
11
@ programmer5000 Obrigado. Você encontrará esse em praticamente todos os meus códigos de golfe. Ele troca os argumentos da função para a esquerda. Outros emoticons de APL são e . Espero que cheguemos e em breve.
Adám
@ Adám me faria feliz!
Programmer5000
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);};

saída para 108,174,106:

0.3793104
0
0.3908046
0.3176471

Como o OP permite a função, enviei apenas o lambda. Você pode encontrar uma demonstração em execução no .NetFiddle . Eu não sou um jogador de golfe, eu posto por diversão. Além disso, é a minha primeira resposta \ o /. Sinta-se livre para comentar qualquer melhoria :)

Parabéns à Leaky Nun pela fórmula.

ressalva: não funciona por [0,0,0] (obrigado Titus)

aloisdg movendo-se para codidact.com
fonte
11
1.0-x/j? Você certamente não pode fazer 1-x/j?
Erik, o Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ sim eu posso! Foi um descanso de uma experiência. O objetivo era lançar automaticamente o dobro. Eu removo.
aloisdg movendo-se para codidact.com 30/06
11
Você não precisa disso para subtração de qualquer maneira. Além disso, você não parece reutilizá- a[3]lo e não especifica um tamanho fixo para a; portanto, pode fazê-lo {r,g,b}e a[3]=j*j(porque, de qualquer maneira 1 * a = a).
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Estou reutilizando acom o select(). Se eu usar a[3]assim, vou ficar fora de alcance e jogar, não é?
aloisdg movendo-se para codidact.com 30/06
11
Ótima primeira resposta e bem-vindo ao PPCG! Se você deseja exibir seu idioma e bytes em uma fonte maior, como as outras respostas (que geralmente é o padrão aqui), você pode adicionar um #na frente da linha. :)
Kevin Cruijssen
4

Python, 46 bytes

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

Requer entrada para flutuar no Python 2, com certeza não no 3.

Arfie
fonte
3

JavaScript (ES6), 58 51 bytes

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

Aceita uma matriz [R, G, B](adicione 7 bytes para parâmetros separados) e retorna uma matriz [C, M, Y, K]usando o mapeamento de cores não calibrado.

Neil
fonte
Tem certeza de que está com o pedido CYMK na sua segunda resposta? parece CMYK para mim.
Titus
2) Você sabe por que a difusão de amistura seu conteúdo? Isso é estranho. 3) Você testou [0,0,0]? Nenhuma exceção no ES, mas parece uma divisão por zero.
Titus
Desculpe, ambos eram CMY, a culpa foi minha. Agora também corrigimos os casos [0,0,0].
Neil
4) Experimente [...a,m=Math.max(...a)]sua solução de array. 5) Você pode jogar golfe com o outro usando uma matriz como entrada? Considere usar a.0etc. em vez de .map.
Titus
@ Titus Eu propus uma abordagem completamente nova agora, que realmente prefere a ordem CMYK e economiza 7 bytes também!
Neil
3

Mathematica, 36. 28. 33 bytes

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

Após a liberalização dos formatos de E / S, jogou golfe ainda mais: List@@#~ColorConvert~"CMYK"&

Função anônima, que faz o que é solicitado.

A função antiga recebe três argumentos de 0 a 255 (qualquer coisa além desse intervalo será cortada automaticamente para esse intervalo) e retorna uma matriz de valores "CMYK" entre 0.e1.

Exemplo (para função antiga):

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

Como matrizes são permitidas como entrada, 33 bytes:

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

É claro que as built-in alças função {0, 0, 0}correctamente e volta {0, 0, 0, 1}.

LLlAMnYP
fonte
1) Para esclarecer: os valores de entrada devem estar em [0; 255]. editará a pergunta em um minuto, 2) Teste [0,0,0]. 3) Não deveria ser /255?
Titus
@Titus você está certo, o 255, não pode resolver todos os problemas no momento, porém, eu vou consertar as coisas na primeira oportunidade
LLlAMnYP
@Titus corrigiu
LLlAMnYP 4/16/16
2

Bash + ImageMagick, 69 bytes

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

Exemplo:

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

Pode ser muito mais curto.

12Me21
fonte
Você quis escrever J=MAX(R,G,B)?
Andrakis
Sim obrigado.
12Me21
2

Pitão, 24 21 18 24 21 bytes

A vida é uma viagem de ida e volta.

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

Suíte de teste.

Entrada de amostra: 108,174,106

Saída de amostra: [0.3793103448275862, 0.0, 0.3908045977011494, 0.3176470588235294]

Entrada de amostra: 0,0,0

Saída de amostra: [0, 0, 0, 1.0]

Fórmula utilizada:

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

Fórmula antiga: http://i.stack.imgur.com/ZtPD6.gif

Fórmula antiga: http://i.stack.imgur.com/Nqi9F.gif

Freira Furada
fonte
bom golfe. cuidar de uma avaria?
Titus
2

Lit , 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))))

Experimente online!

  • 6 bytes salvos (esqueci que maxleva qualquer número de argumentos)

Não tenho certeza se isso está certo. Os dois primeiros resultados com os dados da amostra estão corretos, mas o restante não (consulte a seção Experimente online ).

Usa a implementação descrita bem da seguinte maneira:

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

Andrakis
fonte
1

PHP 7, 123 110 105 bytes

Entrada como cor 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]);

Emite valores CMYK como decimais no 0...1intervalo.

Economizou muitos bytes graças a Titus.

Uso da amostra:

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

Teste on-line


Entrada como cor HEX #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 para a função impedir a divisão por zero, provavelmente jogável ou removível.

Obtém a cor RGB de entrada como HEX #123456e gera CMYK como decimal no 0...1intervalo.

Uso da amostra:

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
fonte
separate numeric valuessignifica que você pode simplesmente pegar $h=$argv;e usar em $h[1]vez de $h[0]etc. Eu gosto do NANtruque; mas isso não gera avisos? strtrprovavelmente é menor que str_replacee NANnão precisa de cotação (produzirá avisos, mas eles não serão exibidos na configuração padrão).
Titus
Além disso, forneça a versão do PHP em que ele funciona. Não funciona no PHP 7 (onde 1/0resulta INF) nem no PHP 5 ( 1/0=> false).
Titus
@Titus Obrigado pela $argvdica de array muito interessante na linha de comando! Eu adicionei a versão PHP. Ele funciona NANporque, quando você o usa str_replace, converte implicitamente o número em string, para que ele saia NAN; na verdade, se você verificar neste link , verá que ele sai NANpor causa de, em str_replace("INF"vez de str_replace("NAN". Eu não poderia fazê-lo funcionar usandostrtr . Eu adicionei o @para suprimir os avisos.
1013 Mario Mario
Eu encontrei o meu erro: $n/0é INF, mas 0/0é NAN(também no PHP 7.0). Você pode salvar 4 bytes com str_replace(NAN,0,$s)ou 6 bytes comstrtr($s,["NAN"=>0) .
Titus
@ Titus muito obrigado, eu não conseguia descobrir como usar corretamente strtr();
1013 Mario Mario
1

PHP, não competindo

Eu estava muito tentado a postar o meu.

Entrada RGB, 74 bytes

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

ou 68 bytes com uma vírgula à direita na saída: remova [$i>3].

Corra com php -r '<code>' <red-value> <green-value> <blue-value>.

Entrada HEX, 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;  

Corra com php -nr '<code>' RRGGBB.

Essa abordagem levaria 75 bytes para a entrada RGB:
substitua foreach($a=array_map...as$c)por foreach($a=$argv as$c)if($i++).

Titus
fonte
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));}

Estou tentando descobrir como é possível jogar mais golfe.

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

Resultado:

0.379310
0.000000
0.390805
0.317647
Giacomo Garabello
fonte
1) +3: erro: a função deve retornar o resultado, não imprimi-lo. (desculpe, acabei de ver isso) 2) +4: erro: não foi declarado. 3) +0: erro: seus operadores ternários parecem desligados. não deveria ser isso #i>0?i>1?i>2
Titus
mas existe algum potencial de golfe; Encontrei -25 bytes em ANSI C e outro -19 em C99. 2 bytes estão aqui: j>0?17 em livrar-se do loop e 6 em dividir a jdefinição.
Titus
adicione outro +3 para a função: ele retorna algo diferente de int, portanto, um tipo de retorno é necessário ( F *). Mas encontrei outro byte para jogar golfe em C99.
Titus
@ Titus Se não me engano, j>0?j:1pode ser j+!jpara obter -3 bytes.
Albert Renshaw
E acho que a Cmacro está incorreta: 1-x/1para j==0? Eu acho que deveria ser 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)))

Use a biblioteca de ponto flutuante de precisão única. Crie uma nova função genérica que leva a. Defina spara subcurry com .1para mais tarde e jpara dobrar acom max.

Mapeie adividindo cada elemento com j, encontrando o mínimo disso e 1 para normalizar NaN e subtraindo 1 com s. Adicione 1-j/255ao final dessa lista.

> =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
fonte
Você pode fornecer um TiO, por favor.
Titus
@Titus: Hoon não tem um site de TiO, infelizmente.
RenderSettings