Xin chào thế giới cầu vồng


11

Xử lý màu sắc trong các ngôn ngữ không đánh dấu thường làm phức tạp mọi thứ. Tôi muốn xem một số biến thể về cách sử dụng màu sắc trong các ngôn ngữ khác nhau.

Mục tiêu của cuộc thi này là xuất ra 'Hello World' trong bảy màu của cầu vồng.

Theo Wikipedia, đây là 7 màu.

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)

Những quy định

  1. Chương trình phải xuất ra 'Hello World'. (Không nhất thiết phải là văn bản, nhưng nó phải khó hiểu như 'Xin chào thế giới')
  2. Mỗi chữ cái phải là một màu khác nhau.
  3. Các màu sắc có thể theo thứ tự bất kỳ.
  4. Bạn phải sử dụng một trong bảy màu ít nhất một lần. (Bạn có thể sử dụng nhiều hơn các màu đã cho)
  5. Không sử dụng ngôn ngữ đánh dấu trong mọi trường hợp .

Người chiến thắng là bất cứ ai có số lượng nhân vật thấp nhất VÀ tuân theo các quy tắc

Tiền thưởng -1 ký tự nếu được viết bằng DART

Tôi sẽ chọn người chiến thắng vào ngày 11 tháng 1 (nếu tôi nhớ; D).

Chúc may mắn

Người chiến thắng

Tôi đã mắc lỗi D:, người chiến thắng được cập nhật.

1 stranac - Python, 60 ký tự

lần 2. Ilmari - Karonen Perl + GD, 146 ký tự

Chiều dài ngắn nhất với tất cả các quy tắc tuân thủ.

Brownie chỉ vào JiminP cho câu trả lời DART.

Câu trả lời:


7

Python, 60 ký tự

Bây giờ sử dụng 7 màu và những màu "chính xác".

Sử dụng trình tự thoát ansi. Gạch dưới là ở đó chỉ để nó không phải là một không gian vô hình.

Phiên bản này in thêm một số khoảng trắng, do cách in của trăn hoạt động, nhưng những không gian đó tiết kiệm được khá nhiều ký tự, vì vậy tôi rất ổn khi chúng ở đó.

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

Và một ảnh chụp màn hình, theo yêu cầu của MrZander: nhập mô tả hình ảnh ở đây


Tôi đã làm một lỗi? Vui lòng đăng ảnh chụp màn hình chứng minh rằng bạn đã sử dụng tất cả các màu đúng cách. "8 màu từ đen sang trắng" không giống như đã sử dụng 7 màu bắt buộc.
MrZander

@MrZander: Tôi đã cập nhật câu trả lời của mình và hy vọng nó sẽ làm hài lòng bạn. Btw, bạn có chắc màu thứ 6 bạn cung cấp là chính xác? Nó khá giống với thứ 7.
stranac

Lấy nó ra khỏi Wikipedia ... Tôi không phải là chuyên gia màu sắc haha.
MrZander

2
Điều này phụ thuộc vào một bảng màu tùy chỉnh để làm việc. Ví dụ: Hđược in bằng mã thoát cho màu đen, vì vậy nó không hiển thị trên hầu hết các thiết bị đầu cuối.
hammar

12

Toán học

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

Tôi biết, tôi biết, nó không tuân thủ các quy tắc .. nhưng tôi đã phải thử chơi với các chức năng xử lý hình ảnh của Mathematica.

Ảnh chụp màn hình:

Chào thế giới!!!!!!!


10

Haskell, 88 ký tự

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

Ảnh chụp màn hình

Lưu ý rằng điều này sử dụng màu thiết bị đầu cuối ANSI, trong đó chỉ có 6 màu và chúng có thể không khớp với màu chính xác được cung cấp (tùy thuộc vào cài đặt thiết bị đầu cuối), vì vậy tôi sẽ bẻ cong các quy tắc một chút ở đây.

Phiên bản dài hơn một chút với màu sắc gần như chính xác, 107 ký tự

Phiên bản này sử dụng màu xterm thay vì màu ANSI. Điều này không phụ thuộc vào bất kỳ bảng màu tùy chỉnh nào và sử dụng các màu gần nhất tôi có thể tìm thấy trong bảng màu xterm 256 màu.

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]

nhập mô tả hình ảnh ở đây


7

Python, 261 ký tự

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'

Thực hiện chính xác thông số kỹ thuật, tạo ra một hình ảnh ppm. Đây là kết quả, được chuyển đổi thành gif và được nhân rộng theo hệ số 4:

nhập mô tả hình ảnh ở đây


Hehe, tốt đẹp. Mất một thời gian dài bối rối để hiểu.
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 -> thiết bị đầu cuối ANSI, 53 ký tự

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

Điều này tạo ra đầu ra chính xác giống như giải pháp Haskell của Hammar . Nó sử dụng say, vì vậy cần perl 5.10+ và công tắc -M5.010(hoặc -E). Đối với các perls cũ, thay thế saybằng print. Việc giảm một ký tự tầm thường có thể đạt được bằng cách thay thế \ebằng ký tự ESC theo nghĩa đen, nhưng điều đó sẽ khiến mã khó đọc và chỉnh sửa hơn nhiều.

