Rgb에서 Cmyk로


9

입력으로 3 바이트 또는 RGB가 주어지면 가장 가까운 CMYK 값을 계산하여 출력하십시오.

  • 매개 변수 및 리턴 값이있는 함수 또는 stdin / stdout에서 작동하는 프로그램 작성
  • 선택한 색상 프로파일을 사용하지만 참조를 제공하십시오.
  • 입력 범위는 [0; 255] 범위의 개별 숫자 값이거나 6 자리 16 진 문자열입니다.
  • 출력은 [0; 1] 또는 [0; 100] 범위의 개별 숫자 값이어야합니다.
  • 표준 코드 골프 : 허점 없음 , 최단 코드 승
  • 사치스러운 아이디어는 환영합니다

샘플 데이터 :

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
  • 교정되지 않은 매핑은 좋으며 아마도 가장 쉬운 방법 일 것입니다
  • 입력 검증이 필요하지 않습니다. float는 허용되지만 (0에서 255까지) 반올림 될 수도 있습니다.
  • 출력 형식은 명확하게 주석을 달거나 명백해야합니다. 즉 :
    1. 순서대로 CMYK
    2. 백분율 [0; 100] 또는 순수한 숫자 [0; 1]이면 중요하지 않습니다
  • 테스트에는 간단한 예 [0,0,0]이 포함되어야합니다.

이 사이트 에는 내가 찾을 수있는 가장 많은 온라인 도구가 있습니다. 누구나 4 자리 이상을 제공하는 도구를 알고 있습니까?


4
입력 / 출력의 예를 들어 주시겠습니까?
Kevin Cruijssen

8
@KevinCruijssen 그냥 참고하지만, 그것이 당신이 ±를 사용하는 방법이라고 생각하지 않습니다 ...
Leaky Nun

1
사이트에 오신 것을 환영합니다! 이것은 괜찮은 도전이지만 조금 불분명합니다. 나는 당신이 요구하는 바를 불명확하게 마무리하기 위해 투표하고 있지만, 알고리즘을 변환하고 테스트 사례를 제공하는 알고리즘을 설명하면 투표를 철회 할 것입니다.
James

2
@KevinCruijssen 부사 섹션에서 남아프리카 라고 합니다. 표준 영어에서는 그런 식으로 사용되지 않습니다. 우리는 사용 ~합니다.
mbomb007

1
마감 투표 메시지는 Google의 Q & A 근본에서 비롯 되었기 때문에 약간 오해의 소지가 있지만 실제로는 "요청한 내용이 명확하지 않은 경우 보류"되었습니다. 해결되지 않은 의견에는 몇 가지 설명 요청이있었습니다. 특히 0과 1 사이의 부동 소수점으로 입력 및 출력이 허용되는지 (또는 0에서 255 사이의 정수 여야 함), 변환이 실제로 작동하는 방식, 테스트 사례를 포함 할 수 있는지 여부
Martin Ender

답변:


8

Dyalog APL , 16 15 바이트

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

1 빼기 1-
X÷ Y 로 나눈 다음 ,255를 255÷⍨ Y로 나눕니다 . 여기서
  X 는 자체 (RGB 값 목록)이고
  Y 는 최대 값 /⌈(RGB 값)입니다.

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

TryAPL!

크레딧 :
 ∘ -1 바이트, ngn .


PPCG는 언제 MathJax를 받고 있습니까?
Neil


+1 ! 멋진 이모티콘
프로그래머

1
@ programmer5000 감사합니다. 거의 모든 코드 골에서 그 것을 찾을 수 있습니다. 함수의 인수를 왼쪽으로 바꿉니다. 다른 APL 이모티콘은 입니다. 나는 우리가 얻을 바랍니다 그리고 곧.
Adám

@ Adám 은 나를 행복하게 만들 것입니다!
programmer5000

8

C # , 88 86 85 84 바이트

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

에 대한 출력 108,174,106:

0.3793104
0
0.3908046
0.3176471

OP는 기능을 허용하므로 람다 만 제출했습니다. .NetFiddle 에서 실행중인 데모를 찾을 수 있습니다 . 나는 골퍼가 아니며 재미를 위해 게시합니다. 또한 내 첫 번째 대답은 \ o /입니다. 개선 사항을 말씀해 주시기 바랍니다 :)

공식을 위해 Leaks Nun에 Kudos.

경고 : [0,0,0]에서는 작동하지 않습니다 (Titus에게 감사합니다)


1
1.0-x/j? 당신은 확실히 할 수 1-x/j없습니까?
Outgolfer Erik

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ 그래 난 할 수있어! 그것은 경험으로부터의 휴식이었다. 목표는 자동 캐스트를 두 배로하는 것이 었습니다. 제거합니다.
aloisdg codidact.com으로 이전

