Halo Pelangi Dunia

11

Berurusan dengan warna dalam bahasa non-markup sering memperumit masalah. Saya ingin melihat beberapa variasi tentang bagaimana warna digunakan dalam berbagai bahasa.

Objek dari kompetisi ini adalah untuk menampilkan 'Hello World' dalam tujuh warna pelangi.

Menurut Wikipedia, ini adalah 7 warna.

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)

Aturan

  1. Program harus menampilkan 'Hello World'. (Tidak harus berupa teks, tetapi harus dibedakan sebagai 'Hello World')
  2. Setiap huruf harus memiliki warna yang berbeda.
  3. Warna bisa dalam urutan apa pun.
  4. Anda harus menggunakan masing-masing dari tujuh warna setidaknya satu kali. (Anda dapat menggunakan lebih dari warna yang diberikan)
  5. Tidak ada penggunaan bahasa markup dalam hal apa pun .

Pemenangnya adalah siapa pun yang memiliki jumlah karakter terendah DAN mengikuti aturan

Bonus -1 karakter jika ditulis dalam DART

Saya akan memilih pemenang pada 11 Januari (jika saya ingat; D).

Semoga berhasil

PEMENANG

Saya membuat kesalahan D :, pemenang yang diperbarui.

1 stranac - Python, 60 karakter

Ke-2 Ilmari - Karonen Perl + GD, 146 karakter

Panjang terpendek dengan semua aturan dipatuhi.

Brownie menunjuk ke JiminP untuk jawaban DART.

TuanZander
sumber

Jawaban:

7

Python, 60 karakter

Sekarang menggunakan 7 warna, dan yang "benar".

Menggunakan urutan pelarian ansi. Garis bawah ada di sana jadi itu bukan ruang yang tak terlihat.

Versi ini mencetak beberapa ruang ekstra, karena cara cetak python bekerja, tetapi ruang-ruang itu menghemat beberapa karakter, jadi saya baik-baik saja jika ada di sana.

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

Dan tangkapan layar, seperti yang disyaratkan oleh MrZander: masukkan deskripsi gambar di sini

stranac
sumber
Sudahkah saya membuat kesalahan? Silakan kirim tangkapan layar yang membuktikan bahwa Anda menggunakan semua warna dengan benar. "8 Warna dari hitam ke putih" tidak terdengar seperti menggunakan 7 warna yang diperlukan.
MrZander
@ MrZander: Saya telah memperbarui jawaban saya, dan berharap sekarang menyenangkan Anda. Btw, apakah Anda yakin warna keenam yang Anda berikan benar? Ini hampir sama dengan yang ke-7.
stranac
Mengambil langsung dari Wikipedia ... Saya bukan ahli warna haha.
MrZander
2
Ini bergantung pada palet khusus untuk bekerja. Misalnya, Hdicetak menggunakan kode escape untuk warna hitam, sehingga tidak terlihat di sebagian besar terminal.
hammar
12

Mathematica

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

Saya tahu, saya tahu, itu tidak sesuai dengan aturan .. tapi saya harus mencoba bermain dengan fungsi pemrosesan gambar Mathematica.

Tangkapan layar:

Halo Dunia!!!!!!!

Dillon Cower
sumber
10

Haskell, 88 karakter

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

Tangkapan layar

Perhatikan bahwa ini menggunakan warna terminal ANSI, yang hanya ada 6 dan mereka mungkin tidak cocok dengan yang diberikan (tergantung pada pengaturan terminal), jadi saya sedikit menekuk aturan di sini.

Versi sedikit lebih panjang dengan warna yang hampir benar, 107 karakter

Versi ini menggunakan warna xterm bukan yang ANSI. Ini tidak bergantung pada palet khusus, dan menggunakan warna terdekat yang bisa saya temukan di palet xterm 256-warna.

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]

masukkan deskripsi gambar di sini

hammar
sumber
7

Python, 261 karakter

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'

Menerapkan spesifikasi dengan tepat, menghasilkan gambar ppm. Inilah hasilnya, dikonversi menjadi gif dan ditingkatkan dengan faktor 4:

masukkan deskripsi gambar di sini

Keith Randall
sumber
Hehe, bagus. Butuh waktu lama bagi saya untuk memahaminya.
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 karakter

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

Ini menghasilkan output yang sama persis dengan solusi Haskell Hammar . Ini menggunakan say, jadi perlu perl 5.10+ dan -M5.010(atau -E) beralih. Untuk perl yang lebih lama, ganti saydengan print. Pengurangan satu karakter sepele dapat dicapai dengan mengganti \edengan karakter ESC literal, tetapi itu akan membuat kode lebih sulit untuk dibaca dan diedit.

