21世紀における0~3の数字を2個ずつ使ってできる年月日の個数

【出典】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