Chỉnh sửa: Đã thêm hai ký tự để khớp chính xác với đầu ra của Hammar và thực sự hiển thị tất cả sáu màu thiết bị đầu cuối có thể. (Trong phiên bản trước, ký tự duy nhất được in màu 6 = màu lục lam là khoảng trắng.)

Ảnh chụp màn hình:

Chào thế giới


Chỉnh sửa 2: Nếu cho phép sử dụng bảng màu thiết bị đầu cuối tùy chỉnh (và dấu gạch dưới cho khoảng trắng), thì tôi có thể dễ dàng tái tạo các màu chính xác được cung cấp trong thông số kỹ thuật chỉ với 50 ký tự:

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

Ảnh chụp màn hình:

Chào thế giới


3

Perl -> HTML, 99 ký tự

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

Ảnh chụp màn hình:

Chào thế giới

HTML có thể sẽ không vượt qua bất kỳ trình xác nhận nào, nhưng chỉ nên hiểu về tất cả các trình duyệt. Mã này không tạo ra màu RGB chính xác mà bạn đã liệt kê, nhưng nó rất gần. Cụ thể, màu sắc của các chữ cái là:

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

Đầu ra trông đẹp hơn rất nhiều trên nền đen, nhưng in rõ ràng <body bgcolor=black>sẽ khiến tôi mất thêm 28 ký tự. Bạn có thể điều chỉnh cài đặt trình duyệt của mình để đạt được hiệu ứng tương tự. :-)


3
Tôi có thể không đủ cụ thể với quy tắc 5. Tôi cũng không muốn xem đánh dấu được sử dụng cùng với ngôn ngữ khác. Nhưng trong mọi trường hợp, mã rất sáng tạo.
MrZander

3

Perl + GD, 146 ký tự

Theo các nhận xét cho câu trả lời khác của tôi , đây là một giải pháp trực tiếp tạo tệp hình ảnh bằng thư viện 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

Và đây là đầu ra:

Chào thế giới

Một lần nữa, sử dụng nền đen sẽ trông tốt hơn, nhưng sẽ tiêu tốn của tôi 29 ký tự ( $m->bgcolor(0,0,0);$m->clear;).

Chỉnh sửa: Tìm ra cách cạo 20 ký tự bằng cách sử dụng ký hiệu đối tượng gián tiếp và một vài điều chỉnh khác. Mã mới phát ra cảnh báo, nhưng vẫn chạy tốt.


Điều đó giống như thế hơn;)
MrZander

Cho đến nay, đây là số lượng ký tự thấp nhất tuân theo tất cả các quy tắc cho dấu chấm.
MrZander

3

Bản tin 155 143

Điều này phụ thuộc vào khả năng "tìm ra" của Ghostscript rằng Palatino là viết tắt của 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

1
Tôi cho rằng "Thời gian" ngắn hơn, nhưng ... ugh.
luser droog

Lấy trộm một số ý tưởng của bạn ...
Thomas W.

3

Một số cách tiếp cận khác nhau để làm điều này với

PostScript

Thứ nhất: Ngắn nhất ( 89 ):

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

Kết quả kết xuất

Chưa chơi gôn:

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

Điều này liên tục thay đổi màu theo hướng x bằng cách sử dụng không gian màu hsb. (Ý tưởng sử dụng màu hsb và kshow được ghi có vào luser droog - xem mục của anh ấy!) Nó không sử dụng bảy màu chính xác do MrZander đưa ra.

Khi giới hạn bản thân với màu sắc của MrZander, tôi đến đó bằng 141 ký tự:

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

Kết quả kết xuất

Điều này mã hóa giá trị màu của các màu của MrZander dưới dạng một byte trong phạm vi ASCII có thể in được. Byte này được dịch thành giá trị màu trong phạm vi từ 0 đến 1 bằng cách trừ 32 và chia cho 166. Mỗi ký tự của chuỗi "Hello World" được theo sau bởi giá trị màu được mã hóa.

Chưa chơi gôn:

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 : Một cái gì đó không hoàn toàn đúng với màu sắc.


2

Một số gian lận nhưng giải quyết vấn đề

Bash + Ruby (cần lolcatđá quý)

echo Hello World | lolcat -p 0.25

Cầu vồng xin chào thế giới


1

Chuyển sang 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++]}"));}

Có cách nào để tô màu văn bản mà không sử dụng ngôn ngữ đánh dấu? Tôi không thể kiểm tra bức tranh ...


Oooo ... +1 ngay cả với HTML
MrZander

1

Tôi biết nó nói "không đánh dấu trong mọi trường hợp", nhưng tôi muốn gửi CSS này trong 468 ký tự:

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

Không có kiểu dáng nào được thực hiện với đánh dấu.


0

Hồng ngọc

242 cách thủ tục hơn:

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

Nếu tôi quản lý để nghĩ ra một cách tốt hơn để tạo ra màu sắc tôi sẽ. Một vài trong số những cái ở giữa tôi vừa thực hiện một số thử nghiệm và lỗi để có được màu sắc gần gũi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.