Solving "Canterbury Puzzles" by Python (1)
カンタベリー・パズル
http://djm.cc/library/The_Canterbury_Puzzles_Dudeney_edited.pdf
のいくつかの問題を、Pythonで力技でといてみる。
64. 暴走車
1から始まる5桁の数で、
・最初の2桁 * 次の3桁 を並べ替えると 元の5桁 になる
ような数を求める問題。
#! -*- endocing=utr-8 -*- # # 64. The Runaway Motor-Car. # def main(): for i in range(11,19): for j in range(111,999): if j % 100 < 10 or j % 10 == 0: continue if sorted(list(str(i)) + list(str(j))) \ == sorted(list(str(i * j))): print (1000 * i + j) if __name__ == '__main__': main()
101. 3台の自動車
要するに、78*345=26910 のように
・0〜9を全て含む数の組み合わせで(2桁、3桁、5桁)
・最初の2桁 * 次の3桁 = 最後の5桁 となっている
もののうち
・最初の2桁が、次の3桁の約数になっているもの
を求める問題。
#! -*- endocing=utr-8 -*- # # 101. The Three Motor-Cars. # def main(): rslt = permutate(range(0,10)) for t in rslt: if ltoi(t,0,2) * ltoi(t,2,3) == ltoi(t,5,5) \ and ltoi(t,2,3) % ltoi(t,0,2) == 0: print t ## Enumerate the all permutation of given list. def permutate(l): if len(l) == 1: return [l] else: result = [] for idx in range(0, len(l)): l_dup = list(l) h = l_dup.pop(idx) for xs in permutate(l_dup): result.append([h] + xs) return result ## Convert the sub-list of given list into integer. def ltoi(list, start, len): result = 0 for i in range(0,len): result += list[start + i] * (10**(len-i-1)) return result if __name__ == '__main__': main()