昔ほかのところに出したものをHTMLにしたものです。 もすこしわかりやすく書き直すつもりです。
今ならいかに無駄なことをしていたかがよくわかります。
この話の「生徒番号」SNは、生徒のG年C組N番という情報を
SN = (G * 10 + C) * 100 + N
という式を使って配列の要素番号に対応させたものだということができます(10組は0組とみなす)。 本文にも書いたとおりこれには無駄な「空き部屋」が多い。そこで 「新・生徒番号」NSNを次のように定義します。
NSN = ((G - 1) * 10 + C) * 50 + N
NSNは全校生徒に1〜1449の番号を割り当てます(N<50と仮定。つまり1クラスは50人未満)。この対応には 無駄な空きがほとんどありません。 だから最初のアイデアどおり配列のインデックスに直接利用することができます。 いったんG,C,Nに分解することでもとの生徒番号に変換できますから、ユーザ インターフェースの部分では新生徒番号が顔を出さないようにすれば引地先生が 戸惑うこともありません。
各生徒がもつべき情報も圧縮できます。クラブは20種類あって 第三希望までですから組合わせは8000種類。優先権があるか ないかを掛けて16000種類。2バイトの整数型の変数に余裕で収まります。 たとえば
INFO = R3 * 800 + R2 * 40 + R1 * 2 + P
のように対応させればよいでしょう。整数型ですから、INFOの 情報をつめこんだり取り出したりするときに計算誤差で数値が化ける 心配はありません。
けっきょく確保すべき配列は
100 DEFINT A-Z 110 DIM RQ(1500)
たったこれだけでよかったのです。
RQ ┌──┐ 1│ │ ├──┤ : ├──┤ 3年9組2番は1452にマップされる。 1452│2439│← 「19,20,2を希望・優先権アリ」 ├──┤ という情報は2439で表せる。 : ├──┤ 1500│ │ └──┘
もちろんこれは大学で「情報量」なり「数値計算で疎な行列を 配列にマッピングするときのテクニック」なりを知ったから わかることなんですけどね。高校生の私には 「ひとつの変数に複数の情報を押し込む」ということだけでも画期的な 思いつきだったわけです。ただ、押し込み方がめちゃくちゃ下手だった(笑)。