CSS Color Golf!

25

Jesteś programistą, a twój szef postanowił zaktualizować witrynę firmy. Zdecydował, że mniej kolorów jest lepsze, ale chce, aby strona wyglądała tak samo. Słusznie decydujesz, że nie ma pojęcia, o czym on mówi, ale i tak spróbujesz, bo się nudzisz. Ponieważ firma ma tysiące stron internetowych, a każda z nich ma własny CSS, decydujesz się napisać skrypt, aby wprowadzić niezbędne zmiany. Analiza HTML nie jest wymagana.

Wszystkie strony obecnie używają ciągów jak rgb(255,0,0)dla koloru. Biorąc pod uwagę te trzy wartości dziesiętnych reprezentujące wartości RGB koloru atrybutu CSS (w tej kolejności), zwrot lub wydrukować najkrótszą reprezentację ciąg tego koloru, tak że jest to użyteczny dla CSS tak: color:<your-result-here>;.

Oto pełna tabela prawidłowych słów kluczowych w kolorze CSS . Nie uwzględniają wielkości liter.

Przykłady:

Należy pamiętać, że kolory można zdefiniować za pomocą 12 lub 24 bitów. Wzór #ABCjest krótszą wersją #AABBCC. Chuck Norris to kolor .

Twój program przyjmie tylko 3 liczby całkowite, a nie ciąg znaków (z wyjątkiem „bonusu” wspomnianego później).

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)

Punktacja / zasady

  • Najkrótszy kod wygrywa!
  • Standardowe luki są niedozwolone , z wyjątkiem wbudowanych.
  • -50% bajtów (premia jest zaokrąglana w dół), jeśli zaakceptujesz dowolny * prawidłowy selektor kolorów i wydasz najkrótszy. Tak DarkSlateBlueby wyjście #483D8B, #F00wyjścia reditp.
    • * Dotyczy to tylko RGB, kodów szesnastkowych i nazw.
    • Zauważ, że niektóre kolory mają alternatywne nazwy z powodu X11 (jak Fuchsiai Magenta, lub Cyani Aqua). Alternatywne nazwy znajdują się na połączonej liście słów kluczowych w kolorze CSS zgodnie ze standardem W3.
  • CSS3 jest Turing Complete . To byłoby warte nagrody.

Edytować:

  • PROSZĘ URUCHOMIĆ SWÓJ KOD NA PRZYPADKACH TESTOWYCH!
mbomb007
źródło
Czy odpowiedź, która chce zdobyć bonus -50%, również musi parsować hsl (...)? Co z rgba (...) i hsla (...)? :)
Timwi
Zgodnie z tym linkiem dotyczącym kolorów w CSS, biały to # 000000. Jak wymyśliłeś #000? A jeśli dozwolone jest mniej niż 6 cyfr, dlaczego nie #0? w3schools.com/cssref/css_colors.asp , CSS
DavidC
2
@DavidCarraher Szczegółowe informacje można znaleźć na stackoverflow.com/q/8318911/791604 . Podejrzewam wiele odpowiedzi tutaj faktycznie nie transmitują minimalne kolory Przechodzenie przez elastycznego wdrażania dostępnych w przeglądarkach (ale wyprowadzanie minimalne kolory jadąc specyfikacji podanej w pytaniu tutaj).
Daniel Wagner,

Odpowiedzi:

5

Perl, 212–50% = 106 bajtów

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

Z dodanymi znakami nowej linii:

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

Przypadki testowe

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

Wydajność

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

Perl, bez premii, 144 bajty

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

Z dodanymi znakami nowej linii:

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 nie jest modułem podstawowym, ale istnieje już od 2001 roku. Może być konieczne zainstalowanie go przez:

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

Reprezentacja szesnastkowa jest preferowana, jeśli nazwa koloru ma tę samą długość.


Przypadki testowe

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;

Wydajność

#000
red
teal
#8b0000
#483d8b
#fffffe
#f5f
primo
źródło
Czy jest szansa, że ​​uda ci się odciąć 4 bajty na remis?
mbomb007,
@ mbomb007 6 bajtów, w rzeczywistości.
primo,
Czy słyszę jeszcze 4? Ta konkurencja jest trudna.
mbomb007,
1
@ mbomb007 raise.
primo
10

C # 6 527 bajtów / 2 bonus = 264

EDYCJA: Woot! W końcu dostałem odpowiedź bonusową z niższym wynikiem niż odpowiedź podstawowa!

Napisałem tylko funkcję. Wymaga usingoświadczenia (w zestawie).

C # ma ładną listę znanych kolorów do pracy, ale nalega na włączenie kanału Alpha. Znane kolory obejmują również wszystkie kolory systemowe, z których dwa mają nazwy o długości mniejszej niż 7 znaków, więc trzeba je było usunąć.

Oto rozwiązanie premiowe, obsługujące formaty takie jak:

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

Całkowicie grał w golfa:

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

