わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

「*」の並びのオンラインジャッジ

 いきなりですが問題です.

scanf関数を呼び出して,1つの整数を受け取り変数nに格納したあと,1行目に1個の「*」,1行増えるごとに「*」の数を1ずつ増やして,n行目にn個の「*」,その後は1ずつ減らして,二等辺三角形のような並びを出力するプログラムを作成してください.
0または負の値がnに格納された場合には,「invalid」を出力して改行し,プログラムを終了してください.1の場合には,「*」と改行だけを出力しなさい.

 2023年になりました.今年もよろしくお願いします.
 上記は,12月から始まったプログラミング演習科目の小問の一つです.「scanf関数を呼び出」すため,言語はCです.入力が「4」のとき,出力は次のようになります.「▶」に似た形状です.

*
**
***
****
***
**
*

 昨年度の授業だと,受講者はめいめいプログラムを書いて動作確認し,完成したソースファイルをMoodleに提出してもらい,こちらは期限後に回収して採点していたのですが,今年度は2つの理由で,課題提示と提出の方法を変更しました.理由の一つは,提出後に解説を作って公開することよりも,完成するまでの活動の支援に力を入れたいと考えたため,もう一つは,研究室の大学院生が開発している,オンラインジャッジのWebアプリケーションに,いくつか改革がなされたからです.
 「オンラインジャッジシステムのWebアプリケーション」については,昨年5月に情報知識学会で発表をしてもらいました.

 その際には,ジャッジの方法は固定文字列との照合でした*1.今年度の,第3クォーター科目の授業では,最後の2回に,このWebアプリケーションの改良版を使用してもらいました.ラス前は固定文字列の出力ですが,最終回,成績評価の対象にも入れた課題では,正整数nを入力にとり,この値に依存した計算・出力を行う課題としました.これらについては,データベースに登録された正解・不正解のソースコードを集計・分析済みでして,3月の情報処理学会全国大会にて発表する予定で,原稿執筆を進めています.
 さらにコードを改修して,冒頭の問題は,ブラウザで以下のとおり,表示させるようにしました.

 問題番号と問題文の下には,入力例と出力例のテキスト領域を左に,paiza.IOの編集画面*2を右に,それぞれ配置しています.さらにその下には,学生番号を入力するテキストフォームと,ソースコードを貼り付けるためのテキストエリア*3,そして提出ボタンがあります---ここまでは第3クォーターで提供したシステムにも当てはまります.
 3月の学会発表の範囲外となる,改修した箇所は,次のところです.

  • paiza.IOの編集領域に,高さを「増やす」「減らす」「戻す」のボタンを設置し,変更できるようにしました.*4
  • 学生番号は毎回打ち込む必要をなくしました.具体的には,LbTypingと同じように,トップページで学生番号を入力してもらい,Cookieでページが変わっても値を保持させて,課題ページで表示させるようにしました.
  • ページ上部に「ヒント」を設けました.この行をクリックするとヒントが表示され,もう1回クリックすると見えなくなります.*5

 冒頭の問題で表示される「ヒント」は次のとおりです.

  • n行目までの出力で一つの2重ループ、そのあとにまた別の2重ループを書くといいでしょう。第2問・第3問で作成したプログラムの2重ループが活用できます。ただし、あとの2重ループの出力の行数がn行ではなくn-1行になる点だけは注意してください。
  • きちんと「*」の描画*6ができているはずなのに、何度提出しても「Wrong Answer」となる人へ:「invalid」を出力する処理を忘れていませんか。

 「Wrong Answer」は,提出直後に,JavaScriptのalert関数で表示させているメッセージの一つです.第3クォーターの授業期間中,オンラインジャッジシステムの開発画面案を見たときに,メッセージの種類と意味を一覧できるようにしましょうとアドバイスし,以下の情報を追加しました.

  • 提出後に表示されるメッセージの意味は次の通りです。
    • Accepted:正しく動作しました。
    • Wrong Answer:正しい出力ではありませんでした。
    • Compile Error:コンパイルエラーが発生しました。
    • Runtime Error:実行時エラーが発生しました。
    • Time Limit Exceeded:無限ループが発生しています。
    • Dangerous Program:反則技を使用しないでください。*7
  • Acceptedだけが「正解」、それ以外はすべて「不正解」です。Acceptedを目指して、プログラムを完成させてください。

 ヒントに「第2問・第3問」と書きましたが冒頭の問題は「第4問」です*8.第4クォーターの科目の初回は第1問のみ,それ以降は2問ずつ提供しています.冬休み明けの授業では第6問・第7問を用意しています.第11問までは,頭の中にありますが,ヒントを含む難易度調整とデータベース登録はまだ先です.
 上のヒントを見て,「2重ループは2つなくてもできるよね?」と思った方も,いるかと思います.それについては,第5問のヒントで言及しています.実のところ第1問からいずれも,ヒントどおりにコードを書かなくても,「Accepted」を得ることはできます.ヒントに従い「Accepted」を得ることと,ヒントに従わずに「Accepted」を得ることは,プログラミング技能を伸ばす良い方法になると考えながら,各回の問題文とヒントの文案作成に,うんうんうなっています.
 開発しているシステムと出題内容は,GitHubのプライベートリポジトリで管理しています.授業期間が終わったら,パブリックにしたいと考えています.

*1:ただし,出力の最終行の改行コードの有無は正誤に影響しないようにしていました.

*2:初期状態は,https://paiza.io/jaの「コード生成を試してみる(無料)」ボタンを押して言語をCに変えたときの内容と,異なっています.この問題用に初期状態を用意しておいて,paiza.IO内の「共有」の機能で,埋め込みのためのURLを取得し使用しています.ユーザからすると,問題ページの再読込により,編集画面は「ご破算」になります.

*3:提出ボタンを押すイベントが出たら,paiza.IOのコードの内容を読み取ってサーバに送る,というのをJavaScriptで処理させるのは,クロスオリジン制約によりできません.またpaiza.IOの埋め込みを使用せずにプログラムを完成させて提出することも,認めています.

*4:入力例・出力例のところの高さは変わりません.またpaiza.IOの編集画面の下部の入出力欄については,その領域と,「実行 (Ctrl-Enter)」のボタンの間の横線をドラッグすることで,高さの増減ができます.

*5:HTMLのdetails要素とsummary要素を使用しています.ただしこの機能は,第3クォーターの科目のオンラインジャッジでも,「注意書き」として採用していました.改修の際に,問題ごとに「ヒント」を用意してデータベースに登録し,読み出すようにしました.

*6:原文ママ.「並び」と書くべきでした.

*7:受講者からの提出で,このメッセージが出た(データベースに登録されている)という事例は,まだありません.

*8:ヒントの2番目の項目について,補足しておくと,第2問・第3問では,0または負の値がnに格納された場合には,何も出力しないよう指示していました.そのため,for (i = 1; i <= n; i++)とループを書いてこの内部で出力することで(0または負の値がnに格納されたときの条件分岐は書かなくても),「Accepted」が得られたのでした.