Skip to content

Instantly share code, notes, and snippets.

@Pagliacii
Last active May 19, 2021 10:52
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Pagliacii/47f0058f00ea3b747b9668e46f4abbab to your computer and use it in GitHub Desktop.
Save Pagliacii/47f0058f00ea3b747b9668e46f4abbab to your computer and use it in GitHub Desktop.
Using Prolog to solve a password puzzle.

Password Puzzle

Here has a three-digit password. It satisfies all constraints below:

  1. 682: One correct digit in the correct position.
  2. 614: One correct digit in the wrong position.
  3. 206: Two correct digits, neither in the correct position.
  4. 738: No correct digits.
  5. 870: One correct digit in the wrong position.
Answer 042
pass(Ps) :-
length(Ps, 1),
(
member(h(6, _, _), Ps);
member(h(_, 8, _), Ps);
member(h(_, _, 2), Ps)
),
(
member(h(_, 6, _), Ps);
member(h(_, _, 6), Ps);
member(h(1, _, _), Ps);
member(h(_, _, 1), Ps);
member(h(4, _, _), Ps);
member(h(_, 4, _), Ps)
),
(
member(h(_, 2, 0), Ps),
\+ member(h(6, _, _), Ps);
member(h(0, 2, _), Ps),
\+ member(h(_, _, 6), Ps);
member(h(0, _, 2), Ps),
\+ member(h(_, 6, _), Ps);
member(h(6, 2, _), Ps),
\+ member(h(_, _, 0), Ps);
member(h(6, _, 2), Ps),
\+ member(h(_, 0, _), Ps);
member(h(_, 6, 2), Ps),
\+ member(h(0, _, _), Ps);
member(h(6, _, 0), Ps),
\+ member(h(_, 2, _), Ps);
member(h(0, 6, _), Ps),
\+ member(h(_, _, 2), Ps);
member(h(_, 6, 0), Ps),
\+ member(h(2, _, _), Ps)
),
\+ (
member(h(7, _, _), Ps);
member(h(_, 7, _), Ps);
member(h(_, _, 7), Ps);
member(h(3, _, _), Ps);
member(h(_, 3, _), Ps);
member(h(_, _, 3), Ps);
member(h(8, _, _), Ps);
member(h(_, 8, _), Ps);
member(h(_, _, 8), Ps)
),
(
member(h(_, 8, _), Ps);
member(h(_, _, 8), Ps);
member(h(7, _, _), Ps);
member(h(_, _, 7), Ps);
member(h(0, _, _), Ps);
member(h(_, 0, _), Ps)
).
digit(0).
digit(1).
digit(2).
digit(3).
digit(4).
digit(5).
digit(6).
digit(7).
digit(8).
digit(9).
clue0(A, B, C) :-
digit(A), digit(B), digit(C).
clue1(A, B, C) :-
A = 6, B \= 8, C \= 2;
A \= 6, B = 8, C \= 2;
A \= 6, B \= 8, C = 2.
clue2(A, B, C) :-
A = 1, \+ member(B, [6, 4]), \+ member(C, [6, 4]);
A = 4, \+ member(B, [6, 1]), \+ member(C, [6, 1]);
B = 4, \+ member(A, [6, 1]), \+ member(C, [6, 1]);
B = 6, \+ member(A, [1, 4]), \+ member(C, [1, 4]);
C = 1, \+ member(A, [6, 4]), \+ member(B, [6, 4]);
C = 6, \+ member(A, [1, 4]), \+ member(B, [1, 4]).
clue3(A, B, C) :-
A \= 6, B = 2, C = 0;
A = 0, B \= 6, C = 2;
A = 0, B = 2, C \= 6;
A \= 0, B = 6, C = 2;
A = 6, B \= 0, C = 2;
A = 6, B = 2, C \= 0;
A \= 2, B = 6, C = 0;
A = 6, B \= 2, C = 0;
A = 0, B = 6, C \= 2.
clue4(A, B, C) :-
\+ member(A, [3, 7, 8]),
\+ member(B, [3, 7, 8]),
\+ member(C, [3, 7, 8]).
clue5(A, B, C) :-
A = 0, \+ member(B, [7, 8]), \+ member(C, [7, 8]);
A = 7, \+ member(B, [0, 8]), \+ member(C, [0, 8]);
B = 0, \+ member(A, [7, 8]), \+ member(C, [7, 8]);
B = 8, \+ member(A, [0, 7]), \+ member(C, [0, 7]);
C = 7, \+ member(A, [0, 8]), \+ member(B, [0, 8]);
C = 8, \+ member(A, [0, 7]), \+ member(B, [0, 7]).
pass(A, B, C) :-
clue0(A, B, C),
clue1(A, B, C),
clue2(A, B, C),
clue3(A, B, C),
clue4(A, B, C),
clue5(A, B, C).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment