CSS Renkli Golf!


25

Siz bir web geliştiricisisiniz ve patronunuz şirketin web sitesini güncellemeye karar verdi. Daha az rengin daha iyi olduğuna karar verdi, ancak sitenin aynı görünmesini istiyor. Sadece ne hakkında konuştuğu hakkında hiçbir fikrinin bulunmadığına karar verdin, ama yine de deneyeceksin, çünkü sıkılıyorsun. Şirketin binlerce web sayfası olduğundan ve her birinin kendi CSS’si olduğundan, gerekli değişiklikleri yapmak için bir komut dosyası yazmaya karar verdiniz. HTML ayrıştırma gerekli değildir.

Tüm sayfalar şu anda rgb(255,0,0)renk için bir dize kullanıyor . Üç ondalık değerleri göz önüne alındığında (bu sırayla) Bir CSS renk özelliği RGB değerlerini temsil eden, geri dönüşü ya da şöyle CSS kullanışlı olduğunu, öyle ki, o rengin en kısa dize temsilini yazdırmak: color:<your-result-here>;.

İşte geçerli bir CSS Renkli Anahtar Kelimeler tablosu . Onlar büyük / küçük harf duyarlı değildir.

Örnekler:

Renklerin 12 veya 24 bit ile tanımlanabileceğini unutmayın. Desen #ABC, daha kısa bir sürümüdür #AABBCC. Chuck Norris bir renktir .

Programınız bir dizgeden değil, yalnızca 3 tamsayıdan geçecektir ( daha sonra belirtilen "bonus" hariç ).

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)

Puanlama / Kurallar

  • En kısa kod kazanır!
  • Yerleşikler hariç standart boşluklara izin verilmez .
  • Herhangi bir * geçerli renk seçicisini kabul edip en kısa çıktıyı alırsanız - % -50 bayt (bonus yuvarlanır) . Böylece DarkSlateBlueçıktı #483D8B, #F00çıktı redvb.
    • * Bu sadece RGB, hex kodları ve isimleri içerir.
    • Bazı renkler nedeniyle alternatif isimleri var unutmayın X11 (gibi Fuchsiave Magentaya Cyanve Aqua). Alternatif isimler, W3 standardına göre bağlantılı CSS Renk Anahtar Kelimeleri listesine dahil edilmiştir.
  • CSS3 Turing Tamamlandı . Bu bir lütuf değer.

Düzenle:

  • LÜTFEN TEST DAVALARINDA KODUNUZU ÇALIŞINIZ!



% -50 bonus kazanmak isteyen bir cevabın da hsl (...) 'ı ayrıştırması gerekiyor mu? Peki ya rgba (...) ve hsla (...)? :)
Timwi

CSS'deki renkler üzerindeki bu bağlantıya göre, Beyaz # 000000'dir. Nasıl geldin #000? Ve 6 haneden daha azına izin verilirse neden olmasın #0? w3schools.com/cssref/css_colors.asp , CSS
DavidC

2
@DavidCarraher Ayrıntılı bir açıklama için bkz. Stackoverflow.com/q/8318911/791604 . Buradaki cevapların birçoğunun, tarayıcılarda mevcut olan esnek uygulamaya göre minimum renk çıktısı almadığından şüpheliyim (ancak burada belirtilen spesifikasyona göre minimum renk çıktısı alıyoruz).
Daniel Wagner

Yanıtlar:


5

Perl, 212 - 50% = 106 bayt

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

Yeni satır eklenmiş olarak:

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

Test Kılıfları

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

Çıktı

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

Perl, bonus yok, 144 bayt

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

Yeni satır eklenmiş olarak:

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 çekirdek bir modül değildir, ancak 2001'den beri hizmet vermektedir.

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

Renk adı aynı uzunluğa sahipse hex gösterimi tercih edilir.


Test Kılıfları

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;

Çıktı

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

Kravat için 4 byte kesebilme şansın var mı?
mbomb007

Aslında @ mbomb007 6 bayt.
primo

4 tane daha duyuyor muyum? Bu rekabet zor.
mbomb007

1
@ mbomb007 zam.
primo

10

C # 6 527 bayt / 2 bonus = 264

EDIT: Woot! Sonunda bonus cevabını temel cevaptan daha düşük bir puanla aldım!

Sadece bir fonksiyon yazdım. Bir usingaçıklama gerektirir (dahil.)

C # çalışmak için bilinen renklerin güzel bir listesine sahiptir, ancak Alpha kanalı dahil etmekte ısrar ediyor. Bilinen renkler ayrıca, ikisi 7 karakterden kısa ada sahip olan tüm sistem renklerini içerir, bu nedenle bunların çıkarılması gerekir.

