Golf Warna CSS!

25

Anda adalah pengembang web, dan bos Anda telah memutuskan untuk memperbarui situs web perusahaan. Dia telah memutuskan bahwa lebih sedikit warna lebih baik, tetapi dia ingin situsnya terlihat sama. Anda benar-benar memutuskan bahwa dia tidak tahu apa yang dia bicarakan, tetapi Anda tetap akan mencoba, karena Anda bosan. Karena perusahaan memiliki ribuan halaman web, dan masing-masing memiliki CSS sendiri, Anda memutuskan untuk menulis skrip untuk melakukan perubahan yang diperlukan. Parsing HTML tidak diperlukan.

Semua halaman saat ini menggunakan string seperti rgb(255,0,0)untuk warna. Mengingat tiga nilai desimal mewakili nilai-nilai RGB dari atribut warna CSS (dalam urutan itu), kembali atau mencetak string representasi terpendek warna yang, seperti bahwa itu dapat digunakan untuk CSS seperti: color:<your-result-here>;.

Berikut adalah tabel lengkap Kata Kunci Warna CSS yang valid . Mereka tidak peka huruf besar-kecil.

Contoh:

Perhatikan bahwa warna dapat didefinisikan dengan 12 atau 24 bit. Polanya #ABCadalah versi lebih pendek dari #AABBCC. Chuck Norris adalah warna .

Program Anda hanya akan menerima 3 bilangan bulat, bukan string (dengan pengecualian "bonus" yang disebutkan kemudian).

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)

Penilaian / Aturan

  • Kode terpendek menang!
  • Celah standar tidak diijinkan , dengan pengecualian built-in.
  • -50% byte (bonus dibulatkan ke bawah) jika Anda menerima * pemilih warna yang valid dan menghasilkan yang terpendek. Begitu DarkSlateBluejuga dengan output #483D8B, #F00output red, dll.
    • * Ini hanya termasuk RGB, kode hex, dan nama.
    • Perhatikan bahwa beberapa warna memiliki nama alternatif karena X11 (seperti Fuchsiadan Magenta, atau Cyandan Aqua). Nama-nama alternatif termasuk dalam daftar tautan Kata Kunci Warna CSS sesuai dengan standar W3.
  • CSS3 adalah Turing Lengkap . Itu akan bernilai karunia.

Edit:

  • HARAP JALANKAN KODE ANDA DI TES CASES!
mbomb007
sumber
Apakah jawaban yang ingin mencetak bonus -50% perlu mengurai hsl (...) juga? Bagaimana dengan rgba (...) dan hsla (...)? :)
Timwi
Menurut tautan ini tentang warna dalam CSS, White adalah # 000000. Bagaimana Anda mengetahuinya #000? Dan jika kurang dari 6 digit diizinkan, mengapa tidak #0? w3schools.com/cssref/css_colors.asp ,, CSS
DavidC
2
@DavidCarraher Lihat stackoverflow.com/q/8318911/791604 untuk penjelasan mendalam. Saya akan menduga banyak dari jawaban di sini benar-benar tidak keluaran warna minimal akan dengan pelaksanaan fleksibel tersedia dalam browser (tapi yang keluaran warna minimal akan dengan spesifikasi yang diberikan dalam pertanyaan di sini).
Daniel Wagner

Jawaban:

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

Dengan baris baru ditambahkan:

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

Uji Kasus

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

Keluaran

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

Perl, tanpa bonus, 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||$_}

Dengan baris baru ditambahkan:

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 bukan modul inti, tetapi sudah ada sejak tahun 2001. Anda mungkin perlu menginstalnya melalui:

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

Representasi heksa lebih disukai jika nama warna memiliki panjang yang sama.


Uji Kasus

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;

Keluaran

#000
red
teal
#8b0000
#483d8b
#fffffe
#f5f
primo
sumber
Apakah Anda bisa memotong 4 byte untuk dasi?
mbomb007
@ mbomb007 6 byte, sebenarnya.
Primo
Apakah saya mendengar 4 lagi? Persaingan ini sangat sulit.
mbomb007
1
@mbomb007 kenaikan gaji.
Primo
10

C # 6 527 byte / 2 bonus = 264

EDIT: Woot! Saya akhirnya mendapat jawaban bonus dengan skor lebih rendah dari jawaban dasar!

Saya baru saja menulis fungsi. Itu membutuhkan usingpernyataan (termasuk.)

C # memiliki daftar warna yang bagus untuk dikerjakan, tetapi bersikeras untuk menyertakan saluran Alpha. Warna-warna yang diketahui juga mencakup semua warna sistem, dua di antaranya memiliki nama yang panjangnya kurang dari 7 karakter, jadi ini perlu dihilangkan.

