このディレクトリの索引 http://pc12.2ch.net/test/read.cgi/tech/1250204272/420 # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # 車のナンバーや電車の切符の裏などにある4桁の数字。その数字を四則演算し10にするというクイズを解くプログラムをお願いします。 # 1 2 3 4 と言う4つの数字であれば、すべて足せば10になりますし # 2 3 5 7 は{(3+7)/2+5}で10になります。 # # 数字の順番は変えてもOK(上のように2357を3725と並び替えている) # 二つの数字をくっつけて1つにしてもOK(0 0 1 2を20-10) # # 数字を4つ入力し、全パターンを出力するプログラムをお願いします。 % 四則演算 と 置換([A,B|R],[C|R]) :- C is 10 * A + B t687(L,_式) :- 順列(L,4,L1), t687_1(L1,_式,10). t687_1([A],A,A). t687_1([A,B|R1],C,X) :- C is 10 * A + B, t687_1(R1,_式_2,Y). t687_1([A,B|R1],_式,X) :- \+(R1=[]), C is 10 * A + B, t687_1(R1,_式_2,Y), t687_2(C,_関数,Y,X), _式 =.. [_関数,C,_式_2]. t687_1([A|R1],_式,X) :- t687_1(R1,_式_2,Y), t687_2(A,_関数,Y,X), _式 =.. [_関数,A,_式_2]. t687_2(A,+,B,X) :- X is A + B. t687_2(A,-,B,X) :- X is A - B. t687_2(A,*,B,X) :- X is A * B. t687_2(A,//,B,X) :- 0 is A mod B, X is A // B. % *** user: 順列 / 4 *** 順列(Y,0,_,[]). 順列(Y,N,EL,[A|X]) :- \+(member(A,EL)), del(Z = Y - A), M is N - 1, 順列(Z,M,EL,X). 順列(Y,N,EL,[_|X]) :- member(A,EL), 順列(Z,M,EL,X). % *** user: 順列 / 3 *** 順列(Y,0,[]). 順列(Y,N,[A|X]) :- del(Z = Y - A), M is N - 1, 順列(Z,M,X). % *** user: del / 3 *** del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). % *** user: del / 1 *** del(X = [A|X] - A). del([B|Y] = [B|X] - A) :- del(Y = X - A). % *** user: 重複順列 / 3 *** 重複順列(L,N,X) :- length(X,N),重複順列(L,X). 重複順列(L,[]). 重複順列(L,[A|R]) :- member(A,L),重複順列(L,R).