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

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

Mạng máy tính 10回目

2019年11月8日、Mạng máy tínhの授業10回目が実施されるも同日は自主休講した。
今期はまだどの科目も1日も休んでいなかったが、ここにきて蓄積された疲労が限界に達したのか水曜日には体調不良となり、木曜日には多少回復したものの、大事をとって同日の授業も出席を見合わせた。
これを書いている本日現在は4時間後にCấu trúc dữ liệu và giải thuậtの授業を控えているが、どうせ問題演習もないだろうし今日も休むかどうかを思案している。

Nguyên lý ngôn ngữ lập trình 中間試験の最終問題

Phân tích thiết kế giải thuậtの休憩時間のこと。
一人の学生とNguyên lý ngôn ngữ lập trình 中間試験について話をしていた。
すると、先日のPhân tích thiết kế giải thuật中間試験でなんと10点満点を取得した学生も話に加わってきたので、自分は本ブログの画面を見せながら、高階関数 (Higher-order function)を使ったgetSubSum関数が全く分からなかったことを話した。
するとその学生は、reduceとifの組み合わせで解けるという。mapは使わないとのことであった。

その後、実際にPCを用いてやってみたが、reduceだけではできないように思われた。
しかし、各部分和の整数値を得ることはできた。

print(reduce(lambda x, y: x + y, temp[0:1]))
print(reduce(lambda x, y: x + y, temp[0:2]))
print(reduce(lambda x, y: x + y, temp[0:3]))

これにより、1, 5, 7がそれぞれ取得される。
実際には3桁とは限らないので、この1, 2, 3の部分を変数にすることが必要だ。
この部分の個数はリストの要素数と同じなので、取得するにはmapだろうか。

print(list(map(lambda a: temp.index(a) + 1, temp)))

この2つを組み合わせてできないだろうか。
順番としては外側がリストを返すmap、内側が整数値(小数でもいいがこの場合は明らかに整数)を返すreduceのはずだ。
数分間いろいろなコードを組み合わせ、エラー発生を繰り返しつつ得られたのがこれだ。

return list(map(lambda a: reduce(lambda x, y: x + y, temp[0:temp.index(a) + 1]), temp))

[1, 5, 7]が取得された。

最終的なコードはこちら。

