Farbe RGB int bis hex


13

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


16
Unsere FAQ besagt, dass alle Fragen auf dieser Website ... ein objektives primäres Gewinnkriterium haben sollten, damit unbestreitbar entschieden werden kann, welcher Beitrag gewinnen soll. . Kürzeste ist objektiv, aber "am unorthodoxsten" ist nicht. Außerdem sollte das Code-Golf- Tag nur verwendet werden, wenn die Gewinnbedingung nur der kürzeste Code ist. und das Code-Challenge- Tag sollte nur verwendet werden, wenn das Code-Golf- Tag nicht verwendet wird.
Peter Taylor

und akzeptieren Sie den Gewinner vor einiger Zeit (in diesem Fall war nicht einmal 24h) Art weitere Beiträge entmutigen ...
woliveirajr

@PeterTaylor Entschuldigung, ich werde sicherstellen, dass ich die Richtlinien von nun an lese :( Ich denke, Sie haben Recht, unorthodox ist sehr vage
Quillion

Antworten:


14

Ruby: 19 buchstaben

$_=?#+"%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

16

Rubin

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:

Bild

Probelauf:

c:\a\ruby>rgb2hex
255 100 0
#FF6400

Das ist Genie!
Albert Renshaw

6

q / k (3 Zeichen)

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$

1
Diesem fehlt das für die Beispielausgaben in der Frage erforderliche Pfundzeichen (#).
Iszi

5

PowerShell: 71 52 51 41

Dank @manatwork für das Hinweisen ForEach-Objectkann anstelle einer forSchleife 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)
    }
)

Machen Sie die Schleife foreach($i in 1,2,3), um es auf 68 Zeichen zu reduzieren.
Handarbeit

@manatwork Ich glaube nicht, dass dies die richtige Syntax für eine 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!
Iszi

Keine Ahnung, ob es die richtige Syntax ist oder nicht, aber die SS64-Referenz für foreacherwähnt es und es funktioniert für mich. (Keine Ahnung von der Version. Die mit Windows 7.)
Manatwork

