Od Rgb do Cmyk

9

Biorąc pod uwagę 3 bajty lub RGB jako dane wejściowe, oblicz najbliższe wartości CMYK i wyślij je.

  • utwórz funkcję z parametrami i wartością zwracaną lub program działający na stdin / stdout
  • użyj wybranego profilu kolorów, ale podaj odniesienie
  • dane wejściowe mogą być osobnymi wartościami liczbowymi z zakresu [0; 255] lub sześciocyfrowym łańcuchem szesnastkowym
  • dane wyjściowe powinny być osobnymi wartościami liczbowymi w zakresie od [0; 1] lub [0; 100]
  • standardowy kod golfowy: brak luk , wygrywa najkrótszy kod
  • ekstrawaganckie pomysły są mile widziane

przykładowe dane:

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
  • Nieskalibrowane mapowanie jest w porządku i prawdopodobnie najłatwiejsze
  • Nie wymaga sprawdzania poprawności danych wejściowych; liczby zmiennoprzecinkowe są dozwolone (od 0 do 255), ale mogą być również zaokrąglane
  • Format wyjściowy powinien być wyraźnie skomentowany lub oczywisty; to znaczy:
    1. CMYK w tej kolejności
    2. nie ma znaczenia, czy wartości procentowe [0; 100] czy czyste liczby [0; 1]
  • Testy powinny obejmować trywialny przykład [0,0,0].

Ta strona zawiera najwięcej cyfr narzędzi online, jakie udało mi się znaleźć. Czy ktoś zna narzędzie, które daje więcej niż 4 cyfry?

Tytus
źródło
4
Czy możesz podać jakieś przykładowe dane wejściowe / wyjściowe?
Kevin Cruijssen
8
@KevinCruijssen Po prostu uwaga, ale nie sądzę, że tak właśnie używasz ± ...
Leaky Nun
1
Witamy na stronie! To przyzwoite wyzwanie, ale trochę niejasne. Głosuję za zamknięciem jako niejasne, o co prosisz, ale jeśli wyjaśnisz algorytm do ich konwersji i podasz kilka przypadków testowych, wycofam swój głos.
James
2
@KevinCruijssen W sekcji przysłówka jest napisane: Republika Południowej Afryki . Nie jest to używane w standardowym języku angielskim. Używamy ~.
mbomb007
1
Wiadomość z bliska głosowania jest nieco myląca, ponieważ wywodzi się z naszych korzeni pytań i odpowiedzi, ale rzeczywiście „wstrzymano ją jako niejasne, o co pytasz”. W komentarzach pojawiło się kilka próśb o wyjaśnienie: konkretnie, czy dane wejściowe i wyjściowe w postaci liczb zmiennoprzecinkowych od 0 do 1 są dozwolone (lub czy muszą to być liczby całkowite od 0 do 255), jak faktycznie działa konwersja, i czy możesz dołączyć niektóre przypadki testowe.
Martin Ender

Odpowiedzi:

8

Dyalog APL , 16 15 bajtów

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

1 minus 1-
X podzielone przez ÷ Y , a następnie ,255 dzielące 255÷⍨ Y , gdzie
  X jest sobą (tj. Listą wartości RGB), a
  Y jest wartością maksymalną /⌈(wartości RGB).

{J=mzax(R,sol,b)do=1-RjotM.=1-soljotY=1-bjotK.=1-jot255

TryAPL!

Kredyty:
 ∘ -1 bajt przez ngn .

Adám
źródło
Kiedy PPCG otrzymuje MathJax?
Neil
+1 za ! Ładny emotikon
programista
1
@ programmer5000 Dziękujemy. Znajdziesz go w prawie wszystkich moich golfach. Zamienia argumenty funkcji po lewej stronie. Inne emotikony APL to i . Mam nadzieję, że dostaniemy i wkrótce.
Adám
@ Adám byłby szczęśliwy!
programista
8

C # , 88 86 85 84 bajtów

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

wyjście dla 108,174,106:

0.3793104
0
0.3908046
0.3176471

Ponieważ OP pozwala na funkcję, przesłałem tylko lambda. Uruchomione demo można znaleźć na .NetFiddle . Nie jestem golfistą, zamieszczam posty dla zabawy. Jest to także moja pierwsza odpowiedź \ o /. Skomentuj wszelkie ulepszenia :)

Wyrazy uznania dla Dziurawej Zakonnicy za wzór.

zastrzeżenie: nie działa dla [0,0,0] (dziękuję Tytusowi)

