Project Euler Problem 42: Coded Triangle Numbers

The source code for this problem can be found here.

Problem Statement

The \(n^{th}\) term of the sequence of triangle numbers is given by, \(t_n = \frac{n(n+1)}{2}\); so the first ten triangle numbers are:

\[1, 3, 6, 10, 15, 21, 28, 36, 45, 55, \dots\]

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 = t_{10}\). 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?

Solution Discussion

Nothing sophisticated here, just map each word to the corresponding number and test whether it is a triangular number and then count them.

Solution Implementation

from lib.sequence import Triangulars
from lib.util import load_dataset


def is_triangle_word(word: str) -> bool:
    """ Check whether `word` is a triangle word

    :param word: the word to test
    :return: whether `word` is a triangle word or not
    """

    mapping = {chr(i): i - ord('A') + 1 for i in range(ord('A'), ord('Z') + 1)}
    word_value = sum([mapping[letter] for letter in word])
    return word_value in Triangulars()


def solve():
    """ Compute the answer to Project Euler's problem #42 """
    words = load_dataset("problems", "p042_words", separator=",")
    words = [word.strip("\"") for word in words]  # strip quotes off each word
    triangle_words = filter(is_triangle_word, words)
    answer = len(list(triangle_words))  # number of triangle words
    return answer


expected_answer = 162
solutions.problem42.is_triangle_word(word)

Check whether word is a triangle word

Parameters:word (str) – the word to test
Return type:bool
Returns:whether word is a triangle word or not
solutions.problem42.solve()

Compute the answer to Project Euler’s problem #42