Hello World Rainbow

11

Lidar com cores em linguagens sem marcação frequentemente complica as coisas. Gostaria de ver algumas variações de como a cor é usada em diferentes idiomas.

O objetivo desta competição é produzir 'Hello World' nas sete cores do arco-íris.

Segundo a Wikipedia, essas são as 7 cores.

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)

As regras

  1. O programa deve gerar 'Hello World'. (Não precisa necessariamente ser texto, mas deve ser distinguível como 'Hello World')
  2. Cada letra deve ter uma cor diferente.
  3. As cores podem estar em qualquer ordem.
  4. Você deve usar cada uma das sete cores pelo menos uma vez. (Você pode usar mais do que as cores fornecidas)
  5. Nenhum uso de linguagens de marcação em nenhum caso .

O vencedor é quem tiver a menor quantidade de caracteres E seguir as regras

Bônus -1 caractere se estiver escrito no DART

Eu vou escolher o vencedor em 11 de janeiro (se bem me lembro; D).

Boa sorte

VENCEDOR (es)

Cometi um erro D :, vencedores atualizados.

1º. stranac - Python, 60 caracteres

2nd. Ilmari - Karonen Perl + GD, 146 caracteres

Menor comprimento com todas as regras cumpridas.

Brownie aponta para JiminP para a resposta do DART.

MrZander
fonte

Respostas:

7

Python, 60 caracteres

Agora, usando 7 cores e as "corretas".

Usa sequências de escape ansi. O sublinhado está lá apenas para que não seja um espaço invisível.

Esta versão imprime alguns espaços extras, devido à maneira como a impressão do python funciona, mas esses espaços economizam alguns caracteres, então eu estou bem com eles estando lá.

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

E uma captura de tela, conforme exigido pelo MrZander: insira a descrição da imagem aqui

Stranac
fonte
Eu cometi um erro? Poste uma captura de tela provando que você usou todas as cores corretamente. "8 cores do preto ao branco" não parece ter usado as 7 cores necessárias.
MrZander
@ MrZander: Atualizei minha resposta e espero que agora lhe agrade. Aliás, você tem certeza de que a sexta cor que você forneceu está correta? É praticamente o mesmo que o sétimo.
stranac
Levou direto da Wikipedia ... Eu não sou especialista em cores haha.
MrZander
2
Isso depende de uma paleta personalizada para funcionar. Por exemplo, o Hé impresso usando o código de escape para preto, portanto não é visível na maioria dos terminais.
Hammar
12

Mathematica

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

Eu sei, eu sei, isso não está em conformidade com as regras .. mas eu tive que tentar jogar com as funções de processamento de imagem do Mathematica.

Captura de tela:

Olá Mundo!!!!!!!

Dillon Cower
fonte
10

Haskell, 88 caracteres

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

Captura de tela

Observe que isso usa cores de terminal ANSI, das quais existem apenas 6 e podem não corresponder exatamente às fornecidas (depende das configurações do terminal), por isso estou flexionando um pouco as regras aqui.

Versão ligeiramente mais longa com cores quase corretas, 107 caracteres

Esta versão usa cores xterm em vez de cores ANSI. Isso não depende de nenhuma paleta personalizada e usa as cores mais próximas que pude encontrar na paleta xterm de 256 cores.

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]

insira a descrição da imagem aqui

hammar
fonte
7

Python, 261 caracteres

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'

Implementa exatamente as especificações, gerando uma imagem em ppm. Aqui está o resultado, convertido em gif e ampliado por um fator de 4:

insira a descrição da imagem aqui

Keith Randall
fonte
Hehe, legal. Levei um momento embaraçosamente longo para entender.
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 caracteres

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

Isso produz exatamente a mesma saída da solução Haskell da Hammar . Ele usa say, portanto, precisa do perl 5.10+ e da opção -M5.010(ou -E). Para perls mais antigos, substitua saypor print. Uma redução trivial de um caractere poderia ser alcançada substituindo-se \epor um caractere ESC literal, mas isso tornaria o código muito mais difícil de ler e editar.

