/* Consecutive sums in Picat. From rec.puzzles FAQ http://brainyplanet.com/index.php/Consecutive%20Sums """ Find all series of consecutive positive integers whose sum is exactly 10,000. """ Difference approaches: - CP with formula: go - CP "brute force": go2 - Loop "brute force": go3 - between/3: go4 - member/2: go5 This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import sat. main => go. % % CP with formula % go ?=> nolog, N = 10000, printf("%d..%d\n", N, N), % Just N..N Start :: 1..2+N//2, End :: 1..2+N//2, Start #<= End, N #= (Start+End)*(End-Start+1)//2, solve($[degree,split],[Start,End]), printf("%d..%d\n",Start,End), fail, nl. go => true. % CP, "brute force" go2 ?=> nolog, N = 10000, printf("%d..%d\n", N, N), % Just N..N Start :: 1..2+N//2, End :: 1..2+N//2, Start #<= End, N #= sum([I*(I #>= Start #/\ I #=< End) : I in 1..N]), solve($[degree,split],[Start,End]), printf("%d..%d\n",Start,End), println(['start+end'=(Start+End),'end-start'=(End-Start)]), fail, nl. go2 => true. % "brute force" go3 => N = 10000, foreach(I in 1..N, J in I..N) if N=sum([K : K in I..J]) then println(I'..'J) end end, nl. % go4 => N = 10000, between(1,N,I), between(I,N,J), N=sum([K : K in I..J]), println(I'..'J), fail, nl. % % member/3 % go5 => N = 10000, member(I, 1..N), member(J, I..N), N=sum([K : K in I..J]), println(I'..'J), fail, nl.