İşte, aşağıdaki gibi destekleyici formatlar:

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

Tamamen golf oynadı:

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

Girinti ve netlik için yeni çizgiler:

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 bayt

İşte temel çözüm.

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

Girinti ve netlik için yeni çizgiler:

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: Kod benim için çalışıyor.
raznagul

8

Mathematica 207 242 500-250 = 250 bayt

Güncelleme:
Bu, rgb üçlü, renkli ad veya onaltılık sayılardan oluşan girişlerle çalışır.

(12 bit) renk derinliği çıkışı, Renkli Bit Derinliği Azaltma konusundaki mükemmel makalesi sayesinde artık iyi çalışıyor . Temel fikir, eğer bir RGB üçlü {r, g, b}, burada r, g ve b 0-255 aralığındaysa (yani onaltılık 00-ff) bir sayı olarak kayıpsız olarak temsil edilebileceğidir. 0-15 (yani 0-f) aralığı ise 6 basamaklı sayı yerine 3 basamaklı altıgen sayısını kullanabilir. Bunun, 17 (255/15) r, g ve b'yi böldüğü zaman ortaya çıkacağı ortaya çıktı.

Sadece yerleşik işlevler kullanılır. Mathematica, HTML renk adlarını RGB üçlüleriyle değiştirmek için kurallara sahiptir. Örneğin, bir kuraldır "Teal"-> RGBColor[0, 128, 128]. Bu tür kurallar ters çevrildiğinde rgb değerleri (aralık olarak yeniden kalibre edilmiş, {0, 255}) renk isimleri ile değiştirilebilir.

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)

Örnekler

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", "Kırmızı", "Teal", "# 8b0000", "#fff", "# 483d8b", "#fffffe", "# f5f"}


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

{"Kırmızı", "# 483c8b", "Teal", "# 000"}


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

{"# 000", "Kırmızı", "Teal", "# 8b0000", "#fff", "# 483d8b", "#fffffe", \ "# f5f"}


Yorumsuz, Ungolfed Kod

