Problem42

30分プログラム、その315。Problem42 - Project Euler

三角数のn項は tn = ½n(n+1)で与えられる. 最初の10項は

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...

である.

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

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

三角語ってwikipedia:かばん語みたいな響きだ。ある値が与えられたとき、それが三角数かどうかを判断することができらばいいんだけど、いい方法が思いつかなかった。そこで、あらかじめ三角数をいくつか計算しておいて、そこに含まれるかで判断することにした。

使い方

$ python problem42.py
162

ソースコード

#! /usr/bin/python
# -*- mode:python; coding:utf-8 -*-
#
# problem42.py -
#
# Copyright(C) 2008 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2008/05/31 21:28:47
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

def tri(n):
    return n*(n+1)/2

def word_sum(xs):
    return sum(map(lambda x:ord(x)-ord('A')+1,xs))

words = map(lambda x:x.strip('"'),file('words.txt').read().split(','))
tri_nums = map(tri,range(0,100))
tri_words = filter(lambda x:word_sum(x) in tri_nums,words)

print len(tri_words)