CSS Color Golf!


25

Usted es un desarrollador web y su jefe ha decidido actualizar el sitio web de la compañía. Ha decidido que menos color es mejor, pero quiere que el sitio se vea igual. Simplemente decide que no tiene idea de qué está hablando, pero lo intentará de todos modos, porque está aburrido. Como la compañía tiene miles de páginas web y cada una tiene su propio CSS, usted decide escribir un script para hacer los cambios necesarios. No se requiere analizar HTML .

Todas las páginas utilizan actualmente una cadena como rgb(255,0,0)para un color. Teniendo en cuenta los tres valores decimales que representan los valores RGB de un atributo de color CSS (en ese orden), retorno o imprimir la representación de cadena más corta de ese color, de manera que es utilizable para CSS, así: color:<your-result-here>;.

Aquí hay una tabla completa de palabras clave de color CSS válidas . Son insensibles a mayúsculas y minúsculas.

Ejemplos:

Tenga en cuenta que los colores se pueden definir con 12 o 24 bits. El patrón #ABCes una versión más corta de #AABBCC. Chuck Norris es un color .

Su programa solo tomará 3 enteros, no una cadena (con la excepción del "bono" mencionado más adelante).

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)

Puntuación / Reglas

  • ¡El código más corto gana!
  • Las lagunas estándar no están permitidas , con la excepción de las incorporadas.
  • -50% bytes (el bono se redondea hacia abajo) si acepta cualquier * selector de color válido y genera el más corto. Entonces DarkSlateBlue, salida #483D8B, #F00salidas red, etc.
    • * Esto solo incluye RGB, códigos hexadecimales y nombres.
    • Tenga en cuenta que algunos colores tienen nombres alternativos debido a X11 (como Fuchsiay Magenta, o Cyany Aqua). Los nombres alternativos se incluyen en la lista vinculada de palabras clave de color CSS de acuerdo con el estándar W3.
  • CSS3 está Turing completo . Eso valdría una recompensa.

Editar:

  • ¡POR FAVOR CORRE SU CÓDIGO EN LOS CASOS DE PRUEBA!



¿Una respuesta que desea obtener el bono de -50% también necesita analizar hsl (...)? ¿Qué pasa con rgba (...) y hsla (...)? :)
Timwi

De acuerdo con este enlace sobre colores en CSS, el blanco es # 000000. ¿Cómo se te ocurrió #000? Y si se permiten menos de 6 dígitos, ¿por qué no #0? w3schools.com/cssref/css_colors.asp , el CSS
DavidC

2
@DavidCarraher Consulte stackoverflow.com/q/8318911/791604 para obtener una explicación detallada. Sospecho que muchas de las respuestas aquí en realidad no están generando colores mínimos según la implementación flexible disponible en los navegadores (pero están generando colores mínimos según la especificación dada en la pregunta aquí).
Daniel Wagner

Respuestas:


5

Perl, 212 - 50% = 106 bytes

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||$_}

Con nuevas líneas agregadas:

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||$_
}

Casos de prueba

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

Salida

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

Perl, sin bonificación, 144 bytes

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||$_}

Con nuevas líneas agregadas:

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 no es un módulo central, pero existe desde 2001. Es posible que deba instalarlo a través de:

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

Se prefiere la representación hexadecimal si el nombre del color tiene la misma longitud.


Casos de prueba

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;

Salida

#000
red
teal
#8b0000
#483d8b
#fffffe
#f5f

¿Alguna posibilidad de que puedas cortar 4 bytes para el empate?
mbomb007

@ mbomb007 6 bytes, de hecho.
primo

¿Escucho 4 más? Esta competencia es dura.
mbomb007

1
@ mbomb007 elevar.
primo

10

C # 6 527 bytes / 2 bonus = 264

EDITAR: Woot! ¡Finalmente obtuve la respuesta extra con una puntuación más baja que la respuesta básica!

He escrito solo una función. Requiere una usingdeclaración (incluida).

C # tiene una buena lista de colores conocidos para trabajar, pero insiste en incluir el canal Alpha. Los colores conocidos también incluyen todos los colores del sistema, dos de los cuales tienen nombres de menos de 7 caracteres de longitud, por lo que deben eliminarse.

Aquí está la solución adicional, que admite formatos como:

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

Completamente golfizado:

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;}

Sangría y nuevas líneas para mayor claridad:

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 bytes

Aquí está la solución básica.

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;}

Sangría y nuevas líneas para mayor claridad:

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: el código funciona para mí.
raznagul

8

Mathematica 207 242 500-250 = 250 bytes

