2012年8月18日土曜日

Project Euler - Probrem 42

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

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

Problem 42

三角数のn項は tn = ½n(n+1)で与えられる. 最初の10項は
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
である.

単語中のアルファベットを数値に変換した後に和をとる.
この和を「単語の値」と呼ぶことにする.
例えば SKY は 19 + 11 + 25 = 55 = t10である.
単語の値が三角数であるとき, その単語を三角語と呼ぶ.

16KBのテキストファイル words.txt 中に約2000語の英単語が記されている.
三角語はいくつあるか?


-----

私の解答例は以下です。畳んでいます。
def f(sIn):
	#alphabet dic
	D = {}
	for i, s in enumerate(xrange(ord("A"), ord("Z")+1)):
		D[chr(s)] = i+1

	#read
	s = open(sIn).read()
	L = [t for t in s.split(",")]

	#triangle number List
	s = max([len(t) for t in L])
	i, t, T = 0, 0, []
	while t<=s*26:
		i += 1
		t += i
		T.append(t)

	#count
	i = 0
	for s in L:
		u = sum([D.get(t, 0) for t in s])
		i += int(u in T)
	return i

import os, sys
sIn = os.path.join(os.path.dirname(sys.argv[0]), "words.txt")
print f(sIn)


1.アルファベット辞書
problem22と同じです。

2.読み込み
problem22と同じです。
 当pythonソースファイルと同じフォルダ位置に"words.txt"を置きます。

3.三角数リスト
・s = max([len(t) for t in L])
 読み込んだ単語の長さの最大値をsとします。

・while t<=s*26:
 tは三角数です。
 s*26は、読み込んだ単語の長さの最大長だけzが連続した場合の三角数です。
 これを超えない三角数のリストを作成します。

・i += 1
 t += i
 T.append(t)
 iは連番です。tは三角数です。Tは三角数リストで、これに三角数tをためていきます。

4.三角語のカウント
・for s in L:
 対象となる単語リストLから単語を1つずつ取り出し、ループ変数sとします。

・u = sum([D.get(t, 0) for t in s])
 単語sから1文字ずつ取り出し、ループ変数tとします。
 アルファベット辞書Dを文字tで検索して、あれば辞書の値、無ければ0をリストにためます。
 sum関数で上記リストの合計、「単語の値」を変数uとします。

・i += int(u in T)
 単語の値uが三角リストTにあるか、「u in T」は論理型で返します
 論理型をint関数で数値型に変換すると、Trueが1、Falseが0に変換されますので、
 このint値をそのまま累積すればTrueの件数をカウントアップできます。


解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。
162

0 件のコメント:

コメントを投稿