Hello World Rainbow

11

Radzenie sobie z kolorami w językach bez znaczników często komplikuje sprawy. Chciałbym zobaczyć kilka wariantów używania kolorów w różnych językach.

Celem tego konkursu jest stworzenie „Hello World” w siedmiu kolorach tęczy.

Według Wikipedii jest to 7 kolorów.

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)

Zasady

  1. Program musi wypisać „Hello World”. (Nie musi to być tekst, ale musi być rozpoznawalny jako „Hello World”)
  2. Każda litera musi być innego koloru.
  3. Kolory mogą być w dowolnej kolejności.
  4. Musisz użyć każdego z siedmiu kolorów przynajmniej raz. (Możesz użyć więcej niż podane kolory)
  5. W żadnym wypadku nie można używać języków znaczników .

Zwycięzcą zostaje ten, kto ma najmniejszą liczbę znaków ORAZ przestrzega zasad

Bonus -1 znak, jeśli jest napisany w DART

Wyłonię zwycięzcę 11 stycznia (jeśli pamiętam; D).

Powodzenia

ZWYCIĘZCY

Popełniłem błąd D :, zaktualizowałem zwycięzców.

1. miejsce stranac - Python, 60 znaków

2. miejsce Ilmari - Karonen Perl + GD, 146 znaków

Najkrótsza długość przy zachowaniu wszystkich zasad.

Brownie wskazuje JiminP za odpowiedź DART.

MrZander
źródło

Odpowiedzi:

7

Python, 60 znaków

Teraz używa 7 kolorów i tych „poprawnych”.

Wykorzystuje sekwencje specjalne Ansi. Podkreślenie jest tutaj, więc nie jest to niewidoczna przestrzeń.

Ta wersja drukuje dodatkowe spacje ze względu na sposób drukowania Pythona, ale spacje te oszczędzają sporo znaków, więc nie mam nic przeciwko, że tam są.

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

I zrzut ekranu, zgodnie z wymaganiami MrZander: wprowadź opis zdjęcia tutaj

stranac
źródło
Czy popełniłem błąd? Proszę zamieścić zrzut ekranu potwierdzający, że poprawnie użyłeś wszystkich kolorów. „8 kolorów od czerni do bieli” nie brzmi tak, jakby używał 7 wymaganych kolorów.
MrZander
@MrZander: Zaktualizowałem swoją odpowiedź i mam nadzieję, że teraz ci się spodoba. Przy okazji, czy jesteś pewien, że podany przez ciebie kolor 6 jest poprawny? Jest prawie taki sam jak siódmy.
stranac 12.01.12
Wziąłem to prosto z Wikipedii ... Nie jestem ekspertem od kolorów, haha.
MrZander
2
To zależy od niestandardowej palety do pracy. Na przykład Hjest drukowany przy użyciu kodu ucieczki dla koloru czarnego, więc nie jest widoczny na większości terminali.
hammar
12

Matematyka

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

Wiem, wiem, to nie jest zgodne z zasadami .. ale musiałem spróbować bawić się funkcjami przetwarzania obrazu Mathematica.

Zrzut ekranu:

Witaj świecie!!!!!!!

Dillon Cower
źródło
10

Haskell, 88 znaków

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

Zrzut ekranu

Zauważ, że używa to kolorów zacisków ANSI, których jest tylko 6 i mogą one nie pasować dokładnie do tych podanych (zależy to od ustawień terminala), więc tutaj trochę wyginam reguły.

Nieco dłuższa wersja z prawie poprawnymi kolorami, 107 znaków

Ta wersja używa kolorów xterm zamiast ANSI. Nie opiera się to na żadnych niestandardowych paletach i wykorzystuje najbliższe kolory, jakie mogłem znaleźć w 256-kolorowej palecie xterm.

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]

wprowadź opis zdjęcia tutaj

hammar
źródło
7

Python, 261 znaków

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'

Dokładnie implementuje specyfikację, generując obraz ppm. Oto wynik przekonwertowany na gif i powiększony o współczynnik 4:

wprowadź opis zdjęcia tutaj

Keith Randall
źródło
Hehe, miło. Zajęło mi krępująco długą chwilę na zrozumienie.
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

Terminal Perl -> ANSI, 53 znaki

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

Daje to dokładnie taką samą wydajność jak rozwiązanie Hammar Haskell . Używa say, więc potrzebuje perla 5.10+ i -M5.010(lub-E ). Dla starszych perls, wymienić sayz print. Trywialną redukcję o jeden znak można osiągnąć zastępując \edosłowny znak ESC, ale znacznie utrudni to odczyt i edycję kodu.

