Mathematicaの207 242 500から250 = 250バイト
更新:
これは、RGBトリプル、色名、または16進数で構成される入力で機能します。
(12ビット)色深度出力は今、上の素晴らしい記事のおかげで罰金を作品色ビット深度削減を。基本的な考え方は、RGBトリプル{r、g、b}で、r、g、bが0〜255の範囲(つまり、16進数00〜ff)の場合、損失なしで数値として表現できるということです。 0〜15(つまり0〜f)の範囲で、6桁の数字の代わりに3桁の16進数を使用できます。これは、17(つまり255/15)がr、g、およびbを分割するたびに発生します。
組み込み関数のみが使用されます。Mathematicaには、HTMLカラー名をRGBトリプルに置き換えるためのルールがあります。たとえば、1つのルールは
"Teal"-> RGBColor[0, 128, 128]
です。このようなルールが逆になっている場合、rgb値(範囲に再調整、{0、255})を色名に置き換えることができます。
q=ColorData["HTML","ColorRules"];
j=q/.{(c_ -> RGBColor[r_,g_,b_]):> (Floor[255{r,g,b}]-> c)};
k=Reverse/@j;
v@l_:=And@@IntegerQ/@(l/17);
y@l_:=If[v@l,l/17,l];
h@l_:="#"<>(IntegerString[#,16,If[v@l,1,2]]&/@y@l)
o@h_:=Module[{c=(StringLength[h1=StringDrop[h,1]]==6)},FromDigits[#,16]&/@StringPartition[h1,If[c,2,1]]*If[c,1,17]]
u@l_:=ToString[l/.j]
m@s_:=s/.q/.RGBColor[r_,g_,b_]:>Floor[255{r,g,b}]
f@n_:=SortBy[{u@n,h@n},StringLength][[1]]
z@d_:= (If[StringQ@d,If[StringTake[d,1]=="#",e=o@d,e=m@d],e=d];f@e)
例
z /@ {{0, 0, 0}, {255, 0, 0}, {0, 128, 128}, {139, 0, 0}, {255, 255,
255}, {72, 61, 139}, {255, 255, 254}, {255, 85, 255}}
{「#000」、「赤」、「ティール」、「#8b0000」、「#fff」、「#483d8b」、「#fffffe」、「#f5f」}
z /@ {"Red", "DarkSlateBlue", "Teal", "Black"}
{「赤」、「#483c8b」、「ティール」、「#000」}
z /@ {"#000", "#f00", "#008080", "#8b0000", "#fff", "#483d8b", "#fffffe", "#f5f"}
{「#000」、「赤」、「ティール」、「#8b0000」、「#fff」、「#483d8b」、「#fffffe」、\「#f5f」}
コメント、未ゴルフコード
(*色名を色見本に置き換えるためのルール。たとえば RGBColor{255,17,0}
q=ColorData["HTML","ColorRules"];
(* 3つの整数のリストをそれぞれの色名(存在する場合)に置き換える規則。同じ規則を逆にします。*)
rulesListsToColorNames=(q)/.{(c_ -> RGBColor[r_,g_,b_]):> (Floor[255{r,g,b}]-> c)};
rulesColorsToLists=Reverse/@rulesListsToColorNames;
(* 24ビットの16進数の色が、損失なく12ビットの色として表現できるかどうかをテストしますreduce
。24ビットの式を12ビットの式に変更できます。*)
depthReducible[l_List]:=And@@IntegerQ/@(l/17);
reduce[l_List]:=If[depthReducible@l,l/17,l];
(* RGBリストは16進数に変更*)
fromListToHex[l_List]:="#"<>(IntegerString[#,16,If[depthReducible@l,1,2]]&/@reduce[l])
(* 16進数がRGBリストに変更されました。*)
fromHexToList[h_String]:=Module[{c=(StringLength[h1=StringDrop[h,1]]==6)},
FromDigits[#,16]&/@StringPartition[h1,If[c,2,1]]*If[c,1,17]
]
(*その他の変換*)
fromListToColorName[l_List]:=ToString[l/.rulesListsToColorNames]
fromColorNameToHex[s_String]:=fromListToHex[s/.rulesColorsToLists]
fromColorNameToList[s_String]:=s/.q/.RGBColor[r_,g_,b_]:>Floor[255{r,g,b}]
(*色の最も短い有効なCSS式を選択*)
f@n_List:=SortBy[{fromListToColorName[n],fromListToHex[n]},StringLength][[1]]
(*入力をRGBリストに変換し、f
* を呼び出します)
returnShortestColor[d_]:=
(If[StringQ[d],
If[StringTake[d,1]=="#",
e=fromHexToList@d,
e=fromColorNameToList@d],
e=d];
f@e)