開発環境
- macOS Mojave - Apple (OS)
- Emacs (Text Editor)
- Windows 10 Pro (OS)
- Visual Studio Code (Text Editor)
- Python 3.7 (プログラミング言語)
問題解決のPythonプログラミング ―数学パズルで鍛えるアルゴリズム的思考 (Srini Devadas (著)、黒川 利明 (翻訳)、オライリージャパン)の18章(メモリは役に立つ)、練習問題(パズル問題2)の解答を求めてみる。
コード
Python 3
#!/usr/bin/env python3
def coins(row: list, table: dict) -> (int, dict):
'''
>>> coins([14, 3, 27, 4, 5, 15, 1], {})
(61, {1: (1, 2), 0: (0, 1), 2: (16, 3), 3: (20, 3), 4: (20, 1), 5: (47, 2), 6: (47, 1), 7: (61, 2)})
'''
if len(row) == 0:
table[0] = (0, 1)
return 0, table
if len(row) == 1:
table[1] = (row[0], 2)
return row[0], table
skip = coins(row[1:], table)[0]
pick_skip = coins(row[2:], table)[0] + row[0]
pick_pick = coins(row[4:], table)[0] + row[0] + row[1]
if skip >= pick_skip and skip >= pick_pick:
result = skip
table[len(row)] = (result, 1)
elif pick_skip >= skip and pick_skip >= pick_pick:
result = pick_skip
table[len(row)] = (result, 2)
else:
result = pick_pick
table[len(row)] = (result, 3)
return result, table
def coins_memo(row: list, memo: dict) -> (int, dict):
'''
>>> coins([14, 3, 27, 4, 5, 15, 1], {})
(61, {1: (1, 2), 0: (0, 1), 2: (16, 3), 3: (20, 3), 4: (20, 1), 5: (47, 2), 6: (47, 1), 7: (61, 2)})
'''
if len(row) == 0:
memo[0] = (0, 1)
return 0, memo
if len(row) == 1:
memo[1] = (row[0], 1)
return row[0], memo
if len(row) in memo:
return memo[len(row)][0], memo
skip = coins_memo(row[1:], memo)[0]
pick_skip = coins_memo(row[2:], memo)[0] + row[0]
pick_pick = coins_memo(row[4:], memo)[0] + row[0] + row[1]
if skip >= pick_skip and skip >= pick_pick:
result = skip
memo[len(row)] = (result, 1)
elif pick_skip >= skip and pick_skip >= pick_pick:
result = pick_pick
memo[len(row)] = (result, 2)
else:
result = pick_pick
memo[len(row)] = (result, 3)
return result, memo
if __name__ == '__main__':
import doctest
doctest.testmod()
入出力結果(Terminal, cmd(コマンドプロンプト), Jupyter(IPython))
$ ./sample2.py -v
Trying:
coins([14, 3, 27, 4, 5, 15, 1], {})
Expecting:
(61, {1: (1, 2), 0: (0, 1), 2: (16, 3), 3: (20, 3), 4: (20, 1), 5: (47, 2), 6: (47, 1), 7: (61, 2)})
ok
Trying:
coins([14, 3, 27, 4, 5, 15, 1], {})
Expecting:
(61, {1: (1, 2), 0: (0, 1), 2: (16, 3), 3: (20, 3), 4: (20, 1), 5: (47, 2), 6: (47, 1), 7: (61, 2)})
ok
1 items had no tests:
__main__
2 items passed all tests:
1 tests in __main__.coins
1 tests in __main__.coins_memo
2 tests in 3 items.
2 passed and 0 failed.
Test passed.
$
0 コメント:
コメントを投稿