このディレクトリの索引

% 以下のサイトは 等差数列([_],_公差) :- var(_公差),!,fail. 等差数列(_等差数列,_公差) :- 等差数列とは公差確定問題である(_等差数列,_公差). 等差数列とは公差確定問題である([_],_公差). 等差数列とは公差確定問題である([V|_等差数列],_公差) :- '先頭要素が変数の時、後続の数列が等差数列で公差が決まれば、後続の等差数列の先頭要素と公差からVが求まる'([V|_等差数列],_公差). 等差数列とは公差確定問題である([A,B|_等差数列],_公差) :- 先頭要素と公差が変数でない時は後続の等差数列は順に解決できる([A,B|_等差数列],_公差). 等差数列とは公差確定問題である([A|_等差数列],_公差) :- '公差が変数でAは変数でない時は、次の変数でない要素とそれまでの要素数から公差を推計して、等差数列部分を確定していく'([A|_等差数列],_公差). '先頭要素が変数の時、後続の数列が等差数列で公差が決まれば、後続の等差数列の先頭要素と公差からVが求まる'([V|_等差数列],_公差) :- 変数である(V), 等差数列(_等差数列,_公差), _等差数列 = [_後続の等差数列の先頭要素|_], V is _後続の等差数列の先頭要素 - _公差. 先頭要素と公差が変数でない時は後続の等差数列は順に解決できる([A,B|_等差数列],_公差) :- 先頭要素と公差が変数でない時は(A,_公差), 後続ならびは順に解決できる([A,B|_等差数列],_公差). 先頭要素と公差が変数でない時は(A,_公差) :- 変数ではない(A), 変数ではない(_公差). 後続ならびは順に解決できる([A,B|_等差数列],_公差) :- B is A + _公差, 等差数列([B|_等差数列],_公差). '公差が変数でAは変数でない時は、次の変数でない要素とそれまでの要素数から公差を推計して、等差数列部分を確定していく'([A|_等差数列],_公差) :- 公差が変数でAは変数でない時は(A,_公差), 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,_次の変数でない要素,_変数ならび,_残り等差数列,_公差), 等差数列部分を確定していく(A,_次の変数でない要素,_変数ならび,_残り等差数列,_公差). 公差が変数でAは変数でない時は(A,_公差) :- 変数である(_公差), 変数ではない(A). 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,A,[],[],_公差) :- '等差数列が全て変数の時は変数は全てAとなり公差は0'(A,_等差数列,_公差),!. 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,_次の変数でない要素,_変数ならび,_残りならび,_公差) :- 次の変数でない要素とそれまでの要素数から(_等差数列,_次の変数でない要素,_変数ならび,_残りならび), 公差を推計して(A,_次の変数でない要素,_変数ならび,_公差). 等差数列が全て変数の時は変数は全てAとなり公差は0(A,_等差数列,0) :- 等差数列が全て変数の時は(_等差数列), 変数は全てAとなり(A,_等差数列). 等差数列が全て変数の時は(_等差数列) :- forall(member(V,_等差数列),var(V)). 変数は全てAとなり(_等差数列,A) :- findall(A,member(_,_等差数列),_等差数列). 次の変数でない要素とそれまでの要素数から(_等差数列,_次の変数でない要素,_変数ならび,_残りならび) :- append(_変数ならび,[_次の変数でない要素|_残りならび],_等差数列), 要素は全て変数である(_変数ならび), 変数ではない(_次の変数でない要素). 要素は全て変数である(_変数ならび) :- forall(member(_変数,_変数ならび),変数である(_変数)). 公差を推計して(A,_次の変数でない要素,_変数ならび,_公差) :- length([_|_変数ならび],_分割数), _公差 is (_次の変数でない要素 - A) / _分割数. 等差数列部分を確定していく(A,B,L1,R2,_公差) :- 等差数列([A|L1],_公差), 等差数列([B|R2],_公差). 変数である(_変数) :- var(_変数). 変数ではない(_変数ではない項) :- \+(var(_変数ではない項)). % 以下のサイトは 等差数列([_],_公差) :- var(_公差),!,fail. 等差数列(_等差数列,_公差) :- 等差数列とは公差確定問題である(_等差数列,_公差),!. 等差数列とは公差確定問題である([_],_公差). 等差数列とは公差確定問題である([V|R],_公差) :- var(V), 等差数列(R,_公差), R = [B|_], V is B - _公差,!. 等差数列とは公差確定問題である([A,B|R],_公差) :- 変数ではない(A), 変数ではない(_公差), B is A + _公差, 等差数列([B|R],_公差). 等差数列とは公差確定問題である([A|R],_公差) :- var(_公差), 変数ではない(A), append(L1,[B|R2],R), forall(member(V,L1),var(V)), 変数ではない(B), length([_|L1],N), _公差 is (B - A) / N,!, 等差数列([A|L1],_公差), 等差数列([B|R2],_公差),!. 変数ではない(A) :- \+(var(A)). % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(0,[0]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(1,[0,1]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(N,_フィボナッチ数列) :- 初期化(N,L), 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N), findall(_フィボナッチ数,フィボナッチ数(_,_フィボナッチ数),_フィボナッチ数列). 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C), L1=[],!. フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C) :- フィボナッチ数(B,_一つ前のフィボナッチ数), フィボナッチ数(C,_二つ前のフィボナッチ数), _フィボナッチ数 is _一つ前のフィボナッチ数 + _二つ前のフィボナッチ数, フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数). フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数) :- \+(フィボナッチ数(A,_)), assertz(フィボナッチ数(A,_フィボナッチ数)). 初期化(N,L) :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)), 'Nから0までの逆順リストを用意する'(N,L). 'Nから0までの逆順リストを用意する'(N,L) :- findall(M,between(0,N,M),L1), reverse(L1,L). % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(0,[0]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(1,[0,1]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(N,_) :- 初期化(N,L), 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N). 'repeat-failループでのフィボナッチ数列の計算'(_,_フィボナッチ数列) :- findall(M,フィボナッチ数(_,M),_フィボナッチ数列). 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C), (L1=[],!,fail;fail). フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C) :- フィボナッチ数(B,_一つ前のフィボナッチ数), フィボナッチ数(C,_二つ前のフィボナッチ数), _フィボナッチ数 is _一つ前のフィボナッチ数 + _二つ前のフィボナッチ数, フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数). フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数) :- \+(フィボナッチ数(A,_)), assertz(フィボナッチ数(A,_フィボナッチ数)). 初期化(N,L) :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)), 'Nから0までの逆順リストを用意する'(L). 'Nから0までの逆順リストを用意する'(N,L) :- findall(M,between(0,N,M),L1), reverse(L1,L). % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(N,_) :- 初期化, findall(M,between(0,N,M),L1), reverse(L1,L2), フィボナッチ数の解決(L2,N). 'repeat-failループでのフィボナッチ数列の計算'(_,_フィボナッチ数列) :- findall(M,フィボナッチ数(_,M),_フィボナッチ数列). 初期化 :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)). フィボナッチ数の解決(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数(B,V_1), フィボナッチ数(C,V_2), V is V_1 + V_2, \+(フィボナッチ数(A,V)), assertz(フィボナッチ数(A,V)), (L1=[],!,fail;fail). % 以下のサイトは :- dynamic(フィボナッチ数/2). :- dynamic(id/1). 'repeat-failループでのフィボナッチ数列の計算'(N,_フィボナッチ数) :- フィボナッチ数プログラムの初期化(N), フィボナッチ数の解決(N). 'repeat-failループでのフィボナッチ数列の計算'(N,_フィボナッチ数) :- フィボナッチ数(N,_フィボナッチ数). フィボナッチ数プログラムの初期化(N) :- フィボナッチ数とidをabolish, フィボナッチ数0番目と1番目の定義, フィボナッチ数構造の定義(N). フィボナッチ数とidをabolish :- abolish(フィボナッチ数/2), abolish(id/1). フィボナッチ数0番目と1番目の定義 :- assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)). フィボナッチ数構造の定義(N) :- between(2,N,M), asserta(id(M)), asserta(フィボナッチ数(M,V)), N = M. フィボナッチ数の解決(N) :- 先頭のidから順にMとVを得る(M,V), (idの先頭データのフィボナッチ数が解決済みならば(M,N,V),!,fail; 'Vが未解決の時は、フィボナッチ数を二つ前と一つ前のフィボナッチ数の和に更新する'(M,V)). 先頭のidから順にMとVを得る(M,V) :- 先頭のidから順にMと(M), 'Vを得る'(M,V). 先頭のidから順にMと(M) :- repeat, id(M). 'Vを得る'(M,V) :- フィボナッチ数(M,V). idの先頭データのフィボナッチ数が解決済みならば(M,N,V) :- M = N, integer(V). 'Vが未解決の時は、フィボナッチ数を二つ前と一つ前のフィボナッチ数の和に更新する'(M,V) :- 'Vが未解決の時は'(V), 二つ前のフィボナッチ数と一つ前のフィボナッチ数を得る(M,V_1,V_2), 'V_1とV_2が共に整数の時はVはV_1とV_2の和である'(V_1,V_2,V), フィボナッチ数の更新(M,V), fail. 'Vが未解決の時は'(V) :- \+(integer(V)). 二つ前のフィボナッチ数と一つ前のフィボナッチ数を得る(M,V_1,V_2) :- 二つ前のフィボナッチ数と(M,V_2), 一つ前のフィボナッチ数を得る(M,V_1). 二つ前のフィボナッチ数と(M,V_2) :- M_2 is M - 2, フィボナッチ数(M_2,V_2). 一つ前のフィボナッチ数を得る(M,V_1) :- succ(M_1,M), フィボナッチ数(M_1,V_1). 'V_1とV_2が共に整数の時はVはV_1とV_2の和である'(V_1,V_2,V) :- integer(V_1), integer(V_2), V is V_1 + V_2. フィボナッチ数の更新(M,V) :- retract(フィボナッチ数(M,_)), assertz(フィボナッチ数(M,V)). % 以下のサイトは フィボナッチ数列を20個目までカンマ区切りで出力する :- フィボナッチ数列を20個目までの数列の枠を作り初期値を埋める(_数列の枠), フィボナッチ数で数列の枠を埋める(_数列の枠), フィボナッチ数列をカンマ区切りで出力する(_数列の枠). フィボナッチ数列を20個目までの数列の枠を作り初期値を埋める(_数列の枠) :- length(_数列の枠,20), _数列の枠 = [1,1|_]. フィボナッチ数で数列の枠を埋める([_,_]). フィボナッチ数で数列の枠を埋める([_二つ前のフィボナッチ数,_一つ前のフィボナッチ数,_フィボナッチ数|R]) :- フィボナッチ数は二つ前のフィボナッチ数に一つ前のフィボナッチを加えたものです(_二つ前のフィボナッチ数,_一つ前のフィボナッチ数,_フィボナッチ数), フィボナッチ数で数列の枠を埋める([_一つ前のフィボナッチ数,_フィボナッチ数|R]). フィボナッチ数は二つ前のフィボナッチ数に一つ前のフィボナッチを加えたものです(_二つ前のフィボナッチ数,_一つ前のフィボナッチ数,_フィボナッチ数) :- _フィボナッチ数 is _二つ前のフィボナッチ数 + _一つ前のフィボナッチ数. フィボナッチ数列をカンマ区切りで出力する(_数列の枠) :- atomic_list_concat(_数列の枠,',',_フィボナッチ数列出力文字列), writef('%t\n',[_フィボナッチ数列出力文字列]). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #466 # お題 # 昇順の数列A[a0,a1,..,an]とAの要素amを一つ指定する # Aの要素からなる数列Bを与えて[am,am+1,..,an,a0,a1,..,am-1]の順番で整列させよう # 例 # 入: A = [2,3,5,7,9], a = 2, B = [9,2,5] # 出: [2,5,9] # 入: A = [2,3,5,7,9], a = 9, B = [9,2,5] # 出: [9,2,5] # 入: A = [2,3,5,7,9], a = 5, B = [9,2,5] # 出: [5,9,2] # 入: A = [2,3,5,7,9], a = 3, B = [9,2,5,5,2] # 出: [5,5,9,2,2] '昇順の数列A[a0,a1,..,an]とAの要素amを一つ指定する Aの要素からなる数列Bを与えて[am,am+1,..,an,a0,a1,..,am-1]の順番で整列させよう'(A,_am,B,_整列したならび) :- '[am,am+1,..,an,a0,a1,..,am-1]の順番で'(A,_am,_順番ならび), 整列させよう(B,_順番ならび,_整列したならび). '[am,am+1,..,an,a0,a1,..,am-1]の順番で'(A,_am,_順番ならび) :- append(L1,[_am|L2],A), append([_am|L2],L1,_順番ならび),!. 整列させよう(B,_順番ならび,_整列したならび) :- findall(_a,( append(L0,[_a|_],_順番ならび), \+(member(_a,L0)), member(_a,B)), _整列したならび). % 以下のサイトは '与えられた数値を先頭から順に桁ごとに区切って使って数列を作りる'(_与えられた数値,_全数値分割) :- number_chars(_与えられた数値,_数字ならび), findall(_数値分割,( 数字ならびから数値分割(_数字ならび,_数値分割)), _全数値分割). 数字ならびから数値分割([],[]). 数字ならびから数値分割(_数字ならび,[N|LL2]) :- append(L1,L2,_数字ならび), number_chars(N,L1), 数字ならびから数値分割(L2,LL2). % 以下のサイトは # お題:与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。 # 例:123は、1,23 1,2,3 12,3のように分割出来る。 # 1,23 ---> 22*22 ---> 484 # 1,2,3 ---> 1*1+1*1 --> 2 # 12,3 ---> 9*9 ---> 81 # です。 '与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、 隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。'(_与えられた数値列,_隣り合う数の差の二乗の合計が最大になるような分割) :- '与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、'(_与えられた数値,_全数値分割), '隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。'(_全数値分割,_隣り合う数の差の二乗の合計が最大になるような分割). '与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、'(_与えられた数値,_全数値分割) :- number_chars(_与えられた数値,_数字ならび), findall(_数値分割,( 数字ならびから数値分割(_数字ならび,_数値分割)), _全数値分割). 数字ならびから数値分割([],[]). 数字ならびから数値分割(_数字ならび,[N|LL2]) :- append(L1,L2,_数字ならび), number_chars(N,L1), 数字ならびから数値分割(L2,LL2). '隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。'(_全数値分割,_隣り合う数の差の二乗の合計が最大になるような分割) :- findall(_隣り合う数の差の二乗の合計,( member(_分割,_全数値分割), '隣り合う数の「差の二乗」の合計が'(_分割,_隣り合う数の差の二乗の合計)), _隣り合う数の差の二乗の合計ならび), 最大になるような分割(_全数値分割,_隣り合う数の差の二乗の合計ならび,_合計の最大値). '隣り合う数の「差の二乗」の合計が'(_全数値分割,_隣り合う数の差の二乗の合計) :- findsum(_隣り合う数の差の二乗,( append(_,[N1,N2|_],_全数値分割), _隣り合う数の差の二乗 is (N1 - N2) ^ 2), _隣り合う数の差の二乗の合計). 最大になるような分割(_全数値分割,_隣り合う数の差の二乗の合計ならび,_隣り合う数の差の二乗の合計が最大になるような分割) :- 最大になる(_隣り合う数の差の二乗の合計ならび,_位置,_合計の最大値), nth1(_位置,_全数値分割,_隣り合う数の差の二乗の合計が最大になるような分割). 最大になる(_隣り合う数の差の二乗の合計ならび,_位置,_合計の最大値) :- append(L1,[_合計の最大値|L2],_隣り合う数の差の二乗の合計ならび), forall(member(N1,L1),N1 =< _合計の最大値), forall(member(N2,L2),N2 =< _合計の最大値), length([_|L1],_位置). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは '1+3+5=9=3*3はA1+A2+A3=B=n*nになりますよね。 Bの平方根がnであるとき、ある整数BからAnをすべて求める方法を教えてください。 ただしA1..Anは全て奇数の一意数であり昇順に並んでいます'(B,_A1__An) :- 'Bの平方根はnである'(B,_n), '反転した1から始まる公差2の等差数列を求める'(_n,_反転した1から始まる公差2のn要素の等差数列), reverse(_反転した1から始まる公差2のn要素の等差数列,_A1__An). 'Bの平方根はnである'(B,_n) :- _n is sqrt(B), integer(_n). '反転した1から始まる公差2のn要素の等差数列を求める'(1,[1]) :- !. '反転した1から始まる公差2のn要素の等差数列を求める'(2,[3,1]) :- !. '反転した1から始まる公差2のn要素の等差数列を求める'(3,[5,3,1]) :- !. '反転した1から始まる公差2のn要素の等差数列を求める'(_n,[_m_2|[_m|R]]) :- '1を引く'(_n,_n_1), '反転した1から始まる公差2のn要素の等差数列を求める'(_n_1,[_m|R]), '2を足す'(_m,_m_2). '1を引く'(_n,_n_1) :- succ(_n_1,_n). '2を足す'(_m,_m_2) :- succ(_m,_m_1), succ(_m_1,_m_2). % 以下のサイトは '1+3+5=9=3*3はA1+A2+A3=B=n*nになりますよね Bの平方根がnであるとき、ある整数BからAnをすべて求める方法を教えてください ただしA1..Anは全て奇数の一意数であり昇順に並んでいます'(B,_A1__An) :- _n is sqrt(B), '1から始まる公差2のn要素の等差数列'(_n,_A1__An). '1から始まる公差2のn要素の等差数列'(_n,_1から始める公差2のn要素の等差数列) :- length(_1から始める公差2のn要素の等差数列,_n), _1から始める公差2のn要素の等差数列 = [1|_], '反転して公差-2にして等差数列を求める'(_1から始める公差2のn要素の等差数列). '反転して公差-2にして等差数列を求める'(L) :- reverse(L,L2), '等差数列'(L2,-2). % 以下のサイトは # 【問題】 # ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。 # 【例】 # 1 3 4 7 11 6 8 9 7 10 13 14 # # これを昇順に並び替えると # 1 3 4 6 7 7 8 9 10 11 13 14 # # となります。つまり、最初の整数列の、4番目から10番目を並び替えれば良いことになります。このとき、 # 4..10 # # と出力してください。もし、ソートする必要がなければ、 # 0 # # と出力してください。 # # 【解答方法】 # まずはsort.zipをダウンロードしてください。 # 中には6つのファイルが含まれています。 # # answer.txt # 解答用テキストファイルです。 # # input_case_1.txt # input_case_2.txt # input_case_3.txt # input_case_4.txt # input_case_5.txt # 整数列が含まれたデータファイルです。これらを入力として得られた結果を解答していただきます。 # データファイルの整数列は、改行区切りになっています。 # # answer.txtに必要事項を記入し、テキストファイルのままアップロードしてください。 # ※answer.txt以外のファイルをzipに固めてアップロードした場合は評価対象外となります。 # :- op(600,xfx,'::'). 'ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。'(_整数列,_開始位置 :: _終了位置) :- 範囲の開始位置(_整数列,_開始位置), 範囲の終了位置(_整数列,_終了位置),!. 'ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。'(_,0). 範囲の開始位置(L,_開始位置) :- append(L1,[A|L2],L), 'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2),!, length([_|L1],_開始位置). 範囲の終了位置(L,_終了位置) :- reverse(L,LR), append(L1,[A|L2],LR), 'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2),!, length([A|L2],_終了位置). 'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2) :- member(B,L1), B > A. 'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2) :- member(B,L2), B < A. 'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2) :- member(B,L1), B < A. 'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2) :- member(B,L2), B > A. % 以下のサイトは ?- 'a##'. # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/212 # お題:与えられた数列を以下のルールで縮小せよ # (a) 4つ以上連続した数を消す (複数ある場合は一番左を優先する) # (b) (a)を繰り返す # 例: # ------- # in : 11233344433331111143322211 # out: # 11233344433331111143322211 # 1123334441111143322211 # 11233344443322211 # 1123333322211 # 11222211 # 1111 # # ------- # in : 1122224411112222 # out: # 1122224411112222 # 114411112222 # 11442222 # 1144 # ------- # in : 211222211333312 # out: # 211222211333312 # 21111333312 # 2333312 # 212 # # '4つ以上連続した数を消す (複数ある場合は一番左を優先する)'(_数_1,_数_2) :- number_chars(_数_1,Chars_1), '4要素以上の連続した文字ならびを切り取る'(Chars_1,Chars_2), number_chars(_数_2,Chars_2),!. '4要素以上の連続した文字ならびを切り取る'(Chars_1,Chars_2) :- '4要素以上の連続する最初の文字ならびを切り取る'(Chars_1,Chars_3), '4要素以上の連続した文字ならびを切り取る'(Chars_3,Chars_2). '4要素以上の連続した文字ならびを切り取る'(Chars,Chars). '4要素以上の連続する最初の文字ならびを切り取る'(Chars_1,Chars_3) :- '4要素以上の連続する最初の文字ならびを'(Chars_1,L1,L3), 切り取る(L1,L3,Chars_3). '4要素以上の連続する最初の文字ならびを'(Chars_1,L1,L3) :- append(L1,L2,L3,Chars_1), all(L2,_文字), \+(L3 = [_文字|_]), L2 = [_,_,_,_|_],!. 切り取る(L1,L3,Chars_3) :- append(L1,L3,Chars_3). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # お題: # 例:数列[3,1,-7,1,5]について、 # ->[4,-3,-2,3] (累計) # ->12 (絶対値の合計) # のように計算する。 # 最初の数列の並び順を変えると、最後の合計計も変わる。 # 任意数列について、上記合計が最小になるように並び替える関数を作成 '例:数列[3,1,-7,1,5]について、 ->[4,-3,-2,3] (累計) ->12 (絶対値の合計) のように計算する。 任意数列について、上記合計が最小になるように並び替える'(_数列,_最小となる数列) :- 絶対値の合計が最小になるように並び替える(_数列,_最小となる数列). 絶対値の合計が最小になるように並び替える(_数列,_絶対値の合計が最小となる順列) :- length(_数列,_要素数), findall([_絶対値の合計,_順列],( 順列(_数列,_要素数,_順列), 絶対値の合計(_順列,_絶対値の合計)), _絶対値_数列ならび), 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_絶対値の合計が最小となる数列). 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_絶対値の合計が最小となる数列) :- findmin(_絶対値,( member([_絶対値,_],_絶対値_数列ならび)), _最小の絶対値), member([_最小の絶対値,_絶対値の合計が最小となる数列],_絶対値_数列ならび). 絶対値の合計([_値],_絶対値の合計) :- _絶対値の合計 is abs(_値),!. 絶対値の合計(_値ならび,_絶対値の合計) :- 累計の途中経過を得る(_値ならび,_累計の途中経過ならび), 要素の絶対値の合計(_累計の途中経過ならび,_絶対値の合計). 累計の途中経過を得る([_],[]). 累計の途中経過を得る([_数_1,_数_2|R1],[_累計の途中経過|R2]) :- _累計の途中経過 is _数_1 + _数_2, 累計の途中経過を得る([_数_3|R1],R2). 要素の絶対値の合計(_累計の途中経過ならび,_絶対値の合計) :- findsum(_絶対値,( member(_値,_累計の途中経過ならび), _絶対値 is abs(_値)), _絶対値の合計). 順列(_,0,[]). 順列(L1,N,[A|R]) :- select(A,L1,R1), N_1 is N - 1, 順列(R1,N_1,R). findmin(V,P,Min) :- findall(V,P,L), min(L,Min). % 以下のサイトは # お題: # 例:数列[3,1,-7,-1,5]について、 # ->[4,-3,-2,3] (累計) # ->12 (絶対値の合計) # のように計算する。 # 最初の数列の並び順を変えると、最後の合計計も変わる。 # 任意数列について、上記合計が最小になるように並び替える関数を作成 '例:数列[3,1,-7,-1,5]について、 ->[4,-3,-2,3] (累計) ->12 (絶対値の合計) のように計算する。 任意数列について、上記合計が最小になるように並び替える'(_数列,_最小となる数列) :- 絶対値の合計が最小になるように並び替える(_数列,_最小となる数列). 絶対値の合計が最小になるように並び替える(_数列,_絶対値が最小となる数列) :- length(_数列,_要素数), findall([_絶対値の合計,_順列],( 順列(_数列,_要素数,_順列), 絶対値の合計(_順列,_絶対値の合計)), _絶対値_数列ならび), 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_絶対値の合計が最小となる数列). 絶対値の合計(_数列,_絶対値の合計) :- 数列から累計を得る(_数列,_累計数列), 絶対値の合計を得る(_累計数列,_絶対値の合計). 数列から累計を得る([_数],_数) :- !. 数列から累計を得る([_数_1,_数_2|R1],[_数_3|R2]) :- _数_3 is _数_1 + _数_2, 数列から累計を得る([_数_3|R1],R2). 絶対値の合計を得る([],0). 絶対値の合計を得る([N|R1],_合計) :- 絶対値の合計を得る(R1,_合計_2), _合計 is abs(N) + _合計_2. 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_絶対値の合計が最小となる数列) :- findmin(_絶対値,( member([_絶対値,_],_絶対値_数列ならび)), _最小の絶対値), member([_最小の絶対値,_絶対値の合計が最小となる数列],_絶対値_数列ならび). 順列(_,0,[]). 順列(L1,N,[A|R]) :- select(A,L1,R1), N_1 is N - 1, 順列(R1,N_1,R). findmin(V,P,Min) :- findall(V,P,L), min(L,Min). % 以下のサイトは # お題:値が整数のn個の数列がある。隣同士の項の和の数列をつくる。 # この操作を繰り返して項が1個になったらその値を返す。 # 例 # 31,41,59,2 -> 333 # 31,41,59,2 # →(31+41),(41+59),(59+2) # →(31+41+41+59),(41+59+59+2) # →(31+41+41+59+41+59+59+2) # 三角数と初めの数列の長さに関係してる。数学問題だな '値が整数のn個の数列がある。隣同士の項の和の数列をつくる。この操作を繰り返して項が1個になったらその値を返す。'([_1個になったらその値],_1個になったらその値) :- !. '値が整数のn個の数列がある。隣同士の項の和の数列をつくる。この操作を繰り返して項が1個になったらその値を返す。'(_値が整数の数列,_1個になったらその値) :- \+(_値が整数の数列 = []), findall(_隣同士の項の和,( append(_,[_項_1,_項_2|_],_値が整数の数列), _隣同士の項の和 is _項_1 + _項_2), _隣同士の項の和の数列), '値が整数のn個の数列がある。隣同士の項の和の数列をつくる。この操作を繰り返して項が1個になったらその値を返す。'(_隣同士の項の和の数列,_1個になったらその値). % 以下のサイトは # # フィボナッチ数列によるFizzBuzz # フィボナッチ数列を表示してのFizzBuzz(N) :- fibfizzbuzz(N). fibfizzbuzz(N) :- fibfizzbuzz_2(1,0,1,Y,FizzBuzz), writef('%t ',[FizzBuzz]), Y = N. fibfizzbuzz(N,_1,_2,Y,FizzBuzz) :- _4 is _1 + _2, fibfizzbuzz_2(N,_2,_4,Y,FizzBuzz). fibfizzbuzz_2(1,0,1,1,1). fibfizzbuzz_2(N,_2,_4,N,FizzBuzz) :- N > 1, fizzbuzz診断(N,_4,FizzBuzz). fibfizzbuzz_2(N,_2,_4,Y,FizzBuzz) :- N_2 is N + 1, fibfizzbuzz(N_2,_2,_4,Y,FizzBuzz). fizzbuzz診断(_,_4,'FizzBuzz') :- 0 is _4 mod 15,!. fizzbuzz診断(_,_4,'Fizz') :- 0 is _4 mod 3,!. fizzbuzz診断(_,_4,'Buzz') :- 0 is _4 mod 5,!. fizzbuzz診断(_,_4,_4). % 以下のサイトは # # フィボナッチ数列によるFizzBuzz # フィボナッチ数列番号と見てのFizzBuzz(N) :- fibfizzbuzz(N). fibfizzbuzz(N) :- fibfizzbuzz_2(1,0,1,Y,FizzBuzz), writef('%t ',[FizzBuzz]), Y = N. fibfizzbuzz(N,_1,_2,Y,FizzBuzz) :- _4 is _1 + _2, fibfizzbuzz_2(N,_2,_4,Y,FizzBuzz). fibfizzbuzz_2(1,0,1,1,1). fibfizzbuzz_2(N,_2,_4,N,FizzBuzz) :- N > 1, fizzbuzz診断(N,_4,FizzBuzz). fibfizzbuzz_2(N,_2,_4,Y,FizzBuzz) :- N_2 is N + 1, fibfizzbuzz(N_2,_2,_4,Y,FizzBuzz). fizzbuzz診断(_,_4,'FizzBuzz') :- 0 is _4 mod 15,!. fizzbuzz診断(_,_4,'Fizz') :- 0 is _4 mod 3,!. fizzbuzz診断(_,_4,'Buzz') :- 0 is _4 mod 5,!. fizzbuzz診断(N,_4,N). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/751 # # (sum, kosu)に対して、 # sum = a1 + ・・・  + an ( n <= kosu , 1 <= ai <= 4 ) # を満たす、数列 (a1,・・・ ,an)は何通りあるか? # # '(sum, kosu)に対して、sum = a1 + ・・・  + an ( n <= kosu , 1 <= ai <= 4 ) を満たす、数列 (a1,・・・ ,an)は何通りあるか? '(_sum,_kosu,_何通り) :- findall(_n,between(1,_n,_kosu),_1からの_kosuまでの整数ならび), count('(sum, kosu)に対して、sum = a1 + ・・・  + an ( n <= kosu , 1 <= ai <= 4 ) を満たす、数列 (a1,・・・ ,an)'(_1からの_kosuまでの整数ならび,_sum,_kosu,L),_何通り). '(sum, kosu)に対して、sum = a1 + ・・・  + an ( n <= kosu , 1 <= ai <= 4 ) を満たす、数列 (a1,・・・ ,an)'(_1からの_kosuまでの整数ならび,_sum,_kosu,L) :- between(1,_n,_kosu), 組み合わせ(_1からの_kosuまでの整数ならび,_n,L), sum(L,_sum). % 以下のサイトは # 御題 # # 1から100までの数を出力するプログラムを書け。 # ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 # 素数のときは 'Prime' と出力し、 # フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 # また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。 '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。' :- '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(1,0,1). '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_,_) :- _数 > 100,!. '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2,_fib_1_2,_fib_2_2), _数_2 is _数_1 + 1, '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_2,_fib_1_2,_fib_2_2). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2,_fib_1_2,_fib_2_2) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_2_2,_fib_2_2,Fib), '素数のときは ''Prime'' と'(_数,Prime), '出力する'(_数_1,Fib,Prime),!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_2_2,_数_1,'Fib') :- _数_1 is _fib_1 + _fib_2,!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_1,_fib_2,''). '素数のときは ''Prime'' と'(_数,'Prime') :- 素数である(_数),!. '素数のときは ''Prime'' と'(_,''). '出力する'(_数_1,'','') :- write('%t ',[_数_1]),!. '出力する'(_数_1,Fib,Prime) :- write('%t%t ',[Fib,Prime]). % このプログラムの骨組みは %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 素数である(1) :- !. 素数である(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,_n,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. % 以下のサイトは # 御題 # # 1から100までの数を出力するプログラムを書け。 # ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 # 素数のときは 'Prime' と出力し、 # フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 # また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。 '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。' '100以下のフィボナッチ数列を得る'(_100以下のフィボナッチ数ならび), '100以下の素数を得る'(_100以下の素数ならび), between(1,100,_数), 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L), 'Nが100になるまで出力する'(N,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,L), '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,L), それ以外の場合は数を(_数,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,['Fib',_,_]) :- member(_数,_100以下のフィボナッチ数ならび),!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_,_,['',_,_]). '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,[_,'Prime',_]) :- member(_数,_100以下の素数ならび),!. '素数のときは ''Prime'' と'(_,_,[_,'',_]). それ以外の場合は数を(_数,['','',_数]) :- !. それ以外の場合は数を(_,[_,_,'']). '100以下のフィボナッチ数列を得る'(L) :- '100以下のフィボナッチ数列'([1,0],L). '100以下のフィボナッチ数列'([B,A|R],L) :- C is A + B, C =< 100, '100以下のフィボナッチ数列'([C,B,A|R],L),!. '100以下のフィボナッチ数列'(L,L). '100以下の素数を得る'(_100以下の素数ならび) :- findall(N,( between(1,100,N)), _1から100までのならび), エラトステネスの篩(_1から100までのならび,_100以下の素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 'Nが100になるまで出力する'(N,L) :- atomic_list_concat(L,_表示文字列), writef('%t ',[_表示文字列]), N = 100. % 以下のサイトは # 御題 # # 1から100までの数を出力するプログラムを書け。 # ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 # 素数のときは 'Prime' と出力し、 # フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 # また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。 '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。' '100以下のフィボナッチ数列を得る'(_100以下のフィボナッチ数ならび), '100以下の素数を得る'(_100以下の素数ならび), between(1,100,_数), 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L), 'Nが100になるまで出力する'(N,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,L), '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,L), それ以外の場合は数を(_数,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,['Fib',_,_]) :- member(_数,_100以下のフィボナッチ数ならび),!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_,_,['',_,_]). '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,[_,'Prime',_]) :- member(_数,_100以下の素数ならび),!. '素数のときは ''Prime'' と'(_,_,[_,'',_]). それ以外の場合は数を(_数,['','',_数]) :- !. それ以外の場合は数を(_,[_,_,'']). '100以下のフィボナッチ数列を得る'(L) :- '100以下のフィボナッチ数列'([1,0],L). '100以下のフィボナッチ数列'([B,A|R],L) :- C is A + B, C =< 100, '100以下のフィボナッチ数列'([C,B,A|R],L),!. '100以下のフィボナッチ数列'(L,L). '100以下の素数を得る'(L) :- findall(N,( between(1,100,N), 素数である(N)), L). 素数である(1) :- !. 素数である(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,_n,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. 'Nが100になるまで出力する'(N,L) :- atomic_list_concat(L,_表示文字列), writef('%t ',[_表示文字列]), N = 100. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/561 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 問題A # 0と1だけで構成されたテキストファイルAがある。このファイルを読み込み、文字数をカウントし、 # 同じ文字数の0と1で構成された乱数列を生成し、テキストファイルBとして出力するプログラムを作成せよ。 # シード値はシステム時刻など適当なものを使用せよ。 # 問題B # 問題Aで使用したテキストファイルA、Bを一文字ずつXORしテキストファイルCとして出力するプログラムを作成せよ。 # '問題B 問題Aで使用したテキストファイルA、Bを一文字ずつXORしテキストファイルCとして出力するプログラムを作成せよ。'(_テキストファイルA,_テキストファイルB,_テキストファイルC) :- get_chars(_テキストファイルA,Chars_1), get_chars(_テキストファイルB,Chars_2), 一文字ずつXORしテキストファイルCとして出力する(_テキストファイルC,Chars_,Chars_2). 一文字ずつXORしテキストファイルCとして出力する(Outstream,Chars_,Chars_2) :- open(_テキストファイルC,write,Outstream), forall(一文字ずつXORし(Chars_1,Chars_2,C), writef(Outstream,'%t',[C])), close(Outstream). 一文字ずつXORし(Chars_1,Chars_2,C) :- nth1(_nth1,Chars_1,A), nth1(_nth1,Chars_2,B), '数字のXOR'(A,B,C). '数字のXOR'('0','0','0'). '数字のXOR'('1','0','1'). '数字のXOR'('0','1','1'). '数字のXOR'('1','1','0'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/561 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 問題A # 0と1だけで構成されたテキストファイルAがある。このファイルを読み込み、文字数をカウントし、 # 同じ文字数の0と1で構成された乱数列を生成し、テキストファイルBとして出力するプログラムを作成せよ。 # シード値はシステム時刻など適当なものを使用せよ。 # 問題B # 問題Aで使用したテキストファイルA、Bを一文字ずつXORしテキストファイルCとして出力するプログラムを作成せよ。 # '問題A 0と1だけで構成されたテキストファイルAがある。このファイルを読み込み、文字数をカウントし、 同じ文字数の0と1で構成された乱数列を生成し、テキストファイルBとして出力するプログラムを作成せよ。'(_テキストファイルA,_テキストファイルB) :- 'このファイルを読み込み、文字数をカウントし、同じ文字数の0と1で構成された乱数列を生成し'(_テキストファイルA,_要素数,_乱数数字ならび), テキストファイルBとして出力する(_テキストファイルB,_乱数数字ならび). 'このファイルを読み込み、文字数をカウントし、同じ文字数の0と1で構成された乱数列を生成し'(_テキストファイルA,_要素数,_乱数数字ならび) :- このファイルを読み込み(_テキストファイルA,Chars), 文字数をカウントし(Chars,_文字数), 同じ文字数の0と1で構成された乱数列を生成し(_文字数,Chars,_乱数数字ならび). このファイルを読み込み(_テキストファイルA,Chars) :- get_chars(_テキストファイルA,Chars). 文字数をカウントし(Chars,_文字数) :- length(Chars,_文字数). 同じ文字数の0と1で構成された乱数列を生成し(0,[],[]) :- !. 同じ文字数の0と1で構成された乱数列を生成し(N,L1,[A|R]) :- M is random(N), 一文字取り出す(M,L1,A,L2), N_1 is N - 1, 同じ文字数の0と1で構成された乱数列を生成し(N_1,L2,R). 一文字取り出す(M,L1,A,L2) :- length(L0,M), append(L0,[A|R],L1), append(L0,R,L2). テキストファイルBとして出力する(_テキストファイルB,L) :- atom_chars(_乱数文字列,L), open(_テキストファイルB,write,Outstream), write(Outstream,A), close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/992 # # [2] 問題文(含コード&リンク):2つの数列の相関係数を求めるプログラムを作成する。 # '2つの数列の相関係数を求める'(_数列a,_数列b,_相関係数) :- 相加平均(_数列a,_数列aの相加平均), 相加平均(_数列b,_数列bの相加平均), 分子計算(_数列a,_数列b,_数列aの相加平均,_数列bの相加平均,_相関係数式の分子), 分母計算(_数列a,_数列b,_数列aの相加平均,_数列bの相加平均,_相関係数式の分母), _相関係数 is _相関係数式の分子 / _相関係数式の分母. 分子計算(_数列a,_数列b,_数列aの相加平均,_数列bの相加平均,_分子) :- findsum(S,( nth1(_nth1,_数列a,_数列aの要素), nth1(_nth1,_数列b,_数列bの要素), S is (_数列aの要素 - _数列aの相加平均) * (_数列bの要素 - _数列bの相加平均)), _分子). 分母計算(_数列a,_数列b,_数列aの相加平均,_数列bの相加平均,_分母) :- findsum_a(_数列a,_数列aの相加平均,S_a), findsum_b(_数列b,_数列bの相加平均,S_b), _分母 is S_a * S_b. findsum_a(_数列a,_数列aの相加平均,S) :- findsum(U,( member(_x,_数列a), U is (_x - _数列aの相加平均) ^ 2), S). findsum_b(_数列b,S) :- findsum(U,( member(_x,_数列b), U is (_x - _数列bの相加平均) ^ 2), S). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/439 # # [1] プログラム演習 # [2] 入力した文字列をASCIIコードに応じた2進数に変換するプログラムを作成せよ。 # (注釈:百文字程度の変換を行えるようにすること) # 例:abc→011000010110001001100011 # また、2進数から文字列に戻す変換を行うプログラムも作成せよ。 # 例:011000010110001001100011→abc # '入力した文字列をASCIIコードに応じた2進数に変換する' :- 入力した文字列を(_入力したASCIIコードならび), 'ASCIIコードならび2進数ビットならび変換'(_入力したASCIIコードならび,_2進数ビットならび), atomic_list_concat(_2進数ビットならび,_2進数列), writef('%t\n',[_2進数列]). '2進数から文字列に戻す変換'(_2進数ビットならび,_ASCIIコードならび) :- 入力した2進数列(_入力した2進数列), 入力したASCIIコードを2進数ビットならびに変換(_入力したASCIIコードならび,_2進数ビットならび), 'ASCIIコードならび2進数ビットならび変換'(_ASCIIコードならび,_2進数ビットならび), atom_codes(_ASCII文字列,_ASCIIコードならび), writef('%t\n',[_ASCII文字列]). 入力した文字列を(_入力したASCIIコードならび) :- read_line_to_codes(user_input,_入力したASCIIコードならび). 入力した2進数列(_入力した2進数列) :- read_line_to_codes(user_input,_入力した2進数列). 'ASCIIコードならび2進数ビットならび変換'([],[]). 'ASCIIコードならび2進数ビットならび変換'([_文字コード|R1],[_b1,_b2,_b3,_b4,_b5,_b6,_b7,_b8|R2]) :- 'ASCIIコード2進数表'(_ASCIIコード,[_b1,_b2,_b3,_b4,_b5,_b6,_b7,_b8]), 'ASCIIコードならび2進数ビットならび変換'(R1,R2). 'ASCIIコード2進数'(0,[0,0,0,0,0,0,0,0]). 'ASCIIコード2進数'(1,[0,0,0,0,0,0,0,1]). 'ASCIIコード2進数'(2,[0,0,0,0,0,0,1,0]). 'ASCIIコード2進数'(3,[0,0,0,0,0,0,1,1]). 'ASCIIコード2進数'(4,[0,0,0,0,0,1,0,0]). 'ASCIIコード2進数'(5,[0,0,0,0,0,1,0,1]). 'ASCIIコード2進数'(6,[0,0,0,0,0,1,1,0]). 'ASCIIコード2進数'(7,[0,0,0,0,0,1,1,1]). 'ASCIIコード2進数'(8,[0,0,0,0,1,0,0,0]). 'ASCIIコード2進数'(9,[0,0,0,0,1,0,0,1]). 'ASCIIコード2進数'(10,[0,0,0,0,1,0,1,0]). 'ASCIIコード2進数'(11,[0,0,0,0,1,0,1,1]). 'ASCIIコード2進数'(12,[0,0,0,0,1,1,0,0]). 'ASCIIコード2進数'(13,[0,0,0,0,1,1,0,1]). 'ASCIIコード2進数'(14,[0,0,0,0,1,1,1,0]). 'ASCIIコード2進数'(15,[0,0,0,0,1,1,1,1]). 'ASCIIコード2進数'(16,[0,0,0,1,0,0,0,0]). 'ASCIIコード2進数'(17,[0,0,0,1,0,0,0,1]). 'ASCIIコード2進数'(18,[0,0,0,1,0,0,1,0]). 'ASCIIコード2進数'(19,[0,0,0,1,0,0,1,1]). 'ASCIIコード2進数'(20,[0,0,0,1,0,1,0,0]). 'ASCIIコード2進数'(21,[0,0,0,1,0,1,0,1]). 'ASCIIコード2進数'(22,[0,0,0,1,0,1,1,0]). 'ASCIIコード2進数'(23,[0,0,0,1,0,1,1,1]). 'ASCIIコード2進数'(24,[0,0,0,1,1,0,0,0]). 'ASCIIコード2進数'(25,[0,0,0,1,1,0,0,1]). 'ASCIIコード2進数'(26,[0,0,0,1,1,0,1,0]). 'ASCIIコード2進数'(27,[0,0,0,1,1,0,1,1]). 'ASCIIコード2進数'(28,[0,0,0,1,1,1,0,0]). 'ASCIIコード2進数'(29,[0,0,0,1,1,1,0,1]). 'ASCIIコード2進数'(30,[0,0,0,1,1,1,1,0]). 'ASCIIコード2進数'(31,[0,0,0,1,1,1,1,1]). 'ASCIIコード2進数'(32,[0,0,1,0,0,0,0,0]). 'ASCIIコード2進数'(33,[0,0,1,0,0,0,0,1]). 'ASCIIコード2進数'(34,[0,0,1,0,0,0,1,0]). 'ASCIIコード2進数'(35,[0,0,1,0,0,0,1,1]). 'ASCIIコード2進数'(36,[0,0,1,0,0,1,0,0]). 'ASCIIコード2進数'(37,[0,0,1,0,0,1,0,1]). 'ASCIIコード2進数'(38,[0,0,1,0,0,1,1,0]). 'ASCIIコード2進数'(39,[0,0,1,0,0,1,1,1]). 'ASCIIコード2進数'(40,[0,0,1,0,1,0,0,0]). 'ASCIIコード2進数'(41,[0,0,1,0,1,0,0,1]). 'ASCIIコード2進数'(42,[0,0,1,0,1,0,1,0]). 'ASCIIコード2進数'(43,[0,0,1,0,1,0,1,1]). 'ASCIIコード2進数'(44,[0,0,1,0,1,1,0,0]). 'ASCIIコード2進数'(45,[0,0,1,0,1,1,0,1]). 'ASCIIコード2進数'(46,[0,0,1,0,1,1,1,0]). 'ASCIIコード2進数'(47,[0,0,1,0,1,1,1,1]). 'ASCIIコード2進数'(48,[0,0,1,1,0,0,0,0]). 'ASCIIコード2進数'(49,[0,0,1,1,0,0,0,1]). 'ASCIIコード2進数'(50,[0,0,1,1,0,0,1,0]). 'ASCIIコード2進数'(51,[0,0,1,1,0,0,1,1]). 'ASCIIコード2進数'(52,[0,0,1,1,0,1,0,0]). 'ASCIIコード2進数'(53,[0,0,1,1,0,1,0,1]). 'ASCIIコード2進数'(54,[0,0,1,1,0,1,1,0]). 'ASCIIコード2進数'(55,[0,0,1,1,0,1,1,1]). 'ASCIIコード2進数'(56,[0,0,1,1,1,0,0,0]). 'ASCIIコード2進数'(57,[0,0,1,1,1,0,0,1]). 'ASCIIコード2進数'(58,[0,0,1,1,1,0,1,0]). 'ASCIIコード2進数'(59,[0,0,1,1,1,0,1,1]). 'ASCIIコード2進数'(60,[0,0,1,1,1,1,0,0]). 'ASCIIコード2進数'(61,[0,0,1,1,1,1,0,1]). 'ASCIIコード2進数'(62,[0,0,1,1,1,1,1,0]). 'ASCIIコード2進数'(63,[0,0,1,1,1,1,1,1]). 'ASCIIコード2進数'(64,[0,1,0,0,0,0,0,0]). 'ASCIIコード2進数'(65,[0,1,0,0,0,0,0,1]). 'ASCIIコード2進数'(66,[0,1,0,0,0,0,1,0]). 'ASCIIコード2進数'(67,[0,1,0,0,0,0,1,1]). 'ASCIIコード2進数'(68,[0,1,0,0,0,1,0,0]). 'ASCIIコード2進数'(69,[0,1,0,0,0,1,0,1]). 'ASCIIコード2進数'(70,[0,1,0,0,0,1,1,0]). 'ASCIIコード2進数'(71,[0,1,0,0,0,1,1,1]). 'ASCIIコード2進数'(72,[0,1,0,0,1,0,0,0]). 'ASCIIコード2進数'(73,[0,1,0,0,1,0,0,1]). 'ASCIIコード2進数'(74,[0,1,0,0,1,0,1,0]). 'ASCIIコード2進数'(75,[0,1,0,0,1,0,1,1]). 'ASCIIコード2進数'(76,[0,1,0,0,1,1,0,0]). 'ASCIIコード2進数'(77,[0,1,0,0,1,1,0,1]). 'ASCIIコード2進数'(78,[0,1,0,0,1,1,1,0]). 'ASCIIコード2進数'(79,[0,1,0,0,1,1,1,1]). 'ASCIIコード2進数'(80,[0,1,0,1,0,0,0,0]). 'ASCIIコード2進数'(81,[0,1,0,1,0,0,0,1]). 'ASCIIコード2進数'(82,[0,1,0,1,0,0,1,0]). 'ASCIIコード2進数'(83,[0,1,0,1,0,0,1,1]). 'ASCIIコード2進数'(84,[0,1,0,1,0,1,0,0]). 'ASCIIコード2進数'(85,[0,1,0,1,0,1,0,1]). 'ASCIIコード2進数'(86,[0,1,0,1,0,1,1,0]). 'ASCIIコード2進数'(87,[0,1,0,1,0,1,1,1]). 'ASCIIコード2進数'(88,[0,1,0,1,1,0,0,0]). 'ASCIIコード2進数'(89,[0,1,0,1,1,0,0,1]). 'ASCIIコード2進数'(90,[0,1,0,1,1,0,1,0]). 'ASCIIコード2進数'(91,[0,1,0,1,1,0,1,1]). 'ASCIIコード2進数'(92,[0,1,0,1,1,1,0,0]). 'ASCIIコード2進数'(93,[0,1,0,1,1,1,0,1]). 'ASCIIコード2進数'(94,[0,1,0,1,1,1,1,0]). 'ASCIIコード2進数'(95,[0,1,0,1,1,1,1,1]). 'ASCIIコード2進数'(96,[0,1,1,0,0,0,0,0]). 'ASCIIコード2進数'(97,[0,1,1,0,0,0,0,1]). 'ASCIIコード2進数'(98,[0,1,1,0,0,0,1,0]). 'ASCIIコード2進数'(99,[0,1,1,0,0,0,1,1]). 'ASCIIコード2進数'(100,[0,1,1,0,0,1,0,0]). 'ASCIIコード2進数'(101,[0,1,1,0,0,1,0,1]). 'ASCIIコード2進数'(102,[0,1,1,0,0,1,1,0]). 'ASCIIコード2進数'(103,[0,1,1,0,0,1,1,1]). 'ASCIIコード2進数'(104,[0,1,1,0,1,0,0,0]). 'ASCIIコード2進数'(105,[0,1,1,0,1,0,0,1]). 'ASCIIコード2進数'(106,[0,1,1,0,1,0,1,0]). 'ASCIIコード2進数'(107,[0,1,1,0,1,0,1,1]). 'ASCIIコード2進数'(108,[0,1,1,0,1,1,0,0]). 'ASCIIコード2進数'(109,[0,1,1,0,1,1,0,1]). 'ASCIIコード2進数'(110,[0,1,1,0,1,1,1,0]). 'ASCIIコード2進数'(111,[0,1,1,0,1,1,1,1]). 'ASCIIコード2進数'(112,[0,1,1,1,0,0,0,0]). 'ASCIIコード2進数'(113,[0,1,1,1,0,0,0,1]). 'ASCIIコード2進数'(114,[0,1,1,1,0,0,1,0]). 'ASCIIコード2進数'(115,[0,1,1,1,0,0,1,1]). 'ASCIIコード2進数'(116,[0,1,1,1,0,1,0,0]). 'ASCIIコード2進数'(117,[0,1,1,1,0,1,0,1]). 'ASCIIコード2進数'(118,[0,1,1,1,0,1,1,0]). 'ASCIIコード2進数'(119,[0,1,1,1,0,1,1,1]). 'ASCIIコード2進数'(120,[0,1,1,1,1,0,0,0]). 'ASCIIコード2進数'(121,[0,1,1,1,1,0,0,1]). 'ASCIIコード2進数'(122,[0,1,1,1,1,0,1,0]). 'ASCIIコード2進数'(123,[0,1,1,1,1,0,1,1]). 'ASCIIコード2進数'(124,[0,1,1,1,1,1,0,0]). 'ASCIIコード2進数'(125,[0,1,1,1,1,1,0,1]). 'ASCIIコード2進数'(126,[0,1,1,1,1,1,1,0]). 'ASCIIコード2進数'(127,[0,1,1,1,1,1,1,1]). 'ASCIIコード2進数'(128,[1,0,0,0,0,0,0,0]). 'ASCIIコード2進数'(129,[1,0,0,0,0,0,0,1]). 'ASCIIコード2進数'(130,[1,0,0,0,0,0,1,0]). 'ASCIIコード2進数'(131,[1,0,0,0,0,0,1,1]). 'ASCIIコード2進数'(132,[1,0,0,0,0,1,0,0]). 'ASCIIコード2進数'(133,[1,0,0,0,0,1,0,1]). 'ASCIIコード2進数'(134,[1,0,0,0,0,1,1,0]). 'ASCIIコード2進数'(135,[1,0,0,0,0,1,1,1]). 'ASCIIコード2進数'(136,[1,0,0,0,1,0,0,0]). 'ASCIIコード2進数'(137,[1,0,0,0,1,0,0,1]). 'ASCIIコード2進数'(138,[1,0,0,0,1,0,1,0]). 'ASCIIコード2進数'(139,[1,0,0,0,1,0,1,1]). 'ASCIIコード2進数'(140,[1,0,0,0,1,1,0,0]). 'ASCIIコード2進数'(141,[1,0,0,0,1,1,0,1]). 'ASCIIコード2進数'(142,[1,0,0,0,1,1,1,0]). 'ASCIIコード2進数'(143,[1,0,0,0,1,1,1,1]). 'ASCIIコード2進数'(144,[1,0,0,1,0,0,0,0]). 'ASCIIコード2進数'(145,[1,0,0,1,0,0,0,1]). 'ASCIIコード2進数'(146,[1,0,0,1,0,0,1,0]). 'ASCIIコード2進数'(147,[1,0,0,1,0,0,1,1]). 'ASCIIコード2進数'(148,[1,0,0,1,0,1,0,0]). 'ASCIIコード2進数'(149,[1,0,0,1,0,1,0,1]). 'ASCIIコード2進数'(150,[1,0,0,1,0,1,1,0]). 'ASCIIコード2進数'(151,[1,0,0,1,0,1,1,1]). 'ASCIIコード2進数'(152,[1,0,0,1,1,0,0,0]). 'ASCIIコード2進数'(153,[1,0,0,1,1,0,0,1]). 'ASCIIコード2進数'(154,[1,0,0,1,1,0,1,0]). 'ASCIIコード2進数'(155,[1,0,0,1,1,0,1,1]). 'ASCIIコード2進数'(156,[1,0,0,1,1,1,0,0]). 'ASCIIコード2進数'(157,[1,0,0,1,1,1,0,1]). 'ASCIIコード2進数'(158,[1,0,0,1,1,1,1,0]). 'ASCIIコード2進数'(159,[1,0,0,1,1,1,1,1]). 'ASCIIコード2進数'(160,[1,0,1,0,0,0,0,0]). 'ASCIIコード2進数'(161,[1,0,1,0,0,0,0,1]). 'ASCIIコード2進数'(162,[1,0,1,0,0,0,1,0]). 'ASCIIコード2進数'(163,[1,0,1,0,0,0,1,1]). 'ASCIIコード2進数'(164,[1,0,1,0,0,1,0,0]). 'ASCIIコード2進数'(165,[1,0,1,0,0,1,0,1]). 'ASCIIコード2進数'(166,[1,0,1,0,0,1,1,0]). 'ASCIIコード2進数'(167,[1,0,1,0,0,1,1,1]). 'ASCIIコード2進数'(168,[1,0,1,0,1,0,0,0]). 'ASCIIコード2進数'(169,[1,0,1,0,1,0,0,1]). 'ASCIIコード2進数'(170,[1,0,1,0,1,0,1,0]). 'ASCIIコード2進数'(171,[1,0,1,0,1,0,1,1]). 'ASCIIコード2進数'(172,[1,0,1,0,1,1,0,0]). 'ASCIIコード2進数'(173,[1,0,1,0,1,1,0,1]). 'ASCIIコード2進数'(174,[1,0,1,0,1,1,1,0]). 'ASCIIコード2進数'(175,[1,0,1,0,1,1,1,1]). 'ASCIIコード2進数'(176,[1,0,1,1,0,0,0,0]). 'ASCIIコード2進数'(177,[1,0,1,1,0,0,0,1]). 'ASCIIコード2進数'(178,[1,0,1,1,0,0,1,0]). 'ASCIIコード2進数'(179,[1,0,1,1,0,0,1,1]). 'ASCIIコード2進数'(180,[1,0,1,1,0,1,0,0]). 'ASCIIコード2進数'(181,[1,0,1,1,0,1,0,1]). 'ASCIIコード2進数'(182,[1,0,1,1,0,1,1,0]). 'ASCIIコード2進数'(183,[1,0,1,1,0,1,1,1]). 'ASCIIコード2進数'(184,[1,0,1,1,1,0,0,0]). 'ASCIIコード2進数'(185,[1,0,1,1,1,0,0,1]). 'ASCIIコード2進数'(186,[1,0,1,1,1,0,1,0]). 'ASCIIコード2進数'(187,[1,0,1,1,1,0,1,1]). 'ASCIIコード2進数'(188,[1,0,1,1,1,1,0,0]). 'ASCIIコード2進数'(189,[1,0,1,1,1,1,0,1]). 'ASCIIコード2進数'(190,[1,0,1,1,1,1,1,0]). 'ASCIIコード2進数'(191,[1,0,1,1,1,1,1,1]). 'ASCIIコード2進数'(192,[1,1,0,0,0,0,0,0]). 'ASCIIコード2進数'(193,[1,1,0,0,0,0,0,1]). 'ASCIIコード2進数'(194,[1,1,0,0,0,0,1,0]). 'ASCIIコード2進数'(195,[1,1,0,0,0,0,1,1]). 'ASCIIコード2進数'(196,[1,1,0,0,0,1,0,0]). 'ASCIIコード2進数'(197,[1,1,0,0,0,1,0,1]). 'ASCIIコード2進数'(198,[1,1,0,0,0,1,1,0]). 'ASCIIコード2進数'(199,[1,1,0,0,0,1,1,1]). 'ASCIIコード2進数'(200,[1,1,0,0,1,0,0,0]). 'ASCIIコード2進数'(201,[1,1,0,0,1,0,0,1]). 'ASCIIコード2進数'(202,[1,1,0,0,1,0,1,0]). 'ASCIIコード2進数'(203,[1,1,0,0,1,0,1,1]). 'ASCIIコード2進数'(204,[1,1,0,0,1,1,0,0]). 'ASCIIコード2進数'(205,[1,1,0,0,1,1,0,1]). 'ASCIIコード2進数'(206,[1,1,0,0,1,1,1,0]). 'ASCIIコード2進数'(207,[1,1,0,0,1,1,1,1]). 'ASCIIコード2進数'(208,[1,1,0,1,0,0,0,0]). 'ASCIIコード2進数'(209,[1,1,0,1,0,0,0,1]). 'ASCIIコード2進数'(210,[1,1,0,1,0,0,1,0]). 'ASCIIコード2進数'(211,[1,1,0,1,0,0,1,1]). 'ASCIIコード2進数'(212,[1,1,0,1,0,1,0,0]). 'ASCIIコード2進数'(213,[1,1,0,1,0,1,0,1]). 'ASCIIコード2進数'(214,[1,1,0,1,0,1,1,0]). 'ASCIIコード2進数'(215,[1,1,0,1,0,1,1,1]). 'ASCIIコード2進数'(216,[1,1,0,1,1,0,0,0]). 'ASCIIコード2進数'(217,[1,1,0,1,1,0,0,1]). 'ASCIIコード2進数'(218,[1,1,0,1,1,0,1,0]). 'ASCIIコード2進数'(219,[1,1,0,1,1,0,1,1]). 'ASCIIコード2進数'(220,[1,1,0,1,1,1,0,0]). 'ASCIIコード2進数'(221,[1,1,0,1,1,1,0,1]). 'ASCIIコード2進数'(222,[1,1,0,1,1,1,1,0]). 'ASCIIコード2進数'(223,[1,1,0,1,1,1,1,1]). 'ASCIIコード2進数'(224,[1,1,1,0,0,0,0,0]). 'ASCIIコード2進数'(225,[1,1,1,0,0,0,0,1]). 'ASCIIコード2進数'(226,[1,1,1,0,0,0,1,0]). 'ASCIIコード2進数'(227,[1,1,1,0,0,0,1,1]). 'ASCIIコード2進数'(228,[1,1,1,0,0,1,0,0]). 'ASCIIコード2進数'(229,[1,1,1,0,0,1,0,1]). 'ASCIIコード2進数'(230,[1,1,1,0,0,1,1,0]). 'ASCIIコード2進数'(231,[1,1,1,0,0,1,1,1]). 'ASCIIコード2進数'(232,[1,1,1,0,1,0,0,0]). 'ASCIIコード2進数'(233,[1,1,1,0,1,0,0,1]). 'ASCIIコード2進数'(234,[1,1,1,0,1,0,1,0]). 'ASCIIコード2進数'(235,[1,1,1,0,1,0,1,1]). 'ASCIIコード2進数'(236,[1,1,1,0,1,1,0,0]). 'ASCIIコード2進数'(237,[1,1,1,0,1,1,0,1]). 'ASCIIコード2進数'(238,[1,1,1,0,1,1,1,0]). 'ASCIIコード2進数'(239,[1,1,1,0,1,1,1,1]). 'ASCIIコード2進数'(240,[1,1,1,1,0,0,0,0]). 'ASCIIコード2進数'(241,[1,1,1,1,0,0,0,1]). 'ASCIIコード2進数'(242,[1,1,1,1,0,0,1,0]). 'ASCIIコード2進数'(243,[1,1,1,1,0,0,1,1]). 'ASCIIコード2進数'(244,[1,1,1,1,0,1,0,0]). 'ASCIIコード2進数'(245,[1,1,1,1,0,1,0,1]). 'ASCIIコード2進数'(246,[1,1,1,1,0,1,1,0]). 'ASCIIコード2進数'(247,[1,1,1,1,0,1,1,1]). 'ASCIIコード2進数'(248,[1,1,1,1,1,0,0,0]). 'ASCIIコード2進数'(249,[1,1,1,1,1,0,0,1]). 'ASCIIコード2進数'(250,[1,1,1,1,1,0,1,0]). 'ASCIIコード2進数'(251,[1,1,1,1,1,0,1,1]). 'ASCIIコード2進数'(252,[1,1,1,1,1,1,0,0]). 'ASCIIコード2進数'(253,[1,1,1,1,1,1,0,1]). 'ASCIIコード2進数'(254,[1,1,1,1,1,1,1,0]). 'ASCIIコード2進数'(255,[1,1,1,1,1,1,1,1]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/880 # # [1] 授業単元:C言語 # [2] 問題 http://codepad.org/I9NEBx3U # # #  [3]初日に1円、2日目に2円、3日目に4円というように #     前日の2倍の金額を貯金していったとき、貯金の合計金額が #     100万円を超えるのは何日目になるかを算出するプログラムを作成せよ。 # '初日に1円、2日目に2円、3日目に4円というように 前日の2倍の金額を貯金していったとき、貯金の合計金額が 100万円を超えるのは何日目になるかを算出する'(_何日目) :- 数列が1000000を超えるまで([1,2,4|R],_), length([1,2,4|R],_何日目). 数列が1000000を超えるまで([N],_) :- N > 1000000,!. 数列が1000000を超えるまで([A,B|R],_公差) :- 等差数列の連続した二項(A,B,_公差), 数列が1000000を超えるまで([B|R],_公差). 数列が1000000を超えるまで([A,B|R],_公比) :- 等比数列の連続した二項(A,B,_公比), 数列が1000000を超えるまで([B|R],_公比). 等差数列の連続した二項(A,B,_公差) :- var(B), B is A + _公差. 等差数列の連続した二項(A,B,_公差) :- \+(var(B)), _公差 is B - A. 等比数列の連続した二項(A,B,_公比) :- var(B), B is A * _公比. 等比数列の連続した二項(A,B,_公比) :- \+(var(B)), _公比 is B / A. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/880 # # [1] 授業単元:C言語 # [2] 問題 http://codepad.org/I9NEBx3U # # #  [2] 次の数列の和を計算するプログラムを繰り返し処理を用いて作成せよ。 #      0.2, 0.4, 0.6, ・・・・・,10.0(ただし、10.0は何項目か分からない事とする。 #      プログラム内では何回繰り返しするか記述しない条件にする事とする) # '次の数列の和を計算するプログラムを繰り返し処理を用いて作成せよ。      0.2, 0.4, 0.6, ・・・・・,10.0(ただし、10.0は何項目か分からない事とする。'(_数列の和) :- 次の数列の([0.2,0.4,0.6|R],10.0,_), 和を計算する([0.2,0.4,0.6|R],_数列の和). 次の数列の([_終了値],_終了値,_) :- !. 次の数列の([A,B|R],_終了値,_公差) :- 等差数列の連続した二項(A,B,_公差), 次の数列の([B|R],_終了値,_公差). 次の数列の([A,B|R],_終了値,_公比) :- 等比数列の連続した二項(A,B,_公比), 次の数列の([B|R],_終了値,_公比). 等差数列の連続した二項(A,B,_公差) :- var(B), B is A + _公差. 等差数列の連続した二項(A,B,_公差) :- \+(var(B)), _公差 is B - A. 等比数列の連続した二項(A,B,_公比) :- var(B), B is A * _公比. 等比数列の連続した二項(A,B,_公比) :- \+(var(B)), _公比 is B / A. 和を計算する([],0). 和を計算する([_数|R],_和) :- 和を計算する(R,_和_1), _和 is _和_1 + _数. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/880 # # [1] 授業単元:C言語 # [2] 問題 http://codepad.org/I9NEBx3U # # #  [1] 次の数列の第20項までの和を計算するプログラムを繰り返し処理を用いて作成せよ。 #      5,10,15,20,・・・・ # '次の数列の第20項までの和を計算する      5,10,15,20,・・・・'(_数列の和) :- 次の数列の第20項までの([5,10,15,20|R]), 和を計算する([5,10,15,20|R],_数列の和). 次の数列の第20項までの(L) :- 第20項までの(L), 次の数列の(L,_). 第20項までの(L) :- length(L,20). 次の数列の([],_). 次の数列の([A,B|R],_公差) :- 等差数列の連続した二項(A,B,_公差), 次の数列の([B|R],_公差). 次の数列の([A,B|R],_公比) :- 等比数列の連続した二項(A,B,_公比), 次の数列の([B|R],_公比). 等差数列の連続した二項(A,B,_公差) :- var(B), B is A + _公差. 等差数列の連続した二項(A,B,_公差) :- \+(var(B)), _公差 is B - A. 等比数列の連続した二項(A,B,_公比) :- var(B), B is A * _公比. 等比数列の連続した二項(A,B,_公比) :- \+(var(B)), _公比 is B / A. 和を計算する([],0). 和を計算する([_数|R],_和) :- 和を計算する(R,_和_1), _和 is _和_1 + _数. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/603 # # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 lこのtxtファイルを読み取って ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), open('書き換え.txt',write,Outstream), ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(Outstream,LL), close(Outstream). ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(Outstream,[]) :- !. ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(Outstream,[[_|L]|R) :- 一行出力する(Outstream,L), ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(Outstream,R). 一行出力する(Outstream,L) :- append(L0,[N|R1],L), 要素が0のものを削除し出力する(Outstream,L0,N), R1 = [], write('\n'). 要素が0のものを削除し出力する(Outstream,L0,0) :- !. 要素が0のものを削除し出力する(Outstream,L0,A) :- length([_|L0],Nth), writef(Outstream,'%t:%t ',[Nth,A]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/603 # # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 lこのtxtファイルを読み取って ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), open('書き換え.txt',write,Outstream), ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し(Outstream,LL), close(Outstream). ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し(Outstream,LL) :- append(_,[[_|L]|R],LL), append(L0,[N|R1],L), 要素が0のものを削除し表示する(Outstream,Nth,N), R1 = [], write('\n'), R = []. 要素が0のものを削除し表示する(Outstream,Nth,0) :- !. 要素が0のものを削除し表示する(Outstream,Nth,A) :- writef(Outstream,'%t:%t ',[Nth,A]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/603 # # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 lこのtxtファイルを読み取って ファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), ファイル名を削除し(LL,LL1), 右から順に番号を振った上で(LL1,LL2), 要素が0のものを削除し書き換え(LL2,LL3), 書き換えtxtファイルに出力する(LL3). ファイル名を削除し([],[]). ファイル名を削除し([[_|L1]|R1],[L1|R2]) :- ファイル名を削除し(R1,R2). 右から順に番号を振った上で([],[]). 右から順に番号を振った上で([L1|R1],[L2|R2]) :- findall(N-A,( append(_,[A|R],L1), length([_|R],N)), L2), 右から順に番号を振った上で(R1,R2). 要素が0のものを削除し書き換え([],[]). 要素が0のものを削除し書き換え([N-0|R1],R2) :- 要素が0のものを削除し書き換え(R1,R2). 要素が0のものを削除し書き換え([N:A|R1],[N-A|R2]) :- \+(A = 0), 要素が0のものを削除し書き換え(R1,R2). 書き換えtxtファイルに出力する(LL3) :- open('書き換え.txt',write,Outstream), append(_,[L|R],LL3), 行要素を出力する(Ountstream,L), R = [], close(Outstream). 行要素を出力する(Outstream,[]) :- writef(Outstream,'\n'). 行要素を出力する(Outstream,[N:A|R]) :- writef(Outstream,'%t:%t ',[N,A]), 行要素を出力する(Outstream,R). % 以下のサイトは # 出典 :: C言語の宿題片付けます 160代目 #400 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/QdOnaWYm # # /* # ビンゴゲームを作る # # 仕様 # ・5×5のビンゴカードをint型の2次元配列として宣言する # ・ビンゴカードの数字は重複しない1〜100の乱数を作り、それから先頭の25個をビンゴカードに適用 # ・最初にビンゴカード作成に使うための重複しない100個の乱数を見やすい形で表示 # ・値を交換する処理は関数化する # ・実際のビンゴゲームのようにガラガラで1つずつ数字が出てくる # ・ガラガラは1〜100までの重複しない乱数を作る機械であり、ビンゴカード作成に用いた乱数列とガラガラで使う乱数列は別物である # ・ビンゴカード作成用の乱数とガラガラ用の乱数はヒープ領域に確保した配列に格納 # ・カードの縦、横、斜めのいずれかがそろったらゲーム終了 # */ # :- dynamic(賞品/1). ビンゴ参加者(ケイスケ). ビンゴ参加者(ユウヤ). ビンゴ参加者(タダシ). ビンゴ参加者(マッチ). ビンゴ参加者(トオル). 賞品('フェラーリ(模型)'). 賞品('コルト45(模型)'). 賞品(ティー野球セット). 賞品(武豊の使っていた鞭). 賞品(ビンゴセット). ビンゴゲーム :- findall(_ビンゴ参加者,ビンゴ参加者(_ビンゴ参加者),_ビンゴ参加者ならび), ビンゴゲーム(_ビンゴ参加者ならび). ビンゴゲーム(_ビンゴ参加者ならび) :- ゲーム参加者のビンゴカード(_ビンゴ参加者ならび,_ビンゴカードならび), 'ガラガラは1〜100までの重複しない乱数を作る機械であり、ビンゴカード作成に用いた乱数列とガラガラで使う乱数列は別物である'(_ガラガラで使う乱数列), 参加者全員がビンゴとなるまでガラガラを繰り返す(_ビンゴカードならび,_ガラガラで使う乱数列). 参加者全員がビンゴとなるまでガラガラを繰り返す([],_) :- write('ビンゴ終了\nご苦労さまでした\n'),!. 参加者全員がビンゴとなるまでガラガラを繰り返す(_参加者ビンゴカードならび,L2) :- ガラガラ(L1,_数,L2), ビンゴになったカードを探し賞品を渡してそのカードを削除(_数,_参加者ビンゴカードならび,_ビンゴになった人を削除した参加者ビンゴカードならび), 参加者全員がビンゴとなるまでガラガラを繰り返す(_ビンゴになった人を削除した参加者ビンゴカードならび,L2). '5×5のビンゴカードをint型の2次元配列として宣言する'(_ビンゴカード) :- length(_ビンゴカード,5), findall(L,( member(L,_ビンゴカード), length(L,5)), _ビンゴカード). ゲーム参加者のビンゴカード(_ビンゴ参加者ならび,_ビンゴカードならび) :- findall([_ビンゴ参加者,_ビンゴカード],( member(_ビンゴ参加者,_ビンゴ参加者ならび), 'ビンゴカードの数字は重複しない1〜100の乱数を作り、それから先頭の25個をビンゴカードに適用'(_ビンゴカード)), _ビンゴカードならび). 'ビンゴカードの数字は重複しない1〜100の乱数を作り、それから先頭の25個をビンゴカードに適用'(_ビンゴカード) :- 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(L), それから先頭の25個をビンゴカードに適用(L,_ビンゴカード). 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(L) :- findall(N,between(1,100,N),L1), 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(100,L1,L). 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(0,_,[]) :- !. 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(Nth,L1,[N|R2]) :- '重複しない1〜100の乱数'(Nth,L1,N,L2), Nth_1 is Nth - 1, 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(Nth_1,L2,R2). '重複しない1〜100の乱数'(Nth,L1,N,L2) :- Nth0 is random(Nth), length(L0,Nth0), append(L0,[N|R1],L1), append(L0,R1,L2),!. それから先頭の25個をビンゴカードに適用(L,_ビンゴカード) :- ビンゴカード(_重複しない100個の乱数ならび,_ビンゴカード). ビンゴカード(_重複しない100個の乱数ならび,_ビンゴカード) :- _ビンゴカード=[[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_]], flatten(_ビンゴカード,_重複しない100個の乱数ならび). 'ガラガラは1〜100までの重複しない乱数を作る機械であり、ビンゴカード作成に用いた乱数列とガラガラで使う乱数列は別物である'(_ガラガラで使う乱数列) :- 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(_ガラガラで使う乱数列),!. ビンゴになったカードを探し商品を渡してそのカードを削除(_,[],[]). ビンゴになったカードを探し商品を渡してそのカードを削除(_数字,[[_ビンゴ参加者,_ビンゴカード_1]|R1],R2) :- 一致した数字があったら穴をあける(_数字,_ビンゴ参加者,_ビンゴカード_1,_ビンゴカード_2), ビンゴだったら賞品を渡してその人は上がり(_ビンゴカード_2,_ビンゴ参加者,R1,R2), ビンゴになったカードを探し賞品を渡してそのカードを削除(_数字,R1,R2),!. ビンゴだったら賞品を渡してその人は上がり(_ビンゴカード,_ビンゴ参加者,R,R) :- ビンゴ(_ビンゴカード), 賞品を渡す(_ビンゴ参加者),!. ビンゴだったら賞品を渡してその人は上がり(_ビンゴカード,_ビンゴ参加者,R,[[_ビンゴ参加者,_ビンゴカード]|R]) :- \+(ビンゴ(_ビンゴカード)). 一致した数字があったら穴をあける(_数字,_ビンゴカード_1,_ビンゴカード_2) :- findall(L2,( member(L,_ビンゴカード_1), 一致した場合だけ穴を開ける(_数字,L,L2)), _ビンゴカード_2). 一致した場合だけ穴を開ける(_数字,L,L2) :- append(L0,[_数字|R],L), append(L0,[穴|R],L2),!. 一致した場合だけ穴を開ける(_,L,L). ビンゴ([穴,_,_,_,_],[_,穴,_,_,_,_],[_,_,穴,_,_],[_,_,_,穴,_],[_,_,_,_,穴]) :- !. ビンゴ([_,_,_,_,穴],[_,_,_,穴,_],[_,_,穴,_,_],[_,穴,_,_,_,_],[穴,_,_,_,_]) :- !. ビンゴ(_ビンゴカード) :- member(L,_ビンゴカード), all(L,穴),!. ビンゴ(_ビンゴカード) :- 転置(_ビンゴカード,_ビンゴカード_2), member(L,_ビンゴカード_2), all(L,穴),!. 賞品を渡す(_参加者) :- retract(賞品(_賞品)), writef('%t君はビンゴになりました。賞品は %t です!\n',[_参加者,_賞品]),!. all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/53 # # [1]C言語 for文 while文 do while文 # [2]問題 http://ime.nu/codepad.org/oxqRFj3G # [3]Linux gcc # [4]10月9日 10時 # [5]長めですがよろしくお願いします…。 # # /* # 6. キーボードから正の整数n を一つ入力し、0 以上n 以下の2 のべき乗(2i の形をした整数) をす # べて表示するプログラムをfor 文を用いて作成せよ。 # # 7.問題6をwhileかdo whileで作成せよ # # 11. 銀行の一年間の定期預金の年利は1.25%である。キーボードからこの定期預金に預ける元 # 金(円) と預金期間(年) を入力し、1 年毎の元利合計(元本+利息) を小数点以下を切り落として整 # 数で出力するプログラムをfor 文を利用して作成せよ。なお、各行を「・・年後(タブ)・・・円」の # 形式で表示すること。 # # 16. 漸化式an+1 = an +3, a1 = -5 で表わされる数列がある。初項(n = 1) から第10 項(n = 10) # までを表示するプログラムを作成せよ。 # # 17. 1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。た # だし、for を2 つ用いること。 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # */ '銀行の一年間の定期預金の年利は1.25%である。キーボードからこの定期預金に預ける元金(円) と預金期間(年) を入力し、1 年毎の元利合計(元本+利息) を小数点以下を切り落として整数で出力するプログラムをfor 文を利用して作成せよ。なお、各行を「・・年後(タブ)・・・円」の形式で表示すること。' :- '銀行の一年間の定期預金の年利は1.25%である'(_年利), 'キーボードからこの定期預金に預ける元金(円) と預金期間(年) を入力し'(_元金,_預金期間), '1 年毎の元利合計(元本+利息) を小数点以下を切り落として整数で出力するプログラムをfor 文を利用して作成せよ。なお、各行を「・・年後(タブ)・・・円」の形式で表示すること。'(_元金,_年利,_預金期間). '銀行の一年間の定期預金の年利は1.25%である'(_年利) :- _年利 = 1.0125. 'キーボードからこの定期預金に預ける元金(円) と預金期間(年) を入力し'(_元金,_預金期間) :- 'キーボードからこの定期預金に預ける元金(円)を入力'(_元金), 'キーボードからこの定期預金に預ける預金期間(年) を入力'(_預金期間). 'キーボードからこの定期預金に預ける元金(円)を入力'(_元金,_預金期間) :- 整数を得る('この定期預金に預ける元金(円)',_元金 > 0,_元金). 'キーボードからこの定期預金に預ける預金期間(年) を入力'(_預金期間) :- 整数を得る('この定期預金に預ける預金期間(年)',_預金期間 > 0,_預金期間). '1 年毎の元利合計(元本+利息) を小数点以下を切り落として整数で出力するプログラムをfor 文を利用して作成せよ。なお、各行を「・・年後(タブ)・・・円」の形式で表示すること。'(_元金,_年利,_預金期間) :- '1 年毎の元利合計(元本+利息) をfor 文を利用して'(_元金,_預金期間,_年後,_元利合計), '小数点以下を切り落として整数で出力するプログラムを作成する。なお、各行を「・・年後(タブ)・・・円」の形式で表示する'(_元利合計ならび). '1 年毎の元利合計(元本+利息) をfor 文を利用して'(_元金,_年利,_預金期間,_年後,_元利合計) :- for(1,_年後,_預金期間), _元利合計 is _元金 * (_年利 ^ _年後). '小数点以下を切り落として整数で出力する。なお、各行を「・・年後(タブ)・・・円」の形式で表示する'(_年後,_元利合計) :- writef('%t年後\t',[_年後]), format('~0f\n',[_元利合計]), _年後 = _預金期間,!. % for/3 % 整数を得る/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/53 # # [1]C言語 for文 while文 do while文 # [2]問題 http://ime.nu/codepad.org/oxqRFj3G # [3]Linux gcc # [4]10月9日 10時 # [5]長めですがよろしくお願いします…。 # # /* # 6. キーボードから正の整数n を一つ入力し、0 以上n 以下の2 のべき乗(2i の形をした整数) をす # べて表示するプログラムをfor 文を用いて作成せよ。 # # 7.問題6をwhileかdo whileで作成せよ # # 11. 銀行の一年間の定期預金の年利は1.25%である。キーボードからこの定期預金に預ける元 # 金(円) と預金期間(年) を入力し、1 年毎の元利合計(元本+利息) を小数点以下を切り落として整 # 数で出力するプログラムをfor 文を利用して作成せよ。なお、各行を「・・年後(タブ)・・・円」の # 形式で表示すること。 # # 16. 漸化式an+1 = an +3, a1 = -5 で表わされる数列がある。初項(n = 1) から第10 項(n = 10) # までを表示するプログラムを作成せよ。 # # 17. 1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。た # だし、for を2 つ用いること。 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # */ 'キーボードから正の整数n を一つ入力し、0 以上n 以下の2 のべき乗(2i の形をした整数) をすべて表示するプログラムをfor 文を用いて作成せよ。' :- 'キーボードから正の整数n を一つ入力し'(_n), '0 以上n 以下の2 のべき乗(2i の形をした整数) をすべて表示するプログラムをfor 文を用いて作成せよ。'(_n). 'キーボードから正の整数n を一つ入力し'(_n) :- 整数を得る(正の整数,_n > 0,_n). '0 以上n 以下の2 のべき乗(2i の形をした整数) をすべて表示するプログラムをfor 文を用いて作成せよ。'(_n) :- findall(_2のi乗,( for(0,_i,_n), '2のi乗'(_i,_2のi乗)), _2のべき乗), writef('%t\n',[_2のべき乗]). '2のi乗'(0,1). '2のi乗'(_i,X) :- _i_1 is _i - 1, '2のi乗'(_i_1,Y), X is 2 * Y. % for/3 % 整数を得る/3 % 以下のサイトは # # 等差数列の再帰的定義 # 等差数列(_等差数列) :- 等差数列(_等差数列,_公差),!. 等差数列([_],_公差). 等差数列([A,B|R],_公差) :- '先頭の変数でない二要素の差が公差であり後続もこの公差の等差数列である時、等差数列である'([A,B|R],_公差),!. 等差数列([A,B|R],_公差) :- 'A,Bどちらかが変数の時は、後続が等差数列であるならば公差からAを決定して構わない'(A,B,R,_公差). '先頭の変数でない二要素の差が公差であり後続もこの公差の等差数列である時、等差数列である'([A,B|R],_公差) :- \+(var(A)), \+(var(B)), _公差 is B - A, 等差数列([B|R],_公差). 'A,Bどちらかが変数の時は、後続が等差数列であるならば公差からAを決定して構わない'(A,B,R,_公差) :- 'A,Bどちらかが変数の時は、'(A,B), '後続が等差数列であるならば公差からAを決定して構わない'(B,R,_公差,A),!. 'A,Bどちらかが変数の時は、'(A,B) :- var(A),!. 'A,Bどちらかが変数の時は、'(A,B) :- var(B). '後続が等差数列であるならば公差からAを決定して構わない'(B,R,_公差,A) :- 等差数列([B|R],_公差), A is B - _公差,!. % 以下のサイトは # # 等差数列の再帰的ではない定義(実は再帰的なのだが) # 等差数列とは隣り合う2つの項の差が全て等しい数列である(_等差数列) :- 隣り合う2つの項の差が(_等差数列,_隣り合う2つの項の差のリスト), 全て等しい(_隣り合う2つの項の差のリスト,_). 隣り合う2つの項の差が(_等差数列,_隣り合う2つの項の差のリスト) :- findall(_差,( append(_,[A,B|_],_等差数列), _差 is B - A), _隣り合う2つの項の差のリスト). 全て等しい([A],A). 全て等しい([A|R],A) :- 全て等しい(R,A). % 以下のサイトは # # 等差数列の再帰的ではない定義(実は再帰的なのだが) # 等差数列(_等差数列) :- 数列の差が(_等差数列,_差のリスト), 全て等しい(_差のリスト,_). 数列の差が(_等差数列,_差のリスト) :- findall(_差,( append(_,[A,B|_],_等差数列), _差 is B - A), _差のリスト). 全て等しい([A],A). 全て等しい([A|R],A) :- 全て等しい(R,A). % 以下のサイトは # # 等差数列の再帰的定義 # 等差数列(_等差数列) :- 等差数列(_等差数列,_公差). 等差数列([A,B],_公差) :- _公差 is B - A. 等差数列([A,B|R],_公差) :- \+(R = []), _公差 is B - A, 等差数列([B|R],_公差). % 以下のサイトは # # 等差数列の再帰的定義 # 等差数列(_等差数列) :- _等差数列 = [_,_|_], 等差数列(_等差数列,_公差). 等差数列([_],_公差). 等差数列([A,B|R],_公差) :- _公差 is B - A, 等差数列([B|R],_公差). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/592 # # [1] 授業単元:データ構造入門 # [2] 問題文(含コード&リンク):問題文が長いためこちらに記載しました http://ime.nu/ideone.com/R8gaZ # # 【問題2】 # 線形探索法で目的データを探索するプログラムを作成せよ。 # データの数をキーボード入力し、その個数だけの疑似乱数を発生させてデータを配列に格納し、 # データとその添え字番号を一覧表示する。次に目的データ(探索データ)をキーボード入力し、 # 線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は # 「みつからなかったこと」を表示する。なお、データ数は最大50として、50をマクロ定義 # せよ。また、データの探索と作成には、次の関数を作成して使うこと。 # # ・int linear_search(int data[],int key,int num) # この関数はnum個のデータが格納された配列dataの中から、線形探索を用いて目的データkeyと等しい # 値を探し、見つかった場合にはその配列要素を返却し、見つからなかった場合には-1を返却する。 # # ・void random_data(int data[],int num) # この関数は整列していないnum個のデータを配列dataに格納する関数。疑似乱数rand()を用いよ。 # データの値は0からnum-1までの整数で全て異なる値とせよ。 # ※乱数列を変更するにはvoid srand(seed)を実行する。seedの値が異なると、ことなる乱数列が # 得られることを確認しよう。 'データの数をキーボード入力し、その個数だけの疑似乱数を発生させてデータを配列に格納し、データとその添え字番号を一覧表示する。 次に目的データ(探索データ)をキーボード入力し、線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する。 なお、データ数は最大50として、50をマクロ定義せよ。' :- 'データの数をキーボード入力し、その個数だけの疑似乱数を発生させてデータを配列に格納し、データとその添え字番号を一覧表示する。なお、データ数は最大50とする'(_データの数,_データならび), '次に目的データ(探索データ)をキーボード入力し、線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する。'(_データの数,_データならび). 'データの数をキーボード入力し、その個数だけの疑似乱数を発生させてデータを配列に格納し、データとその添え字番号を一覧表示する。' :- 'データ数は最大50としてデータの数をキーボード入力し'(_データの数), 'その個数だけの疑似乱数を発生させてデータを配列に格納し'(_データの数,_データならび), 'データとその添え字番号を一覧表示する'(_データの数,_データならび). 'データ数は最大50としてデータの数をキーボード入力し、' :-'(_データの数) :- 整数を得る(データの数,between(1,50,_データ数),_データの数). 'その個数だけの疑似乱数を発生させてデータを配列に格納し'(_データの数,_データならび) :- length(_データならび,_データの数), findall(N,( member(N,_データならび), N is random(_データの数) + 1), _データならび). 'データとその添え字番号を一覧表示する'(_データの数,_データならび) :- nth1(_添字番号,_データならび,_データ), writef('%t: %t\n',[_添字番号,_データ]), _添字番号 = _データの数,!. '次に目的データ(探索データ)をキーボード入力し、線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する。'(_データの数,_データならび) :- '目的データ(探索データ)をキーボード入力し'(_データの数,_目的データ), '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび). '目的データ(探索データ)をキーボード入力し'(_データの数,_目的データ) :- swritef(_制限表示,'1から%tまでの範囲の任意の数',[_データ数]), write('目的データ(探索データ)を入力してください : '), 整数を得る(_制限表示,_目的データ). '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび) :- '線形探索法で探索し、見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび),!. '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび) :- '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し'(_目的データ,_データならび). '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し'(_目的データ,_データならび) :- '見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび),!. '線形探索法で探索し、見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび) :- \+(nth1(_添字番号,_データならび,_目的データ)), writef('目的データ %t はデータならびの中に見つかりません\n',[_目的データ]),!. '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し'(_目的データ,_データならび) :- nth1(_添字番号,_データならび,_目的データ), writef('%t: %t\n',[_添字番号,_目的データ), fail. '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し'(_目的データ,_データならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/794 # # 正の整数mとn(1<=n<=9)を入力し, m桁の1以上n以下の数字を組み合わせてできる全ての数列を出力するプログラムを作れ. # # mが3でnが2の場合の例: # 111 # 112 # 121 # 122 # 211 # 212 # 221 # 222 # # '正の整数mとn(1<=n<=9)を入力し, m桁の1以上n以下の数字を組み合わせてできる全ての数列を出力する' :- '正の整数mとn(1<=n<=9)を入力し'(_m,_n), m桁の1以上n以下の数字を組み合わせてできる全ての数列を出力する(_m,_n). '正の整数mとn(1<=n<=9)を入力し'(_m,_n) :- 整数を得る(正の整数m,_m > 0,_m), 整数を得る('n(1<=n<=9)',(_n>=1,_n=<9),_n). m桁の1以上n以下の数字を組み合わせてできる全ての数列を出力する(_m,_n) :- m桁の1以上n以下の数字を組み合わせてできる全ての数列を(_m,_n,_m桁の1以上n以下の数字を組み合わせてできる全ての数列), 出力する(_m桁の1以上n以下の数字を組み合わせてできる全ての数列). m桁の1以上n以下の数字を組み合わせてできる全ての数列を(_m,_n,_m桁の1以上n以下の数字を組み合わせてできる全ての数列) :- 繰り返し数の制御のため_mをならびLmに変換する(_m,Lm), findall(_m桁の数字列,( m桁の1以上n以下の数字を組み合わせてできる数列(Lm,_n,_m要素の数字ならび), atomic_list_concat(_m要素の数字ならび,_m桁の数字列)), _m桁の1以上n以下の数字を組み合わせてできる全ての数列). m桁の1以上n以下の数字を組み合わせてできる数列([],_,[]). m桁の1以上n以下の数字を組み合わせてできる数列([_|Lm],_n,[_1以上n以下の数字|R]) :- '1以上n以下の数字を'(_n,_1以上n以下の数字), m桁の1以上n以下の数字を組み合わせてできる数列(Lm,_n,R). '1以上n以下の数字を'(_n,_1以上n以下の数) :- between(1,_n,_1以上n以下の数), atom_number(_1以上n以下の数字,_1以上n以下の数). 出力する(_数字文字列ならび) :- append(_,[_数字文字列|_残り要素],_数字文字列ならび), writef('%t',[_数字文字列]), _残り要素 = []. 繰り返し数の制御のため_mをならびLmに変換する(_m,Lm) :- length(Lm,_m). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/415 # # [1] 授業単元: C言語 # [2] 問題文:漸化式 # X(x)=2X(n-1)+1, X(0)=0 # で決まる数列のn項目を求めるプログラムを再帰を用いて作成せよ。 # 'X(x)=2X(n-1)+1, X(0)=0 で決まる数列のn項目を求める'(0,0). 'X(x)=2X(n-1)+1, X(0)=0 で決まる数列のn項目を求める'(_n,_y) :- _n > 0, _n_1 is _n - 1, 'X(x)=2X(n-1)+1, X(0)=0 で決まる数列のn項目を求める'(_n_1,_y_1), _y is 2 * _y_1 + 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/300 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # x_i∈{0,1}であるとき、次の漸化式で与えられる数列(M系列)を示しなさい。 # また、p>1と得られる系列の周期について考察しなさい。 # x_n=x_(n-1)+x_(n-p) # ただし、加算+は排他的論理和(XOR)を表す。 # また、第p-1項まではすべてが0である場合を除いて、scanfで任意に与えてよい。 # 実行例には、次の場合を含めなさい。 # # p=3: 初期値 x_0=1, x_1=0, x_2=0 のとき、x_3=1, x_4=1, x_5=1, x_6=0 # # XOR 0 1 # 0 0 1 # 1 1 0 # # '0起点のnth'(_nth,L,A) :- length(L0,_nth), append(L0,[A|R],L). 'x_n=x_(n-1)+x_(n-p)'(_n,_p,L1) :- 'x_n=x_(n-1)+x_(n-p)'(_p,_n,_p,_L1,L2), 数列を示しなさい(_p,_n,L2). 'x_n=x_(n-1)+x_(n-p)'(_n,Max,_p,L,L) :- _n > Max,!. 'x_n=x_(n-1)+x_(n-p)'(_n,Max,_p,L1,L) :- 'x_n'(_n,_p,L1,Z), _n_2 is _n + 1, append(L1,[Z],L2), 'x_n=x_(n-1)+x_(n-p)'(_n_2,Max,_p,L2,L). 'x_n'(_n,_p,L1,X,Y) :- _n_1 is _n - 1, _n_p is _n - _p, '0起点のnth'(_n_1,L1,X), '0起点のnth'(_n_p,L1,Y), Z is X xor Y. 数列を示しなさい(_n,_p,L) :- writef('p=%t: 初期値 ',[_p]), _p_1 is _p - 1, 表示する(0,_p_1,L), write(' のとき、'), 表示する(_p,_n,L). 表示する(_n,_n,_) :- '0起点のnth'(_nth,L,A), writef('X_%t=%t\n',[_nth,A]),!. 表示する(_nth,_n,L) :- '0起点のnthを表示'(_nth,L,A), _nth_2 is _nth + 1, 表示する(_nth_2,_n,L). '0起点のnthを表示'(_nth,L,A) :- '0起点のnth'(_nth,L,A), writef('X_%t=%t,',[_nth,A]),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/118 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 次の規則に従う数列a_{0},a_{1},a_{2},...を表示するプログラムを作成しなさい. # ただし、配列を使用してはならない。 # 1. 初期値a_{0}は,任意の自然数とする. # 2. 数列a_{n+1}は次の式で決められる. # a_{n+1}=a_{n}/2   (a_{n}が偶数のとき) # a_{n+1}=3a_{n}+1   (a_{n}が奇数のとき) # 3. 数列a_{n}=1になったら終了する. # 例えば,a_{0}=13のとき{13, 40, 20, 10, 5, 16, 8, 4, 2, 1}となる. # '次の規則に従う数列a_{0},a_{1},a_{2},...を表示する.1. 初期値a_{0}は,任意の自然数とする. 2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき) 3. 数列a_{n}=1になったら終了する' :- '1. 初期値a_{0}は,任意の自然数とする'(_初期値a_0), '2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき) 3. 数列a_{n}=1になったら終了する'(_初期値a_0,_a), '数列a_{0},a_{1},a_{2},...を表示する'(_初期値a_0,_a). '2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき) 3. 数列a_{n}=1になったら終了する'(_a_n,[_a_n]) :- '3. 数列a_{n}=1になったら終了する'(_a_n),!. '2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき) 3. 数列a_{n}=1になったら終了する'(_a_n,[_a_n|R]) :- 'a_{n+1}=a_{n}/2 (a_{n}が偶数のとき)'(_a_n,_a_n_1), '2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき) 3. 数列a_{n}=1になったら終了する'(_a_n_1,R). '2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき) 3. 数列a_{n}=1になったら終了する'(_a_n,[_a_n|R]) :- 'a_{n+1}=a_{n}/2 (a_{n}が奇数のとき)'(_a_n,_a_n_1), '2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき) 3. 数列a_{n}=1になったら終了する'(_a_n_1,R). '3. 数列a_{n}=1になったら終了する'(_a_n) :- _a_n = 1. 'a_{n+1}=a_{n}/2 (a_{n}が偶数のとき)'(_a_n,_a_n_1) :- 'a_{n}が偶数のとき'(_a_n), _a_n_1 is _a_n // 2. 'a_{n}が偶数のとき'(_a_n) :- 0 is _a_n mod 2. 'a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき)'(_a_n,_a_n_1) :- 'a_{n}が奇数のとき'(_a_n), _a_n_1 is 3 * a_n + 1. 'a_{n}が奇数のとき'(_a_n) :- 1 is _a_n mod 2. '1. 初期値a_{0}は,任意の自然数とする'(_初期値a_0) :- 任意の自然数とする(_初期値a_0). 任意の自然数とする(_初期値a_0) :- write('自然数を入力してください : '), get_integer(_初期値a_0), _初期値a_0 > 0. '数列a_{0},a_{1},a_{2},...を表示する'(_初期値a_0,_a) :- atomic_list_concat(_a,', ',S), writef('a_{0}=%tのとき{ %t}\n',[_初期値a_0,S]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/770 # # 1番目:1から20までの整数を入力してください:7 # 2番目:2から20までの整数を入力してください:11 # 3番目:2から20までの整数を入力してください:12 # 4番目:13から20までの整数を入力してください:20 # もういちど最初からやり直してください。 # 1番目:1から20までの整数を入力してください:7 # 2番目:8から20までの整数を入力してください:11 # 3番目:12から20までの整数を入力してください:1 # 3番目:12から20までの整数を入力してください:12 # 4番目:13から20までの整数を入力してください:17 # 5番目:18から20までの整数を入力してください:19 # 7 11 12 17 19 # % % この問題には以下の質問をぶつけてあります。 % >>770 % 二行目、三行目の範囲下限が何故2なのかわからない。8,12ではないのか? '1から範囲を狭めながら19までの数列を得て表示する' :- '1から範囲を狭めながら19までの数列を得る'(1,1,_1から19までの数列), '1から19までの数列を表示する'(_1から19までの数列),!. '1から範囲を狭めながら19までの数列を得る'(_,20,[]). '1から範囲を狭めながら19までの数列を得る'(N,_から,[X|R]) :- '20までの数値入力'(N,_から,X), _から_2 is _から + 1, N_2 is N + 1, '1から範囲を狭めながら19までの数列を得る'(N_2,_から_2,R). '1から範囲を狭めながら19までの数列を得る'(_,_,L) :- もういちど最初からやりなおす(L). もういちど最初からやりなおす(L) :- write('もういちど最初からやり直してください。\n'), '1から範囲を狭めながら19までの数列を得る'(1,1,L). '20までの整数入力'(N,_から,X) :- writef('%t番目:%tから20までの整数を入力してください:',[N,_から]), '20までの整数入力'(_から,X),!. '20までの整数入力'(N,_から,X) :- '20までの整数入力'(N,_から,X). '20までの整数入力'(_から,X) :- get_line(Line), '20までの整数入力診断'(Line,_から,X). '20までの整数入力診断'(Line,_から,X) :- atom_to_term(Line,X,_), integer(X), X >= _から, X < 20. '1から19までの数列を表示する'(L) :- concat_atom(L,' ',_表示文字列), writef('%t\n',[_表示文字列]). % % get_line/1 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/734 # # [1]C言語(やさしいC 輪講) # [2]問題文: # 次のコードは、コンソールから入力された異なる5個の1から20までの数を大きい順に並べ替えて出力するプログラムです。 # ([1])〜([11])内を埋めてコードを完成させなさい。 # #include <stdio.h> # #include <stdlib.h> # static int readNumber(char *msg,int min,int max,int m1,int m2,int m3,int m4){ # char console[256],([1]);([2]) result; # for(;;){ # printf("%s",msg); # t=fgets( ([3]),stdin); # if(t==NULL)([5]); # result=atoi(([3])); # if(result<([6]))([5]);if(result>([7]))([5]); # if(m1==result){ # printf("その数は使われています\n"); # ([5]); # } # ([8]) # return result; # } # } # int main(void){ # int m; # m=readNumber("1個目:1以上20以下の整数を入力してください:",([9]),([10]),0,0,0,0); # ([11]) # return 0; # } # [3] Windows Vistaですがコンパイラとかよくわかりません。 # [4] 4月の最初のゼミまで(3年次・4年次と連続履修です) # [5]ローカル変数はステートメントが始まる前にすべて宣言しなければならないと注意を受けました。よろしくお願いします。 # # 'コンソールから入力された異なる5個の1から20までの数を大きい順に並べ替えて出力する' :- 'コンソールから入力された異なる5個の1から20までの数を'([],_異なる5個の1から20までの数), 大きい順に並べ替えて出力する(_異なる5個の1から20までの数). 'コンソールから入力された異なる5個の1から20までの数を'(L,[]) :- length(L,5),!. 'コンソールから入力された異なる5個の1から20までの数を'(L,[_1から20までの数|R]) :- 'コンソールから入力された異なる1から20までの数'(L,_1から20までの数), 'コンソールから入力された異なる5個の1から20までの数を'([_1から20までの数|L],R). 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数) :- write('異なる1から20までの数を入力して下さい : '), コンソールから入力された(Line), '異なる1から20までの数'(Line,L,_異なる5個の1から20までの数),!. 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数) :- 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数). コンソールから入力された(Line) :- get_line(Line). '異なる1から20までの数'(Line,L,_異なる5個の1から20までの数) :- atom_to_term(Line,_数,_), '異なる'(_数,L), '1から20までの数'(Line,_数),!. '異なる'(_数,L) :- \+(member(_数,L)),!. '異なる'(_数,L) :- writef('入力された数%tは既に入力済みです。再入力をお願いします。\n',[_数]), fail. '1から20までの数'(Line,_数) :- 数(_数), '1から20までの'(_数),!. '1から20までの'(_数) :- _数 >= 1, _数 =< 20,!. '1から20までの'(_数) :- writef('入力された数%tは1から20の範囲にありません。再入力をお願いします。\n',[_数]), fail. 数(_,_数) :- number(_数),!. 数(Line,_数以外の項) :- writef('入力された %t からは数が得られません。再入力をお願いします\n',[Line]), fail. 大きい順に並べ替えて出力する(_異なる5個の1から20までの数) :- 大きい順に並べ替えて(_異なる5個の1から20までの数,_大きい順に整列したならび), 出力する(_大きい順に整列したならび). 大きい順に並べ替えて(L1,L2) :- 大きい順に並べ替えて(L1,[],L2). 大きい順に並べ替えて([],L,L). 大きい順に並べ替えて([A|R],L1,L) :- 大きい順の挿入(A,L1,L2), 大きい順に並べ替えて(R,L2,L). 大きい順の挿入(A,[],[A]). 大きい順の挿入(A,[B|R1],[A,B|R1]) :- A >= B,!. 大きい順の挿入(A,[B|R1],[B|R2]) :- 大きい順の挿入(A,R1,R2). 出力する(_大きい順に整列したならび) :- swritef(_表示する数列,'%t,%t,%t,%t,%t\n',_大きい順に整列したならび), writef('%t\n',[_表示する数列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/734 # # [1]C言語(やさしいC 輪講) # [2]問題文: # 次のコードは、コンソールから入力された異なる5個の1から20までの数を大きい順に並べ替えて出力するプログラムです。 # ([1])〜([11])内を埋めてコードを完成させなさい。 # #include <stdio.h> # #include <stdlib.h> # static int readNumber(char *msg,int min,int max,int m1,int m2,int m3,int m4){ # char console[256],([1]);([2]) result; # for(;;){ # printf("%s",msg); # t=fgets( ([3]),stdin); # if(t==NULL)([5]); # result=atoi(([3])); # if(result<([6]))([5]);if(result>([7]))([5]); # if(m1==result){ # printf("その数は使われています\n"); # ([5]); # } # ([8]) # return result; # } # } # int main(void){ # int m; # m=readNumber("1個目:1以上20以下の整数を入力してください:",([9]),([10]),0,0,0,0); # ([11]) # return 0; # } # [3] Windows Vistaですがコンパイラとかよくわかりません。 # [4] 4月の最初のゼミまで(3年次・4年次と連続履修です) # [5]ローカル変数はステートメントが始まる前にすべて宣言しなければならないと注意を受けました。よろしくお願いします。 # # 'コンソールから入力された異なる5個の1から20までの数を大きい順に並べ替えて出力する' :- 'コンソールから入力された異なる5個の1から20までの数を'([],_異なる5個の1から20までの数), 大きい順に並べ替えて出力する(_異なる5個の1から20までの数). 'コンソールから入力された異なる5個の1から20までの数を'(L,[]) :- length(L,5),!. 'コンソールから入力された異なる5個の1から20までの数を'(L,[_1から20までの数|R]) :- 'コンソールから入力された異なる1から20までの数'(L,_1から20までの数), 'コンソールから入力された異なる5個の1から20までの数を'([_1から20までの数|L],R). 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数) :- write('異なる1から20までの数を入力して下さい : '), コンソールから入力された(Line), '異なる1から20までの数'(Line,L,_異なる5個の1から20までの数),!. 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数) :- 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数). コンソールから入力された(Line) :- get_line(Line). '異なる1から20までの数'(Line,L,_異なる5個の1から20までの数) :- atom_to_term(Line,_数,_), 異なる(_数,L), '1から20までの数'(Line,_数),!. 異なる(_数,L) :- \+(member(_数,L)),!. 異なる(_数,L) :- writef('入力された数%tは既に入力済みです。再入力をお願いします。\n',[_数]), fail. '1から20までの数'(Line,_数) :- 数(_数), '1から20までの'(_数),!. '1から20までの'(_数) :- _数 >= 1, _数 =< 20,!. '1から20までの'(_数) :- writef('入力された数%tは1から20の範囲にありません。再入力をお願いします。\n',[_数]), fail. 数(_,_数) :- number(_数),!. 数(Line,_数以外の項) :- writef('入力された %t からは数が得られません。再入力をお願いします\n',[Line]), fail. 大きい順に並べ替えて出力する(_異なる5個の1から20までの数) :- 大きい順に並べ替えて(_異なる5個の1から20までの数,_大きい順に整列したならび), 出力する(_大きい順に整列したならび). 大きい順に並べ替えて(_異なる5個の1から20までの数,_大きい順に整列したならび) :- sort(_異なる5個の1から20までの数,_整列したならび), reverse(_整列したならび,_大きい順に整列したならび). 出力する(_大きい順に整列したならび) :- swritef(_表示する数列,'%t,%t,%t,%t,%t\n',_大きい順に整列したならび), writef('%t\n',[_表示する数列]). /* 大きい順に並べ替えて(L1,L2) :- 大きい順に並べ替えて(L1,[],L2). 大きい順に並べ替えて([],L,L). 大きい順に並べ替えて([A|R],L1,L) :- 大きい順の挿入(A,L1,L2), 大きい順に並べ替えて(R,L2,L). 大きい順の挿入(A,[],[A]). 大きい順の挿入(A,[B|R1],[A,B|R1]) :- A >= B,!. 大きい順の挿入(A,[B|R1],[B|R2]) :- 大きい順の挿入(A,R1,R2). */ % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/732 # # 【 課題 】超初心者なので理解できない点がありましたらすみません。 # 以下のイベント処理を行うアプレット作成をしたいと思っています。 # (インターフェースは無題.jpgを参照) # # 1、アプレットを起動すると「単語<tab>数字列」の組み合わせが # 格納されているテキストindex.txtを読み込み # 数字列の長さが最長〜9位までの単語(二字熟語〜四字熟語に限定する) # をコンポーネントのボタンのラベルに格納していき表示させる。 # (どのボタンのラベルに単語を格納するかは自由) #                                                                                             # 2、ボタンを押すとラベル(単語)に # 対応した数列をindex.txtから検索して見つけ # その数列をテキストファイルに出力する。  #                                                                                                             # 【 形態 】Applet # 【 GUI  】AWTのみ # 【 期限 】1月22日 # 【 Ver  】java version "1.7.0_02" # 【 補足 】なし # 無題.jpg(現在のアプレット) # http://ime.nu/www.dotup.org/uploda/www.dotup.org2542721.jpg.html # index.txt(「単語<tab>数字列」の組み合わせが入っているテキストファイル) # http://ime.nu/www.dotup.org/uploda/www.dotup.org2542722.txt.html # NounFreq.java(現在のアプレットを表示させているソースコード) # http://ime.nu/www.dotup.org/uploda/www.dotup.org2542718.java.html # よろしくお願いします。 # # # # '「単語<tab>数字列」の組み合わせが格納されているテキストindex.txtを読み込み数字列の長さが最長〜9位までの単語(二字熟語〜四字熟語に限定する)を表示する' :- '「単語<tab>数字列」の組み合わせが格納されているテキストindex.txtを読み込み'(LL), '数字列の長さが最長〜9位までの単語(二字熟語〜四字熟語に限定する)を'(_単語ならび), 表示する(_単語ならび). '「単語<tab>数字列」の組み合わせが格納されているテキストindex.txtを読み込み'(LL) :- get_split_lines('index.txt',[','],LL). '最長〜9位までの単語(二字熟語〜四字熟語に限定する)を'(LL,_単語ならび) :- 要素数で逆順に整列して(LL,LL4), '最長〜9位までの'(LL4,_単語ならび), 単語を表示する(_単語ならび). 要素数で逆順に整列して(LL,LL4) :- findall([_要素数,_単語],( member([_単語|R],LL), length(R,_要素数)), LL2), sort(LL2,LL3), reverse(LL3,LL4). '最長〜9位までの'(LL4,_単語ならび) :- length(L0,9), append(L0,_,LL4). '単語を表示する'(_単語ならび) :- append(_,[[_,_単語]|R],_単語ならび), writef('%t\n',[_単語]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289016056/350 # # 今週から授業がPrologに入り、来週のテストまでに仕上げてくるようにと課題を渡され # いろいろと考えてみてメソッドはこれで合っていると思うのですが、 # 肝心の再帰処理でのリストの作成がわからなくて詰まっています。 # どなたか助けてもらえないでしょうか? # # //入力と出力 # ?- nextItem( [146, 394, 882, 1730, 3082], N). # N = 5106 # # # /*メソッド # 146, 394, 882, 1730, 3082 # 248, 488, 848, 1352 # 240, 360, 504 # 120, 144 # 24 # # 隣り合う数字の差分を新しいリストに出力しつづける # (248 = 394-146, 488= 882-394,...) # リストの最後まで行ったら、終了 # # 新しいリストで繰り返し同じ処理を行う # リストの数列の長さが1になったら終了 # 今まで作成したリストの最後の数字をすべて足し算する。 # # N = 24 + 144 + 504 + 1352 + 3082 # N = 5106 # # */メソッド # # nextItem([N],N). nextItem(L,X) :- append(_,[Z],L), findall(Sub,( append(_,[N1,N2|_],L), Sub is N2 - N1), L1), nextItem(L1,Y), X is Z + Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289016056/350 # # 今週から授業がPrologに入り、来週のテストまでに仕上げてくるようにと課題を渡され # いろいろと考えてみてメソッドはこれで合っていると思うのですが、 # 肝心の再帰処理でのリストの作成がわからなくて詰まっています。 # どなたか助けてもらえないでしょうか? # # //入力と出力 # ?- nextItem( [146, 394, 882, 1730, 3082], N). # N = 5106 # # # /*メソッド # 146, 394, 882, 1730, 3082 # 248, 488, 848, 1352 # 240, 360, 504 # 120, 144 # 24 # # 隣り合う数字の差分を新しいリストに出力しつづける # (248 = 394-146, 488= 882-394,...) # リストの最後まで行ったら、終了 # # 新しいリストで繰り返し同じ処理を行う # リストの数列の長さが1になったら終了 # 今まで作成したリストの最後の数字をすべて足し算する。 # # N = 24 + 144 + 504 + 1352 + 3082 # N = 5106 # # */メソッド # # nextItem(List,X) :- nextItem_1([List],X). nextItem_1([[N]|R],X) :- sumLastElements([[N]|R],X),!. nextItem_1([L|R],X) :- nextItem_2(L,L2), nextItem_1([L2,L|R],X). sumLastElements([],0). sumLastElements([List|R],X) :- lastElement(List,LastElement), sumLastElements(R,Y), X is LastElement + Y. nextItem_2([_],[]). nextItem_2([N1,N2|R1],[N3|R2]) :- N3 is N2 - N1, nextItem_2([N2|R1],R2). lastElement([LastElement],LastElement) :- !. lastElement([_|R],LastElement) :- lastElement(R,LastElement). % 以下のサイトは バイナリファイル (標準入力) に一致しました % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/822 # # [1] 授業単元:c言語プログラミング # [2] 問題文(含コード&リンク):(1,2,3) (1,2,4)...といった数列が続くのlist.txtを読み込み、 # 左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむプログラムを作りなさい。 # (この場合、左が1と1かつ真ん中が2と2で右が3と4なので4の方が大きいので(1,2,4)を削除する) # '(1,2,3) (1,2,4)...といった数列が続くのlist.txtを読み込み、左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ' :- get_chars('list.txt',Chars), '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ'(Chars). '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ'(Chars) :- ならびに変換(Chars,LL1), '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し'(LL1,LL2), 'link2.txtに書きこむ'(LL2). ならびに変換([],[]). ならびに変換(['('|R1],[[A,B,C]|R2]) :- append(L0,[)|R3],R1), concat_atom(L0,S), atom_to_term(S,(A,B,C),_), ならびに変換(R3,R2),!. ならびに変換([_|R1],R2) :- ならびに変換(R1,R2). '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し'(LL1,LL2) :- 左の数字と真ん中の数字でグループを作る(LL1,LL3), グループの中の最小ならびを蒐める(LL3,LL2). 左の数字と真ん中の数字でグループを作る(LL1,LL3) :- findsetof([A,B],( append(_,[[A,B,_]|_],LL1)), LL3). グループの中の最小ならびを蒐める(LL3,LL2) :- findall(L,( グループの中での最小ならび(LL3,L)), LL2). グループの中での最小ならび(LL3,L) :- append(_,[[A,B]|_],LL3), findmin([A,B,C],( append(_,[[A,B,C]|_],LL1)), L). 'link2.txtに書きこむ'(LL2) :- open('link2.txt',write,Outstream), 'link2.txtに書きこむ'(Outstream,LL2), close(Outstream). 'link2.txtに書きこむ'(Outstream,LL2) :- append(_,[[A,B,C]|R],LL2), writef(Outstream,'(%t,%t,%t) ',[A,B,C]), R = [], 最後に改行(Outstream). 最後に改行(Outstream) :- write(Outstream,'\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/969 # # 5を入力するまで数字を入力し # # 入力されたら # その数列の最大値と最小値の場所を入れ替えて左から表示するプログラムを教えてください # # '5を入力するまで数字を入力し入力されたらその数列の最大値と最小値の場所を入れ替えて左から表示する' :- '5を入力するまで数字を入力し'(_数列), '最大値と最小値の場所を入れ替えて左から表示する'(_数列). '5を入力するまで数字を入力し'(_数列) :- write('数字を入力して下さい(5が入ったら終わります) : '), rawmode, 数字の入力(_数字), '5を入力するまで数字を入力し'(_数字,_数列), norawmode. '5を入力するまで数字を入力し'('5',[]) :- !. '5を入力するまで数字を入力し'(_数字,[_数字|R]) :- 数字の入力(_数字2), '5を入力するまで数字を入力し'(_数字2,R),!. '5を入力するまで数字を入力し'(_,R) :- 数字の入力(_数字), '5を入力するまで数字を入力し'(_数字,R). 数字の入力(_数字) :- get_char(_数字), _数字 @>= '0', _数字 @=< '9'. '最大値と最小値の場所を入れ替えて左から表示する'(_数列) :- 最大値と最小値の(_数列,_最大値,_最小値), 場所を入れ替えて(_数列,_最大値,_最小値,_最大値と最小値を入れ替えた数列), 左から表示する(_最大値と最小値を入れ替えた数列). 最大値と最小値の(_数列,_最大値,_最小値) :- 最大値(_数列,_最大値), 最小値(_数列,_最小値). 最大値(_数列,_最大値) :- append(L1,[_最大値|R1],_数列), \+((member(A1,L1),A1 @> _最大値)), \+((member(A2,R1),A2 @> _最大値)),!. 最小値(_数列,_最小値) :- append(L2,[_最小値|R2],_数列), \+((member(B1,L2),B1 @< _最小値)), \+((member(B2,R2),B2 @< _最小値)),!. 場所を入れ替えて(_数列,_最大値,_最小値,_数列2) :- append(L1,[_最大値|R1],[_最小値|R2],_数列), append(L1,[_最小値|R1],[_最大値|R2],_数列2),!. 場所を入れ替えて(_数列,_最大値,_最小値,_数列2) :- append(L1,[_最小値|R1],[_最大値|R2],_数列), append(L1,[_最大値|R1],[_最小値|R2],_数列2),!. 左から表示する([]) :- write('\n'). 左から表示する([A|R]) :- writef('%t ',[A]), 左から表示する(R). rawmode :- shell('stty raw'). norawmode :- shell('stty -raw'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/754 # # [1] 授業単元: C言語プログラム # [2] 問題文(含コード&リンク): # 初項 a,交差 d及びn項目のnを引数で与え # 等差数列のn項目の値を戻り値で得る関数を作成する.引数,戻り値は整数型でよい. # an = a + (n-1) * d # 上の関数を用いて,初項,交差及びn項目をキーボード入力で与え,結果を出力するプログラムを作成せよ. # 実行例↓ # $./kadai1 # # a? 2 # d? 3 # n? 10 # Result: 29 # # '初項 a,交差 d及びn項目のnを引数で与え等差数列のn項目の値を戻り値で得る'(_a,_d,_n,_n項目の値) :- '等差数列のn項目の値を戻り値で得る'(_a,_d,0,_n,_n項目の値), '等差数列のn項目の値を戻り値で得る'(_n項目の値,_d,_n,_n,_n項目の値) :- !. '等差数列のn項目の値を戻り値で得る'(_a,_d,_n,_n項目の値) :- _n_2 is _n + 1, _a_2 is _a + _d, '等差数列のn項目の値を戻り値で得る'(_a_2,_d,_n_2,_n項目の値). '初項,交差及びn項目をキーボード入力で与え,結果を出力する' :- 初項をキーボード入力(_初項), 交差をキーボード入力(_交差), 'n項目をキーボード入力'(_n項目), '初項 a,交差 d及びn項目のnを引数で与え等差数列のn項目の値を戻り値で得る'(_初項,_交差,_n項目,_n項目の値), 結果を出力する(_初項,_交差,_n項目,_n項目の値),!. 初項をキーボード入力(_初項) :- write('初項 : '), get_integer(_初項),!. 初項をキーボード入力(_初項) :- 初項をキーボード入力(_初項). 交差をキーボード入力(_交差) :- write('交差 : '), get_integer(_交差),!. 交差をキーボード入力(_交差) :- 交差をキーボード入力(_交差). 'n項目をキーボード入力'(_n項目) :- write('n項目 : '), get_integer(_n項目),!. 'n項目をキーボード入力'(_n項目) :- 'n項目をキーボード入力'(_n項目). 結果を出力する(_n項目の値) :- writef('結果: %t\n',[_n項目の値]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/70 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # 1〜N(N >= 1)までの、1ずつ増加する等差数列が与えられる、この時のNの階乗通り存在する組み合わせをすべて表示せよ # 例) # Nの値: 3 # 1 2 3 # 1 3 2 # 2 1 3 # 2 3 1 # 3 1 2 # 3 2 1 # なお、例のような表示順序で無くても良い、すべて表示されているならその表示順序は問わない。 # '1〜N(N >= 1)までの、1ずつ増加する等差数列が与えられる、この時のNの階乗通り存在する組み合わせをすべて表示する'(N) :- '1〜N(N >= 1)までの、1ずつ増加する等差数列が与えられる'(N,L), 'この時のNの階乗通り存在する組み合わせをすべて'(L,N,_順列ならび), 表示する(_順列ならび). '1〜N(N >= 1)までの、1ずつ増加する等差数列が与えられる'(N,L) :- findall(M,for(1,M,N),L). 'この時のNの階乗通り存在する組み合わせをすべて'(L,N,_順列ならび) :- findall(_順列,( 順列(L,N,_順列)), _順列ならび). 表示する(_順列ならび) :- append(_,[_順列|R],_順列ならび), concat_atom(_順列,' ',_行表示), writef('%t\n',[_行表示]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/347 # # [1] 授業単元:整列処理 # [2] 問題文(含コード&リンク): http://codepad.org/afHWYPLF # 問題が3問あります。長いので問題文もリンク先に書かせていただきました。 # # # # 【問題2】 # クイックソート法の特性を調べたい。同一の数列について、クイックソートプログラムの実行中に行われる # (1)比較の回数、(2)交換の回数を計数し、次にバブルソートプログラムの実行中に行われる # (1)比較の回数、(2)交換の回数を計数して比較せよ。また、バブルソート法よりクイックソート法の方が # 比較と交換の回数が少ない理由を考察せよ。ただし、数列はrand関数を用いて生成せよ。データの個数が、 # 20個、40個、60個、80個、100個の5つの場合について、比較と交換の回数を計数する。 # #    計数結果の出力形式 #    <クイックソート法> #     データ数:20個 #     比較回数:xxxx回 #     交換回数:xxxx回 # #     データ数:40個 #     比較回数:xxxx回 #     交換回数:xxxx回 #      ・ #      ・ #      ・ #      ・ #    <バブルソート法> #     データ数:20個 #     比較回数:xxxx回 #     交換回数:xxxx回 # #     データ数:40個 #     比較回数:xxxx回 #     交換回数:xxxx回 #      ・ #      ・ #      ・ #      ・ # # レポートには以下のものを添付する事。 # (1)回数を計数するプログラムを加えたバブルソートプログラムと、それを実行するmain関数のプログラムリスト # (2)回数を計数するプログラムを加えたクイックソートプログラムと、それを実行するmain関数のプログラムリスト # (3)出力形式に基づいた両プログラムの計数結果 # (4)バブルソート法よりクイックソート法の比較、交換の回数が少ない理由 # # rand関数の使用例 # #include # #include # int main(void) # { # int i,n,ran,sum; # srand(time(NULL)); # printf("Number of trials:"); # scanf("%d",&n); # sum=0; # for(i=0;i= B, 分割(A,R1,LP_1,LP_2,_比較回数2,_移動回数2), _比較回数1 is _比較回数2 + 1, _移動回数1 is _移動回数2 + 1,!. 分割(A,[B|R1],LP_1,[B|LP_2],_比較回数1,_移動回数1) :- A @< B, 分割(A,R1,LP_1,LP_2,_比較回数2,_移動回数2), _比較回数1 is _比較回数2 + 2, _移動回数1 is _移動回数2 + 1,!. 結合([],Y,Y,1,1) :- !. 結合([U|X],Y,[U|Z],_比較回数,_移動回数1) :- 結合(X,Y,Z,_比較回数,_移動回数2), _移動回数1 is _移動回数2 + 1,!. 'バブルソートの比較・移動回数'(_対象ならび,_整列済みならび,_比較回数,_交換回数) :- 交換(_対象ならび,_対象ならびの一,_比較回数1,_交換回数1),!, バブルソート(_対象ならびの一,_整列済みならび,_比較回数2,_交換回数2), _比較回数 is _比較回数1 + _比較回数2, _交換回数 is _交換回数1 + _交換回数2,!. 'バブルソートの比較・移動回数'(_整列済みならび,_整列済みならび,_比較回数,0) :- length(_整列済みならび,_比較回数),!. 交換([A,B|R],[B,A|R],1,1) :- A @> B,!. 交換([A|R1],[A|R2],_比較回数1,_交換回数) :- 交換(R1,R2,_比較回数2,_交換回数), _比較回数1 is _比較回数2 + 2,!. 交換([],[],_,_) :- !,fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/347 # # [1] 授業単元:整列処理 # [2] 問題文(含コード&リンク): http://codepad.org/afHWYPLF # 問題が3問あります。長いので問題文もリンク先に書かせていただきました。 # # # # 【問題2】 # クイックソート法の特性を調べたい。同一の数列について、クイックソートプログラムの実行中に行われる # (1)比較の回数、(2)交換の回数を計数し、次にバブルソートプログラムの実行中に行われる # (1)比較の回数、(2)交換の回数を計数して比較せよ。また、バブルソート法よりクイックソート法の方が # 比較と交換の回数が少ない理由を考察せよ。ただし、数列はrand関数を用いて生成せよ。データの個数が、 # 20個、40個、60個、80個、100個の5つの場合について、比較と交換の回数を計数する。 # #    計数結果の出力形式 #    <クイックソート法> #     データ数:20個 #     比較回数:xxxx回 #     交換回数:xxxx回 # #     データ数:40個 #     比較回数:xxxx回 #     交換回数:xxxx回 #      ・ #      ・ #      ・ #      ・ #    <バブルソート法> #     データ数:20個 #     比較回数:xxxx回 #     交換回数:xxxx回 # #     データ数:40個 #     比較回数:xxxx回 #     交換回数:xxxx回 #      ・ #      ・ #      ・ #      ・ # # レポートには以下のものを添付する事。 # (1)回数を計数するプログラムを加えたバブルソートプログラムと、それを実行するmain関数のプログラムリスト # (2)回数を計数するプログラムを加えたクイックソートプログラムと、それを実行するmain関数のプログラムリスト # (3)出力形式に基づいた両プログラムの計数結果 # (4)バブルソート法よりクイックソート法の比較、交換の回数が少ない理由 # # rand関数の使用例 # #include # #include # int main(void) # { # int i,n,ran,sum; # srand(time(NULL)); # printf("Number of trials:"); # scanf("%d",&n); # sum=0; # for(i=0;i= B, 分割(A,R1,LP_1,LP_2,_比較回数2,_移動回数2), _比較回数1 is _比較回数2 + 1, _移動回数1 is _移動回数2 + 1,!. 分割(A,[B|R1],LP_1,[B|LP_2],_比較回数1,_移動回数1) :- A @< B, 分割(A,R1,LP_1,LP_2,_比較回数2,_移動回数2), _比較回数1 is _比較回数2 + 2, _移動回数1 is _移動回数2 + 1,!. 結合([],Y,Y,1,1) :- !. 結合([U|X],Y,[U|Z],_比較回数,_移動回数1) :- 結合(X,Y,Z,_比較回数,_移動回数2), _移動回数1 is _移動回数2 + 1,!. 'バブルソートの比較・移動回数'(_対象ならび,_整列済みならび,_比較回数,_交換回数) :- 交換(_対象ならび,_対象ならびの一,_比較回数1,_交換回数1),!, バブルソート(_対象ならびの一,_整列済みならび,_比較回数2,_交換回数2), _比較回数 is _比較回数1 + _比較回数2, _交換回数 is _交換回数1 + _交換回数2,!. 'バブルソートの比較・移動回数'(_整列済みならび,_整列済みならび,_比較回数,0) :- length(_整列済みならび,_比較回数),!. 交換([A,B|R],[B,A|R],1,1) :- A @> B,!. 交換([A|R1],[A|R2],_比較回数1,_交換回数) :- 交換(R1,R2,_比較回数2,_交換回数), _比較回数1 is _比較回数2 + 2,!. 交換([],[],_,_) :- !,fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/621 # # 3) 配列を利用して、23番目までのフィボナッチ数列を画面に整列させた状態で表示させなさい。 # 1,1,2,3,5,8,13,21,34,… #  [3.1] Windows7 #  [3.3] C言語 # [4] 木曜19時まで # [5] 配列まで # わかる方どうかよろしくお願いします。 # '23番目までのフィボナッチ数列を画面に整列させた状態で表示させる' :- フィボナッチ数列(23,L), concat_atom(L,',',S), writef('%t\n',[S]). フィボナッチ数列(N,L) :- フィボナッチ数列(0,N,[0],L). フィボナッチ数列(Max,Max,L1,L) :- reverse(L1,L),!. フィボナッチ数列(0,Max,L1,L) :- フィボナッチ数列(1,Max,[1|L1],L),!. フィボナッチ数列(1,Max,L1,L) :- フィボナッチ数列(2,Max,[1|L1],L),!. フィボナッチ数列(N,Max,[A,B|R1],L) :- N2 is N + 1, C is A + B, フィボナッチ数列(N2,Max,[C,A,B|R1],L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/621 # # [1] C言語演習 # [2] http://ime.nu/codepad.org/QMwiwwtp を改良して、 #   80〜100:優 70〜 79:良 60〜 69:可 0〜 59:不可 #  の分布グラフを表示するプログラムを作成しなさい。 # 【実行結果】 # 点数を入力してください。 # 1番:17 # 2番:38 # 3番:100 # 4番:95 # 5番:23 # □ 分布グラフ □ #  優:** #  良: #  可: # 不可:*** # ◆´,魏造して、「不可一覧表」も表示できるようにしなさい。 # 【実行結果】 # ,離廛蹈哀薀爐硫爾 # 不可一覧表 # 1番 ( 17点) # 2番 ( 38点) # 5番 ( 23点) # と表示させる。 #  配列を利用して、23番目までのフィボナッチ数列を画面に整列させた状態で表示させなさい。 # 1,1,2,3,5,8,13,21,34,… #  [3.1] Windows7 #  [3.3] C言語 # [4] 木曜19時まで # [5] 配列まで # わかる方どうかよろしくお願いします。 # # '入力する人数を得て、その人数分の点数を入力する。それを80〜100:優 70〜 79:良 60〜 69:可 0〜 59:不可 の分布グラフとして表示しなさい。さらに不可一覧表も表示しなさい' :- 入力する人数を得る(_人数), n人分の点数を得る(_人数,_点数ならび), グラフ分布(_点数ならび,L1,L2,L3,L4), グラフ表示(L1,L2,L3,L4), 不可一覧表表示(_点数ならび). 入力する人数を得る(_人数) :- write('入力する人数を入れてください : '), get_line(Line), 入力する人数診断(Line,_人数),!. 入力する人数を得る(_人数) :- 入力する人数を得る(_人数). 入力する人数診断(Line,_人数) :- atom_to_term(Line,_人数,_), integer(_人数), _人数 > 0,!. 入力する人数診断(Line,_人数) :- writef('入力された %t から人数が得られません。再入力をお願いします。\n',[Line]), fail. n人分の点数を得る(_n人分,_点数ならび) :- length(_点数ならび,_n人分), findall(_点数,( append(_,[_点数|_],_点数ならび), 点数を入力してください(_点数)), _点数ならび). 点数を入力してください(_点数) :- writef('点数を入力してください : '), get_line(Line,_点数,_), 点数入力診断(Line,_点数),!. 点数を入力してください(_点数) :- 点数を入力してください(_点数). 点数入力診断(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), _点数 >= 0, _点数 =< 100,!. 点数入力診断(Line,_点数) :- writef('入力された %t から適切な点数が得られません。再入力をお願いします。\n',[Line]), fail. グラフ分布([],[],[],[],[]). グラフ分布([_点数|R],[*|L1],L2,L3,L4) :- _点数 >= 80,_点数 =< 100, グラフ分布(R,L1,L2,L3,L4). グラフ分布([_点数|R],L1,[*|L2],L3,L4) :- _点数 >= 70,_点数 =< 79, グラフ分布(R,L1,L2,L3,L4). グラフ分布([_点数|R],L1,L2,[*|L3],L4) :- _点数 >= 60,_点数 =< 69, グラフ分布(R,L1,L2,L3,L4). グラフ分布([_点数|R],L1,L2,L3,[*|L4]) :- _点数 >= 0,_点数 =< 59, グラフ分布(R,L1,L2,L3,L4). グラフ表示(L1,L2,L3,L4) :- concat_atom(L1,_優), concat_atom(L2,_良), concat_atom(L3,_可), concat_atom(L4,_不可), writef(' 優: %t\n 良: %t\n 可: %t\n不可: %t\n',[_優,_良,_可,_不可]). 不可一覧表表示(_点数ならび) :- append(L0,[_点数|_],_点数ならび), _点数 < 60, length([_|L0],_n番目), writef('[%t番目] %t点\n',[_n番目,_点数]), fail. 不可一覧表表示(_点数ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/425 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # この問題では、数列として扱う値はすべて実数での処理を想定する # 初項および項数を入力すると、その等差数列の和を求めるプログラムを作成する # ○公式を利用して求める場合→項数(初項+末項)÷2 # ○1つずつの項を順次足し合わせる場合→公差=(末項−初項)÷(項数−1) # との2種類の計算方法で値を求めるプログラムを作成しなさい # 公式を利用して等差数列の和を求める(_初項,_末項,_項数,_等差数列の和) :- '公式を利用して求める場合→項数(初項+末項)÷2'(_初項,_末項,_項数,_等差数列の和),!. '1つずつの項を順次足し合わせて等差数列の和を求める'(_初項,_末項,_項数,_等差数列の和) :- '1つずつの項を順次足し合わせる場合→公差=(末項‐初項)÷(項数‐1)'(_初項,_末項,_項数,_等差数列の和). '公式を利用して求める場合→項数(初項+末項)÷2'(_初項,_末項,_項数,_等差数列の和) :- _等差数列の和 is ((_初項 + _末項) * _項数) / 2. '1つずつの項を順次足し合わせる場合→公差=(末項‐初項)÷(項数‐1)'(_初項,_末項,_項数,_等差数列の和) :- 公差を求める(_初項,_末項,_項数,_公差), 等差数列の和(1,_項数,_公差,0.0,_等差数列の和). 交差を求める(_初項,_末項,_項数,_公差) :- _公差 is (_末項 - _初項) / (_項数 - 1). 等差数列の和(M,_項数,_,_等差数列の和,_等差数列の和) :- M > _項数,!. 等差数列の和(M,_項数,_公差,_等差数列の和の累積値1,_等差数列の和) :- _等差数列の和の累積値2 is _等差数列の和の累積値1 + _項差, M2 is M + 1, 等差数列の和(M2,_項数,_公差,_等差数列の和の累積値2,_等差数列の和). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/106 # # ストアドプロシージャについて質問させてください。 # # 簡単な結果を返すクエリ # SELECT A,B,C FROM TEST # # といったクエリの結果を戻り値として返すストアドを作成したいのですが # どのように書けば良いのかわかりません。 # # 単一の列のみを返す方法ならわかったのですが、複数列を返す方法が # 分からないといった状態です。 # テーブル構造('TEST',1,'A'). テーブル構造('TEST',2,'B'). テーブル構造('TEST',3,'C'). 簡単な結果を返すクエリ(_テーブル名,_選択項ならび,_値ならび) :- count(テーブル構造('TEST',_,_),Len), length(_値ならび,Len), findsetof(_,( テーブル構造(_テーブル名,Nth,_)), L), P =.. [_テーブル|_変数ならび], call(P), 選択項と値の結合(L,_選択項ならび,_値ならび). 選択項と値の結合(_テーブル名,L,[],[]) :- !. 選択項と値の結合(_テーブル名,L,[_選択項|R1],[_値|R2]) :- テーブル構造(_テーブル名,Nth,_選択項), list_nth(Nth,L,_値), 選択項と値の結合(_テーブル名,L,R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/106 # # ストアドプロシージャについて質問させてください。 # # 簡単な結果を返すクエリ # SELECT A,B,C FROM TEST # # といったクエリの結果を戻り値として返すストアドを作成したいのですが # どのように書けば良いのかわかりません。 # # 単一の列のみを返す方法ならわかったのですが、複数列を返す方法が # 分からないといった状態です。 # 簡単な結果を返すクエリ(_A,_B,_C) :- 'TEST'(_A,_B,_C). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1258320456/229 # # project euler problem02 # http://ime.nu/odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%202 # # フィボナッチ数列の項は前の2つの項の和である。最初の2項を 1, 2 とすれば、最初の10項は以下の通りである。 # 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... # 数列の項が400万を超えない範囲で、偶数の項の総和を求めよ。 # # (´・ω・`)再帰で書いたら深度が深すぎて怒られました。だれか教えてください。 # # 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(_偶数の項の総和) :- 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(偶数番目,1,2,0,_偶数の項の総和). 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(_,N1,N2,_偶数の項の総和,_偶数の項の総和) :- N1 + N2 > 4000000,!. 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(偶数番目,N1,N2,_偶数の項の総和_1,_偶数の項の総和) :- N3 is N1 + N2, _偶数の項の総和_2 is _偶数の項の総和_1 + N2, 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(奇数番目,N2,N3,_偶数の項の総和_2,_偶数の項の総和). 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(奇数番目,N1,N2,_偶数の項の総和_1,_偶数の項の総和) :- N3 is N1 + N2, 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(偶数番目,N2,N3,_偶数の項の総和_2,_偶数の項の総和). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1258320456/229 # # project euler problem02 # http://ime.nu/odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%202 # # フィボナッチ数列の項は前の2つの項の和である。最初の2項を 1, 2 とすれば、最初の10項は以下の通りである。 # 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... # 数列の項が400万を超えない範囲で、偶数の項の総和を求めよ。 # # (´・ω・`)再帰で書いたら深度が深すぎて怒られました。だれか教えてください。 # # 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(_偶数の項の総和) :- 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(1,1,2,0,_偶数の項の総和). 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(_,N1,N2,_偶数の項の総和,_偶数の項の総和) :- N1 + N2 > 4000000,!. 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(M1,N1,N2,_偶数の項の総和_1,_偶数の項の総和) :- N3 is N1 + N2, _偶数の項の総和_2 is _偶数の項の総和_1 + N2 * M1, 'トグル-0-1'(M1,M2), 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(M2,N2,N3,_偶数の項の総和_2,_偶数の項の総和). 'トグル-0-1'(0,1) :- !. 'トグル-0-1'(1,0) :- !. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/287 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1356601.txt # # 問題1 # f(0)=f(1)=1. f(n)=f(n-2)+f(n-1) (n≧2)で定まる数列(Fibonacci数列)のf(n)の値と # f(n)までの合計を計算して、表示せよ f(20)まで # 'f(0)=f(1)=1. f(n)=f(n-2)+f(n-1) (n≧2)で定まる数列(Fibonacci数列)のf(n)の値とf(n)までの合計を計算して、表示せよ f(20)まで'(_n) : _n >= 1, _n =< 20, 'f(n)までの値'(_n,_値), 'f(n)までの合計'(_n,_合計), write_formatted('Fibonacci数列のf(%t)の値は%t,f(%t)までの合計は%t\n',[_n,_値,_n,_合計]). 'f(n)までの値'(_n,_値) :- f(_n,_値). f(0,1). f(1,1). f(_n,_値) :- _n >= 2, _n_2 is _n - 2, _n_1 is _n - 1, f(_n_2,_値_2), f(_n_1,_値_1), _値 is _値_2 + _値_1. 'f(n)までの合計'(_n,_合計) :- findsum(_値,( for(0,M,_n), f(M,_値)), _合計の一), _合計 is truncate(_合計の一). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/746 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 問題2  30個目までのフィボナッチ数を順に計算し、その結果を順に配列 fib に格納しなさい。 また計算終了後に、 a_1, a_2, a_16, a_25 に相当する結果を表示しなさい。 # <実行例> # a_01 = 1 # a_02 = 1 # a_16 = 987 # a_25 = 75025 # '30個目までのフィボナッチ数を順に計算し、その結果を順に配列 fib に格納しなさい。また計算終了後に、a_1, a_2, a_16, a_25 に相当する結果を表示しなさい。'(_fib) :- '30個目までのフィボナッチ数を順に計算し、その結果を順に配列 fib に格納しなさい。'(_fib), 'また計算終了後に、a_1, a_2, a_16, a_25 に相当する結果を表示しなさい。'(_fib). '30個目までのフィボナッチ数を順に計算し、その結果を順に配列 fib に格納しなさい。'(_fib) :- length(_fib,30), 'n番目までのフィボナッチ数列'(_fib). n番目までのフィボナッチ数列([1]) :- !. n番目までのフィボナッチ数列([1,1]) :- !. n番目までのフィボナッチ数列([1,1|R]) :- n番目までのフィボナッチ数列の二([1,1|R]). n番目までのフィボナッチ数列の二([A,B,C]) :- C is A + B,!. n番目までのフィボナッチ数列の二([A,B,C|R]) :- C is A + B, n番目までのフィボナッチ数列の二([B,C|R]),!. 'また計算終了後に、a_1, a_2, a_16, a_25 に相当する結果を表示しなさい。'(_fib) :- append(_,[_何番目|R],[1,2,16,25]), length([_|L0],_何番目), append(L0,[_何番目のフィボナッチ数|_],_fib), write_formatted('a_%02d = %t\n',[_何番目,_何番目のフィボナッチ数]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/714 # # [1] 授業単元:cプログラミング1 # [2] 問題文(含コード&リンク): # 問題3:実数xを引数とし、数列an=1/n!(n=0,・・・9)を係数にもつ多項式f(x)=a0 + a1x + ・・・a8x^8 + a9x^9 # の値を計算して返す関数をforループを用い作成しmain文の中から呼び出し動作を確認する。 # '実数xを引数とし、数列an=1/n!(n=0,・・・9)を係数にもつ多項式f(x)=a0 + a1x + ・・・a8x^8 + a9x^9の値を計算して返す'(X,_多項式の値) :- findsum(U,( for(0,_n,9), 階乗(_n,_階乗), U is (1 / _階乗) * X ^ _n), _多項式の値). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/657 # # 【 課題 】 # (4)配列を使って、n番目までのフィボナッチ数列を表示するプログラム。 # 最大何番目の値が求められるか確かめること。 # # 【 形態 】http://ime.nu/www.javadrive.jp/install/jdk/で設定したのですが1でしょうか… # 【 期限 】12月16日です # 【 Ver  】1.6.0_22 # 【 補足 】ぎりぎりで丸投げですがよろしくお願いします! # # 'n番目までのフィボナッチ数列を表示する'(N) :- length(L,N), n番目までのフィボナッチ数列(L), write_formatted('%t\n',[L]). n番目までのフィボナッチ数列([1]) :- !. n番目までのフィボナッチ数列([1,1]) :- !. n番目までのフィボナッチ数列([1,1|R]) :- n番目までのフィボナッチ数列の二([1,1|R]). n番目までのフィボナッチ数列の二([A,B,C]) :- C is A + B,!. n番目までのフィボナッチ数列の二([A,B,C|R]) :- C is A + B, n番目までのフィボナッチ数列の二([B,C|R]),!. % 以下のサイトは # 配列分からないので助けてください! # [1] 授業単元:Cプログラミング(配列) # [2] 問題文(含コード&リンク): http://www.dotup.org/uploda/www.dotup.org1291228.txt # [3] 環境 #  [3.1] Linux #  [3.2] gcc #  [3.3] 言語: C # 問題5:実数xの値をキーボードから入力し数列an=1/n! (n=0...9)を係数に持つ多項式 # f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を計算して表示するプログラム。forループを使うこと # 配列分からないので助けてください! '実数xの値をキーボードから入力し数列an=1/n! (n=0...9)を係数に持つ多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を計算して表示する' :- '実数xの値をキーボードから入力し'(_実数x), '数列an=1/n! (n=0...9)を係数に持つ多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(_実数x,_多項式の項表示ならび,_多項式の値), 表示する(_実数x,_多項式の項表示ならび,_多項式の値). '実数xの値をキーボードから入力し'(_実数x) :- 催促付き実数入力('実数値を入力してください : ',_実数x),!. '数列an=1/n! (n=0...9)を係数に持つ多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(_実数x,_多項式の項表示ならび,_多項式の値) :- '数列an=1/n! (n=0...9)を係数に持つ'(_係数ならび), '多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(0,_係数ならび,_実数x,_多項式の項表示ならび,0.0,_多項式の値). '数列an=1/n! (n=0...9)を係数に持つ'(_係数ならび) :- findall(1/U,( for(0,N,9), 階乗(N,U)), _係数ならび). '多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(_,[],_,[],_多項式の値,_多項式の値) :- !. '多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(N,[_係数|R],[_項表示|R2],_実数x,S1,_多項式の値) :- S2 is S1 + _係数 * (_実数X ^ N), write_formatted_atom(_項表示,'%t*x^%1d',[_係数,N]), N_1 is N - 1, '多項式f(x)=a0+a1x+・・・+a8x^8+a9x^9の値を'(N_1,R,_実数x,R2,S2,_多項式の値). 催促付き実数入力(_催促文,_実数) :- write(_催促文), get_line(Line), 催促付き実数入力診断(Line,_実数),!. 催促付き実数入力(_催促文,_実数) :- 催促付き実数入力(_催促文,_実数). 催促付き実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), float(_実数),!. 催促付き実数入力診断(Line,_実数) :- write_formatted('入力された %t から実数値は得られませんでした。再入力をお願いします。\n',[Line]), fail. 表示する(_実数x,_多項式の項表示ならび,_多項式の値) :- concat_atom(_多項式の項表示ならび,'+',_多項式表示), write_formatted('f(x)=%t に於いて、 x=%t\n',[_多項式表示,_実数x]), write_formatted('f(%t)=%t\n',[_実数x,_多項式の値]). 催促付き実数入力(_催促文,_実数) :- write(_催促文), get_line(Line), 催促付き実数入力診断(Line,_実数),!. 催促付き実数入力(_催促文,_実数) :- 催促付き実数入力(_催促文,_実数). 催促付き実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), float(_実数),!. 催促付き実数入力診断(Line,_実数) :- write_formatted('入力された %t から実数値は得られませんでした。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 配列分からないので助けてください! # [1] 授業単元:Cプログラミング(配列) # [2] 問題文(含コード&リンク): http://www.dotup.org/uploda/www.dotup.org1291228.txt # [3] 環境 #  [3.1] Linux #  [3.2] gcc #  [3.3] 言語: C # 問題4:実数xの値をキーボードから入力し数列an=n+1(n=0...9)を係数に持つ多項式 # f(x)=a9x^9+a8x^8+・・・a1x+a0の値を計算して表示するプログラム。forループを使うこと # '実数xの値をキーボードから入力し数列an=n+1(n=0...9)を係数に持つ多項式f(x)=a9x^9+a8x^8+・・・a1x+a0の値を計算して表示する' :- '実数xの値をキーボードから入力し'(_実数x), '数列an=n+1(n=0...9)を係数に持つ多項式f(x)=a9x^9+a8x^8+・・・a1x+a0の値を計算して'(_実数x,_多項式の値,_多項式の項標示ならび), 表示する(_実数x,_多項式の項表示ならび,_多項式の値). '実数xの値をキーボードから入力し'(_実数) :- 催促付き実数入力('実数を入力してください : ',_実数),!. '数列an=n+1(n=0...9)を係数に持つ多項式f(x)=a9x^9+a8x^8+・・・a1x+a0の値を計算して'(_実数x,_多項式の値,_多項式の項標示ならび) :- '数列an=n+1(n=0...9)を係数に持つ'(_係数ならび), '多項式f(x)=a9x^9+a8x^8+・・・a1x+a0の値を計算して'(9,_係数ならび,_実数x,0.0,_多項式の値,_多項式の項表示ならび). '数列an=n+1(n=0...9)を係数に持つ'(_係数ならび) :- findall(U,( for(0,N,9), U is N + 1), L), reverse(L,_係数ならび). '多項式f(x)=a9x^9+a8x^8+・・・a1x+a0の値を計算して'(N,_,_,[],_多項式の値,_多項式の値) :- N < 0,!. '多項式f(x)=a9x^9+a8x^8+・・・a1x+a0の値を計算して'(N,[_係数|R],_実数x,[_項表示|R2],S1,_多項式の値) :- U is _係数 * (_実数x ^ N), write_formatted_atom(_項表示,'%1dx%1d',[_係数,N]), S2 is S1 + U, N_1 is N - 1, '多項式f(x)=a9x^9+a8x^8+・・・a1x+a0の値を計算して'(N_1,[_係数|R],_実数x,R2,S2,_多項式の値). 表示する(_実数x,_多項式の項表示ならび,_多項式の値) :- concat_atom(_多項式の項表示ならび,'+',_多項式表示), write_formatted('f(x)=%t に於いて、 x=%t\n',[_多項式表示,_実数x]), write_formatted('f(%t)=%t\n',[_実数x,_多項式の値]). 催促付き実数入力(_催促文,_実数) :- write(_催促文), get_line(Line), 催促付き実数入力診断(Line,_実数),!. 催促付き実数入力(_催促文,_実数) :- 催促付き実数入力(_催促文,_実数). 催促付き実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), float(_実数),!. 催促付き実数入力診断(Line,_実数) :- write_formatted('入力された %t から実数値は得られませんでした。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/958 # # 【質問テンプレ】 # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク):ランダムな整数列を生成し,クイックソートにより並 #               べ替えるプログラムを作れ 'ランダムな整数列を生成し,クイックソートにより並べ替える'(L1,L2) :- ランダムな整数列を生成し(L1), クイックソートにより並べ替える(L1,L2). ランダムな整数列を生成し(L1) :- _乱順整数 is random, ランダムな整数列を生成し([_,_,_],_乱順整数,L1). ランダムな整数列を生成し([_],_乱順整数,[]) :- 55 is _乱順整数 mod 100,!. ランダムな整数列を生成し([_|Ln],_乱順整数,[_乱順整数の一|R]) :- 55 is _乱順整数 mod 100, _乱順整数の一 is _乱順整数 mod 1000, _乱順整数の二 is random, ランダムな整数列を生成し(Ln,_乱順整数の二,R). ランダムな整数列を生成し(Ln,_乱順整数,[_乱順整数の一|R]) :- _乱順整数の一 is _乱順整数 mod 1000, _乱順整数の二 is random, ランダムな整数列を生成し(Ln,_乱順整数の二,R). クイックソートにより並べ替える([],[]) :- !. クイックソートにより並べ替える([A|L1],L2) :- 'Aに対して大小で分割する'(A,L1,_Aより小さいならび,_Aに等しいかAより大きいならび), クイックソートにより並べ替える(_Aより小さいならび,L3), クイックソートにより並べ替える(_Aに等しいかAより大きいならび,L4), append(L3,[A|L4],L2). 'Aに対して大小で分割する'(A,[],[],[]) :- !. 'Aに対して大小で分割する'(A,[B|R1],[B|R2],R3) :- A @> B, 'Aに対して大小で分割する'(A,R1,R2,R3). 'Aに対して大小で分割する'(A,[B|R1],R2,[B|R3]) :- A @=< B, 'Aに対して大小で分割する'(A,R1,R2,R3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/294 # # [1] 授業単元: プログラミング # [2] 問題文: # 変数iに100が入っています、 # # iとは別に、50,75,55,60というように、ランダムな数字の配列があり、 # 次にくる数字が前の数字(ここでは60)より、5%大きかったら、 # iに1を加算するプログラムを作成。 # # -5%なら-1で、10%なら+2するといった感じです。5%未満なら加算しません。 # '変数iに100が入っています、iとは別に、50,75,55,60というように、ランダムな数字の配列があり、次にくる数字が前の数字(ここでは60)より、5%大きかったら、iに1を加算する。-5%なら-1で、10%なら+2するといった感じです。5%未満なら加算しません。'(_ランダムな数1,_ランダムな数2,_i) :- length(_ランダムな数ならび,100), ランダムな数列を得る(_ランダムな数ならび), 変数iの変化をみる(100,_ランダムな数ならび,_ランダムな数1,_ランダムな数2,_i). 変数iの変化をみる(_i1,[_ランダムな数1,_ランダムな数2|R],_ランダムな数11,_ランダムな数12,_i) :- iの変化(_ランダムな数1,_ランダムな数2,_i1,_i2), 変数iの変化をみる(_i2,_ランダムな数1,_ランダムな数2,R,_ランダムな数11,_ランダムな数12,_i). 変数iの変化をみる(_i,_ランダムな数1,_ランダムな数2,R,_ランダムな数1,_ランダムな数2,_i). 変数iの変化をみる(_i2,_ランダムな数1,_ランダムな数2,R,_ランダムな数11,_ランダムな数12,_i) :- 変数iの変化をみる(_i2,[_ランダムな数2|R],_ランダムな数11,_ランダムな数12,_i). iの変化(_ランダムな数1,_ランダムな数2,_i1,_i2) :- '_ランダムな数の変化率が5%,-5%,10%以上変化したら_i1を_i2に変化される'(_ランダムな数1,_ランダムな数2,_i1,_i2),!. iの変化(_ランダムな数1,_ランダムな数2,_i1,_i1). '_ランダムな数の変化率が5%,-5%,10%以上変化したら_i1を_i2に変化される'(_ランダムな数1,_ランダムな数2,_i1,_i2) :- '5%大きかったらiに1を加算する'(_ランダムな数1,_ランダムな数2,_i1,_i2). '_ランダムな数の変化率が5%,-5%,10%以上変化したら_i1を_i2に変化される'(_ランダムな数1,_ランダムな数2,_i1,_i2) :- '-5%大きかったらiに-1を加算する'(_ランダムな数1,_ランダムな数2,_i1,_i2). '_ランダムな数の変化率が5%,-5%,10%以上変化したら_i1を_i2に変化される'(_ランダムな数1,_ランダムな数2,_i1,_i2) :- '10%大きかったらiに2を加算する'(_ランダムな数1,_ランダムな数2,_i1,_i2). '5%大きかったらiに1を加算する'(_ランダムな数1,_ランダムな数2,_i1,_i2) :- _ランダムな数2 > _ランダムな数1 * 1.05, _i2 is _i + 1. '-5%大きかったらiに-1を加算する'(_ランダムな数1,_ランダムな数2,_i1,_i2) :- _ランダムな数2 < _ランダムな数1 * 0.95, _i2 is _i - 1. '10%大きかったらiに2を加算数(_ランダムな数1,_ランダムな数2,_i1,_i2) :- _ランダムな数2 > _ランダムな数1 * 1.10, _i2 is _i + 2. ランダムな数列を得る([]). ランダムな数列を得る([_ランダムな数|R]) :- _ランダムな数 is random(30), ランダムな数列を得る(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/825 # # すいませんが823は書き間違えました # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # ・ランダムな整数列を生成し,選択ソートにより並べ替えるプ # ログラムを作れ。 # (randを使用すること) # •またその実行時間を計測せよ # – UNIXのtime コマンドを使用すること # program :- user_parameters([A]), atom_to_term(A,_要素数,_), ランダムな整数列を生成し,選択ソートにより並べ替える(_要素数,_整列された整数列), halt. ランダムな整数列を生成し,選択ソートにより並べ替える(_要素数,_整列された整数列) :- ランダムな整数列を生成し(_要素数,_整数列), 選択ソート(_整数列,_整列された整数列). ランダムな整数列を生成し(_要素数,_整数列) :- length(_整数列,_要素数), ランダムな整数列を生成し(_整数列). ランダムな整数列を生成し([]) :- !. ランダムな整数列を生成し([_ランダムな数|R]) :- _ランダムな数 is random, ランダムな整数列を生成し(R). 選択ソート([],[]) :- !. 選択ソート(L1,L2) :- min(L1,Min), 選択ソート(Min,L1,L2). 選択ソート(_,[A],[A]) :- !. 選択ソート(Min,[Min|R],[Min|L2]) :- min(R,Min2), 選択ソート(Min2,R,L2),!. 選択ソート(Min,L1,[Min|L2]) :- append([A0|R0],[Min|R],L1), append(R0,[A0|R],L3), min(L3,Min2), 選択ソート(Min2,L3,L2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/263 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # スタックを利用して、与えられたnに関するFarey数列の要素数を求めるプログラムを完成させよ。 # #include <stdio.h> # #include <stdlib.h> # #define MAX 100000 # main(){ # int count,n,top,x[MAX],y[MAX],w; # scanf("%d",&n); # x[0]=0; y[0]=1; # x[1]=1; y[1]=1; # count=2; # top=2; # while(top>1){ # # # # } # printf("%dに関するFarey数の個数:%d\n",n,count);} # 与えられたnに関するFarey数列の要素数を求める(_n,_要素数) :- findall(M,for(1,M,_n),L), count((組み合わせ(L,2,[A,B]), 最大公約数(A,B,1)),_1を除く要素数), _要素数 is 1 + _1を除く要素数. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/633 # # [1]C言語中級 # [2]指定されたフロー構造に基づき次の仕様のプログラムを作成せよ # 仕様: # ★行とは、先頭か最後の区切り子からその次の区切り子までの区切り子を含まない文字列のこと # ただしその次の区切り子が出現しないまま終端した場合は最後の文字列まで # ★区切り子とは、改行文字(0x0A) 復改文字(0x0D),その組み合わせ(0x0D0x0A,0x0A0x0D)のいずれかと # する(混在することを前提) # ★標準入力から任意の長さの文字列を読み取り各行の空白スペースを除く先頭が0〜9からなる # 文字列(これをキー数列と呼ぶ)でその直後が空白、タブで区切られている場合に限りその行を認識する。 # それ以外の形式の場合は認識せず無視する。キー数列の長さが1024を超える場合も無視対象とする。 # ★認識した行はキー数列を10進数の正整数を表すものとして、その順序(小さい順)に # 整列して出力する # フロー構造 # main関数のみで構成。ライブラリ関数はstdio.hで定義されている関数のみを利用可能とする。 # 当然だが記憶領域はキー数列を記憶する領域の3倍程度しか確保できないことを前提 # [3] FreeBSD上でC言語で記述しgccコンパイラで処理する。 # [4] 10/10迄 # '標準入力から任意の長さの文字列を読み取り各行の空白スペースを除く先頭が0〜9からなる文字列(これをキー数列と呼ぶ)でその直後が空白、タブで区切られている場合に限りその行を認識する。' :- get_chars(Chars), 行と認識(Chars,'',_行ならび), sort(_行ならび,_昇順の行ならび), 文字列部分のみ出力(L2). 行と認識([],_行,[[_10進キー数値,_行]]) :- 行検査(_行,_10進キー数値),!. 行と認識([],_行,[]) :- !. 行と認識(['\r','\n'|R],_行,[[_10進キー数値,_行]|R2]) :- 行検査(_行,_10進キー数値), 行と認識(R,'',R2),!. 行と認識(['\n','\r'|R],_行,[[_10進キー数値,_行]|R2]) :- 行検査(_行,_10進キー数値), 行と認識(R,'',R2),!. 行と認識(['\r'|R],_行,[[_10進キー数値,_行]|R2]) :- 行検査(_行,_10進キー数値), 行と認識(R,'',R2),!. 行と認識(['\n'|R],_行,[[_10進キー数値,_行]|R2]) :- 行検査(_行,_10進キー数値), 行と認識(R,'',R2),!. 行と認識([A|R1],_行1,R2) :- \+(member(A,['\n','r'])), atom_concat(_行1,A,_行2), 行と認識(R1,_行2,R2). 行と認識([A|R1],_行1,R2) :- member(A,['\n','\r']), 行と認識(R1,_行1,R2). 文字列部分のみ出力(L) :- append(_,[[_,_行]|R],L), write_formatted('%t\n',[_行]), R = []. 行検査(_行,N) :- 空白・タブを読み飛ばす(_行,_行1), sub_atom(_行1,Len1,1,Len2,A), Len1 =< 1024, member(A,[' ','\t']), sub_atom(_行1,0,Len1,0,B), 全て数字(0,Len1,B), atom_to_chars(B,Bcodes), encode(Bcodes,N). 空白・タブを読み飛ばす(_行,_行1) :- sub_atom(_行,Len,1,Rlen,A), \+(member(A,[' ','\t'])), Len2 is Len + 1, sub_atom(_行,Len2,Rlen,_行1). 全て数字(Len,Len,_) :- !. 全て数字(M,Len,B) :- sub_atom(B,M,1,_,C), member(C,['0','1','2','3','4','5','6','7','8','9']), M2 is M + 1, 全て数字(M2,Len,B). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1279286575/74 # # 【質問テンプレ】 # [1] 授業単元:情報処理課題 # [2] 問題文(含コード&リンク):英語の文章で構成されるテキストファイルに対して、その中に含まれる総文字数と異なる文字ごとの出現回数とを数え上げよ。 # [3.3] 言語:C # [4] 期限:2010年07月19日00:00まで # [5] その他の制限:Xcodeを使用しています。読み込むファイルは"/Users/user/Desktop/data.txt"で。 # # 似たようなプログラムを作った時は「数列を入力し総文字数と数字ごとに出現回数とを数え上げグラフで表示」というような課題で # 数字だったので0〜9までを表示することが簡単に出来ましたがアルファベットなのでa-zをどう表示したものか # またstrlenだと半角空白も数えてしまうので総"文字"数とずれてくるのではないかと悩んでいます。 # よろしくお願いします。 # # 英語の文章で構成されるテキストファイルに対して、その中に含まれる総文字数と異なる文字ごとの出現回数とを数え上げる(_総文字数,_文字ごとの出現度数ならび) :- get_chars('/Users/user/Desktop/data.txt',Chars), length(Chars,_総文字数), findsetof(C,member(C,Chars),L1), findall([C,_出現度数],(member(C,L1),count(member(C,Chars),_出現度数)),_文字ごとの出現度数ならび). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/246 # # [1] 授業単元:計算機とアルゴリズム # [2] 問題文(含コード&リンク):数列と漸化式を表示できるように9行目からお願いします。http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10754.txt # 練習問題1 # 01: #include # 02: # 03: main() # 04:{ # 05: int n, m, an, sum; # 06: # 07: m = 5; # 08: printf("数列 an = n*n とその和を %d 項目まで表示します\n",m); # # 練習問題2 # 01: #include # 02: # 03: main() # 04:{ # 05: int n, m, an; # 06: # 07: m = 5; # 08: printf("漸化式 a(n) = 2*a(n-1), a1 = 2 で生成される数列を %d 項目まで表示します\n"); # '数列 an = n*n とその和をM項目まで表示する'(M) :- '数列 an = n*n とその和をM項目まで'(M,_数列,_和), write_formatted('%t 和=%t\n',[_数列,_和]). '数列 an = n*n とその和をM項目まで'(M,_数列,_和) :- findall(U,(for(1,N,M),U is N * N),_数列), 加算(_数列,_和_1), _和 is truncate(_和_1). '漸化式 a(n) = 2*a(n-1), a1 = 2 で生成される数列をM項目まで表示します'(M) :- '漸化式 a(n) = 2*a(n-1), a1 = 2 で生成される数列をM項目まで'(M,_数列), write_formatted('%t\n',[_数列]). '漸化式 a(n) = 2*a(n-1), a1 = 2 で生成される数列をM項目まで'(M,_数列) :- findall(U,(for(1,N,M),a(N,U)),_数列). a(1,2). a(N,X) :- N1 is N - 1,a(N1,Y),X is 2 * Y. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/942 # # [1] プログラミング入門 # [2] 1+2+3+…n≦1000となるように、nの最大値とそのときの合計を求め、表示するプログラムを作成せよ #   注:「等差数列の和の公式は」ではなく、while文またはfor文を使用すること。 # '1+2+3+…n≦1000となるように、nの最大値とそのときの合計を表示' :- '1+2+3+…n≦1000となるように、nの最大値とそのときの合計を表示'(_nの最大値,_合計), write_formatted('nの最大値=%t,そのときの合計=%t\n',[_nの最大値,_合計]). '1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_nの最大値,_合計) :- '1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(1,_nの最大値,0,_合計). '1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_n,_nの最大値,_合計1,_合計) :- _n2 is _n + 1, _合計2 is _合計1 + _n, _合計2 =< 1000, '1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_n2,_nの最大値,_合計2,_合計). '1+2+3+…n≦1000となるように、nの最大値とそのときの合計'(_nの最大値,_nの最大値,_合計,_合計). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/194 # # [1] 授業単元: プログラミング1 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10277.txt # # 必修課題2 # 初項1公差1の等差数列がある(An={1 2 3 4 5 ・・・n})。数値XとYを入力して、 # この数列におけるX項からY項までの数列の和を算出するプログラムを作成せよ。 # 実行結果の例を以下に示す。 # ------------------------------------------------ # 第X項から:1 # 第Y項まで:10 # 初項1公差1の等差数列において、 # 第1項から第10項までの数列の和は55です。 # ------------------------------------------------ 初項1公差1の等差数列におけるX項からY項までの数列の和を算出する(X,Y,_数列の和) :- 初項1公差1の等差数列におけるX項からY項までの数列の和を算出する(X,Y,_,_数列の和). 初項1公差1の等差数列におけるX項からY項までの数列の和を算出する(X,Y,_初項1公差1の等差数列,_数列の和) :- 初項1公差1の等差数列におけるX項からY項までの数列の(X,Y,_初項1公差1の等差数列,_X項からY項までの数列), 和を算出する(_X項からY項までの数列,_数列の和). 初項1公差1の等差数列におけるX項からY項までの数列の(X,Y,_等差数列,_X項からY項までの数列) :- 初項1公差1の等差数列(_等差数列), 'X項からY項までの数列の'(X,Y,_等差数列,_X項からY項までの数列),!. 初項1公差1の等差数列(_等差数列) :- 初項1公差1の等差数列(1,_等差数列). 初項1公差1の等差数列(M,[M|R]) :- 公差1の(M,N), 初項1公差1の等差数列(N,X). 公差1の(M,N) :- succ(M,N). 'X項からY項までの数列の'(X,Y,_等差数列,_X項からY項までの数列) :- 'X項からY項までの数列'(X,Y,_X項からY項までの数列), append(_,_X項からY項までの数列,_,_等差数列), 'X項からY項までの数列は全て整数'(_X項からY項までの数列). 'X項からY項までの数列'(X,Y,_X項からY項までの数列) :- length([_|L1],X), length(L2,Y), append(L1,_X項からY項までの数列,L2). 'X項からY項までの数列は全て整数'(_X項からY項までの数列) :- forall(member(A,_X項からY項までの数列),integer(A)). 和を算出する(_X項からY項までの数列,_数列の和) :- sum_list(_X項からY項までの数ならび,_数列の和). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/194 # # [1] 授業単元: プログラミング1 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10277.txt # # 必修課題2 # 初項1公差1の等差数列がある(An={1 2 3 4 5 ・・・n})。数値XとYを入力して、 # この数列におけるX項からY項までの数列の和を算出するプログラムを作成せよ。 # 実行結果の例を以下に示す。 # ------------------------------------------------ # 第X項から:1 # 第Y項まで:10 # 初項1公差1の等差数列において、 # 第1項から第10項までの数列の和は55です。 # ------------------------------------------------ 初項1公差1の等差数列におけるX項からY項までの数列の和を算出する(X,Y,_和) :- findsum(N,between(X,Y,N),_和). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは ttp://sum2cha.blogpico.com/archives/2017 レス番号606 [1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 全部で3つなのですが 1・ 以下のプログラムを作成 ・ 以下の数列を0〜20まで表示 ・ 数列は以下の通りとする ・ a[0] = 0.01, a[1] = 0.1, a[2] = 1.0 ・ a[n+1] = a[n] + a[n-1] + a[n-2] ・ プログラムを実行するとa[0]〜a[20]までの値が改行区切りで表示されること t2_53 :- findall(X,(for(0,N,20),t2_53(N,X)),L), wrln(L). t2_53(0,0.01). t2_53(1,0.1). t2_53(2,1.0). t2_53(N,X) :- N1 is N - 1, N2 is N - 2, N3 is N - 3, t2_53(N1,X1), t2_53(N2,X2), t2_53(N3,X3), X is X1 + X2 + X3. %%%%%%%%%%%%%%%%%%%% wrln([]). wrln([A|R]) :- write_formatted('%t\n',[A]),wrln(R). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/344 # # ID | NAME | DATA # --+-------+----- # 1 | tanaka | aa # 2 | satou | bb # 3 | suzuki | cc # # 例えばこんなテーブルがあったときに # IDとNAMEに関してマッチするレコードを # 取得するとしたら # # WHERE ID = 1 AND NAME = 'tanaka' # # としますけど、マッチングの条件が複数あるときって # # WHERE (ID = 1 AND NAME = 'tanaka') OR (ID = 2 AND NAME = 'satou') # # こんなふうに単純に書くしかないでしょうか? # マッチング条件の対象列がひとつなら # # WHERE NAME in ('satou', 'suzuki') # # とできますが、複数列の場合にもこういうふうにまとめて書く方法がないかと思いまして・・・ # # テーブル(1,tanaka,aa). テーブル(2,satou,bb). テーブル(3,suzuki,cc). ?- テーブル(1,takaka,Z);テーブル(2,satou,Z). ?- findall([X,Y,Z],(member([X,Y],[[1,tanaka],[2,satou]]),テーブル(X,Y,Z)),L). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/810 # # [1] アルゴリズム # # [2] 自然数の数列内にあるnよりも大きい数と小さい数が # 数列上においてnの前後にそれぞれ一つずつある場合、そのnを出力する。 # つまり、(n-a,...,n+b,....n,....n+c,....,n-d)という風になっているnを探すプログラムです。 # 自然数の数列内にあるnよりも大きい数と小さい数が数列上においてnの前後にそれぞれ一つずつある場合、そのnを出力(_自然数ならび) :- append(L1,[N|L2],_自然数ならび), findsum(1,(member(A,L1),A > N),1), findsum(1,(member(B,L2),B < N),1), write_formatted('%t\n',[N]). % 以下のサイトは # 出典 :: C/C++言語の宿題片付けます132代目 #201 # [1] アルゴリズム # [2] 手入力したい数列の数をまず入力し、その数だけ数列を手入力します。 # その中に連続数がある場合、その連続数の個数を初めに入力した数から引いた結果を表示。 '手入力したい数列の数をまず入力し、その数だけ数列を手入力します。その中に連続数がある場合、その連続数の個数を初めに入力した数から引いた結果を表示' :- 手入力したい数列の数をまず入力し、その数だけ数列を手入力(_入力した数列の個数,_数列), 入力した数列に連続数がある場合、その連続数の個数を初めに入力した数から引いた結果(_入力した数列の個数,_数列,_連続した数の数を差し引いた数列の個数), write_foramatted('連続数を差し引いた数は %t です\n',[_連続した数の数を差し引いた数列の個数]). 入力した数列に連続数がある場合、その連続数の個数を初めに入力した数から引いた結果(X,[],X) :- !. 入力した数列に連続数がある場合、その連続数の個数を初めに入力した数から引いた結果(N,[A,B|R],X) :- A is B + 1, N1 is N - 1, 入力した数列に連続数がある場合、その連続数の個数を初めに入力した数から引いた結果(N1,[B|R],X). 入力した数列に連続数がある場合、その連続数の個数を初めに入力した数から引いた結果(N,[A,B|R],X) :- A is B - 1, N1 is N - 1, 入力した数列に連続数がある場合、その連続数の個数を初めに入力した数から引いた結果(N1,[B|R],X). 入力した数列に連続数がある場合、その連続数の個数を初めに入力した数から引いた結果(N,[A,B|R],X) :- 入力した数列に連続数がある場合、その連続数の個数を初めに入力した数から引いた結果(N,R,X). 手入力したい数列の数をまず入力し、その数だけ数列を手入力(_手入力したい数列の数,_数列) :- write('何個の数を入力しますか : '), get_integer(_手入力したい数列の数), write_formatted('一つ数を入力したら改行を%t回繰り返します\n',[_手入力したい数列の数]), その数だけ数列を手入力(1,_手入力したい数列の数,_数列). その数だけ数列を手入力(M,N,[]) :- M > N,!. その数だけ数列を手入力(M,N,[_数|R]) :- write_formatted('%t個目を入力してください : ',[M]), get_integer(_数), M2 is M + 1, その数だけ数列を手入力(M2,N,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/294 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10004.txt # 課題 # 整数列を右に任意数だけローテーション(右ローテーション:right rotation)する # プログラムを作りなさい.ただし,以下の点に留意すること. # # ・整数列はキーボードから入力すること. # ・入力できる整数列の最大長は 10 とし,長さ 0 以下と 11 以上を指定した場合エラー終了すること. # ・ローテーション数が整数列の長さを超える場合でも正しい処理になるようにすること t846 :- t846_入力(_整数ならび,_ローテーションする数), length(_整数ならび,_入力した要素数), t846(_ローテーションする数,_入力した要素数,_整数ならび,_ローテーションした整数ならび), concat_atom(_ローテーションした整数ならび,',',S), write_formatted('ローテーションした整数列 %t です\n',[S]),!. t846. t846(_ローテーションする数,_入力した要素数,_整数ならび,X) :- _入力した要素数>0, _入力した要素数<11, ならびの回転(右方向,_ローテーションする数,_整数ならび,X),!. t846(_ローテーションする数,_入力した要素数,_整数ならび,X) :- \+((_入力した要素数>0,_入力した要素数<11)), write_formatted('入力した要素数が適切でありません %t 個\n',[_入力した要素数]), fail. t846_入力(_,_入力した要素数,_,_) :- write('整数をカンマで区切り最大10個まで入力してください : '), get_line(Line), split(Line,[','],_整数ならび), write('ローテーションする数を入れてください : '), get_integer(_ローテーションする数),!. % *** user: ならびの回転 / 4 *** ならびの回転(左方向,1,[A|R],L) :- append(R,[A],L). ならびの回転(左方向,N,[A|R],L) :- N > 1, append(R,[A],L1), N1 is N - 1, ならびの回転(左方向,N1,L1,L). ならびの回転(右方向,1,L1,L2) :- append(L0,[A],L1), append([A],L0,L2). ならびの回転(右方向,N,L1,L2) :- N > 1, append(L0,[A],L1), append([A],L0,L3). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/210 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # [1 2 0] [3 2 0 1] [3 4 0 2 1]みたいな同じ数字を使わない任意の長さで # ランダムな数列の作成するプログラム。 # 同一要素のないランダムな数列の作成(_要素数,L) :- 同一要素のないランダムな数列の作成(1,3721,69069,65535,_要素数,[],L). 同一要素のないランダムな数列の作成(Nth1,A,N,_法,Nth,L,L) :- Nth1 > Nth,!. 同一要素のないランダムな数列の作成(Nth1,A,N,_法,Nth,L1,L) :- \+(member(N,L1)), 乗算合同法演算(A,N,_法,M), Nth2 is Nth1 + 1, 同一要素のないランダムな数列の作成(Nth2,A,M,_法,Nth,[N|L1],L). 同一要素のないランダムな数列の作成(Nth1,A,N,_法,Nth,L1,L) :- member(N,L1), 乗算合同法演算(A,N,_法,M), 同一要素のないランダムな数列の作成(Nth1,A,M,_法,Nth,L1,L). 乗算合同法演算(A,N,_法,M) :- M is (A * N + 5) mod _法. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/210 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # [1 2 0] [3 2 0 1] [3 4 0 2 1]みたいな同じ数字を使わない任意の長さで # ランダムな数列の作成するプログラム。 # 同一要素のないランダムな数列の作成(_要素数,L) :- 同一要素のないランダムな数列の作成(1,3721,69069,65535,_要素数,[],L). 同一要素のないランダムな数列の作成(Nth1,A,N,_法,Nth,L,L) :- Nth1 > Nth,!. 同一要素のないランダムな数列の作成(Nth1,A,N,_法,Nth,L1,L) :- \+(member(N,L1)), 乗算合同法演算(A,N,_法,M), Nth2 is Nth1 + 1, 同一要素のないランダムな数列の作成(Nth2,A,M,_法,Nth,[N|L1],L). 同一要素のないランダムな数列の作成(Nth1,A,N,_法,Nth,L1,L) :- member(N,L1), 乗算合同法演算(A,N,_法,M), 同一要素のないランダムな数列の作成(Nth1,A,M,_法,Nth,L1,L). 乗算合同法演算(A,N,_法,M) :- M is (A * N + 5) mod _法. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/436 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9949.txt # 1. double x[3],y[3](成分はscanf)の内積を求めるプログラム # 2. 数列an={1,2,4,8,16,・・・}(n=1,2,・・・,20)を求めて表示するプログラム # 3. 「正数を入力してください」と表示し、入力した数字nが素数かどうかを # 判断するプログラム 内積([],[],0). 内積([A|R1],[B|R2],X) :- 内積(R1,R2,Y), C is A * B, X is Y + C. '数列an={1,2,4,8,16,・・・}(n=1,2,・・・,20)を求めて表示する'(Max,X) :- findsum(Y,( between(1,Max,N), Y is 2 ^ N)), X). 素数かどうか判断する :- write('正数を入力してください : '), repeat, get_line(Line), atom_to_term(Line,N,_), integer(N), N > 0, 素数である(N),!. 素数である(N) :- N2 is N // 2, for(2,M,N2), 0 is N mod M, !, fail. 素数である(_). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % *** user: findsum / 3 *** findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), '加算'(_値ならび,_合計値),!. % *** user: 加算 / 2 *** 加算(trunc(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A is trunc(B)),SL),!. 加算(四捨五入(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 四捨五入(B)),SL),!. 加算(切捨て(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切捨て(B)),SL),!. 加算(切り上げ(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切り上げ(B)),SL),!. 加算([],L) :- var(L), L = 0.0e+00,!. 加算([],L) :- \+(var(L)), 加算の変数に零をおく(L),!. 加算([L|R],SL) :- ならび(L), 行列の転置([L|R],L1), 加算_2(L1,SL),!. 加算(X,S) :- 加算_1(X,0.0e+00,S). % *** user: 加算の変数に零をおく / 1 *** 加算の変数に零をおく([]) :- !. 加算の変数に零をおく([A|R]) :- 変数(A), A = 0.0e+00, 加算の変数に零をおく(R),!. % *** user: 加算_1 / 3 *** 加算_1([],S,S) :- !. 加算_1([A|R],Y,S) :- ならび(A), ならび(Y), !, ならび加算(A,Y,Z), 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), 加算_1(R,Y,S),!. 加算_1([A|R],Y,S) :- A1 は A, Z is A1 + Y, 加算_1(R,Z,S). 加算_1(A,Y,S) :- とからりすと(A,L), !, 加算_1(L,Y,S). % *** user: 加算_2 / 2 *** 加算_2([],[]) :- !. 加算_2([L|R],[S|R2]) :- 加算(L,S), 加算_2(R,R2). % *** user: 行列の転置 / 3 *** 行列の転置([],[],[]) :- !. 行列の転置([[A|R]|R1],[A|R2],[R|R3]) :- 行列の転置(R1,R2,R3). % *** user: 行列の転置 / 2 *** 行列の転置([[]|_],[]) :- !. 行列の転置(L,[B|R1]) :- 行列の転置(L,B,R2), 行列の転置(R2,R1),!. % 以下のサイトは ===ヒープソート=== ヒープソートはメモリ上のスタックやヒープ領域に木構造を構築することによってソートを実現する。ここでは、標準入力ファイルから整数列が与えられたものを、引数上(スタック上)に木構造を成長させて、読み込みを終了したら、昇順に整列された値を取り出すことのできる述語 ヒープソートを定義してみる。 ヒープソート(_木構造) :- read(_整数), ヒープソート(_整数,[],_木構造). ヒープソート(end_of_file,_木構造,_木構造) :- !. ヒープソート(_整数,_木構造_1,_木構造) :- 挿入(_整数,_木構造_1,_木構造_2), read(_整数_2), ヒープソート(_整数_2,_木構造_2,_木構造). 挿入(_整数,[],_木構造) :- 木構造(_整数,[],[],_木構造). 挿入(_整数,_木構造_1,_木構造_2) :- 木構造(_値,_左部分木_1,_右部分木_1,_木構造_1), 挿入(_整数,_値,_左部分木_1,_右部分木_1,_左部分木_2,_右部分木_2), 木構造(_値,_左部分木_2,_右部分木_2,_木構造_2). 挿入(_整数,_値,_左部分木_1,_右部分木,_左部分木_2,_右部分木) :- _整数 =< _値, 挿入(_整数,_左部分木_1,_左部分木_2). 挿入(_整数,_値,_左部分木,_右部分木_1,_左部分木,_右部分木_2) :- _整数 > _値, 挿入(_整数,_右部分木_1,_右部分木_2). 木構造(_値,_左部分木,_右部分木,_木構造) :- functor(_木構造,木,3), arg(1,_木構造,_値), arg(2,_木構造,_左部分木), arg(3,_木構造,_右部分木). 次に、end_of_fileで構築が終った木構造から順に昇順に値を取り出す非決定性の述語 ヒープからの昇順取り出し/2 を定義し、それを使って昇順に整列したリストを取り出す。 ヒープからの昇順取り出し(_木構造,_値) :- 木構造(_,_左部分木,_右部分木,_木構造), ヒープからの昇順取り出し(_左部分木,_値). ヒープからの昇順取り出し(_木構造,_値) :- 木構造(_値,_,_,_木構造). ヒープからの昇順取り出し(_木構造,_値) :- 木構造(_,_左部分木,_右部分木,_木構造), ヒープからの昇順取り出し(_右部分木,_値). ヒープからの昇順リスト(_木構造,_昇順に整列したリスト) :- findall(_値,ヒープから昇順取り出し(_木構造,_値),_昇順に整列したリスト). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/654 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # 無限等比級数の和を各項を順に加算していくことにより求めるプログラム # 1+(1/3)+(1/9)+(1/27)+..... # ただし、0.00001以下となる項を加えた時点で加算を終了することとする。 # '無限等比級数の和を各項を順に加算していくことにより求めるプログラム 1+(1/3)+(1/9)+(1/27)+..... ただし、0.00001以下となる項を加えた時点で加算を終了することとする。'(_無限等比級数) :- 無限等比級数の和を各項を順に加算していく(_無限等比級数). 無限等比級数の和を各項を順に加算していく(_無限等比級数) :- '100000以下の3の等比数列'(_100000以下の3の等比数列), 自分以外の要素を全部掛けることによって作られる数列の合計(_100000以下の3の等比数列,_自分以外の要素を全部掛けることによって作られる数列), ならびすべてを掛ける(_100000以下の3の等比数列,_分母), _無限等比級数 is _分子 / _分母. '100000以下の3の等比数列'(_100000以下の3の等比数列) :- '100000以下の3の等比数列'(1,_100000以下の3の等比数列). '100000以下の3の等比数列'(M,[M]) :- M >= 100000,!. '100000以下の3の等比数列'(M,[M|R]) :- M_2 is M * 3, '100000以下の3の等比数列'(M_2,R). 自分以外の要素を全部掛けることによって作られる数列の合計(L1,_数列の合計) :- findsum(M,( append(L0,[N|R],L1), append(L0,R,L3), ならびすべてを掛ける(L3,M)), _数列の合計). ならびすべてを掛ける(L,M) :- atomic_list_concat(L,'*',S), atom_to_term(S,_式,_), M is _式.