ループカウンタを1000くらい回すと10秒近くかかります!?
そして、幾つか変態とも呼べる機能があるのです。
そのひとつが、GOTO文の飛び先に式を入れることができるという機能です。
つまり、
GOTO 100
ではなく
A=100
GOTO A
って感じで動いてしまうのです!??
これを利用して、ハノイの塔をちょろっと書き換えます。
(リストは最後につけます)
なんとなんと、4つあったIF文がたった1つになっちゃいました!!!
この一個も頑張れば減らせそうなんですが、論理演算使ってやるのもどうかな?と思うので、やっていません。
それにしても、手続きを記述するだけとは言え、IF文一個でハノイの塔って動いちゃうんですねぇ。あひゃひゃ。
種明かしは、スタックフレームに、次に実行すべき行数を入れて、そこに飛んでいくっていうだけなんです。まぁ、なんかアセンブラで、飛び先を直接書き換えてジャンプするみたいな、本当に低級言語な機能だと思います(褒めてます)。
そして、似たような変態機能がまだあるので、それを使うと、もしかしたら、オセロくらいは作れるかもしれません。こっちの紹介も後日やってみようと思います。
そうそう、IF文も減ったので、実行速度は通常版より3割か4割くらい早くなりました。でもね、お仕事でこういうプログラム書いちゃダメですよ!!!(笑)
つーか、書いた本人以外には、理解できないこと間違いなしです!!
解析できた方は、是非とも連絡くださいませ。
10 PRINT"TOWER OF HANOI"
20 A=1:C=0
30 [4]=1000
40 INPUT"LEVEL:",B
50 [5]=B
60 [6]=0
70 [7]=2
80 [8]=1
100 IF[A*5]>1 GOTO 200
140 PRINT
[A*5],":",[A*5+1],"->",[A*5+2]
150 C=C+1
160 A=A-1
170 GOTO
[A*5+4]
200
[A*5+4]=300
210 A=A+1
220
[A*5]=[(A-1)*5]-1
230
[A*5+1]=[(A-1)*5+1]
240
[A*5+2]=[(A-1)*5+3]
250
[A*5+3]=[(A-1)*5+2]
260 GOTO
100
300 PRINT
[A*5],":",[A*5+1],"->",[A*5+2]
310 C=C+1
320
[A*5+4]=160
330 A=A+1
340
[A*5]=[(A-1)*5]-1
350
[A*5+1]=[(A-1)*5+3]
360
[A*5+2]=[(A-1)*5+2]
370
[A*5+3]=[(A-1)*5+1]
380 GOTO
100
1000
PRINT"TOTAL:",C
1010 END