aloisdg przechodzi na codidact.com
źródło
1
1.0-x/j? Na pewno nie możesz tego zrobić 1-x/j?
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ tak, mogę! To był odpoczynek od doświadczenia. Celem było automatyczne rzucenie podwójnej. Usuwam to.
aloisdg przechodzi na codidact.com
1
I tak nie potrzebujesz go do odejmowania. Ponadto nie wydaje się, aby ponownie używać a[3]i nie określasz ustalonego rozmiaru dla a, więc możesz to zrobić {r,g,b}i a[3]=j*j(ponieważ, w każdym razie, 1 * a = a).
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Korzystam ponownie az select(). Jeśli a[3]użyję w ten sposób, będę poza zasięgiem i rzucił, prawda?
aloisdg przechodzi na codidact.com
1
Świetna pierwsza odpowiedź i witamy w PPCG! Jeśli chcesz wyświetlać swój język i bajty większą czcionką, tak jak inne odpowiedzi (co zwykle jest tutaj standardem), możesz dodać znak #przed wierszem. :)
Kevin Cruijssen
4

Python, 46 bajtów

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

Wymaga, aby dane wejściowe były zmienne w Pythonie 2, dość pewne, że nie w 3.

Arfie
źródło
3

JavaScript (ES6), 58 51 bajtów

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

Akceptuje tablicę [R, G, B](dodaj 7 bajtów dla oddzielnych parametrów) i zwraca tablicę [C, M, Y, K]za pomocą nieskalibrowanego odwzorowania kolorów.

Neil
źródło
Czy na pewno masz zamówienie CYMK na drugą odpowiedź? dla mnie wygląda jak CMYK.
Tytus
2) Czy wiesz, dlaczego rozprzestrzenianie się amiksuje zawartość? To dziwne. 3) Czy testowałeś [0,0,0]? Nie ma wyjątku w ES, ale wygląda jak dzielenie przez zero.
Tytus
Przepraszam, oboje byli CMY, to była moja wina. Teraz naprawiono także przypadki [0,0,0].
Neil
4) Wypróbuj [...a,m=Math.max(...a)]swoje rozwiązanie macierzowe. 5) Czy możesz zagrać w golfa przy użyciu tablicy jako danych wejściowych? Rozważ użycie a.0itp. Zamiast .map.
Tytus
@ Titus Wymyśliłem teraz zupełnie nowe podejście, które faktycznie preferuje kolejność CMYK i oszczędza 7 bajtów!
Neil
3

Matematyka, 36 28 33 bajty

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

Po liberalizacji formatów I / O grał w golfa: List@@#~ColorConvert~"CMYK"&

Funkcja anonimowa, która wykonuje to, o co prosi.

Stara funkcja przyjmuje trzy argumenty od 0 do 255 (wszystko poza tym zakresem zostanie automatycznie przycięte do tego zakresu) i zwraca tablicę wartości „CMYK” pomiędzy 0.a1.

Przykład (dla starej funkcji):

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

Ponieważ tablice są dozwolone jako dane wejściowe, 33 bajty:

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

Oczywiście te wbudowane w uchwyty funkcja {0, 0, 0}działa poprawnie i powraca {0, 0, 0, 1}.

LLAMAMYP
źródło
1) Aby wyjaśnić: wartości wejściowe muszą być w [0; 255]. edytuje pytanie za minutę, 2) Proszę przetestować [0,0,0]. 3) Czy nie powinno tak być /255?
Tytus
@Titus masz rację, jego liczba 255 nie jest w tej chwili w stanie rozwiązać wszystkich problemów, naprawię to jak najszybciej
LLlAMnYP
@Titus to naprawił
LLlAMnYP
2

Bash + ImageMagick, 69 bajtów

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

Przykład:

$ ./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
źródło
2

SmileBASIC, 73 72 bajty

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

Może być znacznie krótszy.

12Me21
źródło
Miałeś na myśli pisać J=MAX(R,G,B)?
Andrakis,
Tak dziękuję.
maja 21
2

Pyth, 24 21 18 24 21 bajtów

Życie to rzeczywiście podróż w obie strony.

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

Zestaw testowy.

Przykładowe dane wejściowe: 108,174,106

Przykładowe dane wyjściowe: [0.3793103448275862, 0.0, 0.3908045977011494, 0.3176470588235294]

Przykładowe dane wejściowe: 0,0,0

Przykładowe dane wyjściowe: [0, 0, 0, 1.0]

Zastosowana formuła:

{jot=mzax(R,sol,b)do=1-RjotM.=1-soljotY=1-bjotK.=1-jot255

Stara formuła: http://i.stack.imgur.com/ZtPD6.gif

Stara formuła: http://i.stack.imgur.com/Nqi9F.gif

Leaky Nun
źródło
niezła gra w golfa. masz ochotę na awarię?
Tytus
2

Lithp , 114 bajtów

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

Wypróbuj online!

  • Zapisano 6 bajtów (zapomniałem, że maxbierze dowolną liczbę argumentów)

Nie jestem pewien, czy to prawda. Pierwsze dwa wyniki z przykładowymi danymi są poprawne, ale pozostałe nie są (zobacz Wypróbuj online ).

Korzysta z implementacji opisanej poniżej:

{jot=mzax(R,sol,b)do=1-RjotM.=1-soljotY=1-bjotK.=1-jot255

Andrakis
źródło
1

PHP 7, 123 110 105 bajtów

Wprowadź jako kolor 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]);

