Golf màu CSS!


25

Bạn là nhà phát triển web và sếp của bạn đã quyết định cập nhật trang web của công ty. Anh ấy đã quyết định rằng ít màu hơn là tốt hơn, nhưng anh ấy muốn trang web trông giống như vậy. Bạn chỉ quyết định rằng anh ta không biết anh ta đang nói về cái gì, nhưng dù sao bạn cũng sẽ thử, vì bạn đang chán. Vì công ty có hàng ngàn trang web và mỗi trang có CSS ​​riêng, bạn quyết định viết một tập lệnh để thực hiện các thay đổi cần thiết. Phân tích cú pháp HTML không bắt buộc.

Tất cả các trang hiện đang sử dụng một chuỗi như rgb(255,0,0)cho một màu. Đưa ra ba giá trị thập phân đại diện cho các giá trị RGB của thuộc tính màu CSS (theo thứ tự đó), trả về hoặc in biểu diễn chuỗi ngắn nhất của màu đó, sao cho có thể sử dụng CSS như vậy : color:<your-result-here>;.

Dưới đây là bảng đầy đủ các Từ khóa Màu CSS hợp lệ . Họ không nhạy cảm.

Ví dụ:

Lưu ý rằng màu sắc có thể được xác định bằng 12 hoặc 24 bit. Các mô hình #ABClà một phiên bản ngắn hơn của #AABBCC. Chuck Norris là một màu .

Chương trình của bạn sẽ chỉ nhận 3 số nguyên, không phải là một chuỗi (ngoại trừ "phần thưởng" được đề cập sau).

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)

Chấm điểm / nội quy

  • Mã ngắn nhất sẽ thắng!
  • Các sơ hở tiêu chuẩn không được phép , ngoại trừ tích hợp sẵn.
  • -50% byte (phần thưởng được làm tròn xuống) nếu bạn chấp nhận bất kỳ * bộ chọn màu hợp lệ nào và xuất ra ngắn nhất. Vì vậy, DarkSlateBlueđầu ra #483D8B, #F00đầu ra red, vv
    • * Điều này chỉ bao gồm RGB, mã hex và tên.
    • Lưu ý rằng một số màu sắc có tên thay thế do X11 (như FuchsiaMagenta, hay CyanAqua). Các tên thay thế được bao gồm trong danh sách được liên kết của Từ khóa màu CSS theo tiêu chuẩn W3.
  • CSS3 là Turing Complete . Đó sẽ là giá trị tiền thưởng.

Chỉnh sửa:

  • VUI LÒNG CHẠY MÃ CỦA BẠN TRÊN CÁC TRƯỜNG HỢP!



Có một câu trả lời muốn ghi điểm -50% tiền thưởng cũng cần phân tích hsl (...) không? Còn rgba (...) và hsla (...) thì sao? :)
Timwi

Theo liên kết này về màu sắc trong CSS, Trắng là # 000000. Làm thế nào bạn đến với #000? Và nếu ít hơn 6 chữ số được phép, tại sao không #0? w3schools.com/cssref/css_colors.asp ,, CSS
DavidC

2
@DavidCarraher Xem stackoverflow.com/q/8318911/791604 để được giải thích sâu hơn. Tôi nghi ngờ rất nhiều các câu trả lời ở đây đang thực sự không xuất ra màu sắc tối thiểu sẽ được thực hiện linh hoạt có sẵn trong các trình duyệt (nhưng được xuất ra màu sắc tối thiểu sẽ bằng spec được đưa ra trong câu hỏi ở đây).
Daniel Wagner

Câu trả lời:


5

Perl, 212 - 50% = 106 byte

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

Với dòng mới được thêm vào:

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

Các trường hợp thử nghiệm

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

Đầu ra

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

Perl, không có tiền thưởng, 144 byte

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

Với dòng mới được thêm vào:

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 không phải là một mô-đun cốt lõi, nhưng nó đã xuất hiện từ năm 2001. Bạn có thể cần cài đặt nó qua:

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

Biểu diễn hex được ưu tiên nếu tên màu có cùng độ dài.


Các trường hợp thử nghiệm

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;

Đầu ra

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

Bất kỳ cơ hội nào bạn có thể cắt giảm 4 byte cho cà vạt?
mbomb007

@ mbomb007 6 byte, trên thực tế.
Primo

Tôi có nghe thêm 4 không? Cuộc thi này là khó khăn.
mbomb007

1
@ mbomb007 tăng.
primo

10

C # 6 527 byte / 2 tiền thưởng = 264

EDIT: Woot! Cuối cùng tôi đã nhận được câu trả lời thưởng với số điểm thấp hơn câu trả lời cơ bản!

Tôi đã viết chỉ là một chức năng. Nó đòi hỏi một usingtuyên bố (bao gồm.)

C # có một danh sách đẹp các màu đã biết để làm việc, nhưng nó nhấn mạnh vào việc bao gồm cả kênh Alpha. Các màu đã biết cũng bao gồm tất cả các màu hệ thống, hai trong số đó có tên dài dưới 7 ký tự, vì vậy những màu này cần phải được loại bỏ.

