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]:
In [ ]: