もうプログラムリストの入力ミスをしても安心!!

おーと・りすと・ちぇっかー

  ALICE(アリス) ver1.0

 

 BASICで作られたプログラムはマシン語と違い、入力ミスをした場合にエラーが出るためにどこが間違っているか分かります。しかしながら、エラーの出ない入力ミスも多数存在します。例えば「1」と「I」を入力を間違えた場合を考えてみましょう。

 (1) A=A+1
 (2) A=A+I

(1)を(2)のように間違えてた場合はエラーが出ない上に、どこが間違っているのかも一見分からないほどですね。このような入力ミスを発見するのが今回のプログラムです。
 実を言うとすでに似たようなプログラムは発表されています。E500シリーズ用で有名なのが公孫さんの「BCS」(PJ94年12月号/ver1.2は96年2月号掲載)です。
 確かにBCSは素晴らしいプログラムですが、幾つかの問題点を抱えています。

 「BCS」の問題点の例


 これらの「BCS」が持っている多くの問題点を出来るだけ解決しようという形で生まれたのがこの「ALICE(アリス)」です。

(注意)決して「BCS」がダメだと言っているのではなく、私の指向とかみ合わない部分があったというだけであり、アリスにもまた問題点は多くあります。詳しくは「アリスの特長と問題点」を参照してください。

《使用する前に》
 まず、アリスをリスト通りに入力してください。
 次に「RUN*ALICE」としてきちんと入力されているかどうかチェックしてください。画面左にチェックしている行番号が表示されていて、もしその行に入力ミスがあれば「ダメ」と表示されるのでリストをよく見て修正してください。もし入力ミスがなければ「カンペキネ!」と表示されます。
 きちんとリストを入力したらRAMファイルにアスキーセーブしてください(61090行参照)。

《使用方法》
 自分が作ったプログラムが完成したら投稿やアップロードする直前にアリスをMERGEでRAMファイルから読み込んで下さい。PFキーに登録しておくとよいでしょう(61100行参照)
 アリスを読み込んだら「RUN*LOLI」としてください。そうするとチェックサムの作成を行います。作業している行が右に表示されていきます。
作成が終了したら「オワッタヨ!」と表示されます。そして、まだプログラムの修正をするかどうか聞いてくるので、このまま投稿するのであれば「N」を押してください。すると不要な行は自動的に削除され投稿するメインプログラムとアリスの本体部分だけが残ります。「N」を押した後、さらに修正したくなった場合はもう一度RAMファイルからアリスを読み込めば問題ありません
 今度はこの「アリス」が組み込まれ発表されたプログラムを入力する人は、すべて打ち込んだあとに先程書いたように「RUN*ALICE」を実行してください。この時に注意するのは、必ず入力した直後(メインプログラムを実行する前)にアリスを実行しなくてはいけないということです。だから、発表者は「必ず実行前にチェックしてください」と原稿中に明記しておいてください。
 万一チェック前にメインプログラムを実行した場合は次のようにしてください。
 (1)プログラムモードにする
 (2)カーソル下を押す
 (3)カーソル右を押す
 (4)[RETURN]

《最後に》
 PSS(ポケコン用ソフト統一規格)準拠のプログラムを発表することにより、プログラムの実行が誰でも安心して行えるようになりましたが、「打ち込んだリストが正しいとは限らない」という重大な問題を抱えているのです。
このことはBCS発表により解決したかのように見えますが、チェックサムリストを作成し発表するプログラムと両方用意しなければならないことによる発表側の負担がかかること、また雑誌投稿の時には誌面の問題があることリストを打ち込む人もBCSを持っていなければならないために、たとえチェックサムリストがあってもチェックできない人が存在するなどの理由により普及したとは言えない部分があります。そのために発表する人、それを打ち込む人双方の負担を極限まで軽減したのがこの「アリス」なのです
 このアリスは構想4年制作1週間という膨大な時間(?)を費やして完成にいたりました。ということで、E500シリーズのユーザーの人はできるだけ使ってやってください。その場合出来れば「アリスver1.0使用」などと原稿中に書いてください。より効率的なアルゴリズムが見付かりしだいどんどんバージョンアップしていきます。アリスの良いところはチェックルーチンが必ず一緒に発表されるのでバージョンアップにより計算アルゴリズムが変わっても問題がないことです。だから、今よりも優れたアルゴリズムを考えた人は遠慮なく言ってください。
 G800シリーズユーザーの人はもし強い要望があれば移植も考えますが、現時点では私はG800シリーズに関する知識がE500ほどない(というか持ってすらない)ために作ることができません。ご希望があれば技術公開をしますのでぜひ誰か移植してください。もちろんカシオの人も・・・(笑)。
 知っている人もいると思いますがアリスとは「Auto LIst ChecEr」の略でもあります(笑)

