2015年5月26日火曜日

IchigoJamの変態BASIC


速度はかなり遅いIchigoJamです。8080の1Mhzより遅いような感じですからね。
ループカウンタを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

0 件のコメント: