Wenn Sie eine Farbe im #rrggbb
Hex-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 Code-Golf , 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
Antworten:
Pyth,
98 BytesVielen Dank an @isaacg für -1 Byte!
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) .
Probieren Sie es hier aus . Testsuite.
quelle
'0123456789abcdef'
, Hex zu konvertieren (anstatt zudec2hex
funktionieren)U
ist unnötig - es wird implizit von ausgefülltM
.Retina,
1310 BytesDer Code besteht aus drei Teilen, die durch Backticks (
`
) getrennt sind: Gibt denT
Transkriptionsmodus an, bei dem jedes Zeichen im zweiten Teil durch das entsprechende Zeichen im dritten Teil ersetzt wird.w
ist das Gleiche wie traditionelles Regex\w
oder_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:Beachten Sie, dass das letzte Zeichen
0
wiederholt 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.
quelle
Marbelous, 41 Bytes
Online-Dolmetscher hier. Die Eingabe sollte in Großbuchstaben erfolgen.
Erläuterung
Das
00
und]]
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
x
in konvertieren15-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
-F
nach 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 istx -= 64, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48
.Der obige Code ist nur eine Implementierung des letzten Ausdrucks.
-W
istx -= 32
und+O
istx += 24
. Da Marbelous vorzeichenlose 8-Bit-Arithmetik verwendet,<A
deckt die Bedingung sowohl den Fallx > 9
als auch abx < 0
.quelle
JavaScript ES6, 61 Bytes
66 68 48 53 64Spart dank @ Cᴏɴᴏʀ O'Bʀɪᴇɴ, @NinjaBearMonkey und @nderscore einige Bytes
Nutzt das Auto-Type-Casting. Durch das Korrigieren der Nullen wurde die Anzahl der Bytes verringert
quelle
eval(`0x${s.slice(1)}`)
anstelle vonparseInt
-
anstelle von eval noch mehr Bytes gespart#FFFFFF
. Rückgabe#0
.JavaScript ES6,
63585249 BytesDanke an nderscore für das Speichern von 11 Bytes!
quelle
c=>"#"+[...c].map(x=>"fedcba9876543210"[+('0x'+x)]).join``
c=>c.replace(/\w/g,x=>"fedcba9876543210"[+('0x'+x)])
Jolf, 17 Bytes
Probieren Sie es hier aus! , Testsuite (Verwenden Sie die Vollversion, die jetzt funktioniert.)
quelle
Julia,
7449 BytesIm 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.quelle
Japt ,
353222201615 BytesErläuterung:
quelle
Perl, 30 Bytes
beinhaltet +1 für
-p
Verwendung:
echo #000000 | perl -p file.pl
oder
echo #000000 | perl -pe 's/\w/sprintf"%x",15&~hex$&/eg'
.quelle
MATL , 21 Bytes
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:
Bearbeiten (12. Juni 2016)
Der Code kann jetzt online ausprobiert werden . Kommas müssen durch Leerzeichen ersetzt werden und
6L
durch4L
, um Änderungen in der Sprache zu entsprechen.Erläuterung
quelle
Pyth,
20 bis19 Bytes1 Byte dank xnor .
Probieren Sie es online aus. Testsuite.
Erläuterung
z
ist der Eingangtz
entfernt die#
itz16
Parst als Hexadezimalzahlt^8 8
berechnet 8 8 - 1-t^8 8itz16
berechnet 8 8 - 1 - Eingang%"#%06x"-t^2 24itz16
formatiert es in eine mit Nullen aufgefüllte 6-stellige Hex-Zeichenfolge und fügt die#
quelle
Haskell, 85 Bytes
Meine erste Einreichung, es wird wahrscheinlich die längste sein (85 Bytes), aber hey, du musst irgendwo anfangen. In Haskell:
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:
Wenn jemand diese Arbeit machen könnte, wäre das großartig!
quelle
@username
.Mathematica,
69-60BytesWieder einmal ist es die String-Verarbeitung, die mich hier umbringt.
quelle
C 94 Bytes
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.
quelle
i
vor der Funktioni;
𝔼𝕊𝕄𝕚𝕟 2, 18 Zeichen / 34 Bytes
Try it here (Firefox only).
Verwenden einer nach der Challenge erstellten Version.
Erläuterung
Nicht wettbewerbsfähige Lösung, 15 Zeichen / 29 Byte
Verwendet die Transliteration.
quelle
⌿
./g
.Python, 96
Erster Code Golf, bitte geben Sie Ihre Meinung :)
quelle
"quotes"
erfolgen,input()
funktioniert also. Sie brauchen kein Zeilenvorschub und keinen Einzug in der for-Schleife und dasrange
funktioniert einwandfrei . Es gibt auch ein paar Leerzeichen, die Sie entfernen können.int("ff", 16)
kann mit nur ersetzt werden255
.CJam, 16 Bytes
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
quelle
Python 3, 44 Bytes
Ursprünglich habe ich
256^3
dann verwendet16^6
. Dann habe ich Pietu1998's gesehen8^8
und jetzt nutzt diese Lösung das stattdessen.quelle
Java,
95 bis90 ByteBitweises XOR.
quelle
Bash + tr, 35 Bytes
Die Ausgabe erfolgt immer in Kleinbuchstaben.
Leider nimmt "tr" die Bereiche nicht in umgekehrter Reihenfolge, so dass ich sie buchstabieren musste.
quelle
C 147 Bytes
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.
quelle
void
Rückgabetyp wahrscheinlich weglassen ?R, 62 Bytes
quelle
sed, 48 bytes
Oder 36 Bytes, wenn Sie nur einen Fall unterstützen müssen.
quelle
0
in Ihrem Code zwischen9
undA
(die Anzahl der Bytes ist jedoch korrekt, muss ein Kopierfehler sein).PowerShell, 48 Byte
Nimmt Eingaben über
param($a)
als Zeichenfolge an, die mit'
oder getrennt sind"
, da sieC:\Tools\Scripts\Golfing> .\complementary-colors #a1b2c3
in der PowerShell-Befehlszeile#a1b2c3
als 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 von0xffffff
. Dazu nutzen wir die Tatsache, dass PowerShell hexadezimale Zahlen im Format analysiert0xNNN
, 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 denMB
unären Operator via16MB-1
, um16777215
anstelle von zu konstruieren0xffffff
.quelle
TeaScript, 24 Bytes
Fehler im Interpreter lassen mich nicht kürzer werden :(
Probieren Sie es online aus
quelle