《プログラムリスト》
60000 *ALICE CLS :CLEAR :OPEN BTEXT$ FOR INPUT AS #1:D$=INPUT $(&13,&1):DIM A(&2)
60010 A$="C/1TGbdVB2ROFc7///
60020 FOR J=&1TO LEN A$:Y=ASC MID$ (A$,J,&1):FOR I=&TO &2:A(I)=ASC INPUT $(&1,&1):NEXT :A=&1,B=A(&)+A(&1),C=A(&)*256+A(&1):PRINT C;:IF Y<48LET D$=INPUT $(A(&2),1):GOTO "CK"ELSE FOR I=2TO A(&2):Z=ASC INPUT $(1,1),B=B+A*(Z-(Z>95))+1,A=3-A:NEXT
60030 D$=INPUT $(&1,&1):IF Y+(Y>95)<>(B-32768AND 63)+48BEEP 1:WAIT :PRINT "ダメ!";:WAIT &:M=&1
60040 "CK"PRINT :NEXT :IF M PRINT "オワリ"ELSE BEEP &3:PRINT "カンペキネ!"
60050 END
61000 *LOLI CLEAR :M$=CHR$ &+CHR$ &5,R$=CHR$ &D:KEY &,M$+CHR$ &1F+CHR$ &1C+R$+M$+"G.61010"+R$:END
61010 CLS :OPEN BTEXT$ FOR INPUT AS #1:D$=INPUT $(&13,&1),Z$="60010A$="+CHR$ &22:DIM A(&2)
61020 "ST"FOR I=&TO &2:A(I)=ASC INPUT $(&1,&1):NEXT :V=A(&),A=&1,B=V+A(&1),C=V*256+A(&1):IF C>60040THEN 61060ELSE PRINT C:FOR I=2TO A(&2):Z=ASC INPUT $(1,1),B=B+A*(Z-(Z>95))+1,A=3-A
61030 IF I=3IF Z=39OR C=60010LET X$="/",D$=INPUT $(A(&2)-3,&1):GOTO "PS"
61040 NEXT :S=B-32768AND 63,X$=CHR$ (48+S-(S>47))
61050 "PS"Z$=Z$+X$,D$=INPUT $(&1,&1):GOTO "ST"
61060 KEY &,M$+"Z$"+R$+CHR$ &+CHR$ &AF+R$+M$+"G.61070"+R$:END
61070 CLS :BEEP &1:PRINT "オワッタヨ!":PRINT "プログラム ノ シュウセイヲ スル?(Y/N)"
61080 "KY"K$=INKEY$ :IF K$="Y"KEY &,M$+"L."+R$ ELSE IF K$="N"KEY &,M$+"DEL.60050-"+R$+M$+"B.1:CLS"+R$ ELSE "KY"
61090 'SAVE"E:ALICE",A
61100 'KEY6,"MERGE"+CHR$&22+"E:ALICE"+CHR$&D
61110 ' ALICE ver1.0 OCHAME soft 00/02/14


「アリス」の特長と問題点


では、以下にアリスの特長と問題点を記しておきます。

