CSS Farbgolf!

25

Sie sind Webentwickler und Ihr Chef hat beschlossen, die Website des Unternehmens zu aktualisieren. Er hat entschieden, dass weniger Farbe besser ist, aber er möchte, dass die Site gleich aussieht. Sie entscheiden zu Recht, dass er keine Ahnung hat, wovon er spricht, aber Sie werden es trotzdem versuchen, weil Sie sich langweilen. Da das Unternehmen über Tausende von Webseiten verfügt und jede über ein eigenes CSS verfügt, entscheiden Sie sich, ein Skript zu schreiben, um die erforderlichen Änderungen vorzunehmen. Parsing von HTML nicht erforderlich.

Alle Seiten verwenden derzeit eine Zeichenfolge wie rgb(255,0,0)für eine Farbe. Angesichts der drei Dezimalzahlen , die die RGB - Werte eines CSS - Farbattribut (in dieser Reihenfolge), Rückgabe oder drucken Sie die kürzeste String - Darstellung dieser Farbe, so dass es für CSS verwendbar ist wie so: color:<your-result-here>;.

Hier finden Sie eine vollständige Tabelle der gültigen CSS-Farbschlüsselwörter . Sie sind unabhängig von Groß- und Kleinschreibung.

Beispiele:

Beachten Sie, dass Farben mit 12 oder 24 Bit definiert werden können. Das Muster #ABCist eine kürzere Version von #AABBCC. Chuck Norris ist eine Farbe .

Ihr Programm akzeptiert nur 3 Ganzzahlen, keine Zeichenfolge (mit Ausnahme des später erwähnten "Bonus" ).

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)

Wertung / Regeln

  • Kürzester Code gewinnt!
  • Standard-Schlupflöcher sind mit Ausnahme der eingebauten nicht zulässig.
  • -50% Bytes (der Bonus wird abgerundet), wenn Sie eine gültige * Farbauswahl akzeptieren und die kürzeste ausgeben. So DarkSlateBluewürde ausgeben #483D8B, #F00Ausgänge redusw.
    • * Dies schließt nur RGB, Hex-Codes und Namen ein.
    • Beachten Sie, dass einige Farben aufgrund von X11 alternative Namen haben (wie Fuchsiaund Magenta, oder Cyanund Aqua). Die alternativen Namen sind in der verknüpften Liste der CSS-Farbschlüsselwörter gemäß dem W3-Standard enthalten.
  • CSS3 ist Turing Complete . Das wäre ein Kopfgeld wert.

Bearbeiten:

  • BITTE LAUFEN SIE IHREN CODE AUF DEN TESTFÄLLEN!
mbomb007
quelle
Hier ist eine verwandte Frage: codegolf.stackexchange.com/questions/13132/color-rgb-int-to-hex
mbomb007
Muss eine Antwort, die den Bonus von -50% erzielen möchte, auch hsl (...) analysieren? Was ist mit rgba (...) und hsla (...)? :)
Timwi
Laut diesem Link zu Farben in CSS ist Weiß # 000000. Wie bist du darauf gekommen #000? Und wenn weniger als 6 Stellen zulässig sind, warum nicht #0? w3schools.com/cssref/css_colors.asp , die CSS
DavidC
2
@DavidCarraher Eine ausführliche Erläuterung finden Sie unter stackoverflow.com/q/8318911/791604 . Ich würde hier viele Antworten vermuten , sind eigentlich nicht ausgibt minimale Farben durch die flexible Implementierung in Browsern gehen (aber sind die Ausgabe minimal Farben durch die Spezifikation in der Frage hier gegeben zu gehen).
Daniel Wagner

Antworten:

5

Perl, 212 - 50% = 106 Bytes

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

Mit hinzugefügten Zeilenumbrüchen:

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

Testfälle

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

Ausgabe

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

Perl, kein Bonus, 144 Bytes

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

