このディレクトリの索引

# Prolog 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)の間に何日間あるでしょう?」 # '21世紀における0〜3の数字を2個ずつ使ってできる年月日の個数'(_個数) :- setof(_年月日ならび,_年月日ならび ^ 重複を許す年月日ならびの選択(_年月日ならび),LL), length(LL,_個数). 重複を許す年月日ならびの選択(_年月日ならび) :- 順列([0,0,1,1,2,2,3,3],8,_年月日ならび), '年月日ならびが日付範囲内であり、禁則に掛からない'(_年月日ならび). '年月日ならびが日付範囲内であり、禁則に掛からない'(_年月日ならび) :- '年月日ならびが日付範囲内であり、'(_年月日ならび), 禁則に掛からない(_年月日ならび). '年月日ならびが日付範囲内であり、'(_年月日ならび) :- _年月日ならび @>= [2,0,0,1,0,1,0,1], _年月日ならび @=< [2,1,0,0,1,2,3,1]. 禁則に掛からない(_年月日ならび) :- \+(禁則(_年月日ならび)). 禁則([_,_,_,_,0,2,3,_]) :- !. 禁則([_,_,_,_,2,_,_,_]) :- !. 禁則([_,_,_,_,3,_,_,_]) :- !. 禁則([_,_,_,_,1,3,_,_]) :- !. 禁則([_,_,_,_,_,_,3,3]) :- !. 禁則([_,_,_,_,_,_,3,2]) :- !. 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X).