工作室 99 ハノイの塔
ちょうど30年前になりますが、ハノイの塔の解法プログラムを作ったことがありました。なぜ、そんなことを思い出したのかというと、近頃iOS9がどうのこうのという話題がネットで流れているのを見かけたからです。そう、30年前に使っていたのがOS9というOSでした。当時使っていた富士通のFM11AD2というパソコンのOSです。モトーローラ社のCPU6809用のOSなのでOS9という名称でした。その言語でBASIC09というのがあって、これでハノイの塔の解法プログラムを作ったのです。こういうプログラムは自分自身を子プロセスとして呼び出す再帰的呼び出し(recursic call)が使えないとできません。BASIC09は名前だけはBASICと付いていますがどちらかというとパスカルのような言語でした。
30年前は仮想的なものでしたが、今回は思い出しついでにと、そのハノイの塔を実際に作ってみることにしました。PCのプログラムを作って画面上で動かすのと、実際に物を手でつかんで動かすのはまったく違います。30年も経ってからこんな事になるなんて、当時はまったく思いもしませんでした。実際にハノイの塔を見たことも触ったこともありませんし、自分で作れるなんて想像もしませんでした。プログラムを書くのは指先でキーボードを打つだけですが、実際に木を切ったり孔を空けたり塗料を塗ったりという作業は物を作っているなぁと言う実感があります。
![](99/11.jpg)
設計
![](99/01.jpg)
いつものようにSketchUpで設計しました。
左の画像をクリックするとダウンロードできます。SketchUp Viewerで任意の向きに回転させたり拡大縮小したりして観ることができます。
製作
![](99/02.jpg)
厚さ12mm幅90mmの板を260mmに切って、12mmの孔を三っつ空けます。
![](99/03.jpg)
12mmの丸棒を75mmに三本切ります。
![](99/04.jpg)
9mm厚の板に80mm,70mm,60mm,50mm,40mm,30mmの円を描き、中心に14mmの孔を空けます。
![](99/05.jpg)
円盤を6枚切り出します。
![](99/06.jpg)
棒を立ててみました。角張っているので、ちょっと引っかかったりします。
![](99/07.jpg)
そこで、このように先端をとがらせてみました。
![](99/08.jpg)
三本の棒を立てて接着します。
![](99/09.jpg)
きれいにやすりがけをしてなめらかに抜き差しできるようにしました。
完成
![](99/11.jpg)
レモンオイルを塗って完成です。
遊び方
ルールは二つだけです。
- 一度に一枚だけしか動かしてはいけない。
- 小さい円盤に大きい円盤を載せてはいけない。
基本3枚の動かし方
![](99/towerOfHanoi320.gif)
円盤は6枚作りましたが、基本の動かし方はこの3枚です。よくネットに上がっているのは左端から右端への動かし方ですが、ここでは右端から左端への動かし方を披露いたします。
上に書いた二つのルールを守って動かします。3枚だとこのように7手で完了します。
6枚の動かし方
![](99/12.jpg)
では、6枚だと何手になるでしょうか。
図のように位置をABC。円盤を上から順に1,2,3,4,5,6として動きを追ってみましょう。
![](99/13.jpg)
第1手
1 -> B
最初の一手でどこに移動するか。これが肝心です。まあ、間違えても完成はできるのですが、手数が増えます。
![](99/14.jpg)
第2手
2 -> A
![](99/15.jpg)
第3手
1 -> A
![](99/16.jpg)
第4手
3 -> B
![](99/17.jpg)
第5手
1 -> C
![](99/18.jpg)
第6手
2 -> B
![](99/19.jpg)
第7手
1 -> B
![](99/20.jpg)
第8手
4 -> A
![](99/21.jpg)
第9手
1 -> A
![](99/22.jpg)
第10手
2 -> C
![](99/23.jpg)
第11手
1 -> C
![](99/24.jpg)
第12手
3 -> A
![](99/25.jpg)
第13手
1 -> B
![](99/26.jpg)
第14手
2 -> A
![](99/27.jpg)
第15手
1 -> A
![](99/28.jpg)
第16手
5 -> B
![](99/29.jpg)
第17手
1 -> C
![](99/30.jpg)
第18手
2 -> B
![](99/31.jpg)
第19手
1 -> B
![](99/32.jpg)
第20手
3 -> C
![](99/33.jpg)
第21手
1 -> A
![](99/34.jpg)
第22手
2 -> C
![](99/35.jpg)
第23手
1 -> C
![](99/36.jpg)
第24手
4 -> B
![](99/37.jpg)
第25手
1 -> B
![](99/38.jpg)
第26手
2 -> A
![](99/39.jpg)
第27手
1 -> A
![](99/40.jpg)
第28手
3 -> B
![](99/41.jpg)
第29手
1 -> C
![](99/42.jpg)
第30手
2 -> B
![](99/43.jpg)
第31手
1 -> B
![](99/44.jpg)
第32手
6 -> A
やっとここで最下段の6枚目を左端に移動できました。
![](99/45.jpg)
第33手
1 -> A
![](99/46.jpg)
第34手
2 -> C
![](99/47.jpg)
第35手
1 -> C
![](99/48.jpg)
第36手
3 -> A
![](99/49.jpg)
第37手
1 -> B
![](99/50.jpg)
第38手
2 -> A
![](99/51.jpg)
第39手
1 -> A
![](99/52.jpg)
第40手
4 -> C
![](99/53.jpg)
第41手
1 -> C
![](99/54.jpg)
第42手
2 -> B
![](99/55.jpg)
第43手
1 -> B
![](99/56.jpg)
第44手
3 -> C
![](99/57.jpg)
第45手
1 -> A
![](99/58.jpg)
第46手
2 -> C
![](99/59.jpg)
第47手
1 -> C
![](99/60.jpg)
第48手
5 -> A
これで左端に2枚移動できました。もう一息です。
![](99/61.jpg)
第49手
1 -> B
![](99/62.jpg)
第50手
2 -> A
![](99/63.jpg)
第51手
1 -> A
![](99/64.jpg)
第52手
3 -> B
![](99/65.jpg)
第53手
1 -> C
![](99/66.jpg)
第54手
2 -> B
![](99/67.jpg)
第55手
1 -> B
![](99/68.jpg)
第56手
4 -> A
左端に三枚移動完了。残り3枚となると、もうできたも同然ですね。
![](99/69.jpg)
第57手
1 -> A
![](99/70.jpg)
第58手
2 -> C
![](99/71.jpg)
第59手
1 -> C
![](99/72.jpg)
第60手
3 -> A
![](99/73.jpg)
第61手
1 -> B
![](99/74.jpg)
第62手
2 -> A
![](99/75.jpg)
第63手
1 -> A
完成!
ということで、63手でした。
これは実際にやってみると面白くてくせになり何度もやってしまいます。ここでの例は右から左への移動でしたが、右から中央、左から右、左から中央などと始点と終点を変えるとさらに面白味が出てきます。
ちなみに、枚数と最小の手数は以下のようになります。
枚数 | 手数 | 計算式 |
---|---|---|
1枚 | 1手 | 2^1-1 = 2-1 = 1 |
2枚 | 3手 | 2^2-1 = 4-1 = 3 |
3枚 | 7手 | 2^3-1 = 8-1 = 7 |
4枚 | 15手 | 2^4-1 = 16-1 = 15 |
5枚 | 31手 | 2^5-1 = 32-1 = 31 |
6枚 | 63手 | 2^6-1 = 64-1 = 63 |
7枚 | 127手 | 2^7-1 = 128-1 = 127 |
8枚 | 255手 | 2^8-1 = 256-1 = 255 |
なんだかプログラマーにとってはなじみの数字に近い物が並んでますね。そうなんです、最小手数は2の枚数乗マイナス1となるのです。
ハノイの塔に関してもっと知りたい方はこちらをどうぞ。元々は64枚なのだそうで、実際に動かそうとしても生きている間には絶対に完了しません。
2015年9月26日 記