【出典】https://twitter.com/c_oi/status/301346035094126593 https://twitter.com/c_oi/status/301346039590436864
【引用】「0~3の数字を2個ずつ使ってできる年月日は21世紀(2001/01/01~2100/12/31)の間に何日間あるでしょう?」
【出典】https://twitter.com/c_oi/status/301346035094126593 https://twitter.com/c_oi/status/301346039590436864
【引用】「0~3の数字を2個ずつ使ってできる年月日は21世紀(2001/01/01~2100/12/31)の間に何日間あるでしょう?」
remove1(E, [E|Tail], Tail). remove1(E, [X|Tail], [X|List]) :- remove1(E, Tail, List). permutation([], []). permutation(List, [H|Tail]) :- remove1(H, List, List1), permutation(List1, Tail). 条件(L) :- permutation([0,0,1,1,2,2,3,3], L), L = [Y1, Y2, Y3, Y4, M1, M2, D1, D2], Y is (Y1 * 1000 + Y2 * 100 + Y3 * 10 + Y4), M is (M1 * 10 + M2), D is (D1 * 10 + D2), 年の条件(Y), 月日の条件(Y, M, D). 年の条件(Y) :- 2001 =< Y, Y =< 2100. 月日の条件(Y, M, D) :- 月の日数(Y, M, Days), 1 =< M, M =< 12, 1 =< D, D =< Days. 月の日数(_, 1, 31). 月の日数(Y, 2, 29) :- 閏年(Y), !. 月の日数(Y, 2, 28). 月の日数(_, 3, 31). 月の日数(_, 4, 31). 月の日数(_, 5, 31). 月の日数(_, 6, 30). 月の日数(_, 7, 31). 月の日数(_, 8, 31). 月の日数(_, 9, 30). 月の日数(_, 10, 31). 月の日数(_, 11, 30). 月の日数(_, 12, 31). 閏年(Y) :- Y mod 4 == 0, (Y mod 100 \== 0 ; Y mod 400 == 0). ?- setof(L, 条件(L), Ls), length(Ls, N). % N = 48