Hello World Rainbow

11

Gérer les couleurs dans des langages non balisés complique souvent les choses. J'aimerais voir quelques variations sur la façon dont la couleur est utilisée dans différentes langues.

Le but de ce concours est de produire «Hello World» dans les sept couleurs de l'arc-en-ciel.

Selon Wikipedia, ce sont les 7 couleurs.

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)

Les règles

  1. Le programme doit produire «Hello World». (N'a pas nécessairement besoin d'être du texte, mais il doit être identifiable comme 'Hello World')
  2. Chaque lettre doit être d'une couleur différente.
  3. Les couleurs peuvent être dans n'importe quel ordre.
  4. Vous devez utiliser chacune des sept couleurs au moins une fois. (Vous pouvez utiliser plus que les couleurs données)
  5. Aucune utilisation des langages de balisage en tout cas .

Le gagnant est celui qui a le plus petit nombre de caractères ET suit les règles

Bonus -1 caractère s'il est écrit en DART

Je choisirai le gagnant le 11 janvier (si je me souviens bien; D).

Bonne chance

Gagnants)

J'ai fait une erreur D :, mise à jour des gagnants.

1er. stranac - Python, 60 caractères

2e. Ilmari - Karonen Perl + GD, 146 caractères

Longueur la plus courte avec toutes les règles respectées.

Brownie pointe JiminP pour la réponse DART.

MrZander
la source

Réponses:

7

Python, 60 caractères

Maintenant, en utilisant 7 couleurs, et les «correctes».

Utilise des séquences d'échappement ansi. Le trait de soulignement est juste là donc ce n'est pas un espace invisible.

Cette version imprime des espaces supplémentaires, en raison du fonctionnement de l'impression de python, mais ces espaces économisent pas mal de caractères, donc je suis d'accord avec eux.

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

Et une capture d'écran, comme l'exige MrZander: entrez la description de l'image ici

stranac
la source
Ai-je fait une erreur? Veuillez poster une capture d'écran prouvant que vous avez utilisé toutes les couleurs correctement. "8 couleurs du noir au blanc" ne sonne pas comme s'il utilisait les 7 couleurs requises.
MrZander
@MrZander: J'ai mis à jour ma réponse, et j'espère qu'elle vous plaît maintenant. Au fait, êtes-vous sûr que la 6e couleur que vous avez fournie est correcte? C'est à peu près la même chose que le 7.
stranac
Je l'ai pris directement sur Wikipedia ... Je ne suis pas un expert en couleurs, haha.
MrZander
2
Cela repose sur une palette personnalisée pour fonctionner. Par exemple, le Hest imprimé en utilisant le code d'échappement pour le noir, il n'est donc pas visible sur la plupart des terminaux.
hammar
12

Mathematica

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

Je sais, je sais, cela ne respecte pas les règles .. mais j'ai dû essayer de jouer avec les fonctions de traitement d'image de Mathematica.

Capture d'écran:

Bonjour le monde!!!!!!!

Dillon Cower
la source
10

Haskell, 88 caractères

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

Capture d'écran

Notez que cela utilise des couleurs de terminal ANSI, dont il n'y en a que 6 et qu'elles peuvent ne pas correspondre à celles exactes données (cela dépend des paramètres du terminal), donc je plie un peu les règles ici.

Version légèrement plus longue avec des couleurs presque correctes, 107 caractères

Cette version utilise des couleurs xterm au lieu de celles ANSI. Cela ne dépend d'aucune palette personnalisée et utilise les couleurs les plus proches que j'ai pu trouver dans la palette xterm 256 couleurs.

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]

entrez la description de l'image ici

hammar
la source
7

Python, 261 caractères

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'

Implémente exactement la spécification, générant une image ppm. Voici le résultat, converti en gif et agrandi par un facteur 4:

entrez la description de l'image ici

Keith Randall
la source
Hehe, chouette. Cela m'a pris un moment embarrassant pour comprendre.
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 -> terminal ANSI, 53 caractères

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

Cela produit exactement la même sortie que la solution Haskell de Hammar . Il utilise say, donc a besoin de perl 5.10+ et du commutateur -M5.010(ou -E). Pour les anciennes perles, remplacez saypar print. Une réduction triviale d'un caractère pourrait être obtenue en remplaçant \epar un caractère ESC littéral, mais cela rendrait le code beaucoup plus difficile à lire et à modifier.

