From 5b5f21ce4ab74b083f4d1a923a3178ed0229fb63 Mon Sep 17 00:00:00 2001 From: chayleaf Date: Thu, 9 Dec 2021 10:08:40 +0700 Subject: [PATCH] day 7 prolog --- pl/07.1.pl | 28 ++++++++++++++++++++++++++++ pl/07.2.pl | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 pl/07.1.pl create mode 100644 pl/07.2.pl diff --git a/pl/07.1.pl b/pl/07.1.pl new file mode 100644 index 0000000..ee4b8dc --- /dev/null +++ b/pl/07.1.pl @@ -0,0 +1,28 @@ +numbers_strings([], []). +numbers_strings([A|As], [B|Bs]) :- + number_string(A, B), + numbers_strings(As, Bs). + +read_file(Stream, X) :- + \+ at_end_of_stream(Stream), + read_line_to_codes(Stream, C), + string_chars(S, C), + split_string(S, ",", "", Y), + numbers_strings(X, Y), + at_end_of_stream(Stream). + +main :- + open('../input/07', read, Stream), + read_file(Stream, Lines), !, + close(Stream), + msort(Lines, L), + length(L, Len), + I is Len // 2, + nth0(I, L, X), + calculate_diff(L, X, N), + print([X, N]). + +calculate_diff([], _, 0). +calculate_diff([A|As], X, B) :- + calculate_diff(As, X, B0), + B is B0 + abs(A - X). diff --git a/pl/07.2.pl b/pl/07.2.pl new file mode 100644 index 0000000..933c0e5 --- /dev/null +++ b/pl/07.2.pl @@ -0,0 +1,41 @@ +numbers_strings([], []). +numbers_strings([A|As], [B|Bs]) :- + number_string(A, B), + numbers_strings(As, Bs). + +read_file(Stream, X) :- + \+ at_end_of_stream(Stream), + read_line_to_codes(Stream, C), + string_chars(S, C), + split_string(S, ",", "", Y), + numbers_strings(X, Y), + at_end_of_stream(Stream). + +main :- + open('../input/07', read, Stream), + read_file(Stream, Lines), !, + close(Stream), + msort(Lines, L), + min_list(L, A), + max_list(L, B), + bin_search(A, B, L, N), + print(N). + +tri(A, B) :- + B is (A * (A + 1)) // 2. + +calculate_diff([], _, 0). +calculate_diff([A|As], X, B) :- + calculate_diff(As, X, B0), + tri(abs(A - X), T), + B is B0 + T. + +bin_search(L, L, A, Ans) :- + calculate_diff(A, L, Ans). +bin_search(L, R, A, Ans) :- + L < R, + M is (L + R) // 2, + ((M >= R, A1 is 9999999999999999); bin_search(L, M, A, A1)), + ((M =< L, A2 is 9999999999999999); bin_search(M, R, A, A2)), + Ans is min(A1, A2). +