前言-686
:-lib(util),lib(sd). r(S,R):-string_list(S,L),g(L,R). g(L,[N1,N2,N3]):-append(L1,X,L),append(L2,L3,X),n(L1,N1),n(L2,N2),n(L3,N3). n([73,86],4). n([73,88],9). n([73,73,73],3). n([73,73],2). n([73],1). n([86],5). n([86|N],D):-n(N,E),E<4,D is E+5. n([88|N],D):-n(N,E),D is E+10. n([88],10). m(M,[X1,X2,X3,Y1,Y2,Y3,Z1,Z2,Z3]):-split_string(M,",","",[X,Y,Z]),r(X,[X1,X2,X3]),r(Y,[Y1,Y2,Y3]),r(Z,[Z1,Z2,Z3]). a(L):-alldifferent(L),L=[X1,X2,X3,Y1,Y2,Y3,Z1,Z2,Z3],l(X1,X2,X3,T),l(Y1,Y2,Y3,T),l(Z1,Z2,Z3,T),l(X1,Y1,Z1,T),l(X2,Y2,Z2,T),l(X3,Y3,Z3,T). l(A,B,C,T):-T is A+B+C. p:-read_line(S),findall(L,m(S,L),A),length(A,C),findall(L,(member(L,A),a(L)),B),(B=[_|_]->R=true;R=false),writeln((C,R)).
不打高尔夫球
% I : 73
% V : 86
% X : 88
:-lib(util).
:-lib(sd).
r(S,R) :- string_list(S,L), g(L,R).
g(L,[N1,N2,N3]):-
append(L1,X,L),
append(L2,L3,X),
n(L1,N1),n(L2,N2),n(L3,N3).
n([73,86],4).
n([73,88],9).
n([73,73,73],3).
n([73,73],2).
n([73],1).
n([86],5).
n([86|N],D):-n(N,E),E<4,D is E+5.
n([88|N],D):-n(N,E), D is E+10.
n([88],10).
m(M,[X1,X2,X3,Y1,Y2,Y3,Z1,Z2,Z3]) :-
split_string(M,",","",[X,Y,Z]),
r(X,[X1,X2,X3]),
r(Y,[Y1,Y2,Y3]),
r(Z,[Z1,Z2,Z3]).
a(L) :-
alldifferent(L),
L=[X1,X2,X3,Y1,Y2,Y3,Z1,Z2,Z3],
l(X1,X2,X3,T),
l(Y1,Y2,Y3,T),
l(Z1,Z2,Z3,T),
l(X1,Y1,Z1,T),
l(X2,Y2,Z2,T),
l(X3,Y3,Z3,T).
l(A,B,C,T):-T is A+B+C.
p :- read_line(S),
findall(L,m(S,L),A),
length(A,C),
findall(L,(member(L,A),a(L)),B),
(B=[_|_]->R=true;R=false),
writeln((C,R)).
当然p也可以定义为:
p :- read_line(S),
findall(L,m(S,L),A),
length(A,C),
findall(L,(member(L,A),a(L)),B),
writeln(C),
B=[_|_].
在这种情况下,环境会在写入平方数后说“是”或“否”。
例
使用eclipse。
[eclipse 105]: p.
VIIIIVI,IIIVVII,IVIXII
24, true
[eclipse 106]: p.
IIIXVIII,IVIII,VIIII
210, false
第二个示例结果粘贴在此处。