/* Advent of Code 2023 Day 9 in Picat. https://adventofcode.com/2023/day/9 This program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. main => go. /* $ hyperfine 'picat 9.pi' Benchmark 1: picat 9.pi Time (mean ± σ): 46.5 ms ± 7.9 ms [User: 32.9 ms, System: 13.6 ms] Range (min … max): 22.3 ms … 59.3 ms 55 runs */ go ?=> File = "9.txt", Nss = [Line.split(" ").map(to_int) : Line in read_file_lines(File)], member(Part,1..2), Sum = 0, foreach(Ns in Nss) Ds = diffs(Ns), Dss = [Ds], while (Ds.remove_dups.len > 1) Ds := Ds.diffs, Dss := Dss ++ [Ds] end, if Part == 1 then TT = Ns.last + sum([D.last : D in Dss.reverse]) else T = 0, foreach(D in Dss.reverse) T := D.first - T end, TT = Ns.first - T end, Sum := Sum + TT end, println(Sum), fail. go => true. diffs(L) = [L[I]-L[I-1] : I in 2..L.len].