Hola mundo arcoiris

11

Tratar con colores en lenguajes sin marcas a menudo complica las cosas. Me gustaría ver algunas variaciones de cómo se usa el color en diferentes idiomas.

El objetivo de esta competencia es mostrar 'Hello World' en los siete colores del arcoíris.

Según Wikipedia, estos son los 7 colores.

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)

Las normas

  1. El programa debe generar 'Hola mundo'. (No necesariamente debe ser texto, pero debe ser distinguible como 'Hola mundo')
  2. Cada letra debe ser de un color diferente.
  3. Los colores pueden estar en cualquier orden.
  4. Debe usar cada uno de los siete colores al menos una vez. (Puede usar más de los colores dados)
  5. No se utilizan lenguajes de marcado en ningún caso .

El ganador es quien tiene la menor cantidad de personajes Y sigue las reglas

Bonus -1 carácter si está escrito en DART

Elegiré al ganador el 11 de enero (si no recuerdo mal; D).

Buena suerte

GANADOR (s)

Cometí un error D :, ganadores actualizados.

1er. stranac - Python, 60 caracteres

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

Longitud más corta con todas las reglas cumplidas.

Brownie señala a JiminP para la respuesta de DART.

MrZander
fuente

Respuestas:

7

Python, 60 caracteres

Ahora usando 7 colores, y los "correctos".

Utiliza secuencias de escape ansi. El guión bajo está ahí solo para que no sea un espacio invisible.

Esta versión imprime algunos espacios adicionales, debido a la forma en que funciona la impresión de Python, pero esos espacios ahorran bastantes caracteres, así que estoy de acuerdo con que estén allí.

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

Y una captura de pantalla, como lo requiere MrZander: ingrese la descripción de la imagen aquí

Stranac
fuente
¿He cometido un error? Publique una captura de pantalla que demuestre que utilizó todos los colores correctamente. "8 colores del negro al blanco" no suena como si usara los 7 colores requeridos.
MrZander
@ MrZander: He actualizado mi respuesta, y espero que ahora le agrade. Por cierto, ¿estás seguro de que el sexto color que proporcionaste es correcto? Es casi lo mismo que el 7mo.
stranac
Lo tomé directamente de Wikipedia ... No soy un experto en color jaja.
MrZander
2
Esto se basa en una paleta personalizada para funcionar. Por ejemplo, el Hse imprime utilizando el código de escape para el negro, por lo que no es visible en la mayoría de los terminales.
hammar
12

Mathematica

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

Lo sé, lo sé, no cumple con las reglas ... pero tuve que intentar jugar con las funciones de procesamiento de imágenes de Mathematica.

Captura de pantalla:

¡¡¡¡¡¡¡Hola Mundo!!!!!!!

Dillon Cower
fuente
10

Haskell, 88 personajes

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

Captura de pantalla

Tenga en cuenta que esto usa colores de terminal ANSI, de los cuales solo hay 6 y es posible que no coincidan con los colores exactos dados (depende de la configuración del terminal), por lo que estoy doblando un poco las reglas aquí.

Versión ligeramente más larga con colores casi correctos, 107 caracteres

Esta versión utiliza colores xterm en lugar de colores ANSI. Esto no depende de ninguna paleta personalizada, y utiliza los colores más cercanos que pude encontrar en la paleta xterm de 256 colores.

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]

ingrese la descripción de la imagen aquí

hammar
fuente
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 la especificación exactamente, generando una imagen ppm. Aquí está el resultado, convertido a gif y ampliado por un factor de 4:

ingrese la descripción de la imagen aquí

Keith Randall
fuente
Jeje, bien. Me tomó un momento embarazosamente largo 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

Esto produce exactamente la misma salida que la solución Haskell de Hammar . Utiliza say, por lo que necesita perl 5.10+ y el -M5.010(o -E) interruptor. Para los perls más antiguos, reemplácelos saycon print. Se podría lograr una reducción trivial de un carácter reemplazando \econ un carácter ESC literal, pero eso haría que el código sea mucho más difícil de leer y editar.

