プログラミングコンテスト第1回「素数発見」競技、第4回「文字列並べ替え」競技、 第5回「文字列置き換え」競技と、 N88BASIC互換インタープリタで次々とコンテストを制覇している 「よそ者」くん ですが、 プログラムそのものは短くて初心者でも作れるレベルですから、 目の付け所が良いだけ(管理人言い過ぎ?)かもしれません。 それが事実だとしても、他の人に先んじてプログラムを完成させたのですから、 コンテスト「第1位」にはまちがいないのですが。
では、「よそ者」くん のプログラムを詳細に見て、研究してみることにします。 最初は、第5回「文字列置き換え」競技の「半角全角置き換え」部門をとりあげてみまそう。
彼(?彼女かもしれない?)のえらいところは文字コード [注1] を使わなかったことです。 単純に変換したい文字を一列に、半角、全角それぞれを並べたものを用意し、変換したい文字が何番目にあるかを求める。 その順番に有る変換したい文字を取り出すだけでよい。非常にうまい方法です。 管理人が思いつく方法は、文字コードを元に変換文字列を用意するというアルゴリズムです。
文字コードを使う方法は文字コードというハードウエアに属する知識が必要なことがあります。 それ以外にも、Windows ではうまくできるのだが Linux では変換できないなど困った現象が起こります。 理由は簡単で、OSにより扱っている文字コード体系が異なるために起こるバグ (プログラムのミス) なのです。 MSDOS、Windows では、英数字は ASCII(JIS)コードなのですが、漢字コードは Shift-JIS という文字コードを採っています。 UNIX や Linux では Shift-JIS、JIS、EUC や UNICODE など数多くの異なる文字コード体系が存在し困ったことが起こっています。
100 ' 半角から全角へ置き換え BY よそ者
110 ' 2004/02/22 BY Invader
120 '
150 N$="1234567890"
160 NK$="1234567890"
170 SK$=""
200 INPUT "数字を入れてください "; S$
210 FOR I=1 TO KLEN(S$)
220 P=KINSTR(N$,KMID$(S$,I,1))
230 IF P<>0 THEN SK$=SK$+KMID$(NK$,P,1): ELSE SK$=SK$+KMID$(S$,I,1)
240 NEXT I
250 PRINT S$; " --> "; SK$
260 END
「よそ者」くんのプログラムを詳細に追いかけて見ましょう。
行番号150、160は 変換前の文字群と変換後の文字群で、並んでいる順番が一致していることが必要です。
これさえ用意できれば後は同じプログラムでよいのです。
行番号170 で変換後の文字列を入れる変数を初期化(クリア)しておきます。
行番号200 で文字を入力します。このとき、"23H5" としましょう。このときの処理の様子を追いかけて見ましょう。
たった10行のプログラムですが(変換作業はたった4行)うまく作っています。 この方法以外のプログラムもつくれますので、皆さんも「よそ者」くんに負けないように挑戦してください。 「よそ者」くんは「かな」部門が出来ないようですから、 彼より先にプログラムを完成させて、栄光の 「第1位」 を奪還してください。 現在の 第1位 は 「完全な第1位」 ではありませんから。