From fb8c48b8871f0b7753040f2fe1db3a1e13b66f34 Mon Sep 17 00:00:00 2001 From: 2colours Date: Tue, 28 Jan 2025 18:06:02 +0100 Subject: Add Prolog solutions to Week #306 --- challenge-306/2colours/prolog/ch-1.p | 13 +++++++++++++ challenge-306/2colours/prolog/ch-2.p | 17 +++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 challenge-306/2colours/prolog/ch-1.p create mode 100644 challenge-306/2colours/prolog/ch-2.p diff --git a/challenge-306/2colours/prolog/ch-1.p b/challenge-306/2colours/prolog/ch-1.p new file mode 100644 index 0000000000..0e90897a5d --- /dev/null +++ b/challenge-306/2colours/prolog/ch-1.p @@ -0,0 +1,13 @@ +:- use_module(library(clpfd)). + +task1(Ints, Result) :- + length(Ints, Max_L), + findall(Sum, ( + N in 1..Max_L, + N mod 2 #= 1, + indomain(N), + length(SA, N), + append([_Prefix, SA, _Suffix], Ints), + sum_list(SA, Sum) + ), Sums), + sum_list(Sums, Result). diff --git a/challenge-306/2colours/prolog/ch-2.p b/challenge-306/2colours/prolog/ch-2.p new file mode 100644 index 0000000000..0b2eba8ab0 --- /dev/null +++ b/challenge-306/2colours/prolog/ch-2.p @@ -0,0 +1,17 @@ +game([], 0). +game([Last_Remaining], Last_Remaining). +game(List, Result) :- + max_list(List, Max1), + once(select(Max1, List, Rest)), + max_list(Rest, Max2), + once(nth0(Pos2, Rest, Max2, Rest2)), + Diff is Max1 - Max2, + (Diff =:= 0 -> + game(Rest2, Result) + ; + true -> + nth0(Pos2, New_List, Diff, Rest2), + game(New_List, Result) + ). + +task2(Ints, Result) :- game(Ints, Result), !. -- cgit From 90814ffa981bd46b25b7c3b191f57948d09d19f9 Mon Sep 17 00:00:00 2001 From: 2colours Date: Tue, 28 Jan 2025 18:10:47 +0100 Subject: Improve determinism of part 2 --- challenge-306/2colours/prolog/ch-2.p | 1 + 1 file changed, 1 insertion(+) diff --git a/challenge-306/2colours/prolog/ch-2.p b/challenge-306/2colours/prolog/ch-2.p index 0b2eba8ab0..465532d012 100644 --- a/challenge-306/2colours/prolog/ch-2.p +++ b/challenge-306/2colours/prolog/ch-2.p @@ -1,6 +1,7 @@ game([], 0). game([Last_Remaining], Last_Remaining). game(List, Result) :- + length(List, N), N > 1, max_list(List, Max1), once(select(Max1, List, Rest)), max_list(Rest, Max2), -- cgit