東京=トンキン=ハノイ=河内=大阪府東部
http://www.kernelthread.com/hanoi/html/ps.html のプログラムは、PostScript なのになんで動かす手順を文字で表示するだけなのだろう。
ということで PostScript でハノイの塔を解くプログラムを書いて gif アニメ化した。
以下はソース。日本語化が不完全。
%!PS gsave [/、 /を /と /に /が /から /を利用して] {{} def} forall /とする {def} def /でないなら {ne} def /を足したもの {add} def /を掛けたもの {mul} def /という座標に移動する {moveto} def /最大円盤 を 5 とする /円盤1半径 を 7.5 とする /円盤厚さ を 7.5 とする /最大円盤半径 を 最大円盤 と 円盤1半径 を掛けたもの とする /動かす を { 4 dict begin [/空き場所 /行き先 /元位置 /円盤] {exch def} forall 円盤 が 1 でないなら { 円盤 より1小さい円盤 を 元位置 から 空き場所 に 行き先 を利用して 動かす } if 元位置 から 円盤 を除く 行き先 から 円盤 を置く 現在の状態を描く 円盤 が 1 でないなら { 円盤 より1小さい円盤 を 空き場所 から 行き先 に 元位置 を利用して 動かす } if end } とする /を除く を {1 sub 0 put} とする /を置く を {1 sub 1 put} とする /より1小さい円盤 を {1 sub} とする /現在の状態を描く を { 1 setlinecap 円盤厚さ setlinewidth 最大円盤半径 と 2 を掛けたもの 、 円盤厚さ と 最大円盤 に 0.5 を足したもの を掛けたもの という座標に移動する 塔1 を描く 最大円盤半径 、 円盤厚さ と 0.5 を掛けたもの という座標に移動する 塔2 を描く 最大円盤半径 と 3 を掛けたもの 、 円盤厚さ と 0.5 を掛けたもの という座標に移動する 塔3 を描く showpage } とする /を描く を { 2 dict begin /塔 exch def 最大円盤 -1 1 { /円盤 exch def 塔 に 円盤 があるなら { 円盤を描く } if } for stroke end } とする /があるなら を { 1 sub get 1 eq } とする /円盤を描く を { /円盤半径 を 円盤1半径 と 円盤 を掛けたもの とする 円盤半径 だけ左に移動 円盤半径 と 2 を掛けたもの の長さの線を右に引く 円盤半径 だけ左に移動 円盤厚さ だけ上に移動 }とする /だけ左に移動 を {neg 0 rmoveto} とする /だけ上に移動 を {0 exch rmoveto} とする /の長さの線を右に引く を {0 rlineto} とする /塔1 を [ 最大円盤 {1} repeat ] とする /塔2 を [ 最大円盤 {0} repeat ] とする /塔3 を [ 最大円盤 {0} repeat ] とする 現在の状態を描く 最大円盤 を 塔1 から 塔2 に 塔3 を利用して 動かす 最大円盤 を 塔2 から 塔3 に 塔1 を利用して 動かす 最大円盤 を 塔3 から 塔1 に 塔2 を利用して 動かす grestore