Codeへの愛とCuriosity

CodeIQ への出題・解説解題・その周辺について、思いつくままに。

CodeIQ に出した「hello, world × 3」の解説・解題

CodeIQ に「hello, world × 3」( https://codeiq.jp/ace/nabetani_takenori/q766 )という問題を出した。
挑戦の募集はすでに締めきっている。
というわけで、解説・解題。

で。
まずは問題

問題

■ 概要
hello, world
という文字列を出力するプログラムを、3つのプログラミング言語で1つずつ書いてください。
ただし、どのプログラムも、他の2つのプログラムで使った文字をできるだけ使わないようにしてください。
複数の実装で使われている文字の種類が少ないほど高い評価になります。


■ 詳細
動作確認は ideone.com で行います。
言語は、以下のリストにあるものから、3つを選んでお使いください。

AWK, Ada, Bash, C#, C++, CLIPS, COBOL, Clojure, CommonLisp, C言語, D言語, Erlang, F#, Factor, Falcon, Forth, Fortran, Go, Groovy, Haskell, Icon, Intercal, Java, JavaScript, Lua, Nemerle, Nice, Nimrod, Objective-C, Ocaml, Oz, PARI/GP, Pascal, Perl, Perl6, Pike, Prolog, Python, R, Ruby, SQL, Scala, Scheme, Smalltalk, Tcl, Unlambda, VB.NET, bc

PHP や Whitespace はリストにないので選べません。
※バージョン違いの言語は同一の言語とみなします。例えば、C++11 と C++4.8.1 は C++ とみなしますし、Node.js・JavaScript (rhino)・JavaScript (spidermonkey) はいずれも JavaScript とみなします。ただし、Perl と Perl6 は別の言語とみなします。


ソースコードには、文字コード 0x9 ( tab ), 0xa ( 改行 ), 0xd ( 復帰 ), 0x20〜0x7e( 英数字と普通の記号 ) 以外の文字を含んではいけません。
また、(そんなにいらないと思いますが)各ソースコードは 1023バイト以下にしてください。1024バイト以上になってはいけません。


ソースコードで使われている文字を評価する際、改行(0xa)・復帰(0xd)・復帰改行(0xd 0xa) はいずれも1文字の「改行文字」とみなします。

こんな感じ。

出題の意図とか

これを出した理由は、面白い問題だと思ったから。この理由に尽きる。
やや難しすぎるかなとも思ったし、私の得意分野ではないので不安もあったんだけど、あまりにも面白い(自画自賛)と思ったので、出した。


たぶん、問われているのは

  • 複数(できれば4つ以上)の言語に関する知見
  • あちらを立てればこちらが立たずという状況に対する対処能力

の2点。

付け加えるなら
- こういう実用的な意味がほとんどない問題を面白がれる心
も必要。

実装例

人類による解答

出題者(鍋谷)の例

まずは私の実装。

[ruby] 文字列は8進数で。出力命令は STDOUT に対する << で。

STDOUT<<%#\150\145\154\154\157\054\040\167\157\162\154\144#

[C] あまった 8 と 9 で文字コード計算(エンディアン依存)

main(){printf((int[]){99888/98/9-9});printf((int[]){9898/98});printf((int[]){98/9*98/9});printf((int[]){98/9*98/9});printf((int[]){999/9});printf((int[]){98-9-99/9-988/9/9-9/98-99/9-99/9});printf((int[]){99888/98/9-9*9});printf((int[]){99/9*98/9});printf((int[]){999/9});printf((int[]){9988/9/9-9});printf((int[]){98/9*98/9});printf((int[]){9888/98});}

[groovy] 文字列によるメソッド呼び出し

h=++"l"
e=++"o"+ ++"q"+ ++"h"+ ++h+ ++"s"
''."$e" 'hello, wo'+ ++'q'+'ld'

groovy だけちょっと解説しておくと、このコードは

""."print" "hello, world"

という意味。
この "print" と "hello, world" を実行時に生成している。
groovy ではオブジェクト対してメソッド名を文字列を渡せる。
字列リテラルに ++ や -- を使うことができるのもポイント。
※ 実は レシーバーは省略できる(!)ということを後に知ることになるんだけど、この時点では知らなかった。

それとC言語
エンディアンに依存するし、EXIT_SUCCESS で終わらないので ideone 上で「Runtime erro」と表示されるけど、レギュレーションとしてはこれで OK。

ciel 様 による解答

[Perl ]

''=~('OXZSSHOUbIDMMNK`VNSMEb=i'^'gg!#!!!!@!!!!!g@!!!!!@@@');

[Perl6 ]

say Q|hello, world|

[Ruby ]

$><<"\x68\x65\x6c\x6c\x6f\x2c\x20\x77\x6f\x72\x6c\x64"

さすが perl と思わせる意味不明さです。
記号だけのPerlプログラミングの基本原理 - JPerl Advent Calendar 2010 Sym Track
に解説がある手法で、この後も多くの挑戦者が利用しています。

ruby は、STDOUT の別名 $> を利用しています。これも今後度々登場します。

S.Kaz 様 による解答

[Python ]

print "hello, world"

[Perl ]

''=~('(?{'.('!!!!!@!%!!!G@!!!!#$!@'^'QSHOUbI@MMNk`VNSMGxOb').'})')

[Java ]

\u0063\u006C\u0061\u0073\u0073\u0020\u0049\u0064\u0065\u006F\u006E\u0065\u007B\u0070u\u0062\u006C\u0069\u0063\u0020\u0073\u0074\u0061\u0074\u0069\u0063\u0020\u0076\u006F\u0069\u0064\u0020\u006D\u0061\u0069\u006E\u0028\u0053\u0074\u0072\u0069\u006E\u0067\u005B\u005D\u0020\u0061\u0072\u0067\u0073\u0029\u007B\u0053\u0079\u0073\u0074\u0065\u006D\u002E\u006Fu\u0074\u002E\u0070\u0072\u0069\u006E\u0074\u006C\u006E\u0028\u0022\u0068\u0065\u006C\u006C\u006F\u002C\u0020\u0077\u006F\u0072\u006C\u0064\u0022\u0029\u003B\u007D\u007D


Java には、ソースコード上のすべての文字を \u0063 のような記法で書くことができるという機能があります。これを利用することで18種類の文字ですべてを書くことができます。

みけCAT 様 による解答

[Python ]

exec"\x70\x72\x69\x6e\x74\"h\x65ll\x6F\54\"\54\"w\x6F\x72ld\""

[Lua ]

print(string.format([[%]]..string.sub(tostring(tostring),1+1+1+1,1+1+1+1)..[[%]]..string.sub(tostring(tostring),1+1+1+1,1+1+1+1)..[[%]]..string.sub(tostring(tostring),1+1+1+1,1+1+1+1)..[[%]]..string.sub(tostring(tostring),1+1+1+1,1+1+1+1)..[[%]]..string.sub(tostring(tostring),1+1+1+1,1+1+1+1)..[[%]]..string.sub(tostring(tostring),1+1+1+1,1+1+1+1)..[[%]]..string.sub(tostring(tostring),1+1+1+1,1+1+1+1)..[[%]]..string.sub(tostring(tostring),1+1+1+1,1+1+1+1)..[[%]]..string.sub(tostring(tostring),1+1+1+1,1+1+1+1)..[[%]]..string.sub(tostring(tostring),1+1+1+1,1+1+1+1)..[[%]]..string.sub(tostring(tostring),1+1+1+1,1+1+1+1)..[[%]]..string.sub(tostring(tostring),1+1+1+1,1+1+1+1),((1+1+1+1+1)*(1+1))^(1+1)+1+1+1+1,((1+1+1+1+1)*(1+1))^(1+1)+1,(1+1)^(1+1)*(1+1+1)^(1+1+1),(1+1)^(1+1)*(1+1+1)^(1+1+1),111,11*(1+1+1+1),(1+1)^(1+1+1+1+1),111+1+1+1+1+1+1+1+1,111,111+1+1+1,(1+1)^(1+1)*(1+1+1)^(1+1+1),((1+1+1+1+1)*(1+1))^(1+1)))

[Intercal ]

DO :33 <- #&8
DO :38 <- #8~#8
DO :8 <- :38$:33
DO :88 <- :33$:8
PLEASE DO :333 <- :33$#3
DO :83 <- :38$:8
DO ;3 <- :83
DO ;3 SUB :38 <- '#3$#3'$#8
DO ;3 SUB :8 <- :88$':8$:8'
PLEASE DO ;3 SUB #3 <- :88$':8$:8'
DO ;3 SUB :88 <- :33
DO ;3 SUB :333 <- :33$#8
DO ;3 SUB :83 <- ':8$:38'$#8
PLEASE READ OUT ;3
DO ;3 SUB :38 <- :88$:88
DO ;3 SUB :8 <- :38$:83
DO ;3 SUB #3 <- '#3$:8'$':8$:8'
PLEASE DO ;3 SUB :88 <- '#3$:8'$:33
DO ;3 SUB :333 <- :8$:88
DO ;3 SUB :83 <- :33$:88
DO READ OUT ;3
PLEASE GIVE UP


まさか Intercal が使われるとは思っていませんでした。
Lua で 1 を使って文字コードを生成している点も見どころです。

haruya 様 による解答

[Perl 6 ]

my	@c;@c[5]=chr	655-555;@c[6]=chr	656-555;@c[7]=chr	659-555;@c[8]=chr	665-557;@c[9]=chr	666-555;@c[55]=chr	669-555;@c[56]=chr	675-556;@c[57]=chr	87-55;@c[58]=chr	99-55;say	@c[7]~@c[6]~@c[8]~@c[8]~@c[9]~@c[58]~@c[57]~@c[56]~@c[9]~@c[55]~@c[8]~@c[5];

[Ruby ]

$><<"g".next+"ello"+"+".next+"\x1f".next+"woq".next+"ld"

[Fortran ]

PROGRAM HELLO
WRITE(*,'(A)')ACHAR(3432/33)//ACHAR(303/3)//ACHAR(324/3)//ACHAR(324/3)&
//ACHAR(333/3)//ACHAR(44)//ACHAR(32)//ACHAR(24040/202)&
//ACHAR(333/3)//ACHAR(342/3)//ACHAR(324/3)//ACHAR(300/3)
END

Perl では 2, 3, 4。ruby では 1。Fortran では 0, 5〜9 を使って文字を作っています。

ゆた 様 による解答

[Perl 6 ]

my
$X=eval
"\x63\x68\x72
44"
and
my
$Y=eval
"\x63\x68\x72
32"
and
my
$Z="\x73"
and
my
$ZZ="a"
and
my
$ZZZ="\x79"
and
eval
"$Z$ZZ$ZZZ
\"\x68\x65ll\x6F$X$Y\x77\x6F\x72l\x64\""

[Ruby ]

puts	0b1101000.chr+0b1100101.chr+0b1101100.chr+0b1101100.chr+0b1101111.chr+0b101100.chr+0b100000.chr+0b1110111.chr+0b1101111.chr+0b1110010.chr+0b1101100.chr+0b1100100.chr

[SQL ]

SELECT LOWER('HELLO, WORLD');

perl6 の「"\x63\x68\x72<改行>44"」は、「chr<改行>44」です。
最終的に「say "hello, world"」に相当する内容を eval しています。
SQL は、LOWER を使うと大文字だけで簡潔に書けて、このゲームには向いている言語です。

knightrogen 様 による解答

[Python ]

print'hello,','world'

[Perl 6 ]

say "\x68\x65\x6c\x6c\x6f\x2c\x20\x77\x6f\x72\x6c\x64"

[Pascal(gpc) ]

PROGRAM		P;
BEGIN
	WRITE(CHAR(111-11+1+1+1+1));
	WRITE(CHAR(111-11+1));
	WRITE(CHAR(111-1-1-1));
	WRITE(CHAR(111-1-1-1));
	WRITE(CHAR(111));
	WRITE(CHAR(11+11+11+11));
	WRITE(CHAR(11+11+11-1));
	WRITE(CHAR(111+11-1-1-1));
	WRITE(CHAR(111));
	WRITE(CHAR(111+1+1+1));
	WRITE(CHAR(111-1-1-1));
	WRITE(CHAR(111-11));
END.

Pascal 登場です。
Python の print はコンマで区切ると空白を出すということを利用して、Python で空白を消費するのを回避しています。

simbelmyn 様 による解答

[SQL ]

SELECT LOWER('HELLO, WORLD');

[Ruby ]

eval\
%!\160\165\164\163\42\150\145\154\154\157\54\40\167\157\162\154\144\42!

[Perl ]

{$j="jgnnq"}{$g="yqtnf"}{$j=~tr/d-z/b-x/}{$g=~tr/d-z/b-x/}{$n=chr	9+9+9+9+8}{$q=chr	8+8+8+8}{print	$j.$n.$q.$g}

Perl では、文字をずらしたり、8や9を使って文字コードの計算をしたりしています。
これができるのも、ruby を eval で書くことで、tr chr $ = などの文字を うまく残せているからですね。

Azicore 様 による解答

[Perl ]

print q|hello|;print q|^|^q|r|;print q| world|;

[Ruby ]

$><<"%c"%104<<"%c"%101<<"%c"%108<<"%c"%108<<"%c"%111<<"%c"%44<<"%c"%32<<"%c"%119<<"%c"%111<<"%c"%114<<"%c"%108<<"%c"%100

[Fortran ]

PRINT'('//&
CHAR(ICHAR('Q')-ICHAR('@')/(ICHAR('C')-ICHAR('A')))//&
CHAR(ICHAR('R')-ICHAR('@')/(ICHAR('C')-ICHAR('A')))//'A'//&
CHAR(ICHAR('Q')-ICHAR('@')/(ICHAR('C')-ICHAR('A')))//')',&
CHAR(ICHAR('H')-ICHAR('@')/(ICHAR('A')-ICHAR('C'))),&
CHAR(ICHAR('E')-ICHAR('@')/(ICHAR('A')-ICHAR('C'))),&
CHAR(ICHAR('L')-ICHAR('@')/(ICHAR('A')-ICHAR('C'))),&
CHAR(ICHAR('L')-ICHAR('@')/(ICHAR('A')-ICHAR('C'))),&
CHAR(ICHAR('O')-ICHAR('@')/(ICHAR('A')-ICHAR('C'))),&
CHAR(ICHAR('L')-ICHAR('@')/(ICHAR('C')-ICHAR('A'))),&
CHAR(ICHAR('@')/(ICHAR('C')-ICHAR('A'))),&
CHAR(ICHAR('W')-ICHAR('@')/(ICHAR('A')-ICHAR('C'))),&
CHAR(ICHAR('O')-ICHAR('@')/(ICHAR('A')-ICHAR('C'))),&
CHAR(ICHAR('R')-ICHAR('@')/(ICHAR('A')-ICHAR('C'))),&
CHAR(ICHAR('L')-ICHAR('@')/(ICHAR('A')-ICHAR('C'))),&
CHAR(ICHAR('D')-ICHAR('@')/(ICHAR('A')-ICHAR('C')))
END

perlruby でコンマ、括弧、演算子 を回避し、Fortran に活かしています。
Fortran でおこなっていることは

print "(12A1)", 'h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd'
end

ということのようです。12A1 は「12回、Ascii コードを、1文字ずつ」という意味だと想像していますが、よく知りません。

tomwot 様 による解答

[Ruby ]

STDOUT<<%Q[%c%c%c%c%c%c%c%c%c%c%c%c]%[0b1101000,0b1100101,0b1101100,0b1101100,0b1101111,0b101100,0b100000,0b1110111,0b1101111,0b1110010,0b1101100,0b1100100]

[Perl ]

$_=qq|hIPPo& worPd|;tr/H-Y$-'/d-u*-./;print;

[Perl 6 ]

say("\x68\x65\x6C\x6C\x6F\x2C"~eval("\"\\x{5+5+5+5}\"")~"\x77\x6F\x72\x6C\x64")

ruby で2進数。perl でtr。perl6 でエスケープ。
としたいところ、空白文字も \x20 も書けない。
という辺りからの試行錯誤が感じられます。

tmftake 様 による解答

[Perl ]

print"hello=#world"&"helloldworld"

[SQL ]

SELECT LOWER('HELLO, WORLD');

[Ruby ]

$><<%!\x68\x65\x6c\x6c\x6F\x2c\x20\x77\x6F\x72\x6c\x64!

文字列を回避するためのトリックの量が最低限に抑えられていて、おそらく今回もっとも可読性が高いコードになっています。
この解答だけみると、ひどく簡単な問題に思えてきませんか?

yoshi-taka 様 による解答

[Ruby ]

$><<%?\150\145\154\154\157\054\040\167\157\162\154\144?

[Bash ]

echo hello, world

[VB.net ]

MODULE	MODULEE
SUB	MAIN()
CONSOLE.WRITELINE("HELLO".TOLOWER()	&	CHR(83-39)	&	SPACE(LEN("L"))	&	"WORLD".TOLOWER())
END	SUB
END	MODULE

小文字を使わないために VB.net という作戦です。
コンマとスペースは CHR(83-39) と SPACE(LEN("L")) で出しています。
Bash は echo という他とかぶりにくいコマンドと、引用符不要というメリットがあるんですが、利用者はそれほど多くありませんでした。

rec68k 様 による解答

[Perl 6 ]

say("\x68\x65\x6C\x6C\x6F\x2C\x20\x77\x6F\x72\x6C\x64");

[Forth ]

111
11
1-
1-
1-
1-
-
EMIT
111
11
1
-
-
EMIT
111
1-
1-
1-
EMIT
111
1-
1-
1-
EMIT
111
EMIT
11
11
11
11
+
+
+
EMIT
11
11
11
1
-
+
+
EMIT
111
11
1-
1-
1-
+
EMIT
111
EMIT
111
1+
1+
1+
EMIT
111
1-
1-
1-
EMIT
111
11
-
EMIT

[Unlambda ]

`.d`.l`.r`.o`.w`. `.,`.o`.l`.l`.e`.hi

Perl6, Forth, Unlambda という、メジャー言語なし(私見)という選択です。
このゲームでは Forth が非常に強力だということがわかります。(私も知りませんでした)

tbpgr 様 による解答

[Perl 6 ]

my	@b=chr	111-3-3-1;@b~=chr	111-3-3-3-1;@b~=chr	111-3;@b~=chr	111-3;@b~=chr	111;;@b~=chr	33+11;;@b~=chr	33-1;@b~=chr	111+3+3+1+1;@b~=chr	111;@b~=chr	111+3;@b~=chr	111-3;@b~=chr	111-3-3-3-3+1;say	@b

[Ruby ]

$><<"\u{68}\u{65}ll\u{6F}#{"*".next.next}\u{20}\u{77}\u{6F}\u{72}l\u{64}"

[SQL ]

SELECT LOWER('HELLO, WORLD')
/

perl6 と ruby で文字の取り合いをしながら文字コードの計算をしています。
"\u{68}" はあまり見たことがないんですが、"\u0068" と同じです。

L.star 様 による解答

[Ruby ]

print"hello, world"

[Perl ]

''=~('(?{'.('[[).[|(%--/M`]/[A$'^'+)@@/^@@AA@a@*@)-@').('@'^'b').'})')

[Groovy ]

\u0070\u0072\u0069\u006E\u0074\u0027\u0068\u0065\u006C\u006C\u006F\u002C\u0020\u0077\u006F\u0072\u006C\u0064\u0027

groovy で、Java でも使える、全ソースコードをエスケープ。ruby では順当に書き、理不尽はすべて perl に押し付けるという作戦です。

kinaba 様 による解答

[C ]

main(){exit(!printf("hello, world"));}

[Java ]

\u0063\u006C\u0061\u0073\u0073\u0020\u006A\u0061\u0076\u0061\u007B\u0070\u0075\u0062\u006C\u0069\u0063\u0020\u0073\u0074\u0061\u0074\u0069\u0063\u0020\u0076\u006F\u0069\u0064\u0020\u006D\u0061\u0069\u006E\u0028\u0053\u0074\u0072\u0069\u006E\u0067\u005B\u005D\u0020\u0061\u0072\u0067\u0073\u0029\u007B\u0053\u0079\u0073\u0074\u0065\u006D\u002E\u006F\u0075\u0074\u002E\u0070\u0072\u0069\u006E\u0074\u0028\u0022\u0068\u0065\u006C\u006C\u006F\u002C\u0020\u0077\u006F\u0072\u006C\u0064\u0022\u0029\u003B\u007D\u007D

[Ruby ]

b=$.**$.
j=b+b
k=j+j
q=k+k
s=q+q
v=s+s
y=v+v
$><<%<%c>%c=q|v|y
$><<%<%c>%c=b|k|v|y
$><<%<%c>%c=k|q|v|y
$><<%<%c>%c=k|q|v|y
$><<%<%c>%c=b|j|k|q|v|y
$><<%<%c>%c=k|q|v
$><<%<%c>%c=v
$><<%<%c>%c=b|j|k|s|v|y
$><<%<%c>%c=b|j|k|q|v|y
$><<%<%c>%c=j|s|v|y
$><<%<%c>%c=k|q|v|y
$><<%<%c>%c=k|v|y

C言語で、冒頭に挙げた拙作と異なり、ちゃんと EXIT_SUCCESS を返しています。
Java は他の方もおこなっていた全文字エスケープ。
ruby は $. というグローバル変数から順に 1, 2, 4, 8, ... と作っていき、ビットOR で任意の値を生成可能にするというもの。 % よりも | の方が結合が弱いという問題を、変数への代入を挟むことで回避しています。

kinaba 様 の Gist : https://gist.github.com/kinaba/9597413

神による解答

告白しますが、私自身は出題時点では hello, world × 3 までしか解けておらず、hello, world × 4 は、かなり時間を割いたものの、書けずにいました。書けそうだという強い手応えはあるものの、あちらを立てればこちらが立たず、迷走していました。

そんな中、神が現れました。

神は重複なしで hello, world を 6つ書きます:

shinh 様 による解答

[Groovy ]

"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"{"}"}"}"}"}"}"}"}"}"}"}${--"${--"${--"${--"${--"${--"${--"${--"${--"{"}"}"}"}"}"}"}"}"}${--"${--"${--"${--"${--"${--"o"}"}"}"}"}"}${--"o"}${--"${--"${--"${--"${--"${--"${--"{"}"}"}"}"}"}"}""${--"${--"${--"${--"${--"${--"${--"o"}"}"}"}"}"}"}${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"o"}"}"}"}"}"}"}"}"}"}${--"${--"${--"o"}"}"}${--"${--"${--"o"}"}"}o${--"-"}${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"-"}"}"}"}"}"}"}"}"}"}"}"}"}${--"${--"${--"${--"{"}"}"}"}o${--"${--"${--"${--"${--"${--"${--"${--"${--"{"}"}"}"}"}"}"}"}"}${--"${--"${--"o"}"}"}${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"o"}"}"}"}"}"}"}"}"}"}"}${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"${--"-"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"}"

