共通テスト試作問題『情報Ⅰ』のプログラミング言語（DNCL2）を作ってみた

[共通テスト「情報」サンプル問題のプログラミング言語を作ってみた](https://qiita.com/nodai2h_ITC/items/ac11eb49eaab5803b09e) の続編です。共通テスト（旧センター試験）に追加が決まった「情報」の問題で使われている擬似プログラミング言語を実際に実行できる環境を作成しました。言語処理系をイチから作るのではなく JavaScript に変換して実行させることで実装を簡単化しています。実際に動くものは ↓ からどうぞ。

- [DNCL2- 大学入試共通テスト「情報」問題言語](https://nodai2hitc.github.io/ictl/)
  - [FizzBuzz プログラムの例](https://nodai2hitc.github.io/ictl/#KDAxKWkg44KSIDEg44GL44KJIDEwMCDjgb7jgacgMSDjgZrjgaTlopfjgoTjgZfjgarjgYzjgok6CigwMinvvZwg44KC44GXIGkgJSAxNSA9PSAwIOOBquOCieOBsDoKKDAzKe_9nCDvvZwg6KGo56S644GZ44KLKCJGaXp6QnV6eiIpCigwNCnvvZwg44Gd44GG44Gn44Gq44GP44KC44GXIGkgJSAzID09IDAg44Gq44KJ44GwOgooMDUp772cIO_9nCDooajnpLrjgZnjgosoIkZpenoiKQooMDYp772cIOOBneOBhuOBp_OBquOBj_OCguOBlyBpICUgNSA9PSAwIOOBquOCieOBsDoKKDA3Ke_9nCDvvZwg6KGo56S644GZ44KLKCJCdXp6IikKKDA4Ke_9nCDjgZ3jgYbjgafjgarjgZHjgozjgbA6CigwOSnijr8g4o6-IOihqOekuuOBmeOCiyhpKQo.)
# はじめに

共通テスト「情報」[試作問題](http://www.ipsj.or.jp/education/9faeag0000012a50-att/sanko2.pdf)、[サンプル問題](https://www.dnc.ac.jp/albums/abm.php?d=33&f=abm00000307.pdf&n=%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E5%95%8F%E9%A1%8C%E3%80%8E%E6%83%85%E5%A0%B1%E3%80%8F_%E5%95%8F%E9%A1%8C.pdf) に続いて、本日 [試作問題『情報Ⅰ』](https://www.dnc.ac.jp/albums/abm.php?d=395&f=abm00003277.pdf&n=6-2-1_%E8%A9%A6%E4%BD%9C%E5%95%8F%E9%A1%8C%E3%80%8E%E6%83%85%E5%A0%B1%E2%85%A0%E3%80%8F%E2%80%BB%E4%BB%A4%E5%92%8C4%E5%B9%B412%E6%9C%8823%E6%97%A5%E4%B8%80%E9%83%A8%E4%BF%AE%E6%AD%A3.pdf)が公開されました。この試作問題でも、今までと同様の擬似言語が使われています。（どのような擬似言語なのかは[サンプルプログラム集](https://nodai2hitc.github.io/ictl_example/)のページや、[試作問題「情報」の概要](https://www.dnc.ac.jp/albums/abm.php?d=395&f=abm00003141.pdf&n=6-1_%E6%A6%82%E8%A6%81%E3%80%8C%E6%83%85%E5%A0%B1%E3%80%8D.pdf) 18ページ「共通テスト用プログラム表記の例示」を御覧ください。

# 試作問題に基づく変更点

「共通テスト用プログラム表記の例示」が公開されたおかげで、今まで不明だった仕様がいろいろ判りました。

## for 相当の繰り返し構文の微変更

`i を 1 から 100 まで 1 ずつ増やしながら繰り返す:` のような増加繰り返しだけでなく、`i を 4 から 0 まで 1 ずつ減らしながら繰り返す:` のような減少繰り返しもありえるとのことなので、対応しました。

## else if 相当の構文を修正

今まで `else if` 相当の構文が出てこなかったので `あるいは ～ ならば:` という構文を勝手に入れていたのですが、`そうでなくもし ～ ならば:` が正しいらしいので、修正しました。

## 【外部からの入力】に対応

`【外部からの入力】` という表記でキーボードからの入力値（等）を得るようなので、それを `parseFloat(prompt())` に変換するようにしました。[^1]

[^1]: JavaScript では整数も結局は浮動小数点数で表されているので、`parseInt` ではなく `parseFloat` にしてみました。

## ÷ に雑対応

除算の商を求める演算子として、`÷` を使うとのことです。Python であれば `÷` を `//` に変換するだけで済むのですが、あいにく JavaScript にはそうした演算子がありません。

仕方ないので、`〇 ÷ △` を `Math.floor(〇 / △)` に変換する、という雑な対応をしました。`(1 + 2) ÷ 3` が `(1 + Math.floot(2) / 3)` になってしまうという困った事態が起きるのですが、とりあえず今はこれで許してください…

## コメント対応

`#` がコメント記号らしいので、これを `//` に変換するようにしました。

ところで他の変換にも言えることですが、現状では文字列内にこうした記号や構文が出てきた際にも変換されてしまうという問題があります。これも許してください…

## 新関数「枚数」

問題文で `枚数` という関数が出てくるので、追加しました。

この `枚数` 関数は自分で定義しているようなのですが、肝心のその定義文が出てきていません。（そして「共通テスト用プログラム表記の例示」にも関数定義構文の記載はありません。）ですので現状、関数を自分で定義することはできません。[^2]

[^2]: とはいえ JavaScript に変換しているだけなので、`function 枚数(kingaku) { ～ }` と直接 JavaScript で書いてしまえば定義できます。

## その他

「共通テスト用プログラム表記の例示」では `+` 等の演算子は半角なのですが、実際に試作問題 PDF からプログラムをコピペしてくると `＋` 等が全角になっていたので、こうした全角計算記号を半角に変換するようにしました。

# それ以外の変更点

## 「配列のすべての要素に代入」を Proxy を使う形に変更

試作問題には `配列 Hindo のすべての要素に 0 を代入する` という要素数が不定の配列に初期値を設定する謎構文があり、「要素数を指定して初期化することもできるのだが、要素数を省略した場合はデフォルトの要素数（試作問題の都合上 26 ）で初期化する。」という雑対応をしていたのですが、[Proxy](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Proxy) を使えばスマートに対応できることに気づいたので、そうしました。

# [再掲] 高校関係者の方々へお願い

この実行環境は自由に使って構いません。たとえば共通テストに向けた演習に役立てることができるでしょう。

ですが、「最初からテストと同じ言語で授業もやったほうがいいに違いない！」と考えてこの言語を「情報Ⅰ」の授業でメインに扱う言語には**絶対にしないでほしい**と思っています。Ruby や Python、JavaScript といった一般的なプログラミング言語を使ってください。

あなたの生徒の中には、授業をきっかけにプログラミングに興味を持つ人もいるでしょう。一般的な言語であれば、そうした生徒は自ら調べてゲームだとか GUI アプリだとかを作ったりと、授業でやったことの先へと進み出すことでしょう。

ですが、この言語には「先」がほとんどありません。せっかく興味を持った生徒に、その先の楽しさを伝えることができないのです。

せっかく始まるプログラミングの授業、一人でも多くの高校生が、プログラミングの楽しさを感じてくれることを願っています。