http://qiita.com/Nabetani/items/89fb0e2e712d4b396535
http://nabetani.sakura.ne.jp/hena/ord13updowndouble/
「増やす減らす二倍する」をCASL IIでやってみました。
(えっ、CASLってタグないの?初めて?やった!(笑))
基本的なアルゴリズムは「増やす減らす二倍する」をErlangで(横へな13参考)のものと同じです。
レジスタが16ビット幅なので、元の問題の最後の2問
- 109227 = 0x1AAAB
- 174763 = 0x2AAAB
には対応していません(手抜きです)。
答えが合っていたら .
間違っていたら x
を表示します。
CASLシミュレータで動作確認しています。
UPDOWN START TEST ;TESTからスタートする
;解くルーチン
;GR1=値, GR2=カウンタ, GR0=戻り値
SOLVE OR GR1,DC0 ;値が0ならカウンタ値を返す
JNZ NOT0
LAD GR0,0,GR2
RET
NOT0 CPL GR1,DC3 ;値が3ならカウンタ値に3を加えて返す
JNZ NOT3
LAD GR0,3,GR2
RET
NOT3 LAD GR3,0,GR1 ;最下位ビットが0なら
AND GR3,DC1 ;値を2で割りカウンタに1を加えてループ
JNZ NOTDIV2
SRL GR1,1
JUMP COUNTUP
NOTDIV2 LAD GR3,0,GR1 ;下2ビットが01なら
AND GR3,DC2 ;値から1を引きカウンタに1を加えてループ
JNZ NOT1
SUBL GR1,DC1
JUMP COUNTUP
NOT1 ADDL GR1,DC1 ;その他(下2ビットが11)なら
COUNTUP LAD GR2,1,GR2 ;値に1を加えカウンタに1を加えてループ
JUMP SOLVE
;テストルーチン
TEST LAD GR4,TESTDAT ;GR4=データポインタ
TSTLOOP LD GR1,0,GR4 ;データーを読み込む
LAD GR4,1,GR4 ;データポインタを進める
JNZ TESTNZ ;データーが0ならば終了
RET
TESTNZ LD GR2,DC0 ;カウンタを0にする
CALL SOLVE ;解く
CPL GR0,0,GR4 ;答えと比較する
LAD GR4,1,GR4 ;データポインタを進める
JNZ MSGNG
OUT OKCHAR,DC1 ;正しければ'.'を表示する
JUMP TSTLOOP ;次の問題へ
MSGNG OUT NGCHAR,DC1 ;間違っていたら'x'を表示する
JUMP TSTLOOP ;次の問題へ
OKCHAR DC '.'
NGCHAR DC 'x'
DC0 DC 0
DC1 DC 1
DC2 DC 2
DC3 DC 3
;テストデータ
TESTDAT DC 59,9
DC 10,5
DC 11,6
DC 12,5
DC 13,6
DC 14,6
DC 15,6
DC 16,5
DC 17,6
DC 18,6
DC 27,8
DC 28,7
DC 29,8
DC 30,7
DC 31,7
DC 32,6
DC 33,7
DC 34,7
DC 35,8
DC 41,8
DC 71,9
DC 27307,23
DC 43691,24
DC 0
END