In CSS können Farben durch ein "Hexadezimaltripel" angegeben werden - eine hexadezimale Zahl mit drei Bytes (sechs Stellen), wobei jedes Byte die roten, grünen oder blauen Komponenten der Farbe darstellt. Zum Beispiel #FF0000
ist komplett rot und entspricht rgb(255, 0, 0)
.
Farben können auch durch die Kurzschreibweise dargestellt werden, die drei hexadezimale Ziffern verwendet. Die Kurzschrift wird durch Duplizieren jeder Ziffer zur sechsstelligen Form erweitert. Zum Beispiel #ABC
wird #AABBCC
.
Da die hexadezimale Kurzschrift weniger Ziffern enthält, können weniger Farben dargestellt werden.
Die Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die einen sechsstelligen hexadezimalen Farbcode verwendet und den nächsten dreistelligen Farbcode ausgibt.
Hier ist ein Beispiel:
- Hex-Code eingeben: # 28a086
- Rote Komponente
- 0x28 = 40 (dezimal)
- 0x22 = 34
- 0x33 = 51
- 0x22 ist näher, daher ist die erste Ziffer des verkürzten Farbcodes 2
- Grüne Komponente
- 0xa0 = 160
- 0x99 = 153
- 0xaa = 170
- 0x99 ist näher, also ist die zweite Ziffer 9
- Blaue Komponente
- 0x86 = 134
- 0x77 = 119
- 0x88 = 136
- 0x88 ist näher, also ist die dritte Ziffer 8
- Der verkürzte Farbcode lautet # 298 (erweitert auf # 229988).
Ihr Programm oder Ihre Funktion muss einen sechsstelligen hexadezimalen Farbcode als Eingabe akzeptieren und einen dreistelligen Farbcode als Eingabe #
ausgeben#
.
Beispiele
- # FF0000 → # F00
- # 00FF00 → # 0F0
- # D913C4 → # D1C
- # C0DD39 → # BD3
- # 28A086 → # 298
- # C0CF6F → # BC7
Wertung
Dies ist eine Code-Golf-Herausforderung, daher gewinnt die kürzeste Antwort in Ihrer Sprache! Es gelten Standardregeln.
quelle
#
zusätzlichen Herausforderungen gibt.Antworten:
JavaScript (ES6), 55 Byte
Probieren Sie es online!
quelle
05AB1E , 13 Bytes
Probieren Sie es online!
Wie?
quelle
ć
dekapitieren " Das ist eine andere Art, es zu beschreiben, lol. : D Schöne Antwort, +1 von mir.Japt , 16 Bytes
Probieren Sie es aus oder führen Sie alle Testfälle aus
quelle
8088 Assembly, IBM PC DOS,
5958 BytesZerlegte Auflistung:
Standalone-PC-DOS-Programm. Die Eingabe erfolgt über die Befehlszeile, die Ausgabe erfolgt an die Konsole.
Der größte Teil der Codelänge übernimmt die Konvertierung der erforderlichen hexadezimalen Zeichenfolgen-E / A in Bytes, da der DOS / x86-Computercode hierfür keine integrierten Funktionen enthält.
I / O:
Laden und testen Sie HEXCLR.COM oder
xxd
hexdump:quelle
Retina 0.8.2 , 88 Bytes
Probieren Sie es online! Link enthält Testfälle. Erläuterung:
Koppeln Sie die Hex-Ziffern.
Wandle jede Ziffer einzeln in eine Dezimalzahl um.
Wandle jede Dezimalstelle in eine unäre um.
Beenden Sie die hexadezimale Konvertierung des Ziffernpaares.
Addiere 8 und dividiere durch 17.
Zurück in hexadezimal konvertieren.
quelle
PHP ,
7567 BytesProbieren Sie es online! oder überprüfen Sie alle Testfälle .
quelle
Python 3 ,
727068 BytesProbieren Sie es online!
Dies ist ein Hafen von Grzegorz Oledzkis ursprünglicher Antwort , die ich ihm beim Golfspielen half.
Zwei Funktionen von Python 3 helfen uns, Bytes zu sparen:
-2 Bytes Dank an Jonathan Allan
quelle
(int(x[i:i+2],16)+8)//17
speichert 2Jelly ,
20 bis19 BytesProbieren Sie es online!
quelle
C # (Visual C # Interactive Compiler) , 81 Byte
Probieren Sie es online!
quelle
Wolfram Language (Mathematica) ,
6348 BytesProbieren Sie es online!
-15 bytes dank attinat ! Ersetzen
StringJoin
mit<>
und Komprimieren der Syntax.RGBColor@#
konvertiert die Eingabezeichenfolge in eine Farbe des FormularsRGBColor[r, g, b]
mit drei Gleitkommaargumenten im Bereich 0..1.Round[15 List @@ %]
multipliziert die Liste der drei Argumente mit 15 und rundet sie auf die nächste Ganzzahl. Wir haben jetzt eine Liste mit drei Ganzzahlwerten, die den drei gewünschten hexadezimalen Ziffern entsprechen.%~IntegerString~16
konvertiert diese Liste mit drei ganzen Zahlen in eine Liste mit drei hexadezimalen Zeichenfolgen mit jeweils einem Zeichen."#"<>%
Stellt ein#
Zeichen voran und fügt alle diese Zeichen zusammen.quelle
MathGolf ,
1912 BytesAusgabe als Zeichenliste. Wenn dies nicht zulässig ist, muss ein zusätzliches Trailing
y
hinzugefügt werden, um die Zeichenliste mit einer Zeichenfolge zu verknüpfen.-7 Bytes dank @maxb , da ich an einem Builtin (
2ô_2<\1>]
to2/
) vorbei geschaut habe .Probieren Sie es online aus.
Erläuterung:
quelle
Ruby (2.5.3),
45,44, 42 BytesBEARBEITEN: ein Byte gespeichert, da wir keine Zeichengruppe für das zweite Zeichen im Regex benötigen (inspiriert von Neils Antwort)
BEARBEITEN 2: 2 Bytes gespart, da die Lambda-Syntax der Bindestrichrakete keine Klammern um das Argument benötigt
quelle
-p
Flag und 2 weitere Bytes verwenden, indem Sie$&
anstelle eines Arguments im Block Folgendes verwendenPython 2 (
10910197858374 Byte)Die "nächste Distanz" wird durch Division durch 17 und Rundung behandelt.
Verbesserungen:
-8 Bytes mit dem
int(...+.5)
Trick stattint(round(...))
-4 Bytes unter Verwendung des Listenverständnisses anstelle von
map()
-1 Byte durch Hardcodierung
#
in der ausgabe (danke @movatica)-10 Bytes, indem Sie nicht verwenden
re.findall("..",...)
expliziter String-Spleiß verwendet wird-2 Bytes, indem kein Listenverständnis verwendet wird, sondern ein Ausdruck des Inline-Generators in
join
(danke @movatica)-1 Byte, indem die
:7
Endung für den blauen Teil nicht gespleißt wird-9 Bytes durch bessere Iteration über Farben - dh Iteration über Indizes, nicht über tatsächliche Zeichen (danke @movatica)
quelle
'#'
stattx[0]
.''.join(...)
, da es auch einen Generatorausdruck behandelt. Entfernen Sie einfach die[]
und speichern Sie 2 weitere Bytes :)range(1,6,2)
ist noch besser mit[1,3,5]
lambda x:'#'+''.join(hex((int(x[i:i+2],16)+8)/17)[2:]for i in[1,3,5])
Perl 5
-p
,3534 Bytes@nwellnhof hat ein Byte gespeichert
Probieren Sie es online!
Liest aus STDIN, ersetzt jedes Elementpaar, das nicht
#
mit dem entsprechenden Einzelzeichen versehen ist, und verwendet die Methode zum Ermitteln der nächsten Division durch 17. Anschließend wird implizit-p
das Ergebnis ausgegeben ( ).quelle
Python 3, 67 Bytes
quelle
Rot , 103 Bytes
Probieren Sie es online!
Es stellte sich heraus, dass die aktuelle Linux-Version von Red keine Implementierung der
hex-to-rgb
Funktion hat, deshalb mache ich die Basiskonvertierung "manuell" :)Dies funktioniert problemlos in der Red GUI-Konsole unter Windows:
Rot , 94 Bytes
quelle
Perl 6 , 35 Bytes
Probieren Sie es online!
quelle
Holzkohle , 22 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
quelle
R , 57 Bytes
Probieren Sie es online!
quelle
Pyth , 20 Bytes
Probieren Sie es hier aus.
HINWEIS: Wenn der obige Link einen auslöst
ImportError
, klicken Sie stattdessen hier . Es gibt derzeit einen Fehler auf der "offiziellen" Seite, und dies ist eine vorübergehende Lösung von Maltysen . Dieser Link funktioniert möglicherweise nicht mehr, nachdem der offizielle behoben wurde.quelle
Viertens (gviertens) , 87 Bytes
Probieren Sie es online!
Erläuterung
#
)#
0x11
), um den nächstgelegenen Wert für die verkürzte Komponente zu erhaltenCode-Erklärung
quelle
Stax , 13 Bytes
Führen Sie es aus und debuggen Sie es
quelle
K4 , 39 Bytes
Lösung:
Erläuterung:
Verwendet dieselbe Strategie wie viele dieser Antworten (dh addiere 8, dividiere durch 17):
Extra:
"#",{x@*16\:a?&/a:abs(17*!16)-16/:x?y}[.Q.nA]@/:3 2#1_
- meine ursprüngliche Idee für 54 Bytesquelle