The nth term of the sequence of triangle numbers is given by, t(n) = ½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 = 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?


In [1]:
open System.IO

let triangle' n = (n / 2.0) * (n + 1.0)

let triangleNumbers100 =  
    [0..100]
    |> List.map (float >> triangle' >> int)
    |> Set.ofList

let readLines (filePath:string) = seq {
    use sr = new StreamReader (filePath)
    while not sr.EndOfStream do
        yield sr.ReadLine ()
}

let charScore c = int(c) - int('A') + 1

let wordValue (word:string) = 
    word.ToCharArray()
    |> Array.map charScore
    |> Array.sum

readLines "resources/p042_words.txt"
|> Seq.map (fun s -> s.Replace("\"",""))
|> Seq.map (fun s -> s.Split([|','|]))
|> Seq.map Array.toList
|> Seq.toList
|> List.concat
|> List.map wordValue
|> List.filter (fun value -> triangleNumbers100.Contains(value))
|> List.length


Out[1]:
162

In [ ]: