CSS彩色高尔夫!


25

您是网络开发人员,而您的老板已决定更新公司的网站。他认为颜色越少越好,但他希望该网站看起来一样。您有理由认为他不知道他在说什么,但您还是要尝试一下,因为您很无聊。由于该公司有成千上万个网页,并且每个网页都有自己的CSS,因此您决定编写脚本来进行必要的更改。不需要解析HTML

当前,所有页面都使用字符串rgb(255,0,0)作为颜色。给定三个十进制值(代表CSS颜色属性的RGB值)(按该顺序),返回或打印该颜色的最短字符串表示形式,以便它可用于CSS,如下所示:color:<your-result-here>;

这是有效的CSS颜色关键字的完整表格。它们不区分大小写。

例子:

请注意,可以使用12位或24位定义颜色。该模式#ABC是的较短版本#AABBCCChuck Norris是一种颜色

您的程序将只接受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,某些颜色具有备用名称(如FuchsiaMagenta,或CyanAqua)。根据W3标准,备用名称包含在CSS颜色关键字的链接列表中。
  • CSS3正在图灵完成。那将是值得的赏金。

编辑:

  • 请在测试案例中运行您的代码!



希望获得-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。我怀疑许多问题的答案在这里实际上的输出最小的颜色由浏览器提供的灵活的实现会(但输出最小的颜色在这个问题这里给出的规范去)。
丹尼尔·瓦格纳

Answers:


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个字节,实际上。
primo

我还能听到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 2015年

8

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

基数10中的255是否等于FF基数16中的255 ?因此,该值应#FFFFFF比White长。我发现#000异常,但是可以肯定地看一下CSS的怪癖。
DavidC

3
@DavidCarraher:CSS颜色可以指定为24位或12位。#FFF与相同#FFFFFF(所有位均为1),与相同white。另外,#0它无效,因为它既不是24位也不是12位
slebetman

slebetman,谢谢您的澄清,它证实了@ mbomb007的观察。
DavidC 2015年

5

的CoffeeScript,411 404 388 384 2分之382= 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:inputColord。注意eval使用。 rgb(100,100,100)是带有三个数字参数的有效JavaScript函数调用。 rgb功能参数转换为单一24/12 HEX符号(如#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 )

如果没有短变体,则返回十六进制d

    return d[ r ] or r

4

手写笔,238 2分之234= 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))

欢迎来到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(:)']

您已经将硬编码留在r=0;g=16;b=0;了那里,尽管它并未计入分数。
Hand-E-Food

哦,我粘贴了错误的版本,谢谢让我知道!
瑕疵的

2

Python 3, 857 795字节

必须手动指定所需的所有可接受颜色,确实增加了该颜色的字节数:/

c(a)接受一个参数,a形式为rgb(#,#,#)。从中删除rgb和方括号,然后将字符串用逗号分隔成一个数组。 c(x,y,z)需要3个整数,即rgb颜色的r,g和b值进行处理。我们将它们组合成一个数组a。然后,我们使用Python的内置hex函数将数组中的以10为底的数字转换为以16为底的数字,并创建一个十六进制字符串(在for循环中完成)。该if语句转换的颜色,如000000000,并使用字典替换已知的颜色。

在这里(感谢@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


2
python高尔夫一般提示:您可以将许多换行符替换为;,以节省缩进量。例如:a=a[4:-1].split(",");b=""。任何ifelseforwhile只有一条线,等块可以写成if b in k:b=k[b]。最后,你可以在线路的中间,如失去了很多的空白k = {> - k={return "color:- >return"color:
undergroundmonorail

同样,欢迎来到PPCG :)
地下

2
那个字面量k很大。由于所有颜色代码均使用小写字母,所有颜色名称均使用大写字母,因此您可以将其编写为单个字符串,然后使用进行解析re.findall()(因此也需要import re): pastebin.com/rQHqgxXS
manatwork

@undergroundmonorail谢谢你,应该节省很多空间:D
Toastrackenigma 2015年

@ mbomb007好吧,我不太确定您希望如何输出或输入-有点困惑:PI确实在测试用例上运行了代码以确保其正常工作,您是否希望我上传结果?
Toastrackenigma

1

JavaScript(ES6),499611

编辑在问题中添加了测试用例

注意:我只保留了比十六进制等效名称短的颜色名称。

注意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

@manatwork好招。但是文字对象很少是代码高尔夫的好选择。一个简单的字符串会更好
edc65

正确。从某种意义上讲,我已经向我们的新同伴发表评论
manatwork

1
@ mbomb007添加了测试用例。此代码段无法在chrome为EcmaScript 6的情况下使用,并且Chrome浏览器不完全兼容(非常烦恼要一次又一次地重复此操作)。在Firefox中测试。
edc65
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.