@manatwork Das ist interessant. Ich würde gerne ein bisschen herumgraben und herausfinden, was daran noch falsch ist (ich habe ein anderes Mal "unerwartetes Token 'in' ..." - Fehler bekommen.). Es ist möglich, dass der SS64-Artikel für eine andere Version von PowerShell geschrieben wurde - ich bin mir nicht sicher. Im Moment habe ich bestätigt, dass dies (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!
Iszi

2
Oh Mist. Sie können dies bis 41 erhalten , indem Sie -join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
Joey

4

Bash 22 21 Zeichen

(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

Hinzugefügt am 2015-10-06: bash ( unorthodoxere Methode) 84 83 Zeichen

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

Ein weiterer Ansatz

#!/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'>&nbsp;</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:

RGB int 2 hex viewer converter

Wo Sie das Mausrad drehen könnten, um Werte zu ändern (mit gedrückter Umschalttaste für Schritt um 15) ...


Tatsächlich wurde der abschließende Zeilenumbruch nicht angefordert und nur "#" muss maskiert werden, das printf \#%02X%02X%02Xist ausreichend.
Manatwork

Eine unorthodoxere Methode wurde hinzugefügt :
F. Hauri

Lol. Diese innere Schleife ist in der Tat schockierend unorthodox.
Manatwork

@manatwork danke, ich finde d+=${c[$b$a 0x10]}etwas sexy !
F. Hauri

1
... oder vielleicht machen d+=${c[$b$a 020]}wir den Job und sehen gut aus
F. Hauri

3

Perl, 31 Zeichen

perl -nE 'say"#",map{unpack H2,chr}split'

Es ist schwer, ein so kurzes Programm unorthodox zu machen, aber ich denke, das funktioniert.


Ich mag diese Antwort :) noch ein paar und ich denke, ich könnte mich damit abfinden, wenn nichts Besseres herumrollt.
Quillion

Cool! Nur eine unpackFrage: Können Sie die Hexadezimalzahl wie in der Frage in Großbuchstaben umwandeln?
Manatwork

@manatwork Ich habe versucht, einen Weg zu finden, es innerhalb von zu tun 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.
Brotkasten

Vielen Dank, @breadbox. Diese kniffligen kleinen packund kommen unpacknie in meinen Codierungsstil. Also ist es unorthodox genug für mich.
Handarbeit

Falsche Zählung. Das ergibt 30 Zeichen!
F. Hauri

3

Aktionsskript 3 | 43 Zeichen

trace("#"+(72<<16|61<<139|b).toString(16));

Ausgabe: #483D8B


Können Sie hier nicht viel Leerraum fallen lassen? Ich kenne Action Script nicht, aber sie sehen nicht erforderlich aus
Cruncher

@Cruncher ja sorry, eine meiner ersten Antworten hier.
Ilya Gazman

2
Töte das Semikolon am Ende, um ein
Zeichen

3

Perl 24 Zeichen

perl -ne 'printf"#"."%02x"x3,split'
13 31 133
#0d1f85

Sorry, es ist nicht so sexy wie mit unpack, aber kürzer!

Obskurere Version:

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

3

> <> 103 60

"#"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"


Erklärungen erhalten Sie auf Anfrage. Wenn Sie es herausfinden können, würde ich mich lieber nicht darum
kümmern

2

Viertens 62 Zeichen

: D 0 <<# # # #> TYPE #>> ; 35 EMIT HEX SWAP ROT D D D DECIMAL

funktioniert nicht für 1 1 1, was # 010101 ausgeben sollte
Ratschenfreak

Hi @ratchetfreak. Für mich geht das. Gerade mit gforth getestet. Es 1 1 1gibt Ausgänge #010101. Alle anderen Werte von 0 bis 255 funktionieren ebenfalls. In welcher Umgebung oder in welcher Umgebung arbeiten Sie?
Darren Stone

2

C (67 Zeichen ohne Hauptkessel)

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


Warten Sie readf? Sollte das nicht sein scanf?
Brotkasten

@breadbox ah yeah Ich habe zu viel Zeit in D verbracht; Auf jeden Fall kein Unterschied in der Char Count
Ratschenfreak

2

DC: 35 32 Zeichen

[#]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

DC: 27 24 Zeichen

(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

2
Es gibt nicht genügend dcAntworten auf dieser Website.
Brotkasten

2

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.


Nizza, aber scheitert an der 3. Probe in der Frage.
manatwork

Ah, guter Anruf. Fest.
Casey Chu

2
Mit sparen Sie eval('(('+DEC.replace(/ /g,'<<8)+'))stattdessen eval('256*(256*('+DEC.replace(/ /g,')+'))5 Zeichen!
F. Hauri

2

PowerShell, 45

'#'+-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 .


Gute Arbeit! Shows Ich muss noch viel über Golf lernen!
Iszi

Oh, deine Idee mit den Variablen war auch klug; wäre mir nie in den Sinn gekommen. Es ist einfach so, dass es länger ist als mein üblicher Favorit: -splitund -join.
Joey

2

Powershell 37

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

Sie können ein paar Bytes sparen, indem Sie das entfernen, [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"
AdmBorkBork

@TimmyD weiß nicht, ob das Entfernen von [Byte] in allen Versionen in einer Version, in der ich getestet habe (iirc 2.0 in xp), ohne [Byte] korrekt funktioniert. Es wurde nicht als Hex verkettet, sondern als Ints. Dh 72 61 139 war # 7261139 nicht # 483d8b „# $ o“ in Anführungszeichen ist nicht ein Stringliteral aber ausgewertet String schön zu wissen , durch Kommentare über hex - Konvertierung versteht sich
blabb

Es ist anscheinend ein Unterschied zwischen PowerShell v2 und v3 - es muss daran liegen, wie die entsprechende .NET-Version die hexadezimale Konvertierung handhabt, aber ich kann keine Dokumentation dazu finden.
AdmBorkBork

2

R, 16 Bytes

Das ist es. Verwenden Sie die eingebaute.

rgb(r,g,b,m=255)

1

C, 67 73 Zeichen (65 Zeichen ohne Hauptbuchstaben)

main(){int a,b,c;scanf("%d%d%d",&a,&b,&c);printf("#%02X%02X%02X",a,b,c);}

Langweiliges C-Programm - sehr orthodox.


funktioniert nicht mit ab oder c kleiner als 16
ratschenfreak

% X wurde in% 02X geändert.
Ian James

1

Python 2.7 (80 Zeichen)

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?


Vielleicht Formatstrings verwenden? '% 02x' scheint das zu sein, was alle anderen getan haben.
JQBLZ

1

Befunge-98, 45 Zeichen

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.)


1

Game Maker Language, 175 (Fehler bei Position 81)

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.

Quelle


1

Gema, 93 Zeichen

\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

1

Burlsque, 12 Bytes (10 Bytes für Kleinbuchstaben)

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}

1

Powershell, 28 Bytes

'#{0:X2}{1:X2}{2:X2}'-f$args

Testskript:

$f = {

"#{0:X2}{1:X2}{2:X2}"-f$args
}

@(
    ,('#483D8B',72, 61, 139)
    ,('#4B0082',75,  0, 130)
    ,('#00FF7F',0 ,255, 127)
) | % {
    $e,$a = $_
    $r = &$f @a
    "$($r-eq$e): $r"
}

Ausgabe:

True: #483D8B
True: #4B0082
True: #00FF7F

0

Python3.3 @ 60 Zeichen

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

0

Clojure 76 Zeichen

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"

0

Mathematica, 40 Zeichen

f = StringJoin["#", IntegerString[#, 16, 2]] &

rgbs = {{72, 61, 139}, {75, 0, 130}, {0, 255, 127}}

f /@ rgbs // Column

# 483d8b

# 4b0082

# 00ff7f


0

Common Lisp, 39 Zeichen

(format()"#~@{~2,'0x~}"#1=(read)#1##1#)

Lesen Sie drei Ganzzahlen und geben Sie eine Zeichenfolge zurück.


0

Javascript ES6, 63 Bytes

h=>'#'+h.split` `.map(x=>(x<16?0:'')+(x*1).toString(16)).join``

Zufälligerweise habe ich fast genau dasselbe geschrieben wie du, bevor ich deins gesehen habe. Sehr nett =) Sie sind nah genug, dass ich meine nicht posten werde, aber Sie können ein paar Bytes auf Ihrem Mapping mit diesem x=>(x<16?0:'')+x.toString(16)
speichern

1
Auch muss das nicht r=am Anfang stehen. Es gilt auch als anonyme Funktion, da Sie sie aufrufen können, ohne etwas zuweisen zu müssen.
Mwr247

Hoppla. Bedeutete die Map: x=>(x<16?0:'')+(x*1).toString(16)Deine und meine erste dort geben aktuell falsche Werte für an x>9.
Mwr247

Dies wird derzeit #7261139anstelle des #483D8Bersten Testfalls zurückgegeben.
Dennis

0

Python 2, 40 Bytes

s='#';exec's+="%02X"%input();'*3;print s

Liest die Eingabe aus drei separaten Zeilen. Missbrauch execund String-Multiplikation.

Beispielverwendung:

$ python2 rgbint.py
72
61
139
#483D8B

$ python2 rgbint.py
75
0
130
#4B0082

$ python2 rgbint.py
0
255
127
#00FF7F

0

Python (55 Zeichen)

'#'+''.join([hex(int(i))[2:].upper() for i in input()])
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.