Ciao mondo arcobaleno


11

Trattare con i colori in linguaggi non di markup spesso complica le cose. Vorrei vedere alcune varianti di come il colore viene utilizzato in diverse lingue.

Lo scopo di questa competizione è quello di produrre "Hello World" nei sette colori dell'arcobaleno.

Secondo Wikipedia, questi sono i 7 colori.

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)

Le regole

  1. Il programma deve generare "Hello World". (Non deve necessariamente essere un testo, ma deve essere distinguibile come 'Hello World')
  2. Ogni lettera deve avere un colore diverso.
  3. I colori possono essere in qualsiasi ordine.
  4. È necessario utilizzare ciascuno dei sette colori almeno una volta. (Puoi usare più dei colori indicati)
  5. Nessun uso dei linguaggi di markup in ogni caso .

Il vincitore è chi ha il minor numero di personaggi e segue le regole

Bonus -1 personaggio se è scritto in DART

Sceglierò il vincitore l'11 gennaio (se ricordo; D).

In bocca al lupo

VINCITORE (s)

Ho fatto un errore D :, aggiornato i vincitori.

1 °. stranac - Python, 60 caratteri

2 °. Ilmari - Karonen Perl + GD, 146 caratteri

Lunghezza minima con tutte le regole rispettate.

Brownie indica JiminP per la risposta DART.

Risposte:


7

Python, 60 caratteri

Ora usando 7 colori e quelli "corretti".

Utilizza sequenze di escape ansi. Il carattere di sottolineatura è lì, quindi non è uno spazio invisibile.

Questa versione stampa alcuni spazi extra, a causa del modo in cui funziona la stampa di Python, ma quegli spazi risparmiano parecchi caratteri, quindi sto bene con loro.

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

E uno screenshot, come richiesto da MrZander: inserisci qui la descrizione dell'immagine


Ho fatto un errore? Pubblica uno screenshot che dimostri di aver usato correttamente tutti i colori. "8 colori dal nero al bianco" non sembra che abbia usato i 7 colori richiesti.
MrZander

@MrZander: ho aggiornato la mia risposta e spero che ora ti piaccia. A proposito, sei sicuro che il sesto colore che hai fornito sia corretto? È praticamente lo stesso del settimo.
Stranac,

L'ho preso subito da Wikipedia ... Non sono un esperto di colore ahah.
MrZander

2
Questo si basa su una tavolozza personalizzata per funzionare. Ad esempio, Hviene stampato utilizzando il codice di escape per il nero, quindi non è visibile sulla maggior parte dei terminali.
Hammar,

12

matematica

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

Lo so, lo so, non è conforme alle regole .. ma ho dovuto provare a giocare con le funzioni di elaborazione delle immagini di Mathematica.

Immagine dello schermo:

Ciao mondo!!!!!!!


10

Haskell, 88 caratteri

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

Immagine dello schermo

Si noti che questo utilizza i colori dei terminali ANSI, di cui ce ne sono solo 6 e potrebbero non corrispondere a quelli indicati (dipende dalle impostazioni del terminale), quindi sto piegando un po 'le regole qui.

Versione leggermente più lunga con colori quasi corretti, 107 caratteri

Questa versione utilizza colori xterm anziché ANSI. Questo non si basa su alcuna tavolozza personalizzata e utilizza i colori più vicini che ho trovato nella tavolozza xterm a 256 colori.

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]

inserisci qui la descrizione dell'immagine


7

Python, 261 caratteri

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 esattamente le specifiche, generando un'immagine ppm. Ecco il risultato, convertito in gif e ingrandito di un fattore 4:

inserisci qui la descrizione dell'immagine


Hehe, carino. Mi ha preso un momento imbarazzantemente lungo per capire.
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 il

7

Perl -> Terminale ANSI, 53 caratteri

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

Ciò produce esattamente lo stesso risultato della soluzione Haskell di Hammar . Usa say, quindi ha bisogno di perl 5.10+ e l'opzione -M5.010(o -E). Per i perl più vecchi, sostituiscili saycon print. Una banale riduzione di un carattere potrebbe essere ottenuta sostituendo \econ un carattere letterale ESC, ma ciò renderebbe il codice molto più difficile da leggere e modificare.

