CSS Color Golf!

25

Вы веб-разработчик, и ваш начальник решил обновить веб-сайт компании. Он решил, что чем меньше цвет, тем лучше, но он хочет, чтобы сайт выглядел одинаково. Вы справедливо решаете, что он понятия не имеет, о чем говорит, но вы все равно попробуете, потому что вам скучно. Поскольку у компании есть тысячи веб-страниц, и у каждого из них есть свой собственный CSS, вы решаете написать скрипт для внесения необходимых изменений. Разбор HTML не требуется.

Все страницы в настоящее время используют строку, как rgb(255,0,0)для цвета. Учитывая три десятичных значений , представляющих значения RGB атрибута CSS цвета (в таком порядке), возврат или печать кратчайшего строкового представления этого цвета, таким образом, что это полезное для CSS вот так: color:<your-result-here>;.

Вот полная таблица допустимых CSS Color Keywords . Они не чувствительны к регистру.

Примеры:

Обратите внимание, что цвета могут быть определены с 12 или 24 битами. Шаблон #ABCявляется более короткой версией #AABBCC. Чак Норрис это цвет .

Ваша программа будет принимать только 3 целых числа, а не строку (за исключением «бонуса», упомянутого ниже).

0, 0, 0         ->  #000        (same as #000000, but shorter)
255, 0, 0       ->  red
0, 128, 128     ->  TEAL
139, 0, 0       ->  DarkRed     (OR #8B0000)
72, 61, 139     ->  #483D8B
255, 255, 254   ->  #fffffe
255, 85, 255    ->  #f5f        (same as #ff55ff, but shorter)

Скоринг / Правила

  • Самый короткий код выигрывает!
  • Стандартные лазейки запрещены , за исключением встроенных модулей.
  • -50% байт (бонус округляется в меньшую сторону), если вы принимаете любой * действительный селектор цвета и выводите самый короткий. Так DarkSlateBlueбы выход #483D8B, #F00выходы redи т. Д.
    • * Это включает только RGB, шестнадцатеричные коды и имена.
    • Обратите внимание, что некоторые цвета имеют альтернативные имена из-за X11 (как Fuchsiaи Magenta, или или Cyanи Aqua). Альтернативные имена включены в связанный список CSS Color Keywords согласно стандарту W3.
  • CSS3 завершен по Тьюрингу . Это стоило бы награды.

Редактировать:

  • ПОЖАЛУЙСТА, ЗАПУСТИТЕ СВОЙ КОД ПО ИСПЫТАНИЯМ!
mbomb007
источник
Вот связанный вопрос: codegolf.stackexchange.com/questions/13132/color-rgb-int-to-hex
mbomb007
Должен ли ответ, желающий получить бонус -50%, проанализировать hsl (...)? Что насчет rgba (...) и hsla (...)? :)
Тимви
Согласно этой ссылке на цвета в CSS, Белый # 000000. Как ты придумал #000? И если разрешено менее 6 цифр, почему бы и нет #0? w3schools.com/cssref/css_colors.asp , CSS
DavidC
2
@DavidCarraher См stackoverflow.com/q/8318911/791604 для объяснения в глубину. Я подозреваю , что многие ответы здесь фактически не выводя минимальные цвета , идущие от гибкого применения имеющихся в браузерах (но которые выводят минимальные цвета , идущие по спецификации , приведенной в вопросе здесь).
Даниэль Вагнер

Ответы:

5

Perl, 212 - 50% = 106 байт

