Hello World Rainbow


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. 7色のそれぞれを少なくとも1回使用する必要があります。(指定された色以上を使用できます)
  5. いずれの場合もマークアップ言語使用しません。

勝者は、キャラクターの数が最も少なく、ルールに従います。

DARTで記述されている場合、ボーナス-1文字

1月11日に勝者を選びます(覚えている場合は、D)。

幸運を

勝者)

間違えたD :、更新された勝者。

1日 stranac-Python、60文字

2番目。 イルマリ-カロネンPerl + GD、146文字

すべてのルールが守られている最短の長さ。

ブラウニーは、DARTの回答についてJiminP指しています。

回答:


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

@MrZander:私は私の答えを更新しました、そして今それがあなたを満足させることを望みます。ところで、あなたが提供した6番目の色が正しいと確信していますか?7日目とほぼ同じです。
stranac

ウィキペディアからまっすぐに取りました...私は色の専門家ではありません。
MrZander

2
これは、カスタムパレットが機能することに依存しています。たとえば、Hは黒のエスケープコードを使用して印刷されるため、ほとんどの端末では表示されません。
ハンマー

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文字のわずかに長いバージョン

このバージョンでは、ANSIの代わりにxtermの色を使用します。これはカスタムパレットに依存せず、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

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))
スティーブンランバルスキー

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)スイッチが必要です。古いPerlの場合は、交換してくださいsayprint。簡単な1文字の削減は\e、リテラルESC文字に置き換えることで実現できますが、コードの読み取りと編集がはるかに難しくなります。

編集: Hammarの出力と正確に一致し、6つの可能なターミナルカラーすべてを実際に表示するために2つの文字を追加しました。(以前のバージョンでは、色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

出力は黒の背景では見栄えがよくなりますが、明示的に印刷する<body bgcolor=black>と28文字余分にコストがかかります。代わりに、ブラウザの設定を調整して同じ効果を実現できます。:-)


3
ルール5では十分に具体的ではなかったかもしれません。他の言語と組み合わせて使用​​されるマークアップも見たくありませんでした。しかし、いずれにしても、非常に創造的なコードです。
MrZander

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

これまでのところ、これはドットまでのすべてのルールに従う最小の文字数です。
-MrZander

3

あとがき155 143

これは、PalatinoがPalatino-Romanの略であるという「フィグアウト」のGhostscriptの能力に依存しています。

/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
「Times」はもっと短いと思いますが、...うーん。
luserはドローグ

あなたのアイデアのいくつかを盗んだ…
トーマスW.

3

これを行うためのいくつかの異なるアプローチ

PostScript

最初:最短のもの(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によって指定された正確な7色は使用しません。

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範囲の1バイトとしてエンコードします。このバイトは、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

TODO:色に関して何かがおかしい


2

いくつかの不正行為が、問題を解決します

Bash + Ruby(lolcatgem が必要)

echo Hello World | lolcat -p 0.25

レインボーハローワールド


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

マークアップ言語を使用せずにテキストに色を付ける方法はありますか?キャンバスをテストできません...


Oooo ... HTMLでも+1
MrZander

1

「どのような場合でもマークアップなし」と書かれていることは知っていますが、このCSSを468文字で送信したいと思います。

<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

私が色を生成するためのより良い方法を考えることができれば、私はそうします。真ん中のいくつかは、色を近づけるための試行錯誤をしました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.