/* Advent of Code 2024 in Picat. Problem 4 https://adventofcode.com/2024/day/4 This program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. import aoc_utils. main => go. /* Hyperfine Benchmark 1: picat -g go 4.pi Time (mean ± σ): 606.5 ms ± 11.9 ms [User: 582.0 ms, System: 16.3 ms] Range (min … max): 590.9 ms … 621.5 ms 10 runs */ go ?=> part1, part2, nl. go => true. /* Hyperfine Benchmark 1: picat -g part1 4.pi Time (mean ± σ): 557.2 ms ± 11.4 ms [User: 538.3 ms, System: 15.1 ms] Range (min … max): 536.1 ms … 573.4 ms 10 runs */ part1 => File = "4.txt", Lines = read_file_lines(File), Sum = 0, foreach(L in Lines) Sum := Sum + xmas1(L) end, foreach(L in Lines.transpose) Sum := Sum + xmas1(L) end, foreach(L in all_diagonals(Lines)) Sum := Sum + xmas1(L) end, println(Sum). % Alternative using list comprehension part1b => File = "4.txt", M = read_file_lines(File), println([ xmas1(L): L in M].sum + [ xmas1(L): L in M.transpose].sum + [ xmas1(L): L in all_diagonals(M)].sum). xmas1(L) = count_all(find(L,"XMAS",_,_)) + count_all(find(L.reverse,"XMAS",_,_)). % Using append/4. About the same time as xmas1/1 % xmas2(L) = count_all(append(_,"XMAS",_,L)) + count_all(append(_,"XMAS",_,L.reverse)). /* Hyperfine Benchmark 1: picat -g part2 4.pi Time (mean ± σ): 86.3 ms ± 8.7 ms [User: 67.9 ms, System: 17.0 ms] Range (min … max): 58.9 ms … 98.2 ms 29 runs */ part2 => File = "4.txt", M = read_file_lines(File), M2 := [L.reverse : L in M].reverse, T = M.transpose, T2 := [L.reverse : L in T].reverse , Sum := mas2(M) + mas2(T) + mas2(M2) + mas2(T2), println(Sum), nl. mas2(M) = [1 : I in 2..N-1, J in 2..N-1, M[I-1,J-1]='M', M[I-1,J+1]='S', M[I,J] = 'A', M[I+1,J-1]='M', M[I+1,J+1]='S'].sum => N=M.len.