« 2011年12月 | メイン | 2012年3月 »

2012年1月

2012年1月 1日 (日)

プログラミング言語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ライフをお過ごしください。