開発環境
- macOS Mojave - Apple (OS)
- Emacs (Text Editor)
- Windows 10 Pro (OS)
- Visual Studio Code (Text Editor)
- Python 3.7 (プログラミング言語)
問題解決のPythonプログラミング ―数学パズルで鍛えるアルゴリズム的思考 (Srini Devadas (著)、黒川 利明 (翻訳)、オライリージャパン)の17章(アナグラム狂)、練習問題(問題1)を取り組んでみる。
コード(Emacs)
Python 3
#!/usr/bin/env python3 from sympy import primerange primes = list(primerange(1, 102)) def char_to_prime(ch: chr) -> int: return primes[ord(ch) - 97] def prime_hash(s: str) -> int: if len(s) == 0: return 1 return char_to_prime(s[0]) + prime_hash(s[1:]) def pivot_partition_clever(lst: list, start: int, end: int) -> int: pivot = lst[end] bottom = start - 1 top = end done = False while not done: while not done: bottom += 1 if bottom == top: done = True break if prime_hash(lst[bottom]) > prime_hash(pivot): lst[top] = lst[bottom] break while not done: top -= 1 if top == bottom: done = True break if prime_hash(lst[top]) <= prime_hash(pivot): lst[bottom] = lst[top] break lst[top] = pivot return top def quick_sort(lst: list, start: int, end: int) -> None: ''' >>> corpus = ['ate', 'but', 'eat', 'tub', 'tea'] >>> quick_sort(corpus, 0, len(corpus) - 1) >>> corpus ['ate', 'eat', 'tea', 'tub', 'but'] ''' if start < end: pivot_index = pivot_partition_clever(lst, start, end) quick_sort(lst, start, pivot_index - 1) quick_sort(lst, pivot_index + 1, end) def prime_sort(lst: list) -> None: ''' >>> corpus = ['ate', 'but', 'eat', 'tub', 'tea'] >>> prime_sort(corpus) >>> corpus ['ate', 'eat', 'tea', 'tub', 'but'] ''' quick_sort(lst, 0, len(lst) - 1) def print_words(words: list) -> None: print('-' * 50) for word in words: print(word) if __name__ == '__main__': import doctest doctest.testmod() print(primes) corpus = ['ate', 'but', 'eat', 'tub', 'abed', 'mace', 'acre', 'abut', 'mean', 'bade', 'abet', 'care', 'tabu', 'bead', 'beat', 'race', 'acme', 'beta', 'came'] print_words(corpus) prime_sort(corpus) print_words(corpus)
入出力結果(Terminal, cmd(コマンドプロンプト), Jupyter(IPython))
$ ./sample1.py -v Trying: corpus = ['ate', 'but', 'eat', 'tub', 'tea'] Expecting nothing ok Trying: prime_sort(corpus) Expecting nothing ok Trying: corpus Expecting: ['ate', 'eat', 'tea', 'tub', 'but'] ok Trying: corpus = ['ate', 'but', 'eat', 'tub', 'tea'] Expecting nothing ok Trying: quick_sort(corpus, 0, len(corpus) - 1) Expecting nothing ok Trying: corpus Expecting: ['ate', 'eat', 'tea', 'tub', 'but'] ok 5 items had no tests: __main__ __main__.char_to_prime __main__.pivot_partition_clever __main__.prime_hash __main__.print_words 2 items passed all tests: 3 tests in __main__.prime_sort 3 tests in __main__.quick_sort 6 tests in 7 items. 6 passed and 0 failed. Test passed. [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101] -------------------------------------------------- ate but eat tub abed mace acre abut mean bade abet care tabu bead beat race acme beta came -------------------------------------------------- bade bead abed mace acme came acre race care eat ate abet beat beta mean tub but tabu abut $
0 コメント:
コメントを投稿