/* Advent of Code 2023 Day 6 in Picat. https://adventofcode.com/2023/day/6 This is a version using DCG to read the input. This program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. import sat. main => go. /* $ hyperfine 'picat 6_dcg.pi' Benchmark 1: picat 6_dcg.pi Time (mean ± σ): 2.194 s ± 0.012 s [User: 2.171 s, System: 0.021 s] Range (min … max): 2.178 s … 2.221 s 10 runs This is about as fast as 6.pi. */ go => File = "6.txt", Chars = read_file_chars(File), once(parse_file1([Times,Distances],Chars,[])), println([counts(T,D) : {T,D} in zip(Times,Distances)].prod), % Part 2 once(parse_file2([Time2,Distance2],Chars,[])), println(counts(Time2,Distance2)). counts(Time,Distance) = [1 : T in 0..Time, (Time - T)*T > Distance].len. % % DCG % space --> (" ", space) ; "". digits([C|Rest]) --> [C], {ascii_digit(C)}, digits(Rest). digits([]) --> "". numbers([N|Ns]) --> digits(N1), {N1 != "", N = N1.to_int}, space, numbers(Ns). numbers([N]) --> digits(N1), {N1 != "", N = N1.to_int}. numbers([]) --> []. % Part 1 parse_file1([Times,Distances]) --> "Time:", space, numbers(Times), "\n", "Distance:", space, numbers(Distances), "\n". % Part 2 digits2([C|Rest]) --> [C], {(ascii_digit(C) ; C == ' ')}, digits2(Rest). digits2([]) --> "". parse_file2([Times,Distances]) --> "Time:", space, digits2(Times1), {Times = Times1.delete_all(' ').to_int}, "\n", "Distance:", space, digits2(Distances1), {Distances = Distances1.delete_all(' ').to_int}, "\n".