Wcięcia i nowe linie dla przejrzystości:

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 bajtów

Oto podstawowe rozwiązanie.

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

Wcięcia i nowe linie dla przejrzystości:

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;
}
Hand-E-Food
źródło
@ mbomb007: Kod działa dla mnie.
raznagul
8

Mathematica 207 242 500-250 = 250 bajtów

Aktualizacja:
Działa z danymi wejściowymi składającymi się z potrójnych rgb, nazw kolorów lub liczb szesnastkowych.

(12-bitowa) głębia kolorów działa teraz dobrze dzięki doskonałemu artykułowi na temat zmniejszania głębi kolorów . Podstawową ideą jest to, że jeśli potrójne RGB {r, g, b}, gdzie r, g ib mieszczą się w zakresie 0-255, (tj. Hex 00-ff) można przedstawić bez strat jako liczbę w w zakresie 0-15 (tj. 0-f), wówczas można użyć 3-cyfrowej liczby szesnastkowej zamiast 6-cyfrowej liczby. Okazuje się, że nastąpi to za każdym razem, gdy 17 (tj. 255/15) dzieli r, g i b.

Używane są tylko funkcje wbudowane. Mathematica ma zasady zastępowania nazw kolorów HTML potrójnymi RGB. Na przykład jedna reguła to "Teal"-> RGBColor[0, 128, 128]. Gdy takie reguły zostaną odwrócone, wartości rgb (ponownie skalibrowane do zakresu {0, 255}) można zastąpić nazwami kolorów.

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)

Przykłady

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”, „Czerwony”, „Teal”, „# 8b0000”, „#fff”, „# 483d8b”, „#fffffe”, „# f5f”}


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

