前回の採点で次の問題点が浮上しました。
- 部分点を付けられない
- [実行結果が同じ = 正解] ではない
この2つを考慮しても自動採点できそうな演習問題を考えます。
演習問題の選択
演習問題の形式は以下の3つです。
- 白紙の状態からプログラミングする全記述型
- プログラムからエラー構文を探す誤り訂正型
- プログラムの空欄に適切な値を入れる空欄補充問題型
上記の3つから採点での問題を克服できそうな形式を選択します。
全記述型は、模範プログラムと相違点が多すぎて部分点を付ける作業が大変になるのでNGです。
誤り訂正型は良さそうですが分かりにくいバグを考えて置き換える必要があるので手間が掛かります。
一方で、空欄補充問題型は空欄にするだけなので、模範プログラムとの相違点も空欄箇所のみとなり、置換作業も空欄を生成するだけなので手間は掛かりません。
故に、自動採点と相性が良さそうな空欄補充問題型を採用します。
[実行結果が同じ = 正解] ではない問題に対応できるのかという話は次章で説明します。
空欄補充問題の作成
空欄補充問題生成プログラムで空欄補充問題を作成しました。

パワーポイントから流用したものですが左のコードが空欄補充問題です。
(右の説明文はとりあえず無視しても大丈夫です)
コードを見ると、
/* □ □ □ */ /* 〇〇〇 */
などの空欄が何箇所かあることが分かると思います。
この状態でなら各空欄に部分点を付けることで部分点が付けられない問題を除去することができます。
同じ行に複数の空欄がある箇所が存在しますが、「同じ行の空欄は全て同じ答えが入る」という仕組みにしています。
このようにして別解(正解となる答えが複数ある状態)を極力発生させないように調整しています。
上記仕様の空欄補充問題にすることで「空欄に入る解答が1通りしかない」状況になる場合が大半になるので「実行結果が同じ = 正解」となる場合がかなり高くなります。
空欄以外の箇所が変更されると困るため、その場合は該当ファイルを制約エラーのファイル一覧に登録して不正扱いとします。
ただ、これだけだと同じ変数名が全て空欄になったりコメント文とかが空欄にされたりするので、そこら辺の細かい調整をします。
調整1:構文解析
適当に空欄を生成されても困るので絶対に空欄にしたくない構文を設定します。
この設定をすることで空欄になる箇所が全体的に的を射たものとなります。

調整2:空欄対象
空欄にする対象を決めます。
研究では以下の3種類を空欄の対象にしています。
・変数
・数式記号(+, <, &, ||, ->, など、プログラム的意味があるもの)
・関数名
変数に関してはこのサイトが参考になるかと思います。
数式記号に関しては本レポート[付録:数式記号一覧]にて掲載している記号を対象にしています。
調整3:適度なランダム性
空欄にできる箇所を全て空欄にするわけではないため、いくつかをランダムで空欄にします。
(こうしないと穴ぼこコードになります)
空欄対象の決定にはTF-IDFを使用しており、重要である変数・数式記号・関数名を決定してその中からランダムで空欄にするイメージです。

このようにすると、実行する度に異なる変数・数式記号・関数名が空欄になるので、一つのプログラムから複数の演習問題を生成可能です。
まとめ
上記の調整を行い生成した空欄補充問題がパワポ画像にある例です。

ここまでやれば自動採点を実現できそうです。
次回は自動採点を実装します。