[Perl ]

s##qq@RRRRR:RRRRQWRRQRRRq:@^qq@qqemq^mqSSSAHmSqSe:^@^qq@SQ^QWFWFmmm::HmQmSAF@#ee

[Ruby ]

print %%%<<770%666<<707%606<<708%600<<708%600<<777%666<<660%77<<700%668<<786%667<<777%666<<780%666<<708%600<<700%600<<70%60

[JavaScript(spidermonkey) ]

_=!'';__=_+_+_;___=(''+''['']);([][(''+!_)[+'']+___[__+_+_]+(''+!_)[_+_]+(''+_)[+'']+(''+_)[__]+(''+_)[+_]][(''+[][(''+!_)[+'']+___[__+_+_]+(''+!_)[_+_]+(''+_)[+'']+(''+_)[__]+(''+_)[+_]])[__]+(_+[][(''+!_)[+'']+___[__+_+_]+(''+!_)[_+_]+(''+_)[+'']+(''+_)[__]+(''+_)[+_]])[+_+[+'']]+___[+_]+(''+!_)[__]+(''+_)[+'']+(''+_)[+_]+___[+'']+(''+[][(''+!_)[+'']+___[__+_+_]+(''+!_)[_+_]+(''+_)[+'']+(''+_)[__]+(''+_)[+_]])[__]+(''+_)[+'']+(_+[][(''+!_)[+'']+___[__+_+_]+(''+!_)[_+_]+(''+_)[+'']+(''+_)[__]+(''+_)[+_]])[+_+[+'']]+(''+_)[+_]]((''+_)[__]+('!'+[][(''+!_)[+'']+___[__+_+_]+(''+!_)[_+_]+(''+_)[+'']+(''+_)[__]+(''+_)[+_]])[__+[+'']]+([]+!_)[+_]+([]+!_)[_+_]+'(\'\\'+(+_)+(__+__)+(+'')+(''+_)[+_]+___[__+_+_]+___[+_]+(''+_)[+'']+'(\\\'\\'+(+_)+(__+_+_)+(+'')+(''+_)[__]+(''+!_)[_+_]+(''+!_)[_+_]+'\\'+(+_)+(__+_+_)+(__+__+_)+'\\'+(__+_+_)+(__+_)+'\\'+(__+_)+(+'')+'\\'+(+_)+(__+__)+(__+__+_)+'\\'+(+_)+(__+_+_)+(__+__+_)+(''+_)[+_]+(''+!_)[_+_]+___[_+_]+'\\\')\')'))()