Modifica: aggiunti due caratteri per abbinare esattamente l'output di Hammar e per mostrare effettivamente tutti e sei i colori dei terminali possibili. (Nella versione precedente, l'unico carattere stampato a colori 6 = ciano era lo spazio.)

Immagine dello schermo:

Ciao mondo


Modifica 2: se è consentito utilizzare una tavolozza terminale personalizzata (e un carattere di sottolineatura per lo spazio), posso riprodurre facilmente i colori esatti indicati nelle specifiche con soli 50 caratteri:

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

Immagine dello schermo:

Ciao mondo


3

Perl -> HTML, 99 caratteri

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

Immagine dello schermo:

Ciao mondo

L'HTML probabilmente non supererà alcun validatore, ma dovrebbe essere compreso da quasi tutti i browser. Questo codice non produce gli esatti colori RGB che hai elencato, ma si avvicina molto. In particolare, i colori delle lettere sono:

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

L'output appare molto più bello su uno sfondo nero, ma la stampa esplicita <body bgcolor=black>mi costerebbe 28 caratteri extra. Puoi invece regolare le impostazioni del tuo browser per ottenere lo stesso effetto. :-)


3
Potrei non essere stato abbastanza specifico con la regola 5. Non volevo nemmeno vedere il markup usato insieme ad un'altra lingua. Ma in ogni caso, codice molto creativo.
MrZander

3

Perl + GD, 146 caratteri

Per i commenti all'altra mia risposta , ecco una soluzione che produce direttamente un file di immagine utilizzando la libreria 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

Ed ecco l'output:

Ciao mondo

Ancora una volta, usare uno sfondo nero sarebbe migliore, ma mi costerebbe 29 caratteri ( $m->bgcolor(0,0,0);$m->clear;).

Modifica: capito come radere 20 caratteri di (ab) usando la notazione indiretta di oggetti e alcune altre modifiche. Il nuovo codice emette un avviso, ma funziona ancora bene.


È più simile;)
MrZander

Finora, questo è il numero di caratteri più basso che segue tutte le regole fino al punto.
MrZander

3

Postscript 155 143

Ciò si basa sulla capacità di Ghostscript di "capire" che Palatino è l'abbreviazione di Palatino-Romano.

/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

1
Suppongo che "Times" sia più breve, ma ... ugh.
Luser droog

Ho rubato alcune delle tue idee ...
Thomas W.

3

Alcuni approcci diversi per farlo

PostScript

Primo: il più corto ( 89 ):

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

Risultato reso

Un-giocato a 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

Questo cambia continuamente colore nella direzione x usando lo spazio colore hsb. (L'idea di usare i colori hsb e kshow sono accreditati al droog utente - vedi la sua voce!) Non usa esattamente i sette colori dati da MrZander.

Quando mi limito ai colori di MrZander, ci arrivo usando 141 caratteri:

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

Risultato reso

Questo codifica il valore di tonalità dei colori di MrZander come un byte nell'intervallo ASCII stampabile. Questo byte viene tradotto in un valore di tonalità compreso tra 0 e 1 sottraendo 32 e dividendolo per 166. Ogni carattere della stringa "Hello World" è seguito dal suo valore di tonalità codificato.

Un-giocato a 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 : Qualcosa non va bene con i colori.


2

Alcuni imbrogliano ma risolvono il problema

Bash + Ruby (ha bisogno di lolcatgemma)

echo Hello World | lolcat -p 0.25

Rainbow Hello World


1

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

Esiste un modo per colorare i testi senza usare il linguaggio di markup? Non riesco a testare le tele ...


Oooo ... +1 anche con l'HTML
MrZander

1

So che dice "nessun markup in ogni caso", ma vorrei inviare questo CSS uno in 468 caratteri:

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

Nessuno stile viene eseguito con il markup.


0

Rubino

242 altre modalità procedurali:

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 riesco a pensare a un modo migliore per generare i colori, lo farò. Alcuni di quelli medi ho appena fatto qualche prova ed errore per far chiudere i colori.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.