連載
» 2012年10月03日 10時00分 公開

孤独な笑みを画面にさらして、ペン先で打ち込む「1画面プログラム」の美学プチコンで始めるBASIC新世代育成“虎の穴”(6)(2/3 ページ)

[スマイルブーム マイコン部,MONOist]

ギリギリに詰めてこそロマン、「3行プログラム」に挑戦!

 ロマンかどうかはともかく、1行プログラム(ワンラインプログラム)3行プログラムも、やはりプログラム誌の誌面の一角を占めるスタイルでした。当時、1ライン最大255文字がポピュラーでしたから、言うまでもなく1画面プログラムよりも困難ですね。

 しかも、プチコンの場合、1行は最大100文字(横スクロール方式)。当時よりもさらにハードですが……。果たして、どうなることでしょうか。


ハカセ

BASICのセパレータである『コロン(:)』記号を使って、複数の命令を1行に収めるのは、当然ながら基本中の基本じゃ。それに命令には『短縮形』を使うとよい。例えば、こんな感じじゃな。



  PRINT"●";

  NEXT

  

  ?"●";:NEXT



横スクロールを1つの画像にまとめた模式図です 図3 横スクロールを1つの画像にまとめた模式図です 【画像クリックで拡大表示】

神崎

これだけだと、まだまだ3行には遠いけど……。


ハカセ

そこで、さらに短くするためのテクニックが必要になるのじゃ。ここからが腕の見せどころじゃぞい。


インテリ

確かに、今までのは“機械的作業”と大差ありませんでしたからね。


ハカセ(涙)

(クッ)で……、では、短縮できそうなところを探してゆこうではないか。


神崎

1行目で変数をリセットしてるけど、1行に命令を1つしか使ってないのはもったいないなあ。


インテリ

プチコンのラベルは行の先頭に『@』が必要だから、2行目のラベルの直前に必ず改行がいるんだね。どこか別の場所にCLEAR命令を移せばいいのかな?


ワンパク

ハハーン。8行目のENDでプログラムを抜ける直前にCLEARすれば、RUN(実行)の直後とやってるコトは同じになるんじゃネ?


インテリ

それだと厳密には、ユーザーが変数を変えてからRUNすることも考えられるけど。まあ、この場合はグレーかな? とすると、変数『S』以外はクリアするまでもなくプログラム中で定義されてるから、CLEAR命令の代わりに『S=0』と書くだけでも構わないね。


ハカセ

フムフム。皆、初めてにしては悪くない発想じゃぞ。この手の超ショートプログラムでは、スキマなく画面を埋めるようなプログラム技術が要求されるのじゃ!


ワンパク

……。で、その技術、他の役に立つのかヨ?


ハカセ(涙)

そ、そのー。えーと、つまり、これを応用すれば、効率的なプログラムを書く練習になるんじゃなかろうか。



まだ1行減っただけ 図4 まだ1行減っただけ。これからが大変!? 【画像クリックで拡大表示】

神崎

やっぱり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)”を掛け算すればゼロになる……。できたじゃねェか!



あと一歩で3行プログラム 図5 あと一歩で3行プログラム 【画像クリックで拡大表示】

Copyright © ITmedia, Inc. All Rights Reserved.