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:
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
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.
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);
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.
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.
(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.
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.
Antworten:
Ruby: 19 buchstaben
Probelauf:
quelle
Rubin
Ich habe mich mehr für den "unorthodoxen" Teil entschieden. ;)
Die Schriftart (in meinem Webbrowser) ist etwas groß, sieht also verzerrt aus, sieht aber in Courier New besser aus:
Probelauf:
quelle
q / k (3 Zeichen)
Nicht gerade unorthodox, aber ziemlich kurz
Beispiel
Um das Ausgabeformat in der Frage genau abzugleichen, können wir (für 9 Zeichen) Folgendes tun:
quelle
PowerShell:
71525141Golf Code:
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:
quelle
foreach($i in 1,2,3)
, um es auf 68 Zeichen zu reduzieren.foreach
in 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!foreach
erwähnt es und es funktioniert für mich. (Keine Ahnung von der Version. Die mit Windows 7.)(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)})
.Bash
2221 Zeichen(Dank an @manatwork für 1 Zeichen
\
anstelle von Anführungszeichen)oder Lesen von STDIN in einer Schleife: 48 Zeichen:
Hinzugefügt am 2015-10-06: bash ( unorthodoxere Methode)
8483 ZeichenIch weiß, es könnten 82 Zeichen sein, wenn sie
020
geschrieben wurden16
, aber ich bevorzuge dies ... Oder vielleichtd+=${c[$b$a 0x10]}
das, was zuerst geschrieben wurde.Ein weiterer Bash- Ansatz
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) ...
quelle
printf \#%02X%02X%02X
ist ausreichend.d+=${c[$b$a 0x10]}
etwas sexy !d+=${c[$b$a 020]}
wir den Job und sehen gut ausPerl, 31 Zeichen
Es ist schwer, ein so kurzes Programm unorthodox zu machen, aber ich denke, das funktioniert.
quelle
unpack
Frage: Können Sie die Hexadezimalzahl wie in der Frage in Großbuchstaben umwandeln?unpack
, aber kein Glück. Eine Möglichkeit ist,sprintf
anstatt zu verwendenunpack
, 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.pack
und kommenunpack
nie in meinen Codierungsstil. Also ist es unorthodox genug für mich.Aktionsskript 3 | 43 Zeichen
Ausgabe:
#483D8B
quelle
Perl 24 Zeichen
Sorry, es ist nicht so sexy wie mit
unpack
, aber kürzer!Obskurere Version:
Aber wenn Sie es wirklich vorziehen
unpack
, können Sie:Zum Beispiel ist es nicht die kürzere Version, aber ich mag es! (Beachten Sie die Verwendung von
rand
zum Wandern :-)quelle
> <>
10360Nutzte den verschwendeten Leerraum und verschob Code hinein
Mit Kommandozeilen-Eingaben ausführen:
Ausgabe: "# FF2448"
quelle
Viertens 62 Zeichen
quelle
1 1 1
gibt Ausgänge#010101
. Alle anderen Werte von 0 bis 255 funktionieren ebenfalls. In welcher Umgebung oder in welcher Umgebung arbeiten Sie?C (67 Zeichen ohne Hauptkessel)
die moor standard printf & bit twiddler nutzung
quelle
readf
? Sollte das nicht seinscanf
?DC:
3532 ZeichenProbelauf:
DC:
2724 Zeichen(Benötigt aber die Eingabenummern in getrennten Zeilen.)
Probelauf:
quelle
dc
Antworten auf dieser Website.JavaScript, 89 Zeichen
Konvertiert
72 61 139
zu256*(256*(72)+61)+139
und wertet es aus.quelle
eval('(('+DEC.replace(/ /g,'<<8)+'))
stattdesseneval('256*(256*('+DEC.replace(/ /g,')+'))
5 Zeichen!PowerShell, 45
Oder, wenn es durch Piping in den Daten verwendet werden kann, können Sie nur verwenden
was es auf 42 bringt .
quelle
-split
und-join
.Powershell 37
Dank TimmyD ein Byte gespart
quelle
[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"
R, 16 Bytes
Das ist es. Verwenden Sie die eingebaute.
quelle
C,
6773 Zeichen (65 Zeichen ohne Hauptbuchstaben)Langweiliges C-Programm - sehr orthodox.
quelle
Python 2.7 (80 Zeichen)
Ich suche nach einem besseren Weg, um mit den einstelligen Hex-Werten umzugehen. Irgendwelche Ideen?
quelle
Befunge-98, 45 Zeichen
Bleh, doppelter Code. Naja. Nur eine einfache Implementierung der Radix-Konvertierung.
Probelauf
(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.)
quelle
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.
$
Machen Sie dies zu einem Skript. Kompilieren Sie auch mit nicht initialisierten Variablen, die als 0 behandelt werden.
Quelle
quelle
Gema, 93 Zeichen
Probelauf:
quelle
Burlsque, 12 Bytes (10 Bytes für Kleinbuchstaben)
Wenn auch Kleinbuchstaben erlaubt sind, dann 10 Bytes:
Verwendung:
Wenn Sie dringend Großbuchstaben benötigen, fügen Sie Folgendes hinzu
ZZ
:Wenn Sie die ganzen Zahlen nicht wie in einer Zeichenfolge erhalten, gehen Sie mit:
Erläuterung:
Versuchen Sie es hier online .
Bonus:
Um es zurück zu konvertieren, benutze dies:
quelle
Powershell, 28 Bytes
Testskript:
Ausgabe:
quelle
Python3.3 @ 60 Zeichen
Konnte nicht widerstehen:
quelle
Clojure 76 Zeichen
Dies könnte der Vollständigkeit halber zu spät sein:
Beispielanrufe:
quelle
Mathematica, 40 Zeichen
quelle
Common Lisp, 39 Zeichen
Lesen Sie drei Ganzzahlen und geben Sie eine Zeichenfolge zurück.
quelle
Javascript ES6, 63 Bytes
quelle
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 anx>9
.#7261139
anstelle des#483D8B
ersten Testfalls zurückgegeben.Python 2, 40 Bytes
Liest die Eingabe aus drei separaten Zeilen. Missbrauch
exec
und String-Multiplikation.Beispielverwendung:
quelle
Python (55 Zeichen)
quelle