小町算 (5)

組み合わせを作るところをflatten_for関数を使って書いてみた。

# 今までの方法
a = [['1']]
for n in map(str, range(2, 10)):
    b = []
    for s in a:
        for o in ['+', '-', '*', '/', '']:
            b.append(s + [o, n])
    a = b

# flatten_forを使った方法
ops = ['+', '-', '*', '/', '']
L = ['1', ops, '2', ops, '3', ops, '4', ops, '5', ops, '6', ops, '7', ops, '8', ops, '9']
a2 = flatten_for(*L)

assert(list(a) == list(a2))

やっぱりflatten_forという名前より組み合わせを意味するような名前の方が分かりやすかったかもしれない。combinationとか。


今までの実装は直感的には理解しにくいが、頭の中にループのイメージが付いていればすぐ分かるかもしれない。但し、flatten_forの方は一度イメージをつかめばすぐ実装が思いつくと思う。実行時間はパースも含めると約2倍の24秒かかったが、ジェネレータに対応しているのでその部分がネックになっていると思われる。