/* Euler problem 42 in SICStus Prolog """ The nth term of the sequence of triangle numbers is given by, tn = 1/2*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? """ Model created by Hakan Kjellerstrand, hakank@gmail.com See also my SICStus Prolog page: http://www.hakank.org/sicstus_prolog/ */ :- ensure_loaded(hakank_utils). :- set_prolog_flag(double_quotes,chars). go :- L = [ euler42a ], run_problems(L). %% %% 0.011s %% euler42a :- read_file('euler42_names.txt',Str1), Str1 = [Str|_], delete(Str,34,Str2), % '"' split_string(Str2,44,Lines), % ',' numlist(1,100,Is), maplist(triangle_number,Is,Ts), findall(Ss, (member(S,Lines), upper_string_to_digit_list(S,D), sum_list(D,Ss), memberchk(Ss,Ts) ), L ), length(L,Len), writeln(Len). triangle_number(N,T) :- T is (N*(N+1)) div 2. upper_string_to_digit_list(N,L) :- maplist(to_upper_alpha,N,L). to_upper_alpha(N,Alpha) :- Alpha is N - 64.