Skip to content

Instantly share code, notes, and snippets.

@youxkei
Created June 24, 2021 12:11
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 youxkei/a1859a44a691b383da88dba3d96fb4da to your computer and use it in GitHub Desktop.
Save youxkei/a1859a44a691b383da88dba3d96fb4da to your computer and use it in GitHub Desktop.
A Puzzle A Day Solver
:- use_module(library(clpfd)).
:- use_module(library(lists)).
month_rows([
[[jan, _, _, _, _, _, xxx], [_, _, _, _, _, _, xxx]],
[[_, feb, _, _, _, _, xxx], [_, _, _, _, _, _, xxx]],
[[_, _, mar, _, _, _, xxx], [_, _, _, _, _, _, xxx]],
[[_, _, _, apr, _, _, xxx], [_, _, _, _, _, _, xxx]],
[[_, _, _, _, may, _, xxx], [_, _, _, _, _, _, xxx]],
[[_, _, _, _, _, jun, xxx], [_, _, _, _, _, _, xxx]],
[[_, _, _, _, _, _, xxx], [jul, _, _, _, _, _, xxx]],
[[_, _, _, _, _, _, xxx], [_, aug, _, _, _, _, xxx]],
[[_, _, _, _, _, _, xxx], [_, _, sep, _, _, _, xxx]],
[[_, _, _, _, _, _, xxx], [_, _, _, oct, _, _, xxx]],
[[_, _, _, _, _, _, xxx], [_, _, _, _, nov, _, xxx]],
[[_, _, _, _, _, _, xxx], [_, _, _, _, _, dec, xxx]]
]).
day_rows([
[[nn1, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, nn2, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, nn3, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, nn4, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, nn5, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, nn6, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, nn7], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [nn8, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, nn9, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, n10, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, n11, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, n12, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, n13, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, n14], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [n15, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, n16, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, n17, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, n18, _, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, n19, _, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, n20, _], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, n21], [_, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [n22, _, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, n23, _, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, n24, _, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, n25, _, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, n26, _, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, n27, _], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, n28], [_, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [n29, _, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, n30, _, xxx, xxx, xxx, xxx]],
[[_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, _, _, _, _, _], [_, _, n31, xxx, xxx, xxx, xxx]]
]).
zero_mino(aaa, aaa, aaa, aaa, aaa, aaa).
zero_mino([[E1, E2, E3 | _], [E4, E5, E6 | _] | _]) :-
zero_mino(E1, E2, E3, E4, E5, E6).
zero_mino([[E1, E4 | _], [E2, E5 | _], [E3, E6 | _] | _]) :-
zero_mino(E1, E2, E3, E4, E5, E6).
six_mino(_, bbb, bbb, bbb, bbb, bbb).
six_mino(bbb, bbb, _, bbb, bbb, bbb).
six_mino(bbb, bbb, bbb, _, bbb, bbb).
six_mino(bbb, bbb, bbb, bbb, bbb, _).
six_mino([[E1, E2, E3 | _], [E4, E5, E6 | _] | _]) :-
six_mino(E1, E2, E3, E4, E5, E6).
six_mino([[E1, E4 | _], [E2, E5 | _], [E3, E6 | _] | _]) :-
six_mino(E1, E2, E3, E4, E5, E6).
ko_mino(ccc, _, ccc, ccc, ccc, ccc).
ko_mino(ccc, ccc, ccc, ccc, _, ccc).
ko_mino([[E1, E2, E3 | _], [E4, E5, E6 | _] | _]) :-
ko_mino(E1, E2, E3, E4, E5, E6).
ko_mino([[E1, E4 | _], [E2, E5 | _], [E3, E6 | _] | _]) :-
ko_mino(E1, E2, E3, E4, E5, E6).
to_mino(_, ddd, _, _, ddd, ddd, ddd, ddd).
to_mino(_, _, ddd, _, ddd, ddd, ddd, ddd).
to_mino(ddd, ddd, ddd, ddd, _, ddd, _, _).
to_mino(ddd, ddd, ddd, ddd, _, _, ddd, _).
to_mino([[E1, E2, E3, E4 | _], [E5, E6, E7, E8 | _] | _]) :-
to_mino(E1, E2, E3, E4, E5, E6, E7, E8).
to_mino([[E1, E5 | _], [E2, E6 | _], [E3, E7 | _], [E4, E8 | _] | _]) :-
to_mino(E1, E2, E3, E4, E5, E6, E7, E8).
rifle_mino(_, _, eee, eee, eee, eee, eee, _).
rifle_mino(eee, eee, _, _, _, eee, eee, eee).
rifle_mino(eee, eee, eee, _, _, _, eee, eee).
rifle_mino(_, eee, eee, eee, eee, eee, _, _).
rifle_mino([[E1, E2, E3, E4 | _], [E5, E6, E7, E8 | _] | _]) :-
rifle_mino(E1, E2, E3, E4, E5, E6, E7, E8).
rifle_mino([[E1, E5 | _], [E2, E6 | _], [E3, E7 | _], [E4, E8 | _] | _]) :-
rifle_mino(E1, E2, E3, E4, E5, E6, E7, E8).
j_mino(_, _, _, fff, fff, fff, fff, fff).
j_mino(fff, _, _, _, fff, fff, fff, fff).
j_mino(fff, fff, fff, fff, _, _, _, fff).
j_mino(fff, fff, fff, fff, fff, _, _, _).
j_mino([[E1, E2, E3, E4 | _], [E5, E6, E7, E8 | _] | _]) :-
j_mino(E1, E2, E3, E4, E5, E6, E7, E8).
j_mino([[E1, E5 | _], [E2, E6 | _], [E3, E7 | _], [E4, E8 | _] | _]) :-
j_mino(E1, E2, E3, E4, E5, E6, E7, E8).
s_mino(_, _, ggg, ggg, ggg, ggg, ggg, _, _).
s_mino(ggg, _, _, ggg, ggg, ggg, _, _, ggg).
s_mino([[E1, E2, E3 | _], [E4, E5, E6 | _], [E7, E8, E9 | _] | _]) :-
s_mino(E1, E2, E3, E4, E5, E6, E7, E8, E9).
s_mino([[E1, E4, E7 | _], [E2, E5, E8 | _], [E3, E6, E9 | _] | _]) :-
s_mino(E1, E2, E3, E4, E5, E6, E7, E8, E9).
l_mino(_, _, hhh, _, _, hhh, hhh, hhh, hhh).
l_mino(hhh, _, _, hhh, _, _, hhh, hhh, hhh).
l_mino(hhh, hhh, hhh, _, _, hhh, _, _, hhh).
l_mino(hhh, hhh, hhh, hhh, _, _, hhh, _, _).
l_mino([[E1, E2, E3 | _], [E4, E5, E6 | _], [E7, E8, E9 | _] | _]) :-
l_mino(E1, E2, E3, E4, E5, E6, E7, E8, E9).
mino(Mino, Rows) :-
call(Mino, Rows).
mino(Mino, [_ | Rows]) :- call(Mino, Rows).
mino(Mino, [_, _ | Rows]) :- call(Mino, Rows).
mino(Mino, [_, _, _ | Rows]) :- call(Mino, Rows).
mino(Mino, [_, _, _, _ | Rows]) :- call(Mino, Rows).
mino(Mino, [_, _, _, _, _ | Rows]) :- call(Mino, Rows).
mino(Mino, Rows) :- transpose(Rows, [_ | Columns]), transpose(Columns, Rows1), call(Mino, Rows1).
mino(Mino, Rows) :- transpose(Rows, [_, _ | Columns]), transpose(Columns, Rows1), call(Mino, Rows1).
mino(Mino, Rows) :- transpose(Rows, [_, _, _ | Columns]), transpose(Columns, Rows1), call(Mino, Rows1).
mino(Mino, Rows) :- transpose(Rows, [_, _, _, _ | Columns]), transpose(Columns, Rows1), call(Mino, Rows1).
mino(Mino, Rows) :- transpose(Rows, [_, _, _, _, _ | Columns]), transpose(Columns, Rows1), call(Mino, Rows1).
mino(Mino, [_ | Rows]) :-
transpose(Rows, [_ | Columns]),
transpose(Columns, Rows1),
mino(Mino, Rows1).
solve(Month, Day, Result) :-
month_rows(MonthRows),
day_rows(DayRows),
nth1(Month, MonthRows, SelectedMonthRows),
nth1(Day, DayRows, SelectedDayRows),
append(SelectedMonthRows, SelectedDayRows, Result),
mino(zero_mino, Result),
mino(six_mino, Result),
mino(ko_mino, Result),
mino(to_mino, Result),
mino(rifle_mino, Result),
mino(j_mino, Result),
mino(s_mino, Result),
mino(l_mino, Result).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment