:- 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).