Wyświetla wartości CMYK jako dziesiętne w 0...1zakresie.

Zaoszczędził wiele bajtów dzięki Titusowi.

Przykładowe użycie:

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

Przetestuj online


Wprowadź jako kolor HEX #123456, 202 bajty

$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 bajty dla funkcji zapobiegającej dzieleniu przez zero, prawdopodobnie grywalnej lub usuwalnej.

Pobiera wejściowy kolor RGB jako HEX #123456i wysyła CMYK jako dziesiętny w 0...1zakresie.

Przykładowe użycie:

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
źródło
separate numeric valuesoznacza, że ​​możesz po prostu wziąć $h=$argv;i używać $h[1]zamiast $h[0]itp. Lubię NANpodstęp; ale czy to nie daje ostrzeżeń? strtrjest prawdopodobnie krótszy niż str_replacei NANnie wymaga notowania (przyniesie Powiadomienia, ale nie są wyświetlane w domyślnej konfiguracji).
Tytus
Proszę również podać wersję PHP, w której działa. Nie działa w PHP 7 (gdzie 1/0wyniki INF), ani w PHP 5 ( 1/0=> false).
Tytus
@Titus Dzięki za bardzo interesującą $argvwskazówkę tablicy w wierszu poleceń! Dodałem wersję PHP. Działa z, NANponieważ gdy str_replacego użyjesz , niejawnie konwertuje liczbę na ciąg znaków, więc wyświetla dane wyjściowe NAN, w rzeczywistości, jeśli sprawdzisz to łącze , zobaczysz, że wyświetla dane wyjściowe z NANpowodu str_replace("INF"zamiast str_replace("NAN". Nie mogłem sprawić, żeby działało strtr. Dodałem, @aby ukryć ostrzeżenia.
Mario,
Znalazłem swój błąd: $n/0 jest INF, ale 0/0jest NAN(także w PHP 7.0). Możesz zapisać 4 bajty z str_replace(NAN,0,$s)lub 6 bajtów z strtr($s,["NAN"=>0).
Tytus
@Titus wielkie dzięki, nie mogłem wymyślić, jak prawidłowo używać strtr();
Mario,
1

PHP, nie konkuruje

Byłem zbyt kuszony, aby opublikować własne.

Wejście RGB, 74 bajty

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

lub 68 bajtów z końcowym przecinkiem na wyjściu: usuń [$i>3].

Uruchom z php -r '<code>' <red-value> <green-value> <blue-value>.

Wejście HEX, 100 bajtów

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

Uruchom z php -nr '<code>' RRGGBB.

Podejście to zajmie 75 bajtów dla wejścia RGB:
zamienić foreach($a=array_map...as$c)z foreach($a=$argv as$c)if($i++).

Tytus
źródło
0

C, 155 bajtów

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

Próbuję dowiedzieć się, w jaki sposób golf jest bardziej możliwy.

Stosowanie:

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

Wynik:

0.379310
0.000000
0.390805
0.317647
Giacomo Garabello
źródło
1) +3: błąd: funkcja powinna zwrócić wynik, a nie go wydrukować. (przepraszam, właśnie to zobaczyłem) 2) +4: błąd: nie został zadeklarowany. 3) +0: błąd: operatory trójskładnikowe wydają się wyłączone. nie powinno tak byći>0?i>1?i>2
Tytus
ale istnieje pewien potencjał golfowy; Znalazłem -25 bajtów w ANSI C, a kolejne -19 w C99. Są tu 2 bajty: j>0?17 w usuwaniu pętli i 6 w dzieleniu jdefinicji.
Tytus
dodaj kolejne +3 dla funkcji: zwraca coś innego niż int, więc wymagany jest typ zwracany ( F *). Ale w C99 znalazłem kolejny bajt do gry w golfa.
Titus
@Titus Jeśli się nie mylę, j>0?j:1można j+!josiągnąć -3 bajty.
Albert Renshaw
I myślę, że Cmakro jest niepoprawne: 1-x/1dla j==0? Myślę, że tak powinno być 1-(j>0?x/j:1).
Tytus
0

Hoon , 110 bajtów

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

Użyj biblioteki zmiennoprzecinkowej pojedynczej precyzji. Utwórz nową funkcję ogólną, która zajmie a. Ustaw sna subcurry z .1na później, a jna zagięciu az max.

Odwzoruj a, dzieląc każdy element j, znajdując minimum tego i 1, aby znormalizować NaN, a następnie odejmij 1 za pomocą s. Dodaj 1-j/255na końcu tej listy.

> =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
źródło
Czy możesz podać TiO?
Tytus
@Titus: Hoon niestety nie ma strony TiO.
RenderSettings