孤独な笑みを画面にさらして、ペン先で打ち込む「1画面プログラム」の美学:プチコンで始めるBASIC新世代育成“虎の穴”(6)(2/3 ページ)
「スパゲッティ」になったって構わない。オレはただ、ソースコードを1画面に収めたいだけなんだ。い、いや、3行に収めたいんだっ!! ニンテンドーDSi/3DSでBASICプログラミングに挑戦。
ギリギリに詰めてこそロマン、「3行プログラム」に挑戦!
ロマンかどうかはともかく、1行プログラム(ワンラインプログラム)や3行プログラムも、やはりプログラム誌の誌面の一角を占めるスタイルでした。当時、1ライン最大255文字がポピュラーでしたから、言うまでもなく1画面プログラムよりも困難ですね。
しかも、プチコンの場合、1行は最大100文字(横スクロール方式)。当時よりもさらにハードですが……。果たして、どうなることでしょうか。
BASICのセパレータである『コロン(:)』記号を使って、複数の命令を1行に収めるのは、当然ながら基本中の基本じゃ。それに命令には『短縮形』を使うとよい。例えば、こんな感じじゃな。
PRINT"●";
NEXT
↓
?"●";:NEXT
これだけだと、まだまだ3行には遠いけど……。
そこで、さらに短くするためのテクニックが必要になるのじゃ。ここからが腕の見せどころじゃぞい。
確かに、今までのは“機械的作業”と大差ありませんでしたからね。
(クッ)で……、では、短縮できそうなところを探してゆこうではないか。
1行目で変数をリセットしてるけど、1行に命令を1つしか使ってないのはもったいないなあ。
プチコンのラベルは行の先頭に『@』が必要だから、2行目のラベルの直前に必ず改行がいるんだね。どこか別の場所にCLEAR命令を移せばいいのかな?
ハハーン。8行目のENDでプログラムを抜ける直前にCLEARすれば、RUN(実行)の直後とやってるコトは同じになるんじゃネ?
それだと厳密には、ユーザーが変数を変えてからRUNすることも考えられるけど。まあ、この場合はグレーかな? とすると、変数『S』以外はクリアするまでもなくプログラム中で定義されてるから、CLEAR命令の代わりに『S=0』と書くだけでも構わないね。
フムフム。皆、初めてにしては悪くない発想じゃぞ。この手の超ショートプログラムでは、スキマなく画面を埋めるようなプログラム技術が要求されるのじゃ!
……。で、その技術、他の役に立つのかヨ?
そ、そのー。えーと、つまり、これを応用すれば、効率的なプログラムを書く練習になるんじゃなかろうか。
やっぱり3〜5行目にある『IF』文がジャマしてるね。『THEN』の後は条件式が成立した時の命令扱いになるから、コロンで他の行と結べないのが痛いなあ。
そこは『論理式』を使うところじゃな。式が“真”なら『1』、“偽”なら『0』が入るわけじゃから……。
そうか! IF文を使う代わりになりますね!
へ? ナニが?
ええと……。まず、3行目だけで考えるよ。『B!=0』が成り立つとき『Y=Y+1』、成り立たないとき『Y=Y-1』だから……。こう書き換えられるね。
IF B!=0 THEN Y=Y+1 ELSE Y=Y-1
↓
Y=Y+(B!=0)-(B==0)
……。これならボタンが押されていれば『Y=Y+1-0』、つまり『Y=Y+1』か! ナルホド、元のIF文通りで短くて、しかも後にコロンで結べるときたゼ!
分かったようじゃな。これを応用すれば、Y座標のはみ出しを抑制しとる4〜5行目までまとめて1行にできるぞい。
Y=Y+(B!=0)-(B==0)
IF Y<0 THEN Y=0
IF Y>23 THEN Y=23
↓
Y=Y-(B<=0)*(Y>0)+(B>0)*(Y<23)
お……、オウ。“真(1)”を掛け算すればそのままだし、“偽(0)”を掛け算すればゼロになる……。できたじゃねェか!
Copyright © ITmedia, Inc. All Rights Reserved.