"""
Coded Triangle Numbers
Project Euler Problem #42
by Muaz Siddiqui

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?
"""
from euler_helpers import timeit, word_to_num

@timeit
def answer():
    f = open('words.txt', 'r')
    # Read all words and store as a list
    words = list(map(lambda x: x.replace("\"", "") ,f.read().split(",")))

    # Find the longest word to bound the triangle number list
    longest = 0
    for word in words:
        length = len(word)
        if length > longest:
            longest = length
    longest *= 26
    triangles = []
    next = 1
    counts = 2
    # Generate triangles up to bound
    while next < longest:
        triangles.append(next)
        next = 0.5*counts*(counts + 1)
        counts += 1
    final = 0
    # Count all triangle words
    for word in words:
        if word_to_num(word) in triangles:
            final += 1
    return final

