सीएसएस रंग गोल्फ!


25

आप एक वेब डेवलपर हैं, और आपके बॉस ने कंपनी की वेबसाइट को अपडेट करने का फैसला किया है। उन्होंने तय किया है कि कम रंग बेहतर है, लेकिन वह चाहते हैं कि साइट समान दिखे। आप बस यह तय करें कि उसे पता नहीं है कि वह किस बारे में बात कर रहा है, लेकिन आप वैसे भी कोशिश करने जा रहे हैं, क्योंकि आप ऊब चुके हैं। चूंकि कंपनी के हजारों वेबपेज हैं, और हर एक का अपना सीएसएस है, इसलिए आप आवश्यक बदलाव करने के लिए एक स्क्रिप्ट लिखने का निर्णय लेते हैं। HTML पार्स करने की आवश्यकता नहीं है।

वर्तमान में सभी पृष्ठ rgb(255,0,0)एक रंग की तरह स्ट्रिंग का उपयोग करते हैं । CSS रंग विशेषता (उस क्रम में) के RGB मानों का प्रतिनिधित्व करने वाले तीन दशमलव मानों को देखते हुए, उस रंग के सबसे छोटे स्ट्रिंग प्रतिनिधित्व को लौटाएँ या प्रिंट करें, जैसे कि यह CSS के लिए प्रयोग करने योग्य है जैसे color:<your-result-here>;:।

यहाँ वैध सीएसएस रंग खोजशब्दों की एक पूरी तालिका है । वे केस-असंवेदनशील हैं।

उदाहरण:

ध्यान दें कि रंगों को 12 या 24 बिट्स के साथ परिभाषित किया जा सकता है। पैटर्न #ABCका एक छोटा संस्करण है #AABBCCचक नॉरिस एक रंग है

आपका कार्यक्रम केवल 3 पूर्णांक में ले जाएगा, न कि एक स्ट्रिंग ( बाद में उल्लिखित "बोनस" के अपवाद के साथ )।

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)

स्कोरिंग / नियम

  • सबसे छोटा कोड जीतता है!
  • मानक खामियों को अस्वीकार कर दिया जाता हैबिल्ट-इन के अपवाद के साथ गया है।
  • -50% बाइट्स (बोनस राउंड डाउन हो गया है) यदि आप किसी भी * वैध रंग चयनकर्ता को स्वीकार करते हैं और सबसे कम आउटपुट करते हैं। तो DarkSlateBlueआउटपुट #483D8B, #F00आउटपुट होगाred आदि।
    • * इसमें केवल RGB, हेक्स कोड और नाम शामिल हैं।
    • ध्यान दें कि कुछ रंग की वजह से वैकल्पिक नाम है X11 (जैसे Fuchsiaऔर Magenta, या Cyanऔर Aqua)। वैकल्पिक नाम W3 मानक के अनुसार सीएसएस रंग खोजशब्दों की लिंक सूची में शामिल हैं।
  • CSS3 ट्यूरिंग कम्प्लीट है । यह एक इनाम के लायक होगा।

संपादित करें:

  • टेस्ट मामलों पर अपने कोड रन कृपया!

यहाँ एक संबंधित प्रश्न है: codegolf.stackexchange.com/questions/13132/color-rgb-int-to-hex
mbomb007


-50% बोनस स्कोर करने के लिए एक उत्तर देने के लिए hsl (...) को पार्स करने की आवश्यकता है? Rgba (...) और hsla (...) के बारे में क्या? :)
टिमवी

CSS में रंगों पर इस लिंक के अनुसार, व्हाइट # 000000 है। आप कैसे आए #000? और यदि 6 अंकों से कम की अनुमति है, तो क्यों नहीं #0? w3schools.com/cssref/css_colors.asp , CSS
DavidC

2
@DavidCarraher एक विस्तृत विवरण के लिए stackoverflow.com/q/8318911/791604 देखें । मैं यहाँ उत्तर वास्तव में कर रहे हैं के कई शक नहीं ब्राउज़र में उपलब्ध लचीला कार्यान्वयन को देखते हुए कम से कम रंग outputting (लेकिन कर रहे हैं यहाँ प्रश्न में दिए गए कल्पना को देखते हुए कम से कम रंग outputting)।
डैनियल वैगनर

जवाबों:


5

पर्ल, 212 - 50% = 106 बाइट्स

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

नई सूचियों के साथ:

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

परीक्षण के मामलों

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

उत्पादन

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

पर्ल, नो बोनस, 144 बाइट्स

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