Sunting: Menambahkan dua karakter untuk mencocokkan keluaran Hammar dengan tepat, dan untuk benar-benar menunjukkan keenam warna terminal yang mungkin. (Dalam versi sebelumnya, satu-satunya karakter yang dicetak dalam warna 6 = cyan adalah spasi.)

Tangkapan layar:

Halo Dunia


Sunting 2: Jika menggunakan palet terminal khusus (dan garis bawah untuk ruang) diizinkan, maka saya dapat dengan mudah mereproduksi warna tepat yang diberikan dalam spesifikasi hanya dengan 50 karakter:

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

Tangkapan layar:

Halo Dunia

Ilmari Karonen
sumber
3

Perl -> HTML, 99 karakter

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

Tangkapan layar:

Halo Dunia

HTML mungkin tidak akan melewati validator apa pun, tetapi harus dipahami oleh hampir semua browser. Kode ini tidak menghasilkan warna RGB persis seperti yang Anda daftarkan, tetapi sangat dekat. Secara khusus, warna huruf adalah:

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

Outputnya terlihat jauh lebih bagus pada latar belakang hitam, tetapi secara eksplisit mencetak saya <body bgcolor=black>akan dikenakan biaya 28 karakter tambahan. Anda dapat menyesuaikan pengaturan browser Anda untuk mendapatkan efek yang sama. :-)

Ilmari Karonen
sumber
3
Saya mungkin tidak cukup spesifik dengan aturan 5. Saya juga tidak ingin melihat markup digunakan bersama dengan bahasa lain. Tetapi bagaimanapun juga, kode yang sangat kreatif.
MrZander
3

Perl + GD, 146 karakter

Per komentar untuk jawaban saya yang lain , inilah solusi yang secara langsung menghasilkan file gambar menggunakan pustaka 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

Dan inilah hasilnya:

Halo Dunia

Sekali lagi, menggunakan latar belakang hitam akan terlihat lebih baik, tetapi akan dikenakan biaya 29 karakter ( $m->bgcolor(0,0,0);$m->clear;).

Sunting: Menemukan cara mencukur 20 karakter dengan (ab) menggunakan notasi objek tidak langsung dan beberapa penyesuaian lainnya. Kode baru memancarkan peringatan, tetapi masih berjalan dengan baik.

Ilmari Karonen
sumber
Itu lebih seperti itu;)
MrZander
Sejauh ini, ini adalah jumlah karakter terendah yang mengikuti semua aturan ke titik.
MrZander
3

Catatan tambahan 155 143

Ini bergantung pada kemampuan Ghostscript untuk "mencari tahu" bahwa Palatino adalah kependekan dari 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
sumber
1
Saya kira "Waktu" lebih pendek, tapi ... ugh.
luser droog
Curi beberapa ide Anda ...
Thomas W.
3

Beberapa pendekatan berbeda untuk melakukan ini

Nota bene

Pertama: Yang terpendek ( 89 ):

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

Hasil yang diberikan

Tidak 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

Ini terus berubah warna dalam arah x menggunakan ruang warna hsb. (Ide untuk menggunakan warna hsb dan kshow dikreditkan ke luser droog - lihat entri nya!) Ini tidak menggunakan tujuh warna yang diberikan oleh MrZander.

Ketika membatasi diri saya pada warna-warna MrZander, saya sampai di sana menggunakan 141 karakter:

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

Hasil yang diberikan

Ini mengkodekan nilai rona warna MrZander sebagai satu byte dalam rentang ASCII yang dapat dicetak. Byte ini diterjemahkan ke nilai rona dalam kisaran antara 0 dan 1 dengan mengurangi 32 dan membaginya dengan 166. Setiap karakter dari string "Hello World" diikuti oleh nilai rona yang dikodekan.

Tidak 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 : Ada yang tidak beres dengan warnanya.

Thomas W.
sumber
2

Beberapa curang tetapi menyelesaikan masalah

Bash + Ruby (butuh lolcatpermata)

echo Hello World | lolcat -p 0.25

Rainbow Hello World

Hauleth
sumber
1

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

Apakah ada cara untuk mewarnai teks tanpa menggunakan bahasa markup? Saya tidak dapat menguji kanvas ...

JiminP
sumber
Oooo ... +1 bahkan dengan HTML
MrZander
1

Saya tahu ada tulisan "no markup", tapi saya ingin mengirimkan CSS ini dalam 468 karakter:

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

Tidak ada gaya yang dilakukan dengan markup.

Ry-
sumber
0

Rubi

242 cara lebih prosedural:

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

Jika saya berhasil memikirkan cara yang lebih baik untuk menghasilkan warna saya akan. Beberapa yang tengah saya hanya melakukan beberapa trial and error untuk mendapatkan warna dekat.

agmcleod
sumber