Hallo Weltregenbogen

11

Der Umgang mit Farben in Nicht-Markup-Sprachen erschwert die Sache oft. Ich würde gerne einige Variationen davon sehen, wie Farbe in verschiedenen Sprachen verwendet wird.

Ziel dieses Wettbewerbs ist es, 'Hello World' in den sieben Farben des Regenbogens auszugeben.

Laut Wikipedia sind dies die 7 Farben.

Red      #FF0000 (RGB: 255, 0, 0)
Orange   #FF7F00 (RGB: 255, 127, 0)
Yellow   #FFFF00 (RGB: 255, 255, 0)
Green    #00FF00 (RGB: 0, 255, 0)
Blue     #0000FF (RGB: 0, 0, 255)
Indigo   #6600FF (RGB: 111, 0, 255)
Violet   #8B00FF (RGB: 143, 0, 255)

Die Regeln

  1. Das Programm muss 'Hello World' ausgeben. (Muss nicht unbedingt Text sein, muss aber als "Hallo Welt" unterscheidbar sein.)
  2. Jeder Buchstabe muss eine andere Farbe haben.
  3. Die Farben können in beliebiger Reihenfolge sein.
  4. Sie müssen jede der sieben Farben mindestens einmal verwenden. (Sie können mehr als die angegebenen Farben verwenden)
  5. Auf keinen Fall Markup-Sprachen verwenden .

Der Gewinner ist derjenige, der die geringste Anzahl von Zeichen hat UND die Regeln befolgt

Bonus -1 Zeichen, wenn es in DART geschrieben ist

Ich werde den Gewinner am 11. Januar auswählen (wenn ich mich erinnere; D).

Viel Glück

GEWINNER

Ich habe einen Fehler gemacht D:, Gewinner aktualisiert.

1. Stranac - Python, 60 Zeichen

2 .. Ilmari - Karonen Perl + GD, 146 Zeichen

Kürzeste Länge bei Einhaltung aller Regeln.

Brownie zeigt auf JiminP für die DART-Antwort.

MrZander
quelle

Antworten:

7

Python, 60 Zeichen

Jetzt mit 7 Farben und den "richtigen".

Verwendet Ansi-Escape-Sequenzen. Der Unterstrich ist nur da, damit es kein unsichtbarer Raum ist.

Diese Version druckt aufgrund der Funktionsweise von Pythons Druck einige zusätzliche Leerzeichen, aber diese Leerzeichen sparen einige Zeichen, sodass ich damit einverstanden bin, dass sie vorhanden sind.

for p in zip(range(7)*2,'Hello_World'):print'\033[3%im%s'%p,

Und ein Screenshot, wie von MrZander gefordert: Geben Sie hier die Bildbeschreibung ein

stranac
quelle
Habe ich einen Fehler gemacht? Bitte poste einen Screenshot, der beweist, dass du alle Farben richtig verwendet hast. "8 Farben von Schwarz nach Weiß" klingt nicht so, als ob die 7 erforderlichen Farben verwendet würden.
MrZander
@ MrZander: Ich habe meine Antwort aktualisiert und hoffe, es gefällt Ihnen jetzt. Übrigens, sind Sie sicher, dass die von Ihnen angegebene 6. Farbe korrekt ist? Es ist so ziemlich das gleiche wie am 7 ..
Stranac
Nahm es direkt von Wikipedia ... Ich bin kein Farbexperte haha.
MrZander
2
Dies setzt voraus, dass eine benutzerdefinierte Palette funktioniert. Beispielsweise Hwird das mit dem Escape-Code für Schwarz gedruckt, sodass es auf den meisten Terminals nicht sichtbar ist.
Hammar
12

Mathematica

ImageMultiply[ColorNegate[Graphics[Text[Style["Hello World",30]],ImageSize->190]],ColorData["Rainbow","Image"]]

Ich weiß, ich weiß, es entspricht nicht den Regeln. Aber ich musste versuchen, mit den Bildverarbeitungsfunktionen von Mathematica zu spielen.

Bildschirmfoto:

Hallo Welt!!!!!!!

Dillon Cower
quelle
10

Haskell, 88 Zeichen

f(c,n)=putStr$"\27["++show n++"m"++[c]
main=mapM_ f$zip"Hello World\n"$35:cycle[31..36]

Bildschirmfoto

Beachten Sie, dass hier ANSI-Terminalfarben verwendet werden, von denen es nur 6 gibt und die möglicherweise nicht genau den angegebenen Farben entsprechen (dies hängt von den Terminaleinstellungen ab). Daher verbiege ich die Regeln hier ein wenig.

Etwas längere Version mit fast korrekten Farben, 107 Zeichen

Diese Version verwendet xterm-Farben anstelle von ANSI-Farben. Dies hängt nicht von benutzerdefinierten Paletten ab und verwendet die nächsten Farben, die ich in der xterm-Palette mit 256 Farben finden konnte.

f(c,n)=putStr$"\27[38;5;"++show n++"m"++[c]
main=mapM_ f$zip"Hello World\n"$cycle[196,208,226,46,21,57,93]