नई सूचियों के साथ:

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 एक कोर मॉड्यूल नहीं है, लेकिन यह 2001 के आसपास रहा है। आपको इसके माध्यम से स्थापित करने की आवश्यकता हो सकती है:

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

यदि रंग नाम की लंबाई समान है, तो हेक्स प्रतिनिधित्व पसंद किया जाता है।


परीक्षण के मामलों

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;

उत्पादन

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

किसी भी मौका आप टाई के लिए 4 बाइट्स काट सकते हैं?
mbomb007

@ mbomb007 6 बाइट्स, वास्तव में।
प्राइमो

क्या मुझे 4 और सुनने हैं? यह प्रतियोगिता कठिन है।
mbomb007

1
@ mbomb007 बढ़ाएं।
प्रिमो

10

C # 6 527 बाइट्स / 2 बोनस = 264

संपादित करें: वाह! मुझे अंत में मूल उत्तर की तुलना में कम अंक के साथ बोनस उत्तर मिला!

मैंने सिर्फ एक फंक्शन लिखा है। यह एक की आवश्यकता हैusing वक्तव्य (शामिल है) की आवश्यकता है

C # के पास काम करने के लिए ज्ञात रंगों की एक अच्छी सूची है, लेकिन यह अल्फा चैनल को शामिल करने पर जोर देता है। ज्ञात रंगों में सभी सिस्टम रंग भी शामिल हैं, जिनमें से दो में 7 से कम वर्णों के नाम लंबे हैं, इसलिए इन्हें बाहर निकालने की आवश्यकता है।

यहां बोनस समाधान, समर्थन प्रारूप जैसे:

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

पूरी तरह से गोल्फ:

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

इंडेंटेशन और स्पष्टता के लिए नई लाइनें:

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

सी #, 265 बाइट्स

यहाँ मूल समाधान है।

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

इंडेंटेशन और स्पष्टता के लिए नई लाइनें:

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: कोड मेरे लिए काम करता है।
raznagul

8

गणितज्ञ 207 242 500-250 = 250 बाइट्स

अद्यतन:
यह आरजीबी ट्रिपल्स, रंग नामों या हेक्स संख्या से युक्त इनपुट के साथ काम करता है।

(12 बिट) रंग-गहराई आउटपुट अब ठीक काम करता है, रंग बिट गहराई कटौती पर एक उत्कृष्ट लेख के लिए धन्यवाद । मूल विचार यह है कि, यदि RGB RGB {r, g, b}, जहाँ r, g, और b 0-255 की सीमा में हैं, (यानी hex 00-ff) को बिना संख्या के नुकसान के रूप में दर्शाया जा सकता है 0-15 की सीमा (यानी 0-एफ), तो कोई 6 अंकों की संख्या के बजाय 3 अंकों की हेक्स संख्या का उपयोग कर सकता है। पता चलता है कि यह तब होगा जब 17 (यानी 255/15) आर, जी और बी को विभाजित करता है।

केवल अंतर्निहित कार्यों का उपयोग किया जाता है। Mathematica में RGB रंगों के साथ HTML रंगों के नाम बदलने के नियम हैं। उदाहरण के लिए, एक नियम है "Teal"-> RGBColor[0, 128, 128]। जब इस तरह के नियम उलटे होते हैं, आरजीबी मान (रेंज में पुनर्गणित, {0, 255}) को रंग नामों से बदला जा सकता है।

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)

उदाहरण

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", "रेड", "चैती", "# 8b0000", "#fff", "# 483d8b", "#fffffe", "# f5f"}


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

{"रेड", "# 483c8b", "चैती", "# 000"}


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

{"# 000", "रेड", "चैती", "# 8b0000", "#fff", "# 483d8b", "#fffffe", \ "# f5f"}


टिप्पणी की, Ungolfed कोड

