プログラミング言語APLで謹賀新年Golf

2012年の元旦ということで、プログラミング言語APLで謹賀新年Golfをやってみました。
APL2012golf-73byte
APLとはA Programming Languageの略で、1957年のFORTRAN登場以降にケネス・アイバーソン博士によって発明された数式処理のための記法をIBMが対話型のプログラミング言語として修正し実装したものです。当時は⍳{iota}や⍴{rho}など特殊な記号を入力するためのAPLキーボードがあったそうです。
APL-keyboard
今ではAPLフォントの記号はすべてUnicodeの中で定義されています。
先月開催したサイボウズ・ラボユース冬の合宿では、林拓人さんが筑波大学の図書館から借りてきたAPLの教科書があったので少し斜め読みしてみました。それで、APLの記号の使い方が大体わかったので、今回の謹賀新年Golfをしてみることにしました。
まずは91文字のAPLプログラム。
11×((3⊖5 o↑1⌽(1 o⍴⍳o)∊3 o)+1⊖5 o↑1⌽(2 o⍴⍳o)∊3 7 o)+1-((5 o⍴0,⍳27)∊o(o+10))∨(5 o⍴⍳o)∊2×⍳o←13

11 11 11 0 11 11 11 0 11 0 11 11 11
0  0 11 0 11  0 11 0 11 0  0  0 11
11 11 11 0 11  0 11 0 11 0 11 11 11
11  0  0 0 11  0 11 0 11 0 11  0  0
11 11 11 0 11 11 11 0 11 0 11 11 11

こんな感じで上のAPLの1行プログラムを実行すると、5×13のマトリクスで表現された 2 0 1 2 という 0 1 の数列が出力されます。バイナリアンになった気持ちで、0は空白、11はドットで塗り潰す、という心の眼で実行結果を見てください。今年の西暦2012に見えますよね?

■■■□■■■□■□■■■
□□■□■□■□■□□□■
■■■□■□■□■□■■■
■□□□■□■□■□■□□
■■■□■■■□■□■■■

もうちょっと数列の作り方を工夫すればコードが短くなるかな、と思ってGolfしたのがこちら。67文字。
11×1+(8⌽1⊖5 o↑2 1⍴1)-(⍵+3⌽⍵←4⊖5 o↑3 3⍴7⌽5<⍳9)+5 o⍴¯2⌽(o⍴⍳o←13)∊2×⍳4

11 11 11 0 11 11 11 0 11 0 11 11 11
0  0 11 0 11  0 11 0 11 0  0  0 11
11 11 11 0 11  0 11 0 11 0 11 11 11
11  0  0 0 11  0 11 0 11 0 11  0  0
11 11 11 0 11 11 11 0 11 0 11 11 11

24文字も短くなっています!
非常に簡潔なコードですね。
APLの処理系はたくさんあるのですが、openAPLという処理系がオープンソースで公開されていて、Ubuntuでも何とか動かすことができました。
openAPL
しかし、X11のAPLフォントとキーバインドの設定がよくわからなかったので、結局はWindowsで動作するAPL処理系の一つNARS2000でプログラムを作成しました。林さんも合宿中はこの処理系を使ってAPLプログラミングを楽しんでいました。
■APLによるFizzBuzzとLifeGame (林拓人さん作)
APLによるFizzBuzzとLifeGame (林拓人さん作)
林さんは合宿中、自分でFizzBuzzやライフゲームのコードをフルスクラッチから書き起こしていて、かっこよかったです。
林拓人さんによるAPLプログラミング紹介
というわけで、今年の元旦は未来のプログラミング言語として評価の高いAPLの書き初めでした。
Javaアプレットとして動作するAPLetteという冗談のような名前のプログラムもあるそうです。ただ、こちらはAPLフォントによる直接入力ができないので、ASCIIテキストの記法で入力してあげる必要があります。
プログラミング言語Jの記法に馴染めなかったという人も、APLの記号ならわかりやすく理解できるかもしれません。温故知新のAPL。ぜひ、みなさんも楽しいAPLライフをお過ごしください。

コメントは受け付けていません。