Komplementärfarben

26

Wenn Sie eine Farbe im #rrggbbHex-Format eingeben, geben Sie das RGB-Komplement im gleichen Format aus.

Das RGB-Komplement R 2 G 2 B 2 einer beliebigen Farbe R 1 G 1 B 1 ist als die Farbe mit R 2 -Wert 255 - R 1 , B 2 -Wert 255 - B 1 und G 2 -Wert 255 - G 1 definiert .

Hexadezimalzahlen können entweder in Großbuchstaben (# FFAA20) oder in Kleinbuchstaben (# ffaa20) angegeben werden. Die Groß- und Kleinschreibung der Ein- und Ausgabe muss nicht konsistent sein (Sie können also die Eingabe in Kleinbuchstaben, die Ausgabe in Großbuchstaben und umgekehrt vornehmen).

Da es sich um , der kürzeste Code in Bytes gewinnt.

Testfälle (Beachten Sie, dass die Testfälle in beide Richtungen funktionieren sollten, da eine eigene Ausgabe Ihres Programms / Ihrer Funktion zur ursprünglichen Eingabe führen sollte (dies ist unabdingbar )):

In/Out   Out/In
----------------
#ffffff  #000000
#abcdef  #543210
#badcab  #452354
#133742  #ecc8bd
#a1b2c3  #5e4d3c
#7f7f80  #80807f
Türknauf
quelle
2
Es tut mir leid, aber sRGB funktioniert nicht so. Sie sollten zuerst in den linearen Raum konvertieren, die Hex-Codes sind nicht in.
John Dvorak
2
@ JanDvorak Na ja. Der Stand der Herausforderung wird dann meine Ignoranz widerspiegeln, da ich es jetzt nicht wirklich ändern kann. : P
Türklinke
Die Mittelung von zwei Werten in sRGB könnte jedoch eine separate Herausforderung sein. sRGB = RGB ^ 0,45 über den größten Teil des Bereichs, jedoch linear am unteren Rand des Bereichs.
John Dvorak

Antworten:

17

Pyth, 9 8 Bytes

Vielen Dank an @isaacg für -1 Byte!

sXz.HM16

Das Subtrahieren des Werts einer bestimmten Farbe von 255 entspricht dem Subtrahieren der hexadezimalen Ziffern von 15. Angenommen, eine Zahl ist 16a + b . Dann ist der Wert der Zahl, die durch Subtrahieren ihrer Ziffern von 15 erzeugt wird, 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 +

Probieren Sie es hier aus . Testsuite.

Lirtosiast
quelle
Gute Antwort! Ich habe mir deine Idee geborgt '0123456789abcdef', Hex zu konvertieren (anstatt zu dec2hexfunktionieren)
Luis Mendo
Ich denke dein Link ist falsch. ( Kopieren-Einfügen FTW. )
PurkkaKoodari
@ Pietu1998 Whoops; Ich werde es reparieren.
Lirtosiast
Das Uist unnötig - es wird implizit von ausgefüllt M.
Isaacg
6

Retina, 13 10 Bytes

T`w`G-A9-0

Der Code besteht aus drei Teilen, die durch Backticks ( `) getrennt sind: Gibt den TTranskriptionsmodus an, bei dem jedes Zeichen im zweiten Teil durch das entsprechende Zeichen im dritten Teil ersetzt wird.

wist das Gleiche wie traditionelles Regex \woder _0-9A-Za-z, das zu erweitert wird _0123456789ABCDEFGH....

Der zweite Teil wird erweitert GFEDCBA9876543210, dank Retinas geschickter Fähigkeit, in umgekehrter Reihenfolge zu expandieren. Wenn Sie diese aufeinander legen, erhalten Sie:

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

Beachten Sie, dass das letzte Zeichen 0wiederholt wird, um der Länge der längeren Zeichenfolge zu entsprechen. Es werden jedoch nur die hexadezimalen Zeichen berücksichtigt, die durch Carets angezeigt werden.

Vielen Dank an Martin Büttner für diesen Vorschlag.

Probieren Sie die Testsuite online aus.

NinjaBearMonkey
quelle
4

Marbelous, 41 Bytes

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

Online-Dolmetscher hier. Die Eingabe sollte in Großbuchstaben erfolgen.

Erläuterung

Das 00und ]]am unteren Rand ruft das erste Zeichen (das #) ab, und es wird am unteren Rand abgelegt und vor allen anderen ausgegeben.

Die ersten 3 Zeilen sind eine Schleife, um alle verbleibenden Zeichen abzurufen.

Zuerst müssen wir die hexadezimalen Zeichen in 0-15 konvertieren, indem wir tun x -= 48, x -= x > 9 ? 7 : 0(da 'A' - '9'ist 8).

Um das Komplement zu finden, müssen wir einfach jede Ziffer xin konvertieren 15-x. Dies entspricht (für 8-Bit-Werte) (~x)+16 = ~(x-16).

Zum Schluss müssen wir diese Zahlen wieder in hexadezimale Ziffern umwandeln x += x > 9 ? 7 : 0, x += 48.

Also jetzt haben wir x -= 48, x -= x > 9 ? 7 : 0, x = ~(x - 16), x += x > 9 ? 7 : 0, x += 48.

Beachten Sie, dass, wenn Sie den Ausdruck mit dem ersten ternären Operator entfernen, die Eingabe von Ziffern A- Fnach der Negation ein negatives x ergibt.

Daher können wir den vorherigen Ausdruck in: ändern x -= 48, x -= 16, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48, was gleich ist x -= 64, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48.

Der obige Code ist nur eine Implementierung des letzten Ausdrucks. -Wist x -= 32und +Oist x += 24. Da Marbelous vorzeichenlose 8-Bit-Arithmetik verwendet, <Adeckt die Bedingung sowohl den Fall x > 9als auch ab x < 0.

es1024
quelle
Hast du Marbelous erschaffen?
1.
@RikerW Marbelous wurde von mehreren PPCG-Benutzern erstellt / ausgearbeitet, einschließlich mir selbst: Siehe hier .
es1024
Okay. Danke für die Information.
1.
4

JavaScript ES6, 61 Bytes 66 68 48 53 64

Spart dank @ Cᴏɴᴏʀ O'Bʀɪᴇɴ, @NinjaBearMonkey und @nderscore einige Bytes

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

Nutzt das Auto-Type-Casting. Durch das Korrigieren der Nullen wurde die Anzahl der Bytes verringert

Downgoat
quelle
Verwenden Sie eval(`0x${s.slice(1)}`)anstelle vonparseInt
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Das ist die gleiche Länge?
PurkkaKoodari
@ CᴏɴᴏʀO'Bʀɪᴇɴ danke, ich habe - anstelle von eval noch mehr Bytes gespart
Downgoat
Oh, ich habe das Auto Type Casting vergessen: D
Conor O'Brien
Probieren Sie es mit der Eingabe #FFFFFF. Rückgabe #0.
Conor O'Brien
4

JavaScript ES6, 63 58 52 49 Bytes

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

Danke an nderscore für das Speichern von 11 Bytes!

nicael
quelle
-5 bytes:c=>"#"+[...c].map(x=>"fedcba9876543210"[+('0x'+x)]).join``
nderscore
@nder genau, schon drüber nachgedacht :) Danke. Wollte es benutzen, aber mit "eval".
Nicoleel
1
ah, ich habe noch einen -6:c=>c.replace(/\w/g,x=>"fedcba9876543210"[+('0x'+x)])
nderscore
3

Jolf, 17 Bytes

pq#-w^88C Li1~560
pq                pad
         _Li1     the input, w/out the first char
        C    ~5   parsed as a base-16 integer (~5 = 16)
    w^88          8 ^ 8 - 1 (the magic number)
   -              subtract the parsed input from said number
  #               convert result to hexadecimal
               60 pad the result with 6 0's

Probieren Sie es hier aus! , Testsuite (Verwenden Sie die Vollversion, die jetzt funktioniert.)

Conor O'Brien
quelle
3

Julia, 74 49 Bytes

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

Im Moment ziemlich lang, aber es ist ein Anfang. Dies ist eine Lambda-Funktion, die eine Zeichenfolge akzeptiert und eine Zeichenfolge zurückgibt. Die Ausgabe erfolgt in Kleinbuchstaben, die Eingabe kann jedoch auch in beiden Formaten erfolgen.

Wie Thomas bemerkte , ist das Subtrahieren jeder zweistelligen Farbkomponente von 255 gleichbedeutend mit dem Subtrahieren jeder einzelnen Ziffer in der hexadezimalen Eingabe von 15. Durchlaufen Sie die Eingabezeichenfolge mit Ausnahme der führenden #und konvertieren Sie 15 - die analysierte Ziffer in hexadezimal. Wir schließen uns all diesen an und wenden ein an #und bezeichnen es als gut.

Alex A.
quelle
3

Japt , 35 32 22 20 16 15 Bytes

¡Y?(F-XnG)sG :X

Erläuterung:

¡                 //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)
nicael
quelle
Schön! Ich habe das letzte Nacht gesehen und sagte mir: "Morgen helfe ich beim Golfspielen." Aber jetzt haben Sie es weiter golfen, als ich für möglich gehalten habe. :)
ETHproductions
2

Perl, 30 Bytes

beinhaltet +1 für -p

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

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

Kenney
quelle
2

MATL , 21 Bytes

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

Hierbei wird Version 6.0.0 der Sprache / des Compilers verwendet, die älter ist als die Herausforderung.

Eingabestellen sollten in Großbuchstaben eingegeben werden.

Beispiel

Dies wurde auf Octave ausgeführt:

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

Bearbeiten (12. Juni 2016)

Der Code kann jetzt online ausprobiert werden . Kommas müssen durch Leerzeichen ersetzt werden und 6Ldurch 4L, um Änderungen in der Sprache zu entsprechen.

Erläuterung

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 '#'
Luis Mendo
quelle
1

Pyth, 20 bis 19 Bytes

1 Byte dank xnor .

%"#%06x"-t^8 8itz16

Probieren Sie es online aus. Testsuite.

Erläuterung

  • z ist der Eingang
  • tz entfernt die #
  • itz16 Parst als Hexadezimalzahl
  • t^8 8berechnet 8 8 - 1
  • -t^8 8itz16berechnet 8 8 - 1 - Eingang
  • %"#%06x"-t^2 24itz16 formatiert es in eine mit Nullen aufgefüllte 6-stellige Hex-Zeichenfolge und fügt die #
PurkkaKoodari
quelle
Wie wäre es mit 8 ^ 8 für 2 ^ 24?
xnor
1

Haskell, 85 Bytes

Meine erste Einreichung, es wird wahrscheinlich die längste sein (85 Bytes), aber hey, du musst irgendwo anfangen. In Haskell:

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

Es wird derselbe Subtraktions-15-Trick verwendet, den andere Leute verwendet haben.

Ich habe auch versucht, printf zusammen mit dem anderen Trick zu verwenden (subtrahiere 8 ^ 8 - 1) und es funktioniert in ghci, aber aus irgendeinem Grund kompiliert es nicht:

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

Wenn jemand diese Arbeit machen könnte, wäre das großartig!

Papez
quelle
Willkommen bei Programming Puzzles und Code Golf. Das sind sehr gute Antworten (besser als ich es in Haskell tun könnte!). Es gibt jedoch ein allgemeines Antwortformat für Code-Golf-Herausforderungen, mit dem das Leaderboard-Snippet Ihre Antwort in das Leaderboard einfügt. Ich bearbeite es für Sie. Sie können die Bearbeitung akzeptieren oder ablehnen.
wizzwizz4
Geben Sie ein, um auf die Kommentare anderer Benutzer zu antworten @username.
wizzwizz4
@ wizzwizz4 Vielen Dank für Ihre Hilfe.
Papez
Jederzeit! Möchten Sie einige meiner Herausforderungen angehen? Analyse deines Stuhls und Map-Strings nach Hilbert Curve sind meine Favoriten, obwohl die Hilbert-Kurve eine wirklich harte ist.
wizzwizz4
@wizzwizz4 Natürlich werde ich mal sehen, was ich tun kann.
Papez
1

Mathematica, 69-60 Bytes

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

Wieder einmal ist es die String-Verarbeitung, die mich hier umbringt.

LegionMammal978
quelle
1

C 94 Bytes

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

Die Funktion nimmt ein char-Array auf und gibt einen inversen Wert zurück. Erzeugt Großbuchstaben zur Antwort. Der Code kippt jedes ASCII-Hex-Zeichen in sein Inverses, wenn es gültig ist, und ignoriert es ansonsten.

Dave P.
quelle
Sie können Platz sparen, indem Sie global ivor der Funktion i;
Liam
1

𝔼𝕊𝕄𝕚𝕟 2, 18 Zeichen / 34 Bytes

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

Try it here (Firefox only).

Verwenden einer nach der Challenge erstellten Version.

Erläuterung

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

Nicht wettbewerbsfähige Lösung, 15 Zeichen / 29 Byte

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

Verwendet die Transliteration.

Mama Fun Roll
quelle
Können Sie auch eine Konkurrenzversion hinzufügen, damit wir sehen können, wie sich die Sprache aufbaut?
Lirtosiast
Sicher. Siehe neue Bearbeitung.
Mama Fun Roll
Gute Verwendung des APL-Symbols .
Lirtosiast
Hehe, dieses Symbol war das, für das es am sinnvollsten war /g.
Mama Fun Roll
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])

Erster Code Golf, bitte geben Sie Ihre Meinung :)

Meow Mix
quelle
Die Eingabe muss zwischendurch "quotes"erfolgen, input()funktioniert also. Sie brauchen kein Zeilenvorschub und keinen Einzug in der for-Schleife und das rangefunktioniert einwandfrei . Es gibt auch ein paar Leerzeichen, die Sie entfernen können.
13.
int("ff", 16)kann mit nur ersetzt werden 255.
Türklinke
Benötigen Sie die Klammern in den Klammern nach jedem x?
Blue
0

CJam, 16 Bytes

qA,'G,65>+s_W%er

Dies ist ziemlich lang, da CJam Basisänderungen anders handhabt, so dass es kürzer war, nur eine Transliteration durchzuführen. Weitere Informationen zur Transliteration finden Sie in der Antwort auf meine Retina .

Probieren Sie es online aus.

Erläuterung

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
NinjaBearMonkey
quelle
0

Python 3, 44 Bytes

Ursprünglich habe ich 256^3dann verwendet 16^6. Dann habe ich Pietu1998's gesehen 8^8und jetzt nutzt diese Lösung das stattdessen.

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

Java, 95 bis 90 Byte

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

Bitweises XOR.

SuperJedi224
quelle
0

Bash + tr, 35 Bytes

tr 0-9A-Fa-f fedcba9876543210543210

Die Ausgabe erfolgt immer in Kleinbuchstaben.

Leider nimmt "tr" die Bereiche nicht in umgekehrter Reihenfolge, so dass ich sie buchstabieren musste.

Glenn Randers-Pehrson
quelle
0

C 147 Bytes

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

Verwendete strtol, um von hexadezimaler Zeichenfolge zu int zu konvertieren, subtrahierte dann die Zahl von 255, um das Kompliment zu erhalten, wie der ursprüngliche Beitrag sagte. Ich frage mich jedoch, ob es eine Möglichkeit gibt, eine Reihe von Zeichen von s an strtol zu übergeben, damit ich nicht eine Menge Bytes verschwenden muss, die in eine neue Zeichenfolge kopiert werden.

Danwakeem
quelle
Ich glaube nicht, dass Compiler normalerweise Funktionsrückgaben erzwingen und standardmäßig int verwenden, sodass Sie den voidRückgabetyp wahrscheinlich weglassen ?
Liam
0

R, 62 Bytes

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

sed, 48 bytes

y/0123456789ABCDEFabcdef/fedcba9876543210543210/

Oder 36 Bytes, wenn Sie nur einen Fall unterstützen müssen.

Neil
quelle
Sie müssen weder Kleinbuchstaben noch Großbuchstaben unterstützen.
Martin Ender
@ Martinbüttner die frage scheint in beiden fällen unterstützung bei der eingabe zu erfordern, aber nicht bei der ausgabe. Wie meine bash + tr-Lösung unterstützt diese Lösung sowohl die Eingabe als auch die Ausgabe in Kleinbuchstaben.
Glenn Randers-Pehrson
Sie haben ein Extra 0in Ihrem Code zwischen 9und A(die Anzahl der Bytes ist jedoch korrekt, muss ein Kopierfehler sein).
Hobbs
Die Frage besagt, dass Sie auswählen können, in welchem ​​Fall Ihre Eingabe und Ausgabe erfolgt.
Lirtosiast
0

PowerShell, 48 Byte

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

Nimmt Eingaben über param($a)als Zeichenfolge an, die mit 'oder getrennt sind ", da sie C:\Tools\Scripts\Golfing> .\complementary-colors #a1b2c3in der PowerShell-Befehlszeile #a1b2c3als Kommentar behandelt und zusammenfassend ignoriert werden.

Von links nach rechts werden "#{0:x6}"-f(...)unsere Ausgabeberechnungen wieder hexadezimal mit garantierten 6 Zeichen formatiert (um die Eingabe zu berücksichtigen #ffffff). Innerhalb der Parens subtrahieren wir unsere Eingabenummer von 0xffffff. Dazu nutzen wir die Tatsache, dass PowerShell hexadezimale Zahlen im Format analysiert 0xNNN, sodass wir aus unserer Eingabenummer eine Hexadezimalzahl im richtigen Format erstellen $a. (Beachten Sie, dass die Verkettung plus um ein Byte .Trim()kürzer ist als .Replace()hier.) Wir nutzen auch den MBunären Operator via 16MB-1, um 16777215anstelle von zu konstruieren 0xffffff.

AdmBorkBork
quelle
0

TeaScript, 24 Bytes

"#"+S(8**8-1-xS1)t16))x6

Fehler im Interpreter lassen mich nicht kürzer werden :(

Probieren Sie es online aus

Downgoat
quelle
Downvote Erklärung? Es funktioniert für alle Testfälle
Downgoat