《「アリス」の特長》

  1. 完全自動化により誰でも簡単に扱える

     まず、プログラムを発表する人はアリスを実行するだけで、自動的に必要なチェックサムがプログラムに書き込まれるのです。これはロリ(LOLI)という技術(「List Output&List Input」の略で要はプログラムリストを読み取る技術とプログラムを自己書き換えする技術を合わせたもので私が勝手に命名)が使用されています。リストをチェックする人もアリスを実行するだけで自動的にチェックが完了するので難しいことは何もありません

  2. メインプログラム、チェックサム、チェックプログラム(アリス)がすべて1つのプログラムで収まる

     アリスはメインプログラムにチェックするプログラムを組み込むことを前提に作られているのでBCSのようにプログラムがないからチェックが出来ないなんてことはありません
     また、アリスはチェックサムリストという方式ではなくチェックサムをメインプログラムの中に自動組み込みされますので、発表するリストはメインプログラムのみで済みます
    コラム チェックサムとは

     チェックサムとは何かというとプログラムリストを符号化(符号化とは情報を符号で置き換えたもの)したもののことです。符号化というと良く使われているのがデータ圧縮のプログラムです。
     このアリスではプログラムリスト1行を6ビットに符号化しています。この符号化したものを元に発表者の正確なリストのものと入力者のリストを比べることにより正しく入力されているかどうか判断しています。
     しかし、単純に6ビットに符号化しただけだと精度は約96%(理論上)しかないのですが、入力ミスのパターン分析をし代表的なものをほぼシャットアウトすることにより約99.9%(理論上)の精度でチェックを行っています。したがって、入力するチェックサムは1行当たり1文字と非常に少ないのにもかかわらず十分な精度を保っています。

    《代表的な入力ミスの例》
        正 → 誤
     (a) 1 → I ・・・・・・・ 似ている文字の見間違い
     (b) AB → BA ・・・・・ 文字の入れ代わり
     (c) ***A → **A ・・ 文字の打ちもらし
     (d) Q → W ・・・・・・・ 隣のキーを押してしまう

     以上のものについて確率上ほぼ確実に見付けることが可能になります。
     この符号化アルゴリズムは非常にシンプル(シンプルだから小さくて速い!)なものなのでリストを見たら分かると思いますが、要望があれば詳しく解説しますのでお知らせください。

  3. 注釈文が省略可能

     BCSでは注釈文しかない行も正確に入力する必要がありましたが、アリスでは最初の「'」だけを入力すればあとはどのように入力してもよいのです。
     注釈文自体がプログラムの動作に影響を与えることがないので正確に入力する必要性がないためにこのような機能をつけました。正確に入力しなくてもよいのならば、最初から入力しなくてもよいように思えますが、中には注釈文のある行にジャンプするようなプログラムがあるのために、単純にその行を削ることはできないのです。

  4. 行番号のチェック機能がある

     BCSは行番号を間違えて入力していてもチェックすることができません。
     (a) 10 PRINT A
     (b) 11 PRINT A

     BCSでは(a)と(b)では同じチェックサムになりますが、アリスでは異なるチェックサムとなります。これは、きちんと10行おきに並んだプログラムなら起こるはずのないミスですが、そうでない場合には少なからず起こる場合があります。その場合は動作上全く問題がないかまたは「Undefined line」とエラー発生してしまいます。エラーが出るために入力ミスというのが分かるので問題がないと言えなくはないですが、チェックをしてミスがないのを確認した状態でエラーが発生するのは、気持ちの良いことではないですね。

  5. プログラムがどこにあってもチェックできる

     BCSではユーザーが発表するプログラムまたは打ち込んだプログラムが「S1:TEXT.BAS」にあることを前提に処理が行われています。恐らく、ほとんどの人はこれで十分なのでしょうが、RAMカードの方をメインメモリにして使用している人やBTEST$を使用している人(私くらいか・・・(笑))は正常にチェックをすることができません。
     したがって、アリスではチェックをするプログラムのファイル名を調べてからチェックを行っています。
     単に「S1:TEXT.BAS」をBTEXT$に変えただけなので、ここでわざわざ書くようなことではないのですが・・・(笑)

  6. BCSよりもリストが短い
     これは、ちょっとインチキですが、チェックサムを作成するルーチンとチェックをするルーチンを分離することにより実現しています。
     したがって、全体ではBCSよりも大きいのですが、プログラムに組み込むルーチンはBCS(ver1.2)の約3分の2の長さ(466バイト)になっています。チェックサムを作成するルーチンはプログラムを打ち込んだ人には必ずしも必要であると言う訳ではないので単に合理化のためです(笑)。

