このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/854
#  四つの塔がある。幽霊に任意の座標を与えたとき、そこから最も近くにある塔を出力しなさい。 
#   
#  塔A、B、C、Dの座標: 
#  A(2, 2) B(5, 2) C(2, 5) D(5, 5) 
#   
#  幽霊の座標: 
#  0≦y≦7, 0≦x≦7,  
#   
#  図1:塔の配置 
#  □□□□□□□□ 
#  □□□□□□□□ 
#  □□A □□B,□□ 
#  □□□□□□□□ 
#  □□□□□□□□ 
#  □□C □□D,□□ 
#  □□□□□□□□ 
#  □□□□□□□□ 
#   
#  図2:幽霊の座標(3, 3) 
#  □□□□□□□□ 
#  □□□□□□□□ 
#  □□A □□B,□□ 
#  □□□幽□□□□ 
#  □□□□□□□□ 
#  □□C □□D,□□ 
#  □□□□□□□□ 
#  □□□□□□□□ 
#   
#  入力と出力例: 
#  in  : (3, 3) 
#  out : A 
# 
# 


塔('A',2,2).
塔('B',5,2).
塔('C',2,5).
塔('D',5,5).


'四つの塔がある。幽霊に任意の座標を与えたとき、そこから最も近くにある塔を出力しなさい。' :-
'幽霊に任意の座標を与えたとき、'(X,Y),
'そこから最も近くにある塔を出力しなさい。'(X,Y).


'幽霊に任意の座標を与えたとき、'(X,Y) :-
整数を得る('幽霊のX座標',(X >= 0,X =< 7),X),
整数を得る('幽霊のY座標',(Y >= 0,Y =< 7),Y).


'そこから最も近くにある塔を出力しなさい。'(X,Y) :-
幽霊と四つの塔との距離ならび(_距離と塔ならび),
最短距離は(_距離と塔ならび,_最短距離),
'最も近くにある塔を出力しなさい。'(_距離と塔ならび,_最短距離).


幽霊と四つの塔との距離ならび(_距離と塔ならび) :-
findall([_距離,_塔],(塔(_塔,_x,_y),_距離 is abs(X - _x) + abs(Y - _Y)),_距離と塔ならび).


最短距離は(_距離と塔ならび,_最短距離) :-
findmin(_距離,member([_距離,_],_距離と塔ならび),_最短距離).


'最も近くにある塔を出力しなさい。'(_距離と塔ならび,_最短距離) :-
forall(member([_最短距離,_塔],_距離と塔ならび),writef('%t\n',[_塔])).