Đây là giải pháp thưởng, hỗ trợ các định dạng như:

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

Chơi golf hoàn toàn:

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

Sự thụt lề và dòng mới cho rõ ràng:

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 byte

Đây là giải pháp cơ bản.

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

Sự thụt lề và dòng mới cho rõ ràng:

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: Mã làm việc cho tôi.
raznagul

8

Toán học 207 242 500-250 = 250 byte

Cập nhật:
Điều này hoạt động với các đầu vào bao gồm bộ ba rgb, tên màu hoặc số hex.

(12 bit) đầu ra độ sâu màu hiện hoạt động tốt, nhờ vào một bài viết xuất sắc về Giảm độ sâu bit màu . Ý tưởng cơ bản là, nếu một bộ ba RGB {r, g, b}, trong đó r, g và b nằm trong phạm vi 0-255, (tức là hex 00-ff) có thể được biểu diễn mà không bị mất như một số trong phạm vi 0-15 (tức là 0-f), sau đó người ta có thể sử dụng số hex 3 chữ số thay vì số 6 chữ số. Hóa ra điều này sẽ xảy ra bất cứ khi nào 17 (tức là 255/15) chia r, g và b.

Chỉ các chức năng tích hợp được sử dụng. Mathematica có các quy tắc để thay thế tên màu HTML bằng bộ ba RGB. Ví dụ, một quy tắc là "Teal"-> RGBColor[0, 128, 128]. Khi các quy tắc như vậy được đảo ngược, các giá trị rgb (được hiệu chỉnh lại cho phạm vi, {0, 255}) có thể được thay thế bằng tên màu.

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)

Ví dụ

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", "Đỏ", "Teal", "# 8b0000", "#fff", "# 483d8b", "#fffffe", "# f5f"}


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

{"Đỏ", "# 483c8b", "Teal", "# 000"}


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

{"# 000", "Đỏ", "Teal", "# 8b0000", "#fff", "# 483d8b", "#fffffe", \ "# f5f"}


Nhận xét, mã Ungolfed

