CSS 컬러 골프!


25

귀하는 웹 개발자이며 상사는 회사 웹 사이트를 업데이트하기로 결정했습니다. 그는 더 적은 색상이 더 좋다고 결정했지만 사이트가 동일하게 보이기를 원합니다. 당신은 그가 그가 무슨 말을하는지 전혀 모른다고 결정하지만, 당신은 심심하기 때문에 어쨌든 시도 할 것입니다. 회사에는 수천 개의 웹 페이지가 있고 각 웹 페이지에는 고유 한 CSS가 있으므로 필요한 변경을 수행하는 스크립트를 작성하기로 결정합니다. HTML 구문 분석이 필요하지 않습니다.

모든 페이지는 현재 rgb(255,0,0)색상 과 같은 문자열을 사용합니다 . CSS 색상 속성의 RGB 값 (순서대로)을 나타내는 세 개의 10 진수 값이 주어지면 해당 색상의 가장 짧은 문자열 표현을 반환하거나 인쇄하여 CSS에서 다음과 같이 사용할 수 color:<your-result-here>;있습니다.

다음은 유효한 CSS 색상 키워드 의 전체 표입니다 . 대소 문자를 구분하지 않습니다.

예 :

색상은 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, 16 진수 코드 및 이름 만 포함됩니다.
    • X11 로 인해 일부 색상 (예 : FuchsiaMagenta, 또는 CyanAqua) 이 다른 색상으로 표시됩니다 . 대체 이름은 W3 표준에 따라 CSS 색상 키워드의 링크 된 목록에 포함됩니다.
  • CSS3는 Turing Complete 입니다. 현상금 가치가 있습니다.

편집하다:

  • 테스트 케이스에서 코드를 실행하십시오!



-50 % 보너스를 받으려는 답변도 hsl (...)을 파싱해야합니까? rgba (...)와 hsla (...)는 어떻습니까? :)
Timwi

CSS의 색상에 대한이 링크에 따르면 White는 # 000000입니다. 어떻게 생각해 냈어 #000? 그리고 6 자리 미만이 허용된다면 왜 그렇지 #0않습니까? w3schools.com/cssref/css_colors.asp ,, CSS
DavidC

2
@DavidCarraher 자세한 설명 은 stackoverflow.com/q/8318911/791604 를 참조하십시오 . 여기 실제로 답변의 많은 의심 할 수 없습니다 브라우저에서 사용할 수있는 유연한 구현으로가는 최소한의 색상을 출력하는 (그러나 되어 여기 질문에 주어진 사양으로가는 최소한의 색상을 출력).
Daniel Wagner

답변:


5

Perl, 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

색상 이름의 길이가 같은 경우 16 진 표현이 선호됩니다.


테스트 사례

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 바이트입니다.
primo

4 개 더 들립니까? 이 경쟁은 힘들다.
mbomb007

1
@ mbomb007 인상.
primo

10

C # 6 527 바이트 / 2 보너스 = 264

편집 : Woot! 마침내 기본 답변보다 낮은 점수로 보너스 답변을 받았습니다!

방금 함수를 작성했습니다. 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;
}

C #, 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 바이트

업데이트 :
이것은 RGB 트리플, 색 이름 또는 16 진수로 구성된 입력에서 작동합니다.

(12 비트) 색상 심도 출력은 이제 색상 비트 심도 감소 에 대한 훌륭한 기사 덕분에 잘 작동합니다 . 기본 아이디어는 RGB 3 배 {r, g, b} (여기서 r, g 및 b는 0-255 범위에있는 경우 16 진수 00-ff)를 숫자없이 손실없이 표시 할 수 있다는 것입니다. 0-15의 범위 (즉, 0-f)이면 6 자리 숫자 대신 3 자리 16 진수를 사용할 수 있습니다. 이것은 17 (즉, 255/15)이 r, g, b를 나눌 때마다 발생한다는 것이 밝혀졌습니다.

