開発環境
- OS X El Capitan - Apple (OS)
- Emacs (Text Editor)
- Python 3.5 (プログラミング言語)
Think Python (Allen B. Downey (著)、 O'Reilly Media)のChapter 11.(Dictionaries)のExercises 11-1, 2, 3, 4, 5..(No. 2632)を取り組んでみる。
Exercises 11-1, 2, 3, 4, 5.(No. 2632)
コード(Emacs)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import random
import sys
import os
sys.path.append(os.path.join('..', 'ch8'))
def wordsToDict(filename):
with open(filename) as f:
d = {line.strip(): random.randrange(1, 10) for line in f}
return d
def invert_dict(d):
inverse = dict()
for key in d:
val = d[key]
inverse.setdefault(val, []).append(key)
return inverse
memo = {}
def ackermann(m, n):
val = memo.get((m, n))
if val:
return val
if m == 0:
memo[(m, n)] = n + 1
return memo[(m, n)]
if m > 0 and n == 0:
memo[(m, n)] = ackermann(m - 1, 1)
return memo[(m, n)]
if m > 0 and n > 0:
memo[(m, n)] = ackermann(m - 1, ackermann(m, n - 1))
return memo[(m, n)]
raise Exception((m, n))
def has_duplicates(seq):
d = {}
for x in seq:
if d.get(x):
return True
d[x] = True
return False
import rotate
def rotate_pairs(word, wordlist):
for i in range(13):
rotated = rotate.rotate_word(word, i + 1)
if rotated in wordlist:
return (word, rotated)
return None
if __name__ == '__main__':
print('11-1.')
filename = 'words.txt'
d = wordsToDict(filename)
print(len(d))
print('python' in d)
print('aaaaa' in d)
print('11-2.')
inverse = invert_dict(d)
print(inverse.get(1)[:10])
print('11-3.')
for m, n in [(m, n) for m in range(5) for n in range(5)]:
try:
print('ackermann({0}, {1}) = {2}'.format(m, n, ackermann(m, n)))
except Exception as err:
print('({0}, {1}): {2}'.format(m, n, err))
print('11-4.')
for _ in range(10):
seq = [random.randrange(10) for _ in range(5)]
print('has_duplicates({0}): {1}'.format(seq, has_duplicates(seq)))
print('11-5.')
wordlist = list(d.keys())
i = 0
for word in wordlist:
p = rotate_pairs(word, wordlist)
if p is None:
continue
print(p)
i += 1
if i == 5:
break
入出力結果(Terminal, IPython)
$ ./sample1.py
11-1.
113809
True
False
11-2.
['dirked', 'bibcock', 'putons', 'thoraces', 'stanzaic', 'towages', 'screener', 'neoprenes', 'parallax', 'rewaking']
11-3.
ackermann(0, 0) = 1
ackermann(0, 1) = 2
ackermann(0, 2) = 3
ackermann(0, 3) = 4
ackermann(0, 4) = 5
ackermann(1, 0) = 2
ackermann(1, 1) = 3
ackermann(1, 2) = 4
ackermann(1, 3) = 5
ackermann(1, 4) = 6
ackermann(2, 0) = 3
ackermann(2, 1) = 5
ackermann(2, 2) = 7
ackermann(2, 3) = 9
ackermann(2, 4) = 11
ackermann(3, 0) = 5
ackermann(3, 1) = 13
ackermann(3, 2) = 29
ackermann(3, 3) = 61
ackermann(3, 4) = 125
ackermann(4, 0) = 13
(4, 1): maximum recursion depth exceeded in comparison
(4, 2): maximum recursion depth exceeded in comparison
(4, 3): maximum recursion depth exceeded in comparison
(4, 4): maximum recursion depth exceeded in comparison
11-4.
has_duplicates([0, 6, 2, 6, 5]): True
has_duplicates([1, 7, 8, 7, 2]): True
has_duplicates([4, 0, 3, 8, 2]): False
has_duplicates([0, 9, 0, 9, 4]): True
has_duplicates([7, 5, 0, 1, 8]): False
has_duplicates([6, 9, 6, 8, 5]): True
has_duplicates([4, 2, 4, 1, 1]): True
has_duplicates([4, 6, 1, 8, 5]): False
has_duplicates([7, 0, 4, 8, 6]): False
has_duplicates([4, 3, 4, 7, 6]): True
11-5.
('bug', 'ham')
('no', 'op')
('muumuu', 'weewee')
('daw', 'lie')
('hae', 'lei')
$
0 コメント:
コメントを投稿