※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

aojの0000~0003までをPrologで書いてみた。
AOJはPrologに対応しておらず答え合わせはできないのでコードの正確性は不明。
入出力も適当に書いてある。
基本的な考え方だけあってれば自分的に正解みたいな感じとなっている。


main:-between(1,9,A),
	between(1,9,B),
		C is A * B,
		format('~d*~d=~d~n',[A,B,C]),fail.

siwake([],M,[],[]):-!.
siwake([X|Rest],M,[X|Downs],Ups):-M<X,siwake(Rest,M,Downs,Ups).
siwake([X|Rest],M,Downs,[X|Ups]):-X=<M,siwake(Rest,M,Downs,Ups).

q_sort([],[]):-!.
q_sort([M|Rest],Re):-siwake(Rest,M,Downs,Ups),
		q_sort(Downs,ReDowns),
		q_sort(Ups,ReUps),
		append(ReDowns,[M|ReUps],Re).
	

aoj1:-read(A),q_sort(A,Ans),[T1,T2,T3|Rest]=Ans,write([T1,T2,T3]).

calc_keta(Z,N,N):-Z<10.
calc_keta(Z,N,Ans):-9<Z,Z1 is Z//10,N1 is N+1,calc_keta(Z1,N1,Ans).
aoj2:-read([X,Y]),Z is X+Y,calc_keta(Z,1,Ans),write(Ans).
selects([],[]):-!.
selects([],Y):-!.
selects([X|Result],Data):-select(X,Data,Rest),selects(Result,Rest). 

check_delta([X,Y,Z]):-selects([X1,Y1,Z1],[X,Y,Z]),Z1*Z1 =:=X1*X1+Y1*Y1,!,true.
aoj3:-repeat,read(XYZ),check_delta(XYZ),write('ok'),fail.