보색


26

#rrggbb16 진수 형식으로 색상을 입력하면 RGB 보완을 동일한 형식으로 출력합니다.

모든 색상 R 1 G 1 B 1 의 RGB 보완 R 2 G 2 B 2 는 R 2255-R 1 , B 2255-B 1 및 G 2255-G 1 의 색상으로 정의됩니다 .

16 진수는 대문자 (# FFAA20) 또는 소문자 (# ffaa20) 일 수 있습니다. 입력과 출력의 경우 일관성이 없어야합니다 (따라서 소문자로 입력 할 수 있지만 대문자로 출력하거나 그 반대로 입력 할 수 있음).

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

테스트 사례 (프로그램 / 기능에 자체 출력을 제공하면 원래 입력이 발생 하므로 ( 볼륨없음 ) 테스트 케이스는 양방향으로 작동해야합니다.)

In/Out   Out/In
----------------
#ffffff  #000000
#abcdef  #543210
#badcab  #452354
#133742  #ecc8bd
#a1b2c3  #5e4d3c
#7f7f80  #80807f

2
죄송하지만 sRGB는 그런 식으로 작동하지 않습니다. 16 진수 코드가없는 선형 공간으로 먼저 변환해야합니다.
John Dvorak

2
@JanDvorak 아 잘. 도전의 상태는 나의 무지를 반영 할 것입니다. 왜냐하면 나는 지금 그것을 바꿀 수 없기 때문입니다. : P
Doorknob

sRGB에서 두 개의 값을 평균하는 것은 별개의 도전이 될 수 있습니다. sRGB = 대부분의 범위에서 RGB ^ 0.45이지만 범위의 맨 아래에서 선형입니다.
John Dvorak

답변:


17

Pyth, 9 8 바이트

-1 바이트의 @isaacg에게 감사합니다!

sXz.HM16

255에서 특정 색상 값을 빼는 것은 15에서 16 진수를 각각 빼는 것과 같습니다. 숫자가 16a + b 라고 가정합니다 . 그런 다음 15에서 숫자를 빼서 생성 된 숫자의 값은 16 (15-a) + (15-b) = 255-(16a + b) 입니다.

sXz.HM16     implicit: z=input()
      16      
   .HM        map hex representation over range
   .HM16     '0123456789abcdef'
  z           the input string
 X            Translate characters in x1 present in x2 to reversed x2
              that is, '0' becomes f, '1' becomes 'e', and so on.
              The initial '#' is unchanged.
s             That produced a list, so join into a string by reducing +

여기에서 시도 하십시오 . 테스트 스위트.


좋은 대답입니다! 함수 '0123456789abcdef'대신 16 진수로 변환하는 데 사용 하는 아이디어를 빌 렸습니다.dec2hex
Luis Mendo

귀하의 링크가 잘못되었다고 생각합니다. ( 복사하여 붙여 넣기 FTW. )
PurkkaKoodari

@ Pietu1998 으악; 내가 고칠 게
lirtosiast

U불필요 - 내재적으로 채워 것 M.
isaacg

6

레티 나, 13 10 바이트

T`w`G-A9-0

코드에는 백틱 ( `)으로 구분 된 세 부분이 있습니다 . T음역 모드를 지정하여 두 번째 부분의 각 문자를 세 번째 부분의 해당 문자로 바꿉니다.

w는 기존 정규 표현식과 동일 \w하거나 _0-9A-Za-z로 확장됩니다 _0123456789ABCDEFGH....

GFEDCBA9876543210Retina의 역순 확장 기능 덕분에 두 번째 부분이 로 확장되었습니다. 이것들을 서로 위에 놓으면 다음과 같이됩니다.

_0123456789ABCDEFGH...
GFEDCBA987654321000...
 ^^^^^^^^^^^^^^^^

0더 긴 문자열의 길이에 맞게 마지막 문자 ( )가 반복되지만 캐럿으로 표시되는 16 진 문자 만 처리합니다.

이 방법을 제안 해준 Martin Büttner에게 감사합니다.

온라인 테스트 스위트를 사용해보십시오.


4

놀라운, 41 바이트

00@0
\\]]\/
-W/\@0
-W
~~
<A+700
+O//]]
+O

온라인 통역사 여기. 입력은 대문자 여야합니다.

설명

00]]하단에있는합니다 (첫 번째 문자 가져옵니다 #)를 그리고 바닥에 떨어질 것이고, 다른 어떤 전에 출력된다.

처음 3 줄은 나머지 모든 문자를 가져 오는 루프입니다.

먼저 x -= 48, x -= x > 9 ? 7 : 0( 'A' - '9'8 이후 이므로) 16 진수 문자를 0-15로 변환해야합니다 .

보수를 찾으려면 모든 숫자 x를 로 변환 하면 15-x됩니다. 이것은 (8 비트 값의 경우)와 같습니다 (~x)+16 = ~(x-16).

마지막으로을 수행하여이 숫자를 16 진수로 다시 변환해야합니다 x += x > 9 ? 7 : 0, x += 48.

이제 우리는 x -= 48, x -= x > 9 ? 7 : 0, x = ~(x - 16), x += x > 9 ? 7 : 0, x += 48.

우리는 먼저 원 연산자 발현을 제거한 다음, 입력 숫자가 유의 A- F부정 후 음의 X 될 것이다.

따라서 이전 표현식을 다음 x -= 48, x -= 16, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48과 같이 변경할 수 있습니다 x -= 64, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48.

위의 코드는 마지막 표현식의 구현 일뿐입니다. -W이다 x -= 32하고 +O있다 x += 24. Marbelous는 부호없는 8 비트 산술을 사용하므로 조건 <Ax > 9및 의 경우를 모두 포함합니다 x < 0.


Marbelous를 만들었습니까?
Rɪᴋᴇʀ

@RikerW Marbelous는 나 자신을 포함하여 여러 PPCG 사용자가 만들거나 만들었습니다 . 여기를 참조하십시오 .
es1024

괜찮아. 알려 줘서 고마워.
Rɪᴋᴇʀ

4

자바 스크립트 ES6, 61 바이트 66 68 48 53 64

@ Cᴏɴᴏʀ O'Bʀɪᴇɴ, @NinjaBearMonkey 및 @nderscore 덕분에 상당히 많은 바이트를 절약합니다.

s=>"#"+(1e5+(8**8+~('0x'+s.slice(1))).toString(16)).slice(-6)

자동 유형 캐스팅을 활용합니다. 바이트 수를 0으로 수정


eval(`0x${s.slice(1)}`)대신 사용parseInt
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ 길이가 같은가요?
PurkkaKoodari

@ CᴏɴᴏʀO'Bʀɪᴇɴ 고마워, 나는 - 더 많은 바이트를 절약 eval 대신 사용
Downgoat

오, 자동 타입 캐스팅에 대해 잊었다 : D
Conor O'Brien

입력으로 사용해보십시오 #FFFFFF. 를 반환 #0합니다.
코너 O'Brien

4

자바 스크립트 ES6, 63 58 52 49 바이트

c=>c.replace(/\w/g,x=>(15-`0x${x}`).toString(16))

11 바이트를 절약 한 nderscore 에게 감사 합니다!


-5 바이트 :c=>"#"+[...c].map(x=>"fedcba9876543210"[+('0x'+x)]).join``
nderscore

@ nder 정확하게, 그것에 대해 이미 생각했습니다 :) 감사합니다. 그것을 사용하려고했지만 "평가"와 함께.
nicael

1
아, -6 개 더 있어요 :c=>c.replace(/\w/g,x=>"fedcba9876543210"[+('0x'+x)])
nderscore


3

줄리아, 74 49 바이트

h->"#"join([hex(15-parse(Int,i,16))for i=h[2:7]])

지금은 꽤 길지만 시작입니다. 문자열을 받아들이고 문자열을 반환하는 람다 함수입니다. 출력은 소문자이지만 입력은 둘 중 하나 일 수 있습니다.

마찬가지로 토마스 바와 255에서 각각 2 자리의 컬러 성분을 감산하여, 상기 입력 스트링을 통해 루프 (15)로부터 16 진수 입력의 각 디지트를 감산 선두 제외 동등 #, 우리는 (15)으로 변환 - 파싱 자리 16 진수. 우리는 이것들 모두에 합류하고 #그것을 잘 붙입니다.


3

Japt , 35 32 22 20 16 15 바이트

¡Y?(F-XnG)sG :X

설명:

¡                 //Take input and map (shortcut to "Um@"). Input should in the form of "#123456"
 Y?               //if Y is not 0, then return (F-XnG)sG, otherwise last step...
    F-XnG           //Subtract X, converted from hexadecimal (G is 16) to decimal, from 15
          sG        //convert decimal to hexadecimal
             :X   //...otherwise return X unchanged (happens only with #, the first char)

좋은 것! 나는 지난 밤에 이것을보고 내일 말했다. "내일 골프를 칠 수 있도록 도와 드리겠습니다." 그러나 지금까지 당신은 내가 생각했던 것보다 더 골프를 쳤습니다. :)
ETHproductions

2

펄, 30 바이트

+1 포함 -p

s/\w/sprintf"%x",15&~hex$&/eg

사용법 : echo #000000 | perl -p file.pl
또는 echo #000000 | perl -pe 's/\w/sprintf"%x",15&~hex$&/eg'.


2

MATL , 21 바이트

35,5Y216,j6L)!16ZA-)h

이것은 언어 / 컴파일러 6.0.0 릴리스를 사용하며 , 이는 도전보다 빠릅니다.

입력 숫자는 대문자 여야합니다.

이것은 Octave에서 실행되었습니다.

>> matl
 > 35,5Y216,j6L)!16ZA-)h
 >
> #FFAA20
#0055DF

편집 (2016 년 6 월 12 일)

코드는 이제 온라인 으로 시도 할 수 있습니다 . 쉼표는 공백으로, 교체 할 필요 6L4L언어의 변화에 맞도록.

설명

35,             % number literal: ASCII code of '#'
5Y2             % '0123456789ABCDEF'
16,             % number literal
j               % input string
6L)             % remove first element
!               % transpose
16ZA            % convert from hex to dec
-               % subtract from 16
)               % index into '0123456789ABCDEF' to convert back to hex
h               % prepend 35, which gets automatically converted into '#'


1

하스켈, 85 바이트

내 첫 제출, 아마 가장 긴 (85 바이트) 것입니다,하지만 어딘가에서 시작해야합니다. 하스켈에서 :

import Numeric;f=('#':).concatMap((flip showHex)"".(15-).fst.head.readHex.(:[])).tail

다른 사람들이 사용하는 것을 보았던 15 트릭에서 동일한 빼기를 사용하고 있습니다.

나는 또한 다른 트릭 (8 ^ 8-1 빼기)과 함께 printf를 사용하려고 시도했지만 ghci에서 작동하지만 어떤 이유로 컴파일되지 않습니다.

g=printf "#%06x" .(8^8-1-).fst.head.readHex.tail

누군가이 일을 할 수 있다면 좋을 것입니다!


프로그래밍 퍼즐과 코드 골프에 오신 것을 환영합니다. 이것들은 매우 좋은 답변입니다 (하스켈에서 할 수있는 것보다 낫습니다!). 그러나 코드 골프 챌린지에 대한 일반적인 답변 형식이있어 리더 보드 스 니펫이 리더 보드에 답변을 넣을 수 있습니다. 나는 당신을 위해 그것을 편집 할 것이다; 편집을 수락하거나 거부 할 수 있습니다.
wizzwizz4

다른 사용자의 의견에 답장하려면을 입력하십시오 @username.
wizzwizz4

@ wizzwizz4 많은 감사합니다.
lpapez

언제든지! 당신은 내 도전의 일부에 가고 싶어? 힐버트 커브는 정말 어렵지만 의자를 분석 하고 문자열을 힐버트 커브에 매핑 하는 것이 좋습니다.
wizzwizz4

@ wizzwizz4 확실히, 내가 할 수있는 것을 볼 것이다.
lpapez

1

Mathematica, 69 60 바이트

"#"<>IntegerString[8^8-#~StringDrop~1~FromDigits~16-1,16,6]&

다시 한번, 여기에서 나를 죽이는 것은 문자열 처리입니다.


1

C, 94 바이트

t(char*b){for(int i;i=*b;++b)*b=i>96&i<103?150-i:i>64&i<71|i>47&i<54?118-i:i>53&i<58?111-i:i;}

함수는 char 배열을 취하고 역값을 반환합니다. 응답을 위해 대문자를 생성합니다. 코드는 유효한 경우 각 ASCII 16 진수 문자를 역으로 뒤집습니다. 그렇지 않으면 무시합니다.


i함수 전에 전역 적으로 선언 하여 공간을 절약 할 수 있습니다 .i;
Liam

1

𝔼𝕊𝕄𝕚𝕟 2, 18 자 / 34 바이트

ïē/\w⌿,↪(ḏ-`ᶍ⦃$}”ⓧ

Try it here (Firefox only).

챌린지 후에 만들어진 버전을 사용합니다.

설명

ïē/\w⌿,↪(ḏ-`ᶍ⦃$}”ⓧ // implicit: ï=input, ḏ=15
ïē/\w⌿,             // replace all alphanumeric chars in ï with:
       ↪(ḏ-`ᶍ⦃$}”ⓧ // (15 - char's decimal form) converted to hex
                    // implicit output

비경쟁 솔루션, 15 자 / 29 바이트

ïē/\w⌿,↪(ḏ-`ᶍ⦃$}”ⓧ

음역을 사용합니다.


경쟁력있는 버전을 추가하여 언어가 어떻게 쌓이는 지 확인할 수 있습니까?
lirtosiast

확실한. 새로운 편집을보십시오.
Mama Fun Roll

APL 기호를 잘 사용 합니다.
lirtosiast

Hehe, 그 상징은에 가장 적합한 상징이었다 /g.
Mama Fun Roll

1

파이썬, 96

x=input()
print("#")
for i in range(3):
    print(hex(255-int(x[(1+2*i)]+x[(2+2*i)],16))[2:4])

첫 번째 코드 골프, 의견을주세요 :)


입력이 "quotes"btw 이어야 하므로 input()작동합니다. 줄 바꿈이 필요없고 for 루프에 들여 쓰기가 필요 없으며 range정상적으로 작동합니다. 제거 할 수있는 몇 개의 공백도 있습니다.
Rɪᴋᴇʀ

int("ff", 16)그냥로 대체 할 수 있습니다 255.
Doorknob

x마다 괄호 안에 괄호가 필요합니까?
Blue

0

CJam, 16 바이트

qA,'G,65>+s_W%er

CJam은 기본 변경 사항을 다르게 처리하기 때문에 상당히 길기 때문에 음역을하는 것이 더 짧았습니다. 음역에 대한 자세한 내용은 Retina 답변 을 참조하십시오 .

온라인으로 사용해보십시오.

설명

q      e# Get the input
A,     e# Push [0 1 ... 8 9]
'G,65> e# Push "ABCDEF"
+s     e# Combine and convert to string
_W%    e# Make a copy and reverse it
er     e# Replace each character in the first string with
       e# the corresponding character in the second

0

파이썬 3, 44 바이트

원래 내가 사용 256^316^6. 그런 다음 Pietu1998을 보았고 이제이 8^8솔루션이 대신 사용합니다.

"#{:06x}".format(8**8-1-int(input()[1:],16))

0

자바, 95 90 바이트

String f(String v){return v.format("#%06x",0xFFFFFF^Integer.parseInt(v.substring(1),16));}

비트 XOR.


0

배쉬 + tr, 35 바이트

tr 0-9A-Fa-f fedcba9876543210543210

출력은 항상 소문자입니다.

불행히도 "tr"은 범위를 역순으로 취하지 않으므로 철자를 써야했습니다.


0

C, 147 바이트

void p(char s[]){char c[3];int i=1;printf("#");while(i<6){strncpy(c,s+i++,2);i++;int x=255-strtol(c,NULL,16);x<10?printf("0%x",x):printf("%x",x);}}

strtol을 사용하여 16 진수 문자열을 int로 변환 한 다음 원래 게시물과 같은 칭찬을 얻기 위해 255에서 숫자를 뺍니다. 그러나 s에서 strtol까지 다양한 문자를 전달할 수있는 방법이 있는지 궁금해서 새 문자열에 복사하는 많은 바이트를 낭비하지 않아도됩니까?


컴파일러가 일반적으로 함수 반환을 강제하고 int를 기본값으로 사용한다고 생각하지 않으므로 아마도 void반환 유형을 생략 하시겠습니까?
Liam

0

R, 62 바이트

f=function(a)sprintf('#%06x',(8^8-1)-strtoi(substr(a,2,7),16))

0

sed, 48 바이트

y/0123456789ABCDEFabcdef/fedcba9876543210543210/

하나의 케이스 만 지원해야하는 경우 36 바이트.


소문자와 대문자를 모두 지원할 필요는 없습니다.
Martin Ender 2016 년

@ MartinBüttner 질문은 입력에서 두 가지 경우 모두 지원해야하지만 출력에서는 지원하지 않는 것 같습니다. 내 bash + tr 솔루션과 마찬가지로이 솔루션은 입력시 모두를 지원하지만 소문자 출력 만 씁니다.
Glenn Randers-Pehrson

0코드 사이에 여분 의 코드가 있습니다 (바이트 수는 정확하지만 복사 오류 여야합니다). 9A
홉스

질문은 입력과 출력의 경우를 선택할 수 있다고 말합니다.
lirtosiast

0

PowerShell, 48 바이트

param($a)"#{0:x6}"-f(16MB-1-("0x"+$a.Trim('#')))

반드시 통해 입력을 받아 param($a)와 구분 된 문자열로 '또는 "이후 C:\Tools\Scripts\Golfing> .\complementary-colors #a1b2c3처리됩니다 PowerShell 명령 줄에 #a1b2c3주석으로 즉결를 무시합니다.

왼쪽에서 오른쪽으로, "#{0:x6}"-f(...)우리의 출력 계산 형식은 보장 된 6 문자 (입력을 고려하여 #ffffff) 로 16 진수로 다시 포맷합니다 . Parens 내부에서에서 입력 번호를 뺍니다 0xffffff. 이 작업은 PowerShell이 ​​16 진수 형식의 형식을 구문 분석한다는 사실을 활용하여 0xNNN입력 숫자에서 올바른 형식의 16 진수를 구성합니다 $a. 연결 더하기 .Trim().Replace()여기 보다 1 바이트 더 짧습니다 . 또한 MB단항 연산자를 통해 대신에 16MB-1구성 16777215합니다 0xffffff.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.