diff --git a/exercises/practice/sum-of-multiples/.meta/sum_of_multiples.example.pl b/exercises/practice/sum-of-multiples/.meta/sum_of_multiples.example.pl index 87f72090..bc49b9b9 100644 --- a/exercises/practice/sum-of-multiples/.meta/sum_of_multiples.example.pl +++ b/exercises/practice/sum-of-multiples/.meta/sum_of_multiples.example.pl @@ -1,14 +1,12 @@ -factored([Curr|Factors], Num) :- - 0 is mod(Num, Curr), !; - factored(Factors, Num). +:- use_module(library(clpfd)). -sum_of_multiples(_, 0, 0) :- !. sum_of_multiples(Factors, Limit, Sum) :- - Next is Limit - 1, - sum_of_multiples(Factors, Next, NextSum), - ( - factored(Factors, Limit), - Sum is Limit + NextSum, !; - Sum is NextSum - ). - + findall(Multiple, multiple(Factors, Limit, Multiple), Multiples), + list_to_set(Multiples, UniqueMultiples), + sum_list(UniqueMultiples, Sum). + +multiple(Factors, Limit, Multiple) :- + Upper #= Limit - 1, + between(0, Upper, Multiple), + member(Factor, Factors), + Multiple rem Factor #= 0. diff --git a/exercises/practice/sum-of-multiples/sum_of_multiples_tests.plt b/exercises/practice/sum-of-multiples/sum_of_multiples_tests.plt index 0250e291..df97fa16 100644 --- a/exercises/practice/sum-of-multiples/sum_of_multiples_tests.plt +++ b/exercises/practice/sum-of-multiples/sum_of_multiples_tests.plt @@ -11,36 +11,47 @@ pending :- Result == 0. test(just_one_multiple, condition(pending)) :- - sum_of_multiples([3, 5], 4, 3). + sum_of_multiples([3, 5], 4, Result), + Result == 3. test(a_few_multiples, condition(pending)) :- - sum_of_multiples([3, 5], 10, 23). + sum_of_multiples([3, 5], 10, Result), + Result == 23. test(sum_more_multiples, condition(pending)) :- - sum_of_multiples([3, 5], 100, 2318). + sum_of_multiples([3, 5], 100, Result), + Result == 2318. test(even_more_multiples, condition(pending)) :- - sum_of_multiples([3, 5], 1000, 233168). + sum_of_multiples([3, 5], 1000, Result), + Result == 233168. test(new_factors, condition(pending)) :- - sum_of_multiples([7, 13, 17], 20, 51). + sum_of_multiples([7, 13, 17], 20, Result), + Result == 51. test(sum_more_new_factors, condition(pending)) :- - sum_of_multiples([4, 6], 15, 30). + sum_of_multiples([4, 6], 15, Result), + Result == 30. test(even_more_new_factors, condition(pending)) :- - sum_of_multiples([5, 6, 8], 150, 4419). + sum_of_multiples([5, 6, 8], 150, Result), + Result == 4419. test(divisible_factor, condition(pending)) :- - sum_of_multiples([5, 25], 51, 275). + sum_of_multiples([5, 25], 51, Result), + Result == 275. test(large_factors, condition(pending)) :- - sum_of_multiples([43, 47], 10000, 2203160). + sum_of_multiples([43, 47], 10000, Result), + Result == 2203160. test(every_num, condition(pending)) :- - sum_of_multiples([1], 100, 4950). + sum_of_multiples([1], 100, Result), + Result == 4950. test(no_factors, condition(pending)) :- - sum_of_multiples([], 10000, 0). + sum_of_multiples([], 10000, Result), + Result == 0. :- end_tests(sum_of_multiples).