90 lines
2 KiB
Prolog
90 lines
2 KiB
Prolog
remove_last(A, C) :-
|
|
reverse(A, [_|B]),
|
|
reverse(B, C).
|
|
|
|
strings_chars([], []).
|
|
strings_chars([A|As], [B|Bs]) :-
|
|
string_chars(A, B),
|
|
strings_chars(As, Bs).
|
|
|
|
read_file(Stream, []) :-
|
|
at_end_of_stream(Stream).
|
|
read_file(Stream, [X|Xs]) :-
|
|
\+ at_end_of_stream(Stream),
|
|
read_line_to_codes(Stream, C),
|
|
string_chars(S, C),
|
|
split_string(S, "|", "", [A, B]),
|
|
split_string(A, " ", "", A0),
|
|
split_string(B, " ", "", [_|B0]),
|
|
remove_last(A0, A1),
|
|
strings_chars(A1, A2),
|
|
strings_chars(B0, B1),
|
|
X = [A2, B1],
|
|
% X = S,
|
|
read_file(Stream, Xs).
|
|
|
|
main :-
|
|
open('../input/08', read, Stream),
|
|
read_file(Stream, Lines), !,
|
|
close(Stream),
|
|
solve_all(Lines, Ans),
|
|
count_all(Ans, S),
|
|
print(S).
|
|
|
|
solve_all([], []).
|
|
solve_all([L|Ls], [A|As]) :-
|
|
solve(L, A),
|
|
solve_all(Ls, As).
|
|
|
|
should_count(1).
|
|
should_count(4).
|
|
should_count(7).
|
|
should_count(8).
|
|
|
|
count([], 0).
|
|
count([N|Ns], S) :-
|
|
should_count(N),
|
|
count(Ns, S1),
|
|
S is S1 + 1.
|
|
count([N|Ns], S) :-
|
|
\+ should_count(N),
|
|
count(Ns, S).
|
|
|
|
count_all([], 0).
|
|
count_all([N|Ns], S) :-
|
|
count(N, S0),
|
|
count_all(Ns, S1),
|
|
S is S0 + S1.
|
|
|
|
letter(a).
|
|
letter(b).
|
|
letter(c).
|
|
letter(d).
|
|
letter(e).
|
|
letter(f).
|
|
letter(g).
|
|
|
|
solve([Q, W], X) :-
|
|
letter(A), letter(B), letter(C), letter(D), letter(E), letter(F), letter(G),
|
|
A \= B, A \= C, A \= D, A \= E, A \= F, A \= G,
|
|
B \= C, B \= D, B \= E, B \= F, B \= G,
|
|
C \= D, C \= E, C \= F, C \= G,
|
|
D \= E, D \= F, D \= G,
|
|
E \= F, E \= G,
|
|
F \= G,
|
|
length(A1, 2), length(A7, 3), length(A4, 4), length(A8, 7),
|
|
permutation([_, A1, _, _, A4, _, _, A7, A8, _], Q), !,
|
|
decode_all(W, X, [A1, A4, A7, A8]).
|
|
|
|
decode_all([], [], _).
|
|
decode_all([Q|Qs], [W|Ws], A) :-
|
|
decode(Q, W, A),
|
|
decode_all(Qs, Ws, A).
|
|
|
|
decode(Q, W, [A1, A4, A7, A8]) :-
|
|
((permutation(A1, Q), W is 1, !);
|
|
(permutation(A4, Q), W is 4, !);
|
|
(permutation(A7, Q), W is 7, !);
|
|
(permutation(A8, Q), W is 8, !);
|
|
(W is -1)).
|