Commit Diff


commit - /dev/null
commit + 3d926f58b1a1f42fc4a7d3f34c8cde8aefb5b92f
blob - /dev/null
blob + 770eab4480baef65fb31c2348f2cc7de6aba70be (mode 644)
--- /dev/null
+++ .gitignore
@@ -0,0 +1 @@
+input
\ No newline at end of file
blob - /dev/null
blob + 5c84ea195af91262a033c2fcbfce75c84f719b26 (mode 644)
--- /dev/null
+++ 01.pl
@@ -0,0 +1,45 @@
+parse_move(['L'|Rest], N) :-
+    number_chars(N0, Rest),
+    N is -N0.
+
+parse_move(['R'|Rest], N) :-
+    number_chars(N, Rest).
+
+parse_input(File, Moves) :-
+    read_file_to_string(File, Content, []),
+    split_string(Content, "\n", "", Lines0),
+    exclude(=(""), Lines0, Lines),
+    maplist(string_chars, Lines, CharLists),
+    maplist(parse_move, CharLists, Moves).
+
+passed_zero_left(0, _, Q, Count) :- Count is Q - 1.
+passed_zero_left(_, 0, Q, Count) :- Count is Q + 1.
+passed_zero_left(_, _, Q, Q).
+
+passed_count(Move, Pos, NewPos, Q, Count) :-
+    Move < 0,
+    passed_zero_left(Pos, NewPos, Q, Count).
+
+passed_count(_, _, _, Q, Q).
+
+move_dial(Pos, N, NewPos, Passed0Count) :-
+    T is Pos + N,
+    divmod(T, 100, Q0, NewPos),
+    Q is abs(Q0),
+    passed_count(N, Pos, NewPos, Q, Passed0Count).
+
+solve(_, [], 0, 0).
+solve(Pos, [Move|Rest], Task1, Task2) :-
+    move_dial(Pos, Move, NewPos, T2R1),
+    ( NewPos =:= 0 -> T1R1 = 1 ; T1R1 = 0 ),
+    solve(NewPos, Rest, T1R2, T2R2),
+    Task1 is T1R1 + T1R2,
+    Task2 is T2R1 + T2R2.
+
+solve(Moves, Task1, Task2) :-
+    solve(50, Moves, Task1, Task2).
+
+:-
+    parse_input("input/01.txt", Moves),
+    solve(Moves, Task1, Task2),
+    format("~d ~d~n", [Task1, Task2]).