diff --git a/prolog/day3.pl b/prolog/day3.pl new file mode 100644 index 0000000..18d85be --- /dev/null +++ b/prolog/day3.pl @@ -0,0 +1,107 @@ +/* + * sudoku([5, 3, _, _, 7, _, _, _, _, + * 6, _, _, 1, 9, 5, _, _, _, + * _, 9, 8, _, _, _, _, 6, _, + * 8, _, _, _, 6, _, _, _, 3, + * 4, _, _, 8, _, 3, _, _, 1, + * 7, _, _, _, 2, _, _, _, 6, + * _, 6, _, _, _, _, 2, 8, _, + * _, _, _, 4, 1, 9, _, _, 5, + * _, _, _, _, 8, _, _, 7, 9 + * ], What). + * sudoku([5, 3, _, _, 7, _, _, _, _, 6, _, _, 1, 9, 5, _, _, _, _, 9, 8, _, _, _, _, 6, _, 8, _, _, _, 6, _, _, _, 3, 4, _, _, 8, _, 3, _, _, 1, 7, _, _, _, 2, _, _, _, 6, _, 6, _, _, _, _, 2, 8, _, _, _, _, 4, 1, 9, _, _, 5, _, _, _, _, 8, _, _, 7, 9 ], What). + * puzzle input from wikipedia + * */ +:- use_module(library(clpfd)). + + sudoku(Input, Solution) :- + Solution = Input, + Input = [ S11, S12, S13, S14, S15, S16, S17, S18, S19, + S21, S22, S23, S24, S25, S26, S27, S28, S29, + S31, S32, S33, S34, S35, S36, S37, S38, S39, + S41, S42, S43, S44, S45, S46, S47, S48, S49, + S51, S52, S53, S54, S55, S56, S57, S58, S59, + S61, S62, S63, S64, S65, S66, S67, S68, S69, + S71, S72, S73, S74, S75, S76, S77, S78, S79, + S81, S82, S83, S84, S85, S86, S87, S88, S89, + S91, S92, S93, S94, S95, S96, S97, S98, S99 + ], + + Solution ins 1..9, + Row1 = [S11, S12, S13, S14, S15, S16, S17, S18, S19], + Row2 = [S21, S22, S23, S24, S25, S26, S27, S28, S29], + Row3 = [S31, S32, S33, S34, S35, S36, S37, S38, S39], + Row4 = [S41, S42, S43, S44, S45, S46, S47, S48, S49], + Row5 = [S51, S52, S53, S54, S55, S56, S57, S58, S59], + Row6 = [S61, S62, S63, S64, S65, S66, S67, S68, S69], + Row7 = [S71, S72, S73, S74, S75, S76, S77, S78, S79], + Row8 = [S81, S82, S83, S84, S85, S86, S87, S88, S89], + Row9 = [S91, S92, S93, S94, S95, S96, S97, S98, S99], + Rows = [Row1, Row2, Row3, Row4, Row5, Row6, Row7, Row8, Row9], + Col1 = [S11, S21, S31, S41, S51, S61, S71, S81, S91], + Col2 = [S12, S22, S32, S42, S52, S62, S72, S82, S92], + Col3 = [S13, S23, S33, S43, S53, S63, S73, S83, S93], + Col4 = [S14, S24, S34, S44, S54, S64, S74, S84, S94], + Col5 = [S15, S25, S35, S45, S55, S65, S75, S85, S95], + Col6 = [S16, S26, S36, S46, S56, S66, S76, S86, S96], + Col7 = [S17, S27, S37, S47, S57, S67, S77, S87, S97], + Col8 = [S18, S28, S38, S48, S58, S68, S78, S88, S98], + Col9 = [S19, S29, S39, S49, S59, S69, S79, S89, S99], + Cols = [Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9], + Sqr1 = [S11, S12, S13, S21, S22, S23, S31, S32, S33], + Sqr2 = [S14, S15, S16, S24, S25, S26, S34, S35, S36], + Sqr3 = [S17, S18, S19, S27, S28, S29, S37, S38, S39], + Sqr4 = [S41, S42, S43, S51, S52, S53, S61, S62, S63], + Sqr5 = [S44, S45, S46, S54, S55, S56, S64, S65, S66], + Sqr6 = [S47, S48, S49, S57, S58, S59, S67, S68, S69], + Sqr7 = [S71, S72, S73, S81, S82, S83, S91, S92, S93], + Sqr8 = [S74, S75, S76, S84, S85, S86, S94, S95, S96], + Sqr9 = [S77, S78, S79, S87, S88, S89, S97, S98, S99], + Squares = [Sqr1, Sqr2, Sqr3, Sqr4, Sqr5, Sqr6, Sqr7, Sqr8, Sqr9], + + valid(Squares), + valid(Rows), + valid(Cols), + + show(Solution). + +sudoku4(Input, Solution) :- + Solution = Input, + Input = [ S11, S12, S13, S14, + S21, S22, S23, S24, + S31, S32, S33, S34, + S41, S42, S43, S44 + ], + Solution ins 1..4, + Squares = [[S11, S12, S21, S22], [S13, S14, S23, S24], [S31, S32, S41, S42], [S33, S34, S43, S44]], + Rows = [[S11, S12, S13, S14], [S21, S22, S23, S24], [S31, S32, S33, S34], [S41, S42, S43, S44]], + Cols = [[S11, S21, S31, S41], [S12, S22, S32, S42], [S13, S23, S33, S43], [S14, S24, S34, S44]], + valid(Squares), + valid(Rows), + valid(Cols). + +valid([]). +valid([H|T]) :- + all_distinct(H), + valid(T). + +show([S1, S2, S3, S4, S5, S6, S7, S8, S9 | T]) :- + write(S1), + write(" | "), + write(S2), + write(" | "), + write(S3), + write(" | "), + write(S4), + write(" | "), + write(S5), + write(" | "), + write(S6), + write(" | "), + write(S7), + write(" | "), + write(S8), + write(" | "), + write(S9), + nl, + show(T).