CSS Color Golf!


25

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

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

Ось повна таблиця дійсних ключових слів кольору CSS . Вони нечутливі до регістру.

Приклади:

Зауважте, що кольори можна визначити за допомогою 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 відповідно до стандарту W3.
  • CSS3 - Turing Complete . Це варте щедрості.

Редагувати:

  • ЗАБУДУЙТЕ ВАШИЙ КОД НА ТЕСТОВИХ СЛУХАХ!



Чи потрібна відповідь, яка бажає отримати бонус -50%, також проаналізувати hsl (...)? Що з rgba (...) та hsla (...)? :)
Timwi

Згідно з цим посиланням на кольори у 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

РЕДАКТ: Вуто! Нарешті я отримав бонусну відповідь з нижчим балом, ніж основна відповідь!

Я написав лише функцію. Це вимагає usingзаяви (включено.)

У C # є хороший список відомих кольорів, з якими можна працювати, але він наполягає на включенні каналу Alpha. Відомі кольори також включають всі системні кольори, два з яких мають імена довжиною менше 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;
}

@ mbomb007: Код працює для мене.
raznagul

8

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

Оновлення:
Це працює з введеннями, що складаються з трійки rgb, назв кольорів або шістнадцяткових чисел.

(12-бітний) колір глибинного виходу тепер працює чудово, завдяки чудовій статті про зменшення глибини бітових кольорів . Основна ідея полягає в тому, що, якщо потрійний RGB {r, g, b}, де r, g і b знаходяться в діапазоні 0-255, (тобто шістнадцятковий 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", "Червоний", "Тіл", "# 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)

Чи не 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Функція перетворить аргументи в єдину нотацію HEX 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

4

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

Більше CSS-подібне рішення! У Stylus вже є чудова підтримка маніпуляцій з кольором, тому потрібна функція є досить маленькою і не займається великим гольфом.

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

Ласкаво просимо до PPCG! Це дійсно приємне рішення!
mbomb007

не багато в гольф . Ви краще спробуйте пограти ще трохи, якщо хочете виграти. Хтось б’є вас одним.
mbomb007

@ mbomb007, добре, гольф трохи.
argh-argh

Схоже, тебе побили. Можливо, ви можете спробувати набивати кольори разом без пробілів, але замінено на п’ять символів, а потім розділити кожні п’ять і обрізати? Не знаєте, чи врятує це байт?
mbomb007

3

Матлаб 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(:)']

Ви залишили там жорсткого r=0;g=16;b=0;коду, хоча це не враховується у вашому рахунку.
Hand-E-Food

О, я вставив неправильну версію, дякую, що дав мені знати!
недолік

2

Пітон 3, 857 795 байт

Якщо вручну вказати всі необхідні кольори, це збільшило кількість байтів для цього: /

c(a)бере один аргумент, aякий надходить у формі rgb(#,#,#). Після цього rgb і дужки видаляються, а рядок потім розділяється комами в масив. c(x,y,z)потрібно обробити 3 ints, значення 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% байтами!

-Тоастраккенігма


2
загальні поради щодо гольфу на пітоні: багато ваших нових рядків можна замінити ;, зберігаючи відступи. наприклад: 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
малій літераті,

@undergroundmonorail Спасибі за це, має заощадити багато місця: D
Toastrackenigma

@ mbomb007 Добре, я не був зовсім впевнений, як ви хотіли виводу або вводу - трохи заплутався там: PI запустив код на тестових випадках, щоб переконатися, що він працює належним чином, чи хочете ви, щоб я завантажив свої результати?
Тоастраккенігма

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
)

Ці підкреслення ... На мій підрахунок, без них було б коротше. Просто процитую коди , що починаються з цифри і тримати інших незгаданих: {f00:"red";"008000":"green"}.
манатура

@manatwork приємний трюк. Але буквальний об’єкт рідко є хорошим вибором для кодового гольфу. Простий рядок краще
edc65

Правильно. Я вже зробив коментар у цьому сенсі нашому свіжому сайту.
манатура

1
@ mbomb007 Додано тестові приклади. Фрагмент не працюватиме в хромі EcmaScript 6, а Chrome не повністю сумісний (досить втомився повторювати це знову і знову). Тест у Firefox.
edc65
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.