En CSS, les couleurs peuvent être spécifiées par un "triplet hexadécimal" - un nombre hexadécimal à trois octets (six chiffres) où chaque octet représente les composantes rouge, verte ou bleue de la couleur. Par exemple, #FF0000
est complètement rouge et équivaut à rgb(255, 0, 0)
.
Les couleurs peuvent également être représentées par la notation abrégée qui utilise trois chiffres hexadécimaux. La sténographie s'étend à la forme à six chiffres en dupliquant chaque chiffre. Par exemple, #ABC
devient #AABBCC
.
Puisqu'il y a moins de chiffres dans le raccourci hexadécimal, moins de couleurs peuvent être représentées.
Le défi
Écrivez un programme ou une fonction qui prend un code couleur hexadécimal à six chiffres et génère le code couleur à trois chiffres le plus proche.
Voici un exemple:
- Entrez le code hexadécimal: # 28a086
- Composant rouge
- 0x28 = 40 (décimal)
- 0x22 = 34
- 0x33 = 51
- 0x22 est plus proche, donc le premier chiffre du code de couleur raccourci est 2
- Composant vert
- 0xa0 = 160
- 0x99 = 153
- 0xaa = 170
- 0x99 est plus proche, donc le deuxième chiffre est 9
- Composant bleu
- 0x86 = 134
- 0x77 = 119
- 0x88 = 136
- 0x88 est plus proche, donc le troisième chiffre est 8
- Le code de couleur raccourci est # 298 (qui se développe en # 229988)
Votre programme ou fonction doit accepter comme entrée un code de couleur hexadécimal à six chiffres précédé de #
et sortir un code de couleur à trois chiffres précédé de #
.
Exemples
- # FF0000 → # F00
- # 00FF00 → # 0F0
- # D913C4 → # D1C
- # C0DD39 → # BD3
- # 28A086 → # 298
- # C0CF6F → # BC7
Notation
Il s'agit d'un défi de code-golf, donc la réponse la plus courte dans votre langue l'emporte! Des règles standard s'appliquent.
la source
#
ajoute quelque chose au défi.Réponses:
JavaScript (ES6), 55 octets
Essayez-le en ligne!
la source
05AB1E , 13 octets
Essayez-le en ligne!
Comment?
la source
ć
décapiter " C'est une autre façon de le décrire, lol. : D Belle réponse cependant, +1 de ma part.Japt , 16 octets
Essayez-le ou exécutez tous les cas de test
la source
8088 Assembly, IBM PC DOS,
5958 octetsListe non assemblée:
Exécutable PC DOS autonome. L'entrée se fait via la ligne de commande, la sortie est vers la console.
La majeure partie de la longueur du code gère la conversion des E / S de chaîne hexadécimale requises en octets, car le code machine DOS / x86 n'a pas de fonction intégrée pour cela.
E / S:
Téléchargez et testez HEXCLR.COM , ou
xxd
hexdump:la source
Retina 0.8.2 , 88 octets
Essayez-le en ligne! Le lien inclut des cas de test. Explication:
Associez les chiffres hexadécimaux.
Convertissez chaque chiffre séparément en décimal.
Convertissez chaque chiffre décimal en unaire.
Terminez la conversion hexadécimale de la paire de chiffres.
Additionnez 8 et divisez par 17.
Reconvertissez en hexadécimal.
la source
PHP ,
7567 octetsEssayez-le en ligne! ou vérifiez tous les cas de test .
la source
Python 3 ,
727068 octetsEssayez-le en ligne!
Il s'agit d'un port de Grzegorz Oledzkis réponse originale , que je l'ai aidé à jouer au golf.
Deux fonctionnalités de Python 3 nous aident à économiser des octets:
-2 octets merci à Jonathan Allan
la source
(int(x[i:i+2],16)+8)//17
enregistre 2Gelée ,
2019 octetsEssayez-le en ligne!
la source
C # (Visual C # Interactive Compiler) , 81 octets
Essayez-le en ligne!
la source
Wolfram Language (Mathematica) ,
6348 octetsEssayez-le en ligne!
-15 octets grâce à attinat ! Le remplacement
StringJoin
avec<>
et la compression de la syntaxe.RGBColor@#
convertit la chaîne d'entrée en une couleur du formulaireRGBColor[r, g, b]
avec trois arguments à virgule flottante dans la plage 0..1.Round[15 List @@ %]
multiplie la liste de trois arguments par 15 et les arrondit à l'entier le plus proche. Nous avons maintenant une liste de trois valeurs entières correspondant aux trois chiffres hexadécimaux souhaités.%~IntegerString~16
convertit cette liste de trois entiers en une liste de trois chaînes hexadécimales d'un caractère chacune."#"<>%
ajoute un#
caractère et joint tous ces caractères.la source
MathGolf ,
1912 octetsSortie sous forme de liste de caractères. Si cela n'est pas autorisé, une fin supplémentaire
y
doit être ajoutée pour joindre la liste de caractères à une chaîne.-7 octets grâce à @maxb , puisque j'ai regardé au-delà d'un builtin (
2ô_2<\1>]
to2/
).Essayez-le en ligne.
Explication:
la source
Ruby (2.5.3),
45,44, 42 octetsEDIT: enregistré un octet parce que nous n'avons pas besoin d'un groupe de caractères pour le deuxième caractère dans l'expression régulière (inspiré par la réponse de Neil)
EDIT 2: économisé 2 octets car la syntaxe lambda de la fusée de tiret n'a pas besoin de crochets autour de l'argument
la source
-p
drapeau et 2 autres en utilisant à la$&
place d'un argument à l'intérieur du bloc: tio.run/##KypNqvz/…Python 2 (
10910197858374 octets)La "distance la plus proche" est traitée par division par 17 et arrondie.
Améliorations:
-8 octets en utilisant l'
int(...+.5)
astuce au lieu deint(round(...))
-4 octets en utilisant la compréhension de liste au lieu de
map()
-1 octet par codage
#
en dur dans la sortie (merci @movatica)-10 octets en n'utilisant pas
re.findall("..",...)
en faveur d'un épissage de chaîne explicite-2 octets en n'utilisant pas la compréhension de liste, mais une expression de générateur en ligne dans
join
(merci @movatica)-1 octet en ne collant pas la
:7
fin de la partie bleue-9 octets par une meilleure itération sur les couleurs - ie itération sur les index, pas sur les caractères réels (merci @movatica)
la source
'#'
au lieu dex[0]
.''.join(...)
, car elle gère également une expression de générateur. Supprimez simplement le[]
et enregistrez 2 octets supplémentaires :)range(1,6,2)
c'est encore mieux avec[1,3,5]
lambda x:'#'+''.join(hex((int(x[i:i+2],16)+8)/17)[2:]for i in[1,3,5])
-> 69 octetsPerl 5
-p
,3534 octets@nwellnhof a enregistré un octet
Essayez-le en ligne!
Lit à partir de STDIN, remplace chaque paire d'éléments qui n'est pas
#
avec le caractère unique approprié en utilisant la méthode de division par 17 pour trouver le plus proche, puis sort implicitement (-p
) le résultat.la source
Python 3, 67 octets
la source
Rouge , 103 octets
Essayez-le en ligne!
Il s'est avéré que la version Linux actuelle de Red n'a pas d'implémentation de la
hex-to-rgb
fonction, c'est pourquoi je fais la conversion de base "manuellement" :)Cela fonctionne bien dans la console GUI rouge sous Windows:
Rouge , 94 octets
la source
Perl 6 , 35 octets
Essayez-le en ligne!
la source
Fusain , 22 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
la source
R , 57 octets
Essayez-le en ligne!
la source
Pyth , 20 octets
Essayez-le ici.
REMARQUE: Si le lien ci-dessus soulève un
ImportError
, allez ici à la place; il y a actuellement un bug dans la page "officielle", et c'est une solution temporaire de Maltysen . Ce lien peut cesser de fonctionner une fois que le lien officiel est corrigé.la source
Forth (gforth) , 87 octets
Essayez-le en ligne!
Explication
#
)#
0x11
) pour obtenir la valeur la plus proche pour le composant raccourciExplication du code
la source
Stax , 13 octets
Exécuter et déboguer
la source
K4 , 39 octets
Solution:
Explication:
Utilise la même stratégie que beaucoup de ces réponses (c.-à-d. Ajouter 8, diviser par 17):
Supplémentaire:
"#",{x@*16\:a?&/a:abs(17*!16)-16/:x?y}[.Q.nA]@/:3 2#1_
- mon idée originale pour 54 octetsla source