CSSカラーゴルフ!


25

あなたはWeb開発者であり、あなたの上司が会社のWebサイトを更新することに決めました。彼は、色が少ないほど良いと判断しましたが、サイトが同じように見えることを望んでいます。あなたは彼が何を話しているのか彼が何も知らないと決定するだけですが、あなたは退屈しているので、とにかく試してみるつもりです。会社には数千のWebページがあり、各Webページには独自のCSSがあるため、必要な変更を行うスクリプトを作成することにします。HTMLの解析は必要ありません。

現在、すべてのページでrgb(255,0,0)色のような文字列が使用されています。CSSカラー属性のRGB値を(この順序で)表す3つの10進数値を指定すると、その色の最短文字列表現を返すか印刷し、次のように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、16進コード、および名前のみが含まれます。
    • 一部の色にはX11による代替名(Fuchsiaand Magenta、or Cyan、andなどAqua)があることに注意してください。代替名は、W3標準に従ってCSSカラーキーワードのリンクリストに含まれています。
  • CSS3はチューリング完了です。それは賞金に値するでしょう。

編集:

  • テストケースでコードを実行してください!



-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

色名の長さが同じ場合は、16進表現が優先されます。


テストケース

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#には、動作する既知の色の素晴らしいリストがありますが、アルファチャネルを含めることを主張しています。既知の色には、すべてのシステム色も含まれます。そのうちの2つは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トリプル、色名、または16進数で構成される入力で機能します。

(12ビット)色深度出力は今、上の素晴らしい記事のおかげで罰金を作品色ビット深度削減を。基本的な考え方は、RGBトリプル{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トリプルに置き換えるためのルールがあります。たとえば、1つのルールは "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ビットの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)

基数10の255は基数FF16 と等しくありませんか?したがって#FFFFFF、これはWhiteよりも長いを作成する必要があります。私は#000珍しいことに気づきましたが、確実にCSSの癖を調べます。
DavidC

3
@DavidCarraher:CSSカラーは24ビットまたは12ビットとして指定できます。#FFF#FFFFFF(すべてのビット1)と同じで、これはと同じwhiteです。また、#024ビットでも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)は、3つの数値引数を持つ有効な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 )

に短いバリアントがない場合は、HEXを返しdます。

    return d[ r ] or r

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

PPCGへようこそ!それは本当に素晴らしい解決策です!
mbomb007

ゴルフはあまりしませんでした。勝ちたいなら、もう少しゴルフを試してみたほうがいいでしょう。誰かがあなたを打ちます。
mbomb007

@ mbomb007、申し分なく、少しゴルフをしました。
argh-argh

あなたがbeatられたように見えます。たぶん、スペースなしで色を詰め込み、5文字にパディングし、5文字ごとに分割してトリムできますか?それがバイトを節約するかどうかわかりませんか?
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

ああ、間違ったバージョンを貼り付けました。知らせてくれてありがとう!
flawr

2

Python 3、 857 795バイト

必要なすべての受け入れられた色を手動で指定する必要があるため、これのバイト数が増えました

c(a)は1つの引数を取ります。aこれはの形式ですrgb(#,#,#)。それから、rgbと角かっこが削除され、文字列がコンマによって配列に分割されます。 c(x,y,z)処理するrgbカラーのr、g、およびbの値の3つの整数を取ります。それらを配列にまとめaます。次にhex、配列のPython 10の組み込み関数を使用して、Base 10の数値をBase 16の数値に変換し、16進文字列を作成します(これはforループで行われます)。if文は次のように色を変換000000する000と、辞書を使用して、既知の色を交換してください。

ここにあります(;Pythonのヒントについては@undergroundmonorailに感謝します):

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].finally、あなたは行の途中で、例えば、あなたの空白の多くを失うことができますk = {> - k={return "color:- >return"color:
undergroundmonorail

また、PPCGへようこそ:)
地下

2
そのリテラルkは巨大です。すべてのカラーコードは小文字であり、すべての色の名前が大文字である、あなただけ、その後でそれを解析し、1つの文字列としてそれを書くことができるようre.findall()(そうも必要になりますimport re):pastebin.com/rQHqgxXS
manatwork

@undergroundmonorailそれをありがとう、多くのスペースを節約する必要があります:D
Toastrackenigma

@ mbomb007 OK、出力または入力がどのようにしたいのかよく分かりませんでした-そこで少し混乱しました:PIはテストケースでコードを実行して正常に動作することを確認しました、結果をアップロードしますか?
-Toastrackenigma

1

JavaScript(ES6)、499 611

編集質問にテストケースを追加しました

注:対応する16進数よりも短い色名のみを保持しました。

注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では機能せず、Chromeは完全に準拠していません(これを何度も繰り返すのは非常に疲れています)。Firefoxでテストします。
edc65
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.