Edit: Adicionado dois caracteres para combinar exatamente com a saída de Hammar e realmente mostrar todas as seis cores possíveis do terminal. (Na versão anterior, o único caractere impresso na cor 6 = ciano era o espaço.)

Captura de tela:

Olá Mundo


Edit 2: Se o uso de uma paleta de terminal personalizada (e um sublinhado para o espaço) for permitido, eu posso reproduzir facilmente as cores exatas fornecidas na especificação com apenas 50 caracteres:

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

Captura de tela:

Olá Mundo

Ilmari Karonen
fonte
3

Perl -> HTML, 99 caracteres

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

Captura de tela:

Olá Mundo

O HTML provavelmente não passará por nenhum validador, mas deve ser entendido por quase todos os navegadores. Esse código não produz as cores RGB exatas que você listou, mas fica muito próximo. Especificamente, as cores das letras são:

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

A saída parece muito melhor em um fundo preto, mas imprimir explicitamente um <body bgcolor=black>teria me custado 28 caracteres extras. Você pode ajustar as configurações do navegador para obter o mesmo efeito. :-)

Ilmari Karonen
fonte
3
Talvez eu não tenha sido específico o suficiente com a regra 5. Também não queria ver a marcação usada em conjunto com outro idioma. Mas, em qualquer caso, código muito criativo.
MrZander
3

Perl + GD, 146 caracteres

Pelos comentários da minha outra resposta , aqui está uma solução que produz diretamente um arquivo de imagem usando a biblioteca 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

E aqui está a saída:

Olá Mundo

Novamente, usar um fundo preto ficaria melhor, mas me custaria 29 caracteres ( $m->bgcolor(0,0,0);$m->clear;).

Edit: Descobri como cortar 20 caracteres por (ab) usando notação indireta de objetos e alguns outros ajustes. O novo código emite um aviso, mas ainda funciona bem.

Ilmari Karonen
fonte
Isso é mais parecido com ele;)
MrZander
Até agora, essa é a contagem de caracteres mais baixa que segue todas as regras até o ponto.
precisa saber é o seguinte
3

Postscript 155 143

Isso depende da capacidade do Ghostscript de "descobrir" que Palatino é a abreviação 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
fonte
1
Suponho que "Times" seja mais curto, mas ... ugh.
Luser droog 18/09/12
Roubou algumas de suas idéias ...
Thomas W.
3

Algumas abordagens diferentes para fazer isso com

PostScript

Primeiro: o mais curto ( 89 ):

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

Resultado renderizado

Sem golfe:

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

Isso muda continuamente a cor na direção x usando o espaço de cores hsb. (A idéia de usar cores hsb e kshow são creditadas ao luser droog - veja sua entrada!) Ele não usa as sete cores exatas fornecidas por MrZander.

Ao me restringir às cores de MrZander, chego lá usando 141 caracteres:

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

Resultado renderizado

Isso codifica o valor de matiz das cores do MrZander como um byte no intervalo ASCII imprimível. Esse byte é convertido em um valor de matiz no intervalo entre 0 e 1, subtraindo 32 e dividindo por 166. Cada caractere da seqüência de caracteres "Hello World" é seguido por seu valor de matiz codificado.

Sem golfe:

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 : Algo não está certo com as cores.

Thomas W.
fonte
2

Alguns trapaceiros, mas resolvem o problema

Bash + Ruby (precisa de lolcatgema)

echo Hello World | lolcat -p 0.25

Rainbow Hello World

Hauleth
fonte
1

Dardo para 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 alguma maneira de colorir textos sem usar a linguagem de marcação? Não posso testar telas ...

JiminP
fonte
Oooo ... +1 mesmo com o HTML
MrZander
1

Eu sei que diz "sem marcação em nenhum caso", mas eu gostaria de enviar este CSS um em 468 caracteres:

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

Nenhum estilo é feito com a marcação.

Ry-
fonte
0

Rubi

242 maneira mais processual:

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

Se eu conseguir pensar em uma maneira melhor de gerar as cores, eu irei. Alguns dos do meio, eu apenas fiz algumas tentativas e erros para obter as cores próximas.

agmcleod
fonte