これがベトナム大学院の実態だ!

Trường Đại Học Bách Khoa Thành Phố Hồ Chí Minhの大学院修士課程に社会人入学

Nguyên lý ngôn ngữ lập trình 10回目 中間試験

2019年11月4日、Nguyên lý ngôn ngữ lập trìnhの10回目授業が実施された。
この日は普段の授業は一切せず、中間試験のみで終わった。
2時間半の授業時間に対してたった90分の中間試験だけだったのでPCを持って言った意味はなかった。
時間軸としては、18:00時開始に対して、点呼を取り始めたのが18:20頃。
そこから全員が一旦退出させられ、出席簿の番号順に座らせられる。
そして解答用紙と問題用紙を配り始めたのが18:25頃。
試験開始の合図は一切ないので、問題用紙を受け取った順に試験が開始できる。
これによって事実上の持ち時間に格差が生じる。
自分は1番最初に問題用紙を受け取ったのでラッキーであった。
2年前同様、問題用紙の持ち帰りが禁止されている。
この対策として、アマゾンで眼鏡型カメラとペン型カメラを買ったものの、どちらもうまく撮影できず結局返品した。
いずれにしても、2年前はともかく、昨年度の問題とも全然違う内容だったので過去問を知っていても有利にはならない。
結局、配布されたメモ用紙に問題の概要だけ写してきた。
なお、全体で10点満点である。

Part I 6点(大問3つ)
1. ANTLRで、 ....aa....aa...を表現。
aaが2回出ること。3回以上出てはいけない。
大問ごとの配点は書かれたいなかったが、簡単なので1点だろう。

2. BNFを使い、Javaの配列を表現する。
推定配点は1点か2点。

3. ASTGenerationの記載。
記述量が多いので推定配点は3点か4点。
おそらくこういうものを書くはずだ。

class ASTGeneration(MCVisitor):
	def visitAAA(self, ctx:MCParser.AAAContext):
		...
	def visitBBB(self, ctx:MCParser.BBBContext):
		...

この書き方を暗記するのは無理なので、
大問2が2点で大問3が3点の配点だといいのだが。

Part II 4点
4. Pythonのクラスについて
(a) クラス参照順を記載
推定配点1点

(b) E(2, 3).foo(2)の実行結果を書け。
ただし、説明も書くこと。
説明がない場合は0点。
推定配点1点

5. PythonあるいはScalaについて(受験者の得意な方を選べる?)
(a) 整数型の引数を1桁ずつリスト化する関数makelistを書け。
引数は2桁以上の場合0以外で始まるものとする。
ただし、1桁の0の場合は戻り値は[0]である。
例 makelist(142) → [1, 4, 2]
makelist(0) → [0]

予想解答

def makelist(before: int):
	if before < 10:
		return [before]
	return makelist(before // 10) + [before % 10]

試験時間中は再帰打ち切り条件を引数が0としたが、1桁の時は一律引数がそのまま配列になると築いたのは自宅に帰ってからであった。
おそらく推定配点1点といったところだろうか。

(b) getSubSum関数を書け。
例 getSubSum(142) → [1, 5, 7]
まず、上記のmakelistを用いてよいので引数の整数値をリスト化する。
その後、リストの1個目はそのまま1、2個目は1+4=5、3個目は1+4+2=7と以前の数値を足したリストを戻り値とする。
ただし、高階関数 (Higher-order function)を使うこと。

これはできなかった。
仮に高階関数を使わないのなら簡単だ。

def getSubSum(before: int):
	temp = makelist(before)
	goukei = 0
	result = []
	for loop in temp:
		goukei += loop
		result += [goukei]
	return result

しかし、普通に書けばこんなに簡潔に書けるものを、誰も得しない高階関数など使わせるのだろうか。
こちらも推定配点1点だろう。

以上が今回の中間試験であった。
2年前よりは手ごたえはあったが、できれば6点か7点を取得し、今後の宿題や期末試験の助けとしたい。