バイオリズムとの出会い
昔々、バイオリズムというのが流行った時期がありました(笑)
その頃、ちょうど BASIC が動くポケットコンピュータが登場していたので、その上で動作するバイオリズム・グラフィックというプログラムを投稿して、まんまとポケコンライブラリーという本を手に入れたものです。
IchigoJam で作ってみよう
「IchigoJam - BASICプログラミング専用こどもパソコン」 で BASIC を思い出し懐かしい思いをしていましたが、最近、IchigoJam に EEPROM へのプログラムの書き込み/読み出しができるようになったので、少し大きなプログラムを書いてみようという気になり、題材として昔を思い出してバイオリズム・グラフィックを選びました。
1MBのEEPROMには、127本のプログラムが保存できるし、嬉しいのは IchigoJam 本体のファームウェアをバージョンアップなどで書き換えてもプログラムが消えないこと。以前は3本しか保存できず、折角打ち込んでもファームウェアを書き換えると消えてしまうので、長いプログラムを作ろうという気にはなかなかならなかったが、消えないで残るのなら...という気になったのだった。
コンバージョンできない(泣)
IchigoJam の BASIC インタプリタには次のような制約があります。
- 数学関数が無い(グラフを書くのに SIN 関数が使えない)
- 数値は整数のみ
- 数値の制限値(-32,767 〜 32,767)
- メモリー制約(プログラムは 1KB以内)
実数演算や数学関数が使えないため、ポケットコンピュータ版の BASIC プログラムをコンバージョンすることを諦め、新規に作ることにしました。
工夫したこと
前述の制約をクリアするために次のような工夫をしました。
SIN関数の代わりに配列に値をセットして使う
0度〜360度までを10度刻みに SIN の値を画面上の縦の座標に変換したものを配列に入れておき、それぞれの周期(P:23、S:28、I:33)に合わせて取り出して使うようにした。
誕生日から目的の月までの日数計算
ポケットコンピュータのプログラムでは、バイオリズムを作成する年月と誕生日の年月、それぞれの基準年からの通算日数を計算し、その差から通算日数を計算していたのですが、値の制約(32,767)でこの方法が使えず、作成年月と誕生日の年月の差分を直接計算するようにした。さらに計算式の途中結果も小数点以下が切り捨てられ整数化されるため、それを考慮した式にした。ま、INT関数が不要という利点も^^;
誤差補正の手抜き
日数の最大値(32,767)は、89.7年に相当するので、うるう年の計算は単純に4年に1回とし、100年、400年ルールは無視した。また、うるう年該当年なのかどうかの判定も省略しているので、誕生日からの日数計算ではプラスマイナス1日の誤差出る場合があります。
ソースコード
前置きが長くなりましたが、ソースコードは次のとおりです。サイズはぎりぎりの990バイト ^^;
IchigoJam の BASIC 言語仕様は「IchigoJam BASIC リファレンス]」を参照してください。
なお、このプログラムは89年以上はサポートしていませんし、バイオリズムの値も保証していません^^; (人のリズムは外部要因や健康・精神状態で変動するはずですので、誕生日から正確にこれらの周期が繰り返されるはずはないと、私も思っていますし(笑))
ということを、前提にIchigoJam をお持ちでしたら、遊んでみてください。
もしかすると、SINカーブの書き方や、日数計算のしかたは参考になるかもしれません。
だれかの参考になれば私も嬉しい。
5 REM Biorhythm for IchigoJam by Y.Nomura
10 [0]=12:[1]=10:[2]=9:[3]=7:[4]=6:[5]=5:[6]=4:[7]=4:[8]=3:[9]=3
20 [10]=3:[11]=4:[12]=4:[13]=5:[14]=6:[15]=7:[16]=9:[17]=10:[18]=12:[19]=14
30 [20]=15:[21]=16:[22]=18:[23]=19:[24]=20:[25]=20:[26]=21:[27]=21:[28]=21:[29]=20
40 [30]=20:[31]=19:[32]=18:[33]=16:[34]=15:[35]=14
50 CLS:?"BIRTHDAY YYYY";:INPUT Y
60 CLS:?"BIRTHDAY MM";:INPUT M
70 CLS:?"BIRTHDAY DD";:INPUT D
80 CLS:?"KIBOU YYYY";:INPUT K
90 CLS:?"KIBOU MM";:INPUT L
100 CLS:?" BIRTHDAY:";Y;"/";M;"/";D;" KIBOU:";K;"/";L
110 I=2
120 LC1,I:?"|"
130 IF I<=22 THEN I=I+1:GOTO 120
140 LC1,12:?"+"
150 I=1
160 LCI+1,12:? (I%10)
170 IF I<31 THEN I=I+1:GOTO 160
180 LC1,24
190 IF M<3 THEN M=M+12:Y=Y-1
200 IF L<3 THEN L=L+12:K=K-1
210 F=(306*M+5)/10+D:T=(306*L+5)/10
220 IF F>T THEN T=T+365:K=K-1
230 N=365*(K-Y)+(K-Y)/4+T-F
240 I=1
250 LCI+1,[(N+I)%23*36/23]:?"P"
260 LCI+1,[(N+I)%28*36/28]:?"S"
270 LCI+1,[(N+I)%33*36/33]:?"I"
280 IF I<31 THEN I=I+1:GOTO 250
290 LC1,24:?" DAYS:";N
300 END