(* रंग स्वैच के साथ रंग नाम बदलने के नियम, उदा RGBColor{255,17,0}

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

(* संबंधित रंग नाम के साथ 3 पूर्णांकों की सूची बदलने के लिए नियम, यदि कोई मौजूद है। और वही नियम उलट दिए गए हैं।)

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

rulesColorsToLists=Reverse/@rulesListsToColorNames;

(* परीक्षण करता है कि क्या 24 बिट हेक्स रंग को बिना किसी नुकसान के 12 बिट रंग के रूप में दर्शाया जा सकता है। reduce24 बिट अभिव्यक्ति को 12 बिट अभिव्यक्ति में बदल सकता है। *)

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

(* RGB सूची बदलकर एक Hex नंबर *)

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

(* हेक्स संख्या आरजीबी सूची में बदल गई। *)

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

(* अधिक रूपांतरण *)

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

(* एक रंग की सबसे छोटी वैध सीएसएस अभिव्यक्ति को काटता है *)

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

(* किसी इनपुट को RGB सूची में परिवर्तित करता है और कॉल करता है f *)

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

क्या बेस १० में २५५ FFआधार १६ में बराबर नहीं है ? इसलिए ऐसा बनाना चाहिए #FFFFFF, जो सफेद से अधिक लंबा हो। मुझे #000असामान्य लग रहा है, लेकिन यह सुनिश्चित करने के लिए सीएसएस के quirks में देखेंगे।
1

3
@DavidCarraher: सीएसएस रंगों को 24 बिट्स या 12 बिट्स के रूप में निर्दिष्ट किया जा सकता है। #FFFरूप में ही है #FFFFFF(सभी बिट्स एक) जो रूप में ही है white। इसके अलावा, #0अमान्य है क्योंकि यह न तो 24 बिट्स है और न ही 12 बिट्स
स्लीवेटमैन

slebetman, स्पष्टीकरण के लिए धन्यवाद, जो @ mbomb007 के अवलोकन की पुष्टि करता है।
डेविड

5

कॉफीस्क्रिप्ट , 411 404 388 384 382/2 = 191

UPD: बहुत यकीन है कि यह अंतिम परिणाम है

आशा है, यह उपयोग करने के लिए ठीक है window.document.*rgbफ़ंक्शन की जांच करें और 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

परीक्षण के परिणाम

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

टिप्पणी कोड

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

यह कुछ बाइट्स बचाएगा।

    d = y = document.body

qसमारोह इनपुट रंग को जगह देगा document.body.style.colorऔर संकलित रंग प्राप्त करेगा rgb(...)। इसके अलावा यह परिणाम के रूप hexColor:inputColorमें संग्रहीत करेगा d। नोटिस का evalउपयोग। rgb(100,100,100)तीन नंबर तर्क के साथ एक मान्य जावास्क्रिप्ट फ़ंक्शन कॉल है। rgbफ़ंक्शन तर्कों को एकल 24/12 HEX संकेतन (जैसे #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 )

रंग नामों की सरणी में विभाजित करें, लुकअप ऑब्जेक्ट बनाएं।

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

और यदि कोई छोटा संस्करण नहीं है तो HEX लौटाएं d

    return d[ r ] or r

4

स्टाइलस, 238 234/2 = 117

अधिक सीएसएस जैसा समाधान! स्टाइलस में पहले से ही रंग हेरफेर के लिए बहुत समर्थन है, इसलिए वांछित फ़ंक्शन बहुत छोटा है और बहुत अधिक गॉकेटेड नहीं है।

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

इसका परीक्षण यहां करें

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 में आपका स्वागत है! यह एक बहुत अच्छा समाधान है!
mbomb007

बहुत अधिक नहीं । यदि आप जीतना चाहते हैं, तो आप इसे कुछ और बेहतर करने की कोशिश करेंगे। कोई तुम्हें एक से पीट रहा है।
mbomb007

@ mbomb007, ठीक है, थोड़ा गोल्फ।
अर्घ-अर्घ

ऐसा लगता है कि जैसे आपको पीटा गया है। हो सकता है कि आप रिक्त स्थान के बिना रंगों को एक साथ cramming करने की कोशिश कर सकते हैं, लेकिन पांच वर्णों को गद्देदार किया जा सकता है, फिर हर पाँच को विभाजित करें और ट्रिम करें? यकीन नहीं होता कि बाइट्स बचाएंगे?
mbomb007

3

मतलब 617

बहुत सारे प्रीप्रोसेसिंग और हार्डकोडिंग। आपके द्वारा विचार किए जाने वाले रंग नामों का न्यूनतम सेट ये हैं। बहुत खराब मतलाब ने रंग नामों में नहीं बनाया है = /

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

आपने हार्डकोड r=0;g=16;b=0;को वहां छोड़ दिया है , हालांकि यह आपके स्कोर में नहीं गिना जाता है।
हाथ-ई-फूड

ओह, मैंने गलत संस्करण चिपकाया, मुझे बताने के लिए धन्यवाद!
7

2

पायथन 3, 857 795 बाइट्स

मैन्युअल रूप से निर्दिष्ट सभी रंगों को निर्दिष्ट करने की आवश्यकता होने से इस पर बाइट की संख्या में वृद्धि हुई: /

c(a) एक तर्क लेता है, a , जो के रूप में आता है rgb(#,#,#)। उस से, आरजीबी और कोष्ठक हटा दिए जाते हैं और फिर स्ट्रिंग को एक सरणी में अल्पविराम से विभाजित किया जाता है। c(x,y,z)प्रक्रिया के लिए आरजीबी रंग के 3 इन्ट, आर, जी और बी मान लेता है। हम एक साथ एक सरणी में रखते हैं a। हम तब पायथन के अंतर्निहित hexफ़ंक्शन का उपयोग करते हैं जो हमारे सरणी पर बेस 10 नंबर को बेस 16 नंबर में परिवर्तित करता है और हेक्स स्ट्रिंग बनाता है (यह forलूप में किया जाता है )। ifबयान रंग की तरह परिवर्तित000000 करने के लिए 000, और एक शब्दकोश का उपयोग कर जाना जाता है रंग बदलें।

यहाँ यह है ( ;पायथन में टिप के लिए @undergroundmonorail का धन्यवाद ):

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

पुराना संस्करण:

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

शायद मैं इसमें बोनस जोड़ दूंगा, मुझे अभी तक नहीं पता है। यह निश्चित रूप से 50% बाइट्स के साथ कर सकता है!

-Toastrackenigma


2
सामान्य अजगर गोल्फ टिप्स: ;इंडेंटेशन को बचाते हुए आपकी कई नई कहानियों को बदला जा सकता है । उदाहरण के लिए: a=a[4:-1].split(",");b=""। किसी भी if, else, for, whileकेवल एक लाइन के साथ, आदि ब्लॉक के रूप में लिखा जा सकता है if b in k:b=k[b].finally, आप लाइनों के बीच, जैसे में अपने खाली स्थान के का एक बहुत खो सकते हैं k = {> - k={और return "color:->return"color:
undergroundmonorail

पीपीसीजी में भी आपका स्वागत है :)
भूमिगत

2
वह शाब्दिक k बहुत बड़ा है। जैसा कि सभी कलर कोड लोअरकेस में होते हैं और सभी कलर नाम अपरकेस में होते हैं, आप इसे केवल एक स्ट्रिंग के रूप में लिख सकते हैं, फिर इसे पार्स करें re.findall()(इसके लिए भी आवश्यकता होगी import re): pastebin.com/rQHqgxXS
manatat

@undergroundmonorail इसके लिए धन्यवाद, बहुत सी जगह
बचानी

@ mbomb007 ठीक है, मुझे पूरा यकीन नहीं था कि आप आउटपुट या इनपुट कैसे चाहते हैं - वहाँ थोड़ा उलझन में था: PI ने परीक्षण मामलों पर कोड चलाया ताकि यह सुनिश्चित हो सके कि यह ठीक से काम करता है, क्या आप चाहते हैं कि मैं अपने परिणाम अपलोड करूं?
टोस्ट्रेकेनिग्मा

1

जावास्क्रिप्ट (ईएस 6), 499 611

संपादित करें प्रश्न में परीक्षण मामलों जोड़ा गया

नोट: मैंने सिर्फ रंग के नाम रखे जो हेक्स समतुल्य से छोटे हैं।

नोट 2: यह निश्चित रूप से अधिक गोल्फ हो सकता है ...

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>

कम गोल्फ वाला

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
)

वो अंडरस्कोर ... मेरी गिनती के अनुसार, उनके बिना छोटा होगा। बस एक अंक के साथ शुरू होने वाले कोड को उद्धृत करें और दूसरों को निर्विवाद रखें {f00:"red";"008000":"green"}:।
मैनटवर्क

@manatwork अच्छी चाल। लेकिन कोड गोल्फ के लिए एक शाब्दिक वस्तु शायद ही कभी एक अच्छा विकल्प हो। एक साधारण स्ट्रिंग बेहतर है
edc65

सही बात। मैंने इस संबंध में पहले ही अपनी ताजा बैठक में एक टिप्पणी कर दी थी।
मैनटवर्क

1
@ mbomb007 टेस्ट के मामले जोड़े गए। स्निपेट EcmaScript 6 में क्रोम में काम नहीं करेगा, और क्रोम पूरी तरह से आज्ञाकारी नहीं है (इसे बार-बार दोहराने के लिए काफी थका हुआ है)। फ़ायरफ़ॉक्स में परीक्षण।
edc65
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.