Bei drei Ganzzahlen rgb wird die hexadezimale Darstellung als Zeichenfolge ausgegeben.
Input: Output:
72 61 139 #483D8B
75 0 130 #4B0082
0 255 127 #00FF7F
Kürzeste unorthodoxe Code gewinnt
Bei drei Ganzzahlen rgb wird die hexadezimale Darstellung als Zeichenfolge ausgegeben.
Input: Output:
72 61 139 #483D8B
75 0 130 #4B0082
0 255 127 #00FF7F
Kürzeste unorthodoxe Code gewinnt
Antworten:
$_=?#+"%02X"*3%$F
Probelauf:
bash-4.1$ ruby -pae '$_=?#+"%02X"*3%$F' <<< '72 61 139'
#483D8B
bash-4.1$ ruby -pae '$_=?#+"%02X"*3%$F' <<< '75 0 130'
#4B0082
bash-4.1$ ruby -pae '$_=?#+"%02X"*3%$F' <<< '0 255 127'
#00FF7F
Ich habe mich mehr für den "unorthodoxen" Teil entschieden. ;)
10;a= gets. split
. map {| x| #x
"%02X" %( x. to_i)
}; $> << ?# << a[
00 .. 1+2]. join;
Die Schriftart (in meinem Webbrowser) ist etwas groß, sieht also verzerrt aus, sieht aber in Courier New besser aus:

Probelauf:
c:\a\ruby>rgb2hex
255 100 0
#FF6400
Nicht gerade unorthodox, aber ziemlich kurz
4h$
Beispiel
q)4h$ 72 61 139
0x483d8b
Um das Ausgabeformat in der Frage genau abzugleichen, können wir (für 9 Zeichen) Folgendes tun:
"#",/$4h$
Dank @manatwork für das Hinweisen
ForEach-Objectkann anstelle einerforSchleife verwendet werden.
Vielen Dank an @Joey für den Hinweis, dass ich-joindie Schleifenausgabe verwenden könnte, anstatt sie in Variablen einfügen zu müssen.
Golf Code:
'#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
Hinweis:
Hier wird kein Fehler auf ungültige Eingaben überprüft. Das Skript nimmt gerne 256, 4096 und 65536 als Eingaben und gibt dann # 100100010000 aus (was offensichtlich nicht als RGB funktioniert).
Ungolfed, mit Kommentaren:
# Put a hashtag in front of the output.
'#'+
# Join the nested code into one string.
-join(
# Pipe 1..3 to ForEach-Object to run a loop three times.
1..3|%{
# Take user input and format it as hex, with minimum two digits in output.
"{0:X2}"-f+(read-host)
}
)
foreach($i in 1,2,3), um es auf 68 Zeichen zu reduzieren.
foreachin PowerShell ist. (Zumindest konnte ich einige Testläufe nicht zum Laufen bringen.) Mit der richtigen Syntax, einem integrierten Alias und einer anderen PowerShell-Verknüpfung, die ich kürzlich entdeckt habe, habe ich jedoch etwas besseres, Rasierendes Weitere 12 Zeichen von Ihrem Vorschlag entfernt. (1..3)|%{...}(Fügen Sie anstelle der Auslassungspunkte eine in Klammern gesetzte Anweisung aus dem vorhandenen Skript ein.) Ich muss dies im Skript noch vollständig testen, aber danke, dass Sie mich in diese Richtung gelenkt haben!
(1..3)|%funktioniert und das Skript auf 56 Zeichen reduziert. Ich werde das in der Antwort ändern und dir definitiv die Idee zuschreiben. Danke noch einmal!
-join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
(Dank an @manatwork für 1 Zeichen \anstelle von Anführungszeichen)
printf \#%02X%02X%02X 12 12 12
#0C0C0C
oder Lesen von STDIN in einer Schleife: 48 Zeichen:
while read f;do printf "#%02X%02X%02X\n" $f;done <<<$'72 61 139\n75 0 130\n0 255 127'
#483D8B
#4B0082
#00FF7F
c=({0..9} {a..f}) d=\#;for b;do for a in / %;do d+=${c[$b$a 020]};done;done;echo $d
Ich weiß, es könnten 82 Zeichen sein, wenn sie 020geschrieben wurden 16, aber ich bevorzuge dies ... Oder vielleicht d+=${c[$b$a 0x10]}das, was zuerst geschrieben wurde.
hexcolor() {
local a b c=({0..9} {a..f}) d=\#
for b ;do
for a in / % ;do
d+=${c[$b$a 0x10]}
done
done
echo $d
}
hexcolor 72 61 139
#483d8b
hexcolor 75 0 130
#4b0082
hexcolor 0 255 127
#00ff7f
#!/bin/bash
browser=firefox # google-chrome iceweasel
url="data:text/html;charset=UTF-8,<html><head></head><body>"
url+="<script type='text/javascript'>
function h(i){var h=i.toString(16);if(16>1*i)h='0'+h;
return h};function C(r,g,b){return'\043'+h(r)+h(g)+h(b)};
function m(){ var r=1.0*R.value; var g=1.0*G.value; var b=1.0*B.value;
var fore='black';if(384>r+g+b)fore='white';var c=C(r,g,b);
s.setAttribute('style','background:'+c+';color:'+fore+';');s.innerHTML=c};
function w(e){console.log(e);var val=e.target.value;var q=1;if(e.shiftKey)
q=15;if(e.detail){if(e.detail>0){q=0-q;}}else if(0>e.wheelDelta){q=0-q;};
val=1*val+q;if(val>255)val=255;if(0>val)val=0;e.target.value=val;m(); };
function k(e){console.log(e);var val=e.target.value;var q=1;if(e.shiftKey)q=
15;if(e.keyCode==38){val=1*val+q;if(val>255)val=255;e.target.value=val;m();}
else if(e.keyCode==40){val=1*val-q;if(0>val)val=0;e.target.value=val;m();}};
function n(){R=document.getElementById('R');G=document.getElementById('G');
B=document.getElementById('B');s=document.getElementById('s');
R.addEventListener('DOMMouseScroll',w);R.addEventListener('mousewheel',w);
G.addEventListener('DOMMouseScroll',w);G.addEventListener('mousewheel',w);
B.addEventListener('DOMMouseScroll',w);B.addEventListener('mousewheel',w);
m();};var R, G, B, s;window.onload=n;
</script><style>div{display:inline-block;width:10em;}</style>
<div id='s'> </div>"
input="%s:<input type='text' size='5' value='200'"
input+=" onKeyDown='k(event)' onChange='m()' id='%s' />"
for c in R G B ;do
printf -v add "$input" $c $c
url+="$add"
done
$browser "$url"
Dies zeigt ein Browserfenster mit:

