このディレクトリの索引

% 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/561 # n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。 # がわかりませぬ。どなたか教えてください。 # # 'n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。' :- 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数), 'それらの平均と標準偏差を出力する'(_n個,_n個の実数). 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数) :- length(_n個の実数,_n個), findall(_個々の実数,( 個々の実数(_n個の実数,_個々の実数), 実数を得る(_個々の実数)),_n個の実数). 'それらの平均と標準偏差を出力する'(_n個,_n個の実数) :- それらの平均と標準偏差を(_n個,_n個の実数,_平均,_標準偏差), 出力する(_平均,_標準偏差). それらの平均と標準偏差を(_n個,_n個の実数,_n個の実数の平均,_n個の実数の標準偏差) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差). 出力する(_n個の実数の平均,_n個の実数の標準偏差) :- writef('平均  = %t\n標準偏差 = %t\n',[_n個の実数の平均,_n個の実数の標準偏差). 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均) :- sum_list(_n個の実数,_n個の実数の合計), _n個の実数の平均 is _n個の実数の合計 / _n個. 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), 個々の実数と平均の差の二乗の合計(_n個,_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗の合計), 標準偏差は分散の平方根になる(_n個,_個々の実数と平均の差の二乗の合計,_n個の実数の標準偏差). 個々の実数と平均の差の二乗の合計(_n個,_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗の合計) :- findsum(_個々の実数と平均の差の二乗,( 個々の実数と平均の差の二乗(_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗)),_個々の実数と平均の差の二乗の合計). 個々の実数と平均の差の二乗(_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗) :- 個々の実数(_n個の実数,_個々の実数), _個々の実数と平均の差の二乗 is (_個々の実数 - _n個の実数の平均) ^ 2. 個々の実数(_n個の実数,_個々の実数) :- nth1(_,_n個の実数,_個々の実数). 標準偏差は分散の平方根になる(_n個,_個々の実数と平均の差の二乗の合計,_n個の実数の標準偏差) :- _n個の実数の標本の分散 is _個々の実数と平均の差の二乗の合計 / _n個, _n個の実数の標準偏差 is sqrt(_n個の実数の標本の分散). 実数を得る(_個々の実数) :- 行入力(_行), read_term_from_atom(_行,_実数,[]), 実数診断(_行,_実数),!. 実数を得る(_個々の実数) :- 実数を得る(_個々の実数). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 実数診断(_行,_実数) :- float(_実数),!. 実数診断(Line,_実数) :- writef('入力された %t から実数が得られません。再入力をお願いします。\n',[_行]), fail. findsum(_集約対象項,_目標,_合計) :- findall(_集約対象項,_目標,_集約対象項ならび), sum_list(_集約対象項ならび,_合計). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/561 # n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。 # がわかりませぬ。どなたか教えてください。 # # 'n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。' :- 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数), 'それらの平均と標準偏差を出力する'(_n個,_n個の実数). 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数) :- length(_n個の実数,_n個), findall(_個々の実数,( 個々の実数(_n個の実数,_個々の実数), 実数を得る(_個々の実数)),_n個の実数). 'それらの平均と標準偏差を出力する'(_n個,_n個の実数) :- それらの平均と標準偏差を(_n個,_n個の実数,_平均,_標準偏差), 出力する(_平均,_標準偏差). それらの平均と標準偏差を(_n個,_n個の実数,_n個の実数の平均,_n個の実数の標準偏差) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差). 出力する(_n個の実数の平均,_n個の実数の標準偏差) :- writef('平均  = %t\n標準偏差 = %t\n',[_n個の実数の平均,_n個の実数の標準偏差). 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均) :- sum_list(_n個の実数,_n個の実数の合計), _n個の実数の平均 is _n個の実数の合計 / _n個. 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), 個々の実数と平均の差の二乗の合計(_n個,_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗の合計), 標準偏差は分散の平方根になる(_n個,_個々の実数と平均の差の二乗の合計,_n個の実数の標準偏差). 個々の実数と平均の差の二乗の合計(_n個,_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗の合計) :- findsum(_個々の実数と平均の差の二乗,( 個々の実数と平均の差の二乗(_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗)),_個々の実数と平均の差の二乗の合計). 個々の実数と平均の差の二乗(_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗) :- 個々の実数(_n個の実数,_個々の実数), _個々の実数と平均の差の二乗 is (_個々の実数 - _n個の実数の平均) ^ 2. 個々の実数(_n個の実数,_個々の実数) :- nth1(_,_n個の実数,_個々の実数). 標準偏差は分散の平方根になる(_n個,_個々の実数と平均の差の二乗の合計,_n個の実数の標準偏差) :- _n個の実数の標本の分散 is _個々の実数と平均の差の二乗の合計 / _n個, _n個の実数の標準偏差 is sqrt(_n個の実数の標本の分散). 実数を得る(_個々の実数) :- 行入力(_行), read_term_from_atom(_行,_実数,[]), 実数診断(_行,_実数),!. 実数を得る(_個々の実数) :- 実数を得る(_個々の実数). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 実数診断(_行,_実数) :- float(_実数),!. 実数診断(Line,_実数) :- writef('入力された %t から実数が得られません。再入力をお願いします。\n',[_行]), fail. findsum(_集約対象項,_目標,_合計) :- findall(_集約対象項,_目標,_集約対象項ならび), sum_list(_集約対象項ならび,_合計). % 以下のサイトは # 中学生になるホンガツオ君はいつも学校の成績が悪く、父・海平に怒られます。 # 今回も中間テストでどれもひどい点数をとってしまい、海平の雷が落ちるのは間違いありません。 # # 全教科のテスト結果を同時にみせると、海平の怒りは最大級となり、1週間のおやつ抜きとなってしまいます。 # # おやつを毎日食べたいホンガツオ君は、海平の怒りを分散させるために、1日1教科ずつテスト結果をみせていくことを思いつきました。 # # ただ、テスト結果の報告が遅れることで、海平の怒りは日に日に上がっていきます。 # もしテスト結果を隠したりして報告しなかったことが後でバレたら最大級の怒りとなるため、すべての教科のテスト結果をみせた方がよさそうです。 # # 海平の怒りの度合いは教科といつみせるかによっても異ります。 # # たとえば、国語、数学、英語の3教科の点数が40点だった場合、1日1教科ずつみせるならば、3日必要です。 # 海平の怒りについては、ホンガツオ君は長年の経験から、スコア化できています。 # # 教科 点数 海平怒りのスコア初期値 1日目 2日目 3日目 # 国語(Ja) 40 10 1 2 3 # 数学(Ma) 40 10 1 4 6 # 英語(En) 40 10 1 6 9 # # # この例では、国語、数学、英語に対する海平怒りのスコアがすべて10です。 # あとは、何日目にみせるかによって、怒りが初期値に乗算されます。 # # 単純に怒りのスコアが小さい教科順にみせると、トータルの海平から被る怒りの量は以下のようになります。 # (10 * 1) + (10 * 4) + (10 * 9) = 140 # # しかし、3日目に被る怒りの量が大きい教科を先にみせることで、怒りの量は減ります。 # (10 * 1) + (10 * 4) + (10 * 3) = 80 # # # つまり、この場合は、1日目に英語→2日目に数学→3日目に国語(En->Ma->Ja)の順にみせることで、ホンガツオ君が海平から被る怒りの量は最も少ない80ですみます。 # # では、以下の7教科の場合、海平怒りのスコアが最も少なくてすむにはどの教科の順でテスト結果をみせればよいでしょうか? # # プログラミング言語はJavaScriptを使用してください。 # # 教科 点数 海平怒りのスコア初期値 1日目 2日目 3日目 4日目 5日目 6日目 7日目 # 国語(Ja) 15 35 1 1 2 3 5 8 13 # 数学(Ma) 35 15 1 5 9 13 17 21 25 # 英語(En) 30 20 1 5 8 12 15 19 22 # 社会(So) 20 30 1 3 5 7 9 11 13 # 理科(Sc) 25 25 1 2 4 6 8 10 12 # 音楽(Mu) 35 15 1 4 6 9 11 14 16 # 美術(Ar) 25 25 1 2 2 3 5 8 11 # # # 以下、問題のデータを用意しています。コピペして使ってください。 # また必ずしもこのデータを使う必要はありません。 # // 教科データ # var category=['Ja','Ma','En','So','Sc','Mu','Ar']; # // 海平怒りのスコア初期値 # var score=[35,15,20,30,25,15,25]; # // 海平怒りの倍数(7日分 # var multiplier=[ # [1,1,2,3,5,8,13], # [1,5,9,13,17,21,25], # [1,5,8,12,15,19,22], # [1,3,5,7,9,11,13], # [1,2,4,6,8,10,12], # [1,4,6,9,11,14,16], # [1,2,2,3,5,8,11], # ]; # # # ■資料 # answer_ikariscore_JavaScript.txt: # 解答用テキストファイルです。 # # ■解答方法 # 解答用テキストファイル(answer_ikariscore_JavaScript.txt)を完成させ、アップロードしてください。 # ※解答用テキストファイル以外のファイル形式(zipなど)をアップロードした場合は評価対象外となります。 # 毎日一教科ずつ示して怒りを最小にする表示順序(_表示順序) :- 毎日一教科ずつ示して怒りを(_表示順候補ならび), 最小にする表示順序(_表示順候補ならび,_表示順序). 毎日一教科ずつ示して怒りを(_表示順候補ならび) :- 教科と怒りの相関表から教科ならびを得て表示順候補ならびを得る(_表示順候補ならび). 教科と怒りの相関表から教科ならびを得て表示順候補ならびを得る(_表示順候補ならび) :- 教科と怒りの相関表から教科ならびを得て(_教科ならび), 表示順候補ならびを得る(_教科ならび,_表示順候補ならび). 教科と怒りの相関表から教科ならびを得て(_教科ならび) :- findall(_教科,教科と怒りの相関表(_教科,_,_,_),_教科ならび). 表示順候補ならびを得る(_教科ならび,_表示順候補ならび) :- findall([_怒り指数,_表示順序候補],( 表示順による怒り指数(_教科ならび,_表示順序候補,_怒り指数)), _表示順候補ならび). 表示順による怒り指数(_教科ならび,_表示順序候補,_怒り指数) :- 順列(_教科ならび,7,_表示順序候補), 怒り評価(_表示順序候補,_怒り指数). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). 怒り評価(_順序候補,_怒り指数) :- findsum(_怒りの点数,( 順序候補から教科を取り出し怒りの点数を計算する(_順序候補,_怒りの点数)),_怒り指数). 順序候補から教科を取り出し怒りの点数を計算する(_順序候補,_怒りの点数) :- 順序候補から教科を取り出し(_順序候補,_nth1,_教科), 怒りの点数を計算する(_nth1,_教科,_怒りの点数). 順序候補から教科を取り出し(_順序候補,_nth1,_教科) :- nth1(_nth1,_順序候補,_教科). 怒りの点数を計算する(_nth1,_教科,_怒りの点数) :- 教科と怒りの相関表(_教科,_,_初期値,L), nth1(_nth1,L,_怒りの倍数), _怒りの点数 is _初期値 * _怒りの倍数. findsum(A,P,Sum) :- findall(A,P,L), sum_list(L,Sum). 教科と怒りの相関表('国語(Ja)',15,35,[1,1,2,3,5,8,13]). 教科と怒りの相関表('数学(Ma)',35,15,[1,5,9,13,17,21,25]). 教科と怒りの相関表('英語(En)',30,20,[1,5,8,12,15,19,22]). 教科と怒りの相関表('社会(So)',20,30,[1,3,5,7,9,11,13]). 教科と怒りの相関表('理科(Sc)',25,25,[1,2,4,6,8,10,12]). 教科と怒りの相関表('音楽(Mu)',35,15,[1,4,6,9,11,14,16]). 教科と怒りの相関表('美術(Ar)',25,25,[1,2,2,3,5,8,11]). 最小にする表示順序(LL,_表示順序) :- once(最小の怒り指数(LL,_最小の怒り指数)), member([_最小の怒り指数,_表示順序],LL). 最小の怒り指数(LL,_最小の怒り指数) :- select([_最小の怒り指数|_],LL,R), 'Rの中に_最小の怒り指数より小さいものはない'(R,_最小の怒り指数). 'Rの中に_最小の怒り指数より小さいものはない'(R,_最小の怒り指数) :- forall(member([_怒り指数|_],R),_怒り指数 >= _最小の怒り指数). % 以下のサイトは # 中学生になるホンガツオ君はいつも学校の成績が悪く、父・海平に怒られます。 # 今回も中間テストでどれもひどい点数をとってしまい、海平の雷が落ちるのは間違いありません。 # # 全教科のテスト結果を同時にみせると、海平の怒りは最大級となり、1週間のおやつ抜きとなってしまいます。 # # おやつを毎日食べたいホンガツオ君は、海平の怒りを分散させるために、1日1教科ずつテスト結果をみせていくことを思いつきました。 # # ただ、テスト結果の報告が遅れることで、海平の怒りは日に日に上がっていきます。 # もしテスト結果を隠したりして報告しなかったことが後でバレたら最大級の怒りとなるため、すべての教科のテスト結果をみせた方がよさそうです。 # # 海平の怒りの度合いは教科といつみせるかによっても異ります。 # # たとえば、国語、数学、英語の3教科の点数が40点だった場合、1日1教科ずつみせるならば、3日必要です。 # 海平の怒りについては、ホンガツオ君は長年の経験から、スコア化できています。 # # 教科 点数 海平怒りのスコア初期値 1日目 2日目 3日目 # 国語(Ja) 40 10 1 2 3 # 数学(Ma) 40 10 1 4 6 # 英語(En) 40 10 1 6 9 # # # この例では、国語、数学、英語に対する海平怒りのスコアがすべて10です。 # あとは、何日目にみせるかによって、怒りが初期値に乗算されます。 # # 単純に怒りのスコアが小さい教科順にみせると、トータルの海平から被る怒りの量は以下のようになります。 # (10 * 1) + (10 * 4) + (10 * 9) = 140 # # しかし、3日目に被る怒りの量が大きい教科を先にみせることで、怒りの量は減ります。 # (10 * 1) + (10 * 4) + (10 * 3) = 80 # # # つまり、この場合は、1日目に英語→2日目に数学→3日目に国語(En->Ma->Ja)の順にみせることで、ホンガツオ君が海平から被る怒りの量は最も少ない80ですみます。 # # では、以下の7教科の場合、海平怒りのスコアが最も少なくてすむにはどの教科の順でテスト結果をみせればよいでしょうか? # # プログラミング言語はJavaScriptを使用してください。 # # 教科 点数 海平怒りのスコア初期値 1日目 2日目 3日目 4日目 5日目 6日目 7日目 # 国語(Ja) 15 35 1 1 2 3 5 8 13 # 数学(Ma) 35 15 1 5 9 13 17 21 25 # 英語(En) 30 20 1 5 8 12 15 19 22 # 社会(So) 20 30 1 3 5 7 9 11 13 # 理科(Sc) 25 25 1 2 4 6 8 10 12 # 音楽(Mu) 35 15 1 4 6 9 11 14 16 # 美術(Ar) 25 25 1 2 2 3 5 8 11 # # # 以下、問題のデータを用意しています。コピペして使ってください。 # また必ずしもこのデータを使う必要はありません。 # // 教科データ # var category=['Ja','Ma','En','So','Sc','Mu','Ar']; # // 海平怒りのスコア初期値 # var score=[35,15,20,30,25,15,25]; # // 海平怒りの倍数(7日分 # var multiplier=[ # [1,1,2,3,5,8,13], # [1,5,9,13,17,21,25], # [1,5,8,12,15,19,22], # [1,3,5,7,9,11,13], # [1,2,4,6,8,10,12], # [1,4,6,9,11,14,16], # [1,2,2,3,5,8,11], # ]; # # # ■資料 # answer_ikariscore_JavaScript.txt: # 解答用テキストファイルです。 # # ■解答方法 # 解答用テキストファイル(answer_ikariscore_JavaScript.txt)を完成させ、アップロードしてください。 # ※解答用テキストファイル以外のファイル形式(zipなど)をアップロードした場合は評価対象外となります。 # 毎日一教科ずつ示して怒りを最小にする表示順序(_表示順序) :- 毎日一教科ずつ示して怒りを(_表示順候補ならび), 最小にする表示順序(_表示順候補ならび,_表示順序). 毎日一教科ずつ示して怒りを(_表示順候補ならび) :- 教科と怒りの相関表から教科ならびを得て表示順候補ならびを得る(_表示順候補ならび). 教科と怒りの相関表から教科ならびを得て表示順候補ならびを得る(_表示順候補ならび) :- 教科と怒りの相関表から教科ならびを得て(_教科ならび), 表示順候補ならびを得る(_教科ならび,_表示順候補ならび). 教科と怒りの相関表から教科ならびを得て(_教科ならび) :- findall(_教科,教科と怒りの相関表(_教科,_,_,_),_教科ならび). 表示順候補ならびを得る(_教科ならび,_表示順候補ならび) :- findall([_怒り指数,_表示順序候補],( 表示順による怒り指数(_教科ならび,_表示順序候補,_怒り指数)), _表示順候補ならび). 表示順による怒り指数(_教科ならび,_表示順序候補,_怒り指数) :- 順列(_教科ならび,7,_表示順序候補), 怒り評価(_表示順序候補,_怒り指数). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). 怒り評価(_順序候補,_怒り指数) :- findsum(_怒りの点数,( 順序候補から教科を取り出し怒りの点数を計算する(_順序候補,_怒りの点数)),_怒り指数). 順序候補から教科を取り出し怒りの点数を計算する(_順序候補,_怒りの点数) :- 順序候補から教科を取り出し(_順序候補,_nth1,_教科), 怒りの点数を計算する(_nth1,_教科,_怒りの点数). 順序候補から教科を取り出し(_順序候補,_nth1,_教科) :- nth1(_nth1,_順序候補,_教科). 怒りの点数を計算する(_nth1,_教科,_怒りの点数) :- 教科と怒りの相関表(_教科,_,_初期値,L), nth1(_nth1,L,_怒りの倍数), _怒りの点数 is _初期値 * _怒りの倍数. findsum(A,P,Sum) :- findall(A,P,L), sum_list(L,Sum). 教科と怒りの相関表('国語(Ja)',15,35,[1,1,2,3,5,8,13]). 教科と怒りの相関表('数学(Ma)',35,15,[1,5,9,13,17,21,25]). 教科と怒りの相関表('英語(En)',30,20,[1,5,8,12,15,19,22]). 教科と怒りの相関表('社会(So)',20,30,[1,3,5,7,9,11,13]). 教科と怒りの相関表('理科(Sc)',25,25,[1,2,4,6,8,10,12]). 教科と怒りの相関表('音楽(Mu)',35,15,[1,4,6,9,11,14,16]). 教科と怒りの相関表('美術(Ar)',25,25,[1,2,2,3,5,8,11]). 最小にする表示順序(LL,_表示順序) :- once(最小の怒り指数(LL,_最小の怒り指数)), member([_最小の怒り指数,_表示順序],LL). 最小の怒り指数(LL,_最小の怒り指数) :- select([_最小の怒り指数|_],LL,R), 'Rの中に_最小の怒り指数より小さいものはない'(R,_最小の怒り指数). 'Rの中に_最小の怒り指数より小さいものはない'(R,_最小の怒り指数) :- forall(member([_怒り指数|_],R),_怒り指数 >= _最小の怒り指数). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/561 # n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。 # がわかりませぬ。どなたか教えてください。 # # 'n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。' :- 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数), 'それらの平均と標準偏差を出力する'(_n個,_n個の実数). 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数) :- length(_n個の実数,_n個), findall(_個々の実数,( 個々の実数(_n個の実数,_個々の実数), 実数を得る(_個々の実数)), _n個の実数). 'それらの平均と標準偏差を出力する'(_n個,_n個の実数) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差), writef('平均  = %t\n標準偏差 = %t\n',[_n個の実数の平均,_n個の実数の標準偏差). 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均) :- sum_list(_n個の実数,_n個の実数の合計), _n個の実数の平均 is _n個の実数の合計 / _n個. 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), findsum(_個々の実数と平均の差の二乗,( 個々の実数(_n個の実数,_個々の実数), _個々の実数と平均の差の二乗 is (_個々の実数 - _n個の実数の平均) ^ 2), _個々の実数と平均の差の二乗の合計), _n個の実数の標本の分散 is _個々の実数と平均の差の二乗の合計 / _n個, _n個の実数の標準偏差 is sqrt(_n個の実数の標本の分散). 個々の実数(_n個の実数,_個々の実数) :- nth1(_,_n個の実数,_個々の実数). 実数を得る(_個々の実数) :- get_line(Line), read_term_from_atom(Line,_実数,[]), 実数診断(Line,_実数),!. 実数を得る(_個々の実数) :- 実数を得る(_個々の実数). 実数診断(Line,_実数) :- float(_実数),!. 実数診断(Line,_実数) :- writef('入力された %t から実数が得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/90 # # 助けてください! # C言語の課題です。 # # 「自分のフルネームをアルファベット小文字で入力し、そのアスキーコードを、10進数で求めて平均、分散、標準偏差を表示」 # を表すソースを教えてください。 # '自分のフルネームをアルファベット小文字で入力し、そのアスキーコードを、10進数で求めて平均、分散、標準偏差を表示' :- 自分のフルネームをアルファベット小文字で入力し(_自分のフルネーム), 'そのアスキーコードを、10進数で求めて'(_自分のフルネーム,_自分のフルネームのアスキーコードならび), '平均、分散、標準偏差を表示'(_自分のフルネームのアスキーコードならび). 自分のフルネームをアルファベット小文字で入力し(_自分のフルネーム) :- write('自分のフルネームをアルファベット小文字で入力してください : '), get_line(_自分のフルネーム). 'そのアスキーコードを、10進数で求めて'(_自分のフルネーム,_自分のフルネームのアスキーコードならび) :- atom_codes(_自分のフルネーム,_自分のフルネームのアスキーコードならび). '平均、分散、標準偏差を表示'(_自分のフルネーム,_自分のフルネームのアスキーコードならび) :- 相加平均(_自分のフルネームのアスキーコードならび,_相加平均), 分散(_自分のフルネームのアスキーコードならび,_分散), 標準偏差(_自分のフルネームのアスキーコードならび,_標準偏差), writef('自分のフルネーム = %t, 自分のフルネームのアスキーコード = %t, 平均 = %t, 分散 = %t, 標準偏差 = %t\n',[_自分のフルネーム,_自分のフルネームのアスキーコードならび,_平均,_分散,_標準偏差]). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0,M). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 分散(L,V) :- length(L,N), 相加平均(L,M), 分散(L,N,M,0.0,V). 分散([],N,M,S,V) :- V is S / N,!. 分散([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 分散(R,N,M,S2,V). 標準偏差(L,V) :- length(L,N), 相加平均(L,M), 標準偏差(L,N,M,0.0,V). 標準偏差([],N,M,S,V) :- V is sqrt(S / (N - 1)),!. 標準偏差([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 標準偏差(R,N,M,S2,V). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1332279659/170 # # 円の内部(円周上を含む)に点を指定した数だけ打ちたい # それぞれの点の距離を最大化するように打つにはどうすればいい? # '原点を中心とした円内にランダムに3つの点を追加して行き、追加する毎に最短の距離の二点を取り除く'(0,_,_座標ならび,_座標ならび). '原点を中心とした円内にランダムに3つの点を追加して行き、追加する毎に最短の距離の二点を取り除く'(_試行回数,_半径,_座標ならび,_試行回数分の点を追加された座標ならび) :- 三座標を得る(_半径,X1,Y1,X2,Y2,X3,Y3), 座標ならびから最短の二座標を取り除く([[X1,Y1],[X2,Y2],[X3,Y3]|_座標ならび],_最短の二座標を取り除いた座標ならび), _試行回数_1 is _試行回数 - 1, '原点を中心とした円内にランダムに3つの点を追加して行き、追加する毎に最短の距離の二点を取り除く'(_試行回数_1,_半径,_最短の二座標を取り除いた座標ならび,_試行回数分の点を追加された座標ならび). 三座標を得る(_半径,X1,Y1,X2,Y2,X3,Y3) :- 座標点を得る(_半径,X1,Y1), 座標点を得る(_半径,X2,Y2), 座標点を得る(_半径,X3,Y3),!. 座標点を得る(_半径,X,Y) :- 座標点の位置要素(_半径,X), 座標点の位置要素(_半径,Y),!. 座標点の位置要素(_半径,_位置要素) :- M is truncate(_半径 * 1000), M_2 is M // 2, N is truncate(M), _位置要素 is (random(N+1) - M_2) / 1000. 座標ならびから最短の二座標を取り除く(_座標ならび,_最短の二座標を取り除いた座標ならび) :- findmin([_二点間の距離,[X1,Y1],[X2,Y2]],( 組み合わせ(_座標ならび,2,[[X1,Y1],[X2,Y2]]), _二点間の距離 is sqrt((X2-X1) * (X2-X1) + (Y2-Y1) * (Y2-Y1)), [_,[X1,Y1],[X2,Y2]]), ならびから一要素だけ削除([X1,Y1],_座標ならび,_座標ならびの一), ならびから一要素だけ削除([X2,Y2],_座標ならびの一,_最短の二座標を取り除いた座標ならび). ならびから一要素だけ削除(_削除する要素,_座標ならび,_一要素だけ削除されたならび) :- select(_削除する要素,_座標ならび,_一要素だけ削除されたならび),!. 可能な限り分散して円内にN個の点を打つ(N,_半径,_座標ならび) :- 円内にランダムに十分な点を打つ(N,_半径,[],L1), 最短点を持つ二座標を取り除く(L1,_座標ならび), length(_座標ならぴ,N). 円内にランダムに十分な点を打つ(N,_半径,L) :- M is 5 * N, 円内にランダムに十分な点を打つ(N,_半径,[],L). 円内にランダムに十分な点を打つ(N,_半径,L1,L) :- 座標点を得る(_半径,X,Y), N_1 is N - 1, 円内にランダムに十分な点を打つ(N_1,_半径,[[X,Y]|L1],L). 最短点を持つ二座標を取り除く(L1,L) :- 座標ならびから最短の二座標を取り除く(L1,L2), 最短点を持つ二座標を取り除くの二(L2,L). 最短点を持つ二座標を取り除くの二(L,L). 最短点を持つ二座標を取り除くの二(L2,L) :- 最短点を持つ二座標を取り除く(L2,L). % 以下のサイトは 分散(L,V) :- length(L,N), 相加平均(L,M), 分散(L,N,M,0.0e+00,V). 分散([],N,M,S,V) :- V is S / N,!. 分散([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 分散(R,N,M,S2,V). 標本分散(_標本ならび,_標本分散) :- 標本平均(_標本ならび,_標本平均), length(_標本ならび,_標本数), findsum(U,( member(_標本,_標本ならび), U is (_標本 - _標本平均) ^ 2), S), _標本分散 is S / (_標本数 - 1). 標本平均(_標本ならび,_標本平均) :- 相加平均(_標本ならび,_標本平均). 不偏分散(_標本ならび,_分散) :- 不偏分散とは標本の二乗の相加平均から相加平均の二乗を引いた数(_標本ならび,_分散). 不偏分散とは標本の二乗の相加平均から相加平均の二乗を引いた数(_標本ならび,_分散) :- 標本の二乗の相加平均(_標本ならび,_標本の二乗の相加平均), 相加平均の二乗(_標本ならび,_相加平均の二乗), _分散 is _標本の二乗の相加平均 - _相加平均の二乗. 標本の二乗の相加平均(_標本ならび,_標本の二乗の相加平均) :- findavg(V,( 標本の二乗(_標本ならび,_標本の二乗)), _標本の二乗の相加平均). 標本の二乗(_標本ならび,_標本の二乗) :- member(_標本,_標本ならび), _標本の二乗 is _標本 * _標本. 相加平均の二乗(_標本ならび,_相加平均の二乗) :- 相加平均(_標本ならび,_相加平均), _相加平均の二乗 is _相加平均 * _相加平均. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/858 # # # 5人の学生の成績(100点満点)の値をキーボードから読み込み,それらの平均点と分散(標準偏差の二乗)を求めるプログラムを作れ。 # # # 授業の課題です # 解説付きでお願いします。 # # '5人の学生の成績(100点満点)の値をキーボードから読み込み,それらの平均点と分散(標準偏差の二乗)を求める' :- '5人の学生の成績(100点満点)の値をキーボードから読み込み'(_5人の学生の成績ならび), 'それらの平均点と分散(標準偏差の二乗)を求める'(_5人の学生の成績ならび,_平均点,_分散), append(_5人の学生の成績ならび,[_平均点,_分散],_表示情報), writef('%t,%t,%t,%t,%t の 平均点は %t, 分散は %t です。\n,_表示情報). '5人の学生の成績(100点満点)の値をキーボードから読み込み'(_5人の学生の成績ならび) :- length(_5人の学生の成績ならび,5), findall(_成績,( append(L0,[_成績|_],_5人の学生の成績ならび), length([_|L0],_何個目), write('成績(0-100点)の[%t個目]を入力してください : ',[_何個目]), 成績入力(_成績)), _5人の学生の成績ならび). 成績入力(_成績) :- get_line(Line), 成績入力診断(Line,_成績),!. 成績入力(_成績) :- 成績入力(_成績). 成績入力診断(Line,_成績) :- atom_to_term(Line,_成績,_), integer(_成績), _成績 >= 0, _成績 =< 100,!. 成績入力診断(Line,_成績) :- writef('入力された %t からは成績(0-100点)が得られませんでした。再入力をお願いします。\n',[Line]), fail. 'それらの平均点と分散(標準偏差の二乗)を求める'(_5人の学生の成績ならび,_平均点,_分散) :- それらの平均点と(_5人の学生の成績ならび,_平均点), 分散を求める(_5人の学生の成績ならび,_分散). それらの平均点と(_5人の学生の成績ならび,_平均点) :- findavg(_成績,( append(_,[_成績|_],_5人の学生の成績ならび)), _平均点). 分散を求める(_5人の学生の成績ならび,_平均点,_分散) :- findavg(_偏差,( append(_,[_成績|_],_5人の学生の成績ならび), _偏差 is (_成績 - _平均点) * (_成績 - _平均点)), _分散). % 以下のサイトは # http://d.hatena.ne.jp/JunichiIto/touch/20111007/1317976730 # # Fizz-Buzz問題の例はこんな感じだ。 # # 1から100までの数をプリントするプログラムを書け。 # ただし3の倍数のときは数の代わりに「Fizz」と、 # 5の倍数のときは「Buzz」とプリントし、 # 3と5両方の倍数の場合には「FizzBuzz」とプリントすること。 # # ちゃんとしたプログラマであれば、 # これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。 # 怖い事実を聞きたい? コンピュータサイエンス学科卒業生の過半数には # それができないのだ。 # 自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。 # 'Fizz-Buzz問題の例' :- '1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。'. '1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。' :- for(1,N,100), '1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N), N = 100. '1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N) :- 'ただし3の倍数のときは数の代わりに「Fizz」と'(N,_表示アトム), プリントする(_表示アトム),!. '1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N) :- 'ただし5の倍数のときは数の代わりに「Buzz」と'(N,_表示アトム), プリントする(_表示アトム),!. '1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N) :- '3と5両方の倍数のときは数の代わりに「FizzBuzz」と'(N,_表示アトム), プリントする(_表示アトム),!. '1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N) :- '3の倍数でなく、5の倍数でもない場合は数字をそのまま'(N,_表示アトム), プリントする(_表示アトム),!. 'ただし3の倍数のときは数の代わりに「Fizz」と'(N,'Fizz') :- 0 is N mod 3, \+(0 is N mod 5). 'ただし5の倍数のときは数の代わりに「Buzz」と'(N,'Buzz') :- 0 is N mod 3, \+(0 is N mod 5). '3と5両方の倍数の場合には「FizzBuzz」'(N,'FizzBuzz') :- 0 is N mod 3, 0 is N mod 5. '3の倍数でなく、5の倍数でもない場合は数字をそのまま表示する'(N,_表示アトム) :- \+(0 is N mod 3), \+(0 is N mod 5), swritef(_表示アトム,'%t',[N]). プリントする(_表示アトム) :- writef('%t',[_表示アトム]). % 少考 % % このプログラムの問題点はプリントが複数箇所に分散していること。 % 普通は for(1,N,100) と N=100. の間で表示アトムを受け取って % プリントするように書く。 % 私のプログラミングスタイルでは、述語名に沿って本体(:- の後)を記述することを % 旨としているため、敢えて将来のメンテナンスの難しさ覚悟で % このような記述にした。 % % カットはなくてもよいのですが、「書き手の意志」を示すものとして入れることを % 勧めます。 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/256 # # [1] 授業単元:関数Aから関数Bを呼び出す # [2] 問題文(含コード&リンク): # ../test/read.cgi/tech/1308749241/245に、mainプログラムも追記しなさい。 # '分散を求める述語を追加し、動作確認する' :- 分散を定義する, '20個の0から100の範囲のデータを読み込む'(_データならび), 分散(_データならび,_分散), 出力する(_データならび,_分散). '20個の0から100の範囲のデータを読み込む'(_データならび) :- length(_データならび,20), findall(_0から100の範囲の]整数,( append(_,[_|_],_データならび), '0から100の範囲の整数を得る'(_0から100の範囲の整数)), _データならび). '0から100の範囲の整数を得る'(_0から100の範囲の整数) :- get_integer(_0から100の範囲の整数), _0から100の範囲の整数 >= 0, _0から100の範囲の整数 =< 100,!. '0から100の範囲の整数を得る'(_0から100の範囲の整数) :- write('0から100の範囲の整数を入力してください\n'), '0から100の範囲の整数を得る'(_0から100の範囲の整数). データを書きだす(_データならび,_分散) :- concat_atom(_データならび,S), writef('%t\n分散 は %t',[S,_分散]). 分散を定義する :- assertz((分散(L,V) :- length(L,N), 相加平均(L,M), 分散(L,N,M,0.0,V))), assertz((分散([],N,M,S,V) :- V is S / N,!)), assertz((分散([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 分散(R,N,M,S2,V))). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0,M). /* 分散([],N,M,S,V) :- V is S / N,!. 分散([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 分散(R,N,M,S2,V) . 分散(L,V) :- length(L,N), 相加平均(L,M), 分散(L,N,M,0.0,V) . */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/490 # # [1] 授業単元:ファイルにある数字をすべて読み込む # [2] 問題文(含コード&リンク): # log1.txtには、0個以上の実数が1行に1つずつ、改行を挟んで記載されている。 # 記載されている実数を全て読み込み、数値の個数、平均値、分散値を求めて表示するプログラムを作成しなさい。 # 'log1.txtには、0個以上の実数が1行に1つずつ、改行を挟んで記載されている。記載されている実数を全て読み込み、数値の個数、平均値、分散値を求めて表示する' :- findall(V,( append(_,[Line|_],Lines), atom_to_term(Line,V,_)), L), 数値の個数(L,_個数), 平均値(L,_平均値), 分散値(L,_分散値), writef('個数 = %t, 平均値 = %t, 分散値 = %t\n',[_個数,_平均値,_分散値]). 平均値([],N,S,M) :- M is S / N,!. 平均値([A|R],N,S,M) :- S1 is S + A, 平均値(R,N,S1,M). 平均値(L,M) :- length(L,N), 平均値(L,N,0.0e+00,M). 分散値(L,V) :- length(L,N), 平均値(L,M), 分散値(L,N,M,0.0e+00,V). 分散値([],N,M,S,V) :- V is S / N,!. 分散値([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 分散値(R,N,M,S2,V). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/725 # # 流れ変えがてら先生方お願いします # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):main関数中の実数配列(要素数は任意)の要素の平均と分散を計算してmain関数にその結果を返し、 # main関数でその結果を表示するmain関数と平均、分散を計算する関数を作り、下の例について実行しなさい。 # # データ{50.0, 62.0, 80.0, 90.5, 99.5} # # program :- main, halt. main :- user_parameters(_データならび), 平均(_データならび,_平均), 分散(_データならび,_分散), write_formatted('パラメータによって入力されたデータの 平均は%t,分散は%tでした。\n',[_平均,_分散]),!. 平均(_データならび,_平均) :- length(L,N), 平均(L,N,0.0e+00,M). 平均([],N,S,M) :- M is S / N,!. 平均([A|R],N,S,M) :- S1 is S + A, 平均(R,N,S1,M). 分散(L,V) :- length(L,N), 算術平均(L,M), 分散(L,N,M,0.0e+00,V). 分散([],N,M,S,V) :- V is S / N,!. 分散([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 分散(R,N,M,S2,V). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/320 # # [1] 授業単元: プログラミング基礎 # [2] 問題文: n 個の整数型データ配列a[i]を、一つの関数に渡して、 #       その一つの関数内で平均値と分散値を求め、main関数内で #       平均値と分散値を参照できるプログラムを作成せよ。 #       ただし、配列の受渡し、結果の受け渡しにはポインタを利用すること。 # % ここでは課題として、書いてみたが、 % このような述語定義は、決して推奨されるようなものではない! 平均値と分散値を一つの述語で求める(_値ならび,_平均値,_分散値) :- 平均値と分散値(_値ならび,[],_ならびの長さ,0.0,_平均値,_分散値). 平均値と分散値([],Ln,_ならびの長さ,_合計,_平均値,0.0) :- length(Ln,_ならびの長さ), _平均値 is _合計 / _ならびの長さ,!. 平均値と分散値([_値|R],Ln,_ならびの長さ,_累計の一,_平均値,_分散値) :- _累計の二 is _累計の一 + _値, 平均値と分散値(R,[_|Ln],_ならびの長さ,_累計の二,_平均値,_分散値の二), _分散値 is _分散値の二 + ((_値 - _平均値) ^ 2) / _ならびの長さ. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/184 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):平均値:μ,分散:σ^2の分布がn個与えられているとする。 # この分布が何であろうと、nの数が多きなるにつれてこの分布の合計は平均:nμ,分散:nσ^2の正規分布に近づくとされる。 # 要素数n個をもつx個の乱数系列を発生させるプログラムを作れ。 # 乱数を発生させる(_x個,_要素数,_平均・分散ならび,_乱数系列ならび) :- length(Ln,_x個), 乱数を発生させる(Ln,_要素数,_平均・分散ならび,_乱数系列ならび) :- 乱数を発生させる([],_,_,[]) :- !. 乱数を発生させる([_|R1],_要素数,[[_平均,_分散]|R3],[_乱数ならび|R4]) :- 標準正規分布(1,_要素数,1.0,_平均,_分散,_標準正規分布ならび), findall(_乱数,( append(_,[V|_],_標準正規分布ならび), _乱数 is truncate(V * 1000000000) mod 10000), _乱数ならび), 乱数を発生させる(R1,_要素数,R3,R4). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 標準正規分布(_母集合,_台の最小値,_台の最大値,_刻み,_標準正規分布ならび) :- 相加平均(_母集合,_平均), 分散(_母集合,_分散), 標準正規分布(_台の最小値,_台の最大値,_刻み,_平均,_分散,_標準正規分布ならび). 標準正規分布(X,_台の最大値,_刻み,_平均,_分散,[]) :- X > _台の最大値,!. 標準正規分布(X,_台の最大値,_刻み,_平均,_分散,[[X,Y]|R]) :- 標準正規分布確率密度(X,_平均,_分散,Y), X2 is X + _刻み, 標準正規分布(X2,_台の最大値,_刻み,_平均,_分散,R). 標準正規分布確率密度(X,_平均,_分散,_確率密度) :- U is -1 * (((X - _平均) ^ 2) / (2 * _分散)), _確率密度 is exp(U) / sqrt(2 * pi * _分散). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/941 # # ベクトルを規格化する関数 normal # # 2つのベクトルの差の大きさを返す関数 dist を作成せよ。 # # よろしくお願いします # # ベクトルの正規化(_ベクトル,_正規化されたベクトル) :-     flat(_ベクトル,L1),     分散(L1,_分散),     U is sqrt(_分散) / _分散,     行列の積(_ベクトル,[[U]],_正規化されたベクトル). ベクトルの差([],[],[]) :- !. ベクトルの差([[A]|R1],[[B]|R2],[[C]|R3]) :-     C is A - B,     ベクトルの差(R1,R2,R3). normal(_ベクトル,_正規化されたベクトル) :- ベクトルの正規化(_ベクトル,_正規化されたベクトル). dist(_ベクトル1,_ベクトル2,_ベクトルの差) :- ベクトルの差(_ベクトル1,_ベクトル2,_ベクトルの差). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 135代目 #685 # 1] 授業単元: プログラム演習 # [2] 問題文(含コード&リンク): # 下記のような成績があった時、各科目の平均、各学生の合計点の偏差値、科目毎の相関係数を求めるプログラムを配列を用いて実装しなさい。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10601.txt # # 名前   点数 #     英語 数学 物理  # 学生1 80 50 60 # 学生2 60 70 80 # 学生3 50 80 90 # 学生4 60 75 80 # 学生5 50 90 75 # # 名前   点数 #     英語 数学 物理  値位置(名前,[_名前,_,_,_],_名前). 値位置(英語,[_,_英語,_,_],_英語). 値位置(数学,[_,_,_数学,_],_数学). 値位置(物理,[_,_,_,_物理],_物理). 成績(学生1,80,50,60). 成績(学生2,60,70,80). 成績(学生3,50,80,90). 成績(学生4,60,75,80). 成績(学生5,50,90,75). 各科目の平均(_各科目の平均) :- findall([_科目,_科目の平均],( 値位置(_科目,[A,B,C,D],_点数), \+(_科目=名前), findavg(_点数,成績(A,B,C,D),_科目の平均)), _各科目の平均). 各学生の合計点の偏差値(_各学生の合計点の偏差値) :- findall(_名前,成績(_名前,_,_,_),_名前ならび), 標本を集める(_母集合), 偏差値(_母集合,_偏差値ならび), 名前と符合させる(_名前ならび,_偏差値ならび,_各学生の合計点の偏差値). 偏差値(_母集合,_偏差値ならび) :- 相加平均(_母集合,_算術合計), 標準偏差(_母集合,_標準偏差), findall(_偏差値,(member(_値,_母集合),偏差値(_値,_相加平均,_標準偏差,_偏差値)),_偏差値ならび). 偏差値(_標本値,_相加平均,_標準偏差,_偏差値) :- _偏差値 is 10 * (_標本値 - _相加平均) / _標準偏差 + 50.0. 各学生の合計点の総和(_合計点の総和) :- findsum(_各学生の合計点,各学生の合計点(_,_各学生の合計点),_合計点の総和). 各学生の合計点(_名前,_各学生の合計点) :- 成績(_名前,_英語,_数学,_物理), _各学生の合計点 is _英語 + _数学 + _物理. 標本を集める(_母集合) :- findall(_各学生の合計点,各学生の合計点(_,_各学生の合計点),_母集合). 名前と符合させる([],[],[]) :- !. 名前と符合させる([A|R1],[B|R2],[[A,B]|R3]) :- 名前と符合させる(R1,R2,R3). 科目間の相関係数(_科目1,_科目2,_相関係数) :- findall(_点数,(成績(A,B,C,D),値位置(_科目1,[A,B,C,D],_点数)),_科目1の点数ならび), findall(_点数,(成績(A,B,C,D),値位置(_科目2,[A,B,C,D],_点数)),_科目2の点数ならび), 相関係数(_科目1のならび,_科目2の点数ならび,_相関係数). 相関係数(_科目1の点数ならび,_科目2の点数ならび,_相関係数) :- length(_科目1の点数ならび,Len), 相加平均(_科目1の点数ならび,_科目1の相加平均), 相加平均(_科目2の点数ならび,_科目2の相加平均), 共分散(_科目1の点数ならび,_科目2の点数ならび,_共分散), 標準偏差(_科目1の点数ならび,Len,_科目1の相加平均,0.0,_科目1の標準偏差), 標準偏差(_科目2の点数ならび,Len,_科目2の相加平均,0.0,_科目2の標準偏差), _相関係数 is _共分散 / (_科目1の標準偏差 * _科目2の標準偏差). 共分散(_標本ならび1,_標本ならび2,_共分散) :- length(_標本ならび1,Len), length(_標本ならび2,Len), 相加平均(_標本ならび1,_標本ならび1の相加平均), 相加平均(_標本ならび2,_標本ならび2の相加平均), 共分散(_標本ならび1,_標本ならび2,Len,_標本ならび1の相加平均,_標本ならび2の相加平均,0.0,_共分散). 共分散([],[],Len,_,_,S,_共分散) :- _共分散 is S / Len,!. 共分散([A|R1],[B|R2],Len,_相加平均1,_相加平均2,S1,_共分散) :- U is (A-_相加平均1) * (B-_相加平均2), S2 is S1 + U, 共分散(R1,R2,Len,_相加平均1,_相加平均2,S2,S),!. % 以下のサイトは # [1] 授業単元:fortran # [2] 問題文(含コード&リンク):配列を使わずに平均値、分散、標準偏差を表示せよ # データ数nとn個のデータを入力し、平均値、分散、標準偏差を標示せよ。なおn≧5である。 # dimension、if、go toを使ってはいけない。 '配列を使わずに平均値、分散、標準偏差を表示' :- write('データ数 : '), get_integer(N), writef('%個の数を1個1行で連続して入力してください : ',[N]), get_line(Line), read_term_from_atom(Line,X,[]), '配列を使わずに平均値、分散、標準偏差を表示'(1,N,X,0,_,Z). _分散 is Z / N, _標準偏差 is sqrt(Z / (N - 1)), writef('平均値=%t,分散=%t,標準偏差=%t\n',[_平均値,_分散,_標準偏差]),!. '配列を使わずに平均値、分散、標準偏差を表示'(M,N,X,S,_平均,0.0) :- M > N,_平均 is S / N,!. '配列を使わずに平均値、分散、標準偏差を表示'(M,N,X,S1,_平均,Z) :- get_line(Line2), read_term_from_atom(line2,X2,[]), S2 is S1 + X, M1 is M - 1, '配列を使わずに平均値、分散、標準偏差を表示'(M1,N,X2,S2,_平均,Z2), Z is (X - _平均) ^ 2 + Z2. get_line(Line) :- read_line_to_codes(current_input,Codes), atom_codes(Line,Codes). get_integer(N) :- read_line_to_codes(current_input,Codes), number_codes(N,Codes), integer(N). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/588 # # [1] 授業単元:Cプログラミング演習 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10211.txt # # 課題(1) # 4つの整数を入力し、その最大値、最小値、平均を求める関数を各自で定義し出力するプログラムを書け。 # # 課題(2) # 任意の数字と桁数を入力し、桁数に該当する整数を出力する関数を各自で定義し結果を出力するプログラムを書け。 # 例えば数字に123456789と入力し、桁数を5とした場合下5桁の5を出力する関数。 # # 課題(3) # 課題(1)の整数を配列形式で定義し、同様に最大値、最小値、平均値を出力するプログラムを書け。 # (余力があれば分散も考えてみよ) 任意の数字と桁数を入力し、桁数に該当する整数を出力する関数を各自で定義し結果を出力(_数字文字列,_桁数,_整数) :- atom(_数字文字列), sub_atom(_数字文字列,0,Len,0,_数字文字列), min([Len,_桁数],Min), sub_atom(_数字文字列,Len-Min,Min,_,_副文字列), atom_to_term(_副文字列,_整数,_), integer(_整数). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/588 # # [1] 授業単元:Cプログラミング演習 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10211.txt # # 課題(1) # 4つの整数を入力し、その最大値、最小値、平均を求める関数を各自で定義し出力するプログラムを書け。 # # 課題(2) # 任意の数字と桁数を入力し、桁数に該当する整数を出力する関数を各自で定義し結果を出力するプログラムを書け。 # 例えば数字に123456789と入力し、桁数を5とした場合下5桁の5を出力する関数。 # # 課題(3) # 課題(1)の整数を配列形式で定義し、同様に最大値、最小値、平均値を出力するプログラムを書け。 # (余力があれば分散も考えてみよ) '4つの整数を入力し、その最大値、最小値、平均を求める' :- '4つの整数を入力し、その最大値、最小値、平均を求める'(_最大値,_最小値,_平均値), write_formatted('最大値=%t,最小値=%t,平均値=%t\n',[_最大値,_最小値,_平均値]). '4つの整数を入力し、その最大値、最小値、平均を求める'(_最大値,_最小値,_平均値) :- findall(N,(for(1,M,4),get_integer(N)),L), max(L,_最大値), min(L,_最小値), avg(L,_平均値). % Prolog それとも、入力は関数の引数として取るべきなのだろうか。 % Prologの場合、インタプリタだから、 '4つの整数を入力し、その最大値、最小値、平均を求める'(_整数1,_整数2,_整数3,_整数4,_最大値,_最小値,_平均値) :- integer(_整数1),integer(_整数2),integer(_整数3),integer(_整数4), max([_整数1,_整数2,_整数3,_整数4],_最大値), min([_整数1,_整数2,_整数3,_整数4],_最小値), avg([_整数1,_整数2,_整数3,_整数4],_平均値). % とする方がいいのかもしれない。write_formatted/2で標準出力への印字はProlog本来のスタイルではない % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/451 # # http://ime.nu/www.dotup.org/uploda/www.dotup.org315213.docx.html # 【質問テンプレ】 # [1] 授業単元:計算機実習応用 # [2] 問題文(含コード&リンク): # http://ime.nu/www.dotup.org/uploda/www.dotup.org315213.docx.html # # 問1 上のプログラムのfunction1()の定義を改造して,function1(int x, int y)がx*x+y*yの値をint型で返すようなプログラムに改造し,100*100+50*50の計算をさせて画面に結果を表示させよ(仮引数が2つになっている). # # 問2 このプログラムを改造し,2つの非負の実数の四則演算(和差積商)を求め画面表示させるプログラムにせよ.なお,配布した1030sample.exeのように動作するように作ること.また以下の点をよく考えること. # 1.aとbの値(ゼロより大きい実数)をキーボードから入力させること(scanfを2回使う) # 2.関数wasasekisho(double x, double y, double * pwa, double * psa, double * pseki, double * psho)を定義して中身を作ること # 4.main関数に帰ってきてから1030sample.exeのように表示されるものを作ること(printfをうまく使う). # # 問3 上記のプログラムを改造して,与えられたデータの平均値を計算する関数はそのまま利用し,main関数の中で分散値を計算して両者を画面表示させなさい(分散を計算する関数は定義しない).画面表示の形式としては, # データの平均は 4.460000 # データの分散は 7.623000 # 続行するには何かキーを押してください.. . 関数定義(function1(X,Y),_値) :- function1(X,Y,_値). 関数定義(wasasekisho(X,Y),_値) :- wasasekisho(X,Y,Pwa,Psa,Pseki,Psho), _値 = [Pwa,Psa,Pseki,Psho]. 関数定義(heikin(L),_値) :- 相加平均(L,_値). 関数定義(bunsan(L),_値) :- 分散(L,_値). function1(X,Y,Z) :- Z is X * X + Y * Y. wasasekisho(X,Y,Pwa,Psa,Pseki,Psho) :- Pwa is X + Y,Psa is X - Y,Pseki is X * Y,Psho is X / Y. 相加平均(L,Avg) :- findsum(U,member(U,L),Avg). 分散(L,_分散) :- length(L,Len), 相和平均(L,_相加平均), 分散(L,Len,_相加平均,0.0,_分散). 分散([],N,M,S,V) :- V is S / N,!. 分散([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 分散(R,N,M,S2,V). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), 加算(_値ならび,_合計値),!. % 加算の解はすべての要素が整数の時整数、それ以外は浮動小数点数になります 加算(_値ならび,_合計値) :- 加算(_値ならび,0,_合計値). 加算([],_合計値,_合計値). 加算([A|R],S1,_合計値) :- S2 is A + S1, 加算(R,S2,_合計値). % 以下のサイトは 相加平均(L,_相加平均) :- 算術平均(L,_相加平均). 算術平均([],N,S,M) :- M is S / N,!. 算術平均([A|R],N,S,M) :- S1 is S + A,算術平均(R,N,S1,M) . 算術平均(L,M) :- length(L,N),算術平均(L,N,0.0,M). 標準偏差([],N,M,S,V) :- V is sqrt(S / (N - 1)),!. 標準偏差([A|R],N,M,S,V) :- S1 is (A - M) ^ 2,S2 is S + S1,標準偏差(R,N,M,S2,V). 標準偏差(L,V) :- length(L,N),算術平均(L,M),標準偏差(L,N,M,0.0,V) . 平均偏差(L,_平均偏差) :- 算術平均(L,Avg), length(L,N), 平均偏差(L,Avg,0.0,Amd), _平均偏差 is Amd / N. 平均偏差([],_,X,X). 平均偏差([A|R1],Avg,Y,X) :- Y2 is Y + abs(A-Avg), 平均偏差(R1,Avg,Y2,X). 尖度(_標本,_尖度) :- length(_標本,_標本数), 算術平均(_標本,_算術平均), 分散(_標本,_分散), findsum(U,(member(A,_標本),U is (A-_算術平均) ^ 4),X1), _尖度 is X1 / ((sqrt(_分散) ^ 4) * _標本数). 尖度([],N,M,S1,S2,V) :- V is S2 / (M * S2 ^ 2). 尖度([A|R],N,M,S1,S2,V) :- S3 is (A - M) ^ 2, S4 is (A - M) ^ 4, S5 is S1 + S3, S6 is S2 + S4, 尖度(R,N,M,S5,S6,V). 分散(L,V) :- length(L,N), 算術平均(L,M), 分散(L,N,M,0.0e+00,V). 分散([],N,M,S,V) :- V is S / N,!. 分散([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 分散(R,N,M,S2,V). 相乗平均(L,_相乗平均) :- 幾何平均(L,_相乗平均). 幾何平均([],N,S,M) :- M is exp(S / N),!. 幾何平均([A|R],N,S,M) :- S0 is ln(A), S1 is S + S0, 幾何平均(R,N,S1,M). 幾何平均(_標本ならび,_幾何平均) :- length(_標本ならび,_標本数), 幾何平均(_標本ならび,_標本数,0,_幾何平均). 加重平均(_標本ならび,_加重平均) :- findsum(_重み,member([_重み,_],_標本ならび),S), findsum(M,(member([A,B],_標本ならび),M is A * B),S2), _加重平均 is S2 / S,!. 偏差値(_母集合,_偏差値ならび) :- 加算(_母集合,_算術合計), length(_母集合,_ならびの長さ), _算術平均 is _算術合計 / _ならびの長さ, 標準偏差(_母集合,_標準偏差), findall(_偏差値,( member(_値,_母集合) , 偏差値(_値,_算術平均,_標準偏差,_偏差値)), _偏差値ならび). 偏差値(_標本値,_算術平均,_標準偏差,_偏差値) :- _偏差値 is 10 * (_標本値 - _算術平均) / _標準偏差 + 50. 中央値(_標本ならび,_中央値) :- medium(_標本ならび,_中央値). medium(L,_中央値) :- quicksort(L,L2), length(L2,Len), Len2 is Len // 2, medium(L2,Len2,_中央値). medium(L,Len,_中央値) :- append(L1,[_中央値|L2],L), length(L1,Len), length(L2,Len),!. medium(L,Len,_中央値) :- Len2 is Len - 1, append(L1,[_中央値1,_中央値2|L2],L), length(L1,Len2), length(L2,Len2), _中央値 is (_中央値1 + _中央値2) / 2. 最小公倍数(N1 * A,B,C) :- integer(B), 最小公倍数(A,B,C), N1 is C // A,!. 最小公倍数(A,N2 * B,C) :- integer(A), 最小公倍数(A,B,C), N2 is C // B,!. 最小公倍数(N1 * A,N2 * B,C) :- 最小公倍数(A,B,C), N1 is C // A, N2 is C // B,!. 最小公倍数(A,B,X) :- integer(A), integer(B), 最大公約数をユークリッドの互除法で求める(A,B,C), X is A * B // C. 最小公倍数([N1 * A|R],X) :- findall(U,member(_ * U,[N1 * A|R]),L1), 最小公倍数(L1,X), 最小公倍数_2([N1 * A|R],X),!. 最小公倍数([A,B],X) :- 最小公倍数(A,B,X),!. 最小公倍数([A|R],X) :- 最小公倍数(R,B), 最小公倍数(A,B,X),!. 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X).