Geben Sie hier die Bildbeschreibung ein

Hammar
quelle
7

Python, 261 Zeichen

C=((255,0,0),(255,127,0),(255,255,0),(0,255,0),(0,0,255),(111,0,255),(143,0,255))
print'P3 67 5 255'
for i in range(335):print'%d %d %d'%(C+C[2:])[i%67/6]if 0x4f7c938a00e7df7d12208a8aa0220820a34413d154044105f7e8828a28808820828cf04f39100e0417d1>>i&1 else'0 0 0'

Implementiert die Spezifikation genau und generiert ein ppm-Bild. Hier ist das Ergebnis, das in GIF konvertiert und um den Faktor 4 vergrößert wurde:

Geben Sie hier die Bildbeschreibung ein

Keith Randall
quelle
Hehe, nett. Ich brauchte einen peinlich langen Moment, um zu verstehen.
Cemper93
2
n=255;C=((n,0,0),(n,127,0),(n,n,0),(0,n,0),(0,0,n),(111,0,n),(143,0,n))
Steven Rumbalski
7

Perl -> ANSI-Terminal, 53 Zeichen

s//Hello World/;s/./\e[3${[5,(1..6)x2]}[pos]m$&/g;say

Dies ergibt genau die gleiche Leistung wie die Haskell-Lösung von Hammar . Es verwendet say, benötigt also Perl 5.10+ und den -M5.010(oder -E) Schalter. Für ältere perls, ersetzen saymit print. Eine triviale Reduzierung um ein Zeichen könnte durch Ersetzen \edurch ein wörtliches ESC-Zeichen erreicht werden. Dies würde jedoch das Lesen und Bearbeiten des Codes erheblich erschweren.

Bearbeiten: Es wurden zwei Zeichen hinzugefügt, die genau zu Hammars Ausgabe passen und tatsächlich alle sechs möglichen Terminalfarben anzeigen. (In der früheren Version war das einzige Zeichen, das in Farbe 6 = Cyan gedruckt wurde, das Leerzeichen.)

Bildschirmfoto:

Hallo Welt


Bearbeiten 2: Wenn die Verwendung einer benutzerdefinierten Terminalpalette (und eines Unterstrichs für das Leerzeichen) zulässig ist, kann ich die in der Spezifikation angegebenen exakten Farben mit nur 50 Zeichen problemlos reproduzieren:

$_=Hello_World;s/./\e[3${[(0..6)x2]}[pos]m$&/g;say

Bildschirmfoto:

Hallo Welt

Ilmari Karonen
quelle
3

Perl -> HTML, 99 Zeichen

@c=(("00")x5,77,(ff)x5,77)x2;print"<font color=#",@c[$i+8,$i+4,$i++],">$_"for split//,"Hello World"

Bildschirmfoto:

Hallo Welt

Der HTML-Code wird wahrscheinlich keine Validatoren bestehen, sollte aber von nahezu allen Browsern verstanden werden. Dieser Code erzeugt nicht genau die von Ihnen aufgelisteten RGB-Farben, kommt jedoch sehr nahe. Insbesondere sind die Farben der Buchstaben:

H  Red           #FF0000
e  Orange        #FF7700
l  Yellow        #FFFF00      
l  Chartreuse    #77FF00
o  Green         #00FF00
  (Spring green  #00FF77)
W  Cyan          #00FFFF
o  Sky blue      #0077FF
r  Blue          #0000FF
l  Indigo        #7700FF
d  Violet        #FF00FF

Die Ausgabe sieht auf schwarzem Hintergrund viel besser aus, aber das explizite Drucken von a <body bgcolor=black>hätte mich 28 zusätzliche Zeichen gekostet. Sie können Ihre Browsereinstellungen anpassen, um stattdessen den gleichen Effekt zu erzielen. :-)

Ilmari Karonen
quelle
3
Ich war mit Regel 5 möglicherweise nicht spezifisch genug. Ich wollte auch nicht, dass Markups in Verbindung mit einer anderen Sprache verwendet werden. Aber auf jeden Fall sehr kreativer Code.
MrZander
3

Perl + GD, 146 Zeichen

Gemäß den Kommentaren zu meiner anderen Antwort ist hier eine Lösung, die direkt eine Bilddatei unter Verwendung der GD-Bibliothek erstellt:

use GD'Simple;move{$m=new GD'Simple 70,12}2,12;s//Hello World/;s/./fgcolor$m(((0)x5,127,(255)x5,127)x2)[$i+8,$i+4,$i++];string$m$&/eg;print$m->png

Und hier ist die Ausgabe:

Hallo Welt

Auch hier würde die Verwendung eines schwarzen Hintergrunds besser aussehen, mich aber 29 Zeichen kosten ( $m->bgcolor(0,0,0);$m->clear;).

Bearbeiten: Finden Sie heraus, wie Sie 20 Zeichen durch (ab) mithilfe der indirekten Objektnotation und einiger anderer Änderungen rasieren können. Der neue Code gibt eine Warnung aus, läuft aber trotzdem einwandfrei.