Edycja: Dodano dwa znaki, aby dokładnie pasowały do ​​wyników Hammara i faktycznie pokazywały wszystkie sześć możliwych kolorów terminalu. (We wcześniejszej wersji jedynym znakiem wydrukowanym w kolorze 6 = cyjan była spacja).

Zrzut ekranu:

Witaj świecie


Edycja 2: Jeśli dozwolone jest używanie niestandardowej palety terminali (i podkreślenia dla spacji), mogę łatwo odtworzyć dokładne kolory podane w specyfikacji za pomocą zaledwie 50 znaków:

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

Zrzut ekranu:

Witaj świecie

Ilmari Karonen
źródło
3

Perl -> HTML, 99 znaków

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

Zrzut ekranu:

Witaj świecie

HTML prawdopodobnie nie przejdzie żadnych walidatorów, ale powinien być zrozumiany przez prawie wszystkie przeglądarki. Ten kod nie wyświetla dokładnie wymienionych kolorów RGB, ale jest bardzo blisko. W szczególności kolory liter to:

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

Wyjście wygląda o wiele ładniej na czarnym tle, ale wyraźne wydrukowanie <body bgcolor=black>kosztuje mnie 28 dodatkowych znaków. Zamiast tego możesz dostosować ustawienia przeglądarki, aby uzyskać ten sam efekt. :-)

Ilmari Karonen
źródło
3
Być może nie byłem wystarczająco precyzyjny w przypadku reguły 5. Nie chciałem też, aby znaczniki były używane w połączeniu z innym językiem. Ale w każdym razie bardzo kreatywny kod.
MrZander
3

Perl + GD, 146 znaków

Zgodnie z komentarzami do mojej drugiej odpowiedzi , oto rozwiązanie, które bezpośrednio tworzy plik obrazu przy użyciu biblioteki 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

A oto wynik:

Witaj świecie

Ponownie użycie czarnego tła wyglądałoby lepiej, ale kosztowałoby mnie 29 znaków ( $m->bgcolor(0,0,0);$m->clear;).

Edycja: nauczyłem się, jak ogolić 20 znaków przez (ab) przy użyciu pośredniej notacji obiektów i kilku innych poprawek. Nowy kod emituje ostrzeżenie, ale nadal działa poprawnie.

Ilmari Karonen
źródło
Tak to bardziej;)
MrZander
Jak dotąd jest to najniższa liczba znaków, która spełnia wszystkie zasady kropki.
MrZander
3

Postscript 155 143

Zależy to od zdolności Ghostscript do „stwierdzenia”, że Palatino jest skrótem od 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
źródło
1
Przypuszczam, że „Times” jest krótszy, ale ... ugh.
luser droog
Ukradnij niektóre ze swoich pomysłów ...
Thomas W.,
3

Niektóre różne podejścia do tego celu

Postscriptum

Po pierwsze: najkrótszy ( 89 ):

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

Renderowany wynik

Bez golfa:

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

To ciągle zmienia kolor w kierunku x za pomocą przestrzeni kolorów hsb. (Pomysł użycia kolorów hsb i kshow przypisuje się luserowi droogowi - patrz jego wpis!) Nie używa dokładnie siedmiu kolorów podanych przez MrZandera.

Ograniczając się do kolorów MrZandera, docieram tam używając 141 znaków:

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

Renderowany wynik

To koduje wartość odcienia kolorów MrZandera jako jeden bajt w drukowanym zakresie ASCII. Ten bajt jest tłumaczony na wartość odcienia w zakresie od 0 do 1, odejmując 32 i dzieląc przez 166. Po każdym znaku ciągu „Hello World” następuje jego zakodowana wartość odcienia.

Bez golfa:

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

DO ZROBIENIA : Coś jest nie tak z kolorami.

Thomas W.
źródło
2

Trochę oszukiwania, ale rozwiązać problem

Bash + Ruby (potrzebuje lolcatklejnotu)

echo Hello World | lolcat -p 0.25

Rainbow Hello World

Hauleth
źródło
1

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

Czy istnieje sposób pokolorowania tekstu bez użycia języka znaczników? Nie mogę testować płócien ...

JiminP
źródło
Oooo ... +1 nawet z HTML
MrZander
1

Wiem, że jest napisane „bez znaczników w żadnym wypadku”, ale chciałbym przesłać ten CSS jeden na 468 znaków:

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

Żadna stylizacja nie jest wykonywana przy użyciu znaczników.

Ry-
źródło
0

Rubin

242 bardziej proceduralny sposób:

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

Jeśli uda mi się wymyślić lepszy sposób na generowanie kolorów, zrobię to. Kilka środkowych zrobiłem trochę prób i błędów, aby zbliżyć kolory.

agmcleod
źródło