From 63a054505db6f5e8030832fd5d5dfcff478c35e1 Mon Sep 17 00:00:00 2001 From: Dory Date: Mon, 18 Dec 2023 00:40:31 -0800 Subject: [PATCH] d18p2 --- 18/part2.pl | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 18/part2.pl diff --git a/18/part2.pl b/18/part2.pl new file mode 100644 index 0000000..aa87418 --- /dev/null +++ b/18/part2.pl @@ -0,0 +1,31 @@ +:- use_module(library(pio)). +:- use_module(library(dcg/basics)). +:- initialization(main, main). + +main([FileName|_]) :- + input(FileName, Moves), + area(Moves, Area), + write(Area), nl. + +area(Moves, Area) :- + area(Moves, 0, A1), MainArea is abs(A1), + convlist([r-N, N]>>(true), Moves, Horzs), sum_list(Horzs, Horz), + convlist([u-N, N]>>(true), Moves, Verts), sum_list(Verts, Vert), + Area is MainArea + Horz + Vert + 1. + +area([], _, 0). +area([u-Len|Moves], H, Area) :- NewH is H + Len, area(Moves, NewH, Area). +area([d-Len|Moves], H, Area) :- NewH is H - Len, area(Moves, NewH, Area). +area([r-Len|Moves], H, Area) :- area(Moves, H, Area2), Area is Area2 + H*Len. +area([l-Len|Moves], H, Area) :- area(Moves, H, Area2), Area is Area2 - H*Len. + +input(FileName, Moves) :- phrase_from_file(moves(Moves), FileName). +moves([]) --> eos, !. +moves([Move|Moves]) --> move(Move), moves(Moves). +move(DirAtom-Len) --> + alpha_to_lower(_), " ", number(_), " (#", xinteger(Hex), ")", ("\n"; eos), + {DirNum is Hex /\ 15, dir(DirNum, DirAtom), Len is Hex >> 4}. +dir(0, r). +dir(1, d). +dir(2, l). +dir(3, u).