/* Advent of Code 2024 in Picat. Problem 7 https://adventofcode.com/2024/day/7 Thanks to jf for a bug report. This program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. main => go. go ?=> part1, part2. go => true. /* Hyperfine Benchmark 1: picat -g part1 7.pi Time (mean ± σ): 56.7 ms ± 7.5 ms [User: 38.7 ms, System: 17.9 ms] Range (min … max): 39.0 ms … 68.6 ms 39 runs */ part1 => Lines = [L.split(" :").map(to_int) : L in read_file_lines("7.txt")], println([N : [N,M|Ns] in Lines, eq(Ns,M,N)].sum). eq([],S,S). eq([A|L],S0,S) :- S0 <= S, (S1 = S0*A ; S1 = S0+A), eq(L,S1,S). % % Hyperfine % % Benchmark 1: picat -g part2 7.pi % Time (mean ± σ): 957.4 ms ± 12.1 ms [User: 939.0 ms, System: 18.0 ms] % Range (min … max): 940.7 ms … 973.9 ms 10 runs % part2 => Lines = [L.split(" :").map(to_int) : L in read_file_lines("7.txt")], println([N : [N,M|Ns] in Lines, (eq(Ns,M,N); eq2(Ns,M,N))].sum). eq2([],S,S). eq2([A|L],S0,S) :- S0 <= S, % Weeding out impossible paths ( SA = S0*10**floor(log10(A)+1) + A, % Thanks to DestyNova eq2(L,SA,S) ; (S1 = S0*A ; S1 = S0+A), eq2(L,S1,S) ).