Edit: Ajout de deux caractères pour correspondre exactement à la sortie de Hammar et pour afficher les six couleurs de terminal possibles. (Dans la version précédente, le seul caractère imprimé en couleur 6 = cyan était l'espace.)

Capture d'écran:

Bonjour le monde


Edit 2: Si l' utilisation d'une palette de terminaux personnalisée (et d'un trait de soulignement pour l'espace) est autorisée, je peux facilement reproduire les couleurs exactes données dans la spécification avec seulement 50 caractères:

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

Capture d'écran:

Bonjour le monde

Ilmari Karonen
la source
3

Perl -> HTML, 99 caractères

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

Capture d'écran:

Bonjour le monde

Le HTML ne passera probablement aucun validateur, mais devrait être compris par à peu près tous les navigateurs. Ce code ne produit pas les couleurs RVB exactes que vous avez répertoriées, mais il se rapproche beaucoup. Plus précisément, les couleurs des lettres sont:

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

La sortie semble beaucoup plus agréable sur un fond noir, mais imprimer explicitement un <body bgcolor=black>aurait coûté 28 caractères supplémentaires. Vous pouvez ajuster les paramètres de votre navigateur pour obtenir le même effet à la place. :-)

Ilmari Karonen
la source
3
Je n'ai peut-être pas été suffisamment précis avec la règle 5. Je ne voulais pas non plus que le balisage soit utilisé avec un autre langage. Mais en tout cas, un code très créatif.
MrZander
3

Perl + GD, 146 caractères

D'après les commentaires de mon autre réponse , voici une solution qui produit directement un fichier image à l'aide de la bibliothèque GD:

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

Et voici la sortie:

Bonjour le monde

Encore une fois, utiliser un fond noir aurait une meilleure apparence, mais cela me coûterait 29 caractères ( $m->bgcolor(0,0,0);$m->clear;).

Edit: a compris comment raser 20 caractères en (ab) en utilisant la notation d'objet indirect et quelques autres ajustements. Le nouveau code émet un avertissement, mais fonctionne toujours correctement.

Ilmari Karonen
la source
C'est plus comme ça;)
MrZander
Jusqu'à présent, c'est le nombre de caractères le plus bas qui suit toutes les règles jusqu'au point.
MrZander
3

Postscript 155 143

Cela repose sur la capacité de Ghostscript à "comprendre" que Palatino est l'abréviation de Palatino-Roman.

/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
la source
1
Je suppose que "Times" est plus court, mais ... ugh.
luser droog
J'ai volé certaines de vos idées ...
Thomas W.
3

Quelques approches différentes pour le faire avec

PostScript

Premier: le plus court ( 89 ):

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

Résultat rendu

Non 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

Ceci change continuellement la couleur dans la direction x en utilisant l'espace colorimétrique hsb. (L'idée d'utiliser les couleurs hsb et kshow est attribuée à luser droog - voir son entrée!) Il n'utilise pas les sept couleurs exactes données par MrZander.

Lorsque je me limite aux couleurs de MrZander, j'y arrive en utilisant 141 caractères:

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

Résultat rendu

Cela code la valeur de teinte des couleurs de MrZander comme un octet dans la plage ASCII imprimable. Cet octet est traduit en une valeur de teinte comprise entre 0 et 1 en soustrayant 32 et en divisant par 166. Chaque caractère de la chaîne "Hello World" est suivi de sa valeur de teinte codée.

Non 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 : Quelque chose ne va pas bien avec les couleurs.

Thomas W.
la source
2

Certains trichent mais résolvent le problème

Bash + Ruby (nécessite une lolcatgemme)

echo Hello World | lolcat -p 0.25

Rainbow Hello World

Hauleth
la source
1

Fléchir au 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++]}"));}

Existe-t-il un moyen de colorer des textes sans utiliser de langage de balisage? Je ne peux pas tester les toiles ...

JiminP
la source
Oooo ... +1 même avec le HTML
MrZander
1

Je sais qu'il dit "pas de balisage en tout cas", mais je voudrais soumettre ce CSS en 468 caractères:

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

Aucun style n'est fait avec le balisage.

Ry-
la source
0

Rubis

242 manière plus procédurale:

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

Si je parviens à penser à une meilleure façon de générer les couleurs, je le ferai. Quelques-unes des moyennes, je viens de faire quelques essais et erreurs pour obtenir des couleurs proches.

agmcleod
la source