Inilah solusi bonus, format pendukung seperti:

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

Benar-benar golf:

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

Lekukan dan baris baru untuk kejelasan:

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

Inilah solusi dasarnya.

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

Lekukan dan baris baru untuk kejelasan:

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;
}
Makanan Tangan
sumber
@ mbomb007: Kode ini berfungsi untuk saya.
raznagul
8

Mathematica 207 242 500-250 = 250 byte

Pembaruan:
Ini berfungsi dengan input yang terdiri dari rgb tiga kali lipat, nama warna, atau angka hex.

(12 bit) warna-kedalaman output sekarang berfungsi dengan baik, berkat artikel yang bagus tentang Pengurangan Kedalaman Warna Bit . Ide dasarnya adalah bahwa, jika RGB rangkap tiga {r, g, b}, di mana r, g, dan b berada dalam kisaran 0-255, (yaitu hex 00-ff) dapat direpresentasikan tanpa kehilangan sebagai angka dalam kisaran 0-15 (yaitu 0-f), maka seseorang dapat menggunakan nomor hex 3 digit, bukan 6 digit. Ternyata ini akan terjadi setiap kali 17 (yaitu 255/15) membagi r, g, dan b.

Hanya fungsi bawaan yang digunakan. Mathematica memiliki aturan untuk mengganti nama warna HTML dengan triples RGB. Misalnya, satu aturan "Teal"-> RGBColor[0, 128, 128]. Ketika aturan tersebut dibalik, nilai rgb (dikalibrasi ulang ke kisaran, {0, 255}) dapat diganti dengan nama warna.

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)

Contohnya

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


Mengomentari, Kode Tidak Terkunci

(* aturan untuk mengganti nama warna dengan contoh warna, mis RGBColor{255,17,0}

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

(* aturan untuk mengganti daftar 3 bilangan bulat dengan nama warna masing-masing, jika ada. Dan aturan yang sama, dibalik. *)

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

rulesColorsToLists=Reverse/@rulesListsToColorNames;

(* menguji apakah warna hex 24 bit dapat direpresentasikan sebagai warna 12 bit tanpa kehilangan. reduceDapat mengubah ekspresi 24 bit menjadi ekspresi 12 bit. *)

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

(* Daftar RGB diubah menjadi angka Hex *)

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

(* Nomor heks diubah menjadi daftar RGB. *)

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

(* Lebih banyak konversi *)

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

(* memilih ekspresi CSS valid terpendek dari suatu warna *)

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

(* Mengkonversi input apa saja ke dalam daftar RGB dan memanggil f *)

returnShortestColor[d_]:= 
 (If[StringQ[d],
   If[StringTake[d,1]=="#",
     e=fromHexToList@d,
     e=fromColorNameToList@d],
   e=d];
f@e)
DavidC
sumber
Bukankah 255 di base 10 sama dengan FFdi Base 16? Jadi itu harus dibuat #FFFFFF, yang lebih panjang dari Putih. Saya menemukan #000tidak biasa tetapi akan melihat keanehan CSS untuk memastikan.
DavidC
3
@ Davidvidarrarr: Warna CSS dapat ditentukan sebagai 24 bit atau 12 bit. #FFFsama dengan #FFFFFF(semua bit satu) yang sama dengan white. Juga, #0tidak valid karena bukan 24 bit atau 12 bit
slebetman
slebetman, Terima kasih atas klarifikasi, yang mengkonfirmasi pengamatan @ mbomb007.
DavidC
5

CoffeeScript, 411 404 388 384 382/2 = 191

UPD: Cukup yakin ini adalah hasil akhir

Harap, tidak apa-apa untuk digunakan window.document.*. Periksa rgbfungsi dan evalpanggilan.

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

Hasil tes

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

Kode yang dikomentari

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

Ini akan menghemat beberapa byte.

    d = y = document.body

qfungsi akan menempatkan warna input ke document.body.style.colordan mendapatkan warna yang dikompilasi sebagai rgb(...). Juga akan menyimpan hasil seperti hexColor:inputColorpada d. Perhatikan evalpenggunaan. rgb(100,100,100)adalah panggilan fungsi JavaScript yang valid dengan tiga argumen angka. rgbfunction akan mengonversi argumen menjadi notasi HEX 24/12 tunggal (seperti #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 )

Split string ke array nama warna, buat objek pencarian.

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

Dan kembalikan HEX jika tidak ada varian yang lebih pendek di d.

    return d[ r ] or r
argh-argh
sumber
4

Stylus, 238 234/2 = 117

Lebih banyak solusi seperti CSS! Stylus sudah memiliki dukungan besar untuk manipulasi warna, sehingga fungsi yang diinginkan cukup kecil dan tidak banyak golf.

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

Uji di sini

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))
argh-argh
sumber
Selamat datang di PPCG! Itu solusi yang sangat bagus!
mbomb007
tidak banyak bermain golf . Anda sebaiknya mencoba bermain golf lagi jika ingin menang. Seseorang memukulmu satu per satu.
mbomb007
@ mbomb007, oke, main golf sedikit.
argh-argh
Sepertinya Anda telah dipukuli. Mungkin Anda dapat mencoba menjejalkan warna bersama-sama tanpa spasi, tetapi diisi hingga lima karakter, lalu dibagi setiap lima dan langsing? Tidak yakin apakah itu akan menghemat byte?
mbomb007
3