'''
python Midterm2019.py
'''
# include
from functools import reduce
from operator import add
from itertools import product
# class
# function
#Q5
#(a)
def makelist(before: int):
	if before < 10:
		return [before]
	return makelist(before // 10) + [before % 10]
#(b)
def getSubSum(before: int):
	temp = makelist(before)
	return list(map(lambda a: reduce(lambda x, y: x + y, temp[0:temp.index(a) + 1]), temp))
#main
print(makelist(142))
print(makelist(0))
print(getSubSum(142))
print(getSubSum(0))

Phân tích thiết kế giải thuật 11回目

2019年11月5日、Phân tích thiết kế giải thuậtの11回目授業が実施された。
休憩中に他の学生と話し、自然と話題は昨日のNguyên lý ngôn ngữ lập trình中間試験となった。
これについては有意義な結果が得られたので別エントリとする。

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点を取得し、今後の宿題や期末試験の助けとしたい。

Nguyên lý ngôn ngữ lập trình中間試験対策

同科目の10回目で中間試験が実施される。
2017年度の過去問はメモってあるし、2018年度の過去問は誰かがインターネット上で公開していた。
それを総合するとこうなる。
f:id:k4h8:20191104112747j:plain
最初の正規表現の問題は出たも同然、さらにexp@や、Add(Minus(Lit(...に至っては一言一句同じである。
新傾向はpythonのクラス参照順と同じくpythonの実行方式だが難しくはない。
逆にテーマとしては毎回出ている高階関数(この「こうかい」は一発で変換できず、1文字ずつ変換しなくてはならない)だが、範囲が広い上にそもそもPCを使わずに手書きは至難の業だ。

Cấu trúc dữ liệu và giải thuật 8回目

2019年11月2日、Cấu trúc dữ liệu và giải thuậtの8回目授業が実施された。
一応出席は取ったものの問題演習はなし。
AVL木とやらの内容に入ったが、疑似コードのみで、実際のc++のコードを見ないと誰も理解できないようであった。

HỌC PHÍ HK 1/2019-2020

今期の授業料が明らかになった。
f:id:k4h8:20191028101757p:plain
054017 Cấu trúc dữ liệu và giải thuật 3,150,000(4単位だが実質3単位分の回数)
054013 Phân tích thiết kế giải thuật 3,150,000(3単位)
054011 Mạng máy tính 3,150,000(4単位だが実質3単位分の回数)
054012 Nguyên lý ngôn ngữ lập trình 4,200,000(4単位)
合計 13,650,000(15単位だが実質13単位分の回数)
日本円換算で63,800円。
全60単位分の4分の1に相当する15単位なので、日本円で30万円ほどで修士の学位が取れてしまう計算だ。
ただ、実際には悪名高いNguyên lý ngôn ngữ lập trìnhを始め、絶対に単位の取れない外れ科目というものが存在するため、間違って科目登録してしまうと無駄な課金になる。
Nguyên lý ngôn ngữ lập trìnhは必修なので念能力の習得が不可欠となる。

虚妄の学園―仙台育英学園高校・その歪んだ実態(室井 助)

ベトナム大学院の話題とは離れるが、日本の教育ということで。
室井助先生の快著、「虚妄の学園―仙台育英学園高校・その歪んだ実態」のミラーサイトはここだ。
tagajo.s601.xrea.com
県外の人には仙台キック英という方が分かりやすいだろう。

Nguyên lý ngôn ngữ lập trình assignment2

2回目となるassignmentは、前回の宿題であるassignment1ができたことを前提とし、ASTを作るというもの。
2年前はそのassignment1ができなかったため以後2,3,4全部ができなかった。
今回は少なくともassignment1はできたので、assignment2もできることを期待したい。
一応出だしはこれでエラーはなかった。

from MCVisitor import MCVisitor
from MCParser import MCParser
from AST import *

class ASTGeneration(MCVisitor):
	def visitProgram(self,ctx:MCParser.ProgramContext):
		return Program(self.visit(ctx.decls()))
	def visitDecls(self,ctx:MCParser.DeclsContext):
		result = [self.visit(ctx.decl())]
		if ctx.getChildCount() == 2:
			result += self.visit(ctx.decls())
		return result
	def visitDecl(self,ctx:MCParser.DeclContext):
		# cau2を参考に
		if (ctx.vardecl()):
			return "Global Hensuu"
		# assignment2の原文を参考に
		elif (ctx.funcdecl()):
			return "Kansuu"
		else:
			return 999

Phân tích thiết kế giải thuật 9回目

2019年10月22日、Phân tích thiết kế giải thuậtの9回目授業が実施された。
中間試験も終わり、授業のはじめの問題演習の時間もないことから、1時間ほど遅刻しての入室。
それでも自分より早く入室していた学生は5名ほどしかいない。
この分だと時間通りに来ていた学生は一人か二人だろう。
なぜか4章のまだやっていたなかったところをやってから5章に入ったところで時間終了。
結局問題を解く時間もなかったので、今日休んだ人はラッキー。

Nguyên lý ngôn ngữ lập trình 8回目

2019年10月21日、Nguyên lý ngôn ngữ lập trìnhの8回目授業が実施された。
一応教員は18:00頃に入室したが、一向に小テストのパスワードを書かない。
結局小テストのパスワード板書は18:20頃になってからだった。
この日遅刻した人はラッキー。
FPのPythonの方の小テスト2回目かと思ったらASTのscalaPython両方の小テストがそれぞれ実施された。
また、実習はPDFがなく、口頭での指示であり、ASTのPython小テストのコードを実装するというもの。
問題自体か難しいというより、もともとの誤植があったのでそれで難しいというどうしようもないものであった。