Coded triangle numbers

The nth term of the sequence of triangle numbers is given by, tn = ½n(n+1); so the first ten triangle numbers are:

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

By converting each letter in a word to a number corresponding to its alphabetical position and adding these values we form a word value. For example, the word value for SKY is 19 + 11 + 25 = 55 = t10. If the word value is a triangle number then we shall call the word a triangle word.

Using words.txt (right click and 'Save Link/Target As...'), a 16K text file containing nearly two-thousand common English words, how many are triangle words?


Idea

Naive solution


In [1]:
from urllib.request import urlopen
from math import sqrt
In [2]:
with urlopen("https://projecteuler.net/project/resources/p042_words.txt") as f:
    text = f.read().decode('utf-8')
    words = list(map(lambda w: w.strip('"'), text.split(',')))
In [3]:
words[:10]
Out[3]:
['A',
 'ABILITY',
 'ABLE',
 'ABOUT',
 'ABOVE',
 'ABSENCE',
 'ABSOLUTELY',
 'ACADEMIC',
 'ACCEPT',
 'ACCESS']
In [4]:
max_word_length = max(map(len, words))
max_word_length
Out[4]:
14
In [5]:
n_max = int(sqrt(2 * 26 * max_word_length))
n_max
Out[5]:
26
In [6]:
t_n = list(map(lambda n: n*(n+1)//2, range(1, n_max+1)))
In [7]:
def is_triangle_word(word):
    word_sum = sum(map(lambda c: ord(c) - ord('A') + 1, word.upper()))
    return word_sum in t_n
In [8]:
def solve():
    return sum(map(is_triangle_word, words))
In [9]:
solve()
Out[9]:
162