CSS Color Golf!


25

Sei uno sviluppatore web e il tuo capo ha deciso di aggiornare il sito Web dell'azienda. Ha deciso che meno colore è meglio, ma vuole che il sito abbia lo stesso aspetto. Decidi giustamente che non ha idea di cosa stia parlando, ma ci proverai comunque, perché sei annoiato. Poiché la società ha migliaia di pagine Web e ognuna ha il proprio CSS, decidi di scrivere uno script per apportare le modifiche necessarie. Analisi HTML non richiesta.

Tutte le pagine attualmente usano una stringa come rgb(255,0,0)per un colore. Dati i tre valori decimali che rappresentano i valori RGB di un attributo di colore CSS (in questo ordine), di ritorno o stampare la rappresentazione di stringa più breve di quel colore, in modo tale che è utilizzabile per i CSS in questo modo: color:<your-result-here>;.

Ecco una tabella completa di parole chiave CSS a colori valide . Non fanno distinzione tra maiuscole e minuscole.

Esempi:

Si noti che i colori possono essere definiti con 12 o 24 bit. Il modello #ABCè una versione più breve di #AABBCC. Chuck Norris è un colore .

Il tuo programma prenderà solo 3 numeri interi, non una stringa (ad eccezione del "bonus" menzionato più avanti).

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)

Punteggio / Regole

  • Vince il codice più corto!
  • Le scappatoie standard non sono ammesse , ad eccezione dei built-in.
  • -50% byte (il bonus è arrotondato per difetto) se si accetta un * selettore di colore valido e si emette il più breve. Quindi DarkSlateBluesarebbe uscita #483D8B, #F00uscite red, ecc.
    • * Ciò include solo RGB, codici esadecimali e nomi.
    • Si noti che alcuni colori hanno nomi alternativi dovuti a X11 (come Fuchsiae Magenta, o Cyane Aqua). I nomi alternativi sono inclusi nell'elenco collegato delle parole chiave colore CSS secondo lo standard W3.
  • CSS3 è Turing completo . Ne varrebbe la pena.

Modificare:

  • SI PREGA DI ESEGUIRE IL CODICE SUI CASI DI PROVA!



Una risposta che desidera ottenere il bonus del -50% deve analizzare anche hsl (...)? Che dire di rgba (...) e hsla (...)? :)
Timwi,

Secondo questo link sui colori nei CSS, il bianco è # 000000. Come ti è venuto in mente #000? E se sono consentite meno di 6 cifre, perché no #0? w3schools.com/cssref/css_colors.asp,, CSS
DavidC

2
@DavidCarraher Vedere stackoverflow.com/q/8318911/791604~~V~~singular~~3rd per una spiegazione approfondita. Ho il sospetto molte delle risposte qui sono in realtà non l'output di colori minimi che vanno dalla realizzazione flessibili disponibili nei browser (ma stanno output colori minime che vanno dalle specifiche fornite nella domanda qui).
Daniel Wagner,

Risposte:


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

Con le nuove righe aggiunte:

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

Casi test

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

Produzione

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

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

Con le nuove righe aggiunte:

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 non è un modulo principale, ma esiste dal 2001. Potrebbe essere necessario installarlo tramite:

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

La rappresentazione esadecimale è preferita se il nome del colore ha la stessa lunghezza.


Casi test

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;

Produzione

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

Hai qualche possibilità di tagliare 4 byte per il pareggio?
mbomb007,

@ mbomb007 6 byte, in effetti.
primo

Ne sento altri 4? Questa competizione è dura.
mbomb007,

1
@ mbomb007 raise.
primo

10

C # 6 527 byte / 2 bonus = 264

EDIT: Woot! Finalmente ho ottenuto la risposta bonus con un punteggio inferiore rispetto alla risposta di base!

Ho scritto solo una funzione. Richiede una usingdichiarazione (inclusa).

C # ha una bella lista di colori noti con cui lavorare, ma insiste per includere il canale Alpha. I colori noti includono anche tutti i colori di sistema, due dei quali hanno nomi lunghi meno di 7 caratteri, quindi è necessario eliminarli.

Ecco la soluzione bonus, che supporta formati come:

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

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