Wo Sie das Mausrad drehen könnten, um Werte zu ändern (mit gedrückter Umschalttaste für Schritt um 15) ...
printf \#%02X%02X%02Xist ausreichend.
d+=${c[$b$a 0x10]}etwas sexy !
d+=${c[$b$a 020]}wir den Job und sehen gut aus
perl -nE 'say"#",map{unpack H2,chr}split'
Es ist schwer, ein so kurzes Programm unorthodox zu machen, aber ich denke, das funktioniert.
unpackFrage: Können Sie die Hexadezimalzahl wie in der Frage in Großbuchstaben umwandeln?
unpack, aber kein Glück. Eine Möglichkeit ist, sprintfanstatt zu verwenden unpack, aber das ist länger und völlig orthodox. Die andere Möglichkeit besteht darin, die Zeichenfolge in Großbuchstaben zu ändern: map{uc unpack H2,chr}zu einem Preis von drei Zeichen.
packund kommen unpacknie in meinen Codierungsstil. Also ist es unorthodox genug für mich.
trace("#"+(72<<16|61<<139|b).toString(16));
Ausgabe: #483D8B
perl -ne 'printf"#"."%02x"x3,split'
13 31 133
#0d1f85
Sorry, es ist nicht so sexy wie mit unpack, aber kürzer!
Aber wenn Sie es wirklich vorziehen unpack, können Sie:
$==24;s/\d+[\n ]*/{$=-=8;($&<<$=).do{rand>.5?qw<+>[0]:"|"}}/eg;$_=
pack("N",eval($_.587.202.560));say$1,unpack("H6",$2)if/^(.)(.*)$/s
Zum Beispiel ist es nicht die kürzere Version, aber ich mag es! (Beachten Sie die Verwendung von randzum Wandern :-)
perl -nE '
$==24;s/\d+[\n ]*/{$=-=8;($&<<$=).
do{rand>.5?qw<+>:"|"}}/eg;$_=pack(
"N",eval($_.587.202.560) );say $1,
unpack("H"."6",$2) if /^(.)(.*)$/s
' <<< $'72 61 139\n75 0 130\n0 255 127'
#483d8b
#4b0082
#00ff7f
"#"or>1[:82*%:}-82*,86*+:"9"v
;^?l ]o+*7)"9":+*68o+*7)<
Nutzte den verschwendeten Leerraum und verschob Code hinein
Mit Kommandozeilen-Eingaben ausführen:
python fish.py generateHex.fish -v 255 36 72
Ausgabe: "# FF2448"
: D 0 <<# # # #> TYPE #>> ; 35 EMIT HEX SWAP ROT D D D DECIMAL
1 1 1gibt Ausgänge #010101. Alle anderen Werte von 0 bis 255 funktionieren ebenfalls. In welcher Umgebung oder in welcher Umgebung arbeiten Sie?
int r,g,b;
scanf("%d %d %d",&r,&b,&g);
printf("#%06x",r<<16|g<<8|b);
die moor standard printf & bit twiddler nutzung
readf? Sollte das nicht sein scanf?
[#]n16o?ShShSh[Lhd16/n16%n]ddxxx
Probelauf:
bash-4.1$ dc -e '[#]n16o?ShShSh[Lhd16/n16%n]ddxxx' <<< '72 61 139'
#483D8B
bash-4.1$ dc -e '[#]n16o?ShShSh[Lhd16/n16%n]ddxxx' <<< '75 0 130'
#4B0082
bash-4.1$ dc -e '[#]n16o?ShShSh[Lhd16/n16%n]ddxxx' <<< '0 255 127'
#00FF7F
(Benötigt aber die Eingabenummern in getrennten Zeilen.)
[#]n16o[?d16/n16%n]ddxxx
Probelauf:
bash-4.1$ dc -e '[#]n16o[?d16/n16%n]ddxxx' <<< $'72\n61\n139'
#483D8B
bash-4.1$ dc -e '[#]n16o[?d16/n16%n]ddxxx' <<< $'75\n0\n130'
#4B0082
bash-4.1$ dc -e '[#]n16o[?d16/n16%n]ddxxx' <<< $'0\n255\n127'
#00FF7F
dcAntworten auf dieser Website.
JavaScript, 89 Zeichen
console.log('#' + ('00000' + eval('256*(256*(' + DEC.replace(/ /g, ')+')).toString(16)).slice(-6))
Konvertiert 72 61 139zu 256*(256*(72)+61)+139und wertet es aus.
eval('(('+DEC.replace(/ /g,'<<8)+'))stattdessen eval('256*(256*('+DEC.replace(/ /g,')+'))5 Zeichen!
'#'+-join(-split(read-host)|%{'{0:X2}'-f+$_})
Oder, wenn es durch Piping in den Daten verwendet werden kann, können Sie nur verwenden
'#'+-join(-split"$input"|%{'{0:X2}'-f+$_})
was es auf 42 bringt .
-splitund -join.
Dank TimmyD ein Byte gespart
cat rgb2hex.ps1
$args|%{$o+="{0:X2}"-f[byte]$_};"#$o"
wc -c rgb2hex.ps1
38 rgb2hex.ps1
powershell -f .\rgb2hex.ps1 72 61 139
#483D8B
powershell -f .\rgb2hex.ps1 0 255 127
#00FF7F
[byte]da wir die Eingabe als Ganzzahlen erhalten, und Ihre Ausgabe so bearbeiten, dass sie "#$o"- das sind 31 Bytes für$args|%{$o+="{0:X2}"-f$_};"#$o"
main(){int a,b,c;scanf("%d%d%d",&a,&b,&c);printf("#%02X%02X%02X",a,b,c);}
Langweiliges C-Programm - sehr orthodox.
x=lambda y: ("0"+hex(int(y))[2:])[-2:]
print "#"+''.join(map(x,input().split()))
Ich suche nach einem besseren Weg, um mit den einstelligen Hex-Werten umzugehen. Irgendwelche Ideen?
Bleh, doppelter Code. Naja. Nur eine einfache Implementierung der Radix-Konvertierung.
"#",v
7*+,>#@&:97+/"0"+:"9"`7*+,97+%"0"+:"9"`
Probelauf
% cfunge tohex.98 <<<'72 61 139'
#483D8B
% cfunge tohex.98
#75 0 130
4800820 255 127
00FF7F
(Hinweis: druckt '#' vor dem Lesen der Eingabe - die Aufgabe verbietet dies nicht; bei drei Zahlen auf stdin erzeugt sie die richtige Ausgabe auf stdout. Sie kümmert sich auch nicht um Zeilenumbrüche, und wie Sie sehen, nicht darum '#' nicht richtig hinzufügen, wenn "interaktiv" ausgeführt wird.)
Fordert zur Eingabe von 3- bis 9-stelligem RGB auf. Gibt hexadezimal mit GML-Hexadezimalzeichen zurück.$
d=get_string('','')if(d=='')e=""else e="00"h="0123456789ABCDEF"while(d!=''){b=d&255i=string_char_at(h,byte div 16+1)l=string_char_at(h,byte mod 16+1)e+=i+l;d=d>>8}return '$'+e
Machen Sie dies zu einem Skript. Kompilieren Sie auch mit nicht initialisierten Variablen, die als 0 behandelt werden.
\B=@set{x;0123456789abcdef}\#
<D>=@substring{@div{$1;16};1;$x}@substring{@mod{$1;16};1;$x}
?=
Probelauf:
bash-4.3$ gema '\B=@set{x;0123456789abcdef}\#;<D>=@substring{@div{$1;16};1;$x}@substring{@mod{$1;16};1;$x};?=' <<< '0 255 127'
#00ff7f
Wenn auch Kleinbuchstaben erlaubt sind, dann 10 Bytes:
psb6\['#+]
Verwendung:
blsq ) "72 61 139"psb6\['#+]
"#483d8b"
Wenn Sie dringend Großbuchstaben benötigen, fügen Sie Folgendes hinzu ZZ:
blsq ) "72 61 139"psb6\['#+]ZZ
"#483D8B"
Wenn Sie die ganzen Zahlen nicht wie in einer Zeichenfolge erhalten, gehen Sie mit:
blsq ) {72 61 139}b6\['#+]
"#483d8b"
Erläuterung:
ps -- parse string
b6 -- to hex
\[ -- concat
'#+] -- prepend #
Versuchen Sie es hier online .
Bonus:
Um es zurück zu konvertieren, benutze dies:
blsq ) "#483d8b"[-2cob6
{72 61 139}
print("#"+3*"%.2X"%tuple(int(n) for n in input().split()))
Konnte nicht widerstehen:
[dan@danbook:code_golf/int_to_hex]$ python3.3 int_to_hex.py
176 11 30
#B00B1E
Dies könnte der Vollständigkeit halber zu spät sein:
(defn hexy [r g b] (reduce str (cons "#" (map #(format "%02X" %) [r g b]))))
Beispielanrufe:
(hexy 0 255 127)
"#00FF7F"
f = StringJoin["#", IntegerString[#, 16, 2]] &
rgbs = {{72, 61, 139}, {75, 0, 130}, {0, 255, 127}}
f /@ rgbs // Column
# 483d8b
# 4b0082
# 00ff7f
h=>'#'+h.split` `.map(x=>(x<16?0:'')+(x*1).toString(16)).join``
x=>(x<16?0:'')+x.toString(16)
r=am Anfang stehen. Es gilt auch als anonyme Funktion, da Sie sie aufrufen können, ohne etwas zuweisen zu müssen.
x=>(x<16?0:'')+(x*1).toString(16)Deine und meine erste dort geben aktuell falsche Werte für an x>9.
#7261139anstelle des #483D8Bersten Testfalls zurückgegeben.
'#'+''.join([hex(int(i))[2:].upper() for i in input()])