開発環境
- macOS Mojave - Apple (OS)
- Emacs (Text Editor)
- Windows 10 Pro (OS)
- Visual Studio Code (Text Editor)
- Python 3.7 (プログラミング言語)
問題解決のPythonプログラミング ―数学パズルで鍛えるアルゴリズム的思考 (Srini Devadas (著)、黒川 利明 (翻訳)、オライリージャパン)の16章(貪欲は良いことだ)、練習問題(問題1)を取り組んでみる。
コード(Emacs)
Python 3
#!/usr/bin/env python3
def earliest_finish_time(courses: list) -> list:
'''
>>> earliest_finish_time([[8, 10], [9, 10]])
[9, 10]
>>> earliest_finish_time([[9, 10], [8, 10]])
[9, 10]
'''
start, finish = courses[0]
for start_tmp, finish_tmp in courses:
if finish_tmp < finish or \
finish_tmp == finish and (finish_tmp - start_tmp) < finish - start:
start = start_tmp
finish = finish_tmp
return [start, finish]
def remove_conflicting_courses(course: list, courses: list) -> list:
start, finish = course
return [[start_other, finish_other]
for start_other, finish_other in courses
if finish <= start_other or finish_other <= start]
def execute_schedule(courses: list, selection_rule: 'func') -> list:
'''
>>> courses = [[8, 10], [9, 10], [10, 12], [11, 12], [12, 14], [13, 14]]
>>> execute_schedule(courses, earliest_finish_time)
[[9, 10], [11, 12], [13, 14]]
'''
selected_courses = []
while len(courses) > 0:
selected_course = selection_rule(courses)
selected_courses.append(selected_course)
courses = remove_conflicting_courses(selected_course, courses)
return selected_courses
if __name__ == '__main__':
import doctest
doctest.testmod()
入出力結果(Terminal, cmd(コマンドプロンプト), Jupyter(IPython))
$ ./sample1.py -v
Trying:
earliest_finish_time([[8, 10], [9, 10]])
Expecting:
[9, 10]
ok
Trying:
earliest_finish_time([[9, 10], [8, 10]])
Expecting:
[9, 10]
ok
Trying:
courses = [[8, 10], [9, 10], [10, 12], [11, 12], [12, 14], [13, 14]]
Expecting nothing
ok
Trying:
execute_schedule(courses, earliest_finish_time)
Expecting:
[[9, 10], [11, 12], [13, 14]]
ok
2 items had no tests:
__main__
__main__.remove_conflicting_courses
2 items passed all tests:
2 tests in __main__.earliest_finish_time
2 tests in __main__.execute_schedule
4 tests in 4 items.
4 passed and 0 failed.
Test passed.
$
0 コメント:
コメントを投稿