このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/555
#  お題:円の中心点と半径が与えられるとき、その円と円の内部に 
#  含まれる格子点(座標成分がすべて整数になる点)の個数を数える。 
#  例) 
#  ? 1 1 1 
#  5 
#  ? 0.5 0.5 1 
#  4 
# 
# 

'円の中心点と半径が与えられるとき、その円と円の内部に
含まれる格子点(座標成分がすべて整数になる点)の個数を数える。'(_円の中心点x座標,_円の中心点y座標,_半径,_円の内部に含まれる格子点の個数) :-
調べるべき座標範囲を得る(_円の中心点x座標,_円の中心点y座標,_半径,_調べるべきx座標下限,_調べるべきx座標上限,_調べるべきy座標下限,_調べるべきy座標上限),
count((
円の内部に含まれる格子点候補(_調べるべきx座標下限,_調べるべきx座標上限,_調べるべきy座標下限,_調べるべきy座標上限,X,Y),
'点(X,Y)は円の内部にある'(_円の中心点x座標,_円の中心点y座標,_半径,X,Y)),_円の内部に含まれる格子点の個数).

調べるべき座標範囲を得る(_円の中心点x座標,_円の中心点y座標,_半径,_調べるべきx座標下限,_調べるべきx座標上限,_調べるべきy座標下限,_調べるべきy座標上限) :-
_調べるべきx座標下限 is truncate(_円の中心点x座標 - _半径),
_調べるべきx座標上限 is truncate(_円の中心点x座標 + _半径 + 0.5),
_調べるべきy座標下限 is truncate(_円の中心点y座標 - _半径),
_調べるべきy座標上限 is truncate(_円の中心点y座標 + _半径 + 0.5).

円の内部に含まれる格子点候補(_調べるべきx座標下限,_調べるべきx座標上限,_調べるべきy座標下限,_調べるべきy座標上限,X,Y) :-
between(_調べるべきx座標下限,_調べるべきx座標上限,X),
between(_調べるべきy座標下限,_調べるべきy座標上限,Y).

'点(X,Y)は円の内部にある'(_円の中心点のx座標,_円の中心点のy座標,_半径,X,Y) :-
(X - _円の中心点のx座標) ^ 2 + (Y - _円の中心点のy座標) ^ 2 =< _半径 ^ 2.

count(P,Count) :-
findall(1,P,L),
length(L,Count).