1
어쨌든 빼기에는 필요하지 않습니다. 또한, 당신은 다시 사용하지 않는 것 a[3], 그리고 당신에 대한 고정 된 크기를 지정하지 않는 것 a당신이 할 수 있도록 {r,g,b}하고 a[3]=j*j(때문에 어쨌든, 1 * a = a).
아웃 골퍼 에릭

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ 나는와 a함께 재사용 하고 select()있습니다. 이렇게 사용하면 a[3]범위를 벗어나 던질 것입니다.
aloisdg codidact.com으로 이전

1
PPCG에 오신 것을 환영합니다. 다른 답변과 같은 더 큰 글꼴로 언어와 바이트를 표시하려면 (일반적으로 여기에 표준 임) #줄 앞에를 추가하십시오 . :)
Kevin Cruijssen 2016 년

4

파이썬, 46 바이트

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

파이썬 2에서는 입력이 부동이어야하며, 3이 아닌 것이 확실합니다.


3

자바 스크립트 (ES6), 58 51 바이트

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

배열을 수락하고 [R, G, B](별도의 매개 변수에 7 바이트 추가) [C, M, Y, K]보정되지 않은 색상 매핑을 사용하여 배열 을 반환합니다 .


두 번째 답변에서 CYMK 주문을 하시겠습니까? 나에게 CMYK처럼 보인다.
Titus

2) 왜 a믹스가 내용 을 혼합 하는지 알고 있습니까? 이상하다. 3) [0,0,0]을 테스트 했습니까? ES에서도 예외는 아니지만 0으로 나누는 것처럼 보입니다.
Titus

죄송합니다. 둘 다 CMY였습니다. 그건 내 잘못이었습니다. 이제 [0,0,0] 경우도 수정했습니다.
Neil

4) [...a,m=Math.max(...a)]어레이 솔루션을 사용해보십시오 . 5) 배열을 입력으로 사용하여 다른 골프를 더 할 수 있습니까? 사용을 고려 a.0하는 대신 등 .map.
Titus

@Titus 나는 CMYK 순서를 실제로 선호하고 7 바이트도 절약하는 완전히 새로운 접근법을 생각해 냈습니다!
Neil

3

수학, 36 28 33 바이트

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

I / O 형식의 자유화 후 추가로 골프를 쳤다 : List@@#~ColorConvert~"CMYK"&

익명 함수는 요청 된 작업을 수행합니다.

이전 기능 (255)로 0 내지 세 개의 인자를 (이 벗어난 것도 자동 범위에 클리핑된다) 간의 "CMYK"값의 배열을 반환 0.하고1.

예 (이전 기능의 경우) :

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

배열은 입력으로 허용되므로 33 바이트 :

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

물론 내장 기능 핸들 {0, 0, 0}이 제대로 돌아갑니다 {0, 0, 0, 1}.


1) 명확히하기 위해 : 입력 값은 [0; 255]에 있어야합니다. 잠시 후 질문을 수정합니다. 2) [0,0,0]을 테스트하십시오. 3) 그렇게해서는 안 /255됩니까?
Titus

당신 @Titus 맞아요, 그 255, 나는 빠른 시일 가지 문제를 해결합니다,하지만 순간에 모든 문제를 해결할 수 없습니다
LLlAMnYP

@Titus가 수정 함
LLlAMnYP

2

Bash + ImageMagick, 69 바이트

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

예:

$ ./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 바이트

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

훨씬 짧을 수 있습니다.


쓰려고 J=MAX(R,G,B)하셨나요?
Andrakis

네 감사합니다.
12Me21

2

Pyth, 24 21 18 24 21 바이트

인생은 실제로 왕복 여행입니다.

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

테스트 스위트.

샘플 입력 : 108,174,106

샘플 출력 : [0.3793103448275862, 0.0, 0.3908045977011494, 0.3176470588235294]

샘플 입력 : 0,0,0

샘플 출력 : [0, 0, 0, 1.0]

사용 된 공식 :