Rientro e nuove linee per chiarezza:

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

Ecco la soluzione di base.

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

Rientro e nuove linee per chiarezza:

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: il codice funziona per me.
raznagul,

8

Mathematica 207 242 500-250 = 250 byte

Aggiornare:
funziona con input costituiti da triple rgb, nomi di colori o numeri esadecimali.

(12 bit) l'output della profondità del colore ora funziona bene, grazie a un eccellente articolo sulla riduzione della profondità del bit di colore . L'idea di base è che, se una tripla RGB {r, g, b}, dove r, g e b sono compresi nell'intervallo 0-255, (es. Esadecimale 00-ff) può essere rappresentata senza perdita come un numero in l'intervallo di 0-15 (cioè 0-f), quindi si può usare il numero esadecimale a 3 cifre anziché il numero a 6 cifre. Si scopre che ciò accadrà ogni volta che 17 (cioè 255/15) divide r, g e b.

Vengono utilizzate solo le funzioni integrate. Mathematica ha delle regole per sostituire i nomi dei colori HTML con triple RGB. Ad esempio, una regola è "Teal"-> RGBColor[0, 128, 128]. Quando tali regole vengono invertite, i valori rgb (ricalibrati nell'intervallo, {0, 255}) possono essere sostituiti con nomi di colore.

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)

Esempi

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


Codice commentato, non registrato

(* regole per la sostituzione di un nome di colore con un campione di colore, ad es RGBColor{255,17,0}

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

(* regole per la sostituzione di un elenco di 3 numeri interi con il rispettivo nome colore, se presente. E le stesse regole, invertite. *)

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

rulesColorsToLists=Reverse/@rulesListsToColorNames;

(* verifica se un colore esadecimale a 24 bit può essere rappresentato come un colore a 12 bit senza perdita. reducepuò modificare l'espressione a 24 bit in un'espressione a 12 bit. *)

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

(* Elenco RGB modificato in un numero esadecimale *)

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

(* Numero esadecimale modificato in elenco RGB. *)

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

(* Altre conversioni *)

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

(* sceglie l'espressione CSS più breve valida di un colore *)

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

(* converte qualsiasi input in un elenco RGB e chiama f *)

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

255 in base 10 non è uguale a FFin base 16? Quindi dovrebbe #FFFFFFessere più lungo del bianco. Sto trovando #000insolito ma esaminerò le stranezze di CSS per essere sicuro.
DavidC,

3
@DavidCarraher: i colori CSS possono essere specificati come 24 bit o 12 bit. #FFFè uguale a #FFFFFF(tutti i bit uno) che è uguale a white. Inoltre, #0non è valido perché non è né 24 bit né 12 bit
slebetman

slebetman, Grazie per il chiarimento, che conferma l'osservazione di @ mbomb007.
DavidC,

5

CoffeeScript, 411 404 388 384 382 secondi = 191

UPD: Abbastanza sicuro che sia il risultato finale

Spero, va bene usare window.document.*. Controlla la rgbfunzione e evalchiama.

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

Risultati del test

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

Codice commentato

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

Ciò salverà alcuni byte.

    d = y = document.body

qla funzione inserirà il colore di input document.body.style.colore otterrà il colore compilato come rgb(...). Inoltre memorizzerà il risultato come hexColor:inputColorin d. Si noti l' evaluso. rgb(100,100,100)è una chiamata di funzione JavaScript valida con tre argomenti numerici. rgbLa funzione convertirà gli argomenti in una singola notazione HEX 24/12 (come #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 )

Dividi la stringa in una matrice di nomi di colori, crea un oggetto di ricerca.

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

E restituire HEX se non sono presenti varianti più brevi d.

    return d[ r ] or r

4

Stilo, 238 234/2 = 117

Più soluzione simile a CSS! Lo stilo ha già un ottimo supporto per la manipolazione del colore, quindi la funzione desiderata è piuttosto piccola e non molto giocata a 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}}

Provalo qui

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

Benvenuti in PPCG! Questa è davvero una bella soluzione!
mbomb007,

non ho giocato molto a golf . Faresti meglio a giocarci un po 'di più se vuoi vincere. Qualcuno ti sta picchiando per uno.
mbomb007,