(* bir renk adını bir renk örneğiyle değiştirmek için kurallar, örn. RGBColor{255,17,0}

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

(* eğer varsa 3 tamsayı listesini ilgili renk ismiyle değiştirme kuralları. Varsa aynı kuralları tersine çevirir. *)

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

rulesColorsToLists=Reverse/@rulesListsToColorNames;

(* 24 bit onaltılık bir rengin, 12 bitlik bir renk olarak temsil edilip edilmediğini test eder. reduce24 bitlik ifadeyi 12 bitlik bir ifadeyle değiştirebilir. *)

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

(* RGB listesi Hex numarasına değiştirildi *)

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

(* Hex numarası RGB listesine değiştirildi. *)

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

(* Daha fazla dönüşüm *)

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

(* bir rengin en kısa geçerli CSS ifadesini seçer *)

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

(* herhangi bir girişi bir RGB listesine dönüştürür ve çağırır f *)

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

Temel 10'daki 255 FF, Temel 16'ya eşit değil mi? Böylece bu #FFFFFF, Beyaz'dan daha uzun sürmeli. #000Alışılmadık buluyorum ama emin olmak için CSS’nin ilginç yönlerine bakacağım
DavidC,

3
@DavidCarraher: CSS renkleri 24 bit veya 12 bit olarak belirtilebilir. #FFFile aynıdır #FFFFFF(hepsi bir bit) white. Ayrıca, #0geçersiz çünkü ne 24 bit, ne de 12 bit
slebetman

slebetman, @ mbomb007'nin gözlemini doğrulayan açıklama için teşekkür ederiz.
DavidC

5

CoffeeScript, 411 404 388 384 382/2 = 191

UPD: Kesin sonuç olduğuna eminim.

Umarım kullanmak sorun değil window.document.*. rgbFonksiyonu kontrol et ve ara 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

Test sonuçları

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

Yorumlanan kod

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

Bu bazı baytları kurtaracak.

    d = y = document.body

qişlevi girdi rengini yerleştirir document.body.style.colorve derlenmiş rengi olarak alır rgb(...). Ayrıca sonucu olduğu gibi hexColor:inputColorkaydeder d. Uyarı evalkullanımı. rgb(100,100,100)Üç sayı argümanıyla geçerli bir JavaScript işlev çağrısıdır. rgbişlev argümanları tek bir 24/12 HEX notasyonuna dönüştürür (gibi #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 )

Dizeyi renk adlarının dizisine ayırın, arama nesnesi oluşturun.

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

Ve eğer daha kısa bir değişken yoksa HEX'i geri getirin d.

    return d[ r ] or r

4

Stylus, 238 234/2 = 117

Daha fazla CSS benzeri çözüm! Stylus'un renk manipülasyonu için zaten büyük desteği var, bu nedenle istenen işlev oldukça küçük ve çok fazla golf oynamıyor.

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

Burada test et

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'ye Hoşgeldiniz! Bu gerçekten güzel bir çözüm!
mbomb007

çok golf oynamam . Kazanmak istiyorsan daha çok golf oynamayı denemelisin. Birisi seni tek tek dövüyor.
mbomb007

@ mbomb007, tamam, biraz golf oynadım.
argh-argh

Dövülmüş gibisin. Belki renkleri boşluk bırakmadan bir araya getirmeyi deneyebilirsiniz, ancak beş karaktere kadar doldurun, her beşe bölün ve kesin. Bunun bayt kurtaracağından emin değil misiniz?
mbomb007

3

Matlab 617

Çok fazla ön işleme ve kodlama. Dikkate almanız gereken en az sayıda renk adı bunlar. Çok kötü Matlab renk adlarında yerleşik değildir = /

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

Kodunuzu r=0;g=16;b=0;orada bıraktınız , ancak puanınızda sayılmıyor.
El-E-Yemek

Yanlış sürümü yapıştırdım, haber verdiğiniz için teşekkürler!
kusur

2

Python 3, 857 795 bayt

Gerekli olan tüm kabul edilen renklerin manuel olarak belirtilmesi bu konuda bayt sayısını artırdı: /

c(a)aşeklinde gelen bir argüman alır rgb(#,#,#). Bundan, rgb ve parantezler kaldırılır ve daha sonra dize virgüllerle bir diziye bölünür. c(x,y,z)3 inç, rgb rengin r, g ve b değerlerini alır. Bunları bir dizide bir araya getirdik a. Daha sonra Python'un hexbir Base 10 numarasını dizimizdeki Base 16 numarasına dönüştüren ve altıgen bir dize yaratan yerleşik işlevini kullanırız (bu fordöngüde yapılır ). ifİfadeleri gibi renkleri dönüştürmek 000000için 000, ve bir sözlük kullanarak bilinen renkleri değiştirin.

İşte ( ;Python'daki bahşiş için @ undergroundmonorail'e teşekkürler ):

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

Eski versiyon:

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

Belki de bonusu ekleyeceğim, henüz bilmiyorum. Kesinlikle% 50 bayt ile yapabilirdi!

-Toastrackenigma


2
Genel python golf ipuçları: Yeni hatlarınızın birçoğu ;, girintiyi koruyarak değiştirilebilir . örneğin: a=a[4:-1].split(",");b="". herhangi if, else, for, whiletek bir hat ile, vs blok olarak yazılabilir if b in k:b=k[b].finally, çizgiler ortasında, örneğin içinde bir çok bosluk kaybedebilir k = {> - k={ve return "color:->return"color:
undergroundmonorail

Ayrıca, PPCG :) hoş geldiniz
undergroundmonorail

2
Bu değişmez k çok büyük. Tüm renk kodları küçük harf ve tüm renk isimleri büyük harf olduğundan, tek bir dize olarak yazabilir, sonra ayrıştırma re.findall()(ayrıca gerekecek import re): pastebin.com/rQHqgxXS
manatwork

@undergroundmonorail Bunun için teşekkürler, çok fazla alan
kazanmalı

@ mbomb007 Tamam, çıktıyı veya girişi nasıl istediğinizden emin değildim - biraz kafam karıştı: PI düzgün çalıştığından emin olmak için test senaryolarında kodu çalıştırdım, sonuçlarımı yüklememi ister misiniz?
Toastrackenigma

1

JavaScript (ES6), 499 611

Düzenle Sorudaki test vakalarını ekledi

Not: Yalnızca onaltılık eşdeğerden daha kısa renk adlarını sakladım.

Not 2: Bu kesinlikle daha fazla golf olabilir ...

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>

Daha az golf oynadı

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
)

Bu vurgulamalar… Benim sayıma göre, onlarsız daha kısa olurdu. Sadece bir rakam ile başlayan kodlarını alıntı ve tırnaksız diğerlerini tutmak: {f00:"red";"008000":"green"}.
Manatwork

@ manatwork güzel hile. Ancak değişmez bir nesne nadiren kod golf için iyi bir seçimdir. Basit bir dize daha iyidir
edc65

Doğru. Bu bağlamda taze site arkadaşımıza zaten bir yorum yaptım.
Manatwork

1
@ mbomb007 Test vakaları eklendi. Metin pasajı EcmaScript 6 olan kromda çalışmaz ve Chrome tam olarak uyumlu değildir (bunu tekrar tekrar yapmaktan oldukça yorulur). Firefox'ta test edin.
edc65
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.