2012年8月18日土曜日

Project Euler - Probrem 43

Project Euler(プロジェクト オイラー)の問題をpythonでやってみます。

出典: Project Euler(日本語 翻訳サイト)
    ProjectEuler.net(英語サイト)

Problem 43
数1406357289は0から9のPandigital数である (0から9が1度ずつ現れるので).
この数は部分語が面白い性質を持っている.
d1を1桁目, d2を2桁目の数とし, 以下順にdnを定義する.
この記法を用いると次のことが分かる.
  • d2d3d4=406は2で割り切れる
  • d3d4d5=063は3で割り切れる
  • d4d5d6=635は5で割り切れる
  • d5d6d7=357は7で割り切れる
  • d6d7d8=572は11で割り切れる
  • d7d8d9=728は13で割り切れる
  • d8d9d10=289は17で割り切れる
このような性質をもつ0から9のPandigital数の総和を求めよ.


-----

私の解答例は以下です。畳んでいます。
def g(n):
	import itertools
	t = "".join([str(i) for i in xrange(n)])
	return ["".join(s) for s in itertools.permutations(t, n)]

def f(n):
	L = []
	for j in g(n):
		if int(j[1:4])%2: continue
		elif int(j[2:5])%3: continue
		elif int(j[3:6])%5: continue
		elif int(j[4:7])%7: continue
		elif int(j[5:8])%11: continue
		elif int(j[6:9])%13: continue
		elif int(j[7:10])%17: continue
		else:L.append(j)
	return L

L = f(10)
print sum([int(s) for s in L])
print L


9桁以下のpandigital数を生成しこれを素数判定することにしました。
pandigital数の定義がproblem38problem41と異なり、0~9までの10種類の数字で構成されます。

2つの関数を使っています。

1.関数g(n)
・n桁の0からn-1までの数字で構成されるpandigital数のリストを返します。
・1文字目に0がくることもあるので、数値型にせず文字型でためます。
problem41は1からnまでのn桁のpandigital数リストなのでこれを改良しました。

2.関数f(n)
・問題の条件に合う値をリストLにためていきます。

3.関数の外
・L = f(10)
 リストLは10桁(0-9)のpandigital数のリストです。

・print sum([int(s) for s in L])
 print L
 リストLの値を1つずつint関数で数字型にしてリストにため、sum関数で合計を計算します。

解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。
16695334890
['1406357289', '1430952867', '1460357289', '4106357289', '4130952867', '4160357289']

0 件のコメント:

コメントを投稿