你好世界彩虹


11

使用非标记语言处理颜色通常会使事情复杂化。我想看看在不同语言中如何使用颜色的一些变化。

比赛的目的是输出七种彩虹色的“ Hello World”。

根据维基百科,这些是7种颜色。

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)

规则

  1. 该程序必须输出“ Hello World”。(不一定需要是文本,但必须与“ Hello World”区别开来)
  2. 每个字母必须使用不同的颜色。
  3. 颜色可以是任何顺序。
  4. 您必须至少使用七种颜色中的每一种。(您可以使用比给定颜色更多的颜色)
  5. 在任何情况下都不使用标记语言。

获胜者是拥有最少角色并遵循规则的人

如果使用DART编写,则奖励-1个字符

我将在1月11日挑选获胜者(如果我还记得; D)。

祝好运

获奖者

我弄错了D :,更新了获奖者。

1号 stranac-Python,60个字符

2号 Ilmari-Karonen Perl + GD,146个字符

遵守所有规则的最短长度。

Brownie指向JiminP以获得DART答案。

Answers:


7

Python,60个字符

现在使用7种颜色,以及“正确”的颜色。

使用ansi转义序列。下划线就在那里,所以它不是一个看不见的空间。

由于python打印的工作方式,该版本打印了一些额外的空格,但是这些空格节省了很多字符,因此我可以在其中使用它们。

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

和截图,按照MrZander的要求: 在此处输入图片说明


我做错了吗?请张贴截图,证明您正确使用了所有颜色。“ 8种颜色从黑色到白色”听起来并不像它使用了7种必需的颜色。
MrZander 2012年

@MrZander:我已经更新了答案,希望现在能使您满意。顺便说一句,您确定您提供的第六种颜色正确吗?它与第七个几乎相同。
stranac 2012年

直接从维基百科上拿出来...我不是色彩专家哈哈。
MrZander

2
这取决于自定义调色板的工作。例如,H使用黑色的转义码打印,因此在大多数终端上都不可见。
hammar 2012年

12

Mathematica

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

我知道,我知道它不符合规则。.但是我不得不尝试使用Mathematica的图像处理功能。

屏幕截图:

你好,世界!!!!!!!


10

Haskell,88个字符

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

屏幕截图

请注意,这使用的是ANSI终端颜色,其中只有6种,可能与给出的确切颜色不匹配(取决于终端设置),因此我在这里稍微调整一下规则。

略长的版本,几乎正确的颜色,107个字符

此版本使用xterm颜色而不是ANSI颜色。这不依赖任何自定义调色板,而是使用了我在256色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]

在此处输入图片说明


7

Python,261个字符

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'

精确实施规范,生成ppm图像。这是转换为gif并按比例放大4的结果:

在此处输入图片说明


呵呵,很好。尴尬地花了我很长时间来理解。
cemper93 2012年

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

7

Perl-> ANSI终端,53个字符

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

这样产生的输出与Hammar的Haskell解决方案完全相同。它使用say,因此需要perl 5.10+和-M5.010(或-E)开关。对于较早的perls,请替换sayprint。通过用\e文字ESC字符代替,可以实现单字符减少,但是这会使代码更难以阅读和编辑。

编辑:添加了两个字符以完全匹配Hammar的输出,并实际显示所有六种可能的终端颜色。(在较早的版本中,唯一用颜色6 =青色打印的字符是空格。)

屏幕截图:

你好,世界


编辑2:如果允许使用自定义的终端调色板(以及空格下划线),那么我可以仅用50个字符轻松重现规范中给出的确切颜色:

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

屏幕截图:

你好,世界


3

Perl-> HTML,99个字符

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

屏幕截图:

你好,世界

HTML可能不会通过任何验证器,但几乎所有浏览器都应理解。此代码不会产生您列出的确切 RGB颜色,但确实非常接近。具体来说,字母的颜色是:

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

在黑色背景上,输出看起来要好得多,但是显式打印a <body bgcolor=black>将使我多花28个字符。您可以调整浏览器设置以达到相同的效果。:-)


3
我可能对规则5不够具体。我也不想看到标记与另一种语言结合使用。但是无论如何,都是非常有创意的代码。
MrZander 2012年

3

Perl + GD,146个字符

根据对其他答案的评论,这是一个使用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

这是输出:

你好,世界

同样,使用黑色背景看起来会更好,但要花29个字符($m->bgcolor(0,0,0);$m->clear;)。

编辑:弄清楚如何通过(ab)使用间接对象表示法和其他一些调整来削减20个字符。新代码发出警告,但仍然可以正常运行。


那更像是它;)
MrZander 2012年

到目前为止,这是遵循所有规则到点的最低字符数。
MrZander

3

后记155 143

这依赖于Ghostscript的“形象化”能力,即Palatino是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
我想“时间”较短,但是...呃。
luser droog 2012年

偷了您的一些想法...
Thomas W.

3

一些不同的方法来做到这一点

后记

第一:最短的(89):

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

渲染结果

未打高尔夫球:

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

这是使用hsb颜色空间在x方向上连续更改颜色。(使用hsb颜色和kshow的想法归功于luser droog-请参阅他的文章!)它没有使用MrZander给出的确切七种颜色。

当限制自己使用MrZander的颜色时,我使用141个字符到达了那里:

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

渲染结果

这会将MrZander颜色的色调值编码为可打印ASCII范围内的一个字节。通过减去32并除以166,可以将此字节转换为0到1之间的色调值。“ Hello World”字符串的每个字符后均带有其编码的色调值。

未打高尔夫球:

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

待办事项:颜色有些不正确。


2

有些作弊但解决了问题

Bash + Ruby(需要lolcat宝石)

echo Hello World | lolcat -p 0.25

彩虹你好世界


1

Dart转换为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++]}"));}

有没有不用标记语言就能给文本上色的方法吗?我无法测试画布...


糟糕...即使使用HTML也+1
MrZander 2012年

1

我知道它说“无论如何都没有标记”,但是我想以468个字符提交此CSS:

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

没有使用标记完成样式的。


0

红宝石

242更多的程序方式:

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

如果我想出一种更好的方法来生成颜色,我会的。我只是尝试了一些中间步骤以使颜色接近。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.