補色


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はそのようには機能しません。あなたは、六角コードがにされていない、最初の線形空間に変換する必要があります。
ジョンドヴォルザーク

2
@JanDvorakああまあ。挑戦の状態は、私の無知を反映します。それは、今は本当に変えることができないからです。:P
ドアノブ

ただし、sRGBの2つの値を平均化することは、別の難題かもしれません。ほとんどの範囲でsRGB = RGB ^ 0.45ですが、範囲の底部付近で線形です。
ジョンドボラック

回答:


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'dec2hex関数の代わりに)ヘックスに変換するために使用するというあなたのアイデアを借りた
ルイスメンドー

リンクが間違っていると思います。(FTWをコピーして貼り付けます。
PurkkaKoodari

@ Pietu1998おっと。直します。
リルトシアスト

U不要である-それは暗黙的で記入ますM
isaacg

6

網膜、13 10バイト

T`w`G-A9-0

コードには3つの部分があり、バックティック(`)で区切られていますT。2番目の部分の各文字を3番目の部分の対応する文字で置き換える文字変換モードを指定します。

wは、従来の正規表現と同じ\wであるか_0-9A-Za-z、またはに展開され_0123456789ABCDEFGH...ます。

2番目の部分はGFEDCBA9876543210、Retinaの逆の順序で拡張できる優れた機能のおかげで、に拡張されています。これらを互いに重ねると、次のようになります。

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

最後の文字0が、長い文字列の長さに合うように繰り返されることに注意してください。ただし、キャレットで示される16進文字のみに注意します。

このアプローチを提案してくれたMartinBüttnerに感謝します。

オンラインでテストスイートをお試しください。


4

マーベラス、41バイト

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

オンライン通訳はこちら。入力は大文字にする必要があります。

説明

下部の00and ]]は最初の文字(#)をフェッチし、下部に落ちて他の何かの前に出力されます。

最初の3行は、残りのすべての文字を取得するループです。

最初に、16進数字を0〜15に変換する必要がありますx -= 48, x -= x > 9 ? 7 : 0'A' - '9'8であるため)。

補数を見つけるには、すべての数字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ビット演算を使用するため、条件<Aはとの両方のケースをカバーx > 9x < 0ます。


Marbelousを作成しましたか?
Rɪᴋᴇʀ

@RikerW Marbelousは、私自身を含む複数のPPCGユーザーによって作成/肉付けされました:こちらをご覧ください
es1024

はい。知らせてくれてありがとうございます。
Rɪᴋᴇʀ

4

JavaScript ES6、61バイト66 68 48 53 64

@CᴏɴᴏʀO'Bʀɪᴇɴ、@ NinjaBearMonkey、および@nderscoreのおかげでかなりのバイトを節約できます

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

自動型キャストを利用します。ゼロを修正するとバイトカウントが削除されました


eval(`0x${s.slice(1)}`)代わりに使用parseInt
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴそれは同じ長さですか?
PurkkaKoodari

@CᴏɴᴏʀO'Bʀɪᴇɴありがとう、- さらに多くのバイトを節約したevalの代わりに使用しました
-Downgoat

ああ、自動型キャストを忘れました:D
コナーオブライエン

inputで試してください#FFFFFF。を返します#0
コナーオブライエン

4

JavaScriptの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正確に、すでにそれについて考えた:)ありがとう。それを使用するつもりだったが、「評価」で。
ニカエル

1
ああ、もう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から進入力の個々の数字を引い主要除くと同等である#、我々は15変換-解析された数字を16進数に。私たちはこれらすべてに参加し、#それに取り組み、それを良いと呼びます。


3

Japt35 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

Perl、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日)

これで、コードをオンライン試すことができます。コンマはスペースで交換する必要がある、と6Lすることにより4L、言語の変化に適合するように。

説明

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

Haskell、85バイト

私の最初の提出は、おそらく最長(85バイト)になりますが、ちょっと、どこかから始めなければなりません。Haskellの場合:

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

他の人が使用した15のトリックから同じ減算を使用しています。

また、printfを他のトリック(減算8 ^ 8-1)とともに使用してみましたが、ghciで動作しますが、何らかの理由でコンパイルされません。

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

誰かがこの作品を作れるなら、それは素晴らしいことです!


プログラミングパズルとコードゴルフへようこそ。これらは非常に良い答えです(Haskellでできるよりも良い!)。ただし、Leaderboardスニペットがリーダーボードに回答を入力できるようにするコードゴルフチャレンジの一般的な回答形式があります。あなたのために編集します。編集を承認または拒否できます。
wizzwizz4

他のユーザーのコメントに返信するには、と入力し@usernameます。
wizzwizz4

@ wizzwizz4ご協力ありがとうございます。
lpapez

どんなときも!私の挑戦のいくつかに行きたいですか?ヒルベルトカーブの1つは本当に難しいのですが、椅子ヒルベルトカーブへのマップ文字列を分析することは私のお気に入りです。
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;
リアム・

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⌿,↪(ḏ-`ᶍ⦃$}”ⓧ

音訳を使用します。


競争力のあるバージョンを追加して、言語がどのように積み重なっているかを確認できますか?
リルトシアスト

はい。新しい編集をご覧ください。
ママファンロール

APLシンボルの素晴らしい使用法
リルトジアスト

Hehe、そのシンボルは、最も意味のあるものでした/g
ママファンロール

1

Python、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
ドアノブ

各xの後の括弧内に括弧が必要ですか?
ブルー

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

Python 3、44バイト

もともと私が使用し256^3、その後、16^6。その後、Pietu1998を見ましたが8^8、このソリューションでは代わりにそれを使用しています。

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

0

Java、95 90バイト

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

ビット単位のXOR。


0

Bash + 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戻り値の型を省略しますか?
リアム

0

R、62バイト

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

0

sed、48バイト

y/0123456789ABCDEFabcdef/fedcba9876543210543210/

または、1つのケースのみをサポートする必要がある場合は36バイト。


小文字と大文字の両方をサポートする必要はありません。
マーティンエンダー

@MartinBüttnerは、入力では両方のケースをサポートする必要があるようですが、出力ではサポートしていません。私のbash + trソリューションのように、このソリューションは入力の両方をサポートしますが、小文字の出力のみを書き込みます。
グレンランダース-パーソン

あなたは余分を持っている0間、あなたのコードに9し、A(バイトカウントが正しいしかしである、コピーエラーでなければなりません)。
ホッブズ

質問は、入力と出力のどちらのケースを選択できるかということです。
リルトシアスト

0

PowerShell、48バイト

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

PowerShellのコマンドラインでは次のように処理されるためparam($a)、入力は文字列として、'または"で区切られている必要があります。C:\Tools\Scripts\Golfing> .\complementary-colors #a1b2c3#a1b2c3コメントとしてや即決、それを無視します。

左から右に、"#{0:x6}"-f(...)出力計算を(入力を考慮して#ffffff)保証された6文字で16進数に戻します。括弧の中では、入力番号をから減算します0xffffff。これは、PowerShellが16進数を形式で解析するという事実を活用することで行います0xNNN、入力番号から適切な形式の16進数を作成します$a。(連結plus .Trim().Replace()ここよりも1バイト短いことに注意してください。)また、MB単項演算子via 16MB-1を活用して、の16777215代わりに構築します0xffffff


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.