Actualización:
esto funciona con entradas que consisten en triples rgb, nombres de colores o números hexadecimales.

La salida de profundidad de color (12 bits) ahora funciona bien, gracias a un excelente artículo sobre Reducción de profundidad de bits de color . La idea básica es que, si un triple RGB {r, g, b}, donde r, gyb están en el rango de 0-255, (es decir, hex 00-ff) puede representarse sin pérdida como un número en el rango de 0-15 (es decir, 0-f), entonces uno puede usar el número hexadecimal de 3 dígitos en lugar del número de 6 dígitos. Resulta que esto ocurrirá siempre que 17 (es decir, 255/15) divida r, g, y b.

Solo se utilizan las funciones integradas. Mathematica tiene reglas para reemplazar nombres de colores HTML con triples RGB. Por ejemplo, una regla es "Teal"-> RGBColor[0, 128, 128]. Cuando tales reglas se invierten, los valores rgb (recalibrados al rango, {0, 255}) se pueden reemplazar con nombres de colores.

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)

Ejemplos

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", "Rojo", "Verde azulado", "# 8b0000", "#fff", "# 483d8b", "#fffffe", "# f5f"}


z /@ {"Red", "DarkSlateBlue", "Teal", "Black"}

{"Rojo", "# 483c8b", "Verde azulado", "# 000"}


z /@ {"#000", "#f00", "#008080", "#8b0000", "#fff", "#483d8b", "#fffffe", "#f5f"}

{"# 000", "Rojo", "Verde azulado", "# 8b0000", "#fff", "# 483d8b", "#fffffe", \ "# f5f"}


Código comentado y sin golf

(* reglas para reemplazar un nombre de color con una muestra de color, p. ej. RGBColor{255,17,0}

q=ColorData["HTML","ColorRules"];

(* reglas para reemplazar una lista de 3 enteros con el nombre del color respectivo, si existe). Y las mismas reglas, invertidas. *)

rulesListsToColorNames=(q)/.{(c_ -> RGBColor[r_,g_,b_]):> (Floor[255{r,g,b}]-> c)};

rulesColorsToLists=Reverse/@rulesListsToColorNames;

(* prueba si un color hexadecimal de 24 bits se puede representar como un color de 12 bits sin pérdida. reducepuede cambiar la expresión de 24 bits a una expresión de 12 bits. *)

depthReducible[l_List]:=And@@IntegerQ/@(l/17);
reduce[l_List]:=If[depthReducible@l,l/17,l];

(* La lista RGB cambió a un número hexadecimal *)