내장 기능 만 사용됩니다. Mathematica에는 HTML 색상 이름을 RGB 트리플로 바꾸는 규칙이 있습니다. 예를 들어 하나의 규칙은 "Teal"-> RGBColor[0, 128, 128]입니다. 이러한 규칙이 반전되면 rgb 값 (범위 {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", "Red", "Teal", "# 8b0000", "#fff", "# 483d8b", "#fffffe", "# f5f"}


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

{ "빨간색", "# 483c8b", "제목", "# 000"}


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

{ "# 000", "Red", "Teal", "# 8b0000", "#fff", "# 483d8b", "#fffffe", \ "# f5f"}


주석이 달린 코드없는 코드

(* 색상 이름을 색상 견본으로 바꾸는 규칙, 예 : 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 비트 16 진수 색상을 손실없이 12 비트 색상으로 표시 할 수 있는지 테스트합니다. reduce24 비트 표현식을 12 비트 표현식으로 변경할 수 있습니다. *)

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

(* RGB 목록이 16 진수 *로 변경되었습니다.)

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

(* 16 진수가 RGB리스트로 변경되었습니다. *)

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

(* 색상의 가장 짧은 유효한 CSS 표현을 선택합니다 *)

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)

10 진법의 255가 FF16 진법과 같지 않습니까? 따라서 #FFFFFF흰색보다 길어야합니다. 나는 #000특이한 것을 찾고 있지만 CSS의 단점을 확실히 살펴볼 것입니다.
DavidC

3
@DavidCarraher : CSS 색상은 24 비트 또는 12 비트로 지정할 수 있습니다. #FFF와 동일한 #FFFFFF(모든 비트 1)과 동일합니다 white. 또한, #0그것은 둘 다 24 비트도 12 비트 없기 때문에 유효
slebetman을

slebetman, 설명을 해주셔서 감사합니다. @ mbomb007의 관찰을 확인합니다.
DavidC

5

커피 스크립트, 411 404 388 384 2분의 382 = 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)세 개의 숫자 인수가있는 유효한 JavaScript 함수 호출입니다. 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) 2분의 234 = 117

더 CSS와 같은 솔루션! 스타일러스는 이미 색상 조작을 크게 지원하므로 원하는 기능이 매우 작고 골프를 많이하지 않습니다.

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, 좋아, 조금 골프.
argh-argh

당신이 구타당한 것처럼 보입니다. 공백없이 색상을 함께 만들 수 있지만 5 자로 채워진 다음 5 분마다 나누고 자르십시오. 그것이 바이트를 절약 할 수 있는지 확실하지 않습니까?
mbomb007

3

MATLAB 617

많은 전처리 및 하드 코딩. 고려해야 할 최소 색상 이름은 다음과 같습니다. 너무 나쁜 Matlab에는 내장 색상 이름이 없습니다 = /

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;된 채로 두 었지만 점수에는 포함되지 않습니다.
Hand-E-Food

오, 잘못된 버전을 붙여 넣었습니다. 알려 주셔서 감사합니다.
flawr

2

파이썬 3, 857 795 바이트

필요한 모든 허용 된 색상을 수동으로 지정해야하므로이 바이트 수를 늘 렸습니다.

c(a)a의 형식으로 된 하나의 인수를 취 rgb(#,#,#)합니다. 그로부터 rgb와 괄호가 제거되고 문자열은 쉼표로 배열로 분할됩니다. c(x,y,z)처리하려면 RGB 색상의 r, g 및 b 값 3 개를 가져옵니다. 우리는 그것들을 배열로 묶습니다 a. 그런 다음 hex배열의 Base 10 숫자를 Base 16 숫자로 변환하고 16 진 문자열을 만드는 Python의 내장 함수를 사용합니다 ( for루프 에서 수행됨 ). if문은 같은 색상을 변환 000000000, 그리고 사전을 사용하여 알려진 색상을 교체합니다.

여기에 있습니다 ( ;파이썬에서 팁을 얻으려면 @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

또한, PPCG에 오신 것을 환영합니다 :)
undergroundmonorail 8

2
그 리터럴 k는 엄청납니다. 모든 색상 코드는 소문자에있는 모든 색상 이름은 대문자에, 당신은 다음과 구문 분석, 하나의 문자열로 쓸 수 있습니다 re.findall()(그래서 것 또한 필요 import re) : pastebin.com/rQHqgxXS
manatwork

D : @undergroundmonorail 덕분에 그것을 위해, 공간을 많이 저장해야합니다
Toastrackenigma

@ mbomb007 좋아, 나는 당신이 어떻게 출력이나 입력을 원했는지 잘 모르겠다. 거기서 약간 혼란스러워했다 : PI는 테스트 케이스에서 코드를 실행하여 제대로 작동하는지, 결과를 업로드하고 싶니?
Toastrackenigma

1

자바 스크립트 (ES6), 499 (611)

편집 질문에 테스트 사례를 추가했습니다.

참고 : 16 진수에 해당하는 색상 이름 만 유지했습니다.

참고 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

@manatwork 좋은 트릭. 그러나 코드 골프에는 리터럴 객체가 좋은 선택이 아닙니다. 간단한 줄이 더 좋습니다
edc65

옳은. 나는 이미 그런 의미에서 우리의 새로운 사이트 메이트에게 의견을 제시 했습니다.
manatwork

1
@ mbomb007 테스트 사례가 추가되었습니다. 스 니펫은 EcmaScript 6 인 Chrome에서 작동하지 않으며 Chrome은 완벽하게 호환되지 않습니다 (이 과정을 반복해서 반복해도 무척 피곤합니다). Firefox에서 테스트하십시오.
edc65
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.