出典: 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 件のコメント:
コメントを投稿