fromListToHex[l_List]:="#"<>(IntegerString[#,16,If[depthReducible@l,1,2]]&/@reduce[l])

(* El número hexadecimal cambió a la lista RGB. *)

fromHexToList[h_String]:=Module[{c=(StringLength[h1=StringDrop[h,1]]==6)},
FromDigits[#,16]&/@StringPartition[h1,If[c,2,1]]*If[c,1,17]
]

(* Más conversiones *)

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}]

(* elige la expresión CSS más corta válida de un color *)

f@n_List:=SortBy[{fromListToColorName[n],fromListToHex[n]},StringLength][[1]]

(* convierte cualquier entrada en una lista RGB y llama f *)

returnShortestColor[d_]:= 
 (If[StringQ[d],
   If[StringTake[d,1]=="#",
     e=fromHexToList@d,
     e=fromColorNameToList@d],
   e=d];
f@e)

¿No es 255 en la base 10 igual que FFen la base 16? Eso debería hacer #FFFFFF, que es más largo que el blanco. Me #000parece inusual, pero examinaré las peculiaridades de CSS para estar seguro.
DavidC

3
@DavidCarraher: los colores CSS pueden especificarse como 24 bits o 12 bits. #FFFes lo mismo que #FFFFFF(todos los bits uno) que es lo mismo que white. Además, #0no es válido porque no tiene 24 bits ni 12 bits
slebetman

slebetman, gracias por la aclaración, que confirma la observación de @ mbomb007.
DavidC

5

CoffeeScript, 411 404 388 384 382/2 = 191

UPD: bastante seguro de que es el resultado final

Espero, está bien usarlo window.document.*. Verifique la rgbfunción y evalllame.

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

Resultados de la prueba

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

Código comentado

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

Esto ahorrará algunos bytes.

    d = y = document.body

qLa función colocará el color de entrada document.body.style.colory obtendrá el color compilado como rgb(...). También almacenará el resultado como hexColor:inputColoren d. Aviso de evaluso. rgb(100,100,100)es una llamada a función de JavaScript válida con tres argumentos numéricos. rgbLa función convertirá argumentos a notación HEX 24/12 única (como #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 )

Dividir la cadena en una matriz de nombres de colores, crear objetos de búsqueda.

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

Y devuelve HEX si no hay una variante más corta d.

    return d[ r ] or r

4

Aguja, 238 234/2 = 117

¡Más solución tipo CSS! Stylus ya tiene un gran soporte para la manipulación del color, por lo que la función deseada es bastante pequeña y no se juega mucho.

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

Pruébalo aquí

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

Bienvenido a PPCG! Esa es una muy buena solución!
mbomb007

No golf mucho . Será mejor que intentes jugar un poco más si quieres ganar. Alguien te está golpeando por uno.
mbomb007

@ mbomb007, está bien, jugué un poco al golf.
argh-argh

Parece que te han golpeado. ¿Tal vez puedas intentar juntar los colores sin espacios, pero rellenados con cinco caracteres, luego dividir cada cinco y recortar? ¿No está seguro si eso ahorraría bytes?
mbomb007

3

Matlab 617

Mucho preprocesamiento y codificación. El conjunto mínimo de nombres de colores que debe tener en cuenta son estos. Lástima que Matlab no haya incorporado nombres de color = /

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(:)']

Has dejado el codificado r=0;g=16;b=0;allí, aunque no se cuenta en tu puntuación.
Hand-E-Food

Oh, pegué la versión incorrecta, ¡gracias por hacérmelo saber!
falla

2

Python 3, 857 795 bytes

Tener que especificar manualmente todos los colores aceptados requeridos aumentó el número de bytes en este: /

c(a)toma un argumento, aque viene en forma de rgb(#,#,#). A partir de eso, se eliminan los rgb y los corchetes y la cadena se divide por comas en una matriz. c(x,y,z)toma 3 ints, los valores r, g y b del color rgb para procesar. Los juntamos en una matriz a. Luego usamos la función incorporada de Python hexque convierte un número de Base 10 en un número de Base 16 en nuestra matriz y crea una cadena hexadecimal (esto se hace en el forbucle). Las ifdeclaraciones convierten colores similares 000000a 000, y reemplazan los colores conocidos usando un diccionario.

Aquí está (gracias a @undergroundmonorail por la información sobre ;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

Versión antigua:

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+";"

Tal vez le agregue la bonificación, aún no lo sé. ¡Definitivamente podría hacerlo con un 50% de bytes de descuento!

-Toastrackenigma


2
Consejos generales de golf de Python: muchas de sus nuevas líneas se pueden reemplazar ;, guardando la sangría. por ejemplo: a=a[4:-1].split(",");b="". ninguna if, else, for, whilebloques, etc, con sólo una línea se puede escribir como if b in k:b=k[b].Finalmente, se puede perder mucho de su espacio en blanco en el medio de líneas, por ejemplo k = {-> k={y return "color:->return"color:
undergroundmonorail

también, bienvenido a PPCG :)
undergroundmonorail

2
Ese literal k es enorme. Como todos los códigos de colores están en minúsculas y todos los nombres de colores están en mayúsculas, puede escribirlo como una sola cadena y luego analizarlo re.findall()(también lo necesitará import re): pastebin.com/rQHqgxXS
manatwork

@undergroundmonorail Gracias por eso, debería ahorrar mucho espacio: D
Toastrackenigma

@ mbomb007 OK, no estaba muy seguro de cómo deseaba la salida o la entrada: me confundí un poco: PI ejecutó el código en los casos de prueba para asegurarse de que funciona correctamente, ¿quiere que cargue mis resultados?
Toastrackenigma

1

JavaScript (ES6), 499611

Editar Se agregaron los casos de prueba en la pregunta

Nota: Mantuve solo los nombres de color que son más cortos que el equivalente hexadecimal.

Nota 2: esto seguramente se puede jugar más golf ...

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>

Menos golf

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
)

Esos guiones bajos ... Según mi cuenta, serían más cortos sin ellos. Sólo los códigos que comienzan por un dígito y mantener a los demás sin comillas: {f00:"red";"008000":"green"}.
manatwork

@manatwork buen truco. Pero un objeto literal rara vez es una buena opción para el golf de código. Una cadena simple es mejor
edc65

Correcto. Ya hice un comentario en ese sentido a nuestro nuevo compañero de sitio.
manatwork

1
@ mbomb007 Se agregaron casos de prueba. El fragmento no funcionará en Chrome siendo EcmaScript 6, y Chrome no es totalmente compatible (bastante cansado de repetir esto una y otra vez). Prueba en Firefox.
edc65
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.