Étant donné une entrée d'une couleur au #rrggbb
format hexadécimal, sortez son complément RVB dans le même format.
Le complément RVB R 2 G 2 B 2 de n'importe quelle couleur R 1 G 1 B 1 est défini comme la couleur avec la valeur R 2 255 - R 1 , la valeur B 2 255 - B 1 et la valeur G 2 255 - G 1 .
Les chiffres hexadécimaux peuvent être en majuscules (# FFAA20) ou en minuscules (# ffaa20). Le cas de l'entrée et de la sortie n'a pas besoin d'être cohérent (vous pouvez donc prendre l'entrée en minuscules mais la sortie en majuscules et vice versa).
Puisqu'il s'agit de code-golf , le code le plus court en octets l'emporte.
Cas de test (notez que puisque donner à votre programme / fonction sa propre sortie devrait entraîner l'entrée d'origine (elle est involutive ), les cas de test devraient fonctionner dans les deux sens):
In/Out Out/In
----------------
#ffffff #000000
#abcdef #543210
#badcab #452354
#133742 #ecc8bd
#a1b2c3 #5e4d3c
#7f7f80 #80807f
Réponses:
Pyth,
98 octetsMerci à @isaacg pour -1 octet!
Soustraire la valeur d'une certaine couleur de 255 équivaut à soustraire chacun de ses chiffres hexadécimaux de 15. Disons qu'un nombre est 16a + b . Ensuite, la valeur du nombre créé en soustrayant ses chiffres de 15 est 16 (15-a) + (15-b) = 255 - (16a + b) .
Essayez-le ici . Suite de tests.
la source
'0123456789abcdef'
pour convertir en hexadécimal (au lieu dedec2hex
fonction)U
n'est pas nécessaire - il est implicitement rempli parM
.Rétine,
1310 octetsLe code comporte trois parties, séparées par des backticks (
`
):T
spécifie le mode de translittération, qui remplace chaque caractère dans la deuxième partie par son caractère correspondant dans la troisième partie.w
est le même que les regex traditionnels\w
, ou_0-9A-Za-z
, qui est étendu à_0123456789ABCDEFGH...
.La deuxième partie est étendue à
GFEDCBA9876543210
, grâce à la capacité astucieuse de Retina à se développer dans l'ordre inverse. Mettez-les les uns sur les autres, et nous obtenons:Notez que le dernier caractère
0
,, est répété pour s'adapter à la longueur de la chaîne la plus longue, mais nous ne nous soucions que des caractères hexadécimaux, indiqués par des carets.Merci à Martin Büttner d'avoir proposé cette approche.
Essayez la suite de tests en ligne.
la source
Marbelous, 41 octets
Interprète en ligne ici. L'entrée doit être en majuscules.
Explication
Le
00
et]]
en bas récupérera le premier caractère (le#
) et il tombera en bas et sera sorti avant toute autre chose.Les 3 premières lignes sont une boucle pour récupérer tous les caractères restants.
Nous devons d'abord convertir les caractères hexadécimaux en 0-15, en faisant
x -= 48, x -= x > 9 ? 7 : 0
(puisque'A' - '9'
c'est 8).Pour trouver le complément, nous devons simplement convertir chaque chiffre
x
en15-x
. Cela équivaut à (pour les valeurs 8 bits)(~x)+16 = ~(x-16)
.Enfin, nous devons reconvertir ces nombres en chiffres hexadécimaux, en faisant
x += x > 9 ? 7 : 0, x += 48
.Alors maintenant, nous l'avons
x -= 48, x -= x > 9 ? 7 : 0, x = ~(x - 16), x += x > 9 ? 7 : 0, x += 48
.Notez que si nous supprimons l'expression avec le premier opérateur ternaire, les chiffres entrés
A
-F
donneront un x négatif après la négation.Ainsi, nous pouvons changer l'expression précédente en:,
x -= 48, x -= 16, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48
qui est égal àx -= 64, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48
.Le code ci-dessus n'est qu'une implémentation de la dernière expression.
-W
estx -= 32
et+O
estx += 24
. Puisque Marbelous utilise une arithmétique 8 bits non signée, la condition<A
couvre à la fois le cas dex > 9
etx < 0
.la source
JavaScript ES6, 61 octets
66 68 48 53 64Enregistre pas mal d'octets grâce à @ Cᴏɴᴏʀ O'Bʀɪᴇɴ, @NinjaBearMonkey et @nderscore
Profite de la coulée de type automatique. La correction des zéros a tué le nombre d'octets
la source
eval(`0x${s.slice(1)}`)
au lieu deparseInt
-
au lieu d'eval qui a sauvé encore plus d'octets#FFFFFF
. Retours#0
.JavaScript ES6,
63585249 octetsMerci à nderscore pour avoir économisé 11 octets!
la source
c=>"#"+[...c].map(x=>"fedcba9876543210"[+('0x'+x)]).join``
c=>c.replace(/\w/g,x=>"fedcba9876543210"[+('0x'+x)])
Jolf, 17 octets
Essayez-le ici! , Suite de tests (utilisez l'exécution complète, qui fonctionne maintenant.)
la source
Julia,
7449 octetsAssez long pour le moment mais c'est un début. Il s'agit d'une fonction lambda qui accepte une chaîne et renvoie une chaîne. La sortie sera en minuscules mais l'entrée peut être dans l'un ou l'autre.
Comme Thomas l'a noté , la soustraction de chaque composant de couleur à 2 chiffres de 255 équivaut à soustraire chaque chiffre individuel de l'entrée hexadécimale de 15. En boucle sur la chaîne d'entrée, à l'exclusion de l'interligne
#
, nous convertissons 15 - le chiffre analysé en hexadécimal. Nous nous joignons à tous, puis plaquons sur un#
et le qualifions de bon.la source
Japt ,
353222201615 octetsExplication:
la source
Perl, 30 octets
comprend +1 pour
-p
utilisation:
echo #000000 | perl -p file.pl
ou
echo #000000 | perl -pe 's/\w/sprintf"%x",15&~hex$&/eg'
.la source
MATL , 21 octets
Cela utilise la version 6.0.0 du langage / compilateur, qui est antérieure au défi.
Les chiffres d'entrée doivent être en majuscules.
Exemple
Cela a été exécuté sur Octave:
Edit (12 juin 2016)
Le code peut maintenant être essayé en ligne . Les virgules doivent être remplacées par des espaces et
6L
par4L
pour se conformer aux changements de langue.Explication
la source
Pyth,
2019 octets1 octet grâce à xnor .
Essayez-le en ligne. Suite de tests.
Explication
z
est l'entréetz
supprime le#
itz16
analyse comme un nombre hexadécimalt^8 8
calcule 8 8 - 1-t^8 8itz16
calcule 8 8-1 - entrée%"#%06x"-t^2 24itz16
le formate en une chaîne hexadécimale à six caractères et ajoute le#
la source
Haskell, 85 octets
Ma première soumission, ce sera probablement la plus longue (85 octets) mais bon, il faut commencer quelque part. À Haskell:
Il utilise la même soustraction de 15 tours que j'ai vu utiliser par d'autres personnes.
J'ai également essayé d'utiliser printf avec l'autre astuce (soustrayez 8 ^ 8 - 1) et cela fonctionne dans ghci mais pour une raison quelconque, il ne compile pas:
Si quelqu'un pouvait faire ce travail, ce serait génial!
la source
@username
.Mathematica,
6960 octetsEncore une fois, c'est le traitement des chaînes qui me tue ici.
la source
C, 94 octets
La fonction prend un tableau de caractères, renvoie une valeur inverse. Produit des lettres majuscules pour la réponse. Le code retourne chaque caractère hexadécimal ASCII à son inverse s'il est valide, l'ignore sinon.
la source
i
avant la fonction:i;
𝔼𝕊𝕄𝕚𝕟 2, 18 caractères / 34 octets
Try it here (Firefox only).
Utilisation d'une version créée après le challenge.
Explication
Solution non compétitive, 15 caractères / 29 octets
Utilise la translittération.
la source
⌿
./g
.Python, 96
Premier code de golf, veuillez donner des avis :)
la source
"quotes"
btw, donc çainput()
marche. Vous n'avez pas besoin de la nouvelle ligne et du retrait sur la boucle for, et celarange
fonctionne très bien. Il y a aussi quelques espaces que vous pouvez supprimer.int("ff", 16)
peut être remplacé par juste255
.CJam, 16 octets
C'est assez long car CJam gère les changements de base différemment, il était donc plus court de ne faire que la translittération. Voir ma réponse Retina pour plus d'informations sur la translittération.
Essayez-le en ligne.
Explication
la source
Python 3, 44 octets
A l' origine je
256^3
puis16^6
. Ensuite, j'ai vu Pietu19988^8
et maintenant cette solution l'utilise à la place.la source
Java,
9590 octetsXOR au niveau du bit.
la source
Bash + tr, 35 octets
La sortie est toujours en minuscules.
Malheureusement, "tr" ne prend pas les plages dans l'ordre inverse, j'ai donc dû les préciser.
la source
C, 147 octets
Utilisé strtol pour convertir de la chaîne hexadécimale en int, puis soustrait le nombre de 255 pour obtenir le compliment comme le poste d'origine l'a dit. Je me demande cependant s'il existe un moyen de passer une plage de caractères de s à strtol, donc je n'ai pas à perdre un tas d'octets à copier dans une nouvelle chaîne?
la source
void
type de retour?R, 62 octets
la source
sed, 48 octets
Ou 36 octets si vous ne devez prendre en charge qu'un seul cas.
la source
0
dans votre code, entre le9
etA
(le nombre d'octets est correct cependant, doit être une erreur de copie).PowerShell, 48 octets
Prend nécessairement l'entrée via
param($a)
comme une chaîne, délimitée par'
ou"
, carC:\Tools\Scripts\Golfing> .\complementary-colors #a1b2c3
sur la ligne de commande PowerShell traitera#a1b2c3
comme un commentaire et l'ignorera sommairement.De gauche à droite, les
"#{0:x6}"-f(...)
formats de nos calculs de sortie sont de nouveau en hexadécimal avec 6 caractères garantis (pour tenir compte de l'entrée#ffffff
). À l'intérieur des parens, nous soustrayons notre numéro d'entrée de0xffffff
. Pour ce faire, nous exploitons le fait que PowerShell analyse les nombres hexadécimaux au format0xNNN
, nous construisons donc un nombre hexadécimal au format approprié à partir de notre numéro d'entrée$a
. (Notez que la concaténation plus.Trim()
est plus courte.Replace()
qu'ici d'un octet.) Nous utilisons également l'MB
opérateur unaire via16MB-1
pour construire à la16777215
place de0xffffff
.la source
TeaScript, 24 octets
Les bugs dans l'interpréteur ne me permettent pas de raccourcir ceci :(
Essayez-le en ligne
la source