@ mbomb007, va bene, ho giocato a golf un po '.
argh-argh,

Sembra che tu sia stato picchiato. Forse puoi provare a riempire i colori insieme senza spazi, ma imbottito di cinque caratteri, quindi dividere ogni cinque e tagliare? Non sei sicuro che ciò salverebbe i byte?
mbomb007,

3

Matlab 617

Un sacco di pre-elaborazione e hardcoding. L'insieme minimo di nomi di colori che devi considerare sono questi. Peccato che Matlab non abbia nomi di colori incorporati = /

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

Hai lasciato l'hardcoded r=0;g=16;b=0;lì dentro, anche se non è conteggiato nel tuo punteggio.
Hand-E-Food,

Oh, ho incollato la versione sbagliata, grazie per avermelo fatto notare!
Flawr,

2

Python 3, 857 795 byte

Dover specificare manualmente tutti i colori accettati richiesti ha aumentato il conteggio dei byte su questo: /

c(a)prende un argomento, ache si presenta sotto forma di rgb(#,#,#). Da ciò, l'rgb e le parentesi vengono rimosse e la stringa viene quindi divisa da virgole in un array. c(x,y,z)prende 3 in, i valori r, geb del colore rgb per l'elaborazione. Li abbiamo messi insieme in un array a. Usiamo quindi la funzione integrata di Python hexche converte un numero Base 10 in un numero Base 16 sul nostro array e creiamo una stringa esadecimale (questo viene fatto nel forciclo). Le ifdichiarazioni convertono i colori, come 000000a 000, e sostituire i colori conosciuti utilizzando un dizionario.

Eccolo (grazie a @undergroundmonorail per informazioni su ;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

Vecchia versione:

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

Forse aggiungerò il bonus ad esso, non lo so ancora. Potrebbe definitivamente fare con il 50% di byte in meno!

-Toastrackenigma


2
consigli generali sul golf in pitone: molte delle tue nuove linee possono essere sostituite ;, salvando il rientro. per esempio: a=a[4:-1].split(",");b="". qualsiasi if, else, for, while, ecc blocco con una sola linea può essere scritta come if b in k:b=k[b].Infine, si può perdere un sacco di spazio bianco nel mezzo di linee, ad esempio k = {-> k={e return "color:->return"color:
undergroundmonorail

benvenuto a PPCG :)
undergroundmonorail,

2
Quel letterale k è enorme. Poiché tutti i codici colore sono in minuscolo e tutti i nomi dei colori sono in maiuscolo, puoi semplicemente scriverlo come una singola stringa, quindi analizzarlo con re.findall()(quindi sarà anche necessario import re): pastebin.com/rQHqgxXS
manatwork

@undergroundmonorail Grazie per questo, dovrebbe risparmiare molto spazio: D
Toastrackenigma

@ mbomb007 OK, non ero abbastanza sicuro di come volessi l'output o l'input - mi sono un po 'confuso lì: PI ha eseguito il codice sui casi di test per assicurarmi che funzioni correttamente, vuoi che carichi i miei risultati?
Toastrackenigma,

1

JavaScript (ES6), 499 611

Modifica Aggiunti i casi di test nella domanda

Nota: ho mantenuto solo i nomi dei colori più corti dell'equivalente esadecimale.

Nota 2: questo può sicuramente essere giocato a golf di più ...

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>

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

Quei caratteri di sottolineatura ... Secondo il mio conteggio, senza di loro sarebbero più brevi. Basta citare i codici che iniziano con una cifra e tenere gli altri non quotate: {f00:"red";"008000":"green"}.
arte

@manatwork bel trucco. Ma un oggetto letterale è raramente una buona scelta per il golf del codice. Una stringa semplice è migliore
edc65,

Corretta. Ho già fatto un commento in tal senso al nostro nuovo sitemate.
arte

1
@ mbomb007 Casi di test aggiunti. Lo snippet non funzionerà in Chrome essendo EcmaScript 6 e Chrome non è completamente conforme (abbastanza stanco per ripetere ancora e ancora). Test in Firefox.
edc65,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.