[Bash ]

dc	czzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzPczzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzPzzzzzzzzPzPzzzzPczzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzPczzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzPzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzPczzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzPzzzzPczzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzPczzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzPczzzzzzzzzzzP	2>&1	|	dc	2>&1	|	awk	/ll/

[Forth ]

439
335
MOD
EMIT
434
333
MOD
EMIT
443
335
MOD
EMIT
443
335
MOD
EMIT
444
333
MOD
EMIT
44
EMIT
333
43
MOD
EMIT
453
334
MOD
EMIT
444
333
MOD
EMIT
449
335
MOD
EMIT
443
335
MOD
EMIT
433
333
MOD
EMIT
43
33
MOD
EMIT


非常に僭越ですが、軽く解説を。
groovy は

this."print" "hello, world"

の、this. を省略したものです。難解な式を評価するとこうなるわけです。

perl は、簡単にすると

s//qq|print "hello, world"|/ee

となるんだと思います。
s//文字列/ee という形の「二段eval」と呼ばれる邪悪な技があるようです。

ruby は、この中では比較的普通な感じです。ただ、%%% で空文字をつくっている辺りは非常に見慣れない感じです。

JavaScript ファンタスティックでなんだかさっぱりわかりませんが、

をよく読むと分かりそうな感じです(私にはわかっていません)。

Bash は、この6つの中ではもっとも現世から遠いように感じます。
中身は、cat の結果を dc に渡して、それを awk でフィルタしてます。
dc は、逆ポーランド計算機。だそうです。
ここで 2>&1 と書くために、この4文字を使わないように他言語で無理しています。

Forth は、大文字と余らせている数字で。使えない数字がたくさんあるので、MOD を使ってうまく文字コードを作っています。EMIT で計算結果のコードの文字がそのまま出るところがお得です。

他の方はたぶん気にならなかった文字数制限(1023バイト以内)が、shinh様 の場合は制限として機能してしまい、設定してよかったと思ったり、申し訳ないと思ったり。

shinh 様の 記事 : http://d.hatena.ne.jp/shinichiro_h/20140318#1395080165

感想

多くの方に、慣れない言語に挑戦する機会を提供することになったようで、それは本当に良かったと思っている。
問題文中に例としてあげたものよりも重複が多くなっている解答も多くあり、それについてはもう少し頑張ってほしかったと思った。

最後に

今月中に次の問題を出す予定(未着手)なのでよろしくお願い致します。

それと。
第20回 オフラインリアルタイムどう書く( http://atnd.org/events/48500 ) やります。
お暇とご興味のある方は是非。