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

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

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))