{제이=미디엄엑스(아르 자형,,)=1아르 자형제이미디엄=1제이와이=1제이케이=1제이255

이전 공식 : http://i.stack.imgur.com/ZtPD6.gif

이전 공식 : http://i.stack.imgur.com/Nqi9F.gif


좋은 골프. 고장을 관리?
Titus

2

Lithp , 114 바이트

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

온라인으로 사용해보십시오!

  • 6 바이트를 절약했습니다 ( max인수를 잊어 버렸습니다 )

나는 이것이 옳지 않다. 샘플 데이터의 처음 두 결과는 정확하지만 나머지는 정확하지 않습니다 ( 온라인으로 시도 참조 ).

다음과 같이 잘 설명 된 구현을 사용합니다.

{제이=미디엄엑스(아르 자형,,)=1아르 자형제이미디엄=1제이와이=1제이케이=1제이255


1

PHP 7 123 110 105 바이트

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

0...1범위의 10 진수로 CMYK 값을 출력 합니다.

Titus 덕분에 많은 바이트를 절약했습니다.

샘플 사용법 :

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

온라인 테스트


16 진수 색상으로 입력 #123456, 202 바이트

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

골프 또는 분리 가능한 0으로 나누기를 방지하는 기능을위한 54 바이트.

입력 RGB 색상을 HEX로 가져 #123456오고 CMYK를 10 진수 0...1범위 로 출력 합니다.

샘플 사용법 :

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 values등 대신에 가져 가서 $h=$argv;사용할 수 있음을 의미합니다 . 하지만 경고가 발생하지 않습니까? 보다 아마 짧은 , 그리고 더 qotation을 필요로하지 않는다 (주의 사항을 얻을 것입니다, 그러나 그는 기본 설정에 표시되지 않습니다). $h[1]$h[0]NANstrtrstr_replaceNAN
Titus

또한 작동하는 PHP 버전을 제공하십시오. PHP 7 ( 1/0결과는 INF) 또는 PHP 5 ( 1/0=> false)에는 없습니다.
Titus

@Titus $argv커맨드 라인에서 매우 흥미로운 배열 팁에 감사드립니다 ! PHP 버전을 추가했습니다. 그것은 작동 NAN사용할 때 때문에 str_replace이 출력 있도록 암시 적으로 문자열로 숫자를 변환 NAN당신이에서 확인하면 사실, 이 링크 , 당신은 출력 것을 볼 수 NAN있기 때문에의 str_replace("INF"대신 str_replace("NAN". 을 사용하여 작동시킬 수 없습니다 strtr. @경고를 억제하기 위해를 추가했습니다 .
마리오

내 실수 : $n/0is INF이지만 0/0is NAN(PHP 7.0에서도)를 발견했습니다. 을 사용하여 4 바이트 str_replace(NAN,0,$s)또는을 사용하여 6 바이트를 저장할 수 있습니다 strtr($s,["NAN"=>0).
Titus

@Titus 감사합니다 strtr(). 제대로 사용하는 방법을 알 수 없었습니다 .
Mario

1

경쟁하지 않는 PHP

나는 내 자신의 글을 게시하기를 너무 유혹했다.

RGB 입력, 74 바이트

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

또는 출력에 후행 쉼표가있는 68 바이트 : remove [$i>3].

로 실행하십시오 php -r '<code>' <red-value> <green-value> <blue-value>.

16 진수 입력, 100 바이트

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

로 실행하십시오 php -nr '<code>' RRGGBB.

그 접근 방식은 RGB 입력을 75 바이트를 걸릴 것 :
교체 foreach($a=array_map...as$c)와 함께 foreach($a=$argv as$c)if($i++).


0

C, 155 바이트

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

골프가 어떻게 가능한지 알아 내려고 노력 중입니다.

용법:

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

산출:

0.379310
0.000000
0.390805
0.317647

1) +3 : 실수 : 함수가 결과를 반환해야하며 인쇄하지 않아야합니다. (죄송합니다) 2) +4 : 오류 : i가 선언되지 않았습니다. 3) +0 : 오류 : 삼항 연산자가 꺼져있는 것 같습니다. 해서는 안됩니다i>0?i>1?i>2
Titus

그러나 골프 잠재력이있다. ANSI C에서 -25 바이트를, C99에서 또 다른 -19를 찾았습니다. 2 바이트가 있습니다 : j>0?, 17은 루프를 제거하고 6은 j정의 를 분할합니다 .
Titus

함수에 다른 +3을 추가하십시오 : int 이외의 것을 반환하므로 반환 유형이 필요합니다 ( F *). 그러나 C99에서 골프를 치를 다른 바이트를 발견했습니다.
Titus

@Titus 내가 실수하지 않으면 -3 바이트를 얻을 j>0?j:1수 있습니다 j+!j.
Albert Renshaw

그리고 내가 생각하는 C매크로가 올바르지 않습니다 1-x/1에 대한 j==0? 나는 그렇게 생각합니다 1-(j>0?x/j:1).
Titus

0

110 바이트

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

단 정밀도 부동 소수점 라이브러리를 사용하십시오. 를 사용하는 새로운 일반 함수를 만듭니다 a. 설정 ssub와 카레 .1, 이후에 j접혀에 amax.

a각 요소 를 로 나누고 j그 최소값을 찾은 다음 NaN을 정규화하려면 1을 구한 다음 1을 빼십시오 s. 1-j/255해당 목록의 끝에 추가 하십시오.

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

TiO를 제공 할 수 있습니까?
디도

@Titus : Hoon은 불행히도 TiO 사이트가 없습니다.
RenderSettings
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.