{„Czerwony”, „# 483c8b”, „Teal”, „# 000”}


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

{„# 000”, „Czerwony”, „Teal”, „# 8b0000”, „#fff”, „# 483d8b”, „#fffffe”, \ „# f5f”}


Skomentowane, kod nieprzygotowany

(* zasady zastępowania nazwy koloru próbką koloru, np RGBColor{255,17,0}

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

(* zasady zastępowania listy 3 liczb całkowitych odpowiednim kolorem, jeśli taki istnieje. I te same zasady, odwrócone. *)

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

rulesColorsToLists=Reverse/@rulesListsToColorNames;

(* sprawdza, czy 24-bitowy kolor heksadecymalny może być reprezentowany jako 12-bitowy kolor bez strat. reducemoże zmienić 24-bitowe wyrażenie na 12-bitowe. *)

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

(* Lista RGB zmieniona na liczbę szesnastkową *)

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

(* Numer szesnastkowy zmieniono na listę RGB. *)

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

(* Więcej konwersji *)

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

(* wybiera najkrótsze prawidłowe wyrażenie CSS koloru *)

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

(* konwertuje dowolne dane wejściowe na listę RGB i wywołuje f *)

returnShortestColor[d_]:= 
 (If[StringQ[d],
   If[StringTake[d,1]=="#",
     e=fromHexToList@d,
     e=fromColorNameToList@d],
   e=d];
f@e)
DavidC
źródło
Czy 255 w bazie 10 nie jest równe FFw bazie 16? To powinno zrobić #FFFFFF, co jest dłuższe niż białe. Jestem znalezienie #000niezwykłe, ale będzie zajrzeć do dziwactw CSS aby się upewnić.
DavidC,
3
@DavidCarraher: Kolory CSS można określić jako 24 bity lub 12 bitów. #FFFjest taki sam jak #FFFFFF(wszystkie bity jeden), który jest taki sam jak white. Ponadto #0jest nieważny, ponieważ nie ma 24 bitów ani 12 bitów
slebetman
slebetman, dzięki za wyjaśnienie, które potwierdza obserwację @ mbomb007.
DavidC,
5

CoffeeScript, 411 404 388 384 382/2 = 191

UPD: Jestem pewien, że to wynik końcowy

Mam nadzieję, że można używać window.document.*. Sprawdź rgbfunkcję i evalzadzwoń.

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

Wyniki testów

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

Skomentowany kod

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

Pozwoli to zaoszczędzić niektóre bajty.

    d = y = document.body

qfunkcja umieści kolor wejściowy document.body.style.colori uzyska kolor skompilowany jako rgb(...). Również zapisze wynik jak hexColor:inputColorw d. Zauważ evalużycie. rgb(100,100,100)jest poprawnym wywołaniem funkcji JavaScript z trzema argumentami liczbowymi. rgbfunkcja konwertuje argumenty na pojedynczą notację HEX 24/12 (jak #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 )

Podziel ciąg znaków na tablicę nazw kolorów, utwórz obiekt odnośnika.

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

I wróć HEX, jeśli nie ma krótszego wariantu w d.

    return d[ r ] or r
argh-argh
źródło
4

Rysik, 238 234/2 = 117

Więcej rozwiązań podobnych do CSS! Rysik ma już doskonałą obsługę manipulacji kolorami, więc pożądana funkcja jest dość mała i nie gra w golfa zbyt często.

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

Sprawdź to tutaj

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
źródło
Witamy w PPCG! To naprawdę miłe rozwiązanie!
mbomb007,
nie grałem dużo w golfa . Lepiej spróbuj pograć w golfa, jeśli chcesz wygrać. Ktoś cię bije po jednym.
mbomb007,
@ mbomb007, w porządku, trochę grałem w golfa.
argh-argh
Wygląda na to, że zostałeś pobity. Może możesz spróbować wcisnąć kolory bez spacji, ale uzupełnić do pięciu znaków, a następnie podzielić co pięć i przyciąć? Nie jesteś pewien, czy to by oszczędzało bajty?
mbomb007
3

Matlab 617

Dużo wstępnego przetwarzania i kodowania. Oto minimalny zestaw nazw kolorów, które należy wziąć pod uwagę . Szkoda, że ​​Matlab nie ma wbudowanych nazw kolorów = /

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(:)']
wada
źródło
Zostawiłeś tam zakodowane na stałe r=0;g=16;b=0;, choć nie jest to uwzględniane w twoim wyniku.
Hand-E-Food,
Och, wkleiłem niewłaściwą wersję, dziękuję za informację!
flawr
2

Python 3, 857 795 bajtów

Konieczność ręcznego określenia wszystkich wymaganych akceptowanych kolorów zwiększyła liczbę bajtów na tym: /

c(a)przyjmuje jeden argument, aktóry ma postać rgb(#,#,#). Z tego rgb i nawiasy są usuwane, a następnie ciąg jest dzielony przecinkami na tablicę. c(x,y,z)do przetworzenia przyjmuje 3 wartości int, wartości r, g ib koloru rgb. Umieściliśmy je razem w tablicy a. Następnie używamy wbudowanej hexfunkcji Pythona, która konwertuje liczbę Base 10 na liczbę Base 16 w naszej tablicy i tworzy ciąg szesnastkowy (odbywa się to w forpętli). Te ifstwierdzenia konwersji kolorów jak 000000na 000i zastąpić znane kolorów przy użyciu słownika.

Oto on (dzięki @undergroundmonorail za wskazówkę ;w Pythonie):

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

Stara wersja:

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

Może dodam do tego bonus, jeszcze nie wiem. To może zdecydowanie zrobić z 50% mniej bajtów!

-Toastrackenigma

Toastrackenigma
źródło
2
ogólne wskazówki dotyczące gry w golfa w Pythonie: wiele nowych linii można zastąpić ;, zapisując wcięcie. na przykład: a=a[4:-1].split(",");b="". każdy if, else, for, while, itd blok z tylko jednej linii może być zapisana jako if b in k:b=k[b].finally, można stracić dużo swojej spacji w środku linii, na przykład k = {-> k={a return "color:->return"color:
undergroundmonorail
witamy również w PPCG :)
undergroundmonorail
2
Ten dosłowny k jest ogromny. Ponieważ wszystkie kody kolorów są pisane małymi literami, a wszystkie nazwy kolorów pisane są wielkimi literami, możesz po prostu napisać go jako pojedynczy ciąg, a następnie parsować za pomocą re.findall()(tak też będzie potrzebne import re): pastebin.com/rQHqgxXS
manatwork
@undergroundmonorail Dzięki za to, powinno zaoszczędzić dużo miejsca: D
Toastrackenigma
@ mbomb007 OK, nie byłem do końca pewien, jak chcesz uzyskać dane wyjściowe lub wejściowe - trochę się tam pomyliłem: PI uruchomił kod na testach, aby upewnić się, że działa poprawnie, czy chcesz, żebym przesłał moje wyniki?
Toastrackenigma
1

JavaScript (ES6), 499 611

Edytuj Dodano przypadki testowe do pytania

Uwaga: zachowałem tylko nazwy kolorów, które są krótsze niż odpowiednik heksadecymalny.

Uwaga 2: na pewno można w nią grać w golfa więcej ...

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>

Mniej golfa

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
źródło
Te podkreślenia… Według moich obliczeń byłyby krótsze bez nich. Wystarczy przytoczyć kody zaczynające się od cyfry i zachować pozostałe cytowane: {f00:"red";"008000":"green"}.
manatwork
@manatwork nice trick. Ale dosłowny przedmiot rzadko jest dobrym wyborem dla golfa kodowego. Prosty ciąg jest lepszy
edc65
Poprawny. W tym sensie skomentowałem już naszą świeżą stronę.
manatwork
1
@ mbomb007 Dodano przypadki testowe. Fragment nie będzie działał w Chrome jako EcmaScript 6, a Chrome nie jest w pełni zgodny (dość zmęczony powtarzaniem tego wielokrotnie). Przetestuj w przeglądarce Firefox.
edc65,