「AOJをPrologで挑戦」の編集履歴(バックアップ)一覧に戻る

AOJをPrologで挑戦 - (2013/06/06 (木) 15:51:40) のソース

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.