GOTO M.

趣味のコーディングとか、勉強とか、読書とか

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()