Project Euler

Problem #42

The n^(th) 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?

Erlang: Running time = 0.13s
+%integer_sqrt

+%triangle

p42()->
	File=binary_to_list(element(2,file:read_file("words.txt"))),
	Data=lists:map(fun(W)->
		string:strip(W,both,$") end,
		string:tokens(File,",")),
	Vals=lists:map(fun(W)->
		lists:sum(lists:map(fun(L)->L-64 end,W)) end, Data),
	Ans=length(lists:filter(fun(N)->triangle((-1+integer_sqrt(1+8*N)) div 2)==N end,Vals)),
	io:format("~w~n",[Ans]).

Ruby: Running time = 0.05s
+#triangles

def p42
  letters=" ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  lets={}
  (1..26).each{|i|lets[letters[i..i]]=i}
  words=File.read("words.txt").scan(/\"\w+\"/).map{|s|s[1...-1]}
  triangles=(1..100).map{|i|triangles i}.to_set
  puts words.select{|w|triangles.include?(w.split("").map{|l|lets[l]}.sum)}.length
end