Ilmari Karonen
quelle
Das ist eher so;)
MrZander
Bisher ist dies die niedrigste Zeichenanzahl, die allen Regeln bis zum Punkt folgt.
MrZander
3

Postscript 155 143

Dies beruht auf der Fähigkeit von Ghostscript, herauszufinden, dass Palatino für Palatino-Roman steht.

/h{c 1 1 sethsbcolor}def/c 0 def
200 400 moveto/Palatino 36 selectfont
h{32 ne{/c c .14 add dup 1 gt{1 sub}if def}if pop
h}(Hello World!)kshow
luser droog
quelle
1
Ich nehme an, "Times" ist kürzer, aber ... ugh.
Luser Droog
Hat einige Ihrer Ideen gestohlen ...
Thomas W.
3

Einige verschiedene Ansätze, um dies zu tun

Nachsatz

Erstens: Kürzeste ( 89 ):

9 9 moveto/Courier 9 selectfont
0{pop pop 
dup 1 1 sethsbcolor
.07 add}( Hello World)kshow

Gerendertes Ergebnis

Nicht Golf:

9 9 moveto
/Courier 9 selectfont
0                       % hue
{                       % hue c1 c2
  pop pop               % hue
  dup 1 1 sethsbcolor   % hue
  .07 add               % newHue
}( Hello World)kshow

Dies ändert kontinuierlich die Farbe in x-Richtung unter Verwendung des hsb-Farbraums. (Die Idee, hsb-Farben und kshow zu verwenden, wird luser droog gutgeschrieben - siehe seinen Eintrag!) Es werden nicht die exakten sieben von MrZander angegebenen Farben verwendet.

Wenn ich mich auf MrZanders Farben beschränke, komme ich mit 141 Zeichen dorthin :

9 9 moveto/Courier 9 selectfont(H e*l4l4oI  WIosrsl{d~)dup
0 2 20{2 copy
1 add get 32 sub 166 div 1 1 sethsbcolor
1 getinterval show
dup}for

Gerendertes Ergebnis

Dies codiert den Farbtonwert der MrZander-Farben als ein Byte im druckbaren ASCII-Bereich. Dieses Byte wird durch Subtrahieren von 32 und Teilen durch 166 in einen Farbtonwert im Bereich zwischen 0 und 1 übersetzt. Auf jedes Zeichen der Zeichenfolge "Hello World" folgt sein codierter Farbtonwert.

Nicht Golf:

9 9 moveto
/Courier 9 selectfont
(H e*l4l4oI  WIosrsl{d~)dup     % string string
0 2 20{                         % string string index
  2 copy                        % string string index string index
  1 add get                     % string string index hueChar
  32 sub 166 div                % string string index hueValue
  1 1 sethsbcolor               % string string index 
  1 getinterval                 % string substring
  show                          % string
  dup                           % string string
}for

TODO : Mit den Farben stimmt etwas nicht.

Thomas W.
quelle
2

Einige betrügen aber lösen das Problem

Bash + Ruby (braucht lolcatEdelstein)

echo Hello World | lolcat -p 0.25

Regenbogen Hallo Welt

Hauleth
quelle
1

Dart zu HTML, 135 134-1 = 133

main(){for(var s="Hello World",i=0;i<11;print("<font color=#${'F00F60FB0FF06F00F00B606B00F60F90F'.substring(i*3,i*3+3)}>${s[i++]}"));}

Gibt es eine Möglichkeit, Texte ohne Verwendung der Auszeichnungssprache einzufärben? Ich kann keine Leinwände testen ...

JiminP
quelle
Oooo ... +1 auch mit dem HTML
MrZander
1

Ich weiß, dass dort "auf keinen Fall ein Markup" steht, aber ich möchte dieses CSS mit 468 Zeichen einreichen:

<style>b{font-weight:normal}i{font-style:normal}u{text-decoration:none}b:after{content:'e';color:orange}b:before{content:'H';color:red}i:after,i:before{content:'l'}i:before{color:#ff0}i:after{color:#0f0}u:before{content:'o ';color:#66f}u:after{content:'W';color:blue}s{text-decoration:none}s:before{content:'o';color:#006}s:after{content:'r';color:#60f}p{display:inline}p:before{content:'l';color:#8b00ff}p:after{content:'d'}</style><b></b><i></i><u></u><s></s><p></p>

Kein Styling erfolgt mit dem Markup.

Ry-
quelle
0

Rubin

242 mehr Verfahrensweise:

require 'paint'

s = "HelloWorld"
out = ""
[
  '#FF0000',
  '#FF7F00',
  '#FFFF00',
  '#00FF00',
  "#00FFFF",
  "#5555FF",
  '#0000FF',
  '#000077',
  '#6600FF',
  '#8B00FF'
].each_with_index { |c, i| out << "#{Paint[s[i], c.dup]}" }
puts out

Wenn es mir gelingt, einen besseren Weg zu finden, um die Farben zu erzeugen, werde ich es tun. Bei einigen der mittleren habe ich nur ein paar Versuche gemacht, um die Farben näher zu bringen.

Agmcleod
quelle