매쓰 207 242 500-250 = 250 바이트
업데이트 :
이것은 RGB 트리플, 색 이름 또는 16 진수로 구성된 입력에서 작동합니다.
(12 비트) 색상 심도 출력은 이제 색상 비트 심도 감소 에 대한 훌륭한 기사 덕분에 잘 작동합니다 . 기본 아이디어는 RGB 3 배 {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 트리플로 바꾸는 규칙이 있습니다. 예를 들어 하나의 규칙은
"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", "Red", "Teal", "# 8b0000", "#fff", "# 483d8b", "#fffffe", "# f5f"}
z /@ {"Red", "DarkSlateBlue", "Teal", "Black"}
{ "빨간색", "# 483c8b", "제목", "# 000"}
z /@ {"#000", "#f00", "#008080", "#8b0000", "#fff", "#483d8b", "#fffffe", "#f5f"}
{ "# 000", "Red", "Teal", "# 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)