/* Advent of Code 2024 in Picat. Problem 13 https://adventofcode.com/2024/day/13 This variant parses the entries using DCGs This program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. import cp. import aoc_utils. main => go. /* Part 1 and 2 Benchmark 1: picat -g go 13_dcg.pi Time (mean ± σ): 59.5 ms ± 7.0 ms [User: 42.4 ms, System: 17.2 ms] Range (min … max): 38.3 ms … 71.8 ms 45 runs Part 1 Time (mean ± σ): 51.0 ms ± 6.6 ms [User: 32.6 ms, System: 18.3 ms] Range (min … max): 23.6 ms … 62.1 ms 42 runs Part 2 Time (mean ± σ): 51.7 ms ± 7.2 ms [User: 34.6 ms, System: 17.1 ms] Range (min … max): 31.7 ms … 63.7 ms 48 runs */ go ?=> Lines = read_file_chars("13.txt").split2(), Ns = [L : Line in Lines, once(L = find_all_numbers_dcg(Line))], member(Part,1..2), T = cond(Part == 1,0,10000000000000), [Z : [AX,AY,BX,BY,PX,PY] in Ns, Z = s(AX,AY,BX,BY,PX+T,PY+T)].sum.println, Part == 2. go => true. s(AX,AY,BX,BY,PX,PY) = Z => X #>= 0, Y #>= 0, PX #= AX*X + BX*Y, PY #= AY*X + BY*Y, Z #=3*X+Y, solve($[min(Z)],[X,Y]). % Find all numbers in a string find_all_numbers_dcg(S) = Ns => find_all_numbers_dcg(Ns,S,[]). find_number(N) --> digits(N1), {N1 != "", N = N1.to_int}. find_all_numbers_dcg([D|Ds]) --> any, find_number(D), any, find_all_numbers_dcg(Ds). find_all_numbers_dcg([D]) --> find_number(D). find_all_numbers_dcg([]) --> [].