Mit hinzugefügten Zeilenumbrüchen:

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 ist kein Kernmodul, aber es gibt es seit 2001. Möglicherweise müssen Sie es installieren über:

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

Die hexadezimale Darstellung wird bevorzugt, wenn der Farbname dieselbe Länge hat.


Testfälle

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;

Ausgabe

#000
red
teal
#8b0000
#483d8b
#fffffe
#f5f
primo
quelle
Gibt es eine Chance, dass Sie 4 Bytes für die Krawatte abschneiden könnten?
mbomb007
@ mbomb007 Tatsächlich 6 Bytes.
Primo
Höre ich noch 4? Dieser Wettbewerb ist hart.
mbomb007
1
@ mbomb007 erhöhen.
Primo
10

C # 6 527 Bytes / 2 Bonus = 264

EDIT: Woot! Ich habe endlich die Bonusantwort mit einer niedrigeren Punktzahl als die Basisantwort bekommen!

Ich habe nur eine Funktion geschrieben. Es erfordert eine usingErklärung (enthalten.)

C # verfügt über eine schöne Liste bekannter Farben, besteht jedoch darauf, den Alpha-Kanal einzuschließen. Die bekannten Farben umfassen auch alle Systemfarben, von denen zwei Namen weniger als 7 Zeichen lang sind, so dass diese entfernt werden mussten.

Hier ist die Bonuslösung, die folgende Formate unterstützt:

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

Vollständig golfen:

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

Einrückung und neue Zeilen für Klarheit:

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 Bytes

Hier ist die Grundlösung.

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

Einrückung und neue Zeilen für Klarheit:

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
quelle
@ mbomb007: Der Code funktioniert bei mir.
Raznagul
8

Mathematica 207 242 500-250 = 250 Bytes

Update:
Dies funktioniert mit Eingaben, die aus RGB-Tripeln, Farbnamen oder Hex-Zahlen bestehen.

Die Farbtiefenausgabe (12 Bit) funktioniert jetzt dank eines hervorragenden Artikels zur Farbtiefenreduzierung einwandfrei . Die Grundidee ist, dass, wenn ein RGB-Tripel {r, g, b}, wobei r, g und b im Bereich von 0-255 liegen (dh hex 00-ff), ohne Verlust als Zahl in dargestellt werden kann Wenn der Bereich 0-15 (dh 0-f) ist, kann man die 3-stellige Hex-Zahl anstelle der 6-stelligen Zahl verwenden. Es stellt sich heraus, dass dies immer dann der Fall ist, wenn 17 (dh 255/15) r, g und b dividiert.

Es werden nur integrierte Funktionen verwendet. Mathematica hat Regeln zum Ersetzen von HTML-Farbnamen durch RGB-Tripel. Zum Beispiel ist eine Regel "Teal"-> RGBColor[0, 128, 128]. Wenn solche Regeln invertiert werden, können RGB-Werte (neu kalibriert auf den Bereich {0, 255}) durch Farbnamen ersetzt werden.

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)

Beispiele

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", "Rot", "Türkis", "# 8b0000", "#fff", "# 483d8b", "#fffffe", "# f5f"}


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

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


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

{"# 000", "Rot", "Türkis", "# 8b0000", "#fff", "# 483d8b", "#fffffe", \ "# f5f"}


Kommentiert, Ungolfed Code

