空欄補充問題生成プログラムで空欄補充問題を作成しました。
パワーポイントから流用したものですが
左のコードが空欄補充問題です。(右の説明文はとりあえず無視しても大丈夫です)
コードを見ると、
/* □ □ □ */などの空欄が何箇所かあることが分かると思います。
この状態でなら各空欄に部分点を付けることで
部分点が付けられない問題を除去することができます。
同じ行に複数の空欄がある箇所が存在しますが、「
同じ行の空欄は全て同じ答えが入る」という仕組みにしています。
このようにして
別解(正解となる答えが複数ある状態)を極力発生させないように調整しています。
上記仕様の空欄補充問題にすることで「
空欄に入る解答が1通りしかない」状況になる場合が大半になるので「
実行結果が同じ = 正解」となる場合がかなり高くなります。
空欄以外の箇所が変更されると困るため、その場合は
該当ファイルを制約エラーのファイル一覧に登録して不正扱いとします。
これだけだと同じ変数名が全て空欄になったりコメント文とかが空欄にされたりするのでそこら辺も調整します。
調整1
適当に空欄を生成されても困るので
絶対に空欄にしたくない構文を設定します。
この設定をすることで空欄になる箇所が全体的に的を射たものとなります。
調整2
空欄にする対象を決めます。研究では以下の3種類を空欄の対象にしています。
・変数
・数式記号(+, <, &, ||, ->, など、プログラム的意味があるもの)
・関数名
変数に関しては
このサイトが参考になるかと思います。
数式記号に関しては本レポート[付録:数式記号一覧]にて掲載している記号を対象にしています。
調整3
空欄にできる箇所を全て空欄にするわけではないため、
いくつかをランダムで空欄にします。(こうしないと穴ぼこコードになります)
空欄にする対象の決定にはTF-IDFを使用しており、
重要である変数・数式記号・関数名を決定してその中からランダムで空欄にする感じです。
このようにすると実行する度に異なる変数・数式記号・関数名が空欄になるので
一つのプログラムから複数の演習問題を生成できます。
調整4
TF-IDFで重要だと判断した変数・数式記号・関数名を空欄にするのですが、同じ変数名・数式記号・関数名が複数ある場合は
そのうちの1箇所をランダムで選んで空欄にするようにします。
このようにすれば実行する度に異なる箇所が空欄になりやすくなります。
上記の調整を行い生成した空欄補充問題が先ほどの
パワポ画像にある空欄補充問題です。
ここまでやれば自動採点を実現できそうです。次回は自動採点を実装します。