Editar: se agregaron dos caracteres para que coincidan exactamente con la salida de Hammar y para mostrar los seis colores de terminal posibles. (En la versión anterior, el único carácter impreso en color 6 = cian era el espacio).

Captura de pantalla:

Hola Mundo


Edición 2: si se permite usar una paleta de terminales personalizada (y un guión bajo para el espacio), entonces puedo reproducir fácilmente los colores exactos dados en la especificación con solo 50 caracteres:

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

Captura de pantalla:

Hola Mundo

Ilmari Karonen
fuente
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 pantalla:

Hola Mundo

El HTML probablemente no pasará ningún validador, pero debería ser entendido por casi todos los navegadores. Este código no produce los colores RGB exactos que enumeró, pero se acerca mucho. Específicamente, los colores de las letras son:

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 salida se ve mucho mejor en un fondo negro, pero imprimir explícitamente <body bgcolor=black>me costaría 28 caracteres adicionales. En su lugar, puede ajustar la configuración de su navegador para lograr el mismo efecto. :-)

Ilmari Karonen
fuente
3
Es posible que no haya sido lo suficientemente específico con la regla 5. Tampoco quería ver el marcado utilizado junto con otro idioma. Pero en cualquier caso, código muy creativo.
MrZander
3

Perl + GD, 146 caracteres

Según los comentarios a mi otra respuesta , aquí hay una solución que produce directamente un archivo de imagen usando la 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

Y aquí está el resultado:

Hola Mundo

Nuevamente, usar un fondo negro se vería mejor, pero me costaría 29 caracteres ( $m->bgcolor(0,0,0);$m->clear;).

Editar: descubrió cómo eliminar 20 caracteres mediante (ab) usando notación indirecta de objetos y algunos otros ajustes. El nuevo código emite una advertencia, pero aún funciona bien.

Ilmari Karonen
fuente
Eso es más como eso;)
MrZander
Hasta ahora, este es el recuento de caracteres más bajo que sigue todas las reglas hasta el punto.
MrZander
3

Postscript 155 143

Esto se basa en la capacidad de Ghostscript para "descubrir" que Palatino es la abreviatura 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
fuente
1
Supongo que "Times" es más corto, pero ... ugh.
luser droog
Robó algunas de sus ideas ...
Thomas W.
3

Algunos enfoques diferentes para hacer esto con

Posdata

Primero: el más corto ( 89 ):

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

Resultado procesado

Sin 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

Esto cambia continuamente de color en dirección x utilizando el espacio de color hsb. (La idea de usar hsb colors y kshow se acredita a luser droog; ¡vea su entrada!) No utiliza los siete colores exactos dados por MrZander.

Al restringirme a los colores de MrZander, llego 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 procesado

Esto codifica el valor de tono de los colores de MrZander como un byte en el rango ASCII imprimible. Este byte se traduce a un valor de tono en el rango entre 0 y 1 restando 32 y dividiendo entre 166. Cada carácter de la cadena "Hello World" es seguido por su valor de tono codificado.

Sin 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 : Algo no está del todo bien con los colores.

Thomas W.
fuente
2

Algunas trampas pero resuelven el problema

Bash + Ruby (necesita lolcatgema)

echo Hello World | lolcat -p 0.25

Rainbow Hello World

Hauleth
fuente
1

Dart a 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++]}"));}

¿Hay alguna forma de colorear textos sin usar el lenguaje de marcado? No puedo probar lienzos ...

JiminP
fuente
Oooo ... +1 incluso con el HTML
MrZander
1

Sé que dice "sin marcado en ningún caso", pero me gustaría enviar este CSS en 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>

Ninguno de los estilos se realiza con el marcado.

Ry-
fuente
0

Rubí

242 formas más procesales:

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 consigo pensar en una mejor manera de generar los colores, lo haré. Algunos de los intermedios acabo de hacer una prueba y error para cerrar los colores.

agmcleod
fuente