(* quy tắc thay thế tên màu bằng mẫu màu, ví dụ: RGBColor{255,17,0}

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

(* quy tắc thay thế danh sách 3 số nguyên bằng tên màu tương ứng, nếu có tồn tại. Và các quy tắc tương tự, đã đảo ngược. *)

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

rulesColorsToLists=Reverse/@rulesListsToColorNames;

(* kiểm tra xem màu lục giác 24 bit có thể được biểu diễn dưới dạng màu 12 bit không bị mất hay không. reducecó thể thay đổi biểu thức 24 bit thành biểu thức 12 bit hay không. *)

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

(* Danh sách RGB đã thay đổi thành số Hex *)

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

(* Số hex đã thay đổi thành danh sách RGB. *)

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

(* Thêm chuyển đổi *)

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

(* chọn biểu thức CSS hợp lệ ngắn nhất có màu *)

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

(* chuyển đổi bất kỳ đầu vào nào thành danh sách RGB và gọi f *)

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

Không phải 255 trong cơ sở 10 bằng với FFCơ sở 16 sao? Vì vậy, nên làm #FFFFFF, mà dài hơn Trắng. Tôi thấy #000không bình thường nhưng chắc chắn sẽ xem xét các vấn đề về CSS.
DavidC

3
@DavidCarraher: Màu CSS có thể được chỉ định là 24 bit hoặc 12 bit. #FFFlà giống như #FFFFFF(tất cả các bit một) giống như white. Ngoài ra, #0không hợp lệ vì nó không phải là 24 bit hay 12 bit
slebetman

slebetman, Cảm ơn bạn đã làm rõ, xác nhận quan sát của @ mbomb007.
DavidC

5

CoffeeScript, 411 404 388 384 382/2 = 191

CẬP NHẬT: Khá chắc chắn đó là kết quả cuối cùng

Hy vọng, nó ổn để sử dụng window.document.*. Kiểm tra rgbchức năng và evalgọi.

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

Kết quả kiểm tra

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

Mã nhận xét

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

Điều này sẽ tiết kiệm một số byte.

    d = y = document.body

qHàm sẽ đặt màu đầu vào document.body.style.colorvà lấy màu được biên dịch thành rgb(...). Ngoài ra nó sẽ lưu trữ kết quả như hexColor:inputColortrong d. Thông báo evalsử dụng. rgb(100,100,100)là một lệnh gọi hàm JavaScript hợp lệ với ba đối số. rgbHàm sẽ chuyển đổi các đối số thành ký hiệu HEX 24/12 (như #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 )

Tách chuỗi thành mảng tên màu, tạo đối tượng tra cứu.

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

Và trả lại HEX nếu không có biến thể ngắn hơn trong d.

    return d[ r ] or r

4

Bút stylus, 238 234/2 = 117

Giải pháp giống CSS hơn! Bút stylus đã hỗ trợ rất nhiều cho thao tác màu sắc, vì vậy chức năng mong muốn là khá nhỏ và không được đánh gôn nhiều.

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

Kiểm tra nó ở đây

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

Chào mừng đến với PPCG! Đó là một giải pháp thực sự tốt đẹp!
mbomb007

không golfed rất nhiều . Tốt hơn hết bạn nên thử đánh gôn thêm nếu muốn giành chiến thắng. Ai đó đang đánh bạn bởi một.
mbomb007

@ mbomb007, được rồi, chơi gôn một chút.
argh-argh

Có vẻ như bạn đã bị đánh. Có lẽ bạn có thể thử nhồi nhét các màu lại với nhau mà không có khoảng trắng, nhưng được đệm thành năm ký tự, sau đó chia ra mỗi năm và cắt? Không chắc chắn nếu điều đó sẽ tiết kiệm byte?
mbomb007

3

Matlab 617

Rất nhiều tiền xử lý và mã hóa cứng. Tập hợp tối thiểu các tên màu bạn phải xem xét là những cái này. Quá tệ Matlab không được xây dựng trong tên màu = /

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

Bạn đã để lại mã hóa cứng r=0;g=16;b=0;ở đó, mặc dù nó không được tính vào điểm số của bạn.
Thực phẩm điện tử cầm tay

Ồ, tôi đã dán sai phiên bản, cảm ơn vì đã cho tôi biết!
flawr

2

Con trăn 3 857 795 byte

Phải chỉ định thủ công tất cả các màu được chấp nhận yêu cầu đã làm tăng số byte trên cái này: /

c(a)có một đối số, amà đến ở dạng rgb(#,#,#). Từ đó, rgb và ngoặc được loại bỏ và chuỗi sau đó được phân tách bằng dấu phẩy thành một mảng. c(x,y,z)mất 3 giá trị int, r, g và b của màu rgb để xử lý. Chúng tôi đặt những thứ đó lại với nhau trong một mảng a. Sau đó, chúng tôi sử dụng hexhàm dựng sẵn của Python để chuyển đổi số Cơ sở 10 thành số Cơ sở 16 trên mảng của chúng tôi và tạo chuỗi hex (điều này được thực hiện trong forvòng lặp). Các ifbáo cáo chuyển đổi màu sắc như 000000để 000, và thay thế các màu sắc được biết đến sử dụng một từ điển.

Đây là (nhờ @undergroundmonorail cho mẹo về ;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

Phiên bản cũ:

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

Có lẽ tôi sẽ thêm phần thưởng cho nó, tôi chưa biết. Nó chắc chắn có thể làm với 50% byte tắt!

-Đánh giá


2
mẹo chơi golf trăn nói chung: nhiều dòng mới của bạn có thể được thay thế bằng cách ;lưu lại vết lõm. ví dụ : a=a[4:-1].split(",");b="". bất kỳ if, else, for, while, vv khối với chỉ một dòng có thể được viết như if b in k:b=k[b].finally, bạn có thể mất rất nhiều khoảng trắng của bạn ở giữa dòng, ví dụ: k = {-> k={return "color:->return"color:
undergroundmonorail

cũng có, chào mừng bạn đến PPCG :)
undergroundmonorail

2
Nghĩa đen k là rất lớn. Vì tất cả các mã màu đều được viết thường và tất cả các tên màu đều được viết hoa, bạn chỉ có thể viết nó dưới dạng một chuỗi, sau đó phân tích nó bằng re.findall()(vì vậy cũng sẽ cần import re): pastebin.com/rQHqgxXS
manatwork 6/10/2015

@undergroundmonorail Cảm ơn bạn vì điều đó, nên tiết kiệm rất nhiều dung lượng: D
Toastrackenigma

@ mbomb007 OK, tôi không chắc bạn muốn đầu ra hoặc đầu vào như thế nào - có một chút nhầm lẫn ở đó: PI đã chạy mã trên các trường hợp thử nghiệm để đảm bảo nó hoạt động chính xác, bạn có muốn tôi tải lên kết quả của mình không?
Toastrackenigma

1

JavaScript (ES6), 499 611

Chỉnh sửa Đã thêm các trường hợp kiểm tra trong câu hỏi

Lưu ý: Tôi chỉ giữ các tên màu ngắn hơn tương đương hex.

Lưu ý 2: điều này chắc chắn có thể được đánh gôn nhiều hơn ...

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>

Ít chơi gôn

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
)

Những người gạch dưới đó theo tính của tôi, sẽ ngắn hơn nếu không có họ. Chỉ cần trích dẫn các mã bắt đầu bằng một chữ số và giữ cho các mã khác không được trích dẫn : {f00:"red";"008000":"green"}.
manatwork 06/10/2015

@manatwork lừa đẹp. Nhưng một đối tượng theo nghĩa đen hiếm khi là một lựa chọn tốt cho mã golf. Một chuỗi đơn giản là tốt hơn
edc65

Chính xác. Tôi đã thực hiện một nhận xét theo nghĩa đó cho sitemate mới của chúng tôi.
manatwork

1
@ mbomb007 Các trường hợp thử nghiệm được thêm vào. Đoạn mã sẽ không hoạt động trong chrome là EcmaScript 6 và Chrome không tuân thủ đầy đủ (khá mệt mỏi khi lặp lại điều này nhiều lần). Kiểm tra trong Firefox.
edc65
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.