数学207 242 500-250 = 250字节
更新:
这适用于由rgb三元组,颜色名称或十六进制数字组成的输入。
(12位)色彩深度输出现在可以正常工作,这要归功于有关降低色彩位深度的出色文章。基本思想是,如果RGB三元组{r,g,b}(其中r,g和b在0-255的范围内)(即十六进制00-ff)可以表示为范围是0-15(即0-f),则可以使用3位数的十六进制数字代替6位数的数字。事实证明,只要17(即255/15)除以r,g和b,就会发生这种情况。
仅使用内置功能。Mathematica具有使用RGB三元组替换HTML颜色名称的规则。例如,一个规则是
"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位十六进制颜色是否可以无损地表示为12位颜色。reduce
可以将24位表达式更改为12位表达式。*)
depthReducible[l_List]:=And@@IntegerQ/@(l/17);
reduce[l_List]:=If[depthReducible@l,l/17,l];
(* RGB列表已更改为十六进制数*)
fromListToHex[l_List]:="#"<>(IntegerString[#,16,If[depthReducible@l,1,2]]&/@reduce[l])
(*十六进制数已更改为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)