Matlab 617

Banyak preprocessing dan hardcoding. Set minimal nama warna yang harus Anda pertimbangkan adalah ini. Sayang sekali Matlab tidak memiliki nama warna = /

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(:)']
cacat
sumber
Anda telah meninggalkan hardcode r=0;g=16;b=0;di sana, meskipun itu tidak dihitung dalam skor Anda.
Hand-E-Food
Oh, saya menempelkan versi yang salah, terima kasih telah memberi tahu saya!
flawr
2

Python 3, 857 795 byte

Harus secara manual menentukan semua warna yang diterima yang dibutuhkan memang meningkatkan jumlah byte yang satu ini: /

c(a)mengambil satu argumen,, ayang datang dalam bentuk rgb(#,#,#). Dari itu, rgb dan tanda kurung dihapus dan string kemudian dibagi dengan koma menjadi array. c(x,y,z)membutuhkan 3 int, nilai r, g dan b dari warna rgb untuk diproses. Kami menempatkan mereka bersama dalam sebuah array a. Kami kemudian menggunakan hexfungsi built-in Python yang mengubah nomor Base 10 ke nomor Base 16 pada array kami dan membuat string hex (ini dilakukan dalam forloop). The ifpernyataan mengkonversi warna seperti 000000untuk 000, dan mengganti warna dikenal menggunakan kamus.

Ini dia (terima kasih kepada @undergroundmonorail untuk tip tentang ;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 lama:

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

Mungkin saya akan menambahkan bonus untuk itu, saya belum tahu. Itu pasti bisa dilakukan dengan diskon 50% byte!

-Toastrackenigma

Toastrackenigma
sumber
2
tip golf python umum: banyak baris baru Anda dapat diganti dengan ;, menyimpan lekukan. misalnya: a=a[4:-1].split(",");b="". setiap if, else, for, while, dll blok dengan hanya satu baris dapat ditulis sebagai if b in k:b=k[b].finally, Anda dapat kehilangan banyak spasi Anda di tengah-tengah garis, misalnya k = {-> k={dan return "color:->return"color:
undergroundmonorail
juga, selamat datang di PPCG :)
undergroundmonorail
2
K literal itu sangat besar. Karena semua kode warna dalam huruf kecil dan semua nama warna dalam huruf besar, Anda bisa menuliskannya sebagai string tunggal, lalu parsing dengan re.findall()(jadi perlu import re): pastebin.com/rQHqgxXS
manatwork
@undergroundmonorail Terima kasih untuk itu, harus menghemat banyak ruang: D
Toastrackenigma
@ mbomb007 OK, saya tidak yakin bagaimana Anda ingin output atau input - agak bingung di sana: PI memang menjalankan kode pada kasus uji untuk memastikan itu berfungsi dengan baik, apakah Anda ingin saya mengunggah hasil saya?
Toastrackenigma
1

JavaScript (ES6), 499 611

Sunting Menambahkan kasus uji dalam pertanyaan

Catatan: Saya hanya menyimpan nama warna yang lebih pendek dari padanan hex.

Catatan 2: ini pasti bisa golf lebih ...

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>

Kurang 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
)
edc65
sumber
Itu menggarisbawahi ... Menurut penghitungan saya, akan lebih pendek tanpa mereka. Hanya mengutip kode dimulai dengan digit dan menjaga lain kuotasi: {f00:"red";"008000":"green"}.
manatwork
@manatwork trik yang bagus. Tetapi objek literal jarang merupakan pilihan yang baik untuk golf kode. Sebuah string sederhana lebih baik
edc65
Benar. Saya sudah membuat komentar dalam hal itu kepada sitemate baru kami.
manatwork
1
@ mbomb007 Test case ditambahkan. Cuplikan tidak akan berfungsi dalam chrome menjadi EcmaScript 6, dan Chrome tidak sepenuhnya sesuai (cukup lelah untuk mengulangi ini lagi dan lagi). Tes di Firefox.
edc65