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?


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 .


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)


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.


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.


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}.


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

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.


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


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


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

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++).


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

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

Czy możesz podać TiO?
— Tytus

@Titus: Hoon niestety nie ma strony TiO.
— RenderSettings
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.