CSS Color Golf!


25

คุณเป็นนักพัฒนาเว็บและหัวหน้าของคุณได้ตัดสินใจที่จะอัพเดทเว็บไซต์ของ บริษัท เขาตัดสินใจว่าสีที่น้อยลงจะดีกว่า แต่เขาต้องการให้เว็บไซต์มีสีเหมือนกัน คุณตัดสินใจอย่างยุติธรรมว่าเขาไม่รู้ว่าเขากำลังพูดถึงเรื่องอะไร แต่คุณจะลองต่อไปเพราะคุณเบื่อ เนื่องจาก บริษัท มีหน้าเว็บหลายพันหน้าและแต่ละอันมี CSS ของตัวเองคุณจึงตัดสินใจเขียนสคริปต์เพื่อทำการเปลี่ยนแปลงที่จำเป็น ไม่จำเป็นต้องแยกวิเคราะห์ HTML

หน้าทั้งหมดในปัจจุบันใช้สตริงที่ต้องการrgb(255,0,0)สี ป.ร. ให้ไว้สามค่าทศนิยมที่เป็นตัวแทนของค่า RGB ของแอตทริบิวต์สี CSS (ตามลำดับ) ผลตอบแทนหรือพิมพ์แทนสายที่สั้นที่สุดของสีที่เช่นว่ามันเป็นใช้งานได้สำหรับ CSS color:<your-result-here>;ชอบโดย:

นี่คือตารางคำสำคัญสี CSS ที่ถูกต้องทั้งหมด ตัวพิมพ์เล็กและตัวพิมพ์เล็ก

ตัวอย่าง:

โปรดทราบว่าสีสามารถกำหนดได้ด้วย 12 หรือ 24 บิต รูปแบบที่เป็นรุ่นสั้น#ABC เชย Norris เป็นสี#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 Color Keywords ที่เชื่อมโยงตามมาตรฐาน W3
  • CSS3 ทัวริงสมบูรณ์ นั่นจะคุ้มค่าเงิน

แก้ไข:

  • โปรดเรียกใช้รหัสของคุณในกรณีทดสอบ!

นี่คือคำถามที่เกี่ยวข้อง: codegolf.stackexchange.com/questions/13132/color-rgb-int-to-hex
mbomb007


คำตอบที่ต้องการคะแนนโบนัส -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สำหรับคำอธิบายในเชิงลึก ฉันจะสงสัยว่าหลายคำตอบที่นี่เป็นจริงไม่ได้แสดงผลสีน้อยที่สุดไปด้วยการดำเนินงานที่มีความยืดหยุ่นที่มีอยู่ในเบราว์เซอร์ ( แต่มีการแสดงผลสีน้อยที่สุดไปด้วยสเปคที่กำหนดในคำถามที่นี่)
Daniel Wagner

คำตอบ:


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 ไม่ใช่โมดูลหลัก แต่มีมาตั้งแต่ปี 2544 คุณอาจต้องติดตั้งผ่าน:

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

ควรใช้การแทน hex หากชื่อสีมีความยาวเท่ากัน


กรณีทดสอบ

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 เพิ่ม
primo

10

C # 6 527 bytes / 2 bonus = 264

แก้ไข:วุ้ย! ในที่สุดฉันก็ได้คำตอบโบนัสด้วยคะแนนต่ำกว่าคำตอบพื้นฐาน!

ฉันเขียนแค่ฟังก์ชั่น มันต้องมีusingคำสั่ง (รวม.)

C # มีรายการสีที่รู้จักให้ใช้งานได้ดี แต่มันยังยืนยันในการรวมช่องอัลฟ่า สีที่รู้จักนั้นรวมถึงสีของระบบทั้งหมดซึ่งสองสีนี้มีชื่อที่มีความยาวน้อยกว่า 7 ตัวอักษรดังนั้นสิ่งเหล่านี้จำเป็นต้องถูกแยกออก

นี่คือโซลูชันโบนัสซึ่งรองรับรูปแบบเช่น:

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

golfed สมบูรณ์:

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 บิต) เอาท์พุทสีเชิงลึกตอนนี้ทำงานได้ดีขอบคุณบทความดีในสี Bit ลดความลึก แนวคิดพื้นฐานคือถ้า RGB สาม {r, g, b} โดยที่ r, g และ b อยู่ในช่วง 0-255, (เช่น hex 00-ff) สามารถแสดงโดยไม่มีการสูญเสียเป็นจำนวนใน ช่วง 0-15 (เช่น 0-f) จากนั้นหนึ่งอาจใช้เลขฐานสิบหก 3 หลักแทนหมายเลข 6 หลัก ปรากฎว่าสิ่งนี้จะเกิดขึ้นเมื่อใดก็ตามที่ 17 (เช่น 255/15) หาร r, g และ b

ใช้ฟังก์ชั่นในตัวเท่านั้น Mathematica มีกฎสำหรับการแทนที่ชื่อสี HTML ด้วย triples 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", "Red", "Teal", "# 8b0000", "#fff", "# 483d8b", "#fffffe", "# f5f"}


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

{"Red", "# 483c8b", "Teal", "# 000"}


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

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


แสดงความคิดเห็นรหัส Ungolfed

(* กฎสำหรับการเปลี่ยนชื่อสีด้วยแถบสีเช่น 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;

(* ทดสอบว่าสี hex 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 เพิ่มเติม! สไตลัสมีการรองรับการปรับแต่งสีอยู่แล้วดังนั้นฟังก์ชั่นที่ต้องการจึงค่อนข้างเล็กและไม่กอล์ฟมาก

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 เอาล่ะ golfed นิดหน่อย
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 ints, ค่า r, g และ b ของสี rgb ที่จะประมวลผล aเราใส่กันผู้ที่อยู่ในอาร์เรย์ จากนั้นเราจะใช้งูหลามของในตัวhexฟังก์ชั่นซึ่งจะแปลงจำนวนฐาน 10 จำนวน 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% ไบต์ปิดแน่นอน!

-Toastrackenigma


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

2
ตัวอักษร k นั้นใหญ่มาก เนื่องจากรหัสสีทั้งหมดเป็นตัวพิมพ์เล็กและชื่อสีทั้งหมดเป็นตัวพิมพ์ใหญ่คุณสามารถเขียนมันเป็นสตริงเดียวแล้วแยกวิเคราะห์ด้วยre.findall()(ดังนั้นจะต้องมีimport re): pastebin.com/rQHqgxXS
จัดการ

@undergroundmonorail ขอบคุณที่ควรประหยัดพื้นที่มาก: D
Toastrackenigma

@ mbomb007 ตกลงฉันไม่แน่ใจว่าคุณต้องการให้เอาท์พุทหรืออินพุต - สับสนเล็กน้อยที่นั่น: PI รันโค้ดในกรณีทดสอบเพื่อให้แน่ใจว่าทำงานได้อย่างถูกต้องคุณต้องการให้ฉันอัปโหลดผลลัพธ์ของฉันหรือไม่
Toastrackenigma

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>

น้อย golfed

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 เพิ่มกรณีทดสอบ ข้อมูลโค้ดจะไม่ทำงานใน chrome ที่เป็น EcmaScript 6 และ Chrome ไม่เข้ากันได้อย่างสมบูรณ์ (ค่อนข้างเหนื่อยที่จะทำซ้ำซ้ำแล้วซ้ำอีก) ทดสอบใน Firefox
edc65
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.