You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
2.0 KiB
Prolog

file_to_lines(Path, Lines) :-
read_file_to_string(Path, S, []),
split_string(S, "\n", "\n", Lines).
% Convert "L68" into the tuple l-68
line_to_turn(Turn, Dir-Dist) :-
sub_atom(Turn, 0, 1, Len, Dir0),
sub_string(Turn, 1, Len, _, Dist0),
number_string(Dist, Dist0),
downcase_atom(Dir0, Dir).
main :-
file_to_lines("data.txt", Lines),
maplist(line_to_turn, Lines, Turns),
part1(50, 0, Turns, Res),
writeln(Res),
part2(50, 0, Turns, Res2),
writeln(Res2).
% PART 1
turn_knob(Start, Dir-Dist, Result) :-
Dir = l
-> Result is (Start - Dist) mod 100
; Result is (Start + Dist) mod 100.
% recursion base case, if list is empty, unify the NumZeros with the Result
part1(_, Res, [], Res).
% recurse through the list, turning the knob, counting zeros
part1(Start, NumZeros, [Turn|Rest], Res) :-
turn_knob(Start, Turn, NewStart),
(NewStart = 0
-> NewNumZeros is NumZeros + 1,
part1(NewStart, NewNumZeros, Rest, Res)
; part1(NewStart, NumZeros, Rest, Res)).
% PART 2
% 6225 too low
% 6323 too high
% 6238 wrong
turn_knob_count_zeros(Start, Dir-Dist, Result, Zeros) :-
( Dir = l -> Diff is -Dist ; Diff is Dist ),
Next is Start + Diff,
divmod(Next, 100, Zeros0, Result0),
Result is ((Result0 mod 100) + 100) mod 100, % normalize result
Zeros1 is abs(Zeros0),
(Start = 0, Dir = l, Dist < 100 -> Zeros2 is Zeros1 - 1 ; Zeros2 is Zeros1),
(Next = 0 -> Zeros is Zeros2 + 1 ; Zeros = Zeros2),
format('Start: ~w Dir: ~w Dist: ~w Next: ~w Result: ~w Zeros: ~w~n',
[Start, Dir, Dist, Next, Result, Zeros]).
part2(_, Res, [], Res).
part2(Start, NumZeros, [Turn|Rest], Res) :-
turn_knob_count_zeros(Start, Turn, NewStart, Zeros),
NewNumZeros is Zeros + NumZeros,
format('New Zeros ~w~n', NewNumZeros),
part2(NewStart, NewNumZeros, Rest, Res).
/*
Start: 0 Dir: l Dist: 223 Next: -223 Result: 77 Zeros: 3
Start: 52 Dir: r Dist: 192 Next: 244 Result: 44 Zeros: 2
*/