《「アリス」の問題点》

  1. チェック精度が低いこと

     これは、特長の(2)で「十分な精度」と書いたのに反する感じですね(笑)
     確かにアリスは理論上約99.9%の精度を誇っているのですが、これはパターン分析によって弾き出された結果を元にしていることで実現しており、予測不可能なミスをしている場合にはチェックもれの可能性があるからです。
     特にOMPデータなどのランダムに並んでいる文字を入力する場合には最悪の場合約98.4%(ミスが発見できない確率が64分の1)までチェック精度が落ちてしまいます。しかし、単純な入力ミス(単純でない入力ミスとは「A」を入力するつもりで「b」を入力するなど通常考えられないもの)の場合は精度は理論値に近くなりますので、それほど神経質になる必要はありません。しかし、とりあえず注意しておいた方がよいかもしれません。
     というのも、1行あたりの文字数が50文字で2行あたり1つ(つまり100文字に1つ)の確率で入力ミスがあるという想定で理論値を計算しているのでランダムに並んだ文字列だとこれよりミスをする確率が高くなるために精度が落ちる(逆に言えば正確に入力すれば精度がアップする)のです。
     確かに単純に精度から言えばBCSの方が高いですが、BCSは人間の目でチェックするという工程が入るためにミス1000回につき1回見落とすと考えれば精度はアリスと変わらなくなるかもしれません(苦しい言い訳・・・(笑))。

  2. チェック出来るプログラムの大きさの制限

     このアリスは全体で240行以下(目安として10〜15Kバイト)のプログラムでしか使用することができません。
     これは、ベーマガなどの雑誌に投稿したり、ホームページなどでリストの形で発表するのには十分だと思われますが、不満に思われる人もいるかもしれません。
     これは、チェックプログラムのサイズを優先したためなので、もし、多少サイズが大きくても構わないという人がおられましたらデラックスバージョン(?)を作ります。その場合は6ビットの符号化では精度が十分ではなくなる可能性があります(例えば、2000行、100Kバイトの巨大なプログラムを発表しそれを入力したときに1000個の間違いがあったら、期待値で言えばそのうち1つは見付け切れない)ので、2倍の12ビットにすることを考えています。それにより、単純計算で64倍精度がアップします。しかし、チェックサムデータの大きさが2倍になってしまいますが・・・。

  3. チェックサムをチェックすることができない

     チェックサムがある60010行はチェック機能が働かないため確実に正確に入力する必要があります。これは、完全自動化とリスト短縮のための制限で、これをなくすためにはチェックサムをチェックするルーチンを別に作る必要があり、サイズが大きくなってしまうためにこのバージョンでは見送ることになりました。もし、強い要望があれば何とかします。


発表する側も入力する人のことも考えてあげよう!!

 プログラムリストを発表する側としても、やはり、入力する側の人のことも考えておいて欲しいですよね!このことは入力する側にたったことがある人なら誰でもあると思います。意味もなく長いプログラムリスト、延々と注釈文の無いプログラムリスト・・・、これらを打ち込んだあげくはエラーが出て実行不可能では「入力にかかった時間を返せ!!」と本当に言いたくなりますね。
 この「アリス」を使用すれば、入力ミスがどの行にあるのか分かるためミスの発見が容易になります(エラーが発生した行に入力ミスがあるとは限らない!!)。もし、アリスが指摘した行に絶対入力ミスがないという場合は99.9%の確率で発表者側のミスと言えます。
 ということで、まだいろいろ書き足りないものもありますが、皆さん、ぜひ「アリス」を使ってみてください。そして、ご意見・ご感想などがありましたら遠慮なく言ってください。


「アリス」を作るきっかけは?「アリス」とはどういうものなのか?
  「アリス」を作ったわけ

特殊コマンドも紹介!?アリスを128%使いこなしたい人に贈る!
  「アリス」の裏技


RETURN

inserted by FC2 system