(* Regeln zum Ersetzen eines Farbnamens durch ein Farbfeld, z RGBColor{255,17,0}

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

(* Regeln zum Ersetzen einer Liste mit 3 ganzen Zahlen durch den jeweiligen Farbnamen, falls vorhanden. Und die gleichen Regeln, umgekehrt. *)

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

rulesColorsToLists=Reverse/@rulesListsToColorNames;

(* testet, ob eine 24-Bit-Hex-Farbe verlustfrei als 12-Bit-Farbe dargestellt werden kann. reduceKann den 24-Bit-Ausdruck in einen 12-Bit-Ausdruck ändern. *)

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

(* RGB-Liste in eine Hex-Nummer geändert *)

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

(* Hex-Nummer in RGB-Liste geändert. *)

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

(* Weitere Conversions *)

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

(* wählt den kürzesten gültigen CSS-Ausdruck einer Farbe *)

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

(* konvertiert jede Eingabe in eine RGB-Liste und ruft f *)

returnShortestColor[d_]:= 
 (If[StringQ[d],
   If[StringTake[d,1]=="#",
     e=fromHexToList@d,
     e=fromColorNameToList@d],
   e=d];
f@e)
DavidC
quelle
Ist 255 in Basis 10 nicht gleich 255 in Basis FF16? Also sollte das machen #FFFFFF, was länger ist als Weiß. Ich finde es #000ungewöhnlich, werde mich aber mit den Macken von CSS befassen, um sicherzugehen.
DavidC
3
@DavidCarraher: CSS-Farben können mit 24 Bit oder 12 Bit angegeben werden. #FFFist dasselbe wie #FFFFFF(alle Bits eins), was dasselbe ist wie white. Auch #0ist ungültig, weil es weder 24-Bit noch 12-Bit ist
slebetman
slebetman, Danke für die Klarstellung, die die Beobachtung von @ mbomb007 bestätigt.
DavidC
5

CoffeeScript, 411 404 388 384 382/2 = 191

UPD: Ich bin mir ziemlich sicher, dass es das Endergebnis ist

Hoffe, es ist okay zu benutzen window.document.*. rgbFunktion prüfen und evalanrufen.

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

Testergebnisse

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

Kommentierter Code

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

Dies spart einige Bytes.

    d = y = document.body

qDie Funktion platziert die Eingabefarbe zu document.body.style.colorund erhält die kompilierte Farbe als rgb(...). Auch wird das Ergebnis wie hexColor:inputColorin gespeichert d. Beachten Sie die evalVerwendung. rgb(100,100,100)ist ein gültiger JavaScript-Funktionsaufruf mit drei Zahlenargumenten. rgbDie Funktion konvertiert Argumente in eine einzelne 24/12-HEX-Notation (like #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 )

Teilen Sie die Zeichenfolge in ein Array mit Farbnamen, und erstellen Sie ein Suchobjekt.

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

Und zurück HEX, wenn keine kürzere Variante in d.

    return d[ r ] or r
Argh-Argh
quelle
4

Stylus, 238 234/2 = 117

Mehr CSS-ähnliche Lösung! Der Stylus bietet bereits eine hervorragende Unterstützung für die Farbmanipulation, sodass die gewünschte Funktion recht klein ist und nicht viel Golf spielt.

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

Teste es hier

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
quelle
Willkommen bei PPCG! Das ist eine wirklich schöne Lösung!
mbomb007
nicht viel golfen . Wenn Sie gewinnen möchten, sollten Sie versuchen, noch mehr Golf zu spielen. Jemand schlägt dich um eins.
mbomb007
@ mbomb007, okay, ein bisschen golfen.
Argh-Argh
Es sieht so aus, als wären Sie geschlagen worden. Vielleicht können Sie versuchen, die Farben ohne Leerzeichen zusammenzufassen, aber mit fünf Zeichen auffüllen, dann alle fünf aufteilen und zuschneiden? Nicht sicher, ob das Bytes sparen würde?
mbomb007
3

Matlab 617

Viel Vorverarbeitung und Hardcoding. Die minimale Menge an Farbnamen, die Sie berücksichtigen müssen, sind diese. Schade, dass Matlab keine Farbnamen eingebaut hat = /

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(:)']
Fehler
quelle
Sie haben den Code r=0;g=16;b=0;dort belassen , obwohl er nicht in Ihrer Punktzahl enthalten ist.
Hand-E-Food
Oh, ich habe die falsche Version eingefügt, danke, dass du mich informiert hast!
Fehler
2

Python 3, 857 795 Bytes

Wenn alle akzeptierten Farben manuell angegeben werden mussten, erhöhte sich die Anzahl der Bytes für diese: /

c(a)nimmt ein Argument, adas in Form von kommt rgb(#,#,#). Daraus werden das rgb und die eckigen Klammern entfernt und die Zeichenfolge wird dann durch Kommas in ein Array aufgeteilt. c(x,y,z)Es werden 3 Zoll benötigt, um die Werte für r, g und b der RGB-Farbe zu verarbeiten. Wir fügen diese in einem Array zusammen a. Wir verwenden dann die in Python integrierte hexFunktion, die eine Zahl der Basis 10 in eine Zahl der Basis 16 in unserem Array umwandelt und eine Hex-Zeichenfolge erstellt (dies erfolgt in der forSchleife). Die ifAnweisungen konvertieren Farben 000000nach 000und ersetzen die bekannten Farben durch ein Wörterbuch.

Hier ist es (danke an @undergroundmonorail für den Tipp ;in 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

Alte Version:

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

Vielleicht füge ich den Bonus hinzu, ich weiß es noch nicht. Es könnte definitiv mit 50% Bytes auskommen!

-Toastrackenigma

Toastrackenigma
quelle
2
Allgemeine Python-Golftipps: Viele Ihrer Zeilenumbrüche können durch ersetzt werden ;, wobei die Einrückung erhalten bleibt . zum Beispiel: a=a[4:-1].split(",");b="". jeder if, else, for, while, usw. Block mit nur einer Zeile geschrieben werden kann als if b in k:b=k[b].Schließlich, können Sie eine Menge Ihre Leerzeichen in der Mitte der Linien verlieren, zum Beispiel k = {-> k={und return "color:->return"color:
undergroundmonorail
Willkommen auch bei PPCG :)
undergroundmonorail
2
Das wörtliche k ist riesig. Da alle Farbcodes in Klein sind und alle Farbnamen in Großbuchstaben sind, könnten Sie es einfach als eine einzelne Zeichenfolge schreiben, dann analysiert sie mit re.findall()(so wird auch notwendig import re): pastebin.com/rQHqgxXS
Manatwork
@undergroundmonorail Danke dafür, sollte viel Platz sparen: D
Toastrackenigma
@ mbomb007 OK, ich war mir nicht ganz sicher, wie Sie die Ausgabe oder Eingabe haben wollten - war da ein wenig verwirrt: PI hat den Code für die Testfälle ausgeführt, um sicherzustellen, dass er richtig funktioniert. Möchten Sie, dass ich meine Ergebnisse hochlade?
Toastrackenigma
1

JavaScript (ES6), 499 611

Bearbeiten Die Testfälle wurden der Frage hinzugefügt

Hinweis: Ich habe nur die Farbnamen beibehalten, die kürzer als das Hex-Äquivalent sind.

Anmerkung 2: Dies kann sicherlich mehr Golf gespielt werden ...

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>

Weniger golfen

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
quelle
Diese Unterstriche ... Nach meiner Zählung wären sie ohne sie kürzer. Zitierte nur die Codes mit einer Ziffer beginnen und halten die andere nicht notiert: {f00:"red";"008000":"green"}.
Manatwork
@manatwork schöner Trick. Aber ein buchstäbliches Objekt ist selten eine gute Wahl für Code-Golf. Eine einfache Saite ist besser
edc65
Richtig. In diesem Sinne habe ich bereits einen Kommentar zu unserer neuen Mitbewohnerin abgegeben.
Manatwork
1
@ mbomb007 Testfälle hinzugefügt. Das Snippet funktioniert in Chrome als EcmaScript 6 nicht und Chrome ist nicht vollständig kompatibel (ziemlich müde, dies immer wieder zu wiederholen). Testen Sie in Firefox.
Edc65