use aliased Graphics::ColorNames,G;sub c{tie%c,G,CSS;$_=pop;$c={reverse%c}->{$_=sprintf'%02x'x(@0=/(\d+, ?)((?1))(\d+)/)||$c{s/#(.)(.)(.)$|#/\1\1\2\2\3\3/r},@0};s/(.)\1(.)\2(.)\3|/#\1\2\3/;y///c>length$c&&$c||$_}

С добавлением новых строк:

use aliased Graphics::ColorNames,G;
sub c{
  tie%c,G,CSS;$_=pop;
  $c={reverse%c}->{
    $_=sprintf'%02x'x(@0=/(\d+, ?)((?1))(\d+)/)||$c{s/#(.)(.)(.)$|#/\1\1\2\2\3\3/r},@0
  };
  s/(.)\1(.)\2(.)\3|/#\1\2\3/;
  y///c>length$c&&$c||$_
}

Тестовые случаи

use feature say;

say c '#f00';
say c '#FF0000';
say c '#112233';
say c '#f0ffff';
say c 'azure';
say c 'DARKSLATEBLUE';
say c 'rgb(255, 127, 80)';
say c 'rgb(255, 255, 254)';
say c 'rgb(255,228,196)';

Выход

red
red
#123
azure
azure
#483d8b
coral
#fffffe
bisque

Perl, без бонуса, 144 байта

use aliased Graphics::ColorNames,G;sub c{tie%c,G,CSS;$c={reverse%c}->{$_=sprintf'%02x'x3,@_};s/(.)\1(.)\2(.)\3|/#\1\2\3/;y///c>length$c&&$c||$_}

С добавлением новых строк:

use aliased Graphics::ColorNames,G;
sub c{
  tie%c,G,CSS;
  $c={reverse%c}->{
    $_=sprintf'%02x'x3,@_
  };
  s/(.)\1(.)\2(.)\3|/#\1\2\3/;
  y///c>length$c&&$c||$_
}

Graphics::ColorNames не является основным модулем, но он существует с 2001 года. Возможно, вам придется установить его через:

cpan install Graphics::ColorNames
cpan install Graphics::ColorNames::CSS

Шестнадцатеричное представление является предпочтительным, если имя цвета имеет одинаковую длину.


Тестовые случаи

use feature say;

say c 0, 0, 0;
say c 255, 0, 0;
say c 0, 128, 128;
say c 139, 0, 0;
say c 72, 61, 139;
say c 255, 255, 254;
say c 255, 85, 255;

Выход

#000
red
teal
#8b0000
#483d8b
#fffffe
#f5f
Примо
источник
Есть ли шанс, что вы могли бы сократить 4 байта для связи?
mbomb007
@ mbomb007 6 байтов, на самом деле.
Примо
Слышу ли я еще 4? Это соревнование жесткое.
mbomb007
1
@ mbomb007 поднять.
Примо
10

C # 6 527 байт / 2 бонуса = 264

РЕДАКТИРОВАТЬ: Woot! Я наконец получил бонусный ответ с более низким баллом, чем базовый ответ!

Я написал только функцию. Требуется usingзаявление (в комплекте.)

C # имеет хороший список известных цветов для работы, но он настаивает на включении альфа-канала. Известные цвета также включают все системные цвета, два из которых имеют имена длиной менее 7 символов, поэтому их необходимо удалить.

Вот бонусное решение, поддерживающее такие форматы, как:

  • 12, 34, 56
  • #123
  • #123456
  • DarkSlateBlue

Полностью в гольф:

using System.Drawing;int H(string s,int i,int l)=>Convert.ToInt32(s.Substring(i*l+1,l),16)*(l<2?17:1);string D(string a){int i=17,j=a.Length/3,n;var d=a.Split(',');Color k,c=a[0]<36?Color.FromArgb(H(a,0,j),H(a,1,j),H(a,2,j)):Color.FromName(a);c=c.A>0?c:Color.FromArgb(int.Parse(d[0]),int.Parse(d[1]),int.Parse(d[2]));j=c.R%i+c.G%i+c.B%i<1?3:6;n=c.ToArgb();a="#"+(j<6?c.R/i<<8|c.G/i<<4|c.B/i:n&0xffffff).ToString("x"+j);for(i=26;i++<167;k=Color.FromKnownColor((KnownColor)i),a=n==k.ToArgb()&k.Name.Length<=j?k.Name:a);return a;}

Отступы и новые строки для ясности:

using System.Drawing;
int H(string s,int i,int l)=>Convert.ToInt32(s.Substring(i*l+1,l),16)*(l<2?17:1);
string C(string a){
    int i=17,j=a.Length/3,n;
    var d=a.Split(',');
    Color k,c=a[0]<36
        ?Color.FromArgb(H(a,0,j),H(a,1,j),H(a,2,j))
        :Color.FromName(a);
    c=c.A>0?c:Color.FromArgb(int.Parse(d[0]),int.Parse(d[1]),int.Parse(d[2]));
    j=c.R%i+c.G%i+c.B%i<1?3:6;
    n=c.ToArgb();
    a="#"+(j<6?c.R/i<<8|c.G/i<<4|c.B/i:n&0xffffff).ToString("x"+j);
    for(i=26;i++<167;
        k=Color.FromKnownColor((KnownColor)i),
        a=n==k.ToArgb()&k.Name.Length<=j?k.Name:a
    );
    return a;
}

C #, 265 байт

Вот основное решение.

using System.Drawing;string C(int r,int g,int b){int i=17,c=r<<16|g<<8|b,j=r%i+g%i+b%i<1?3:6;var o="#"+(j<6?r/i<<8|g/i<<4|b/i:c).ToString("x"+j);for(i=26;i++<167;){var k=Color.FromKnownColor((KnownColor)i);o=c<<8==k.ToArgb()<<8&k.Name.Length<=j?k.Name:o;}return o;}

Отступы и новые строки для ясности:

using System.Drawing;

string C(int r,int g,int b){
    int i=17,
        c=r<<16|g<<8|b,
        j=r%i+g%i+b%i<1?3:6;
    var o="#"+(j<6?r/i<<8|g/i<<4|b/i:c).ToString("x"+j);
    for(i=26;i++<167;){
        var k=Color.FromKnownColor((KnownColor)i);
        o=c<<8==k.ToArgb()<<8&k.Name.Length<=j?k.Name:o;
    }
    return o;
}
Hand-E-Food
источник
@ mbomb007: код работает для меня.
Разнагул
8

Mathematica 207 242 500-250 = 250 байт

Обновление:
работает с входными данными, состоящими из троек rgb, имен цветов или шестнадцатеричных чисел.

Вывод глубины цвета (12 бит) теперь работает отлично, благодаря прекрасной статье по уменьшению глубины цвета . Основная идея состоит в том, что если тройка RGB {r, g, b}, где r, g и b находятся в диапазоне 0-255 (то есть hex 00-ff), может быть представлена ​​без потерь в виде числа в диапазон 0-15 (то есть 0-f), тогда можно использовать трехзначное шестнадцатеричное число вместо шестизначного числа. Оказывается, это будет происходить всякий раз, когда 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"}


Комментируется, Ungolfed Code

(* правила замены названия цвета образцом цвета, например 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)
DavidC
источник
Разве 255 в базе 10 не равно FFв базе 16? Так что должен получиться #FFFFFF, который длиннее белого. Я нахожу #000необычное, но, чтобы быть уверенным, рассмотрим причуды CSS.
DavidC
3
@DavidCarraher: цвета CSS могут быть определены как 24 или 12 бит. #FFFтакой же, как #FFFFFF(все биты один), который совпадает с white. Кроме того, #0является недействительным, потому что это ни 24 бит, ни 12 бит
slebetman
slebetman, спасибо за разъяснение, которое подтверждает наблюдение @ mbomb007.
DavidC
5

CoffeeScript, 411 404 388 384 382/2 = 191

UPD: уверен, что это конечный результат

Надеюсь, это нормально использовать window.document.*. Проверьте rgbфункцию и evalпозвоните.

s=(c,rgb=(r,g,b)->(2**24+(r<<16)+(g<<8)+b).toString 16)->d=y=document.body;r=(q=(a)->y.style.color=a;d[b='#'+eval(getComputedStyle(y).color)[1...].replace /(.)\1(.)\2(.)\3/,'$1$2$3']=a;b) c;(d='NavyGreenTealIndigoMaroonPurpleOliveGraySiennaBrownSilverPeruTanOrchidPlumVioletKhakiAzureWheatBeigeSalmonLinenTomatoCoralOrangePinkGoldBisqueSnowIvoryRed'.match /.[a-z]+/g).map(q);d[r]||r

Результаты теста

rgb(   0,   0,   0 ) -> #000
rgb( 255,   0,   0 ) -> Red
rgb(   0, 128, 128 ) -> Teal
rgb( 139,   0,   0 ) -> #8b0000
rgb(  72,  61, 139 ) -> #483d8b
rgb( 255, 255, 254 ) -> #fffffe
rgb( 255,  85, 255 ) -> #f5f
darkslateblue        -> #483d8b
indigo               -> Indigo
#f00                 -> Red

Код комментария

s = ( c,
    rgb = ( r, g, b ) ->
        return ( 2 ** 24 + ( r << 16 ) + ( g << 8 ) + b )
        .toString( 16 )
) ->

Это сэкономит несколько байтов.

    d = y = document.body

qФункция поместит входной цвет document.body.style.colorи получит скомпилированный цвет как rgb(...). Также он будет хранить результат как hexColor:inputColorв d. Обратите внимание на evalиспользование. rgb(100,100,100)является допустимым вызовом функции JavaScript с тремя числовыми аргументами. rgbФункция преобразует аргументы в одну шестнадцатеричную нотацию 24/12 (например #fff, #f0f0f0).

    r = (
        q = ( a ) ->
            y.style.color = a
            b = '#' + eval( getComputedStyle( y ).color )[ 1... ].replace( /(.)\1(.)\2(.)\3/, '$1$2$3' )
            d[ b ] = a
            return b
    )( c )

Разбейте строку на массив имен цветов, создайте объект поиска.

    ( d = 'NavyGreenTeal...'.match( /.[a-z]+/g )).map( q )

И вернуть HEX, если нет более короткого варианта в d.

    return d[ r ] or r
Argh-Argh
источник
4

Стилус, 238 234/2 = 117

Более CSS-подобное решение! Стилус уже имеет отличную поддержку для манипулирования цветом, поэтому желаемая функция довольно мала и не слишком хороша для игры в гольф.

f(c){for n in split(' ''navy green teal indigo maroon purple olive gray sienna brown silver peru tan orchid plum violet khaki azure wheat beige salmon linen tomato coral orange pink gold bisque snow ivory red'){lookup(n)==c?c=s(n):c}}

Проверьте это здесь

body
  color f(rgb(0, 0, 0))
  color f(rgb(255, 0, 0))
  color f(rgb(0, 128, 128))
  color f(rgb(139, 0, 0))
  color f(rgb(72, 61, 139))
  color f(rgb(255, 255, 254))
  color f(rgb(255, 85, 255))
  color f(darkslateblue)
  color f(indigo)
  color f(#f00)
  color f(rgba(255,0,0,1))
  color f(rgba(255,0,0,0.5))
Argh-Argh
источник
Добро пожаловать в PPCG! Это действительно хорошее решение!
mbomb007
не много играл в гольф . Лучше попробуй сыграть в гольф еще раз, если хочешь выиграть. Кто-то избивает тебя одним.
mbomb007
@ mbomb007, хорошо, немного поиграл в гольф.
Argh-Argh
Похоже, тебя избили. Может быть, вы можете попробовать собрать цвета вместе без пробелов, но дополнить до пяти символов, а затем разделить каждые пять и обрезать? Не уверен, что это сэкономит байты?
mbomb007
3

Matlab 617

Много предварительной обработки и жесткого кодирования. Минимальный набор имен цветов, которые вы должны учитывать, это. Жаль, что Matlab не имеет встроенных имен цветов = /

function s=f(r,g,b);
t=255;
c=[r,g,b];
a=[0 t t;240 t t;245 245 220;t 228 196;0 0 t;165 42 42;t 127 80;0 t t;t 215 0;75 0 130;t t 240;240 230 140;0 t 0;250 240 230;t 165 0;218 112 214;205 133 63;t 192 203;221 160 221;t 0 0;250 128 114;160 82 45;t 250 250;210 180 140;t 99 71;238 130 238;245 222 179;t t t;t t 0];
s=textscan('aqua azure beige bisque blue brown coral cyan gold indigo ivory khaki lime linen orange orchid peru pink plum red salmon sienna snow tan tomato violet wheat white yellow','%s');
i=find(ismember(a,c,'rows'));
k=1;
if i>0;s=s{1}{i};elseif ~any(mod(c,16));k=16;end;d=dec2hex(c/k,2-(k>1))';s=['#',d(:)']
flawr
источник
Вы оставили там жестко закодированный r=0;g=16;b=0;, хотя он не засчитывается в ваш счет.
Hand-E-Food
О, я вставил не ту версию, спасибо, что сообщили мне!
Flawr
2

Python 3, +857 795 байт

Необходимость вручную указать все требуемые принятые цвета увеличивала количество байтов на этом: /

c(a)принимает один аргумент, aкоторый приходит в форме rgb(#,#,#). Отсюда удаляются rgb и скобки, а затем строка разделяется запятыми в массив. c(x,y,z)занимает 3 дюйма, значения r, g и b цвета rgb для обработки. Мы собрали их в массив a. Затем мы используем встроенную hexфункцию Python, которая преобразует число Base 10 в число Base 16 в нашем массиве и создаем шестнадцатеричную строку (это делается в forцикле). Эти ifзаявления преобразования цвета , как 000000к 000, и заменить известные цвета с использованием словаря.

Вот оно (спасибо @undergroundmonorail за подсказку ;в Python):

def c(x,y,z):
  a=[x,y,z];b="";
  for i in a:
    i=hex(i)[2:]
    if len(i)<2:i="0"+i;
    b+=i
  k={"00ffff":"AQUA","f0ffff":"AZURE","f5f5dc":"BEIGE","ffe4c4":"BISQUE","0000ff":"BLUE","a52a2a":"BROWN","ff7f50":"CORAL","ffd700":"GOLD","808080":"GRAY","008000":"GREEN","4b0082":"INDIGO","fffff0":"IVORY","f0e68c":"KHAKI","00ff00":"LIME","faf0e6":"LINEN","800000":"MAROON","000080":"NAVY","808000":"OLIVE","ffa500":"ORANGE","da70d6":"ORCHID","cd853f":"PERU","ffc0cb":"PINK","dda0dd":"PLUM","800080":"PURPLE","ff0000":"RED","fa8072":"SALMON","a0522d":"SIENNA","c0c0c0":"SILVER","fffafa":"SNOW","d2b48c":"TAN","008080":"TEAL","ff6347":"TOMATO","ee82ee":"VIOLET","f5deb3":"WHEAT","ffff00":"YELLOW"}
  if b[:3]==b[3:]:b=b[:3];
  if b in k:b=k[b];
  else:b="#"+b;
  return b

Старая версия:

def c(a):
  a=a[4:-1].split(",")
  b=""
  for i in a:
    i=hex(int(i))[2:]
    if len(i)<2:
      i="0"+i
    b+=i
  k = {"00ffff":"AQUA","f0ffff":"AZURE","f5f5dc":"BEIGE","ffe4c4":"BISQUE","0000ff":"BLUE","a52a2a":"BROWN","ff7f50":"CORAL","ffd700":"GOLD","808080":"GRAY","008000":"GREEN","4b0082":"INDIGO","fffff0":"IVORY","f0e68c":"KHAKI","00ff00":"LIME","faf0e6":"LINEN","800000":"MAROON","000080":"NAVY","808000":"OLIVE","ffa500":"ORANGE","da70d6":"ORCHID","cd853f":"PERU","ffc0cb":"PINK","dda0dd":"PLUM","800080":"PURPLE","ff0000":"RED","fa8072":"SALMON","a0522d":"SIENNA","c0c0c0":"SILVER","fffafa":"SNOW","d2b48c":"TAN","008080":"TEAL","ff6347":"TOMATO","ee82ee":"VIOLET","f5deb3":"WHEAT","ffff00":"YELLOW"}
  if b[:3]==b[3:]:
    b=b[:3]
  if b in k:
    b=k[b]
  else:
    b="#"+b
  return "color:"+b+";"

Возможно я добавлю бонус к этому, я еще не знаю. Это может быть определенно с 50% байтов!

-Toastrackenigma

Toastrackenigma
источник
2
общие советы по игре в гольф на Python: многие из ваших новых строк могут быть заменены ;, сохраняя отступы. например: a=a[4:-1].split(",");b="". любой if, else, for, whileи т.д. блок только с одной строкой может быть записан в виде if b in k:b=k[b].finally, вы можете потерять много ваших пробела в середине строк, например k = {-> k={и return "color:->return"color:
undergroundmonorail
Кроме того, добро пожаловать в PPCG :)
подземный
2
Этот буквальный k огромен. Поскольку все цветовые коды указаны в нижнем регистре, а все названия цветов в верхнем регистре, вы можете просто написать это как одну строку, а затем проанализировать ее re.findall()(так будет и нужно import re): pastebin.com/rQHqgxXS
manatwork
@undergroundmonorail Спасибо за это, должно сэкономить много места: D
Toastrackenigma
@ mbomb007 Ладно, я не совсем понял, как вы хотели получить вывод или ввод, - там немного запутался: PI выполнил код на тестовых примерах, чтобы убедиться, что он работает правильно, вы хотите, чтобы я загружал свои результаты?
Toastrackenigma
1

JavaScript (ES6), 499 611

Изменить Добавлены тестовые случаи в вопросе

Примечание: я сохранил только названия цветов, которые короче, чем шестнадцатеричный эквивалент.

Примечание 2: это, безусловно, можно играть в гольф больше ...

f=(r,g,b,k='#'+(r%17|g%17|b%17?1<<24|r<<16|g<<8|b:4096|(r*256+g*16+b)/17).toString(16).slice(1))=>
("#d2b48cTAN#f00RED#ff7f50CORAL#f5deb3WHEAT#ff6347TOMATO#ffd700GOLD#008000GREEN#faf0e6LINEN#f5f5dcBEIGE#da70d6ORCHID#4b0082INDIGO#ffc0cbPINK#f0e68cKHAKI#008080TEAL#ee82eeVIOLET#dda0ddPLUM#fa8072SALMON#ffa500ORANGE#a0522dSIENNA#800000MAROON#800080PURPLE#ffe4c4BISQUE#f0ffffAZURE#fffff0IVORY#cd853fPERU#808000OLIVE#c0c0c0SILVER#fffafaSNOW#a52a2aBROWN#000080NAVY#808080GRAY"
.match(k+'([A-Z]+)')||[,k])[1]

// TEST
;[[0,0,0,'#000'],[255,0,0,'red'],[0,128,128,'TEAL'],[139,0,0,'#8B0000'],[72,61,139,'#483D8B'],[255,255,254,'#fffffe'],[255,85,255,'#f5f']]
.forEach(([r,g,b,t])=>(x=f(r,g,b),o+=r+','+g+','+b+' -> '+x+' '+(x.toUpperCase()==t.toUpperCase()?'ok':'error('+t+')')+'\n'),o='')
O.innerHTML=o

function go()
{
  var r,g,b
  [r,g,b] = I.value.match(/\d+/g)
  O.innerHTML=r+','+g+','+b+' -> '+f(r,g,b)+'\n'+O.innerHTML
}
R,G,B: <input id=I><button onclick="go()">--></button>
<pre id=O></pre>

Меньше гольфа

f=(r,g,b) => (
   k='#'+(
     r%17|g%17|b%17
     ? 1<<24|r<<16|g<<8|b
     : 4096|r/17<<8|g/17<<4|b/17
    ).toString(16).slice(1),
   s = "#d2b48cTAN#f00RED#ff7f50CORAL#f5deb3WHEAT#ff6347TOMATO#ffd700GOLD#008000GREEN#faf0e6LINEN#f5f5dcBEIGE#da70d6ORCHID#4b0082INDIGO#ffc0cbPINK#f0e68cKHAKI#008080TEAL#ee82eeVIOLET#dda0ddPLUM#fa8072SALMON#ffa500ORANGE#a0522dSIENNA#800000MAROON#800080PURPLE#ffe4c4BISQUE#f0ffffAZURE#fffff0IVORY#cd853fPERU#808000OLIVE#c0c0c0SILVER#fffafaSNOW#a52a2aBROWN#000080NAVY#808080GRAY",
   m = s.match(k+'([A-Z]+)'), // names are upper, hex codes are lower
   (m || [,k])[1] // if no match use the code
)
edc65
источник
Эти подчеркивания ... По моим подсчетам, было бы короче без них. Просто процитирую коды , начинающиеся с цифры и держать остальных неупомянута: {f00:"red";"008000":"green"}.
manatwork
@ Manatwork хороший трюк. Но буквальный объект редко является хорошим выбором для игры в гольф. Простая строка лучше
edc65
Правильный. Я уже сделал комментарий в этом смысле нашему новому соседу по сайту.
manatwork
1
@ mbomb007 Добавлены тесты. Фрагмент не будет работать в Chrome, так как это EcmaScript 6, и Chrome не полностью совместим (довольно устал повторять это снова и снова). Тест в Firefox.
edc65