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