このディレクトリの索引

% 以下のサイトは # 中学生になるホンガツオ君はいつも学校の成績が悪く、父・海平に怒られます。 # 今回も中間テストでどれもひどい点数をとってしまい、海平の雷が落ちるのは間違いありません。 # # 全教科のテスト結果を同時にみせると、海平の怒りは最大級となり、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), sumlist(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),_怒り指数 >= _最小の怒り指数). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 137代目 #936 # お手上げです。頑張ったのですが、できませんでした。 # 申し訳ないですけどお願いします。 # # 問題 # # 複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力するプログラムを作成せよ. # # 【実行例】 # # 何個の文字列を入力しますか?:4 # 入力文字列[1]:Computer # 入力文字列[2]:Science # 入力文字列[3]:Tarou # 入力文字列[4]:Tanaka # # 繋ぎ合わせる順番: # 2 # 4 # 3 # 1 # # 結果:ScienceTanakaTarouComputer # '複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する' :- '複数の文字列を読み込み,'(_複数の,_入力文字列ならび), 'さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する'(_複数の,_入力文字列ならび). '複数の文字列を読み込み,'(_複数の,_入力文字列ならび) :- 複数の(_複数の), findall(_行,( 文字列を読み込み(_複数の,_行)),_入力文字列ならび). 複数の(_複数の) :- 整数を得る('何個の文字列を入力しますか?: ',true,_複数の), writef('文字列を%w行連続して入力してください\n',[_複数の]). 文字列を読み込み(_複数の,_行) :- between(1,_複数の,_), 行入力(_行). 'さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する'(_複数の,_入力文字列ならび) :- 'さらに,それらの文字列を繋ぎ合わせる順番を入力し'(_複数の,_取り出し順ならび), 結果を出力する(_入力文字列ならび,_取り出し順ならび). 'さらに,それらの文字列を繋ぎ合わせる順番を入力し'(_複数の,_取り出し順ならび) :- write('入力した文字列を繋ぎ合わせる順番を入力してください\n'), それらの文字列を繋ぎ合わせる順番を入力し(_複数の,_取り出し順ならび). それらの文字列を繋ぎ合わせる順番を入力し(_複数の,_取り出し順ならび) :- findall(_番目,( 順番を入力し(_複数の,_番目)),_取り出し順ならび). 順番を入力し(_複数の,_番目) :- between(1,_複数の,_), 整数を得る(_番目). 整数を得る(_番目) :- 整数を得る('',true,_番目). 結果を出力する(_入力文字列ならび,_取り出し順ならび) :- 結果を(_入力文字列ならび,_取り出し順ならび,_指定した順番の文字列ならび), 出力する(_指定した順番の文字列ならび). 結果を(_入力文字列ならび,_取り出し順ならび,_指定した順番の文字列ならび) :- findall(_文字列,( 指定順に取り出す(_入力文字列ならび,_取り出し順ならび,_文字列)),_指定した順番の文字列ならび). 指定順に取り出す(_入力文字列ならび,_取り出し順ならび,_文字列) :- member(_番目,_取り出し順ならび), nth1(_番目,_入力文字列ならび,_文字列). 出力する(_指定した順番の文字列ならび) :- 文字列を指定した順番に繋ぎ合わせて(_指定した順番の文字列ならび,_表示文字列), writef('繋ぎ合わせた文字列は: %w\n',[_表示文字列]). 文字列を指定した順番に繋ぎ合わせて(_指定した順番の文字列ならび,_表示文字列) :- atomic_list_concat(_指定した順番の文字列ならび,_表示文字列). 整数を得る(_催促文,_条件,_整数) :- 以下の入力に失敗した場合は再入力する, '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 以下の入力に失敗した場合は再入力する :- repeat. '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- call(_条件). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは 'a-zを50回繰り返し、その文字列のn番目のnが素数かつその数値文字列の中に3を含まないものは、大文字に変換する'(_目標文字列) :- '小文字のa-zを50回繰り返したならびと大文字のA-Zを50回繰り返したならび'(_小文字ならび,_大文字ならび), 'エラトステネスの篩の変形'(_大文字ならび,Lx), 第二引数のならびの変数を第一引数の同一位置要素で埋めて文字列に変換する(_小文字ならび,Lx,_目標文字列). 第二引数のならびの変数を第一引数の同一位置要素で埋めて文字列に変換する(_小文字ならび,Lx,_目標文字列) :- 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く(_小文字ならび,Lx), atom_chars(_目標文字列,Lx). 第二引数のならびの変数を第一引数の同一位置要素で埋める([],[]). 第二引数のならびの変数を第一引数の同一位置要素で埋める(L1,L2) :- 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く(L1,L2). 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く([A|R1],[B|R2]) :- 第二引数が変数の時は第一引数と単一化(A,B), 第二引数のならびの変数を第一引数の同一位置要素で埋める(R1,R2). 第二引数が変数の時は第一引数と単一化(A,A) :- !. 第二引数が変数の時は第一引数と単一化(A,B). '小文字のa-zを50回繰り返したならびと大文字のA-Zを50回繰り返したならび'(L1,L2) :- '小文字のa-zを50回繰り返したならびと'(L1), '大文字のA-Zを50回繰り返したならび'(L2). '小文字のa-zを50回繰り返したならびと'(L1) :- findall(A,( between(1,50,_), sub_atom(abcdefghijklmnopqrstuvwxyz,_,1,_,A)),L1). '大文字のA-Zを50回繰り返したならび'(L2) :- findall(A,( between(1,50,_), sub_atom('ABCDEFGHIJKLMNOPQRSTRVWXYZ',_,1,_,A)),L2). 素数でその数値文字列に3を含まない時大文字で挿入する(_大文字ならび,L) :- findall(N,between(2,1300,N),_篩候補), length(L,1300), '素数でその数値文字列に3を含まない時大文字で挿入する'(_篩候補,_大文字ならび,L). '素数でその数値文字列に3を含まない時大文字で挿入する'([],_大文字ならび,L) :- !. '素数でその数値文字列に3を含まない時大文字で挿入する'([A|R1],_大文字ならび,L) :- '数字列に3を含まない時は大文字を素数の位置に挿入'(A,_大文字ならび,L), '素数でその数値文字列に3を含まない時大文字で挿入する'(A,R1,R2,_大文字ならび,L), '素数でその数値文字列に3を含まない時大文字で挿入する'(R2,_大文字ならび,L). '素数でその数値文字列に3を含まない時大文字で挿入する'(_,[],[],_大文字ならび,L) :- !. '素数でその数値文字列に3を含まない時大文字で挿入する'(N,[A|R1],R,_大文字ならび,L) :- 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L). 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L) :- 'AがNで割り切れたらそのまま篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L). 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L) :- 'AがNで割り切れなかったら篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L). 'AがNで割り切れたらそのまま篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L) :- 0 is A mod N, '素数でその数値文字列に3を含まない時大文字で挿入する'(N,R1,R,_大文字ならび,L),!. 'AがNで割り切れなかったら篩を掛け続ける'(N,[A|R1],[A|R2],_大文字ならび,L) :- '素数でその数値文字列に3を含まない時大文字で挿入する'(N,R1,R2,_大文字ならび,L). '数字列に3を含まない時は大文字を素数の位置に挿入'(N,_大文字ならび,L) :- 数字列に3を含まない時は(N,_大文字ならび), 大文字を素数の位置に挿入(N,_大文字ならび,L),!. '数字列に3を含まない時は大文字を素数の位置に挿入'(_,_,L). 数字列に3を含まない時は(N,_大文字ならび) :- number_chars(N,Chars), \+(member('3',Chars)). 大文字を素数の位置に挿入(N,_大文字ならび,L) :- nth1(N,_大文字ならび,A), nth1(N,L,A). % 以下のサイトは 行の部分二乗和(_行列,_何行目,_列起点,_列終点,_部分列の二乗和) :- nth1(_何行目,_行列,_行), findsum(_値の二乗,( 値を取り出し二乗する(_行,_列起点,_列終点,_値の二乗)),_部分列の二乗和). 値を取り出し二乗する(_行,_列起点,_列終点,_値の二乗) :- between(_列起点,_列終点,_何列目), 何列目の値の二乗(_行,_何列目,_値の二乗). 何列目の値の二乗(_行,_何列目,_値の二乗) :- nth1(_何列目,_行,_値), _値の二乗 is _値 ^ 2. findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは 列の部分二乗和(_行列,_行起点,_行終点,_何列目,_部分列の二乗和) :- findsum(_値の二乗,( 列の部分から値を取り出し二乗する(_行列,_行起点,_行終点,_何列目,_値の二乗)),_部分列の二乗和). 列の部分から値を取り出し二乗する(_行列,_行起点,_行終点,_何列目,_値の二乗) :- between(_行起点,_行終点,_何行目), 何行目の値の二乗(_行列,_何行目,_何列目,_値の二乗),_値の二乗). 何行目の値の二乗(_行列,_何行目,_何列目,_値の二乗) :- nth1(_何行目,_行列,_行), nth1(_何列目,_行,_値), _値の二乗 is _値 ^ 2. findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは 九九表([ [1,2,3,3,4,6,7,8,9], [2,4,6,8,10,12,14,16,18], [3,6,9,12,15,18,21,24,27], [4,8,12,16,20,24,28,32,36], [5,10,15,20,25,30,35,40,45], [6,12,18,24,30,36,42,48,54], [7,14,21,28,35,42,49,56,63], [8,16,24,32,40,48,56,64,72], [9,18,27,36,45,54,63,72,81]]). '「21÷7 の計算は、九九表をどのように辿れば答えがえられますか?」ならば全然問題がないように思いますが。'(_答え,_段) :- 九九表(_九九表), 表の中から21を捜す(_九九表,_段,_列,_答え). 表の中から21を捜す(_九九表,_段,_列,_答え) :- 段と列の候補を挙げる(_段,_列), '21を得る'(_九九表,_段,_列), 答えは(_段,_列,_答え). 段と列の候補を挙げる(_段,_列) :- between(1,9,_段), between(1,9,_列). '21を得る'(_九九表,_段,_列) :- nth1(_段,_九九表,_九九表の行), nth1(_列,_九九表の行,21). 答えは(7,_列,_列) :- !. 答えは(_段,7,_段). % 以下のサイトは 九九表([ [1,2,3,3,4,6,7,8,9], [2,4,6,8,10,12,14,16,18], [3,6,9,12,15,18,21,24,27], [4,8,12,16,20,24,28,32,36], [5,10,15,20,25,30,35,40,45], [6,12,18,24,30,36,42,48,54], [7,14,21,28,35,42,49,56,63], [8,16,24,32,40,48,56,64,72], [9,18,27,36,45,54,63,72,81]]). '「21÷7 の計算は、九九表をどのように辿れば答えがえられますか?」ならば全然問題がないように思いますが。'(_答え,_段) :- 九九表(_九九表), 表の中から21を捜す(_九九表,_段,_列,_答え). 表の中から21を捜す(_九九表,_段,_列,_答え) :- 段と列の候補を挙げる(_段,_列), '21を得る'(_九九表,_段,_列), 答えは(_段,_列,_答え). 段と列の候補を挙げる(_段,_列) :- between(1,9,_段), between(1,9,_列). '21を得る'(_九九表,_段,_列) :- nth1(_段,_九九表,_九九表の行), nth1(_列,_九九表の行,21). 答えは(7,_列,_列) :- !. 答えは(_段,7,_段). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #880 # [1]授業単元:C言語 # [2]問題文 # マインスイーパのような爆弾ゲームプログラムを作成する。 # 1. マス目を8× 8に設定する。 # 2. 爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)。 # 3.まだ指定していないマス目には数字の0の代わりに記号'-'を表示する。 # 4.爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を # 表示する(最小で0、最大で8)。 # 5. 爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字 # の'x'を表示し、"Bomb!"と表示して終了する。 # # [3]環境 # [3.1]windows7 # [3.2]gcc # [3.3]C/C++ # [4]7月20日 # よろしくお願いします。 # マインスイーパ :- 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面). 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面) :- 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面), '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(_平坦なならびで表現された盤面). マインスイーパ(_平坦なならびで表現された盤面) :- 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面),!. マインスイーパ(_平坦なならびで表現された盤面) :- マインスイーパを継続する(_平坦なならびで表現された盤面). 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面) :- 度数((member(A,_平坦なならびで表現された盤面),atom(A)),64), write('あなたの勝ちです。\n'). マインスイーパを継続する(_平坦なならびで表現された盤面) :- '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置), マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置) :- 爆弾を隠して盤面を表示する(_平坦なならびで表現された盤面), マス目を選択させる(_行位置,_列位置). マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面),!. マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面), 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面) :- 平坦化した位置に変換(_行位置,_列位置,_nth1), nth1(_nth1,_平坦なならびで表現された盤面,0). 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面) :- 爆弾は周囲にいくつあるか(_nth1,_平坦なならびで表現された盤面,_個数), writef('周囲に爆弾は %w 個あります\n',[_個数]),!. '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面) :- 得点は(_平坦なならびで表現された盤面,_得点), 爆弾が置かれたすべてのマス目に小文字のxを表示し(_平坦なならびで表現された盤面), writef('\n Bomb! \n\n\n あなたの得点は %t です\n',[_得点]). 得点は(_平坦なならびで表現された盤面,_得点) :- 度数((member(A,_平坦なならびで表現された盤面),\+(var(A)),A==0),_得点). 爆弾が置かれたすべてのマス目に小文字のxを表示し([]) :- !. 爆弾が置かれたすべてのマス目に小文字のxを表示し(L) :- 爆弾が置かれたすべてのマス目に小文字のxを表示して行く(L). 爆弾が置かれたすべてのマス目に小文字のxを表示して行く([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾が置かれたすべてのマス目に小文字のxを表示し(R). 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 行末まで表示する(A,R). 行末まで表示する(A,R) :- 爆弾を含むマス目表示文字(A,_表示文字), 爆弾を含むマス目表示(R,_表示文字). 爆弾を含むマス目表示(R,_表示文字) :- writef('%w',[_表示文字]), R = [], write('\n'). マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R) :- append(_,[A|R],[_1,_2,_3,_4,_5,_6,_7,_8]). 爆弾を含むマス目表示文字(V,'-') :- var(V),!. 爆弾を含むマス目表示文字('x','x') :- !. 爆弾を含むマス目表示文字(_,0). 爆弾を隠して盤面を表示する([]). 爆弾を隠して盤面を表示する([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾を隠して盤面を表示する(R). 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 爆弾を隠して行末まで表示する(A,R). 爆弾を隠して行末まで表示する(A,R) :- 爆弾を隠すマス目表示文字(A,_表示文字), 爆弾を隠すマス目表示(_表示文字,R). 爆弾を隠すマス目表示(_表示文字,R) :- writef('%w',[_表示文字]), R = [], write('\n'). 爆弾を隠すマス目表示文字(V,'-') :- var(V),!. 爆弾を隠すマス目表示文字('x','-') :- !. 爆弾を隠すマス目表示文字(_,0). 平坦化した位置に変換(_行位置,_列位置,_nth1) :- _nth1 is (_行位置-1) * 8 + _列位置. 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面) :- length(_平坦なならびで表現された盤面,64). '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(L) :- 爆弾は10個にし(Lp), 同じマス目に重ならないようにランだけに配置する(Lp,L). 爆弾は10個にし(Lp) :- length(Lp,10). 同じマス目に重ならないようにランだけに配置する([],L) :- !. 同じマス目に重ならないようにランだけに配置する([_|R1],L) :- 同じマス目に重ならないようにランダムに一個爆弾を設置する(L), 同じマス目に重ならないようにランだけに配置する(R1,L). 同じマス目に重ならないようにランダムに一個爆弾を設置する(L) :- ランダムに(L,_nth0), 同じマス目に重ならないように一個爆弾を設置する(_nth0,L),!. ランダムに(L,_nth0) :- repeat, _nth0 is random(64). 同じマス目に重ならないように一個爆弾を設置する(_nth0,L) :- 同じマス目に重ならないように(_nth0,L,V), 一個爆弾を設置する(V). 同じマス目に重ならないように(_nth0,L,V) :- nth0(_nth0,L,V), var(V). 一個爆弾を設置する(x). 爆弾は周囲にいくつあるか(N,L,_個数) :- 度数(周囲の八箇所の中で爆弾があるのは(N,L),_個数). 周囲の八箇所の中で爆弾があるのは(N,L) :- 周辺の八箇所の中で(N,_nth1), '_nth1には爆弾がある'(_nth1,L). 周辺の八箇所の中で(N,_nth1) :- member(_式,[N-9,N-8,N-7,N-1,N,N+1,N+7,N+8,N+9]), _nth1 is _式. '_nth1には爆弾がある'(_nth1,L) :- nth1(_nth1,L,V), 変数ではなく爆弾がある(V). 変数ではなく爆弾がある(V) :- 変数ではなく(V), V = x. 変数ではなく(V) :- \+(var(V)). マス目を選択させる(_行位置,_桁位置) :- 整数を得る('マス目の行位置(1-8) ',between(1,8,_行位置),_行位置), 整数を得る('マス目の桁位置(1-8) ',between(1,8,_桁位置),_桁位置),!. 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から(_催促文,_行), 行を条件付きで整数に変換する(_行,_条件,_整数),!. 催促文付き行入力から(_催促文,_行) :- writef('%w',[_催促文]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_chars(_行,Codes). 行を条件付きで整数に変換する(_行,_条件,_整数) :- 行を整数に変換する(_行,_整数), 整数入力条件検査(_条件). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査(_整数). 整数検査(_整数) :- integer(_整数),!. 整数検査(_項) :- 整数検査再入力要請(_項). 整数検査再入力要請(_項) :- writef('入力された項 %w は整数になりません。再入力をお願いします。\n',[_項]), fail. 整数入力条件検査(_条件) :- catch(_条件,E,fail),!. 整数入力条件検査(_条件) :- 整数入力条件検査再入力要請(_条件). 整数入力条件検査再入力要請(_条件) :- writef('入力された %w は成立しません。再入力をお願いします。\n',[_条件]), fail. % 以下のサイトは # 出典 :: プログラミングのお題スレ Part3 #435 # # お題:10進数を2進数にしてビットごとに反転したものを10進数に戻す。 # 例 # 1 -> 0 # 12345 -> 4038 # 256 -> 255 '10進数を2進数にしてビットごとに反転したものを10進数に戻す。'(_10進数を,_2進数にしてビットごとに反転したものを10進数戻す) :- '10進数を2進数にして'(_10進数を,[],_2進数にして), ビットごとに反転したものを(_2進数にして,_ビットごとに反転したものを), '10進数に戻す'(_ビットごとに反転したものを,0,_2進数にしてビットごとに反転したものを10進数戻す). '10進数を2進数にして'(0,_2進数にして,_2進数にして) :- !. '10進数を2進数にして'(_10進数,_2進数ならび,_2進数にして) :- '2進数を下位桁から積み上げる'(_10進数,_2進数ならび,_2進数にして). '2進数を下位桁から積み上げる'(_10進数,_2進数ならび,_2進数にして) :- 最下位桁のビットを切り取る(_10進数,_ビット,_10進数_1), '10進数を2進数にして'(_10進数_1,[_ビット|_2進数ならび],_2進数にして). 最下位桁のビットを切り取る(_10進数,_ビット,_10進数_1) :- _ビット is _10進数 mod 2, _10進数_1 is _10進数 // 2. ビットごとに反転したものを(_2進数にして,_ビットごとに反転したものを) :- findall(_反転した,( ビットを反転した(_2進数にして,_反転した)),_ビットごとに反転したものを). ビットを反転した(_2進数にして,_反転した) :- ビットを(_2進数にして,_ビットを), 反転した(_ビットを,_反転した). ビットを(_2進数にして,_ビットを) :- nth1(_,_2進数にして,_ビットを). 反転した(0,1). 反転した(1,0). '10進数に戻す'([],_10進数に戻す,_10進数に戻す). '10進数に戻す'(_二進数ビットならび,_10進数の積み上げ_1,_10進数に戻す) :- '10進数を積み上げて行く'(_二進数ビットならび,_10進数の積み上げ_1,_10進数に戻す). '10進数を積み上げて行く'([_ビット|R],_10進数の積み上げ_1,_10進数に戻す) :- _10進数の積み上げ_2 is _10進数の積み上げ_1 * 2 + _ビット, '10進数に戻す'(R,_10進数の積み上げ_2,_10進数に戻す). % 以下のサイトは % 非決定性 シャッフルして一枚取り出す/4 シャッフルして一枚取り出す(_札,_既に取り出した札,_取り出す札,_残り札) :- シャッフル(_札,_シャッフルした札), append(_既に取り出した札,[_取り出す札|_残り札],_シャッフルした札). % 決定性 シャッフル/2 シャッフル([],[]) :- !. シャッフル(L,[A|R2]) :- 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2). 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2) :- 位置を示す乱数を使い(L,_乱数), 一個ずつ取り出して行く(L,_乱数,A,R2). 位置を示す乱数を使い(L,_乱数) :- length(L,Len), _乱数 is random(Len). 一個ずつ取り出して行く(L,_乱数,A,R2) :- 取り出して行く(L,_乱数,A,R1), シャッフル(R1,R2). 取り出して行く(L,_乱数,A,R1) :- nth0(_乱数,L,A), select(A,L,R1). % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nがmになる直前の変数nの値を求めよ # '1+2+3+....+nが_mになる直前の変数_nの値を求めよ'(_m,_n) :- once((nth1(_n,_,_),((_n + 2) * (_n + 1)) / 2 >= _m)). % 以下のサイトは 行列の2つの行を交換する(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), 行列の2つの行を交換する(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行を交換した行列). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). 行列の2つの行を交換する(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行を交換した行列) :- length(_行列,_行列の行数), '2つの行を交換しながら別に行列を生成する'(_行列,_行列の行数,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行を交換した行列). '2つの行を交換しながら別に行列を生成する'(_行列,_行列の行数,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行を交換した行列) :- findnsols(_生成された行,_行列の行数,( 行を生成する(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_生成された行)),_2つの行を交換した行列),!. 行を生成する(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_生成された行) :- nth1(_nth1,_,_生成された行), '交換する行は交換し、そうでないものは行列から取得'(_行列,_nth1,_第何行_1,_第何行_2,_行_1,_行_2,_生成された行). '交換する行は交換し、そうでないものは行列から取得'(_,_nth1,_nth1,_,_,_行_2,_行_2) :- !. '交換する行は交換し、そうでないものは行列から取得'(_,_nth1,_,_nth1,_行_1,_,_行_1) :- !. '交換する行は交換し、そうでないものは行列から取得'(_行列,_nth1,_,_,_,_,_行) :- nth1(_nth1,_行列,_行). % 以下のサイトは # 【 課題 】マス取りゲーム # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11/27 24:00 # 【 Ver  】"1.7.0_45" # 【 補足 】3×3のマスに『○』と『×』を交互に入力して9マス埋まったら終了です。 # 勝ち負けはいりません 戦略なしマス取りゲーム(_手順) :- 戦略なしマス取りゲーム(○,[a1,a2,a3,b1,b2,b3,c1,c2,c3],_手順). 戦略なしマス取りゲーム(_手番,[],[]). 戦略なしマス取りゲーム(_手番,_残りマスならび,_手順) :- 空いたマスがあれば戦略なしマス取りゲームを続ける(_手番,_残りマスならび,_手順). 空いたマスがあれば戦略なしマス取りゲームを続ける(_手番,_残りマスならび,[[_手番,_マス]|_手順]) :- 空いたマスがあれば(_残りマスならび), 手番がマスをひとつ取る(_手番,_残りマスならび,_次の手番,_マス,_ひとつマスを取られた残りマスならび), 戦略なしマス取りゲーム(_次の手番,_ひとつマスを取られた残りマスならび,_手順). 空いたマスがあれば(_残りマスならび) :- \+(_残りマスならび = []). 手番がマスをひとつ取る(_手番,_残りマスならび,_次の手番,_マス,_ひとつマスを取られた残りマスならび) :- マスをひとつ取る(_残りマスならび,_マス), ひとつマスを取られた残りマスならび(_マス,_残りマスならび,_ひとつマスを取られた残りマスならび), 次の手番(_手番,_次の手番). マスをひとつ取る(_残りマスならび,_マス) :- length(_残りマスならび,_残りマス数), _乱順数 is random(_残りマス数), nth0(_乱順数,_残りマスならび,_マス). ひとつマスを取られた残りマスならび(_マス,_残りマスならび,_ひとつマスを取られた残りマスならび) :- select(_マス,_残りマスならび,_ひとつマスを取られた残りマスならび). 次の手番(○,×). 次の手番(×,○). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/905 # # [1]c++ # [2]2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。 # また、対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。 # ただし、対角要素は左上隅から右下隅への対角線上の要素とする。次の図は実行例であ る。 # --- (2)配列nの内容 --- # # 100000000 # 010000000 # 001000000 # 000100000 # 000010000 # 000001000 # 000000100 # 000000010 # 000000001 '2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。' :- '2次元配列n[10][10]のすべての要素に1を代入してから'(LL), 'その内容を表示しなさい。'(LL). '2次元配列n[10][10]のすべての要素に1を代入してから'(LL) :- findall(_行,( '10行ある', '10要素の行のすべての要素に1を代入'(_行)),LL). '10行ある' :- between(1,10,_). '10要素の行のすべての要素に1を代入'(_行) :- '10要素の行の'(_行), すべての要素に1を代入(_行). '10要素の行の'(_行) :- length(_行,10). すべての要素に1を代入([]). すべての要素に1を代入([1|R]) :- すべての要素に1を代入(R). 'その内容を表示しなさい。'(LL) :- 表示しなさい(LL). 表示しなさい(LL) :- forall(行を表示文字列に変換する(LL,_表示文字列),writef('%w\n',[_表示文字列])). 行を表示文字列に変換する(LL,_表示文字列) :- member(_行,LL), atomic_list_concat(_行,' ',_表示文字列). '対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。' :- 対角要素だけ1を代入しほかは全て0を代入してから(LL), 表示しなさい(LL). 対角要素だけ1を代入しほかは全て0を代入してから(LL) :- findall(L,( between(1,10,_n), 対角要素だけ1を代入しほかは全て0を代入(_n,L)),LL). 対角要素だけ1を代入しほかは全て0を代入(_n,L) :- 対角要素だけ1を代入し(_n,L), 他の全ての変数要素は0に(L). 対角要素だけ1を代入し(_n,L) :- length(L,10), reverse(L,RL), 対角要素だけ1を代入し(_n,RL,L). 対角要素だけ1を代入し(_n,RL,L) :- nth1(_n,L,1), nth1(_n,RL,1). 他の全ての変数要素は0に(L) :- findall(N,( member(N,L), 変数要素は0に(N)),L). 変数要素は0に(0) :- !. 変数要素は0に(N). % 以下のサイトは ナップサック問題(N,_許容最大重量,_重さならび,_詰め方,_詰めることのできる最大重量) :- 許容最大重量内の全ての詰め方の組合せを得る(N,_許容最大重量,_重さならび,LL), 詰めることのできる最大重量を得る(LL,_詰めることのできる最大重量), 選択位置ならびから詰め方を得る(_重さならび,LL,_詰めることのできる最大重量,_詰め方). 許容最大重量内の全ての詰め方の組合せを得る(N,_許容最大重量,_重さならび,LL) :- findall([_詰め方,_選択位置ならび],詰め物の作成(N,_許容最大重量,_重さならび,_選択位置ならび,_詰めた重さ),LL). 詰め物の作成(N,_許容最大重量,_重さならび,_選択位置ならび,_詰めた重さ) :- findall(M,between(1,N,M),L), 冪集合(L,_冪集合), 許容最大重量内の詰め方と詰めた重さ(_許容最大重量,_重さならび,_冪集合,_選択位置ならび,_詰めた重さ). 許容最大重量内の詰め方と詰めた重さ(_許容最大重量,_重さならび,_冪集合,_選択位置ならび,_詰めた重さ) :- 許容最大重量内の選択位置ならび(_許容最大重量,_重さならび,_冪集合,_選択位置ならび,_詰めた重さ). 許容最大重量内の選択位置ならび(_許容最大重量,_重さならび,_冪集合,_選択位置ならび,詰めた重さ) :- member(_集合,_冪集合), '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_選択位置ならび,_詰めた重さ). '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_選択位置ならび,_詰めた重さ) :- '集合の重量合計は'(_選択位置ならび,_重さならび,_詰めた重さ), _詰めた重さ =< _許容最大重量. '集合の重量合計は'(_選択位置ならび,_重さならび,_合計重量) :- findsum(Wi,( member(_要素,_選択位置ならび), nth1(_要素,_重さならび,Wi)),_合計重量). 詰めることのできる最大重量を得る(LL,_詰めることのできる最大重量) :- findmax(_詰めた重さ,member([_,_詰めた重さ],LL),_詰めることのできる最大重量). 選択位置ならびから詰め方を得る(_重さならび,LL,_詰めることのできる最大重量,_詰め方) :- member([_選択位置ならび,_詰めることのできる最大重量],LL), findall(_重さ,( member(_位置,_選択位置ならび), nth1(_位置,_重さならび,_重さ)),_詰め方). 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)),_冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは ナップサック問題(N,_許容最大重量,_重さならび,_価格ならび,_詰めることのできる最高合計金額) :- findmax(_合計価格,詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_,_合計価格),_詰めることのできる最高合計金額). 詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_選択位置ならび,_合計価格) :- findall(M,between(1,N,M),L), 冪集合(L,_冪集合), 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_選択位置ならび,_合計価格). 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_選択位置ならび,_合計価格) :- 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_選択位置ならび), 集合の合計価格(_選択位置ならび,_価格ならび,_合計価格). 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_選択位置ならび) :- member(_選択位置ならび,_冪集合), '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_選択位置ならび). '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_選択位置ならび) :- '集合の重量合計は'(_選択位置ならび,_重さならび,_合計重量), _合計重量 =< _許容最大重量. '集合の重量合計は'(_選択位置ならび,_重さならび,_合計重量) :- findsum(Wi,( member(_要素,_選択位置ならび), nth1(_要素,_重さならび,Wi)),_合計重量). 集合の合計価格(_集合,_価格ならび,_合計価格) :- findsum(Pi,( member(_要素,_集合), nth1(_要素,_価格ならび,Pi)),_合計価格). 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)),_冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび), 成績データを成績順に並べ直す(_成績ならび,_成績順に整列した成績ならび), 上位11名の選別(_成績順に整列した成績ならび,_上位11名ならび), 上位11名を表示する(_上位11名ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), get_line(_行), 成績データを得る(1,_行,_整列鍵ならび,_成績ならび). 成績データと整列鍵を得る(_,'0 0',[],[]) :- !. 成績データと整列鍵を得る(100,_,[],[]). 成績データと整列鍵を得る(M,_行,[[_成績,M]|R1],[[_学籍番号,_成績]|R2]) :- split(_行,[' '],[_学籍番号,_成績]), succ(M,M_2), get_line(_行_2), 成績データと整列鍵を得る(M_2,_行_2,R1,R2). 成績データを成績順に並べ直す(_整列鍵ならび,_成績ならび,_成績順に整列した成績ならび) :- sort(_整列鍵ならび,_整列した整列鍵ならび), 成績データを大きい順に並べ直す(_整列した整列鍵ならび,_成績ならび,[],_成績順に整列した成績ならび). 成績データを大きい順に並べ直す([],_,_成績順に整列した成績ならび,_成績順に整列した成績ならび). 成績データを大きい順に並べ直す([[_,M]|R1],_成績ならび,L1,_成績順に整列した成績ならび) :- nth1(M,_成績ならび,[_学籍番号,_成績]), 成績データを大きい順に並べ直す(R1,_成績ならび,[[_学籍番号,_成績]|L1],_成績順に整列した成績ならび). 上位11名の選別(L,_上位11名ならび) :- findnsols(11,X,member(X,L),_上位11名ならび),!. 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/456 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10195.txt # # 今回はナップサック問題について考えプログラムを作成する。N個の荷物があって、個々の荷物の重さをWi、値段をPiとする。但しiは1からNの整数を意味する。 # 袋には最大Wの重さまで入れられるとすると、最大でいくら分を入れることができるか?という問題。 # データファイルは、始めの一行に荷物の個数Nが書かれており、次に重さが整数でN行分書かれている。その次の行からN行分、それぞれの荷物の価値が書かれているとする。 # 下のデータファイルの場合は、3個の荷物があり、重みは10、20、13、で # それぞれの値段は23、23、10という状況を表す。 # ------------------- # 3 # 10 # 20 # 13 # 23 # 23 # 10 # ------------------- # 荷物の重みと値段はともに、1から100までの乱数で与えることとする。 # void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている # ファイル名のファイルを開き、そこにデータを記録する。void_read_data_file(char*file)という関数を呼ぶと、文字列変数fileによって名前が指定されたファイルを開き、大域変数の荷物の重み配列W[]と値段配列[]\\\\\にデータを入力する。 '荷物の重みと値段はともに、1から100までの乱数で与えることとする。 void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている ファイル名のファイルを開き、そこにデータを記録する。'(_ファイル名,N) :- ファイル名のファイルを開き(_ファイル名), 'そこにデータを記録する。'(N), ファイルを閉じる. ファイル名のファイルを開き(_ファイル名) :- tell(_ファイル名). 'そこにデータを記録する。'(N) :- writef('%w\n',[N]), forall((between(1,N,_),X is random(100) + 1),writef('%w\n',[X])), forall((between(1,N,_),Y is random(100) + 1),writef('%w\n',[Y])). ファイルを閉じる :- told. ナップサック問題(_ファイル名,N,_許容最大重量,_詰めることのできる最高合計金額) :- データファイルから重さならびと価格ならびを得る(_ファイル名,N,_重さならび,_価格ならび), findmax(_合計価格,詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_,_合計価格),_詰めることのできる最高合計金額). データファイルから重さならびと価格ならびを得る(_ファイル名,N,_重さならび,_価格ならび) :- データファイルから読み出す(_ファイル名,N,_整数ならび), 重さならびと価格ならびに分離(N,_整数ならび,_重さならび,_価格ならび). データファイルから読み出す(_ファイル名,N,L1) :- see(_ファイル名), get_integer(N), get_integers(L1), seen. 重さならびと価格ならびに分離(N,_整数ならび,_重さならび,_価格ならび) :- length(_重さならび,N), length(_価格ならび,N), append(_重さならび,_価格ならび,_整数ならび). 詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_集合,_合計価格) :- findall(M,between(1,N,M),L), 冪集合(L,_冪集合), 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_集合,_合計価格). 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_集合,_合計価格) :- 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_集合), 集合の合計価格(_集合,_価格ならび,_合計価格). 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_集合) :- member(_集合,_冪集合), '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_集合). '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_集合) :- '集合の重量合計は'(_集合,_重さならび,_合計重量), _合計重量 =< _許容最大重量. '集合の重量合計は'(_集合,_重さならび,_合計重量) :- findsum(Wi,( member(_要素,_集合), nth1(_要素,_重さならび,Wi)),_合計重量). 集合の合計価格(_集合,_価格ならび,_合計価格) :- findsum(Pi,( member(_要素,_集合), nth1(_要素,_価格ならび,Pi)),_合計価格). get_integers(L) :- findall(I,(repeat,get_line(Line),(Line=end_of_file,!,fail;read_term_from_atom(Line,I,[]))),L),!. 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)),_冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). get_integer(N) :- get_line(Line), read_term_from_atom(Line,N,[]). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- '1+2+3+....+nが'(_n,_合計), '1000になる直前の変数nの値'(_合計,_n),!. '1+2+3+....+nが'(_n,_合計) :- nth1(_n,_,_), '1+2+3+....+n'(_n,_合計). '1+2+3+....+n'(_n,_合計) :- findall(_整数,between(1,_n,_整数),_1からnまでの整数ならび), sum_list(_1からnまでの整数ならび,_合計). '1000になる直前の変数nの値'(_合計,_n) :- _合計 + _n + 1 >= 1000. % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- once((nth1(_n,_,_),((_n + 2) * (_n + 1)) / 2 >= 1000)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/751 # # [1] 授業単元:文字列 # [2] 問題文(含コード&リンク): # 1行最大80文字の空白を挟まない英字文字列を入力したとき、大文字の文字を小文字に、小文字の文字を大文字にして表示するプログラムを作成しなさい # このプログラムの入力は、英字以外の文字が入力される場合を考慮しなくてもよい # 英大文字ならび(['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']). 英小文字ならび([a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). '1行最大80文字の空白を挟まない英字文字列を入力したとき、大文字の文字を小文字に、小文字の文字を大文字にして表示する' :- 英大文字ならび(_英大文字ならび), 英小文字ならび(_英小文字ならび), '1行最大80文字の空白を挟まない英字文字列を入力したとき、大文字の文字を小文字に、小文字の文字を大文字にして表示する'(_英大文字ならび,_英小文字ならび). '1行最大80文字の空白を挟まない英字文字列を入力したとき、大文字の文字を小文字に、小文字の文字を大文字にして表示する'(_英大文字ならび,_英小文字ならび) :- '1行最大80文字の空白を挟まない英字文字列を入力したとき、'(_英大文字ならび,_英小文字ならび,_英文字ならび), '一行を大文字を小文字に、小文字を大文字にしながら表示する'(_英大文字ならび,_英小文字ならび,_英文字ならび). '1行最大80文字の空白を挟まない英字文字列を入力したとき、'(_英大文字ならび,_英小文字ならび,_最大80字の英文字ならび) :- length(Ln,80), 英文字を読み込む(_英大文字ならび,_英小文字ならび,_英文字), '1行最大80文字の空白を挟まない英字文字ならび'(Ln,_英大文字ならび,_英小文字ならび,_英文字,_最大80字の英文字ならび). '1行最大80文字の空白を挟まない英字文字ならび'(Ln,_,_,_文字,[]) :- '停止条件::改行を読み込むか80字を超える'(Ln,_文字). '1行最大80文字の空白を挟まない英字文字ならび'([_|Ln],_英大文字ならび,_英小文字ならび,_文字,[_文字|R]) :- '1行最大80文字の空白を挟まない英字文字ならび'(Ln,_英大文字ならび,_英小文字ならび,R). '停止条件::改行を読み込むか80字を超える'([],_). '停止条件::改行を読み込むか80字を超える'([_|_],'\n'). '1行最大80文字の空白を挟まない英字文字ならび'(Ln,_英大文字ならび,_英小文字ならび,R) :- 英文字を読み込む(_英大文字ならび,_英小文字ならび,_次の英文字), '1行最大80文字の空白を挟まない英字文字ならび'(Ln,_英大文字ならび,_英小文字ならび,_次の英文字,R). 英文字を読み込む(_英大文字ならび,_英小文字ならび,_英文字) :- get_char(_英文字), 英文字(_英文字,_英大文字ならび,_英小文字ならび),!. 英文字を読み込む(_英大文字ならび,_英小文字ならび,_英文字) :- 英文字を読み込む(_英大文字ならび,_英小文字ならび,_英文字). 英文字(_文字,_英大文字ならび,_) :- member(_文字,_英大文字ならび). 英文字(_文字,_,_英小文字ならび) :- member(_文字,_英小文字ならび). '一行を大文字を小文字に、小文字を大文字にしながら表示する'(_英文字ならび,_英大文字ならび,_英小文字ならび) :- forall(member(_文字,_英文字ならび), '大文字を小文字に、小文字を大文字にして表示する'(_英大文字ならび,_英小文字ならび,_文字)). '大文字を小文字に、小文字を大文字にして表示する'(L1,L2,_文字) :- '大文字を小文字に、小文字を大文字にして'(L1,L2,_文字,_変換された文字), writef('%w',[_変換された文字]). '大文字を小文字に、小文字を大文字にして'(L1,L2,_文字,_変換された文字) :- 英文字変換(L1,L2,_文字,_変換された文字),!. '大文字を小文字に、小文字を大文字にして'(L1,L2,_文字,_変換された文字) :- '大文字を小文字に、小文字を大文字にして'(L2,L1,_文字,_変換された文字). 英文字変換(L1,L2,_文字,_変換された文字) :- nth1(_nth1,L1,_文字), nth1(_nth1,L2,_変換された文字). % 以下のサイトは # # ある専門学校の受験資格のデシジョンテーブル # # <条件> 1 2 3 4 5 6 7 8 # # 体重が軽い N N N N Y Y Y Y # 体が柔らかい N N Y Y N Y N Y # 敏捷である N Y Y N N N Y Y # # <行動> # # 受験資格がある X # 受験資格がない X X X X X X X 体重が軽い(偽,偽,偽,偽,真,真,真,真). 体が柔らかい(偽,偽,真,真,偽,真,偽,真). 敏捷である(偽,真,真,偽,偽,偽,真,真). 受験(諦める,諦める,ダイエットして来年受験する,諦める,諦める,諦める,ヨガに一年通ってから受験する,受験してみる). デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_行動述語名ならび,_選択列,_行動ならび) :- デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_選択列), findall(_行動,( '行動述語の_選択列引数を得る'(_アリティ,_選択列,_行動述語名ならび,_行動)), _行動ならび). デシジョンテーブル(_,[],_,_選択列). デシジョンテーブル(_アリティ,[_述語名|R1],[_真偽値|R2],_選択列) :- 条件述語を実行する(_アリティ,_述語名,_真偽値ならび), nth1(_選択列,_真偽値ならび,_真偽値), デシジョンテーブル(_アリティ,R1,R2,_選択列). 条件述語を実行する(_アリティ,_述語名,_真偽値ならび) :- length(_真偽値ならび,_アリティ), P =.. [_述語名|_真偽値ならび], call(P). '行動述語の_選択列引数を得る'(_アリティ,_選択列,_行動述語名ならび,_行動) :- member(_行動述語名,_行動述語名ならび), 行動述語名の行動ならびを得る(_アリティ,_行動述語名,_行動選択ならび), nth1(_選択列,_行動選択ならび,_行動). 行動述語名の行動選択ならびを得る(_アリティ,_行動述語名,_行動選択ならび) :- length(_行動選択ならび,_アリティ), P =.. [_行動述語名|_行動選択ならび], call(P). % % ?- デシジョンテーブル(8,[体重が軽い,体が柔らかい,敏捷である],[真,偽,真],[受験],_選択列,_行動ならび). % % _選択列 = 7, % _行動ならび = [ヨガに一年通ってから受験する] % % 以下のサイトは 切ったトランプを用意する(_切ったトランプ) :- '52枚の整列したカード'(_52枚の整列したカード), シャッフル(_52枚の整列したカード,_切ったトランプ). '52枚の整列したカード'(_52枚の整列したカード) :- findall([_数,_スート], 'カードを数・スート順に生成する'(_数,_スート),_52枚の整列したカード). 'カードを数・スート順に生成する'(_数,_スート) :- between(1,13,_数), member(_スート,[スペード,ハート,ダイヤ,クラブ]). シャッフル([],[]) :- !. シャッフル(L,[A|R2]) :- 位置を示す乱数を使い一枚ずつ取り出して行くことによりシャッフルする(L,A,R2). 位置を示す乱数を使い一枚ずつ取り出して行くことによりシャッフルする(L,A,R2) :- 位置を示す乱数を使い一枚ずつ取り出して行く(L,A,R2), select(A,L,R1), シャッフル(R1,R2). 位置を示す乱数を使い一枚ずつ取り出して行く(L1,A,R2):- length(L1,Len), _乱数 is random(Len), nth0(_乱数,L1,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/786 # # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- n個収集したm番目(30,30,_前文字列,'キャレッジ・リターンが登場'(_文字列,_前文字列),_末尾を削除された文字列),!. 'キャレッジ・リターンが登場'(_文字列,_前文字列) :- sub_atom(_文字列,S,1,R,'\r'), sub_atom(_文字列,0,_,R,_前文字列). n個収集したm番目(_n個,_m番目,_射影項,_目標,_n個収集したm番目) :- n個収集した(_n個,_射影項,_目標,_n個収集した), m番目(_m番目,_n個収集した,_n個収集したm番目). n個収集した(_n個,_射影項,_目標,_n個収集した) :- findnsols(_n個,_射影項,_目標,_n個収集した). m番目(_m番目,_ならび,_ならびのm番目) :- nth1(_m番目,_ならび,_ならびのm番目). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 164代目 #833 # お願いします。 # [1] 情報処理演習 # [2] 自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力するプログラムを作 # 成せよ. #  [3.1] Linux #  [3.2] コンパイラ名とバージョン:visual studio 2010 #  [3.3] C言語 # [4] 指定なし # [5] 特になし # # '自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力する' :- '自然数n > 0 を入力として,'(_n), 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数),!. '自然数n > 0 を入力として,'(_n) :- 整数を得る('0より大きい自然数',_n > 0,_n). 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数), 出力する(_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を'(_n,L), 一つ(L,_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を'(_n,L) :- findall(_その自明でない約数,'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数),L). 'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数) :- _n_1 is _n - 1, between(2,_n_1,_その自明でない約数), 0 is _n mod _その自明でない約数. 一つ([H|T],_その自明でない約数) :- length([H|T],Len), _乱数 is random(Len), nth0(_乱数,[H|T],_その自明でない約数). 出力する(_その自明でない約数) :- writef('%t\n',[_その自明でない約数]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 164代目 #833 # お願いします。 # [1] 情報処理演習 # [2] 自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力するプログラムを作 # 成せよ. #  [3.1] Linux #  [3.2] コンパイラ名とバージョン:visual studio 2010 #  [3.3] C言語 # [4] 指定なし # [5] 特になし # # '自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力する' :- '自然数n > 0 を入力として,'(_n), 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数),!. '自然数n > 0 を入力として,'(_n) :- 整数を得る('0より大きい自然数',_n > 0,_n). 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数), 出力する(_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を'(_n,L), 一つ(L,_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を'(_n,L) :- findall(_その自明でない約数,'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数),L). 'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数) :- _n_1 is _n - 1, between(2,_n_1,_その自明でない約数), 0 is _n mod _その自明でない約数. 一つ([H|T],_その自明でない約数) :- length([H|T],Len), _乱数 is random(Len), nth0(_乱数,[H|T],_その自明でない約数). 出力する(_その自明でない約数) :- writef('%t\n',[_その自明でない約数]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは シャッフル([],[]) :- !. シャッフル(L,[A|R2]) :- 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2). 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2) :- 位置を示す乱数を使い一個ずつ取り出して行く(L,A,R2), select(A,L,R1), シャッフル(R1,R2). 位置を示す乱数を使い一個ずつ取り出して行く(L1,A,R2) :- length(L1,Len), _乱数 is random(Len), nth0(_乱数,L1,A). % 以下のサイトは シャッフル(L1,L2) :- length(L1,Len), findall(N,between(1,Len,N),L), シャッフル(Len,L,L1,L2). シャッフル(0,_,_,[]) :- !. シャッフル(Len,L,L1,[_値|R]) :- 'L1からランダムに取り出して新たなリストを構成する'(Len,L,L1,_値,R). 'L1からランダムに取り出して新たなリストを構成する'(Len,L,L1,_値,R) :- 得られた乱数の位置にあるL1の値を取り出す(Len,L,L1,L_1,_値), succ(Len_1,Len), シャッフル(Len_1,L_1,L1,R). 得られた乱数の位置にあるL1の値を取り出す(Len,L,L1,L_1,_値) :- 得られた乱数の位置にある(Len,L,M), 'L1の値を取り出す'(L,L1,M,L_1,_値). 得られた乱数の位置にある(Len,L,M) :- N is random(Len) + 1, nth1(N,L,M). 'L1の値を取り出す'(L,L1,M,L_1,_値) :- nth1(M,L1,_値), select(M,L,L_1). % 以下のサイトは 'Σ'(_n_1,_n_2,_k,_目標の集約値,_目標,_集約合計) :- findsum(_目標の集約値,( between(_n_1,_n_2,_k),_目標),_集約合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '最小二乗法を用いて、1次関数 ax+b をモデルとして近似し、係数a,bを決定する。 最小二乗法とは、測定で得られた数値の組を、適当なモデルから想定される 想定する関数が測定値に対してよい近似となるように、残差の二乗和を最小と するような係数を決定する方法。'(_測定で得られた数値の組,_a,_b) :- length(_測定で得られた数値の組,_標本数), '測定で得られた数値の組をLx,Lyに分解する'(_測定で得られた数値の組,Lx,Ly), '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b). '測定で得られた数値の組をLx,Lyに分解する'([],[],[]). '測定で得られた数値の組をLx,Lyに分解する'([(X,Y)|R],[X|Rx],[Y|Ry]) :- '測定で得られた数値の組をLx,Lyに分解する'(R,Rx,Ry). '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- 係数aの式の分子(_標本数,Lx,Ly,_分子), 係数aの式の分母(_標本数,Lx,Ly,_分母), _a is _分子 / _分母. 係数aの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_3), _分子 is _標本数 * _合計_1 - _合計_2 * _合計_3. 係数aの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. 係数b(_標本数,Lx,Ly,_b) :- 係数bの式の分子(_標本数,Lx,Ly,_分子), 係数bの式の分母(_標本数,Lx,Ly,_分母), _b is _分子 / _分母. 係数bの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_2), 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_3), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_4), _分子 is _合計_1 * _合計_2 - _合計_3 * _合計_4. 係数bの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. % 以下のサイトは 'Σ'(_n_1,_n_2,_k,_目標の集約値,_目標,_集約合計) :- findsum(_目標の集約値,( between(_n_1,_n_2,_k),_目標),_集約合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '最小二乗法を用いて、1次関数 ax+b をモデルとして近似し、係数a,bを決定する。 最小二乗法とは、測定で得られた数値の組を、適当なモデルから想定される 想定する関数が測定値に対してよい近似となるように、残差の二乗和を最小と するような係数を決定する方法。'(_測定で得られた数値の組,_a,_b) :- length(_測定で得られた数値の組,_標本数), '測定で得られた数値の組をLx,Lyに分解する'(_測定で得られた数値の組,Lx,Ly), '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b). '測定で得られた数値の組をLx,Lyに分解する'([],[],[]). '測定で得られた数値の組をLx,Lyに分解する'([(X,Y)|R],[X|Rx],[Y|Ry]) :- '測定で得られた数値の組をLx,Lyに分解する'(R,Rx,Ry). '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- 係数aの式の分子(_標本数,Lx,Ly,_分子), 係数aの式の分母(_標本数,Lx,Ly,_分母), _a is _分子 / _分母. 係数aの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_3), _分子 is _標本数 * _合計_1 - _合計_2 * _合計_3. 係数aの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. 係数b(_標本数,Lx,Ly,_b) :- 係数bの式の分子(_標本数,Lx,Ly,_分子), 係数bの式の分母(_標本数,Lx,Ly,_分母), _b is _分子 / _分母. 係数bの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_2), 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_3), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_4), _分子 is _合計_1 * _合計_2 - _合計_3 * _合計_4. 係数bの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. % 以下のサイトは Σ(_n_1,_n_2,_k,_目標の集約値,_目標,_集約合計) :- findsum(_目標の集約値,( between(_n_1,_n_2,_k), call(_目標)),_集約合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '一次方程式 y=ax+b の係数_a,_bを最小二乗法を使って得る'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_1), Σ(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), Σ(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_3), Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_4), Σ(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_5), _a is (_標本数 * _合計_1 - _合計_2 * _合計_3) / ( _標本数 * _合計_4 - _合計_5 ^ 2). 係数b(_標本数,Lx,Ly,_b) :- Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), Σ(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_2), Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_3), Σ(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_4), Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_5), Σ(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_6), _b is (_合計_1 * _合計_2 - _合計_3 * _合計_4) / ( _標本数 * _合計_5 - _合計_6 ^ 2). % 以下のサイトは sigma(_n_1,_n_2,_k,S,P,_合計) :- findsum(S,( between(_n_1,_n_2,_k), call(P)),_合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '一次方程式 y=ax+b の係数_a,_bを最小二乗法を使って得る'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_1), sigma(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), sigma(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_3), sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_4), sigma(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_5), _a is (_標本数 * _合計_1 - _合計_2 * _合計_3) / ( _標本数 * _合計_4 - _合計_5 ^ 2). 係数b(_標本数,Lx,Ly,_b) :- sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), sigma(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_2), sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_3), sigma(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_4), sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_5), sigma(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_6), _b is (_合計_1 * _合計_2 - _合計_3 * _合計_4) / ( _標本数 * _合計_5 - _合計_6 ^ 2). % 以下のサイトは sigma(_n_1,_n_2,S,P,_合計) :- findsum(S,P,_合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '一次方程式 y=ax+b の係数_a,_bを最小二乗法を使って得る'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- sigma(1,_標本数,S,(nth1(_nth1,Lx,X),nth1(_nth1,Ly,Y),S is X * Y),_合計_1), sigma(1,_標本数,S,member(S,Lx),_合計_2), sigma(1,_標本数,S,member(S,Ly),_合計_3), sigma(1,_標本数,S,(member(X,Lx),S is X ^ 2),_合計_4), sigma(1,_標本数,S,member(S,Lx),_合計_5), _a is (_標本数 * _合計_1 - _合計_2 * _合計_3) / ( _標本数 * _合計_4 - _合計_5 ^ 2). 係数b(_標本数,Lx,Ly,_b) :- sigma(1,_標本数,S,(member(X,Lx),S is X * X),_合計_1), sigma(1,_標本数,S,member(S,Ly),_合計_2), sigma(1,_標本数,S,(nth1(_nth1,Lx,X),nth1(_nth1,Ly,Y),S is X * Y),_合計_3), sigma(1,_標本数,S,member(S,Lx),_合計_4), sigma(1,_標本数,S,(member(X,Lx),S is X * X),_合計_5), sigma(1,_標本数,S,member(S,Lx),_合計_6), _b is (_合計_1 * _合計_2 - _合計_3 * _合計_4) / ( _標本数 * _合計_5 - _合計_6 ^ 2). % 以下のサイトは fizzbuzz(_数,_FizzBuzz) :- '_FizzBuzzが変数でないときは、Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz), '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz). '_FizzBuzzが変数でないときは、Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '_FizzBuzzが変数でないときは、'(_FizzBuzz), 'Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz). '_FizzBuzzが変数でないときは、Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '_FizzBuzzが変数のときはこの条件検査の対象外である'(_FizzBuzz). '_FizzBuzzが変数でないときは、'(_FizzBuzz) :- \+(var(_FizzBuzz)). 'Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- 'Fizz,Buzz,FizzBuzzの何れか、'(_FizzBuzz). 'Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- 自然数でなくてはならない(_FizzBuzz). 'Fizz,Buzz,FizzBuzzの何れか、'(_FizzBuzz) :- member(_FizzBuzz,['Fizz','Buzz','FizzBuzz']). 自然数でなくてはならない(_FizzBuzz) :- integer(_FizzBuzz), _FizzBuzz > 0. '_FizzBuzzが変数のときはこの条件検査の対象外である'(_FizzBuzz) :- var(_FizzBuzz). '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数を生成し'(_数), ('_FizzBuzzが整数のときは_数 > _FizzBuzzの場合打ち切る'(_数,_FizzBuzz),!,fail; '_FizzBuzzを得る'(_数,_FizzBuzz)). '_数を生成し'(_数) :- nth1(_数,_,_). '_FizzBuzzが整数のときは_数 > _FizzBuzzの場合打ち切る'(_数,_FizzBuzz) :- integer(_FizzBuzz), _数 > _FizzBuzz. '_FizzBuzzを得る'(_数,'Fizz') :- '_数は3で割り切れて、5では割り切れない'(_数). '_FizzBuzzを得る'(_数,'Buzz') :- '_数は5で割り切れて、3では割り切れない'(_数). '_FizzBuzzを得る'(_数,'FizzBuzz') :- '_数は3でも5でも割り切れる'(_数). '_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数が3でも5でも割り切れないときは_FizzBuzzには_数を返す'(_数,_FizzBuzz). '_数は3で割り切れて、5では割り切れない'(_数) :- '_数は3で割り切れて、'(_数), '5では割り切れない'(_数). '_数は3で割り切れて、'(_数) :- 0 is _数 mod 3. '5では割り切れない'(_数) :- \+(0 is _数 mod 5). '_数は5で割り切れて、3では割り切れない'(_数) :- '_数は5で割り切れて、'(_数), '3では割り切れない'(_数). '_数は5で割り切れて、'(_数) :- 0 is _数 mod 5. '3では割り切れない'(_数) :- \+(0 is _数 mod 3). '_数は3でも5でも割り切れる'(_数) :- 0 is _数 mod 3, 0 is _数 mod 5. '_数が3でも5でも割り切れないときは_FizzBuzzには_数を返す'(_数,_数) :- '_数が3でも割り切れない'(_数), '_数が5でも割り切れない'(_数). '_数が3でも割り切れない'(_数) :- \+(0 is _数 mod 3). '_数が5でも割り切れない'(_数) :- \+(0 is _数 mod 5). % 以下のサイトは fizzbuzz(_数,_FizzBuzz) :- '_FizzBuzzが変数でないときは、"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz), '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz). '_FizzBuzzが変数でないときは、"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '_FizzBuzzが変数でないときは、'(_FizzBuzz), '"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz). '_FizzBuzzが変数でないときは、"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '_FizzBuzzが変数のときはこの条件検査の対象外である'(_FizzBuzz). '_FizzBuzzが変数でないときは、'(_FizzBuzz) :- \+(var(_FizzBuzz)). '"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '"Fizz","Buzz","FizzBuzz"の何れか、'(_FizzBuzz). '"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- 自然数でなくてはならない(_FizzBuzz). '"Fizz","Buzz","FizzBuzz"の何れか、'(_FizzBuzz) :- member(_FizzBuzz,["Fizz","Buzz","FizzBuzz"]). 自然数でなくてはならない(_FizzBuzz) :- integer(_FizzBuzz), _FizzBuzz > 0. '_FizzBuzzが変数のときはこの条件検査の対象外である'(_FizzBuzz) :- var(_FizzBuzz). '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数を生成し'(_数,_FizzBuzz), '_FizzBuzzを得る'(_数,_FizzBuzz). '_数を生成し'(_数,_FizzBuzz) :- nth1(_数,_,_). '_FizzBuzzを得る'(_数,"Fizz") :- '_数は3で割り切れて、5では割り切れない'(_数). '_FizzBuzzを得る'(_数,"Buzz") :- '_数は5で割り切れて、3では割り切れない'(_数). '_FizzBuzzを得る'(_数,"FizzBuzz") :- '_数は3でも5でも割り切れる'(_数). '_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数が3でも5でも割り切れないときは_FizzBuzzには_数を返す'(_数,_FizzBuzz). '_数は3で割り切れて、5では割り切れない'(_数) :- '_数は3で割り切れて、'(_数), '5では割り切れない'(_数). '_数は3で割り切れて、'(_数) :- 0 is _数 mod 3. '5では割り切れない'(_数) :- \+(0 is _数 mod 5). '_数は5で割り切れて、3では割り切れない'(_数) :- '_数は5で割り切れて、'(_数), '3では割り切れない'(_数). '_数は5で割り切れて、'(_数) :- 0 is _数 mod 5. '3では割り切れない'(_数) :- \+(0 is _数 mod 3). '_数は3でも5でも割り切れる'(_数) :- 0 is _数 mod 3, 0 is _数 mod 5. '_数が3でも5でも割り切れないときは_FizzBuzzには_数を返す'(_数,_数) :- '_数が3でも割り切れない'(_数), '_数が5でも割り切れない'(_数). '_数が3でも割り切れない'(_数) :- \+(0 is _数 mod 3). '_数が5でも割り切れない'(_数) :- \+(0 is _数 mod 5). % 以下のサイトは fizzbuzz(_数,_FizzBuzz) :- '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz). '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数を生成し'(_数,_FizzBuzz), '_FizzBuzzを得る'(_数,_FizzBuzz). '_数を生成し'(_数,_FizzBuzz) :- nth1(_数,_,_). '_FizzBuzzを得る'(_数,"Fizz") :- '_数は3で割り切れて、5では割り切れない'(_数). '_FizzBuzzを得る'(_数,"Buzz") :- '_数は5で割り切れて、3では割り切れない'(_数). '_FizzBuzzを得る'(_数,"FizzBuzz") :- '_数は3でも5でも割り切れる'(_数). '_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数が3で5でも割り切れないときは_数を返す'(_数,_FizzBuzz). '_数は3で割り切れて、5では割り切れない'(_数) :- 0 is _数 mod 3, \+(0 is _数 mod 5). '_数は5で割り切れて、3では割り切れない'(_数) :- 0 is _数 mod 5, \+(0 is _数 mod 3). '_数は3でも5でも割り切れる'(_数) :- 0 is _数 mod 3, 0 is _数 mod 5. '_数が3で5でも割り切れないときは_数を返す'(_数,_数) :- \+(0 is _数 mod 3), \+(0 is _数 mod 5). % 以下のサイトは # assertz/retractや大域変数を使わない自作findall。 # 現在目標はユーザ定義述語の単項のみ。 # 連言、選言、組込述語は不可。連言、選言、決定性の組込述語は # これから手を入れれば解決できるが、非決定性の組込述語は永久に無理。 % % このコード間違っていました。n番目のclause選択にfailすることが % あり得て、その場合このコードだと、即終了してしまいます。 項の収集(_収集項,_副目標,_収集項ならび) :- 副目標の実行結果を収集する(_副目標,_収集項,_収集項ならび). 副目標の実行結果を収集する(_頭部,_収集項,_収集項ならび) :- predicate_property(_頭部,number_of_clauses(_節数)), 副目標の実行結果を収集する(1,_節数,_頭部,_収集項,_収集項ならび). 副目標の実行結果を収集する(_n番目,_節数,_,_,[]) :- _n番目 > _節数,!. 副目標の実行結果を収集する(_n番目,_節数,_頭部,_収集項,[_収集項_n|R]) :- succ(_n番目,_次の), 副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,R). 副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,R) :- '頭部、収集項を保存した上で、n番目のclauseを実行する'(_n番目,_頭部,_収集項,_収集項_n),!, 副目標の実行結果を収集する(_次の,_節数,_頭部,_収集項,R). 副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,R) :- 副目標の実行結果を収集する(_次の,_節数,_頭部,_収集項,R). '頭部、収集項を保存した上で、n番目のclauseを実行する'(_n番目,_頭部,_収集項,_収集項_n) :- copy_term((_頭部,_収集項),(_頭部_n,_収集項_n)), n番目のclauseの実行(_n番目,_頭部_n). n番目のclauseの実行(_n番目,_頭部_n) :- n番目のclauseを得る(_n番目,_頭部_n,_本体_n), call(_本体_n). n番目のclauseを得る(_n番目,_頭部,_本体) :- nth_clause(_頭部,_n番目,Reference), clause(_頭部,_本体,Reference). % 以下のサイトは # assertz/retractや大域変数を使わず、単位節の引数情報をリストに収集する。 # 単位節情報の収集(_収集項,_副目標,_収集項ならび) :- 単位節副目標の実行結果を収集する(_副目標,_収集項,_収集項ならび). 単位節副目標の実行結果を収集する(_頭部,_収集項,_収集項ならび) :- predicate_property(_頭部,number_of_clauses(_節数)), 単位節副目標の実行結果を収集する(1,_節数,_頭部,_収集項,_収集項ならび). 単位節副目標の実行結果を収集する(_n番目,_節数,_,_,[]) :- _n番目 > _節数,!. 単位節副目標の実行結果を収集する(_n番目,_節数,_頭部,_収集項,L) :- succ(_n番目,_次の), 単位節副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,L). 単位節副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,[_収集項_n|R]) :- '頭部、収集項を保存した上で、n番目の単位節clauseを実行する'(_n番目,_頭部,_収集項,_収集項_n),!, 単位節副目標の実行結果を収集する(_次の,_節数,_頭部,_収集項,R). 単位節副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,R) :- 単位節副目標の実行結果を収集する(_次の,_節数,_頭部,_収集項,R). '頭部、収集項を保存した上で、n番目の単位節clauseを実行する'(_n番目,_頭部,_収集項,_収集項_n) :- copy_term((_頭部,_収集項),(_頭部_n,_収集項_n)), n番目の単位節clauseを得る(_n番目,_頭部_n). n番目の単位節clauseを得る(_n番目,_頭部_n) :- nth_clause(_頭部_n,_n番目,Reference), clause(_頭部_n,true,Reference). % 以下のサイトは # assertz/retractや大域変数を使わない自作findall。 # 現在目標はユーザ定義述語の単項のみ。 # 連言、選言、組込述語は不可。連言、選言、決定性の組込述語は # これから手を入れれば解決できるが、非決定性の組込述語は永久に無理。 % % このコード間違っていました。n番目のclause選択にfailすることが % あり得て、その場合このコードだと、即終了してしまいます。 単位節の収集(_収集項,_副目標,_収集項ならび) :- 副目標の実行結果を収集する(_副目標,_収集項,_収集項ならび). 副目標の実行結果を収集する(_頭部,_収集項,_収集項ならび) :- 副目標の実行結果を収集する(1,_頭部,_収集項,_収集項ならび). 副目標の実行結果を収集する(_n番目,_頭部,_収集項,[_収集項_n|R]) :- 副目標の実行結果を再帰的に収集する(_n番目,_頭部,_収集項,_収集項_n,R). 副目標の実行結果を収集する(_,_,_,[]). 副目標の実行結果を再帰的に収集する(_n番目,_頭部,_収集項,_収集項_n,R) :- '頭部、収集項を保存した上で、n番目のclauseを実行する'(_n番面,_頭部,_収集項,_収集項_n), succ(_n番目,_次の), 副目標の実行結果を収集する(_次の,_頭部,_収集項,R). '頭部、収集項を保存した上で、n番目のclauseを実行する'(_n番目,_頭部,_収集項,_収集項_n) :- copy_term((_頭部,_収集項),(_頭部_n,_収集項_n)), n番目のclauseの実行(_n番目,_頭部_n). n番目のclauseの実行(_n番目,_頭部_n) :- n番目のclauseを得る(_n番目,_頭部_n,_本体_n), call(_本体_n). n番目のclauseを得る(_n番目,_頭部,_本体) :- nth_clause(_頭部,_n番目,Reference), clause(_頭部,_本体,Reference). % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # 横書文書を縦書文書に変形する(_横書文書,_縦書文書) :- 横書文書を縦書文書に変形する(_横書文書,0,_縦書文書). 横書文書を縦書文書に変形する(_横書文書,_列間隔文字数,_縦書文書) :- 改行を区切りに行ならびに変形する(_横書文書,_行ならび), 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書). 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書) :- 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび), 行ならびを転置する(_矩形ならび,_転置した矩形ならび), 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書). 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書) :- 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび), 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 改行を区切りに行ならびに変形する(_横書文書,[_前文字列|R]) :- 改行を区切りに(_横書文書,_前文字列,_後文字列), 改行を区切りに行ならびに変形する(_後文字列,R). 改行を区切りに行ならびに変形する(_文字列,R) :- 改行が存在しない場合停止する(_文字列,R). 改行が存在しない場合停止する('',[]) :- !. 改行が存在しない場合停止する(_文書,[_文書]). 改行を区切りに(_横書文書,_前文字列,_後文字列) :- sub_atom(_横書文書,S,1,R,'\n'), sub_atom(_横書文書,0,S,_,_前文字列), sub_atom(_横書文書,_,R,0,_後文字列),!. 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび) :- 最大文字列長を調べ(_行ならび,_最大文字列長), その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび). 最大文字列長を調べ(_行ならび,_最大文字列長) :- findmax(_文字数,( member(_行,_行ならび), atom_length(_行,_文字数)),_最大文字列長). その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび) :- findall(_空白を付加した文字列,( member(_行,_行ならび), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列)),_矩形ならび). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列) :- atom_length(_行,_文字列長), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列) :- 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列), atom_concat(_行,_空白文字列,_空白を付加した文字列). 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列) :- _nth1 is _最大文字列長 - _文字列長, findall(' ',( between(1,_nth1,_)),_空白文字ならび), 文字ならびを文字列に変換する(_空白文字列,_空白文字ならび). 行ならびを転置する(_矩形ならび,_転置された矩形ならび) :- 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび), 転置(_矩形文字ならび,_転置された矩形文字ならび), 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび). 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび) :- findall(_文字ならび,( member(_行,_矩形ならび), 文字列を文字ならびに変換する(_行,_文字ならび)),_矩形文字ならび). 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび) :- findall(_文字列,( member(_文字ならび,_転置された矩形文字ならび), 文字ならびを文字列に変換する(_文字列,_文字ならび)),_転置された矩形ならび). 転置した矩形ならびの各行文字列を反転する(_転置した矩形ならび,_反転した行文字列) :- member(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列). 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび) :- findall(_反転した行文字列,( member(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列)),_要素が反転した転置した矩形ならび). 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 列間隔文字を挟んで縦書文書に変形する(_矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで(_矩形ならび,_列間隔文字数,_矩形ならび_1), 縦書文書に変形する(_矩形ならび_1,_縦書文書). 列間隔文字を挟んで(_矩形ならび_1,_列間隔文字数,_矩形ならび_2) :- 列間隔文字(_列間隔文字数,_列間隔文字), findall(_行,( 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行)),_矩形ならび_2). 列間隔文字(_列間隔文字数,_列間隔文字) :- findall(' ',( between(1,_列間隔文字数,_)),_列間隔文字ならび), atomic_list_concat(_列間隔文字ならび,_列間隔文字). 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行) :- member(_行_1,_矩形ならび_1), 文字列を文字ならびに変換する(_行_1,_文字ならび), atomic_list_concat(_文字ならび,_列間隔文字,_行). 縦書文書に変形する(_矩形ならび_1,_縦書文書) :- atomic_list_concat(_矩形ならび_1,'\n',_縦書文書). 文字列の反転(_文字列,_反転した文字列) :- 文字列を文字ならびに変換する(_文字列,_文字ならび), 文字ならびを反転する(_文字ならび,_反転した文字ならび), 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を文字ならびに変換する(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 文字ならびを反転する(_文字ならび,_反転した文字ならび) :- reverse(_文字ならび,_反転した文字ならび). 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび) :- atom_chars(_反転した文字列,_反転した文字ならび). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). findmax(A,P,_最大値) :- findall(A,P,L), max_list(L,_最大値). % 以下のサイトは ペア数の実装(0,0). ペア数の実装(X,Y) :- nth1(N,_,_), 'Nを1から増加しながら0-Nの内2要素を取り2項の合計がNであるような重複順列を生成'(N,X,Y). 'Nを1から増加しながら0-Nの内2要素を取り2項の合計がNであるような重複順列を生成'(N,X,Y) :- findall(M,between(0,N,M),L), 重複順列(L,2,[X,Y]), N is X + Y. 重複順列(L,0,[]). 重複順列(L,N,[A|R3]) :- N > 0, member(A,L), N_1 is N - 1, 重複順列(L,N_1,R3). % 以下のサイトは ペア数の実装(0,0). ペア数の実装(X,Y) :- nth1(N,_,_), findall(M,between(0,N,M),L), 重複順列(L,2,[X,Y]), N is X + Y. 重複順列(L,0,[]). 重複順列(L,N,[A|R3]) :- N > 0, member(A,L), N_1 is N - 1, 重複順列(L,N_1,R3). % 以下のサイトは ペア数の実装(0,0). ペア数の実装(X,Y) :- nth1(N,_,_), findall(M,between(0,N,M),L), 重複順列(L,2,[X,Y]), N is X + Y. 重複順列(L,0,[]). 重複順列(L,N,[A|R3]) :- N > 0, member(A,L), N_1 is N - 1, 重複順列(L,N_1,R3). %%%%%%%%%%%%%%%%%%%% ?- ペア数の実装(X,Y). X = Y, Y = 0 ; X = 0, Y = 1 ; X = 1, Y = 0 ; X = 0, Y = 2 ; X = Y, Y = 1 ; X = 2, Y = 0 ; X = 0, Y = 3 ; X = 1, Y = 2 ; X = 2, Y = 1 ; X = 3, Y = 0 ; X = 0, Y = 4 ; X = 1, Y = 3 ; X = Y, Y = 2 ; X = 3, Y = 1 ; X = 4, Y = 0 ; X = 0, Y = 5, ・・・ % 以下のサイトは % [1] 授業単元:C言語演習課題 % http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9422.txt % 問題 % 年と月を「YYYY/MM」と入力し、入力された月のカレンダーを表示しなさい。 % % 1752年10月以前、及び10000年1月以降はエラーを返す。 % % 出力形式は以下のとおり % ・1行目は該当月の1日が月曜日でなければ、前月の最終月曜日から表示。 % ・該当月の最終日が日曜日でなければ、翌月の第1日曜日まで表示。 % ・6行目の表示が必要ない場合は表示しない。 % % うるう年判定は以下のとおり % ・年が4で割り切れる年はうるう年。 % ・年が100で割り切れる年はうるう年でない。 % ・年が400で割り切れる年はうるう年である。 % % [出力例] % 年月日を入力:2009/07 % % 月 火 水 木 金 土 日 % 29 30 01 02 03 04 05 % 06 07 08 09 10 11 12 % 13 14 15 16 17 18 19 % 20 21 22 23 24 25 26 % 27 28 29 30 31 01 02 課題のカレンダー(_年/_月) :- not((_年/_月 >= 1752/10,_年/_月 =< 10000/1)), write('エラー: 入力された年月は範囲を逸脱しています\n'),!. 課題のカレンダー(_年/_月) :- _年/_月 @=< 2009/6,!, 曜日検索(_日付,_曜日,2009/6/13,土曜), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー(_年/_月) :- _年/_月 @>= 2009/6,!, 曜日検索(2009/6/13,土曜,_日付,_曜日), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー表示(_年/_月/_日,月曜) :- 日付候補を得る(_年/_月/_日,_年/_月/_日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 課題のカレンダー表示(_年/_月/_日,_曜日) :- not(_曜日=月曜), 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日), 日付候補を得る(_年/_月/_日,_前週の月曜日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日) :- 曜日検索(_前週の月曜日,_前週の曜日,_年/_月/_日,_曜日), _前週の曜日 = 月曜,!. 日付候補を得る(_年/_月/_日,_起点日付,_曜日,_日付整数ならび) :- findall(_日付,( 曜日(_起点日付,_曜日,_日付2,_),(_日付2=_年2/_月2/7,_年2/_月2 @> _年/_月,!,fail;true)),_日付整数ならび). 課題のカレンダー週表示(_日付整数ならび) :- n個組(7,_日付整数ならび,_7個組), 月曜から日曜までヘッドゼロサプライで表示(_7個組). 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t\n',[_日文字列]),!. 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日|R]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t ',[_日付文字列]), 月曜から日曜までヘッドゼロサプライで表示(R). 課題のカレンダー見出し表示 :- write_formatted('月 火 水 木 金 土 日\n'). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_日付,_曜日,_今日,_今日の曜日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_前日,_前日の曜日,_今日,_今日の曜日), 曜日検索(_日付,_曜日,_前日,_前日の曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_日付,_曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_翌日,_翌日の曜日), 曜日検索(_翌日,_翌日の曜日,_日付,_曜日). '曜日'(_日付,_曜日,_日付,_曜日) :- ! . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @> _日付2, '前日・今日'(_日付3,_曜日3,_日付1,_曜日1), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @< _日付2, '前日・今日'(_日付1,_曜日1,_日付3,_曜日3), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . 前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :- not(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/550 # # [1] 授業単元: Ruby演習 [2] 問題文、http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9426.txt # Rubyの問題がわかりません 助けてください # # (1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい # # p wday["sunday"] #=> "日曜日" # p wday["monday"] #=> "月曜日" # p wday["saturday"] #=> "土曜日" # # (2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい # # (3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてくださ い。 # 「sunday」は日曜日のことです。 # 「monday」は月曜日のことです。 # # (4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行(正 規表現で定義するなら「/\uff3cs+/」)で区切られた文字列をハッシュに変換するメソ ッドstr2hashを定義してください。 # # p str2hash("bule 青 white 白\uff3cnred赤"); # #=> {"bule"=>"青", "white"=>"白", "red"=>"赤"} :- op(450,xfx,(=>)). % (1) wday({ "sunday" => "日曜日","monday" => "月曜日","saturday" #=> "土曜日"}). % (2) hash_count(Hashname,Count) :- functor(P,Hashname,1), call(P), arg(1,P,H), count(H,Count). count(','(A,B),Count) :- count(B,Count2), Count is Count2 + 1. count(A,1). % (3) ?- each(wday.A=>B),write_formatted('「%t」は%tのことです。\n',[A,B]),fail;true. each(Hashname.Key=>Value) :- functor(P,Hashname,1), arg(1,P,V), each(V,Key=>Value). each(','(Key=>Value,B),Key=>Value). each(','(_,B),Key=>Value) :- each(B,Key=>Value). each(Key=>Value,Key=>Value). % (4) str2hash(Atom,Hash) :- split(Atom,[' ','\t','\n'],L), findall(U,n個組(2,L,U),L2), hashを成長させる(L2,Hash). hashを成長させる([A,B],{ A=>B }) :- !. hashを成長させる([[A,B]|R], { (A=>B,R2) }) :- hashを成長させる(R,{ R2 }). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/103 # # 【質問テンプレ】 # [1] 授業単元: C言語演習 # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9753.txt # 2.入力された年月の1日が何曜日かを調べる。 #   曜日のチェックはZellerの公式を使用する。Zellerの公式は、 #    #   曜日を表す値=(y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ (( 13 * m ) + 8 ) / 5 ] + d ) % 7 # #           ※ 上記の公式中の y は年、 m は月、 d は日を表し、 #             []はその数を越えない最大の整数を表す。(例: [13.6]は13になる) # #   で、曜日を表す値は次のようになっている。 # #     日曜日 = 0, 月曜日 = 1, 火曜日 = 2, 水曜日 = 3, # # 木曜日 = 4, 金曜日 = 5, 土曜日 = 6, # #   ※但し、1月と2月は前年の13月14月として計算するものとする。 % (1) 年月の入力 年月入力処理(_年,_月) :- 年入力処理(_年), 月入力処理(_月). % (2) 曜日計算 :- op(450,xfx,が),op(500,xfx,であり),op(600,xfx,ならば),op(450,xfx,は). 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は (Y + Y // 4 - Y // 100 + Y // 400 + ((( 13 * M ) + 8 ) // 5 ) + D ) mod 7). 曜日計算処理(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値), 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値を得る'(_年,1,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,13,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,2,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,14,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値) :- _年=Y,_月=M,_日=D, 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は _Zellerの公式), _曜日を表す値 is _Zellerの公式,!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % (3) カレンダー表示 カレンダー表示 :- 年月入力処理(_年,_月), 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,1,_曜日を表す整数値), カレンダー表示データ編集(_年,_月,_曜日を表す整数値,_カレンダー表示文字列ならび), 要素に空白を挿入して全行表示(_カレンダー表示文字列ならび). カレンダー表示データ編集(_年,_月,_各月1日の曜日を表す整数値,_カレンダー表示文字列ならび) :- 年月文字列編集処理(_年,_月,_年月文字列), 月日数(_年,_月,_月日数), findall(S,for(1,N,_月日数),ヘッドゼロサプレス(2,N,S)),_表示日ならび), Length is _月日数 + _各月1日の曜日を表す整数値, M is (7 - (Length mod 7)), '7個組ならび'(Length,M,_表示日ならび,_7個組ならび), 見出しならび(_年月文字列,_見出しならび), append(_見出しならび,_7個組ならび,_カレンダー表示文字列ならび). 見出しならび(_年月文字列,[[_年月文字列],[日,月,火,水,木,金,土]]). '7個組ならび'(Length,0,_表示日ならび,_7個組ならび) :- length(L0,Length), すべての要素が(L0,' '), append(L0,_表示日ならび,L), '7個組'(L,_7個組ならび),!. '7個組ならび'(Length,M,_表示日ならび,_7個組ならび) :- not(M=0), length(L0,Length), すべての要素が(L0,' '), length(L2,M), すべての要素が(L2,' '), append(L0,_表示日ならび,L2,L), '7個組'(L,_7個組ならび),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,28) :- not(うるう年(_年)),!. 月日数(_,_月,30) :- member(_月,[4,6,9,11]). 月日数(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). % (4) 基礎述語の定義 年入力処理(_年) :- write('表示したいカレンダーは西暦何年 ? '), get_line(_行), 年入力処理の二(_行,_年), 年入力検査(_年),!. 年入力処理(_年) :- 年入力処理(_年). 年入力処理の二(_行,_年) :- atom_to_term(_行,_年), integer(_年),!. 年入力処理の二(_行,_年) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 年入力検査(_年) :- _年 >= 1583, _年 =< 3999,!. 年入力検査(_年) :- write_formatted('この年を表す整数%tは不正です\n',[_年]), fail. 月入力処理(_月) :- write('月は ? '), get_line(_行), 月入力処理の二(_行,_月), 月入力検査(_月),!. 月入力処理(_月) :- 月入力処理(_月). 月入力処理の二(_行,_月) :- atom_to_term(_行,_月,_), integer(_月),!. 月入力処理の二(_行,_月) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 月入力検査(_月) :- _月 >= 1, _月 =< 12,!. 月入力検査(_月) :- write_formatted('この月を表す整数%tは不正です\n',[_月]), fail. 日付文字列編集処理(_年,_月,_日,_日付文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), ヘッドゼロサプライ(2,_日,_日文字列), concat_atom([_年文字列,_月文字列,_日文字列],_日付文字列). 年月文字列編集処理(_年,_月,_年月文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), concat_atom([_年文字列,_月文字列],_年月文字列). ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). ヘッドゼロサプレス(N桁,_整数,_ヘッド空白整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプレス_1(N桁,_数字ならび,_ヘッド空白整数文字ならび), concat_atom(_ヘッド空白整数文字ならび,_ヘッド空白整数文字列),!. ヘッドゼロサプレス_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプレス_1(N桁,L,[' '|R]) :- M桁 is N桁 - 1, ヘッドゼロサプレス_1(M桁,L,R). 要素に空白を挿入して全行表示([]) :- !. 要素に空白を挿入して全行表示([L|R]) :- concat_atom(L,' ',_表示行), write_formatted('%t\n',[_表示行]), 要素に空白を挿入して全行表示(R). すべての要素が([],_). すべての要素が([V|R],V) :- すべての要素が(R,V). '7個組'([],[]) :- !. '7個組'([A,B,C,D,E,F,G|R1]),[[A,B,C,D,E,F,G]|R2]) :- '7個組'(R1,R2). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. not(P) :- \+(P). append([],L1,L2,L) :- append(L1,L2,L) . append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R) . concat_atom([],'') :- !. concat_atom([A],A) :- !. concat_atom([A|R],S) :- concat_atom(R,S1), atom_concat(A,S1,S). concat_atom([],_,'') :- !. concat_atom([A],_,A) :- !. concat_atom([A|R],_区切り文字列,S) :- concat_atom(R,_区切り文字列,S1), atom_concat(A,_区切り文字列,S2), atom_concat(S2,S1,S). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/157 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9762.txt # # 正数による正方行列のうち、全ての行、列、斜め列の合計が同じであり、 # かつ2回以上使用される数字が存在しないものを魔方陣という。 # 下図に示すa,bに数値を設定したときに、1〜9の整数によって構成される魔方陣を # 出力するプログラムを作成せよ。 # 但し、魔方陣が作成不可能な(a,b)の組み合わせが設定された場合は、「Impossible」 # と出力するとする。 # # la_lb_l__l # l__l__l__l # l__l__l__l # 魔方陣(N枡,A,B,_行列) :- 魔方陣のための行列の生成(N枡,_行列), _行列 = [[A,B|_],_,_], 行の合計が全て一致する(_行列,S), 列の合計が全て一致する(_行列,S), 正方行列の斜め要素の合計が一致する(_行列,S). 魔方陣のための行列の生成(N枡,_行列) :- N2 is N枡 ^ 2, findall(M,for(1,M,N2),NL),!, 順列(NL,N2,_順列数字ならび), findall(_N個組,n個組(N枡,_順列数字ならび,_N個組),_行列). 行の合計が全て一致する([],S) :- !. 行の合計が全て一致する([_行|R],S) :- 魔方陣の加算(_行,0,S), 行の合計が全て一致する(R,S). 列の合計が全て一致する(_行列,S) :- 行列の転置(_行列,_転置行列), 列の合計が全て一致する(_転置行列,S),!. 正方行列の斜め要素の合計が一致する(_正方行列,S) :- length(_行列,Len), 左上から右下方向の合計(1,Len,_正方行列,0,S), 右上から左下方向の合計(1,Len,_正方行列,0,S),!. 左上から右下方向の合計(M,N,_,S,S) :- M > N,!. 左上から右下方向の合計(M,N,_行列,S1,S) :- list_nth(M,_行列,_行), list_nth(M,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 左上から右下方向の合計(M2,N,_行列,S2,S),!. 右上から左下方向の合計(M,N,_,S,S) :- M > N,!. 右上から左下方向の合計(M,N,_行列,S1,S) :- M1 is N - M + 1, list_nth(M1,_行列,_行), list_nth(M1,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 右上から左下方向の合計(M2,N,_行列,S2,S),!. n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. 魔方陣の加算([],X,X) :- !. 魔方陣の加算([A|R],Y,X) :- Z is A + Y, 魔方陣の加算(R,Z,X). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/566 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 番号と点数を配列に初期化して、それらを # 5段階にランク付けをして、受験番号・ランクを表示するプログラムを作成。 # ランク付けをする部分を関数Rankとして、番号と評価を表示する部分を関数Outputとすること。 # なお、ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 # 60〜79点をB、80〜100点をAとする。 # ただし、受験者の数は、50人以下とする。 # 番号と点数は、以下の配列を使用すること。 # 番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10}; # 点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100}; # '問題文の5段階にランク付け'('ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 60〜79点をB、80〜100点をAとする。 '). 番号の定義文('番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10};'). 点数の定義文('点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100};'). 'ランクならびの生成'(_ランクならび) :- '問題文の5段階にランク付け'(_ランク定義文), ランクの定義文解析(_ランク定義文,_ランクならび). 番号ならびの生成(_番号ならび) :- 番号の定義文(_番号の定義文), 番号の定義文解析(_番号の定義文,_番号ならび). 点数ならびの生成(_点数ならび) :- 点数の定義文(_点数の定義文), 点数の定義文解析(_点数の定義文,_点数ならび). '5段階にランク付けをして、受験番号・ランクを表示する' :- ランクならびの生成(_ランクならび), 番号ならびの生成(_番号ならび), 点数ならびの生成(_点数ならび), '5段階にランク付けをして、受験番号・ランクを表示する'(_番号ならび,_点数ならび,_ランクならび). '5段階にランク付けをして、受験番号・ランクを表示する'([],[],_). '5段階にランク付けをして、受験番号・ランクを表示する'([_番号|R1],[_点数|R2],_ランクならび) :- append(_,[[_点数下限,_点数上限,_ランク]|_],_ランクならび), _点数 >= _点数下限, _点数 =< _点数上限, writef('受験番号:%t ランク:%t\n',[_番号,_ランク]), '5段階にランク付けをして、受験番号・ランクを表示する'(R1,R2,_ランクならび). ランクの定義文解析(_ランク定義文,_ランクならび) :- 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文), split(_半角数字変換されたランク定義文,[' ','。','、','〜','点を','とする'],L), n個組(3,L,_ランクならび). 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文) :- atom_chars(_ランク定義文,Chars), findall(_文字_1, append(_,[_文字|_],Chars), 全角数字ならば半角数字に変換(_文字,_文字_1)), Chars2), atom_chars(_半角数字変換されたランク定義文,Chars2). 全角数字ならば半角数字に変換([_全角数字|R1],[_半角数字|R2]) :- 全角数字半角数字変換(_全角数字,_半角数字), 全角数字ならば半角数字に変換(R1,R2). 全角数字ならば半角数字に変換([_文字|R1],[_文字|R2]) :- \+(全角数字半角数字変換(_文字,_)), 全角数字ならば半角数字に変換(R1,R2). 全角数字半角数字変換(0,0). 全角数字半角数字変換(1,1). 全角数字半角数字変換(2,2). 全角数字半角数字変換(3,3). 全角数字半角数字変換(4,4). 全角数字半角数字変換(5,5). 全角数字半角数字変換(6,6). 全角数字半角数字変換(7,7). 全角数字半角数字変換(8,8). 全角数字半角数字変換(9,9). 番号の定義文解析(_番号の定義文,_番号ならび) :- split(_番号の定義文,['=',',',';'],[_|_番号ならび]). 点数の定義文解析(_点数の定義文,_点数ならび) :- split(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1295436346/173 # # 質問させてください # selectしたデータを一部だけ別のテーブルに入れる方法ってありますか? # # 例:insert into table2 (aaa,bbb,ccc) select aaa as aaa,bbb as bbb,ccc as ccc from table1 # この場合table1のデータがすべてtable2に入るのでaaaだけ別のデータを入れたいと思っています。 # よろしくお願いします。 # # 海に接していない都道府県名([栃木県,群馬県,埼玉県,山梨県,長野県,岐阜県,滋賀県,奈良県]). table1(奈良県,1000,aa). table1(埼玉県,2000,ab). selectしたデータを一部だけ別のテーブルに入れる方法 :- 海に接していない都道府県名(_海に接していない都道府県名ならび), table1(_都道府県名の一,_bbb,_ccc), 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二), assertz(table2(_都道府県名の二,_bbb,_ccc)), fail. selectしたデータを一部だけ別のテーブルに入れる方法. 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二) :- M is (random mod 8) + 1, list_nth(M,_海に接していない道府県名ならび,_都道府県名の二), \+(_都道府県名の一 = _都道府県名の二), \+(table2(_都道府県名の二,_,_)). 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二) :- 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二). ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/584 # # MySQL 5.5.19 . 長くなりますので # テーブルの定義・内容と欲しい結果はここに # http://ime.nu/codepad.org/oe1jhVrF # # で、 # # create table a_tbl( # code int(9) not null, # input_date date not null, # data1 double(9,2) unsigned default 0 not null, # data2 double(9,2) unsigned default 0 not null, # primary key(code,input_date) # ) ; # # insert into a_tbl # values # (1111,'2012-02-01',10,12), # (1111,'2012-02-02',133,14), # (1111,'2012-02-04',13,15), # (1111,'2012-02-06',13,10); # # create table b_tbl( # code varchar(10) not null, # input_date date not null, # data1 double(9,2) unsigned default 0 not null, # data2 double(9,2) unsigned default 0 not null, # primary key(code,input_date) # ) ; # # insert into b_tbl # values # ('ddd','2012-02-01',122,13), # ('ddd','2012-02-03',127,18), # ('ddd','2012-02-04',11,14), # ('ddd','2012-02-05',16,95), # ('ddd','2012-02-06',13,10); # # 欲しい結果 # input_date a.data1 a.data2 b.data2 # 2012-02-01 10 12 13 # 2012-02-02 133 14 null # 2012-02-03 null null 18 # 2012-02-04 13 15 14 # 2012-02-05 null null 95 # 2012-02-06 13 10 10 # # # select a.input_date,b.input_date,a.data1,a.data2,b.data2 # from a_tbl a # right join b_tbl b # on a.input_date = b.input_date; とすると、結果が # +------------+------------+-------+-------+-------+ # | input_date | input_date | data1 | data2 | data2 | # +------------+------------+-------+-------+-------+ # | 2012-02-01 | 2012-02-01 | 10 | 12 | 13 | # | NULL | 2012-02-03 | NULL | NULL | 18 | # | 2012-02-04 | 2012-02-04 | 13 | 15 | 14 | # | NULL | 2012-02-05 | NULL | NULL | 95 | # | 2012-02-06 | 2012-02-06 | 13 | 10 | 10 | # +------------+------------+-------+-------+-------+ # なんですが、実際にはいろんなコードが入っているので、コードも抽出条件に入れたら # select a.input_date,b.input_date,a.data1,a.data2,b.data2 # from a_tbl a # right join b_tbl b # on a.input_date = b.input_date # where # a.code=1111 and b.code='ddd'; # +------------+------------+-------+-------+-------+ # | input_date | input_date | data1 | data2 | data2 | # +------------+------------+-------+-------+-------+ # | 2012-02-01 | 2012-02-01 | 10 | 12 | 13 | # | 2012-02-04 | 2012-02-04 | 13 | 15 | 14 | # | 2012-02-06 | 2012-02-06 | 13 | 10 | 10 | # +------------+------------+-------+-------+-------+ # になってしまいました。 # コードを抽出条件に入れた状態で望ましい結果または上の方の結果になるようなSQLを教えて下さい。 # 'input_dateの集合を得る'(_input_dateの集合) :- findall(_input_date,a_tbl(_input_date,_,_),L1), findall(_input_date,b_tbl(_input_date,_,_),L2), append(L1,L2,L3), setof(_input_date,member(_input_date,L3),_input_dateの集合). 抽出(_input_date,_tbl_aのdata1ならび,_tbl_aのdata2ならび,_tbl_bのdata2ならび) :- 'input_dateの集合を得る'(_input_dateの集合), member(_input_date,_input_dateの集合), findall([_data1],tbl_a(_,_input_date,_data1,_),_tbl_aのdata1ならび), findall([_data2],tbl_a(_,_input_date,_,_data2),_tbl_aのdata2ならび), findall([_data2],tbl_b(_,_input_date,_,_data2),_tbl_bのdata2ならび). # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/633 # # MySQL 5.1です。 # # create table staff_list( # staff_id int(5) primary key //社員番号 # staff_name varchar(8) //社員名 # unit varchar(8) primary key //部署名 # ) # # insert into staff_list (staff_id,staff_name,unit) values # (1,'範馬','総務'), # (2,'愚地','総務'), # (3,'花山','総務'), # (1,'高津','企画'), # (2,'池谷','企画'), # (3,'長嶋','企画'), # (1,'鳩山','営業'), # (2,'野田','営業'), # (3,'小沢','営業'), # (4,'枝野','営業') # # # # このようなテーブルに対してSELECTをかける際、一度のクエリーで # 部署別にソートしたうえで、総務だけstaff_id降順で他を昇順で出したいと思っています。 # # order by unit,IF(staff_name='総務',staff_id desc,staff_id asc) # などと試行してみているのですがうまくできません。 # # どなたかうまい方法をご存じないでしょうか。 # # よろしくお願いいたします。 # スタッフリスト(1,範馬,総務). スタッフリスト(2,愚地,総務). スタッフリスト(3,花山,総務). スタッフリスト(1,高津,企画). スタッフリスト(2,池谷,企画). スタッフリスト(3,長嶋,企画). スタッフリスト(1,鳩山,営業). スタッフリスト(2,野田,営業). スタッフリスト(3,小沢,営業). スタッフリスト(4,枝野,営業). 'このようなテーブルを選択する際、一度部署別にソートしたうえで、総務だけ社員番号降順で出したいと思っています。'(_部署名,_社員番号,_社員名) :- 一度部署別にソートしたうえで(_部署名ならび), 総務だけ社員番号降順で出したい(_部署名ならび,_部署名,_社員番号,_社員名). 一度部署別にソートしたうえで(_部署名ならび) :- findsetof(_部署名,( スタッフリスト(_社員番号,_社員名,_部署名)), _部署名ならび). 総務だけ社員番号降順で出したい(_部署名ならび,_部署名,_社員番号,_社員名) :- member(_部署名,_部署名ならび), 総務だけ社員番号降順で出したい(_部署名,_社員番号,_社員名). 総務だけ社員番号降順で出したい(総務,_社員番号,_社員名) :- 総務だけ社員番号降順で(_社員番号,_社員名). 総務だけ社員番号降順で出したい(_部署名,_社員番号,_社員名) :- \+(_部署名 == 総務), スタッフリスト(_社員番号,_社員名,_部署名). 総務だけ社員番号降順で(_社員番号,_社員名) :- findall([_社員番号,_社員名],( スタッフリスト(_社員番号,_社員名,総務)), L1), 降順でソート(L1,L2), member([社員番号,_社員名],L2). 降順でソート(L1,L2) :- sort(L1,L3), reverse(L3,L2). % % findsetof/3 % # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/666 # # SQLite3を使っています。 # # カラムがなかったらinsert # あったらupdateしたいのですが、 # どういうSQLをかけばいいのでしょうか? # # insert into t1(c1, c2) values("hoge",10) # update t1 set c2=10 WHERE c1="hoge" # このときc1はuniqueです。 # # よろしくお願いします。 # # 'カラムがなかったらinsert あったらupdateしたい'(_テーブル,_カラムならび,_鍵カラム,_鍵値) :- findall(_カラム,( テーブル定義(_テーブル,_番目,_カラム)), L1), 鍵値をセットする(_テーブル,_鍵カラム,_鍵値,P), 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび). 鍵値をセットする(_テーブル,L1,_鍵カラム,_鍵値,P) :- length(L1,Len), length(L2,Len), nth1(Nth,L1,_鍵カラム), nth1(Nth,L2,_鍵値), P =.. [_テーブル|L2]. 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび) :- call(P),!, ( retract(P), Q =.. [_テーブル|_カラムならび], asserta(Q), fail; true). 'カラムがなかったらinsert あったらupdateしたい'(_,_テーブル,_カラムならび) :- Q =.. [_テーブル|_カラムならび], asserta(Q). # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/684 # # ・DBMS名とバージョン # Oracle 10g # ・テーブルデーた # create table aaa ( # id number(5,0) primary key, -- 主キー # nendo char(4), -- 年度 # tsuki char(2) -- 月 # ); # insert into aaa values (1, '2012', '01'); # insert into aaa values (2, '2012', '02'); # insert into aaa values (3, '2012', '03'); # insert into aaa values (4, '2012', '04'); # insert into aaa values (5, '2012', '05'); # ・欲しい結果 # id, nendo, tsuki # -------------------- # 4, '2012', '04' # 5, '2012', '05, # 1, '2012', '01' # 2, '2012', '02' # 3, '2012', '03' # # ・説明 # 年度/月の昇順に並べたいです。 # 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。 # '・テーブルデータ create table aaa ( id number(5,0) primary key, -- 主キー nendo char(4), -- 年度 tsuki char(2) -- 月 ); insert into aaa values (1, '2012', '01'); insert into aaa values (2, '2012', '02'); insert into aaa values (3, '2012', '03'); insert into aaa values (4, '2012', '04'); insert into aaa values (5, '2012', '05'); ・欲しい結果 id, nendo, tsuki -------------------- 4, '2012', '04' 5, '2012', '05, 1, '2012', '01' 2, '2012', '02' 3, '2012', '03' ・説明 年度/月の昇順に並べたいです。 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。'(_id,_年度,_月) :- 欲しい結果(_id,_年度,_月). 年度の場合の月順('04','05'). 年度の場合の月順('05','06'). 年度の場合の月順('06','07'). 年度の場合の月順('07','08'). 年度の場合の月順('08','09'). 年度の場合の月順('09','10'). 年度の場合の月順('10','11'). 年度の場合の月順('11','12'). 年度の場合の月順('12','01'). 年度の場合の月順('01','02'). 年度の場合の月順('02','03'). 年度の場合の月順('03','04'). 欲しい結果(_id,_年度,_月) :- findsetof(_年度,aaa(_,_年度,_),_年度ならび), member(_年度,_年度ならび), 年度順に並べる('04',_id,_年度,_月). 年度順に並べる(_月,_id,_年度,_月) :- aaa(_id,_年度,_月). 年度順に並べる(_月_1,_id,_年度,_月) :- \+(_月_1 = '03'), 年度の場合の月順(_月,_次の月), 年度順に並べる(_次の月,_id,_年度,_月). # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/684 # # ・DBMS名とバージョン # Oracle 10g # ・テーブルデーた # create table aaa ( # id number(5,0) primary key, -- 主キー # nendo char(4), -- 年度 # tsuki char(2) -- 月 # ); # insert into aaa values (1, '2012', '01'); # insert into aaa values (2, '2012', '02'); # insert into aaa values (3, '2012', '03'); # insert into aaa values (4, '2012', '04'); # insert into aaa values (5, '2012', '05'); # ・欲しい結果 # id, nendo, tsuki # -------------------- # 4, '2012', '04' # 5, '2012', '05, # 1, '2012', '01' # 2, '2012', '02' # 3, '2012', '03' # # ・説明 # 年度/月の昇順に並べたいです。 # 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。 # '・テーブルデータ create table aaa ( id number(5,0) primary key, -- 主キー nendo char(4), -- 年度 tsuki char(2) -- 月 ); insert into aaa values (1, '2012', '01'); insert into aaa values (2, '2012', '02'); insert into aaa values (3, '2012', '03'); insert into aaa values (4, '2012', '04'); insert into aaa values (5, '2012', '05'); ・欲しい結果 id, nendo, tsuki -------------------- 4, '2012', '04' 5, '2012', '05, 1, '2012', '01' 2, '2012', '02' 3, '2012', '03' ・説明 年度/月の昇順に並べたいです。 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。'(_id,_年度,_月) :- 欲しい結果(_id,_年度,_月). 欲しい結果(_id,_年度,_月) :- findsetof(_年度,aaa(_,_年度,_),_年度ならび), member(_年度,_年度ならび), 年度順に並べる(['04','05','06','07','08','09','10','11','12','01','02','03'],_id,_年度,_月). 年度順に並べる([_月|R],_id,_年度,_月) :- aaa(_id,_年度,_月). 年度順に並べる([_|R],_id,_年度,_月) :- 年度順に並べる(R,_id,_年度,_月). # 質問です。 # MySQL5です。 # テーブルデータはDATE(YYYYMMの6けたのint型),CODE(varchar型),VALUE(varchar型) の3カラムからなります。 # 各日付順の降順にしたいのですが、スレッドのように、同じコードの場合、その下に日付順でソートしたいです。 # 言っていることが、よくわからなくてすみません。 # # 元テーブル # DATE, CODE, VALUE # .... # 20140401, 11, A # 20140402, 12, B # 20140403, 11, C # 20140404, 13, D # 20140405, 12, E # 20140406, 11, F # .... # # 欲しい結果 # 20140401, 11, A # 20140403, 11, C # 20140406, 11, F # 20140402, 12, B # 20140405, 12, E # 20140404, 13, D # # 宜しくお願い致します。 # # # 879 名前:NAME IS NULL [sage]: 2014/04/25(金) 17:41:21.67 ID:??? # >>877 # どうも質問が明確じゃないけど、 # insert into tname select 〜 # の形式にすればとりあえず解決しそうな話に見える。 # # >>878 # order by code, date ということ? # # # 880 名前:NAME IS NULL []: 2014/04/25(金) 17:47:38.30 ID:+Fb19Efw (3) # 879 # 分かりずらい # 欲しい結果にしてしまいました。 # # 第1キーは、日付です。 # # 元テーブル # DATE, CODE, VALUE # 20140401, 13, A # 20140402, 11, B # 20140403, 12, C # 20140404, 13, D # 20140405, 12, E # 20140406, 11, F # # 欲しい結果 # 20140401, 13, A # 20140404, 13, D # 20140402, 11, B # 20140406, 11, F # 20140403, 12, C # 20140405, 12, E # # 宜しくお願い致します。 # # # 要するに第一キーは降順、第二キーは昇順で整列する。 # 'テーブルデータはDATE(YYYYMMの6けたのint型),CODE(varchar型),VALUE(varchar型) の3カラムからなります。各日付順の降順にしたいのですが、スレッドのように、同じコードの場合、その下に日付順でソートしたいです。'(_DATE,_CODE,_VALUE) :- '要するに第一キーは降順、第二キーは昇順で整列する。'(_DATE,_CODE,_VALUE). '要するに第一キーは降順、第二キーは昇順で整列する。'(_DATE,_CODE,_VALUE) :- 第一キー順序(_CODE), 第二キー順序(_CODE,_DATE), 元テーブル(_DATE,_CODE,_VALUE). 第一キー順序(_CODE) :- findsetof(_CODE,( 元テーブル(_DATE,_CODE,_VALUE)), L1), reverse(L1,L2), member(_CODE,L2). 第二キー順序(_CODE,_DATE) :- findsetof(_DATE,( 元テーブル(_DATE,_CODE,_VALUE)), L1), member(_DATE,L1). % 以下のサイトは % % SWI-Prolog のコマンド引数の内、ユーザパラメータ部分をリストに得る。 % user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/348 # # [1] C言語演習 # # [2] argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 # 但し、第一引数だけは別の配列(ary)に格納はしないこと。 # 例)argv:./test a b c d e f # 例)ary :./test b c d e f # # [3.1] redhat # [3.3] C言語 # [4] 本日中 # [5] 制限:なし # わかる方どうかよろしくお願いします。 # # 'argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 但し、第一引数だけは別の配列(ary)に格納はしないこと'(UserParameterList) :- user_parameters([_|UserParameterList]),!. user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/425 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 与えた文字列を指定した回数繰り返す文字列に変換するプログラムを作成しなさい。 # ただし、main関数を以下のように宣言し、実行時に引数をとれるようにする。 # 第一引数は繰り返し回数とし、第二引数は繰り返される文字列とする。 # すなわち、./prog 3 "ABC"と実行した場合は、ABCABCABCとなる文字列が作られる。 # 作られた文字列は、表示すること。必要に応じて、数字を数値に変換する関数atoi()を使用してもよい。 # その際は、#include<stdlib.h>を加えること。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc,char*argv[]){ # /** argc:引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:引数**/ # x=atoi(argv[1]);/*atoiの使用例*/ # return(0); # } # program :- 与えた文字列を指定した回数繰り返す文字列に変換する. 与えた文字列を指定した回数繰り返す文字列に変換する :- user_parameters([_回数文字列,_文字列]), atom_to_term(_回数文字列,_回数,_), length(Ln,_回数), append(_,[_|R],Ln), write(_文字列), R = []. user_parameters(A) :- current_prolog_flag(argv, B), append(_, [--|A], B). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/639 # # [1] C言語演習 # [2] argvで入力された引数 "123:456:78:90" の様な文字列を ":" 区切りで # 別の配列へ順に格納せよ。(strchr関数を使いなさい) # 上記の例では、[0]=123,[1]=456,[2]=78,[3]=90となる。 # 尚、::の連続もありで、"12:34::90" は [0]=12,[1]=34,[2]=null,[3]=90となる。 # # 下の様に処理しているが、スマートに行きません。。。 # p = NULL; # p = strchr(str, ':'); # while (p != NULL) { # printf("length %d\n", strlen(str)-strlen(p)); # p++; # p = strchr(p, ':'); # } # 'argvで入力された引数 "123:456:78:90" の様な文字列を ":" で区切り、プログラム引数述語のリスト引数とする' :- user_parameters([_引数文字列]), split(_引数文字列,[':'],L), assertz(プログラム引数(L)). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/682 # # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(0,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,1,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,0,1,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,1,0,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,0,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(0,1,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,1,1,'NG') :- !. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/699 # # ../test/read.cgi/tech/1311089619/682について内容が不足していたので再投稿します。 # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # [3] フラグ・判定にビット演算を使用してください。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する。判定はビット演算を使う' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'OK') :- 0 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'NG') :- 1 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/453 # # 【 課題 】コマンドラインから入力された点数を集計するプログラムを作成。 #       ソースファイルにコードを追加して、以下の実行結果になるように。 # # 実行結果  #       java CalcMain 69 88 70 45 95 33 #       高得点順: 95点 , 88点 , 70点 , 69点 , 45点 , 33点 #       科目数:6科目 #       合計点:400点 #       平均点: 66.666664点 #        CalcMainクラスはmain()メソッドを持つ。 #        Calculationクラスは、合計点の計算をするgetTotal()メソッド、平均点の計算をするgetAve()メソッド、並び替え処理を行うsort()メソッドを持つ。 #        コマンドライン引数から受け取った不特定数の数値(点数)について、降順並び替え表示、科目数、合計点、平均点の表示を行う。 #        sort()メソッドの並び替え処理には「バブルソート」を使用する # # #       ソースファイル #       http://ime.nu/www.dotup.org/uploda/www.dotup.org2249012.java.html # # http://ime.nu/www.dotup.org/uploda/www.dotup.org2249060.java # # # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11月14日まで # 【 Ver  】java version "1.6.0_22" # 【 用語 】 # 【 補足 】よろしくお願いします。 # # 'コマンドラインから入力された点数を集計するプログラムを作成。ソースファイルにコードを追加して、以下の実行結果になるように。' :- コマンドラインから入力された点数(_コマンドラインから入力された点数ならび), 高得点順に表示(_コマンドラインから入力された点数ならび), 科目数と合計点と平均点の表示(_コマンドラインから入力された点数ならび). コマンドラインから入力された点数(_コマンドラインから入力された点数ならび) :- current_prolog_flag(argv,_コマンドライン), append(_,['--'|_コマンドラインから入力された点数ならび],_コマンドライン]). 高得点順に表示(L) :- バブルソート降順(L,L2), concat_atom(L2,',',_表示文字列), writef('高得点順: %t\n',[_表示文字列]). 科目数の表示(L,_科目数) :- length(L,_科目数), writef('科目数: %t\n',[_科目数]), 科目数と合計点と平均点の表示(L) :- length(L,_科目数), sum(L,_合計点), _平均点 is _合計点 / _科目数. writef('科目数: %t\n合計点: %t\n平均点: %t\n',[_科目数,_合計点,_平均点]). バブルソート降順(_対象ならび,_整列済みならび) :- 降順交換(_対象ならび,_対象ならびの一), !, バブルソート降順(_対象ならびの一,_整列済みならび). バブルソート降順(_整列済みならび,_整列済みならび). 降順交換([],[]) :- !,fail. 降順交換([A,B|R],[B,A|R]) :- A @< B,!. 降順交換([A|R1],[A|R2]) :- 降順交換(R1,R2). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/670 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # #include<stdio.h> # int main(void) # { # int i=0; # char *ptr; # char str[128]; # # ptr = str; # # scanf("%s",&str); # # while(*ptr++){ # i++; # } # # printf("%d\n",i); # } # # 上記の入力したテキストの文字数を表示するプログラムの読み込み部分をファイル処理に変更せよ。 # fgetc() 関数を使用し、コマンドラインにファイル名が指定できるようにすること。 # ただし、ファイル名を指定しない場合は標準入力とする。 # ファイルが見つからなかった時はエラーメッセージを出し、プログラムを終了する。 # 'length系組込述語を使わず入力したテキストの文字数を表示する' :- get_chars(_文字ならび), ならびの文字数を数える(_文字ならび,_文字数), writef('文字数は %t文字です\n',[_文字数]). ならびの文字数を数える([],0). ならびの文字数を数える([_|R],_文字数) :- ならびの文字数を数える(R,_文字数_1), _文字数 is _文字数_1 + 1. 読み込み部分をファイル処理に変更する :- コマンドラインからファイル名を取り出す(_ファイル名), 読み込み部分をファイル処理に変更する(_ファイル名). 読み込み部分をファイル処理に変更する(user_input,_文字数) :- ファイルから読み出しながら文字数を数える(user_input,_文字数). 読み込み部分をファイル処理に変更する(_ファイル名,_文字数) :- open(_ファイル名,read,Instream), ファイルから読み出しながら文字数を数える(Instream,_文字数), close(Instream). ファイルから読み出しながら文字数を数える(Instream,0) :- at_end_of_stream(Instream),!. ファイルから読み出しながら文字数を数える(Instream,_文字数) :- get_char(Instream,_), ファイルから読み出しながら文字数を数える(Instream,_文字数_1), _文字数 is _文字数_1 + 1. コマンドラインからファイル名を取り出す(_ファイル名) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList), ParameterList = [_ファイル名|_],!. コマンドラインからファイル名を取り出す(user_input). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/613 # # 明日までの課題です。 # まったくわかりません。 # # キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力するプログラムを書きなさい。 # なお、プログラムは次の要件を満たすこと。 # # 1.キーボードからの入力は、Enter(return)キーを2回連続して入力すると終了する # 2.入力終了後、画面に入力した行数を表示する # 3.コマンドラインからプログラムを起動後、入力する文字列に各自の氏名(ローマ字表記)を含めた場合、入力処理終了後、各自の氏名を含む行は何行目にあり、その行の文字列が何であるか表示する。 # 氏名が入力データに含まれていない場合には、含まれていなかったことを表示する # # よろしくお願いします。 # # program :- 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する' :- user_parameters([_ファイル名]), open(_ファイル名,write,Outstream), get_line(Line), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,[]), close(Outstream). 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,'',Ln) :- length(Ln,_行数), writef('行数は %t です\n',[_行数]),!. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,Ln) :- writef(Outstream,'%t\n',[Line]), get_line(Line_2), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line_2,[_|Ln] user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/59 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): # main関数を以下のように宣言し、実行時に引数を取れるようにする。 # 引数がすべて得点であるとして、その平均値を # 求めるプログラムを作成しなさい。 # すなわち、 # ./prog 50 70 90 と実行した場合は、70と表示される。 # 必要に応じて、数字を数値に変換する関数atoi()や # atof()を使用してもよい。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc, char *argv[] ) { # /** argc: 引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:実数 **/ # x = atof( argv[1] ); /* atofの使用例 */ # return(0); # } # # ※ 配列のサイズなど、定数は必ず#defineを利用すること. # ※ 表示や入力を目的とする関数以外では、 # 関数の中で標準入力や標準出力への入出力は行わないこと. # # #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語: c言語 # [4] 期限: 6月15日 # よろしくお願いします! # # program :- user_parameters(_ユーザパラメータならび), プログラム引数を整数ならびに変換(_ユーザパラメータならび,_整数ならび), avg(整数ならび,_相加平均), writef('%t\n',[_相加平均]). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). プログラム引数を整数ならびに変換([],[]). プログラム引数を整数ならびに変換([A|R1],[N|R2]) :- atom_to_term(A,N,_), integer(N), プログラム引数を整数ならびに変換(R1,R2). プログラム引数を整数ならびに変換([_|R1],R2) :- プログラム引数を整数ならびに変換(R1,R2). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/642 # # [1] 授業単元:C言語演習 # [2] 問題文: # 実行ファイル名をmultiとして、multiに続いて2つの正の整数を入力すると、小さい方の整数から大きい方の整数までの積を出力するプログラムを作成せよ。 # 但し、入力時には小さい方の整数、大きいほうの整数の順で入力されるものとする。 # <入力例>$./multi 3 6 # <計算結果>360 # program :- user_parameters([_引数1,_引数2]), 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2), user_parameters(ParametersList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2) :- atom_number(_引数1,N1), atom_number(_引数2,N2), 小さい方の整数と大きい方の整数(N1,N2,_小さい方の整数,_大きい方の整数), 小さい方の整数から大きい方の整数までの積を(_小さい方の整数,_大きい方の整数,_積), 出力する(_積). 小さい方の整数と大きい方の整数(N1,N2,N1,N2) :- N1 =< N2. 小さい方の整数と大きい方の整数(N1,N2,N2,N1) :- N1 > N2. 小さい方の整数から大きい方の整数までの積を(N,N,N). 小さい方の整数から大きい方の整数までの積を(N,_大きい方の整数,_積) :- N < _大きい方の整数, N1_2 is N1 + 1, 小さい方の整数から大きい方の整数までの積を(N_2,_大きい方の整数,_積_2), _積 is _積_2 * N. 出力する(_積) :- writef('%t\n',[N]). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/786 # # C言語 # gcc # Linux # 問題:cat関数を作りなさい。ただし、fgets,fputsを用いること。です。 # # 明日のお昼までにお願いします。 # # cat :- user_parameters([]), get_code(user_input,Code), ストリームから読み取り書き出す(user_input,Code),!. cat :- user_parameters(L), append(_,[File|R],L), ファイルを書き出す(File), R = [],!. ファイルを書き出す(File) :- open(File,read,Instream), get_code(Instream,Code), ストリームから読み取り書き出す(Instream,Code), close(Instream). ストリームから読み取り書き出す(_,-1) :- !. ストリームから読み取り書き出す(Instream,Code_1) :- put_code(Code_1), get_code(Instream,Code_2), ストリームから読み取り書き出す(Instream,Code_2). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). % % SWI-Prologの起動は % # swipl -t cat -f プログラムファイル名 -- ファイル1 ファイル名2 ... % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/907 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 以下のようにmain関数を定義し、mainの引数を合計するプログラムsumを作成せよ。ただし、引数の数は未定であり、実行時に決定されるものとする。 # int main(int argc, char *argv[]) # main :- 利用者引数ならび(_利用者引数ならび), findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値ならび), sum(_数値ならび,_合計), writef('%t\n',[_合計]). sum([],0). sum([_数値|R],_合計) :- sum(R,_合計_1), _合計 is _数値 + _合計_1. 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). % % # swipl --quiet -f c161_907.html -g main -- 33.0 25.1 38.4 % 96.5 % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/957 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク): # コマンド行から複数の数値を受け取りその平均値を出力するプログラムを # 作成し、プログラムリストと実行結果を示せ。ヒント:受け取った文字列を # double型に変換するには、関数double atof(const char *nPtr)を使う。 # この関数を使うには<stdlib.h>のインクルードが必要である。 # #include <stdio.h> # #include <stdlib.h> # int main(void) # { # char str[]="1.41421356"; # double x; # x = atof(str); # } # 'コマンド行から複数の数値を受け取りその平均値を出力する' :- 利用者引数ならび(_利用者引数ならび), 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび), 相加平均(_数値引数ならび,_相加平均), writef('平均値は %t です\n',[_相加平均]). 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび) :- findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値引数ならび). 相加平均([],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). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/142 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ # input関数とshow関数を作ること # コマンド引数にテキストファイルの名前を入れること # 'テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ。コマンド引数にテキストファイルの名前を入れること' :- コマンド引数からテキストファイルの名前を得る(_テキストファイル), テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル). コマンド引数からテキストファイルの名前を得る(_テキストファイル) :- current_prolog_flag(argv,ParameterList), append(_,['--'|[_テキストファイル]],ParameterList). テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル) :- テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル,Outstream), そのテキストファイルの中身を出力せよ(_テキストファイル). テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル) :- open(_テキストファイル,write,Outstream). そのなかに整数5個数字を入れる(Outstream), close(Outstream). そのなかに整数5個数字を入れる(Outstream) :- between(1,5,_何番目), 整数を得る(_整数), writef(Outstream,'%t\n',[_整数]), _何番目 = 5. そのテキストファイルの中身を出力せよ(_テキストファイル) :- open(_テキストファイル,read,Instream), copy_stream_data(Instream,user_output), close(Instream). % % ここではズルをして組込述語 copy_stream_data/2 を使って見た。 % % 本来ならget_lines/2とput_lines/2の組合せでコピーを表現するところ。 % % そのテキストファイルの中身を出力せよ(_テキストファイル) :- % get_lines(_テキストファイル,_行ならび), % put_lines(user_output,_行ならび). % % get_lines(_ファイル名,_行ならび) :- % open(_ファイル名,read,Instream), % findall(_行,( % repeat, % ( at_end_of_stream(Instream),!,fail; % get_line(Instream,_行))), % _行ならび), % close(Instream). % % put_lines(_ファイル名,_行ならび) :- % open(_ファイル名,write,Outstream), % forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), % close(Outstream). % % 以下のサイトは 有限個のデータを小さい順に並べた時中央に位置する値(_有限個のデータ,_中央値) :- 小さい順に並べた時(_有限個のデータ,_小さい順に並べた有限個のデータ), 中央に位置する値(_小さい順に並べた有限個のデータ,_中央値). 中央に位置する値(_小さい順に並べた有限個のデータ,_中央値) :- length(_小さい順に並べた有限個のデータ,_データ数), 中央に位置する値(_小さい順に並べた有限個のデータ,_データ数,_中央値). 中央に位置する値(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 'データが奇数個の場合は、中央の位置にある値'(_小さい順に並べた有限個のデータ,_データ数,_中央値). 中央に位置する値(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 'データが偶数個の場合は、中央に近い2つの値の算術平均をとる'(_小さい順に並べた有限個のデータ,_データ数,_中央値). 'データが奇数個の場合は、中央の位置にある値'(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 奇数(_データ数), _中央の位置 is (_データ数 // 2) + 1, nth1(_中央の位置,_小さい順に並べた有限個のデータ,_中央値). 'データが偶数個の場合は、中央に近い2つの値の算術平均をとる'(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 偶数(_データ数), 中央に近い2つの値の(_小さい順に並べた有限個のデータ,_データ数,_値_1,_値_2), 算術平均をとる(_値_1,_値_2,_中央値). 偶数(_整数) :- 0 is _整数 mod 2. 奇数(_整数) :- 1 is _整数 mod 2. 中央に近い2つの値の(_小さい順に並べた有限個のデータ,_データ数,_値_1,_値_2) :- _中央に近い位置_1 is _データ数 // 2, succ(_中央に近い位置_1,_中央に近い位置_2), nth1(_中央に近い位置_1,_小さい順に並べた有限個のデータ,_値_1), nth1(_中央に近い位置_2,_小さい順に並べた有限個のデータ,_値_2). 算術平均をとる(_値_1,_値_2,_中央値) :- _中央値 is ( _値_1 + _値_2 ) / 2. 小さい順に並べた時([],[]). 小さい順に並べた時(_有限個のデータ,_小さい順に並べた有限個のデータ) :- 軸要素の選定(_有限個のデータ,_軸要素,_軸要素を除いたならび), 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,_軸要素を除いたならび,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび), '軸要素で分割した二つの要素ならびを それぞれ小さい順に並べて結合する'(_軸要素,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび,_小さい順に並べた有限個のデータ). '軸要素で分割した二つの要素ならびを それぞれ小さい順に並べて結合する'(_軸要素,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび,_小さい順に並べた有限個のデータ) :- 小さい順に並べた時(_軸要素より小さい要素ならび,_小さい順にならべた軸要素より小さい要素ならび), 小さい順に並べた時(_軸要素に等しいか大きい要素ならび,_小さい順にならべた軸要素に等しいか大きい要素ならび), append(_小さい順にならべた軸要素より小さい要素ならび,[_軸要素|_小さい順にならべた軸要素に等しいか大きい要素ならび],_小さい順に並べた有限個のデータ). 軸要素の選定([_軸要素|_軸要素を除いたならび],_軸要素,_軸要素を除いたならび). 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_,[],[],[]). 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,[A|R],[A|_軸要素より小さい要素ならび],_軸要素に等しいか大きい要素ならび) :- A @< _軸要素, 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,R,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび). 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,[A|R],_軸要素より小さい要素ならび,[A|_軸要素に等しいか大きい要素ならび]) :- A @>= _軸要素, 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,R,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび). % 以下のサイトは ベクトルの内積(_ベクトル_1,_ベクトル_2,_ベクトルの内積) :- findsum(U,( nth1(_nth1,_ベクトル_1,[U1]), nth1(_nth1,_ベクトル_2,[U2]), U is U1 * U2),_ベクトルの内積). % 以下のサイトは 整数除算(_実,_法,_商,_剰余) :- 整数(_実), 整数除算(_実,_法,true,_商,_剰余). 整数除算(_実,_法,_商,_剰余) :- 変数(_実), 整数(_法), 法として合同(_法,_実,_商,_剰余). 法として合同(_n,_nを法として合同,_m,_剰余) :- 整数(_n), nth0(_m,_,_), succ(_n_1,_n), between(0,_n_1,_剰余), _nを法として合同 is _m * _n + _剰余. 整数除算(_実,_法,_制約,_商,_剰余) :- '整数は実と法'(_実,_法,_商,_剰余). 整数除算(_実,_法,_制約,_商,_剰余) :- '整数は実と商と剰余、変数は法'(_実,_法,_制約,_商,_剰余). 整数除算(_実,_法,_制約,_商,_剰余) :- '整数は実、変数は法と商'(_実,_法,_商,_剰余). 整数除算(_実,_法,_制約,_商,_剰余) :- '変数は実'(_実,_法,_制約,_商,_剰余). 法として合同(_n,_nを法として合同,_制約,_m,_剰余) :- 'm乃ち商と剰余を生成'(_n,_m,_剰余), _nを法として合同 is _m * _n + _剰余, (\+(_制約),!,fail;true). 'm乃ち商と剰余を生成'(_n,_m,_剰余) :- 整数(_n), nth0(_m,_,_), succ(_n_1,_n), between(0,_n_1,_剰余). 整数は実と法(_実,_法,_商,_剰余) :- 整数は実と法(_実,_法), _商 is _実 // _法, _剰余 is _実 mod _法. 整数は実と法(_実,_法) :- 整数(_実), 整数(_法). '整数は実と商と剰余、変数は法'(_実,_法,_制約,_商,_剰余) :- '整数は実と商と剰余、変数は法'(_実,_法,_商,_剰余), _法 is (_実 - _剰余) // _商, _剰余 is _実 mod _法, _制約. '整数は実と商と剰余、変数は法'(_実,_法,_商,_剰余) :- 整数(_実), 変数(_法), 整数(_商), 整数(_剰余). '整数は実と商、変数は法と剰余'(_実,_法,_商,_剰余) :- 整数(_実), 変数(_法), 整数(_商), 変数(_剰余), succ(_商_1,_商), between(0,_商_1,_剰余). '整数は実,変数は法と商'(_実,_法,_商,_剰余) :- 整数(_実), 変数(_法), 変数(_商), between(1,_実,_法), 整数除算(_実,_法,_制約,_商,_剰余). '変数は実'(_実,_法,_制約,_商,_剰余) :- 変数(_実), 法として合同(_法,_実,_制約,_商,_剰余). '整数は実、変数は法と商'(_実,_法,_商,_剰余) :- 整数(_実), 変数(_法), 変数(_商), between(1,_実,_法), _商 is _実 // _法, _剰余 is _実 mod _法. 整数(_整数) :- integer(_整数). 変数(_変数) :- var(_変数). % 以下のサイトは 昇順鍵整列(L1,_鍵ならび,L2) :- 昇順鍵整列(1,_鍵ならび,L1,KL,L3), 昇順整列(KL,KL2), findall(L,( member(L4,KL2), last(L4,K), member([K|L],L3)),L2). 昇順鍵整列(_,_,[],[],[]) :- !. 昇順鍵整列(N,KL,[L1|R1],[KL_1|KR],[[N|L1]|R3]) :- 鍵生成(N,KL,L1,KL_1), succ(N,N_2), 昇順鍵整列(N_2,KL,R1,KR,R3). 鍵生成(N,KL,L1,KR_2) :- findall(A,( member(K,KL), nth1(K,L1,A)),KR_1), append(KR_1,[N],KR_2). 昇順整列([],[]). 昇順整列([_軸要素|L1],L2) :- 昇順分割(_軸要素,L1,L1_2,L2_2), 昇順整列(L1_2,L1_3), 昇順整列(L2_2,L2_3), append(L1_3,[_軸要素|L2_3],L2). 昇順分割(_,[],[],[]). 昇順分割(A,[B|R2],[B|R3],R4) :- A @>= B, 昇順分割(A,R2,R3,R4). 昇順分割(A,[B|R2],R3,[B|R4]) :- A @< B, 昇順分割(A,R2,R3,R4). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- M is _第何行_2 - _第何行_1, '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1), '_第何行_2まで切り取る'(R1,M,A,B,R3), append(L1,[B|R3],_2つの行を交換した行列). '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1) :- append(L1,[A|R1],_行列), length([_|L1],_第何行_1). '_第何行_2まで切り取る'(R1,M,A,B,R3) :- append(L2,[B|R2],R1), length([_|L2],M), append(L2,[A|R2],R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,M,_n_2,[A|R1],A,B,[B|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,M,_n_2,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,M,[B|R1],A,B,[A|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,M,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,_n_2,[U|R1],A,B,[U|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,_n_1,_n_2,[C|R1],A,B,[D|R2]) :- 交換の選択(M,_n_1,_n_2,C,A,B,D), succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). 交換の選択(M,M,_n_2,A,A,B,B) :- !. 交換の選択(M,_n_1,M,B,A,B,A) :- !. 交換の選択(M,_n_1,_n_2,U,A,B,U). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- M is _第何行_2 - _第何行_1, '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1), '_第何行_2まで切り取る'(R1,M,A,B,R3), append(L1,[B|R3],_2つの行を交換した行列). '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1) :- append(L1,[A|R1],_行列), length([_|L1],_第何行_1). '_第何行_2まで切り取る'(R1,M,A,B,R3) :- append(L2,[B|R2],R1), length([_|L2],M), append(L2,[A|R2],R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,M,_n_2,[A|R1],A,B,[B|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,M,_n_2,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,M,[B|R1],A,B,[A|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,M,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,_n_2,[U|R1],A,B,[U|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,_n_1,_n_2,[C|R1],A,B,[D|R2]) :- 交換の選択(M,_n_1,_n_2,C,A,B,D), succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). 交換の選択(M,M,_n_2,A,A,B,B) :- !. 交換の選択(M,_n_1,M,B,A,B,A) :- !. 交換の選択(M,_n_1,_n_2,U,A,B,U). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_2つの行を交換した行列), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_2つの行を交換した行列), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは # 出典: プログラミングのお題スレ Part5 #252 # お題: # 整数n(0<=n<1000000)をソロバンのAAに変換するプログラムを書け # # n=9563なら # ######## # #oo|||o# # #||ooo|# # ######## # #||o|oo# # #oooo|o# # #oooooo# # #ooooo|# # #oo|ooo# # ######## # # 等幅フォントじゃないとちゃんと見れないけどごめんね '整数n(0<=n<1000000)をソロバンのAAに変換するプログラムを書け'(_n) :- '整数n(0<=n<1000000)をソロバンの'(_n,[],LL), 'AAに変換する'(LL). '整数n(0<=n<1000000)をソロバンの'(0,LL,LL) :- !. '整数n(0<=n<1000000)をソロバンの'(_n,LL1,LL) :- 一桁を天下に二分する(_n,[_1,_2,_3],[_4,_5,_6,_7,_8]), _n_2 is _n // 10, '整数n(0<=n<1000000)をソロバンの'(_n_2,[[_1,_2,_3,_4,_5,_6,_7,_8]|LL1],LL). 一桁を天下に二分する(_n,_天,_下) :- _n_1 is _n mod 10, _n_1_1 is _n_1 // 5, _n_1_2 is _n_1 mod 5, 天(_n_1_1,_天), 下(_n_1_2,_下). 天(0,['O','|']). 天(1,['|','O']). 下(0,['|','O','O','O','O']). 下(1,['O','|','O','O','O']). 下(2,['O','O','|','O','O']). 下(3,['O','O','O','|','O']). 下(4,['O','O','O','O','|']). 'AAに変換する'(LL) :- 梁(LL,_梁), 転置(LL,LL2), 枠の中に描く(_梁,LL2). 枠の中に描く(_梁,LL) :- writef('#%t#\n',[_梁]), forall(上から下まで枠と珠ならびを描く(_梁,LL,_表示行),writef('%t',[_表示行])), writef('#%t#\n',[_梁]). 上から下までの枠と珠ならびを描く(_梁,LL,_表示行) :- nth1(_nth1,LL,_横方向珠ならび), atomic_list_concat(_横方向珠ならび,_横方向珠文字列), 上から下までの枠と珠ならびを描く(_nth1,_梁,_横方向珠文字列,_表示行). 上から下までの枠と珠ならびを描く(4,_梁,_横方向珠文字列,_表示行) :- swritef(_表示行,'%t\n#%t#\n',[_梁,_横方向珠文字列]). 上から下までの枠と珠ならびを描く(_nth1,_梁,_横方向珠文字列,_表示行) :- \+(_nth1=4), swritef(_表示行,'#%t#\n',[_横方向珠文字列]). 梁(LL,_梁) :- length(LL,_幅), lenth(L,_幅), all(L,'#'), atom_chars(_梁,L). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/89 # 0と1のみでランダムに生成した文字列Sがある # 長さは2<=S<=1000である # 11001010110100011001011011111111111111000000000010111000000 # # 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX # 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN # としたときのMXとMNを求めよ # 見当たらない場合はFALSEを出力しろ # # S=110001010100 # MX=3 (000が一番長い) # MN=2 (11または00が二番目に長い) # # S=111111 # MX=3 (111111が一番長い) # MN=FALSE (2番目に短いものが存在しない) # # S=10 # MX=FALSE (1番長いのが存在しない) # MX=FALSE (2番目に短いものが存在しない) # # '0と1のみでランダムに生成した文字列Sがある 長さは2<=S<=1000である 11001010110100011001011011111111111111000000000010111000000 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ' :- '0と1のみでランダムに生成した文字列Sがある'(_文字列), forall('同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ'(_文字列,_最長文字列,_短い方から二番目の文字列), write('S=%t\nMX=%t,MN=%t\n',[_文字列,_最長文字列,_短い方から二番目の文字列])),!. '0と1のみでランダムに生成した文字列Sがある 長さは2<=S<=1000である 11001010110100011001011011111111111111000000000010111000000 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ' :- write('FALSE\n'). '0と1のみでランダムに生成した文字列Sがある'(_文字列) :- R is random(999) + 2, findall(_0または1,( between(2,R,_), _0または1 is random(3341) mod 2), _0または1ならび), atomic_list_concat(_0または1ならび,_文字列). '同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ'(_文字列,_最長文字列,_短い方から二番目の文字列) :- 連続した文字列と文字数ならびを得る(_文字列,_連続した文字列と文字数ならび), 最長文字列と短い方から二番目の文字列(_連続した文字列と文字数ならび,_最長文字列,_短い方から二番目の文字列). 連続した文字列と文字数ならびを得る(_文字列,_連続した文字列と文字数ならび) :- findall([_連続した文字列,_文字数],( 連続した文字列と文字数(_文字列,_連続した文字列,_文字数)), _連続した文字列_文字数ならび). 連続した文字列と文字数(_文字列,_連続した文字列,_文字数) :- '0の連続したの文字列'(_文字列,_連続した文字列,_文字数). 連続した文字列と文字数(_文字列,_連続した文字列,_文字数) :- '1の連続したの文字列と文字数'(_文字列,_連続した文字列,_文字数). '0の連続したの文字列'(_文字列,_連続した文字列,_文字数) :- sub_atom(_文字列,_開始点,_文字数,_残り文字数,_連続した文字列), 前後に0の文字がない(_文字列,_開始点,_文字数,_残り文字数), forall(sub_atom(_連続した文字列,_,1,_,_文字),_文字='0'). '1の連続したの文字列'(_文字列,_連続した文字列,_文字数) :- sub_atom(_文字列,_開始点,_文字数,_残り文字数,_連続した文字列), 前後に0の文字がない(_文字列,_開始点,_文字数,_残り文字数), forall(sub_atom(_連続した文字列,_,1,_,_文字),_文字='1'). 前後に0の文字がない(_文字列,_開始点,_文字数) :- succ(_開始点_1,_開始点), _開始点_2 is _開始点 + _文字数, \+(sub_atom(_文字列,_開始点_1,1,_,'0')), \+(sub_atom(_文字列,_開始点_2,1,_,'0')). 前後に1の文字がない(_文字列,_開始点,_文字数) :- succ(_開始点_1,_開始点), _開始点_2 is _開始点 + _文字数, \+(sub_atom(_文字列,_開始点_1,1,_,'1')), \+(sub_atom(_文字列,_開始点_2,1,_,'1')). 最長文字列と短い方から二番目の文字列(_連続した文字列と文字数ならび,_最長文字列,_短い方から二番目の文字列) :- 最長文字数と短い方から二番目に短い文字数(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数), 最長文字数と短い方から二番目に短い文字列(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数,_最長文字列,_短い方から二番目に短い文字列). 最長文字数と短い方から二番目に短い文字数(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数) :- 文字列長ならび(_連続した文字列と文字数ならび,_文字列長ならび), sort(_文字列長ならび,_整列した文字列長ならび), nth1(2,_整列した文字列長ならび,_短い方から二番目に短い文字数), append(_,[_最長文字数],_整列した文字列長ならび). 文字数ならび(_連続した文字列と文字数ならび,_文字数ならび) :- findall(_文字数,( member([_,_文字数],_連続した文字列と文字列数ならび)), _文字数ならび). 最長文字数と短い方から二番目に短い文字列(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数,_最長文字列,_短い方から二番目に短い文字列) :- member([_最長文字列,_最長文字数],_連続した文字列と文字数ならび), member([_短い方から二番目に短い文字列,_短い方から二番目に短い文字数],_連続した文字列と文字数ならび). % 以下のサイトは # 問題文 # (21:13 追記) |A|=|B|=1のケースがテスト中に一つ含まれていましたので、リジャッジを行います。なお、このケースでNOを出力するプログラムに影響はありません。 # # 文字列 A の文字をちょうど 3 回スワップすることにより、文字列 B に変換できるとき、二つの文字列 A, B を、仲良し文字列と呼ぶことにします。 # # スワップとは、文字列に含まれる 2 つの文字を、入れ替えることを指します。 例えば、abcという文字列であれば、aとcを入れ替えて、cbaのように変換することが出来ます。 # # aaのような文字列に対し、 1 文字目のaと、 2 文字目のaを入れ替えることは許されていますが、同じ場所の文字を指定することはできません。 # # 文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # B # 1 行目には、文字列 A(2≦|A|≦1000) が与えられる。 # 2 行目には、文字列 B(|B|=|A|) が与えられる。 # A, B 共に、小文字アルファベットのみで構成されていることが保障されている。 # 出力 # 与えられた 2 つの文字列が、仲良し文字列であればYES、そうでなければNOを出力せよ。 出力の末尾には改行をいれること。 # # 入力例1 # abcdef # fedcba # 出力例1 # YES # まず、文字列 A のabcdefのaとfをスワップし、fbcdeaとします。 # # 次に、bとeをスワップし、fecdbaとします。 # # 最後に、cとdをスワップし、fedcbaとすると、文字列 B と一致します。 # # よって、この 2 つの文字列は、仲良し文字列となるため、YESと出力します。 # # 入力例2 # abababab # babababa # 出力例2 # NO # 使っている文字数が同じでも、 3 回のスワップでは同じ文字列にできないパターンも存在します。 # # 入力例3 # nt # nt # 出力例3 # NO # スワップの仕方が 1 通りしかなく、 3 回のスワップを繰り返すと、tnになってしまいます。 よって、同じ 2 つの文字列ですが、仲良し文字列ではありません。 # # 入力例4 # pqqq # pqqq # 出力例4 # YES # まず、 1 番目の文字と 2 番目の文字を入れ替え、qpqqとします。 次に、 3 番目の文字と 4 番目の文字を入れ替え、qpqqとします。この際、同じ文字を選んでいますが、場所が違うので問題ありません。 最後に、1番目の文字と、2番目の文字を入れ替え、pqqqとします。 # # 入力例5 # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyzw # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz # 出力例5 # YES # 長い文字列が与えらえれることがあることにも注意してください。 # # 入力例6 # abcdef # ghijkl # 出力例6 # NO '文字列 A(2≦|A|≦100))、B(|B|=|A|) が与えられるので、仲良し文字列になっているかどうかを判定しなさい。' :- '文字列 A(2≦|A|≦100)'(_A), '文字列 B(|B|=|A|)'(_A,_B), 文字列と仲良し文字列(_A,_B). '文字列 A(2≦|A|≦100)'(_A) :- 行入力(_A), '(2≦|A|≦100)'(_A). 行入力(_行) :- read_line_to_codes(_Codes), atom_codes(_行,_Codes). '(2≦|A|≦100)'(_A) :- atom_length(_A,_長さ), between(2,100,_長さ). '文字列 B(|B|=|A|)'(_A,_B) :- 行入力(_B), '(|B|=|A|)'(_A,_B). '(|B|=|A|)'(_A,_B) :- atom_length(_A,_長さ), atom_length(_B,_長さ). 文字列と仲良し文字列(_文字列,_仲良し文字列) :- atom_chars(_文字列,L1), 文字列中の文字の三回スワップ(L1,[],L2), atom_chars(_仲良し文字列,L2). 文字列中の文字の三回スワップ(X,[_,_,_,_,_,_],X). 文字列中の文字の三回スワップ(L1,_履歴,X) :- スワップ(L1,_履歴,_nth0_1,_nth0_2,L2), 文字列中の文字の三回スワップ(L2,[_nth0_1,_nth0_2|_履歴],X). スワップ(L1,_履歴,_何番目_1,_何番目_2,L2) :- 交換する候補を得る(L1,_履歴,_何番目_1,_何番目_2,A,B), 交換する(L1,_何番目_1,_何番目_2,A,B,L2). 交換する候補を得る(L1,_履歴,_何番目_1,_何番目_2,_交換要素_1,_交換要素_2) :- 'まだ交換していない位置の要素を取り出す'(_何番目_1,L1,_履歴,_交換要素_1), 'まだ交換していない位置の要素を取り出す'(_何番目_2,L1,[_何番目_1|_履歴],_交換要素_2). 'まだ交換していない位置の要素を取り出す'(_何番目,L,_履歴,_交換要素) :- nth1(_何番目,L,_交換要素), \+(member(_何番目,_履歴)). 交換する(L1,_何番目_1,_何番目_2,A,B,L2) :- 'L2を生成する'(L1,L2), '交換する値をL2に埋める'(_何番目_1,_何番目_2,A,B,L2), 変数として残った要素を埋める(L1,L2). 'L2を生成する'(L1,L2) :- length(L1,Len), length(L2,Len). '交換する値をL2に埋める'(_何番目_1,_何番目_2,A,B,L2) :- nth1(_何番目_1,L2,B), nth1(_何番目_2,L2,A). 変数として残った要素を埋める([],[]). 変数として残った要素を埋める([A|R1],[A|R2]) :- 変数として残った要素を埋める(R1,R2),!. 変数として残った要素を埋める([_|R1],[A|R2]) :- 変数として残った要素を埋める(R1,R2). % 以下のサイトは # # あなたは既に読んでしまった札を記憶していることにします。 # まだ読まれていない、読み札も分かっていることとします。 # 読み札/2、既に読んでしまった札/2、自陣/1、敵陣/1がそれぞれ # 述語としして定義済みだとして、自陣、敵陣、あるいはその両方の札の # 決まり字を示すプログラムを定義してください。 # :- dynamic(読み札/1). :- dynamic(既に読んでしまった札/1). :- dynamic(自陣/1). :- dynamic(敵陣/1). 自陣または敵陣の全ての札の決まり字(_下の句,_上の句,_決まり字) :- 自陣または敵陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 自陣の札の決まり字(_下の句,_上の句,_決まり字) :- 自陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 敵陣の札の決まり字(_下の句,_上の句,_決まり字) :- 敵陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 決まり字(_上の句,_決まり字) :- 最長共通文字数(_上の句,_最長共通文字数), succ(_最長共通文字数,_決まり字の位置), sub_atom(_上の句,0,_決まり時の位置,_,_決まり字). 最長共通文字数(_上の句,_最長共通文字数) :- findmax(_先頭から最長共通文字数,( 対象としている上の句とは別の上の句を読み札から得る(_上の句,_別の上の句), '先頭から最長共通文字数(0オリジン)'(_上の句,別の上の句,_先頭からの最長共通文字数)),_最長共通文字数). 対象としている上の句とは別の上の句を読み札から得る(_上の句,_別の上の句) :- 読み札(_別の上の句,_), \+(_上の句 = _別の上の句). '先頭から最長共通文字数(0オリジン)'(_上の句,_別の上の句,_文字数) :- nth0(_文字数,_,_), sub_atom(_上の句,_文字数,1,_,_文字_1), sub_atom(_別の上の句,_文字数,1,_,_文字_2), \+(_文字_1=_文字_2),!. 下の句から決まり字を得る(_下の句,_決まり字) :- 自陣または敵陣(_下の句), '下の句から上の句を得る'(_下の句,_上の句), 決まり字(_上の句,_決まり字). 自陣または敵陣(_下の句) :- 自陣(_下の句). 自陣または敵陣(_下の句) :- 敵陣(_下の句). 下の句から上の句を得る(_下の句,_上の句) :- 読み札(_上の句,_下の句). findmax(_値,_目標,_最大値) :- findall(_値,_目標,_値ならび), 最大値(_値ならび,_最大値). 最大値(_標本ならび,_最大値) :- select(_最大値,_標本ならび,_残り標本ならび), forall(member(_標本_1,_残り標本ならび),_標本_1 @=< _最大値),!. /* 読み札('あきのたのかりほのいほのとまをあらみ,わがころもではつゆにぬれつつ'). 読み札('はるすぎてなつきにけらししろたへの,ころもほすてふあまのかぐやま'). 読み札('あしびきのやまどりのをのしだりをの,ながながしよをひとりかもねむ'). 読み札('たごのうらにうちいでてみればしろたへの,ふじのたかねにゆきはふりつつ'). 読み札('おくやまにもみぢふみわけなくしかの,こゑきくときぞあきはかなしき'). 読み札('かささぎのわたせるはしにおくしもの,しろきをみればよぞふけにける'). 読み札('あまのはらふりさけみればかすがなる,みかさのやまにいでしつきかも'). 読み札('わがいほはみやこのたつみしかぞすむ,よをうぢやまとひとはいふなり'). 読み札('はなのいろはうつりにけりないたづらに,わがみよにふるながめせしまに'). 読み札('これやこのゆくもかへるもわかれては,しるもしらぬもあふさかのせき'). 読み札('わたのはらやそしまかけてこぎいでぬと,ひとにはつげよあまのつりぶね'). 読み札('あまつかぜくものかよひぢふきとぢよ,をとめのすがたしばしとどめむ'). 読み札('つくばねのみねよりおつるみなのがは,こひぞつもりてふちとなりぬる'). 読み札('みちのくのしのぶもぢずりたれゆゑに,みだれそめにしわれならなくに'). 読み札('きみがためはるののにいでてわかなつむ,わがころもでにゆきはふりつつ'). 読み札('たちわかれいなばのやまのみねにおふる,まつとしきかばいまかへりこむ'). 読み札('ちはやぶるかみよもきかずたつたがは,からくれなゐにみづくくるとは'). 読み札('すみのえのきしによるなみよるさへや,ゆめのかよひぢひとめよくらむ'). 読み札('なにはがたみじかきあしのふしのまも,あはでこのよをすぐしてよとや'). 読み札('わびぬればいまはたおなじなにはなる,みをつくしてもあはむとぞおもふ'). 読み札('いまこむといひしばかりにながつきの,ありあけのつきをまちいでつるかな'). 読み札('ふくからにあきのくさきのしをるれば,むべやまかぜをあらしといふらむ'). 読み札('つきみればちぢにものこそかなしけれ,わがみひとつのあきにはあらねど'). 読み札('このたびはぬさもとりあへずたむけやま,もみぢのにしきかみのまにまに'). 読み札('なにしおはばあふさかやまのさねかづら,ひとにしられでくるよしもがな'). 読み札('をぐらやまみねのもみぢばこころあらば,いまひとたびのみゆきまたなむ'). 読み札('みかのはらわきてながるるいづみがは,つみきとてかこひしかるらむ'). 読み札('やまざとはふゆぞさびしさまさりける,ひとめもくさもかれぬとおもへば'). 読み札('こころあてにをらばやをらむはつしもの,おきまどはせるしらぎくのはな'). 読み札('ありあけのつれなくみえしわかれより,あかつきばかりうきものはなし'). 読み札('あさぼらけありあけのつきとみるまでに,よしののさとにふれるしらゆき'). 読み札('やまがはにかぜのかけたるしがらみは,ながれもあへぬもみぢなりけり'). 読み札('ひさかたのひかりのどけきはるのひに,しづごころなくはなのちるらむ'). 読み札('たれをかもしるひとにせむたかさごの,まつもむかしのともならなくに'). 読み札('ひとはいさこころもしらずふるさとは,はなぞむかしのかににほひける'). 読み札('なつのよはまだよひながらあけぬるを,くものいづこにつきやどるらむ'). 読み札('しらつゆにかぜのふきしくあきののは,つらぬきとめぬたまぞちりける'). 読み札('わすらるるみをばおもはずちかひてし,ひとのいのちのをしくもあるかな'). 読み札('あさぢふのをののしのはらしのぶれど,あまりてなどかひとのこひしき'). 読み札('しのぶれどいろにいでにけりわがこひは,ものやおもふとひとのとふまで'). 読み札('こひすてふわがなはまだきたちにけり,ひとしれずこそおもひそめしか'). 読み札('ちぎりきなかたみにそでをしぼりつつ,すゑのまつやまなみこさじとは'). 読み札('あひみてののちのこころにくらぶれば,むかしはものをおもはざりけり'). 読み札('あふことのたえてしなくはなかなかに,ひとをもみをもうらみざらまし'). 読み札('あはれともいふべき人はおもほえで,みのいたづらになりぬべきかな'). 読み札('ゆらのとをわたるふなびとかぢをたえ,ゆくへもしらぬこひのみちかな'). 読み札('やへむぐらしげれるやどのさびしきに,ひとこそみえねあきはきにけり'). 読み札('かぜをいたみいはうつなみのおのれのみ,くだけてものをおもふころかな'). 読み札('みかきもりゑじのたくひのよるはもえ,ひるはきえつつものをこそおもへ'). 読み札('きみがためをしからざりしいのちさへ,ながくもがなとおもひけるかな'). 読み札('かくとだにえやはいぶきのさしもぐさ,さしもしらじなもゆるおもひを'). 読み札('あけぬればくるるものとはしりながら,なほうらめしきあさぼらけかな'). 読み札('なげきつつひとりぬるよのあくるまは,いかにひさしきものとかはしる'). 読み札('わすれじのゆくすゑまではかたければ,けふをかぎりのいのちともがな'). 読み札('たきのおとはたえてひさしくなりぬれど,なこそながれてなほきこえけれ'). 読み札('あらざらむこのよのほかのおもひでに,いまひとたびのあふこともがな'). 読み札('めぐりあひてみしやそれともわかぬまに,くもがくれにしよはのつきかな'). 読み札('ありまやまゐなのささはらかぜふけば,いでそよひとをわすれやはする'). 読み札('やすらはでねなましものをさよふけて,かたぶくまでのつきをみしかな'). 読み札('おほえやまいくののみちのとほければ,まだふみもみずあまのはしだて'). 読み札('いにしへのならのみやこのやへざくら,けふここのへににほひぬるかな'). 読み札('よをこめてとりのそらねははかるとも,よにあふさかのせきはゆるさじ'). 読み札('いまはただおもひたえなむとばかりを,ひとづてならでいふよしもがな'). 読み札('あさぼらけうぢのかはぎりたえだえに,あらはれわたるせぜのあじろぎ'). 読み札('うらみわびほさぬそでだにあるものを,こひにくちなむなこそをしけれ'). 読み札('もろともにあはれとおもへやまざくら,はなよりほかにしるひともなし'). 読み札('はるのよのゆめばかりなるたまくらに,かひなくたたむなこそをしけれ'). 読み札('こころにもあらでうきよにながらへば,こひしかるべきよはのつきかな'). 読み札('あらしふくみむろのやまのもみぢばは,たつたのかはのにしきなりけり'). 読み札('さびしさにやどをたちいでてながむれば,いづこもおなじあきのゆふぐれ'). 読み札('ゆふさればかどたのいなばおとづれて,あしのまろやにあきかぜぞふく'). 読み札('おとにきくたかしのはまのあだなみは,かけじやそでのぬれもこそすれ'). 読み札('たかさごのをのへのさくらさきにけり,とやまのかすみたたずもあらなむ'). 読み札('うかりけるひとをはつせのやまおろしよ,はげしかれとはいのらぬものを'). 読み札('ちぎりおきしさせもがつゆをいのちにて,あはれことしのあきもいぬめり'). 読み札('わたのはらこぎいでてみればひさかたの,くもゐにまがふおきつしらなみ'). 読み札('せをはやみいはにせかるるたきがはの,われてもすゑにあはむとぞおもふ'). 読み札('あはぢしまかよふちどりのなくこゑに,いくよねざめぬすまのせきもり'). 読み札('あきかぜにたなびくくものたえまより,もれいづるつきのかげのさやけさ'). 読み札('ながからむこころもしらずくろかみの,みだれてけさはものをこそおもへ'). 読み札('ほととぎすなきつるかたをながむれば,ただありあけのつきぞのこれる'). 読み札('おもひわびさてもいのちはあるものを,うきにたへぬはなみだなりけり'). 読み札('よのなかよみちこそなけれおもひいる,やまのおくにもしかぞなくなる'). 読み札('ながらへばまたこのごろやしのばれむ,うしとみしよぞいまはこひしき'). 読み札('よもすがらものおもふころはあけやらで,ねやのひまさへつれなかりけり'). 読み札('なげけとてつきやはものをおもはする,かこちがほなるわがなみだかな'). 読み札('むらさめのつゆもまだひぬまきのはに,きりたちのぼるあきのゆふぐれ'). 読み札('なにはえのあしのかりねのひとよゆゑ,みをつくしてやこひわたるべき'). 読み札('たまのをよたえなばたえねながらへば,しのぶることのよわりもぞする'). 読み札('みせばやなをじまのあまのそでだにも,ぬれにぞぬれしいろはかはらず'). 読み札('きりぎりすなくやしもよのさむしろに,ころもかたしきひとりかもねむ'). 読み札('わがそではしほひにみえぬおきのいしの,ひとこそしらねかわくまもなし'). 読み札('よのなかはつねにもがもななぎさこぐ,あまのをぶねのつなでかなしも'). 読み札('みよしののやまのあきかぜさよふけて,ふるさとさむくころもうつなり'). 読み札('おほけなくうきよのたみにおほふかな,わがたつそまにすみぞめのそで'). 読み札('はなさそふあらしのにはのゆきならで,ふりゆくものはわがみなりけり'). 読み札('こぬひとをまつほのうらのゆふなぎに,やくやもしほのみもこがれつつ'). 読み札('かぜそよぐならのをがはのゆふぐれは,みそぎぞなつのしるしなりける'). 読み札('ひともをしひともうらめしあぢきなく,よをおもふゆゑにものおもふみは'). 読み札('ももしきやふるきのきばのしのぶにも,なほあまりあるむかしなりけり'). */ % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/833 # [1] 授業単元: プログラミング1 # [2] 問題文 # 文字列が入力され, # 次に表示したい文字の番号が入力されるので、 # その番号の文字を表示すること # 範囲を超えた場合は、NAと表示する # (番号は、1から始まる) # (文字列は50文字以内) # # 実行例 # abcdfge 入力1 # 3 入力2 # # '文字列が入力され, 次に表示したい文字の番号が入力されるので、 その番号の文字を表示すること 範囲を超えた場合は、NAと表示する (番号は、1から始まる) (文字列は50文字以内)' :- '文字列が入力され,(文字列は50文字以内)'(_文字列,_文字列長), '次に表示したい文字の番号が入力されるので、'(_文字の番号), 'その番号の文字を表示すること範囲を超えた場合は、NAと表示する(番号は、1から始まる)'(_文字列,_文字列長,_文字の番号),!. '文字列が入力され,(文字列は50文字以内)'(_文字列長,_文字列) :- get_line(_文字列), atom_length(_文字列,_文字列長), _文字列長 =< 50. '文字列が入力され,(文字列は50文字以内)'(_文字列) :- '文字列が入力され,(文字列は50文字以内)'(_文字列). '次に表示したい文字の番号が入力されるので、'(_文字の番号) :- 整数を得る(表示したい文字の番号,true,_文字の番号). 'その番号の文字を表示すること範囲を超えた場合は、NAと表示する(番号は、1から始まる)'(_文字列,_文字列長,_文字の番号) :- succ(_nth0,_文字の番号), sub_atom(_文字列,_nth0,1,_,_文字), writef('%t\n',[_文字]). 'その番号の文字を表示すること範囲を超えた場合は、NAと表示する(番号は、1から始まる)'(_文字列,_文字列長,_文字の番号) :- write('NA\n'). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/549 # お題:数独の答を表す文字列が与えられたとき、'1'が各列の何行目にあるかを # いちばん左の列から順に調べて表示する。 # 入力 # 145327698 # 839654127 # 672918543 # 496185372 # 218473956 # 753296481 # 367542819 # 984761235 # 521839764 # # 出力 # 159438276 # # '数独の答を表す文字列が与えられたとき、1が各列の何行目にあるかをいちばん左の列から順に調べて表示する。'(_数独文字列,_列目,_行目) :- 数独文字列を数独に変換(_数独文字列,_数独), 転置(_数独,_転置された数独), forall('1が各列の何行目にあるかをいちばん左の列から順に調べて'(_転置された数独,_行目),write(_行目)). 数独文字列を数独に変換(_数独文字列,_数独) :- split(_数独文字列,['\n'],_数独文字列行ならび), findall(_数独行,( findall(_数,( sub_atom(_数独文字列,_,1,_,_文字), 数値に変換(_文字,_数)), _数独行)), _数独). '1が各列の何行目にあるかをいちばん左の列から順に調べて'(_転置された数独,_行目) :- nth1(_列目,_転置された数独,_列), nth1(_行目,_列,'1'). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは % % tic-tac-toe検査 % 'tic-tac-toe検査'(LL) :- member([A,A,A],LL). 'tic-tac-toe検査'(LL) :- between(1,3,_nth1), findall(A,( member(L,LL), nth1(_nth1,L,A)), [A,A,A]). 'tic-tac-toe検査'(LL) :- 'tic-tac-toe角行検査'(LL,[1,2,3]). 'tic-tac-toe検査'(LL) :- 'tic-tac-toe角行検査'(LL,[3,2,1]). 'tic-tac-toe角行検査'(LL,_順序ならび) :- findall(L,( member(_nth1,_順序ならび), nth1(_nth1,LL,L), nth1(_nth1,L,A)), [A,A,A]). % 以下のサイトは # 出典: C/C++の宿題片付けます 167代目 #707 # 3 と 5 または両方を調べるプログラムを作る。 # 1) 数を1からカウントしていく # 2) カウントする上限を尋ねる # 3) 3の倍数の時、「アホになる」と表示 # 4) 5の倍数の時、「バカになる」と表示 # 5) 3と5の倍数の時、「ボケカス」と表示 '3 と 5 または両方を調べるプログラムを作る。 1) 数を1からカウントしていく 2) カウントする上限を尋ねる 3) 3の倍数の時、「アホになる」と表示 4) 5の倍数の時、「バカになる」と表示 5) 3と5の倍数の時、「ボケカス」と表示' :- '1) 数を1からカウントしていく'(_数), '2) カウントする上限を尋ねる'(_カウントする上限), '3) 3の倍数の時、「アホになる」と表示 4) 5の倍数の時、「バカになる」と表示 5) 3と5の倍数の時、「ボケカス」と表示'(_数,_カウントする上限), _数 >= _カウントする上限. '1) 数を1からカウントしていく'(_数) :- nth1(_数,_,_). '2) カウントする上限を尋ねる'(_カウントする上限) :- write('カウントする上限を指定して下さい : '), read(_カウントする上限). '3) 3の倍数の時、「アホになる」と表示 4) 5の倍数の時、「バカになる」と表示 5) 3と5の倍数の時、「ボケカス」と表示'(_数,_カウントする上限) :- _数 > _カウントする上限,!. '3) 3の倍数の時、「アホになる」と表示 4) 5の倍数の時、「バカになる」と表示 5) 3と5の倍数の時、「ボケカス」と表示'(_数,_カウントする上限) :- '3) 3の倍数の時、「アホになる」と表示(_数). '3) 3の倍数の時、「アホになる」と表示 4) 5の倍数の時、「バカになる」と表示 5) 3と5の倍数の時、「ボケカス」と表示'(_数,_カウントする上限) :- '4) 5の倍数の時、「バカになる」と表示'(_数). '3) 3の倍数の時、「アホになる」と表示 4) 5の倍数の時、「バカになる」と表示 5) 3と5の倍数の時、「ボケカス」と表示'(_数,_カウントする上限) :- '5) 3と5の倍数の時、「ボケカス」と表示'(_数). '3) 3の倍数の時、「アホになる」と表示'(_数) :- 0 is _数 mod 3, \+(0 is _数 mod 5), write('アホになる\n'). '4) 5の倍数の時、「バカになる」と表示'(_数) :- 0 is _数 mod 5, \+(0 is _数 mod 3), write('バカになる\n'). '5) 3と5の倍数の時、「ボケカス」と表示'(_数) :- 0 is _数 mod 3, 0 is _数 mod 5, write('ボケカス\n'). % 以下のサイトは # お題:与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。 # 例: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). % 以下のサイトは 西暦和暦表から元号に対応する西暦の順序数を得る(_元号,_西暦) :- nth1(_nth1,_,_),( \+(西暦和暦表(_西暦,_元号,_nth1)),!,fail; 西暦和暦表(_西暦,_元号,_nth1)). 西暦和暦表(645,'大化',1). 西暦和暦表(646,'大化',2). 西暦和暦表(647,'大化',3). 西暦和暦表(648,'大化',4). 西暦和暦表(649,'大化',5). 西暦和暦表(650,'大化',6). 西暦和暦表(650,'白雉',1). 西暦和暦表(651,'白雉',2). 西暦和暦表(652,'白雉',3). 西暦和暦表(653,'白雉',4). 西暦和暦表(654,'白雉',5). 西暦和暦表(686,'朱鳥',1). 西暦和暦表(687,'朱鳥',2). 西暦和暦表(701,'大宝',1). 西暦和暦表(702,'大宝',2). 西暦和暦表(703,'大宝',3). 西暦和暦表(704,'大宝',4). 西暦和暦表(704,'慶雲',1). 西暦和暦表(705,'慶雲',2). 西暦和暦表(706,'慶雲',3). 西暦和暦表(707,'慶雲',4). 西暦和暦表(708,'慶雲',5). 西暦和暦表(708,'和銅',1). 西暦和暦表(709,'和銅',2). 西暦和暦表(710,'和銅',3). 西暦和暦表(711,'和銅',4). 西暦和暦表(712,'和銅',5). 西暦和暦表(713,'和銅',6). 西暦和暦表(714,'和銅',7). 西暦和暦表(715,'和銅',8). 西暦和暦表(715,'霊亀',1). 西暦和暦表(716,'霊亀',2). 西暦和暦表(717,'霊亀',3). 西暦和暦表(717,'養老',1). 西暦和暦表(718,'養老',2). 西暦和暦表(719,'養老',3). 西暦和暦表(720,'養老',4). 西暦和暦表(721,'養老',5). 西暦和暦表(722,'養老',6). 西暦和暦表(723,'養老',7). 西暦和暦表(724,'養老',8). 西暦和暦表(724,'神亀',1). 西暦和暦表(725,'神亀',2). 西暦和暦表(726,'神亀',3). 西暦和暦表(727,'神亀',4). 西暦和暦表(728,'神亀',5). 西暦和暦表(729,'神亀',6). 西暦和暦表(729,'天平',1). 西暦和暦表(730,'天平',2). 西暦和暦表(731,'天平',3). 西暦和暦表(732,'天平',4). 西暦和暦表(733,'天平',5). 西暦和暦表(734,'天平',6). 西暦和暦表(735,'天平',7). 西暦和暦表(736,'天平',8). 西暦和暦表(737,'天平',9). 西暦和暦表(738,'天平',10). 西暦和暦表(739,'天平',11). 西暦和暦表(740,'天平',12). 西暦和暦表(741,'天平',13). 西暦和暦表(742,'天平',14). 西暦和暦表(743,'天平',15). 西暦和暦表(744,'天平',16). 西暦和暦表(745,'天平',17). 西暦和暦表(746,'天平',18). 西暦和暦表(747,'天平',19). 西暦和暦表(748,'天平',20). 西暦和暦表(749,'天平',21). 西暦和暦表(749,'天平感宝',1). 西暦和暦表(749,'天平勝宝',1). 西暦和暦表(750,'天平勝宝',2). 西暦和暦表(751,'天平勝宝',3). 西暦和暦表(752,'天平勝宝',4). 西暦和暦表(753,'天平勝宝',5). 西暦和暦表(754,'天平勝宝',6). 西暦和暦表(755,'天平勝宝',7). 西暦和暦表(756,'天平勝宝',8). 西暦和暦表(757,'天平勝宝',9). 西暦和暦表(757,'天平宝字',1). 西暦和暦表(758,'天平宝字',2). 西暦和暦表(759,'天平宝字',3). 西暦和暦表(760,'天平宝字',4). 西暦和暦表(761,'天平宝字',5). 西暦和暦表(762,'天平宝字',6). 西暦和暦表(763,'天平宝字',7). 西暦和暦表(764,'天平宝字',8). 西暦和暦表(765,'天平宝字',9). 西暦和暦表(765,'天平神護',1). 西暦和暦表(766,'天平神護',2). 西暦和暦表(767,'天平神護',3). 西暦和暦表(767,'神護景雲',1). 西暦和暦表(768,'神護景雲',2). 西暦和暦表(769,'神護景雲',3). 西暦和暦表(770,'神護景雲',4). 西暦和暦表(770,'宝亀',1). 西暦和暦表(771,'宝亀',2). 西暦和暦表(772,'宝亀',3). 西暦和暦表(773,'宝亀',4). 西暦和暦表(774,'宝亀',5). 西暦和暦表(775,'宝亀',6). 西暦和暦表(776,'宝亀',7). 西暦和暦表(777,'宝亀',8). 西暦和暦表(778,'宝亀',9). 西暦和暦表(779,'宝亀',10). 西暦和暦表(780,'宝亀',11). 西暦和暦表(781,'天応',1). 西暦和暦表(782,'天応',2). 西暦和暦表(782,'延暦',1). 西暦和暦表(783,'延暦',2). 西暦和暦表(784,'延暦',3). 西暦和暦表(785,'延暦',4). 西暦和暦表(786,'延暦',5). 西暦和暦表(787,'延暦',6). 西暦和暦表(788,'延暦',7). 西暦和暦表(789,'延暦',8). 西暦和暦表(790,'延暦',9). 西暦和暦表(791,'延暦',10). 西暦和暦表(792,'延暦',11). 西暦和暦表(793,'延暦',12). 西暦和暦表(794,'延暦',13). 西暦和暦表(795,'延暦',14). 西暦和暦表(796,'延暦',15). 西暦和暦表(797,'延暦',16). 西暦和暦表(798,'延暦',17). 西暦和暦表(799,'延暦',18). 西暦和暦表(800,'延暦',19). 西暦和暦表(801,'延暦',20). 西暦和暦表(802,'延暦',21). 西暦和暦表(803,'延暦',22). 西暦和暦表(804,'延暦',23). 西暦和暦表(805,'延暦',24). 西暦和暦表(806,'延暦',25). 西暦和暦表(806,'大同',1). 西暦和暦表(807,'大同',2). 西暦和暦表(808,'大同',3). 西暦和暦表(809,'大同',4). 西暦和暦表(810,'大同',5). 西暦和暦表(810,'弘仁',1). 西暦和暦表(811,'弘仁',2). 西暦和暦表(812,'弘仁',3). 西暦和暦表(813,'弘仁',4). 西暦和暦表(814,'弘仁',5). 西暦和暦表(815,'弘仁',6). 西暦和暦表(816,'弘仁',7). 西暦和暦表(817,'弘仁',8). 西暦和暦表(818,'弘仁',9). 西暦和暦表(819,'弘仁',10). 西暦和暦表(820,'弘仁',11). 西暦和暦表(821,'弘仁',12). 西暦和暦表(822,'弘仁',13). 西暦和暦表(823,'弘仁',14). 西暦和暦表(824,'弘仁',15). 西暦和暦表(824,'天長',1). 西暦和暦表(825,'天長',2). 西暦和暦表(826,'天長',3). 西暦和暦表(827,'天長',4). 西暦和暦表(828,'天長',5). 西暦和暦表(829,'天長',6). 西暦和暦表(830,'天長',7). 西暦和暦表(831,'天長',8). 西暦和暦表(832,'天長',9). 西暦和暦表(833,'天長',10). 西暦和暦表(834,'天長',11). 西暦和暦表(834,'承和',1). 西暦和暦表(835,'承和',2). 西暦和暦表(836,'承和',3). 西暦和暦表(837,'承和',4). 西暦和暦表(838,'承和',5). 西暦和暦表(839,'承和',6). 西暦和暦表(840,'承和',7). 西暦和暦表(841,'承和',8). 西暦和暦表(842,'承和',9). 西暦和暦表(843,'承和',10). 西暦和暦表(844,'承和',11). 西暦和暦表(845,'承和',12). 西暦和暦表(846,'承和',13). 西暦和暦表(847,'承和',14). 西暦和暦表(848,'承和',15). 西暦和暦表(848,'嘉祥',1). 西暦和暦表(849,'嘉祥',2). 西暦和暦表(850,'嘉祥',3). 西暦和暦表(851,'嘉祥',4). 西暦和暦表(851,'仁寿',1). 西暦和暦表(852,'仁寿',2). 西暦和暦表(853,'仁寿',3). 西暦和暦表(854,'仁寿',4). 西暦和暦表(854,'斉衡',1). 西暦和暦表(855,'斉衡',2). 西暦和暦表(856,'斉衡',3). 西暦和暦表(857,'斉衡',4). 西暦和暦表(857,'天安',1). 西暦和暦表(858,'天安',2). 西暦和暦表(859,'天安',3). 西暦和暦表(859,'貞観',1). 西暦和暦表(860,'貞観',2). 西暦和暦表(861,'貞観',3). 西暦和暦表(862,'貞観',4). 西暦和暦表(863,'貞観',5). 西暦和暦表(864,'貞観',6). 西暦和暦表(865,'貞観',7). 西暦和暦表(866,'貞観',8). 西暦和暦表(867,'貞観',9). 西暦和暦表(868,'貞観',10). 西暦和暦表(869,'貞観',11). 西暦和暦表(870,'貞観',12). 西暦和暦表(871,'貞観',13). 西暦和暦表(872,'貞観',14). 西暦和暦表(873,'貞観',15). 西暦和暦表(874,'貞観',16). 西暦和暦表(875,'貞観',17). 西暦和暦表(876,'貞観',18). 西暦和暦表(877,'貞観',19). 西暦和暦表(877,'元慶',1). 西暦和暦表(878,'元慶',2). 西暦和暦表(879,'元慶',3). 西暦和暦表(880,'元慶',4). 西暦和暦表(881,'元慶',5). 西暦和暦表(882,'元慶',6). 西暦和暦表(883,'元慶',7). 西暦和暦表(884,'元慶',8). 西暦和暦表(885,'元慶',9). 西暦和暦表(885,'仁和',1). 西暦和暦表(886,'仁和',2). 西暦和暦表(887,'仁和',3). 西暦和暦表(888,'仁和',4). 西暦和暦表(889,'仁和',5). 西暦和暦表(889,'寛平',1). 西暦和暦表(890,'寛平',2). 西暦和暦表(891,'寛平',3). 西暦和暦表(892,'寛平',4). 西暦和暦表(893,'寛平',5). 西暦和暦表(894,'寛平',6). 西暦和暦表(895,'寛平',7). 西暦和暦表(896,'寛平',8). 西暦和暦表(897,'寛平',9). 西暦和暦表(898,'寛平',10). 西暦和暦表(898,'昌泰',1). 西暦和暦表(899,'昌泰',2). 西暦和暦表(900,'昌泰',3). 西暦和暦表(901,'昌泰',4). 西暦和暦表(901,'延喜',1). 西暦和暦表(902,'延喜',2). 西暦和暦表(903,'延喜',3). 西暦和暦表(904,'延喜',4). 西暦和暦表(905,'延喜',5). 西暦和暦表(906,'延喜',6). 西暦和暦表(907,'延喜',7). 西暦和暦表(908,'延喜',8). 西暦和暦表(909,'延喜',9). 西暦和暦表(910,'延喜',10). 西暦和暦表(911,'延喜',11). 西暦和暦表(912,'延喜',12). 西暦和暦表(913,'延喜',13). 西暦和暦表(914,'延喜',14). 西暦和暦表(915,'延喜',15). 西暦和暦表(916,'延喜',16). 西暦和暦表(917,'延喜',17). 西暦和暦表(918,'延喜',18). 西暦和暦表(919,'延喜',19). 西暦和暦表(920,'延喜',20). 西暦和暦表(921,'延喜',21). 西暦和暦表(922,'延喜',22). 西暦和暦表(923,'延喜',23). 西暦和暦表(923,'延長',1). 西暦和暦表(924,'延長',2). 西暦和暦表(925,'延長',3). 西暦和暦表(926,'延長',4). 西暦和暦表(927,'延長',5). 西暦和暦表(928,'延長',6). 西暦和暦表(929,'延長',7). 西暦和暦表(930,'延長',8). 西暦和暦表(931,'延長',9). 西暦和暦表(931,'承平',1). 西暦和暦表(932,'承平',2). 西暦和暦表(933,'承平',3). 西暦和暦表(934,'承平',4). 西暦和暦表(935,'承平',5). 西暦和暦表(936,'承平',6). 西暦和暦表(937,'承平',7). 西暦和暦表(938,'承平',8). 西暦和暦表(938,'天慶',1). 西暦和暦表(939,'天慶',2). 西暦和暦表(940,'天慶',3). 西暦和暦表(941,'天慶',4). 西暦和暦表(942,'天慶',5). 西暦和暦表(943,'天慶',6). 西暦和暦表(944,'天慶',7). 西暦和暦表(945,'天慶',8). 西暦和暦表(946,'天慶',9). 西暦和暦表(947,'天慶',10). 西暦和暦表(947,'天暦',1). 西暦和暦表(948,'天暦',2). 西暦和暦表(949,'天暦',3). 西暦和暦表(950,'天暦',4). 西暦和暦表(951,'天暦',5). 西暦和暦表(952,'天暦',6). 西暦和暦表(953,'天暦',7). 西暦和暦表(954,'天暦',8). 西暦和暦表(955,'天暦',9). 西暦和暦表(956,'天暦',10). 西暦和暦表(957,'天暦',11). 西暦和暦表(957,'天徳',1). 西暦和暦表(958,'天徳',2). 西暦和暦表(959,'天徳',3). 西暦和暦表(960,'天徳',4). 西暦和暦表(961,'天徳',5). 西暦和暦表(961,'応和',1). 西暦和暦表(962,'応和',2). 西暦和暦表(963,'応和',3). 西暦和暦表(964,'応和',4). 西暦和暦表(964,'康保',1). 西暦和暦表(965,'康保',2). 西暦和暦表(966,'康保',3). 西暦和暦表(967,'康保',4). 西暦和暦表(968,'康保',5). 西暦和暦表(968,'安和',1). 西暦和暦表(969,'安和',2). 西暦和暦表(970,'安和',3). 西暦和暦表(970,'天禄',1). 西暦和暦表(971,'天禄',2). 西暦和暦表(972,'天禄',3). 西暦和暦表(973,'天禄',4). 西暦和暦表(973,'天延',1). 西暦和暦表(974,'天延',2). 西暦和暦表(975,'天延',3). 西暦和暦表(976,'天延',4). 西暦和暦表(976,'貞元',1). 西暦和暦表(977,'貞元',2). 西暦和暦表(978,'貞元',3). 西暦和暦表(978,'天元',1). 西暦和暦表(979,'天元',2). 西暦和暦表(980,'天元',3). 西暦和暦表(981,'天元',4). 西暦和暦表(982,'天元',5). 西暦和暦表(983,'天元',6). 西暦和暦表(983,'永観',1). 西暦和暦表(984,'永観',2). 西暦和暦表(985,'永観',3). 西暦和暦表(985,'寛和',1). 西暦和暦表(986,'寛和',2). 西暦和暦表(987,'寛和',3). 西暦和暦表(987,'永延',1). 西暦和暦表(988,'永延',2). 西暦和暦表(989,'永延',3). 西暦和暦表(989,'永祚',1). 西暦和暦表(990,'永祚',2). 西暦和暦表(990,'正暦',1). 西暦和暦表(991,'正暦',2). 西暦和暦表(992,'正暦',3). 西暦和暦表(993,'正暦',4). 西暦和暦表(994,'正暦',5). 西暦和暦表(995,'正暦',6). 西暦和暦表(995,'長徳',1). 西暦和暦表(996,'長徳',2). 西暦和暦表(997,'長徳',3). 西暦和暦表(998,'長徳',4). 西暦和暦表(999,'長徳',5). 西暦和暦表(999,'長保',1). 西暦和暦表(1000,'長保',2). 西暦和暦表(1001,'長保',3). 西暦和暦表(1002,'長保',4). 西暦和暦表(1003,'長保',5). 西暦和暦表(1004,'長保',6). 西暦和暦表(1004,'寛弘',1). 西暦和暦表(1005,'寛弘',2). 西暦和暦表(1006,'寛弘',3). 西暦和暦表(1007,'寛弘',4). 西暦和暦表(1008,'寛弘',5). 西暦和暦表(1009,'寛弘',6). 西暦和暦表(1010,'寛弘',7). 西暦和暦表(1011,'寛弘',8). 西暦和暦表(1012,'寛弘',9). 西暦和暦表(1012,'長和',1). 西暦和暦表(1013,'長和',2). 西暦和暦表(1014,'長和',3). 西暦和暦表(1015,'長和',4). 西暦和暦表(1016,'長和',5). 西暦和暦表(1017,'長和',6). 西暦和暦表(1017,'寛仁',1). 西暦和暦表(1018,'寛仁',2). 西暦和暦表(1019,'寛仁',3). 西暦和暦表(1020,'寛仁',4). 西暦和暦表(1021,'寛仁',5). 西暦和暦表(1021,'治安',1). 西暦和暦表(1022,'治安',2). 西暦和暦表(1023,'治安',3). 西暦和暦表(1024,'治安',4). 西暦和暦表(1024,'万寿',1). 西暦和暦表(1025,'万寿',2). 西暦和暦表(1026,'万寿',3). 西暦和暦表(1027,'万寿',4). 西暦和暦表(1028,'万寿',5). 西暦和暦表(1028,'長元',1). 西暦和暦表(1029,'長元',2). 西暦和暦表(1030,'長元',3). 西暦和暦表(1031,'長元',4). 西暦和暦表(1032,'長元',5). 西暦和暦表(1033,'長元',6). 西暦和暦表(1034,'長元',7). 西暦和暦表(1035,'長元',8). 西暦和暦表(1036,'長元',9). 西暦和暦表(1037,'長元',10). 西暦和暦表(1037,'長暦',1). 西暦和暦表(1038,'長暦',2). 西暦和暦表(1039,'長暦',3). 西暦和暦表(1040,'長暦',4). 西暦和暦表(1040,'長久',1). 西暦和暦表(1041,'長久',2). 西暦和暦表(1042,'長久',3). 西暦和暦表(1043,'長久',4). 西暦和暦表(1044,'長久',5). 西暦和暦表(1044,'寛徳',1). 西暦和暦表(1045,'寛徳',2). 西暦和暦表(1046,'寛徳',3). 西暦和暦表(1046,'永承',1). 西暦和暦表(1047,'永承',2). 西暦和暦表(1048,'永承',3). 西暦和暦表(1049,'永承',4). 西暦和暦表(1050,'永承',5). 西暦和暦表(1051,'永承',6). 西暦和暦表(1052,'永承',7). 西暦和暦表(1053,'永承',8). 西暦和暦表(1053,'天喜',1). 西暦和暦表(1054,'天喜',2). 西暦和暦表(1055,'天喜',3). 西暦和暦表(1056,'天喜',4). 西暦和暦表(1057,'天喜',5). 西暦和暦表(1058,'天喜',6). 西暦和暦表(1058,'康平',1). 西暦和暦表(1059,'康平',2). 西暦和暦表(1060,'康平',3). 西暦和暦表(1061,'康平',4). 西暦和暦表(1062,'康平',5). 西暦和暦表(1063,'康平',6). 西暦和暦表(1064,'康平',7). 西暦和暦表(1065,'康平',8). 西暦和暦表(1065,'治暦',1). 西暦和暦表(1066,'治暦',2). 西暦和暦表(1067,'治暦',3). 西暦和暦表(1068,'治暦',4). 西暦和暦表(1069,'治暦',5). 西暦和暦表(1069,'延久',1). 西暦和暦表(1070,'延久',2). 西暦和暦表(1071,'延久',3). 西暦和暦表(1072,'延久',4). 西暦和暦表(1073,'延久',5). 西暦和暦表(1074,'延久',6). 西暦和暦表(1074,'承保',1). 西暦和暦表(1075,'承保',2). 西暦和暦表(1076,'承保',3). 西暦和暦表(1077,'承保',4). 西暦和暦表(1077,'承暦',1). 西暦和暦表(1078,'承暦',2). 西暦和暦表(1079,'承暦',3). 西暦和暦表(1080,'承暦',4). 西暦和暦表(1081,'承暦',5). 西暦和暦表(1081,'永保',1). 西暦和暦表(1082,'永保',2). 西暦和暦表(1083,'永保',3). 西暦和暦表(1084,'永保',4). 西暦和暦表(1084,'応徳',1). 西暦和暦表(1085,'応徳',2). 西暦和暦表(1086,'応徳',3). 西暦和暦表(1087,'応徳',4). 西暦和暦表(1087,'寛治',1). 西暦和暦表(1088,'寛治',2). 西暦和暦表(1089,'寛治',3). 西暦和暦表(1090,'寛治',4). 西暦和暦表(1091,'寛治',5). 西暦和暦表(1092,'寛治',6). 西暦和暦表(1093,'寛治',7). 西暦和暦表(1094,'寛治',8). 西暦和暦表(1094,'嘉保',1). 西暦和暦表(1095,'嘉保',2). 西暦和暦表(1096,'嘉保',3). 西暦和暦表(1096,'永長',1). 西暦和暦表(1097,'永長',2). 西暦和暦表(1097,'承徳',1). 西暦和暦表(1098,'承徳',2). 西暦和暦表(1099,'承徳',3). 西暦和暦表(1099,'康和',1). 西暦和暦表(1100,'康和',2). 西暦和暦表(1101,'康和',3). 西暦和暦表(1102,'康和',4). 西暦和暦表(1103,'康和',5). 西暦和暦表(1104,'康和',6). 西暦和暦表(1104,'長治',1). 西暦和暦表(1105,'長治',2). 西暦和暦表(1106,'長治',3). 西暦和暦表(1106,'嘉承',1). 西暦和暦表(1107,'嘉承',2). 西暦和暦表(1108,'嘉承',3). 西暦和暦表(1108,'天仁',1). 西暦和暦表(1109,'天仁',2). 西暦和暦表(1110,'天仁',3). 西暦和暦表(1110,'天永',1). 西暦和暦表(1111,'天永',2). 西暦和暦表(1112,'天永',3). 西暦和暦表(1113,'天永',4). 西暦和暦表(1113,'永久',1). 西暦和暦表(1114,'永久',2). 西暦和暦表(1115,'永久',3). 西暦和暦表(1116,'永久',4). 西暦和暦表(1117,'永久',5). 西暦和暦表(1118,'永久',6). 西暦和暦表(1118,'元永',1). 西暦和暦表(1119,'元永',2). 西暦和暦表(1120,'元永',3). 西暦和暦表(1120,'保安',1). 西暦和暦表(1121,'保安',2). 西暦和暦表(1122,'保安',3). 西暦和暦表(1123,'保安',4). 西暦和暦表(1124,'保安',5). 西暦和暦表(1124,'天治',1). 西暦和暦表(1125,'天治',2). 西暦和暦表(1126,'天治',3). 西暦和暦表(1126,'大治',1). 西暦和暦表(1127,'大治',2). 西暦和暦表(1128,'大治',3). 西暦和暦表(1129,'大治',4). 西暦和暦表(1130,'大治',5). 西暦和暦表(1131,'大治',6). 西暦和暦表(1131,'天承',1). 西暦和暦表(1132,'天承',2). 西暦和暦表(1132,'長承',1). 西暦和暦表(1133,'長承',2). 西暦和暦表(1134,'長承',3). 西暦和暦表(1135,'長承',4). 西暦和暦表(1135,'保延',1). 西暦和暦表(1136,'保延',2). 西暦和暦表(1137,'保延',3). 西暦和暦表(1138,'保延',4). 西暦和暦表(1139,'保延',5). 西暦和暦表(1140,'保延',6). 西暦和暦表(1141,'保延',7). 西暦和暦表(1141,'永治',1). 西暦和暦表(1142,'永治',2). 西暦和暦表(1142,'康治',1). 西暦和暦表(1143,'康治',2). 西暦和暦表(1144,'康治',3). 西暦和暦表(1144,'天養',1). 西暦和暦表(1145,'天養',2). 西暦和暦表(1145,'久安',1). 西暦和暦表(1146,'久安',2). 西暦和暦表(1147,'久安',3). 西暦和暦表(1148,'久安',4). 西暦和暦表(1149,'久安',5). 西暦和暦表(1150,'久安',6). 西暦和暦表(1151,'久安',7). 西暦和暦表(1151,'仁平',1). 西暦和暦表(1152,'仁平',2). 西暦和暦表(1153,'仁平',3). 西暦和暦表(1154,'仁平',4). 西暦和暦表(1154,'久寿',1). 西暦和暦表(1155,'久寿',2). 西暦和暦表(1156,'久寿',3). 西暦和暦表(1156,'保元',1). 西暦和暦表(1157,'保元',2). 西暦和暦表(1158,'保元',3). 西暦和暦表(1159,'保元',4). 西暦和暦表(1159,'平治',1). 西暦和暦表(1160,'平治',2). 西暦和暦表(1160,'永暦',1). 西暦和暦表(1161,'永暦',2). 西暦和暦表(1161,'応保',1). 西暦和暦表(1162,'応保',2). 西暦和暦表(1163,'応保',3). 西暦和暦表(1163,'長寛',1). 西暦和暦表(1164,'長寛',2). 西暦和暦表(1165,'長寛',3). 西暦和暦表(1165,'永万',1). 西暦和暦表(1166,'永万',2). 西暦和暦表(1166,'仁安',1). 西暦和暦表(1167,'仁安',2). 西暦和暦表(1168,'仁安',3). 西暦和暦表(1169,'仁安',4). 西暦和暦表(1169,'嘉応',1). 西暦和暦表(1170,'嘉応',2). 西暦和暦表(1171,'嘉応',3). 西暦和暦表(1171,'承安',1). 西暦和暦表(1172,'承安',2). 西暦和暦表(1173,'承安',3). 西暦和暦表(1174,'承安',4). 西暦和暦表(1175,'承安',5). 西暦和暦表(1175,'安元',1). 西暦和暦表(1176,'安元',2). 西暦和暦表(1177,'安元',3). 西暦和暦表(1177,'治承',1). 西暦和暦表(1178,'治承',2). 西暦和暦表(1179,'治承',3). 西暦和暦表(1180,'治承',4). 西暦和暦表(1181,'治承',5). 西暦和暦表(1181,'養和',1). 西暦和暦表(1182,'養和',2). 西暦和暦表(1182,'寿永',1). 西暦和暦表(1183,'寿永',2). 西暦和暦表(1184,'寿永',3). 西暦和暦表(1185,'寿永',4). 西暦和暦表(1185,'文治',1). 西暦和暦表(1186,'文治',2). 西暦和暦表(1187,'文治',3). 西暦和暦表(1188,'文治',4). 西暦和暦表(1189,'文治',5). 西暦和暦表(1190,'文治',6). 西暦和暦表(1190,'建久',1). 西暦和暦表(1191,'建久',2). 西暦和暦表(1192,'建久',3). 西暦和暦表(1193,'建久',4). 西暦和暦表(1194,'建久',5). 西暦和暦表(1195,'建久',6). 西暦和暦表(1196,'建久',7). 西暦和暦表(1197,'建久',8). 西暦和暦表(1198,'建久',9). 西暦和暦表(1199,'建久',10). 西暦和暦表(1199,'正治',1). 西暦和暦表(1200,'正治',2). 西暦和暦表(1201,'正治',3). 西暦和暦表(1201,'建仁',1). 西暦和暦表(1202,'建仁',2). 西暦和暦表(1203,'建仁',3). 西暦和暦表(1204,'建仁',4). 西暦和暦表(1204,'元久',1). 西暦和暦表(1205,'元久',2). 西暦和暦表(1206,'元久',3). 西暦和暦表(1206,'建永',1). 西暦和暦表(1207,'建永',2). 西暦和暦表(1207,'承元',1). 西暦和暦表(1208,'承元',2). 西暦和暦表(1209,'承元',3). 西暦和暦表(1210,'承元',4). 西暦和暦表(1211,'承元',5). 西暦和暦表(1211,'建暦',1). 西暦和暦表(1212,'建暦',2). 西暦和暦表(1213,'建暦',3). 西暦和暦表(1213,'建保',1). 西暦和暦表(1214,'建保',2). 西暦和暦表(1215,'建保',3). 西暦和暦表(1216,'建保',4). 西暦和暦表(1217,'建保',5). 西暦和暦表(1218,'建保',6). 西暦和暦表(1219,'建保',7). 西暦和暦表(1219,'承久',1). 西暦和暦表(1220,'承久',2). 西暦和暦表(1221,'承久',3). 西暦和暦表(1222,'承久',4). 西暦和暦表(1222,'貞応',1). 西暦和暦表(1223,'貞応',2). 西暦和暦表(1224,'貞応',3). 西暦和暦表(1224,'元仁',1). 西暦和暦表(1225,'元仁',2). 西暦和暦表(1225,'嘉祿',1). 西暦和暦表(1226,'嘉祿',2). 西暦和暦表(1227,'嘉祿',3). 西暦和暦表(1227,'安貞',1). 西暦和暦表(1228,'安貞',2). 西暦和暦表(1229,'安貞',3). 西暦和暦表(1229,'寛喜',1). 西暦和暦表(1230,'寛喜',2). 西暦和暦表(1231,'寛喜',3). 西暦和暦表(1232,'寛喜',4). 西暦和暦表(1232,'貞永',1). 西暦和暦表(1233,'貞永',2). 西暦和暦表(1233,'天福',1). 西暦和暦表(1234,'天福',2). 西暦和暦表(1234,'文暦',1). 西暦和暦表(1235,'文暦',2). 西暦和暦表(1235,'嘉禎',1). 西暦和暦表(1236,'嘉禎',2). 西暦和暦表(1237,'嘉禎',3). 西暦和暦表(1238,'嘉禎',4). 西暦和暦表(1238,'暦仁',1). 西暦和暦表(1239,'暦仁',2). 西暦和暦表(1239,'延応',1). 西暦和暦表(1240,'延応',2). 西暦和暦表(1240,'仁治',1). 西暦和暦表(1241,'仁治',2). 西暦和暦表(1242,'仁治',3). 西暦和暦表(1243,'仁治',4). 西暦和暦表(1243,'寛元',1). 西暦和暦表(1244,'寛元',2). 西暦和暦表(1245,'寛元',3). 西暦和暦表(1246,'寛元',4). 西暦和暦表(1247,'寛元',5). 西暦和暦表(1247,'宝治',1). 西暦和暦表(1248,'宝治',2). 西暦和暦表(1249,'宝治',3). 西暦和暦表(1249,'建長',1). 西暦和暦表(1250,'建長',2). 西暦和暦表(1251,'建長',3). 西暦和暦表(1252,'建長',4). 西暦和暦表(1253,'建長',5). 西暦和暦表(1254,'建長',6). 西暦和暦表(1255,'建長',7). 西暦和暦表(1256,'建長',8). 西暦和暦表(1256,'康元',1). 西暦和暦表(1257,'康元',2). 西暦和暦表(1257,'正嘉',1). 西暦和暦表(1258,'正嘉',2). 西暦和暦表(1259,'正嘉',3). 西暦和暦表(1259,'正元',1). 西暦和暦表(1260,'正元',2). 西暦和暦表(1260,'文応',1). 西暦和暦表(1261,'文応',2). 西暦和暦表(1261,'弘長',1). 西暦和暦表(1262,'弘長',2). 西暦和暦表(1263,'弘長',3). 西暦和暦表(1264,'弘長',4). 西暦和暦表(1264,'文永',1). 西暦和暦表(1265,'文永',2). 西暦和暦表(1266,'文永',3). 西暦和暦表(1267,'文永',4). 西暦和暦表(1268,'文永',5). 西暦和暦表(1269,'文永',6). 西暦和暦表(1270,'文永',7). 西暦和暦表(1271,'文永',8). 西暦和暦表(1272,'文永',9). 西暦和暦表(1273,'文永',10). 西暦和暦表(1274,'文永',11). 西暦和暦表(1275,'文永',12). 西暦和暦表(1275,'建治',1). 西暦和暦表(1276,'建治',2). 西暦和暦表(1277,'建治',3). 西暦和暦表(1278,'建治',4). 西暦和暦表(1278,'弘安',1). 西暦和暦表(1279,'弘安',2). 西暦和暦表(1280,'弘安',3). 西暦和暦表(1281,'弘安',4). 西暦和暦表(1282,'弘安',5). 西暦和暦表(1283,'弘安',6). 西暦和暦表(1284,'弘安',7). 西暦和暦表(1285,'弘安',8). 西暦和暦表(1286,'弘安',9). 西暦和暦表(1287,'弘安',10). 西暦和暦表(1288,'弘安',11). 西暦和暦表(1288,'正応',1). 西暦和暦表(1289,'正応',2). 西暦和暦表(1290,'正応',3). 西暦和暦表(1291,'正応',4). 西暦和暦表(1292,'正応',5). 西暦和暦表(1293,'正応',6). 西暦和暦表(1293,'永仁',1). 西暦和暦表(1294,'永仁',2). 西暦和暦表(1295,'永仁',3). 西暦和暦表(1296,'永仁',4). 西暦和暦表(1297,'永仁',5). 西暦和暦表(1298,'永仁',6). 西暦和暦表(1299,'永仁',7). 西暦和暦表(1299,'正安',1). 西暦和暦表(1300,'正安',2). 西暦和暦表(1301,'正安',3). 西暦和暦表(1302,'正安',4). 西暦和暦表(1302,'乾元',1). 西暦和暦表(1303,'乾元',2). 西暦和暦表(1303,'嘉元',1). 西暦和暦表(1304,'嘉元',2). 西暦和暦表(1305,'嘉元',3). 西暦和暦表(1306,'嘉元',4). 西暦和暦表(1306,'徳治',1). 西暦和暦表(1307,'徳治',2). 西暦和暦表(1308,'徳治',3). 西暦和暦表(1308,'延慶',1). 西暦和暦表(1309,'延慶',2). 西暦和暦表(1310,'延慶',3). 西暦和暦表(1311,'延慶',4). 西暦和暦表(1311,'応長',1). 西暦和暦表(1312,'応長',2). 西暦和暦表(1312,'正和',1). 西暦和暦表(1313,'正和',2). 西暦和暦表(1314,'正和',3). 西暦和暦表(1315,'正和',4). 西暦和暦表(1316,'正和',5). 西暦和暦表(1317,'正和',6). 西暦和暦表(1317,'文保',1). 西暦和暦表(1318,'文保',2). 西暦和暦表(1319,'文保',3). 西暦和暦表(1319,'元応',1). 西暦和暦表(1320,'元応',2). 西暦和暦表(1321,'元応',3). 西暦和暦表(1321,'元亨',1). 西暦和暦表(1322,'元亨',2). 西暦和暦表(1323,'元亨',3). 西暦和暦表(1324,'元亨',4). 西暦和暦表(1324,'正中',1). 西暦和暦表(1325,'正中',2). 西暦和暦表(1326,'正中',3). 西暦和暦表(1326,'嘉暦',1). 西暦和暦表(1327,'嘉暦',2). 西暦和暦表(1328,'嘉暦',3). 西暦和暦表(1329,'嘉暦',4). 西暦和暦表(1329,'元徳',1). 西暦和暦表(1330,'元徳',2). 西暦和暦表(1331,'元徳',3). 西暦和暦表(1331,'元弘',1). 西暦和暦表(1332,'元弘',2). 西暦和暦表(1332,'正慶',1). 西暦和暦表(1333,'正慶',2). 西暦和暦表(1334,'正慶',3). 西暦和暦表(1334,'建武',1). 西暦和暦表(1335,'建武',2). 西暦和暦表(1336,'建武',3). 西暦和暦表(1337,'建武',4). 西暦和暦表(1338,'建武',5). 西暦和暦表(1338,'暦応',1). 西暦和暦表(1339,'暦応',2). 西暦和暦表(1340,'暦応',3). 西暦和暦表(1341,'暦応',4). 西暦和暦表(1342,'暦応',5). 西暦和暦表(1342,'康永',1). 西暦和暦表(1343,'康永',2). 西暦和暦表(1344,'康永',3). 西暦和暦表(1345,'康永',4). 西暦和暦表(1345,'貞和',1). 西暦和暦表(1346,'貞和',2). 西暦和暦表(1347,'貞和',3). 西暦和暦表(1348,'貞和',4). 西暦和暦表(1349,'貞和',5). 西暦和暦表(1350,'貞和',6). 西暦和暦表(1350,'観応',1). 西暦和暦表(1351,'観応',2). 西暦和暦表(1352,'観応',3). 西暦和暦表(1352,'文和',1). 西暦和暦表(1353,'文和',2). 西暦和暦表(1354,'文和',3). 西暦和暦表(1355,'文和',4). 西暦和暦表(1356,'文和',5). 西暦和暦表(1356,'延文',1). 西暦和暦表(1357,'延文',2). 西暦和暦表(1358,'延文',3). 西暦和暦表(1359,'延文',4). 西暦和暦表(1360,'延文',5). 西暦和暦表(1361,'延文',6). 西暦和暦表(1361,'康安',1). 西暦和暦表(1362,'康安',2). 西暦和暦表(1362,'貞治',1). 西暦和暦表(1363,'貞治',2). 西暦和暦表(1364,'貞治',3). 西暦和暦表(1365,'貞治',4). 西暦和暦表(1366,'貞治',5). 西暦和暦表(1367,'貞治',6). 西暦和暦表(1368,'貞治',7). 西暦和暦表(1368,'応安',1). 西暦和暦表(1369,'応安',2). 西暦和暦表(1370,'応安',3). 西暦和暦表(1371,'応安',4). 西暦和暦表(1372,'応安',5). 西暦和暦表(1373,'応安',6). 西暦和暦表(1374,'応安',7). 西暦和暦表(1375,'応安',8). 西暦和暦表(1375,'永和',1). 西暦和暦表(1376,'永和',2). 西暦和暦表(1377,'永和',3). 西暦和暦表(1378,'永和',4). 西暦和暦表(1379,'永和',5). 西暦和暦表(1379,'康暦',1). 西暦和暦表(1380,'康暦',2). 西暦和暦表(1381,'康暦',3). 西暦和暦表(1381,'永徳',1). 西暦和暦表(1382,'永徳',2). 西暦和暦表(1383,'永徳',3). 西暦和暦表(1384,'永徳',4). 西暦和暦表(1384,'至徳',1). 西暦和暦表(1385,'至徳',2). 西暦和暦表(1386,'至徳',3). 西暦和暦表(1387,'至徳',4). 西暦和暦表(1387,'嘉慶',1). 西暦和暦表(1388,'嘉慶',2). 西暦和暦表(1389,'嘉慶',3). 西暦和暦表(1389,'康応',1). 西暦和暦表(1390,'康応',2). 西暦和暦表(1390,'明徳',1). 西暦和暦表(1391,'明徳',2). 西暦和暦表(1392,'明徳',3). 西暦和暦表(1393,'明徳',4). 西暦和暦表(1394,'明徳',5). 西暦和暦表(1394,'応永',1). 西暦和暦表(1395,'応永',2). 西暦和暦表(1396,'応永',3). 西暦和暦表(1397,'応永',4). 西暦和暦表(1398,'応永',5). 西暦和暦表(1399,'応永',6). 西暦和暦表(1400,'応永',7). 西暦和暦表(1401,'応永',8). 西暦和暦表(1402,'応永',9). 西暦和暦表(1403,'応永',10). 西暦和暦表(1404,'応永',11). 西暦和暦表(1405,'応永',12). 西暦和暦表(1406,'応永',13). 西暦和暦表(1407,'応永',14). 西暦和暦表(1408,'応永',15). 西暦和暦表(1409,'応永',16). 西暦和暦表(1410,'応永',17). 西暦和暦表(1411,'応永',18). 西暦和暦表(1412,'応永',19). 西暦和暦表(1413,'応永',20). 西暦和暦表(1414,'応永',21). 西暦和暦表(1415,'応永',22). 西暦和暦表(1416,'応永',23). 西暦和暦表(1417,'応永',24). 西暦和暦表(1418,'応永',25). 西暦和暦表(1419,'応永',26). 西暦和暦表(1420,'応永',27). 西暦和暦表(1421,'応永',28). 西暦和暦表(1422,'応永',29). 西暦和暦表(1423,'応永',30). 西暦和暦表(1424,'応永',31). 西暦和暦表(1425,'応永',32). 西暦和暦表(1426,'応永',33). 西暦和暦表(1427,'応永',34). 西暦和暦表(1428,'応永',35). 西暦和暦表(1428,'正長',1). 西暦和暦表(1429,'正長',2). 西暦和暦表(1429,'永享',1). 西暦和暦表(1430,'永享',2). 西暦和暦表(1431,'永享',3). 西暦和暦表(1432,'永享',4). 西暦和暦表(1433,'永享',5). 西暦和暦表(1434,'永享',6). 西暦和暦表(1435,'永享',7). 西暦和暦表(1436,'永享',8). 西暦和暦表(1437,'永享',9). 西暦和暦表(1438,'永享',10). 西暦和暦表(1439,'永享',11). 西暦和暦表(1440,'永享',12). 西暦和暦表(1441,'永享',13). 西暦和暦表(1441,'嘉吉',1). 西暦和暦表(1442,'嘉吉',2). 西暦和暦表(1443,'嘉吉',3). 西暦和暦表(1444,'嘉吉',4). 西暦和暦表(1444,'文安',1). 西暦和暦表(1445,'文安',2). 西暦和暦表(1446,'文安',3). 西暦和暦表(1447,'文安',4). 西暦和暦表(1448,'文安',5). 西暦和暦表(1449,'文安',6). 西暦和暦表(1449,'宝徳',1). 西暦和暦表(1450,'宝徳',2). 西暦和暦表(1451,'宝徳',3). 西暦和暦表(1452,'宝徳',4). 西暦和暦表(1452,'享徳',1). 西暦和暦表(1453,'享徳',2). 西暦和暦表(1454,'享徳',3). 西暦和暦表(1455,'享徳',4). 西暦和暦表(1455,'康正',1). 西暦和暦表(1456,'康正',2). 西暦和暦表(1457,'康正',3). 西暦和暦表(1457,'長祿',1). 西暦和暦表(1458,'長祿',2). 西暦和暦表(1459,'長祿',3). 西暦和暦表(1460,'長祿',4). 西暦和暦表(1460,'寛正',1). 西暦和暦表(1461,'寛正',2). 西暦和暦表(1462,'寛正',3). 西暦和暦表(1463,'寛正',4). 西暦和暦表(1464,'寛正',5). 西暦和暦表(1465,'寛正',6). 西暦和暦表(1466,'寛正',7). 西暦和暦表(1466,'文正',1). 西暦和暦表(1467,'文正',2). 西暦和暦表(1467,'応仁',1). 西暦和暦表(1468,'応仁',2). 西暦和暦表(1469,'応仁',3). 西暦和暦表(1469,'文明',1). 西暦和暦表(1470,'文明',2). 西暦和暦表(1471,'文明',3). 西暦和暦表(1472,'文明',4). 西暦和暦表(1473,'文明',5). 西暦和暦表(1474,'文明',6). 西暦和暦表(1475,'文明',7). 西暦和暦表(1476,'文明',8). 西暦和暦表(1477,'文明',9). 西暦和暦表(1478,'文明',10). 西暦和暦表(1479,'文明',11). 西暦和暦表(1480,'文明',12). 西暦和暦表(1481,'文明',13). 西暦和暦表(1482,'文明',14). 西暦和暦表(1483,'文明',15). 西暦和暦表(1484,'文明',16). 西暦和暦表(1485,'文明',17). 西暦和暦表(1486,'文明',18). 西暦和暦表(1487,'文明',19). 西暦和暦表(1487,'長享',1). 西暦和暦表(1488,'長享',2). 西暦和暦表(1489,'長享',3). 西暦和暦表(1489,'延徳',1). 西暦和暦表(1490,'延徳',2). 西暦和暦表(1491,'延徳',3). 西暦和暦表(1492,'延徳',4). 西暦和暦表(1492,'明応',1). 西暦和暦表(1493,'明応',2). 西暦和暦表(1494,'明応',3). 西暦和暦表(1495,'明応',4). 西暦和暦表(1496,'明応',5). 西暦和暦表(1497,'明応',6). 西暦和暦表(1498,'明応',7). 西暦和暦表(1499,'明応',8). 西暦和暦表(1500,'明応',9). 西暦和暦表(1501,'明応',10). 西暦和暦表(1501,'文龜',1). 西暦和暦表(1502,'文龜',2). 西暦和暦表(1503,'文龜',3). 西暦和暦表(1504,'文龜',4). 西暦和暦表(1504,'永正',1). 西暦和暦表(1505,'永正',2). 西暦和暦表(1506,'永正',3). 西暦和暦表(1507,'永正',4). 西暦和暦表(1508,'永正',5). 西暦和暦表(1509,'永正',6). 西暦和暦表(1510,'永正',7). 西暦和暦表(1511,'永正',8). 西暦和暦表(1512,'永正',9). 西暦和暦表(1513,'永正',10). 西暦和暦表(1514,'永正',11). 西暦和暦表(1515,'永正',12). 西暦和暦表(1516,'永正',13). 西暦和暦表(1517,'永正',14). 西暦和暦表(1518,'永正',15). 西暦和暦表(1519,'永正',16). 西暦和暦表(1520,'永正',17). 西暦和暦表(1521,'永正',18). 西暦和暦表(1521,'大永',1). 西暦和暦表(1522,'大永',2). 西暦和暦表(1523,'大永',3). 西暦和暦表(1524,'大永',4). 西暦和暦表(1525,'大永',5). 西暦和暦表(1526,'大永',6). 西暦和暦表(1527,'大永',7). 西暦和暦表(1528,'大永',8). 西暦和暦表(1528,'享祿',1). 西暦和暦表(1529,'享祿',2). 西暦和暦表(1530,'享祿',3). 西暦和暦表(1531,'享祿',4). 西暦和暦表(1532,'享祿',5). 西暦和暦表(1532,'天文',1). 西暦和暦表(1533,'天文',2). 西暦和暦表(1534,'天文',3). 西暦和暦表(1535,'天文',4). 西暦和暦表(1536,'天文',5). 西暦和暦表(1537,'天文',6). 西暦和暦表(1538,'天文',7). 西暦和暦表(1539,'天文',8). 西暦和暦表(1540,'天文',9). 西暦和暦表(1541,'天文',10). 西暦和暦表(1542,'天文',11). 西暦和暦表(1543,'天文',12). 西暦和暦表(1544,'天文',13). 西暦和暦表(1545,'天文',14). 西暦和暦表(1546,'天文',15). 西暦和暦表(1547,'天文',16). 西暦和暦表(1548,'天文',17). 西暦和暦表(1549,'天文',18). 西暦和暦表(1550,'天文',19). 西暦和暦表(1551,'天文',20). 西暦和暦表(1552,'天文',21). 西暦和暦表(1553,'天文',22). 西暦和暦表(1554,'天文',23). 西暦和暦表(1555,'天文',24). 西暦和暦表(1555,'弘治',1). 西暦和暦表(1556,'弘治',2). 西暦和暦表(1557,'弘治',3). 西暦和暦表(1558,'弘治',4). 西暦和暦表(1558,'永祿',1). 西暦和暦表(1559,'永祿',2). 西暦和暦表(1560,'永祿',3). 西暦和暦表(1561,'永祿',4). 西暦和暦表(1562,'永祿',5). 西暦和暦表(1563,'永祿',6). 西暦和暦表(1564,'永禄',7). 西暦和暦表(1565,'永禄',8). 西暦和暦表(1566,'永禄',9). 西暦和暦表(1567,'永禄',10). 西暦和暦表(1568,'永禄',11). 西暦和暦表(1569,'永禄',12). 西暦和暦表(1570,'永禄',13). 西暦和暦表(1570,'元龜',1). 西暦和暦表(1571,'元龜',2). 西暦和暦表(1572,'元龜',3). 西暦和暦表(1573,'元龜',4). 西暦和暦表(1573,'天正',1). 西暦和暦表(1574,'天正',2). 西暦和暦表(1575,'天正',3). 西暦和暦表(1576,'天正',4). 西暦和暦表(1577,'天正',5). 西暦和暦表(1578,'天正',6). 西暦和暦表(1579,'天正',7). 西暦和暦表(1580,'天正',8). 西暦和暦表(1581,'天正',9). 西暦和暦表(1582,'天正',10). 西暦和暦表(1583,'天正',11). 西暦和暦表(1584,'天正',12). 西暦和暦表(1585,'天正',13). 西暦和暦表(1586,'天正',14). 西暦和暦表(1587,'天正',15). 西暦和暦表(1588,'天正',16). 西暦和暦表(1589,'天正',17). 西暦和暦表(1590,'天正',18). 西暦和暦表(1591,'天正',19). 西暦和暦表(1592,'天正',20). 西暦和暦表(1592,'文禄',1). 西暦和暦表(1593,'文禄',2). 西暦和暦表(1594,'文禄',3). 西暦和暦表(1595,'文禄',4). 西暦和暦表(1596,'文禄',5). 西暦和暦表(1596,'慶長',1). 西暦和暦表(1597,'慶長',2). 西暦和暦表(1598,'慶長',3). 西暦和暦表(1599,'慶長',4). 西暦和暦表(1600,'慶長',5). 西暦和暦表(1601,'慶長',6). 西暦和暦表(1602,'慶長',7). 西暦和暦表(1603,'慶長',8). 西暦和暦表(1604,'慶長',9). 西暦和暦表(1605,'慶長',10). 西暦和暦表(1606,'慶長',11). 西暦和暦表(1607,'慶長',12). 西暦和暦表(1608,'慶長',13). 西暦和暦表(1609,'慶長',14). 西暦和暦表(1610,'慶長',15). 西暦和暦表(1611,'慶長',16). 西暦和暦表(1612,'慶長',17). 西暦和暦表(1613,'慶長',18). 西暦和暦表(1614,'慶長',19). 西暦和暦表(1615,'慶長',20). 西暦和暦表(1615,'元和',1). 西暦和暦表(1616,'元和',2). 西暦和暦表(1617,'元和',3). 西暦和暦表(1618,'元和',4). 西暦和暦表(1619,'元和',5). 西暦和暦表(1620,'元和',6). 西暦和暦表(1621,'元和',7). 西暦和暦表(1622,'元和',8). 西暦和暦表(1623,'元和',9). 西暦和暦表(1624,'元和',10). 西暦和暦表(1624,'寛永',1). 西暦和暦表(1625,'寛永',2). 西暦和暦表(1626,'寛永',3). 西暦和暦表(1627,'寛永',4). 西暦和暦表(1628,'寛永',5). 西暦和暦表(1629,'寛永',6). 西暦和暦表(1630,'寛永',7). 西暦和暦表(1631,'寛永',8). 西暦和暦表(1632,'寛永',9). 西暦和暦表(1633,'寛永',10). 西暦和暦表(1634,'寛永',11). 西暦和暦表(1635,'寛永',12). 西暦和暦表(1636,'寛永',13). 西暦和暦表(1637,'寛永',14). 西暦和暦表(1638,'寛永',15). 西暦和暦表(1639,'寛永',16). 西暦和暦表(1640,'寛永',17). 西暦和暦表(1641,'寛永',18). 西暦和暦表(1642,'寛永',19). 西暦和暦表(1643,'寛永',20). 西暦和暦表(1644,'寛永',21). 西暦和暦表(1644,'正保',1). 西暦和暦表(1645,'正保',2). 西暦和暦表(1646,'正保',3). 西暦和暦表(1647,'正保',4). 西暦和暦表(1648,'正保',5). 西暦和暦表(1648,'慶安',1). 西暦和暦表(1649,'慶安',2). 西暦和暦表(1650,'慶安',3). 西暦和暦表(1651,'慶安',4). 西暦和暦表(1652,'慶安',5). 西暦和暦表(1652,'承応',1). 西暦和暦表(1653,'承応',2). 西暦和暦表(1654,'承応',3). 西暦和暦表(1655,'承応',4). 西暦和暦表(1655,'明暦',1). 西暦和暦表(1656,'明暦',2). 西暦和暦表(1657,'明暦',3). 西暦和暦表(1658,'明暦',4). 西暦和暦表(1658,'万治',1). 西暦和暦表(1659,'万治',2). 西暦和暦表(1660,'万治',3). 西暦和暦表(1661,'万治',4). 西暦和暦表(1661,'寛文',1). 西暦和暦表(1662,'寛文',2). 西暦和暦表(1663,'寛文',3). 西暦和暦表(1664,'寛文',4). 西暦和暦表(1665,'寛文',5). 西暦和暦表(1666,'寛文',6). 西暦和暦表(1667,'寛文',7). 西暦和暦表(1668,'寛文',8). 西暦和暦表(1669,'寛文',9). 西暦和暦表(1670,'寛文',10). 西暦和暦表(1671,'寛文',11). 西暦和暦表(1672,'寛文',12). 西暦和暦表(1673,'寛文',13). 西暦和暦表(1673,'延宝',1). 西暦和暦表(1674,'延宝',2). 西暦和暦表(1675,'延宝',3). 西暦和暦表(1676,'延宝',4). 西暦和暦表(1677,'延宝',5). 西暦和暦表(1678,'延宝',6). 西暦和暦表(1679,'延宝',7). 西暦和暦表(1680,'延宝',8). 西暦和暦表(1681,'延宝',9). 西暦和暦表(1681,'天和',1). 西暦和暦表(1682,'天和',2). 西暦和暦表(1683,'天和',3). 西暦和暦表(1684,'天和',4). 西暦和暦表(1684,'貞享',1). 西暦和暦表(1685,'貞享',2). 西暦和暦表(1686,'貞享',3). 西暦和暦表(1687,'貞享',4). 西暦和暦表(1688,'貞享',5). 西暦和暦表(1688,'元禄',1). 西暦和暦表(1689,'元禄',2). 西暦和暦表(1690,'元禄',3). 西暦和暦表(1691,'元禄',4). 西暦和暦表(1692,'元禄',5). 西暦和暦表(1693,'元禄',6). 西暦和暦表(1694,'元禄',7). 西暦和暦表(1695,'元禄',8). 西暦和暦表(1696,'元禄',9). 西暦和暦表(1697,'元禄',10). 西暦和暦表(1698,'元禄',11). 西暦和暦表(1699,'元禄',12). 西暦和暦表(1700,'元禄',13). 西暦和暦表(1701,'元禄',14). 西暦和暦表(1702,'元禄',15). 西暦和暦表(1703,'元禄',16). 西暦和暦表(1704,'元禄',17). 西暦和暦表(1704,'宝永',1). 西暦和暦表(1705,'宝永',2). 西暦和暦表(1706,'宝永',3). 西暦和暦表(1707,'宝永',4). 西暦和暦表(1708,'宝永',5). 西暦和暦表(1709,'宝永',6). 西暦和暦表(1710,'宝永',7). 西暦和暦表(1711,'宝永',8). 西暦和暦表(1711,'正徳',1). 西暦和暦表(1712,'正徳',2). 西暦和暦表(1713,'正徳',3). 西暦和暦表(1714,'正徳',4). 西暦和暦表(1715,'正徳',5). 西暦和暦表(1716,'正徳',6). 西暦和暦表(1716,'享保',1). 西暦和暦表(1717,'享保',2). 西暦和暦表(1718,'享保',3). 西暦和暦表(1719,'享保',4). 西暦和暦表(1720,'享保',5). 西暦和暦表(1721,'享保',6). 西暦和暦表(1722,'享保',7). 西暦和暦表(1723,'享保',8). 西暦和暦表(1724,'享保',9). 西暦和暦表(1725,'享保',10). 西暦和暦表(1726,'享保',11). 西暦和暦表(1727,'享保',12). 西暦和暦表(1728,'享保',13). 西暦和暦表(1729,'享保',14). 西暦和暦表(1730,'享保',15). 西暦和暦表(1731,'享保',16). 西暦和暦表(1732,'享保',17). 西暦和暦表(1733,'享保',18). 西暦和暦表(1734,'享保',19). 西暦和暦表(1735,'享保',20). 西暦和暦表(1736,'享保',21). 西暦和暦表(1736,'元文',1). 西暦和暦表(1737,'元文',2). 西暦和暦表(1738,'元文',3). 西暦和暦表(1739,'元文',4). 西暦和暦表(1740,'元文',5). 西暦和暦表(1741,'元文',6). 西暦和暦表(1741,'寛保',1). 西暦和暦表(1742,'寛保',2). 西暦和暦表(1743,'寛保',3). 西暦和暦表(1744,'寛保',4). 西暦和暦表(1744,'延享',1). 西暦和暦表(1745,'延享',2). 西暦和暦表(1746,'延享',3). 西暦和暦表(1747,'延享',4). 西暦和暦表(1748,'延享',5). 西暦和暦表(1748,'寛延',1). 西暦和暦表(1749,'寛延',2). 西暦和暦表(1750,'寛延',3). 西暦和暦表(1751,'寛延',4). 西暦和暦表(1751,'宝暦',1). 西暦和暦表(1752,'宝暦',2). 西暦和暦表(1753,'宝暦',3). 西暦和暦表(1754,'宝暦',4). 西暦和暦表(1755,'宝暦',5). 西暦和暦表(1756,'宝暦',6). 西暦和暦表(1757,'宝暦',7). 西暦和暦表(1758,'宝暦',8). 西暦和暦表(1759,'宝暦',9). 西暦和暦表(1760,'宝暦',10). 西暦和暦表(1761,'宝暦',11). 西暦和暦表(1762,'宝暦',12). 西暦和暦表(1763,'宝暦',13). 西暦和暦表(1764,'宝暦',14). 西暦和暦表(1764,'明和',1). 西暦和暦表(1765,'明和',2). 西暦和暦表(1766,'明和',3). 西暦和暦表(1767,'明和',4). 西暦和暦表(1768,'明和',5). 西暦和暦表(1769,'明和',6). 西暦和暦表(1770,'明和',7). 西暦和暦表(1771,'明和',8). 西暦和暦表(1772,'明和',9). 西暦和暦表(1772,'安永',1). 西暦和暦表(1773,'安永',2). 西暦和暦表(1774,'安永',3). 西暦和暦表(1775,'安永',4). 西暦和暦表(1776,'安永',5). 西暦和暦表(1777,'安永',6). 西暦和暦表(1778,'安永',7). 西暦和暦表(1779,'安永',8). 西暦和暦表(1780,'安永',9). 西暦和暦表(1781,'安永',10). 西暦和暦表(1781,'天明',1). 西暦和暦表(1782,'天明',2). 西暦和暦表(1783,'天明',3). 西暦和暦表(1784,'天明',4). 西暦和暦表(1785,'天明',5). 西暦和暦表(1786,'天明',6). 西暦和暦表(1787,'天明',7). 西暦和暦表(1788,'天明',8). 西暦和暦表(1789,'天明',9). 西暦和暦表(1789,'寛政',1). 西暦和暦表(1790,'寛政',2). 西暦和暦表(1791,'寛政',3). 西暦和暦表(1792,'寛政',4). 西暦和暦表(1793,'寛政',5). 西暦和暦表(1794,'寛政',6). 西暦和暦表(1795,'寛政',7). 西暦和暦表(1796,'寛政',8). 西暦和暦表(1797,'寛政',9). 西暦和暦表(1798,'寛政',10). 西暦和暦表(1799,'寛政',11). 西暦和暦表(1800,'寛政',12). 西暦和暦表(1801,'寛政',13). 西暦和暦表(1801,'享和',1). 西暦和暦表(1802,'享和',2). 西暦和暦表(1803,'享和',3). 西暦和暦表(1804,'享和',4). 西暦和暦表(1804,'文化',1). 西暦和暦表(1805,'文化',2). 西暦和暦表(1806,'文化',3). 西暦和暦表(1807,'文化',4). 西暦和暦表(1808,'文化',5). 西暦和暦表(1809,'文化',6). 西暦和暦表(1810,'文化',7). 西暦和暦表(1811,'文化',8). 西暦和暦表(1812,'文化',9). 西暦和暦表(1813,'文化',10). 西暦和暦表(1814,'文化',11). 西暦和暦表(1815,'文化',12). 西暦和暦表(1816,'文化',13). 西暦和暦表(1817,'文化',14). 西暦和暦表(1818,'文化',15). 西暦和暦表(1818,'文政',1). 西暦和暦表(1819,'文政',2). 西暦和暦表(1820,'文政',3). 西暦和暦表(1821,'文政',4). 西暦和暦表(1822,'文政',5). 西暦和暦表(1823,'文政',6). 西暦和暦表(1824,'文政',7). 西暦和暦表(1825,'文政',8). 西暦和暦表(1826,'文政',9). 西暦和暦表(1827,'文政',10). 西暦和暦表(1828,'文政',11). 西暦和暦表(1829,'文政',12). 西暦和暦表(1830,'文政',13). 西暦和暦表(1830,'天保',1). 西暦和暦表(1831,'天保',2). 西暦和暦表(1832,'天保',3). 西暦和暦表(1833,'天保',4). 西暦和暦表(1834,'天保',5). 西暦和暦表(1835,'天保',6). 西暦和暦表(1836,'天保',7). 西暦和暦表(1837,'天保',8). 西暦和暦表(1838,'天保',9). 西暦和暦表(1839,'天保',10). 西暦和暦表(1840,'天保',11). 西暦和暦表(1841,'天保',12). 西暦和暦表(1842,'天保',13). 西暦和暦表(1843,'天保',14). 西暦和暦表(1844,'天保',15). 西暦和暦表(1844,'弘化',1). 西暦和暦表(1845,'弘化',2). 西暦和暦表(1846,'弘化',3). 西暦和暦表(1847,'弘化',4). 西暦和暦表(1848,'弘化',5). 西暦和暦表(1848,'嘉永',1). 西暦和暦表(1849,'嘉永',2). 西暦和暦表(1850,'嘉永',3). 西暦和暦表(1851,'嘉永',4). 西暦和暦表(1852,'嘉永',5). 西暦和暦表(1853,'嘉永',6). 西暦和暦表(1854,'嘉永',7). 西暦和暦表(1854,'安政',1). 西暦和暦表(1855,'安政',2). 西暦和暦表(1856,'安政',3). 西暦和暦表(1857,'安政',4). 西暦和暦表(1858,'安政',5). 西暦和暦表(1859,'安政',6). 西暦和暦表(1860,'安政',7). 西暦和暦表(1860,'万延',1). 西暦和暦表(1861,'万延',2). 西暦和暦表(1861,'文久',1). 西暦和暦表(1862,'文久',2). 西暦和暦表(1863,'文久',3). 西暦和暦表(1864,'文久',4). 西暦和暦表(1864,'元治',1). 西暦和暦表(1865,'元治',2). 西暦和暦表(1865,'慶応',1). 西暦和暦表(1866,'慶応',2). 西暦和暦表(1867,'慶応',3). 西暦和暦表(1868,'慶応',4). 西暦和暦表(1868,'明治',1). 西暦和暦表(1869,'明治',2). 西暦和暦表(1870,'明治',3). 西暦和暦表(1871,'明治',4). 西暦和暦表(1872,'明治',5). 西暦和暦表(1873,'明治',6). 西暦和暦表(1874,'明治',7). 西暦和暦表(1875,'明治',8). 西暦和暦表(1876,'明治',9). 西暦和暦表(1877,'明治',10). 西暦和暦表(1878,'明治',11). 西暦和暦表(1879,'明治',12). 西暦和暦表(1880,'明治',13). 西暦和暦表(1881,'明治',14). 西暦和暦表(1882,'明治',15). 西暦和暦表(1883,'明治',16). 西暦和暦表(1884,'明治',17). 西暦和暦表(1885,'明治',18). 西暦和暦表(1886,'明治',19). 西暦和暦表(1887,'明治',20). 西暦和暦表(1888,'明治',21). 西暦和暦表(1889,'明治',22). 西暦和暦表(1890,'明治',23). 西暦和暦表(1891,'明治',24). 西暦和暦表(1892,'明治',25). 西暦和暦表(1893,'明治',26). 西暦和暦表(1894,'明治',27). 西暦和暦表(1895,'明治',28). 西暦和暦表(1896,'明治',29). 西暦和暦表(1897,'明治',30). 西暦和暦表(1898,'明治',31). 西暦和暦表(1899,'明治',32). 西暦和暦表(1900,'明治',33). 西暦和暦表(1901,'明治',34). 西暦和暦表(1902,'明治',35). 西暦和暦表(1903,'明治',36). 西暦和暦表(1904,'明治',37). 西暦和暦表(1905,'明治',38). 西暦和暦表(1906,'明治',39). 西暦和暦表(1907,'明治',40). 西暦和暦表(1908,'明治',41). 西暦和暦表(1909,'明治',42). 西暦和暦表(1910,'明治',43). 西暦和暦表(1911,'明治',44). 西暦和暦表(1912,'明治',45). 西暦和暦表(1912,'大正',1). 西暦和暦表(1913,'大正',2). 西暦和暦表(1914,'大正',3). 西暦和暦表(1915,'大正',4). 西暦和暦表(1916,'大正',5). 西暦和暦表(1917,'大正',6). 西暦和暦表(1918,'大正',7). 西暦和暦表(1919,'大正',8). 西暦和暦表(1920,'大正',9). 西暦和暦表(1921,'大正',10). 西暦和暦表(1922,'大正',11). 西暦和暦表(1923,'大正',12). 西暦和暦表(1924,'大正',13). 西暦和暦表(1925,'大正',14). 西暦和暦表(1926,'大正',15). 西暦和暦表(1926,'昭和',1). 西暦和暦表(1927,'昭和',2). 西暦和暦表(1928,'昭和',3). 西暦和暦表(1929,'昭和',4). 西暦和暦表(1930,'昭和',5). 西暦和暦表(1931,'昭和',6). 西暦和暦表(1932,'昭和',7). 西暦和暦表(1933,'昭和',8). 西暦和暦表(1934,'昭和',9). 西暦和暦表(1935,'昭和',10). 西暦和暦表(1936,'昭和',11). 西暦和暦表(1937,'昭和',12). 西暦和暦表(1938,'昭和',13). 西暦和暦表(1939,'昭和',14). 西暦和暦表(1940,'昭和',15). 西暦和暦表(1941,'昭和',16). 西暦和暦表(1942,'昭和',17). 西暦和暦表(1943,'昭和',18). 西暦和暦表(1944,'昭和',19). 西暦和暦表(1945,'昭和',20). 西暦和暦表(1946,'昭和',21). 西暦和暦表(1947,'昭和',22). 西暦和暦表(1948,'昭和',23). 西暦和暦表(1949,'昭和',24). 西暦和暦表(1950,'昭和',25). 西暦和暦表(1951,'昭和',26). 西暦和暦表(1952,'昭和',27). 西暦和暦表(1953,'昭和',28). 西暦和暦表(1954,'昭和',29). 西暦和暦表(1955,'昭和',30). 西暦和暦表(1956,'昭和',31). 西暦和暦表(1957,'昭和',32). 西暦和暦表(1958,'昭和',33). 西暦和暦表(1959,'昭和',34). 西暦和暦表(1960,'昭和',35). 西暦和暦表(1961,'昭和',36). 西暦和暦表(1962,'昭和',37). 西暦和暦表(1963,'昭和',38). 西暦和暦表(1964,'昭和',39). 西暦和暦表(1965,'昭和',40). 西暦和暦表(1966,'昭和',41). 西暦和暦表(1967,'昭和',42). 西暦和暦表(1968,'昭和',43). 西暦和暦表(1969,'昭和',44). 西暦和暦表(1970,'昭和',45). 西暦和暦表(1971,'昭和',46). 西暦和暦表(1972,'昭和',47). 西暦和暦表(1973,'昭和',48). 西暦和暦表(1974,'昭和',49). 西暦和暦表(1975,'昭和',50). 西暦和暦表(1976,'昭和',51). 西暦和暦表(1977,'昭和',52). 西暦和暦表(1978,'昭和',53). 西暦和暦表(1979,'昭和',54). 西暦和暦表(1980,'昭和',55). 西暦和暦表(1981,'昭和',56). 西暦和暦表(1982,'昭和',57). 西暦和暦表(1983,'昭和',58). 西暦和暦表(1984,'昭和',59). 西暦和暦表(1985,'昭和',60). 西暦和暦表(1986,'昭和',61). 西暦和暦表(1987,'昭和',62). 西暦和暦表(1988,'昭和',63). 西暦和暦表(1989,'昭和',64). 西暦和暦表(1989,'平成',1). 西暦和暦表(1990,'平成',2). 西暦和暦表(1991,'平成',3). 西暦和暦表(1992,'平成',4). 西暦和暦表(1993,'平成',5). 西暦和暦表(1994,'平成',6). 西暦和暦表(1995,'平成',7). 西暦和暦表(1996,'平成',8). 西暦和暦表(1997,'平成',9). 西暦和暦表(1998,'平成',10). 西暦和暦表(1999,'平成',11). 西暦和暦表(2000,'平成',12). 西暦和暦表(2001,'平成',13). 西暦和暦表(2002,'平成',14). 西暦和暦表(2003,'平成',15). 西暦和暦表(2004,'平成',16). 西暦和暦表(2005,'平成',17). 西暦和暦表(2006,'平成',18). 西暦和暦表(2007,'平成',19). 西暦和暦表(2008,'平成',20). 西暦和暦表(2009,'平成',21). 西暦和暦表(2010,'平成',22). 西暦和暦表(2011,'平成',23). 西暦和暦表(2012,'平成',24). 西暦和暦表(2013,'平成',25). 西暦和暦表(2014,'平成',26). 西暦和暦表(2015,'平成',27). 西暦和暦表(2016,'平成',28). % 以下のサイトは # プログラミングのお題スレ Part4 #197 # アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 # 例に沿って連続する文字をカウントするプログラムを作成せよ。 # # 出力の最後に改行を挿入すること。 # 標準入力から以下の形式で与えられる。 # S # # 例) # In: # aaaaaaaaaabbbbbbbbbbbbcccccccddddddddddeeeeeeefffffffffghiiiiiiiii # # Out: # a10b12c7d10e7f9ghi9 # # In: # # Out: # 0 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 例に沿って連続する文字をカウントするプログラムを作成せよ。 出力の最後に改行を挿入すること。 標準入力から以下の形式で与えられる。' :- 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字ならび), 連続する文字をカウントする(_文字ならび,_文字_連続数ならび), 出力する(_文字_連続数ならび). 連続する文字をカウントする(L4,_文字_連続数ならび) :- findall([_文字,_連続数],( append(L1,L2,L3,L4), 'L2は限界連続文字ならび'(L1,L2,L3,_文字,_連続数)), _文字_連続数ならび). 'L2は限界連続文字ならび'(L1,L2,L3,_文字,_連続数) :- all(L2,_文字), \+(nth1(1,L3,_文字)), \+(last(L1,_文字)), length(L2,_連続数). 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). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字ならび) :- length(S,100), write('In: '), '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字), 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(S,_文字,_文字ならび). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる,'([],_,[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_,end_of_file,[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_,'\n',[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる'([_|S],_文字,[_文字|R]) :- '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(S,_次の文字), 'アルファベットの小文字aからzで成り立つS(S,0≦S≦100)が標準入力から与えられる。'(S,_次の文字,R). '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(end_of_file) :- !. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'('\n') :- !. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字) :- get_char(_文字), 文字はアルファベットの小文字aからzで成り立つ(_文字),!. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字) :- '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字). 文字はアルファベットの小文字aからzで成り立つ(end_of_file) :- !. 文字はアルファベットの小文字aからzで成り立つ('\n') :- !. 文字はアルファベットの小文字aからzで成り立つ(_文字) :- _文字 @>= 'a', _文字 @=< 'z',!. 出力する(LL) :- flatten(LL,L), atomic_list_concat(L,_出力文字列). writef('Out:\n%t\n',[_出力文字列]). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #132 # お題:ふたつの整数が与えられたとき、数字が一致している桁の個数を求める。 # 例 # 110, 119 -> 2 # 1234, 214 -> 2 # 567, 23 -> 0 # 'ふたつの整数が与えられたとき、数字が一致している桁の個数を求める。'(_数_1,_数_2,_数字が一致している桁の個数) :- number_chars(_数_1,_数字ならび_1), number_chars(_数_2,_数字ならび_2), reverse(_数字ならび_1,_反転した数字ならび_1), reverse(_数字ならび_2,_反転した数字ならび_2), '数字が一致している桁の個数を求める。'(_反転した数字ならび_1,_反転した数字ならび_2,_数字が一致している桁の個数). '数字が一致している桁の個数を求める。'(_反転した数字ならび_1,_反転した数字ならび_2,_数字が一致している桁の個数) :- '個数を調べる。'(数字が一致している桁の(_反転した数字ならび_1,_反転した数字ならび_2,_数字が一致している桁),_数字が一致している桁の個数). '数字が一致している桁の'(L1,L2,_数字が一致している桁) :- nth1(_数字が一致している桁,L1,_数字), nth1(_数字が一致している桁,L2,_数字), ('L1かL2のどちらかが[]の時'(L1,L2),!,fail;true). 'L1かL2のどちらかが[]の時'([],_) :- !. 'L1かL2のどちらかが[]の時'(_,[]). '個数を調べる。'(P,_個数) :- findall(1,P,L), length(L,_個数). % 以下のサイトは 色(赤). 色(青). 色(緑). 色(黄). 区画(a). 区画(b). 区画(c). 区画(d). 隣接(a,b). 隣接(b,d). 隣接(a,c). 隣接(c,d). 塗り絵(_区画の定義順に対応した区画色変数ならび) :- 色組合せならび(_色組合せならび), 区画変数組合せ(_区画の定義順に対応した区画色変数ならび,_区画変数組合せならび), 色合わせ(_色組合せならび,_区画変数組合せならび). 色組合せならび(_色組合せならび) :- findall(_色,色(_色),_色ならび), findall([_色_1,_色_2],( 色を双方向に順列で取る(_色_1,_色_2)), _色組合せならび). 色を順列で双方向に取る(_色_1,_色_2) :- 順列(_色ならび,2,[A,B]), 双方向に取る(A,B,_色_1,_色_2). 双方向に取る(A,B,A,B). 双方向に取る(A,B,B,A). 色合わせ(L1,L2) :- select([A,B],L2,R2), member([A,B],L1), 色合わせ(L1,R2). 区画変数組合せ(_区画変数ならび,_区画変数組合せならび) :- 区画名ならびと区画変数ならびを得る(_区画名ならび,_区画変数ならび), findall([_区画変数_1,_区画変数_2],( 順列(_区画名ならび,2,[_区画名_1,_区画名_2]), 区画変数に変換(_区画名_1,_区画名_2,_区画変数_1,_区画変数_2)), _区画変数組合せならび). 区画名ならびと区画変数ならびを得る(_区画名ならび,_区画変数ならび) :- findall(_区画名,区画(_区画名),_区画名ならび), length(_区画名ならび,_要素数), length(_区画変数ならび,_要素数),!. 区画変数に変換(_区画変数ならび,_区画名_1,_区画名_2,_区画変数_1,_区画変数_2) :- nth1(_nth1,_区画名ならび,_区画名_1), nth1(_nth2,_区画名ならび,_区画名_2), nth1(_nth1,_区画変数ならび,_区画変数_1_1), nth1(_nth2,_区画変数ならび,_区画変数_2_1), 双方向にに変換(_区画変数_1_1,_区画変数_2_1,_区画変数_1,_区画変数_2). 双方向に変換(_区画変数_1_1,_区画変数_2_1,_区画変数_1_1,_区画変数_2_1). 双方向に変換(_区画変数_1_1,_区画変数_2_1,_区画変数_2_1,_区画変数_1_1). % 以下のサイトは 色(赤). 色(青). 色(緑). 色(黄). 区画(a). 区画(b). 区画(c). 区画(d). 隣接(a,b). 隣接(b,d). 隣接(a,c). 隣接(c,d). 区画変数([_1,_2,_3,_4]). 塗り絵(_区画変数ならび) :- 色組合せならび(_色組合せならび), 区画変数組合せ(_区画変数組合せ), 色合わせ(_色組合せならび,_区画変数組合せ). 色組合せならび(_色組合せならび) :- findall(_色,色(_色),_色ならび), findall([_色_1,_色_2],( 色を双方向に順列で取る(_色_1,_色_2)), _色組合せならび). 色を順列で双方向に取る(_色_1,_色_2) :- 順列(_色ならび,2,[A,B]), 双方向に取る(A,B,_色_1,_色_2). 双方向に取る(A,B,A,B). 双方向に取る(A,B,B,A). 色合わせ(_,[]). 色合わせ(L1,L2) :- select([A,B],L2,R2), member([A,B],L1), 色合わせ(L1,R2). 区画変数組合せ(_区画変数ならび,_区画変数組合せならび) :- findall(_区画名,区画(_区画名),_区画名ならび), findall([_区画変数_1,_区画変数_2],( 順列(_区画名ならび,2,[_区画名_1,_区画名_2]), 区画変数に変換(_区画名_1,_区画名_2,_区画変数_1,_区画変数_2)), _区画変数組合せならび). 区画変数に変換(_区画名_1,_区画名_2,_区画変数_1,_区画変数_2) :- nth1(_nth1,_区画名ならび,_区画名_1), nth1(_nth2,_区画名ならび,_区画名_2), nth1(_nth1,_区画変数ならび,_区画変数_1_1), nth1(_nth2,_区画変数ならび,_区画変数_2_1), 双方向にに変換(_区画変数_1_1,_区画変数_2_1,_区画変数_1,_区画変数_2). 双方向に変換(_区画変数_1_1,_区画変数_2_1,_区画変数_1_1,_区画変数_2_1). 双方向に変換(_区画変数_1_1,_区画変数_2_1,_区画変数_2_1,_区画変数_1_1). % 以下のサイトは 九九の段(1,[1,2,3,4,5,6,7,8,9]). 九九の段(2,[2,4,6,8,10,12,14,16,18]). 九九の段(3,[3,6,9,12,15,18,21,24,27]). 九九の段(4,[4,8,12,16,20,24,28,32,36]). 九九の段(5,[5,10,15,20,25,30,35,40,45]). 九九の段(6,[6,12,18,24,30,36,42,48,54]). 九九の段(7,[7,14,21,28,35,42,49,56,63]). 九九の段(8,[8,16,24,32,40,48,56,64,72]). 九九の段(9,[9,18,27,36,45,54,63,72,81]). '「21÷7 の計算は、九九のどの段を使いますか?」'(_どの段,_割り算のこたえ) :- _どの段 = 7, 九九の段(7,_段の値ならび), nth1(_割り算のこたえ,_段の値ならび,21). % 以下のサイトは 九九表([ [1,2,3,3,4,6,7,8,9], [2,4,6,8,10,12,14,16,18], [3,6,9,12,15,18,21,24,27], [4,8,12,16,20,24,28,32,36], [5,10,15,20,25,30,35,40,45], [6,12,18,24,30,36,42,48,54], [7,14,21,28,35,42,49,56,63], [8,16,24,32,40,48,56,64,72], [9,18,27,36,45,54,63,72,81]]). '「21÷7 の計算は、九九表をどのように辿れば答えがえられますか?」ならば全然問題がないように思いますが。'(_答え,_答えは何段目にある) :- 九九表を得る(_九九表), '7を段から辿るか、列から辿るかを決める'(_段経由または列経由), 九九表から7段目または7列目を取り出す(_段経由または列経由,_九九表,_取り出した段または列), '7段目または7列目経由で21を探しその要素位置が答えである'(_段経由または列経由,_取り出した段または列,_答え,_答えは何段目にある). 九九表を得る(_九九表) :- 九九表(_九九表). '7を段から辿るか、列から辿るかを決める'(段経由) :- '発生させた乱数が偶数の時、段経由とする',!. '7を段から辿るか、列から辿るかを決める'(列経由). 九九表から7段目または7列目を取り出す(段経由,_九九表,_取り出した段または列) :- nth1(7,_九九表,_取り出した段または列). 九九表から7段目または7列目を取り出す(列経由,_九九表,_取り出した段または列) :- findall(_列の値,( nth1(_,_九九表,_段), nth1(7,_段,_列の値)), _取り出した段または列). '7段目または7列目経由で21を探しその要素位置が答えである'(段経由,_取り出した段または列,_答え,7) :- nth1(_答え,_取り出した段または列,21). '7段目または7列目経由で21を探しその要素位置が答えである'(列経由,_取り出した段または列,_答え,_何段目) :- nth1(_何段目,_取り出した段または列,21), _答え = _何段目. 乱数の種(7717). '発生させた乱数が偶数の時、段経由とする' :- 乱数の種(_乱数の種), 発生した乱数が偶数である(_乱数の種). 発生した乱数が偶数である(_乱数の種) :- 0 is random(_乱数の種) mod 2. % 以下のサイトは 九九表([ [1,2,3,3,4,6,7,8,9], [2,4,6,8,10,12,14,16,18], [3,6,9,12,15,18,21,24,27], [4,8,12,16,20,24,28,32,36], [5,10,15,20,25,30,35,40,45], [6,12,18,24,30,36,42,48,54], [7,14,21,28,35,42,49,56,63], [8,16,24,32,40,48,56,64,72], [9,18,27,36,45,54,63,72,81]]). '「21÷7 の計算は、九九表をどのように辿れば答えがえられますか?」ならば全然問題がないように思いますが。'(_答え,_答えは何段目にある) :- 九九表を得る(_九九表), '7を段から辿るか、列から辿るかを決める'(_段経由または列経由), 九九表から7段目または7列目を取り出す(_段経由または列経由,_九九表,_取り出した段または列), '7段目または7列目経由で21を探しその要素位置が答えである'(_段経由または列経由,_取り出した段または列,_答え,_答えは何段目にある). 九九表を得る(_九九表) :- 九九表(_九九表). '7を段から辿るか、列から辿るかを決める'(段経由) :- 0 is random(7717) mod 2,!. '7を段から辿るか、列から辿るかを決める'(列経由). 九九表から7段目または7列目を取り出す(段経由,_九九表,_取り出した段または列) :- nth1(7,_九九表,_取り出した段または列). 九九表から7段目または7列目を取り出す(列経由,_九九表,_取り出した段または列) :- 転置(_九九表,_転置した九九表), nth1(7,_転置した九九表,_取り出した段または列). '7段目または7列目経由で21を探しその要素位置が答えである'(段経由,_取り出した段または列,_答え,7) :- nth1(_答え,_取り出した段または列,21). '7段目または7列目経由で21を探しその要素位置が答えである'(列経由,_取り出した段または列,_答え,_何段目) :- nth1(_何段目,_取り出した段または列,21), _答え = _何段目. 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは 九九表([ [1,2,3,3,4,6,7,8,9], [2,4,6,8,10,12,14,16,18], [3,6,9,12,15,18,21,24,27], [4,8,12,16,20,24,28,32,36], [5,10,15,20,25,30,35,40,45], [6,12,18,24,30,36,42,48,54], [7,14,21,28,35,42,49,56,63], [8,16,24,32,40,48,56,64,72], [9,18,27,36,45,54,63,72,81]]). '「21÷7 の計算は、九九表をどのように辿れば答えがえられますか?」ならば全然問題がないように思いますが。'(_答え) :- 九九表を得る(_九九表), '7を段から辿るか、列から辿るかを決める'(_段経由または列経由), 九九表から7段目または7列目を取り出す(_段経由または列経由,_九九表,_取り出した段または列), '21を探しその要素位置が答えである'(_取り出した段または列,_答え). 九九表を得る(_九九表) :- 九九表(_九九表). '7を段から辿るか、列から辿るかを決める'(段経由) :- 0 is random(7717) mod 2,!. '7を段から辿るか、列から辿るかを決める'(列経由). 九九表から7段目または7列目を取り出す(段経由,_九九表,_取り出した段または列) :- nth1(7,_九九表,_取り出した段または列). 九九表から7段目または7列目を取り出す(列経由,_九九表,_取り出した段または列) :- 転置(_九九表,_転置した九九表), nth1(7,_転置した九九表,_取り出した段または列). '21を探しその要素位置が答えである'(_取り出した段または列,_答え) :- nth1(_答え,_取り出した段または列,21). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは 九九表([ [1,2,3,3,4,6,7,8,9], [2,4,6,8,10,12,14,16,18], [3,6,9,12,15,18,21,24,27], [4,8,12,16,20,24,28,32,36], [5,10,15,20,25,30,35,40,45], [6,12,18,24,30,36,42,48,54], [7,14,21,28,35,42,49,56,63], [8,16,24,32,40,48,56,64,72], [9,18,27,36,45,54,63,72,81]]). '「21÷7 の計算は、九九表をどのように辿れば答えがえられますか?」ならば全然問題がないように思いますが。'(_答え) :- 九九表を得る(_九九表), '九九表から21を得る'(_九九表,_段目,_列目), '得られた21は7段目または7列目になっているか'(_段目,_列目), '7段目であれば答えは_列目、7列目であれば答えは_段目'(_段目,_列目,_答え). 九九表を得る(_九九表) :- 九九表(_九九表). 九九表から21を得る(_九九表,_段目,_列目) :- nth1(_段目,_九九表,_段), nth1(_列目,_段,21). '得られた21は7段目または7列目になっているか'(7,_) :- !. '得られた21は7段目または7列目になっているか'(_,7). '7段目であれば答えは_列目、7列目であれば答えは_段目'(7,_答え,_答え) :- !. '7段目であれば答えは_列目、7列目であれば答えは_段目'(_答え,7,_答え). % 以下のサイトは 九九表([ [1,2,3,3,4,6,7,8,9], [2,4,6,8,10,12,14,16,18], [3,6,9,12,15,18,21,24,27], [4,8,12,16,20,24,28,32,36], [5,10,15,20,25,30,35,40,45], [6,12,18,24,30,36,42,48,54], [7,14,21,28,35,42,49,56,63], [8,16,24,32,40,48,56,64,72], [9,18,27,36,45,54,63,72,81]]). '「21÷7 の計算は、九九表をどのように辿れば答えがえられますか?」ならば全然問題がないように思いますが。'(_答え) :- 九九表を得る(_九九表), 九九表から7段目または7列目を取り出す(_九九表,_取り出した段または列), '21を探しその要素位置が答えである'(_取り出した段または列,_答え). 九九表を得る(_九九表) :- 九九表(_九九表). 九九表から7段目または7列目を取り出す(_九九表,_取り出した段または列) :- nth1(7,_九九表,_取り出した段または列). 九九表から7段目または7列目を取り出す(_九九表,_取り出した段または列) :- 転置(_九九表,_転置した九九表), nth1(7,_転置した九九表,_取り出した段または列). '21を探しその要素位置が答えである'(_取り出した段または列,_答え) :- nth1(_答え,_取り出した段または列,21). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは 九九表([ [1,2,3,3,4,6,7,8,9], [2,4,6,8,10,12,14,16,18], [3,6,9,12,15,18,21,24,27], [4,8,12,16,20,24,28,32,36], [5,10,15,20,25,30,35,40,45], [6,12,18,24,30,36,42,48,54], [7,14,21,28,35,42,49,56,63], [8,16,24,32,40,48,56,64,72], [9,18,27,36,45,54,63,72,81]]). '「21÷7 の計算は、九九表をどのように辿れば答えがえられますか?」ならば全然問題がないように思いますが。'(_答え) :- 九九表を得る(_九九表), 九九表から7段目を取り出す(_九九表,_7段目), '7段目から21を探し列数を得る'(_7段目,_列数). '列数がすなわち答えである'(_列数,_答え). 九九表を得る(_九九表) :- 九九表(_九九表). 九九表から7段目を取り出す(_九九表,_7段目) :- nth1(7,_九九表,_7段目). '7段目から21を探し列数を得る'(_7段目,_列数) :- nth1(_列数,_7段目,21). '列数がすなわち答えである'(A,A). % 以下のサイトは 九九表([ [1,2,3,3,4,6,7,8,9], [2,4,6,8,10,12,14,16,18], [3,6,9,12,15,18,21,24,27], [4,8,12,16,20,24,28,32,36], [5,10,15,20,25,30,35,40,45], [6,12,18,24,30,36,42,48,54], [7,14,21,28,35,42,49,56,63], [8,16,24,32,40,48,56,64,72], [9,18,27,36,45,54,63,72,81]]). '「21÷7 の計算は、九九表をどのように辿れば答えがえられますか?」ならば全然問題がないように思いますが。'(_答え) :- 九九表を得る(_九九表), '21÷7 の計算は、九九表をどのように辿れば答えがえられますか?'(_九九表,_答え). '21÷7 の計算は、九九表をどのように辿れば答えがえられますか?'(_九九表,_答え) :- 九九表から7段目を取り出す(_九九表,_7段目), '7段目から21を探し列数を得る'(_7段目,_列数). '列数がすなわち答えである'(_列数,_答え),!. '21÷7 の計算は、九九表をどのように辿れば答えがえられますか?'(_九九表,_答え) :- 九九表から7列目を取り出す(_九九表,_7列目), '7列目から21を探し段数を得る'(_7列目,_段数). '段数がすなわち答えである'(_列数,_答え). 九九表を得る(_九九表) :- 九九表(_九九表). 九九表から7段目を取り出す(_九九表,_7段目) :- nth1(7,_九九表,_7段目). 九九表から7列目を取り出す(_九九表,_7列目) :- 転置(_九九表,_転置した九九表), nth1(7,_転置した九九表,_7列目). '7段目から21を探し列数を得る'(_7段目,_列数) :- nth1(_列数,_7段目,21). '7列目から21を探し段数を得る'(_7列目,_段数) :- nth1(_段数,_7列目,21). 列数がすなわち答えである(A,A). 段数がすなわち答えである(A,A). % 以下のサイトは 覆面算(kadokawa+dwango+kada=kandouii,N1+N2+N3=N4,_文字と数字の対応) :- 覆面(kadokawa+dwango+kada=kandouii,L0_1,L0_2,L0_3,L1,L2,L3,L4), 覆面算(L0_3,L0_2), 覆面算計算(L1,L2,L3,L4,N1,N2,N3,N4), 文字と数字の対応(L0_1,L0_2,_文字と数字の対応). 覆面(A_1+A_2+A_3=A_4,L0_1,L0_2,L0_3,L1,L2,L3,L4) :- 文字出現順の決定([A_1,A_2,A_3,A_4],L0_1), findall(N,between(1,9,_),L0_2), L0_3 = ['1','2','3','4','5','6','7','8','9','0'], 覆面文字と変数の対応付け(L0_1,L0_2,A_1,A_2,A_3,A_4,L1,L2,L3,L4). 文字出現順の決定(L,L0_1) :- atomic_list_concat(L,A), atom_chars(A,Chars), 唯一の文字ならびを得る(Chars,L0_1). 要素に重複のない文字ならび(_文字ならび,_要素に重複のない文字ならび) :- findall(_文字,( append(L1,[_文字|_],_文字ならび), \+(member(_文字,L1))), _要素に重複のない文字ならび). 数式の対応付け(L0_1,L0_2,A_1,A_2,A_3,A_4,L1,L2,L3,L4) :- 数式の対応付け(L0_1,L0_2,A_1,L1), 数式の対応付け(L0_1,L0_2,A_2,L2), 数式の対応付け(L0_1,L0_2,A_3,L3), 数式の対応付け(L0_1,L0_2,A_4,L4). 覆面文字と変数の対応付け(L0_1,L0_2,_覆面文字列,_変数ならび) :- atom_chars(_覆面文字列,_覆面文字ならび), findall(V,( nth1(_nth1,_覆面文字ならび,_文字), nth1(_nth1,L0_1,_文字), nth1(_nth1,L0_2,V)), _変数ならび). 覆面算計算(L1,L2,L3,L4,N1,N2,N3,N4) :- number_chars(N1,L1), number_chars(N2,L2), number_chars(N3,L3), number_chars(N4,L4), N1 + N2 + N3 =:= N4. 覆面算(_,[]). 覆面算(L,[A|R2]) :- select(A,L,R), 覆面算(R,R2). 文字と数字の対応(L0_1,L0_2,_文字と数字の対応) :- findall(A=B,( nth1(_nth1,L0_1,A), nth1(_nth1,L0_2,B)), _文字と数字の対応). 唯一の文字ならびを得る([],[]). 唯一の文字ならびを得る([A|R1],[A|R2]) :- \+(member(A,R1)), 唯一の文字ならびを得る(R1,R2). 唯一の文字ならびを得る([A|R1],R2) :- member(A,R1), 唯一の文字ならびを得る(R1,R2). % 以下のサイトは # 出典 :: SQL質疑応答スレ 14問目 #896 # 質問です。 # PostgreSQL9.3 # # テーブル # DATE, VALUE # 20140401,-13 # 20140402,-11 # 20140403, 12 # 20140404, 13 # 20140405, 12 # 20140406,-11 # # 欲しい結果 # DATE, VALUE ,COUNT # 20140401,-13, 1 # 20140402,-11, 2 # 20140403, 12, 1 # 20140404, 13, 2 # 20140405, 12, 3 # 20140406,-11, 1 # # このように、VALUEの値の正負の連続数をCOUNTし出力するようなSQLは書けるのですか? 'VALUEの値の正負の連続数をCOUNTし出力する' :- テーブルデータをならびに取得(LL), 'VALUEの値の正負の連続数をCOUNTし出力する'(LL). テーブルデータをならびに取得(LL) :- findall([_DATE,_VALUE],テーブル(_DATE,_VALUE),LL). 'VALUEの値の正負の連続数をCOUNTし出力する'(LL) :- 同一の符号の最大連続(LL,LL2), 'COUNTして出力する'(LL2). 同一の符号の最大連続(LL,LL2) :- append([LL1,LL2,LL3],LL), 'LL2が同一符号の最大連続である'(LL1,LL2,LL3). 'LL2が同一符号の最大連続である'(LL1,LL2,LL3) :- 全てが同一符号(LL2,_符号), 'LL1の最後の要素の符号は異なる'(LL1,_符号), 'LL3の最初の要素の符号は異なる'(LL3,_符号). 全てが同一符号([],_). 全てが同一符号([[_,_VALUE]|R],_符号) :- 符号(_VALUE,_符号), 全てが同一符号(R,_符号). 符号(_VALUE,+) :- _VALUE >= 0. 符号(_VALUE,-) :- _VALUE < 0. 'LL1の最後の要素の符号は異なる'(LL1,_符号) :- \+((last(LL1,[_,_VALUE]),符号(_VALUE,_符号))). 'LL3の最初の要素の符号は異なる'(LL3,_符号) :- \+((LL3 = [[_,_VALUE]|_],符号(_VALUE,_符号))). 'COUNTして出力する'(LL2) :- forall( nth1(_nth1,LL2,[_DATE,_VALUE]), writef('%t,%t,%t\n',[_DATE,_VALUE,_nth1])). % 以下のサイトは # 出典 :: SQL質疑応答スレ14問目 #890 # 質問させてください。MySQLです。 # 上位100件を抽出してその中から10件をランダムに抽出したい。 # SELECT文はどう書けばいいですか?1行でできますか? '上位100件を抽出してその中から10件をランダムに抽出したい。'(_10件をランダムに抽出) :- 上位100件を抽出して(_上位100件), length(_10件をランダムに抽出,10), '上位100件の中から10件をランダムに抽出したい。'(_上位100件,[],_10件をランダムに抽出). '上位100件を抽出して'(_上位100件) :- findall(_値,テーブル(_値),_値ならび), 降順整列(_値ならび,_降順整列した値ならび), length(_上位100件,100), append(_上位100件,_,_降順整列した値ならび). '上位100件の中から10件をランダムに抽出したい。'(_,_,[]). '上位100件の中から10件をランダムに抽出したい。'(_上位100件,_既に選択した位置,[_選択値|R]) :- 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値), '上位100件の中から10件をランダムに抽出したい。'(_上位100件,[_選択した位置|_既に選択した位置],R). 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値) :- ランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値),!. 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値) :- 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値). ランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値) :- _選択する位置 is random(100) + 1, \+(member(_選択する位置,_既に選択した位置)), nth1(_選択する位置,_上位100件,_選択値). 降順整列([],[]). 降順整列([A|R1],L) :- 降順分割(A,R1,L1,L2), 降順整列(L1,L1_2), 降順整列(L2,L2_2), append(L1_2,[A|L2_2],L). 降順分割(_,[],[],[]). 降順分割(A,[B|R],[B|L1],L2) :- B @> A, 降順分割(A,R,L1,L2). 降順分割(A,[B|R],L1,[B|L2]) :- B @=< A, 降順分割(A,R,L1,L2). % 以下のサイトは # このディレクトリの索引 # 出典 :: スレ立てるまでもない質問はここで135代目 #755 # **--* # ***-* # *---* # **-** # **-** # # var a=[ # "**--*", # "***-*", # "*---*", # "**-**", # "**-**", # ]; # ハイフンの位置を取得して連想配列に入れる方法おしえてください # var ithi = [ # [2,3], # [3], # [1,2,3], # [2], # [2], # ] ハイフンの位置を取得して連想配列に入れる方法おしえてください(_文字列,L,LL) :- split(_文字列,['\n'],L), findall(L1,( member(_副文字列,L), findall(_nth0,( sub_abom(_副文字列,_nth0,1,_,'-')), L1)), LL). % 以下のサイトは # 出典 :: プログラミングのお題スレ Part3 #435 # # お題:10進数を2進数にしてビットごとに反転したものを10進数に戻す。 # 例 # 1 -> 0 # 12345 -> 4038 # 256 -> 255 '10進数を2進数にしてビットごとに反転したものを10進数に戻す。'(_10進数を,_2進数にしてビットごとに反転したものを10進数戻す) :- '10進数を2進数にして'(_10進数を,[],_2進数にして), ビットごとに反転したものを(_2進数にして,_ビットごとに反転したものを), '10進数に戻す'(_ビットごとに反転したものを,0,_2進数にしてビットごとに反転したものを10進数戻す). '10進数を2進数にして'(0,_2進数にして,_2進数にして) :- !. '10進数を2進数にして'(_10進数,_2進数ならび,_2進数にして) :- '2進数を下位桁から積み上げる'(_10進数,_2進数ならび,_2進数にして). '2進数を下位桁から積み上げる'(_10進数,_2進数ならび,_2進数にして) :- 最下位桁のビットを切り取る(_10進数,_ビット,_10進数_1), '10進数を2進数にして'(_10進数_1,[_ビット|_2進数ならび],_2進数にして). 最下位桁のビットを切り取る(_10進数,_ビット,_10進数_1) :- _ビット is _10進数 mod 2, _10進数_1 is _10進数 // 2. ビットごとに反転したものを(_2進数にして,_ビットごとに反転したものを) :- findall(_反転した,( ビットを反転した(_2進数にして,_反転した)),_ビットごとに反転したものを). ビットを反転した(_2進数にして,_反転した) :- ビットを(_2進数にして,_ビットを), 反転した(_ビットを,_反転した). ビットを(_2進数にして,_ビットを) :- nth1(_,_2進数にして,_ビットを). 反転した(0,1). 反転した(1,0). '10進数に戻す'([],_10進数に戻す,_10進数に戻す). '10進数に戻す'(_二進数ビットならび,_10進数の積み上げ_1,_10進数に戻す) :- '10進数を積み上げて行く'(_二進数ビットならび,_10進数の積み上げ_1,_10進数に戻す). '10進数を積み上げて行く'([_ビット|R],_10進数の積み上げ_1,_10進数に戻す) :- _10進数の積み上げ_2 is _10進数の積み上げ_1 * 2 + _ビット, '10進数に戻す'(R,_10進数の積み上げ_2,_10進数に戻す). % 以下のサイトは % % ?- 戦艦(_艦船名,_レベル,_耐久,_火力,_雷装,_対空,_速力). 出典('twitter by @kamina741'). 参照('戦艦'). 参照('テーブル定義付き'). 参照('テーブル定義・検索項目付き'). 参照('テーブル定義・条件・検索項目付き'). 参照('Prolog Wikipedia リレーショナルデータベース'). 戦艦(比叡改二,124,91,144,0,100,高速). 戦艦(比叡改二,112,91,131,0,90,高速). 戦艦(比叡改,110,83,134,0,96,高速). 戦艦(比叡改,107,83,174,0,75,高速). 戦艦(比叡改,107,83,121,0,95,高速). 戦艦(比叡改,100,83,145,0,99,高速). 戦艦(比叡改,100,83,121,0,95,高速). 戦艦(比叡,100,71,78,0,29,高速). 戦艦(比叡,100,71,64,0,25,高速). 戦艦(比叡,100,71,98,0,32,高速). テーブル定義(戦艦,1,艦船名). テーブル定義(戦艦,2,レベル). テーブル定義(戦艦,3,耐久). テーブル定義(戦艦,4,火力). テーブル定義(戦艦,5,雷装). テーブル定義(戦艦,6,対空). テーブル定義(戦艦,7,速力). テーブル検索(_テーブル名,_条件項目名ならび,_条件値ならび,_検索項目名ならび,_値ならび,_検索した値ならび) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 条件値ならびの設定(_テーブル名,_条件項目名ならび,_条件値ならび,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名ならび,_値ならび,_検索した値ならび), 値ならび(_テーブル名,_値ならび). テーブル検索(_テーブル名,_検索項目名,_検索した値) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値), 値ならび(_テーブル名,_値ならび). テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび) :- findall(_,テーブル定義(_テーブル名,_,_),_値ならび). 条件値ならび(_,[],[],_値ならび). 条件値ならび(_テーブル名,[_条件項目名|R1],[_条件値|R2],_値ならび) :- テーブル定義(_テーブル名,_nth1,_条件項目名), nth1(_nth1,_値ならび,_条件値), 条件値ならび(_テーブル名,R1,R2,_値ならび). 値ならび中の検索項目を選択(_,[],_値ならび,[]). 値ならび中の検索項目を選択(_テーブル名,[_検索項目名|R1],_値ならび,[_検索した値|R2]) :- テーブル定義(_テーブル名,_nth1,_検索項目名), nth1(_nth1,_値ならび,_検索した値), 値ならび中の検索項目を選択(_テーブル名,R1,_値ならび,R2). 値ならび(_テーブル名,_値ならび) :- _副目標 =.. [_テーブル名|_値ならび], catch(_副目標,error(S,_error),true), 実行検査(_項,_error). 実行検査(_項,_error) :- var(_error),!. % 以下のサイトは % % ?- 戦艦(_艦船名,_レベル,_耐久,_火力,_雷装,_対空,_速力). 出典('twitter by @kamina741'). 戦艦(比叡改二,124,91,144,0,100,高速). 戦艦(比叡改二,112,91,131,0,90,高速). 戦艦(比叡改,110,83,134,0,96,高速). 戦艦(比叡改,107,83,174,0,75,高速). 戦艦(比叡改,107,83,121,0,95,高速). 戦艦(比叡改,100,83,145,0,99,高速). 戦艦(比叡改,100,83,121,0,95,高速). 戦艦(比叡,100,71,78,0,29,高速). 戦艦(比叡,100,71,64,0,25,高速). 戦艦(比叡,100,71,98,0,32,高速). テーブル定義(戦艦,1,艦船名). テーブル定義(戦艦,2,レベル). テーブル定義(戦艦,3,耐久). テーブル定義(戦艦,4,火力). テーブル定義(戦艦,5,雷装). テーブル定義(戦艦,6,対空). テーブル定義(戦艦,7,速力). テーブル検索(_テーブル名,_条件項目名ならび,_条件値ならび,_検索項目名,_検索した値) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 条件値ならびの設定(_テーブル名,_条件項目名ならび,_条件値ならび,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値), 値ならび(_テーブル名,_値ならび). テーブル検索(_テーブル名,_検索項目名,_検索した値) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値), 値ならび(_テーブル名,_値ならび). テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび) :- findall(_,テーブル定義(_テーブル名,_,_),_値ならび). 条件値ならび(_,[],[],_値ならび). 条件値ならび(_テーブル名,[_条件項目名|R1],[_条件値|R2],_値ならび) :- テーブル定義(_テーブル名,_nth1,_条件項目名), nth1(_nth1,_値ならび,_条件値), 条件値ならび(_テーブル名,R1,R2,_値ならび). 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値) :- テーブル定義(_テーブル名,_nth1,_検索項目名), nth1(_nth1,_値ならび,_検索した値). 値ならび(_テーブル名,_値ならび) :- _副目標 =.. [_テーブル名|_値ならび], catch(_副目標,error(S,_error),true), 実行検査(_項,_error). 実行検査(_項,_error) :- var(_error),!. 参照('Prolog Wikipedia リレーショナルデータベース'). % 以下のサイトは % % ?- 戦艦(_艦船名,_レベル,_耐久,_火力,_雷装,_対空,_速力). 出典('twitter by @kamina741'). 戦艦(比叡改二,124,91,144,0,100,高速). 戦艦(比叡改二,112,91,131,0,90,高速). 戦艦(比叡改,110,83,134,0,96,高速). 戦艦(比叡改,107,83,174,0,75,高速). 戦艦(比叡改,107,83,121,0,95,高速). 戦艦(比叡改,100,83,145,0,99,高速). 戦艦(比叡改,100,83,121,0,95,高速). 戦艦(比叡,100,71,78,0,29,高速). 戦艦(比叡,100,71,64,0,25,高速). 戦艦(比叡,100,71,98,0,32,高速). テーブル定義(戦艦,1,艦船名). テーブル定義(戦艦,2,レベル). テーブル定義(戦艦,3,耐久). テーブル定義(戦艦,4,火力). テーブル定義(戦艦,5,雷装). テーブル定義(戦艦,6,対空). テーブル定義(戦艦,7,速力). テーブル検索(_テーブル名,_検索項目名,_検索した値) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値), 値ならび(_テーブル名,_値ならび). テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび) :- findall(_,テーブル定義(_テーブル名,_,_),_値ならび). 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび,_検索した値) :- テーブル定義(_テーブル名,_nth1,_検索項目名), nth1(_nth1,_値ならび,_検索した値). 値ならび(_テーブル名,_値ならび) :- _副目標 =.. [_テーブル名|_値ならび], catch(_副目標,error(S,_error),true), 実行検査(_項,_error). 実行検査(_項,_error) :- var(_error),!. 参照('Prolog Wikipedia リレーショナルデータベース'). % 以下のサイトは % % ?- 戦艦(_艦船名,_レベル,_耐久,_火力,_雷装,_対空,_速力). 出典('twitter by @kamina741'). 戦艦(比叡改二,124,91,144,0,100,高速). 戦艦(比叡改二,112,91,131,0,90,高速). 戦艦(比叡改,110,83,134,0,96,高速). 戦艦(比叡改,107,83,174,0,75,高速). 戦艦(比叡改,107,83,121,0,95,高速). 戦艦(比叡改,100,83,145,0,99,高速). 戦艦(比叡改,100,83,121,0,95,高速). 戦艦(比叡,100,71,78,0,29,高速). 戦艦(比叡,100,71,64,0,25,高速). 戦艦(比叡,100,71,98,0,32,高速). テーブル定義(戦艦,1,艦船名). テーブル定義(戦艦,2,レベル). テーブル定義(戦艦,3,耐久). テーブル定義(戦艦,4,火力). テーブル定義(戦艦,5,雷装). テーブル定義(戦艦,6,対空). テーブル定義(戦艦,7,速力). テーブル検索(_テーブル名,_検索項目名,_検索した値) :- テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび), 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび), 値ならび(_テーブル名,_値ならび), テーブル定義をもとに値ならびを生成(_テーブル名,_値ならび) :- findall(_,テーブル定義(_テーブル名,_,_),L). 値ならび中の検索項目を選択(_テーブル名,_検索項目名,_値ならび) :- テーブル定義(_テーブル名,_nth1,_検索項目名), nth1(_nth1,_値ならび,_検索した値). 値ならび(_テーブル名,_値ならび) :- _副目標 =.. [_テーブル名|_値ならび], catch(_副目標,error(S,_error),true), 実行検査(_項,_error). 実行検査(_項,_error) :- var(_error),!. 参照('Prolog Wikipedia リレーショナルデータベース'). % 以下のサイトは # 中学生になるホンガツオ君はいつも学校の成績が悪く、父・海平に怒られます。 # 今回も中間テストでどれもひどい点数をとってしまい、海平の雷が落ちるのは間違いありません。 # # 全教科のテスト結果を同時にみせると、海平の怒りは最大級となり、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), sumlist(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),_怒り指数 >= _最小の怒り指数). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # # かたやん印刷所では、いまの時代においてもグーテンベルグ印刷にこだわって印刷をしています。 # グーテンベルグ印刷とは、活版(活字を組み合わせて作った版)で印刷する方法です。(Wikipedia) # # かたやん印刷所の所長かたやんは、使った活字を元の場所に戻さないので、 # いつも活字を入れているボックスはぐちゃぐちゃで、 # ほしい活字をすぐに見つけ出すことができません。 # # そこで見かねた印刷所の副所長エミーは、活字を入れているボックスビデオで撮影し、 # 画像解析し、ボックスのどこにどの活字があるかを解析し、 # ほしい文字列の活字がどこにあるか瞬時にみつけだすプログラミングを作ることにしました。 # # 現状の状態のボックスは以下のようになっています。 # # # 6×6のボックスの中から"PRO, PROGRAMMER"という活字を探し出したいです。 # カンマやスペースは1つの活字としてカウントします。 # ですので、今回は文字13個、カンマ1個、スペース1個の合計15個の活字が必要です。 # 一度使った活字は2回使うことはできません。 # # 活字の場所は、(縦番号,横番号)で表すと以下のような順番で活字を取り出すことができます。 # 縦番号は上から下の方向に、横番号は左から右の方向に、1から数えます。 # 1,4 = P # 2,1 = R # 1,6 = O # 5,2 = , # 5,4 = space # 2,2 = P # 3,4 = R # 4,5 = O # 5,1 = G # 4,3 = R # 1,1 = A # 2,5 = M # 6,1 = M # 2,4 = E # 6,6 = R # # # 上記の例では、例えば"P"という文字が2回でてきますが、(1,4)と(2,2)にある"P"はどちらを先につかってもかまいません。 # また場所の特定は1つのみ記述すればよいです。すべての場所番号を書く必要はありません。 # # 画像解析したボックスのデータはCSVで出力されます。 # ボックスのデータを使ってほしい文字列を作るための活字の在り処を探しだしてください。 # # ■資料 # gutenberg.zip # zipファイルを解凍すると以下のファイルが入っています。 # # gutenberg.csv # このボックスから"STAY HUNGRY, STAY FOOLISH"という活字を取り出してください。 # 文字21個、カンマ1個、スペース3個で、合計25個の活字が必要です。 # # answer.txt # 解答用テキストファイルです。 # # ■解答方法 # 解答用テキストファイル(answer.txt)を完成させ、アップロードしてください。 # ※解答用テキストファイル(answer.txt)以外のファイル形式(zipなど)をアップロードした場合は評価対象外となります。 # '20×20のボックスの生成' :- open('gutenberg.csv',read,Instream), '20×20のボックスの生成'(Instream,_20掛ける20のボックス), close(Instream), assertz('20×20のボックス'(_20掛ける20のボックス)). '20×20のボックスの生成'(Instream,[]) :- at_end_of_stream(Instream),!. '20×20のボックスの生成'(Instream,[L|R]) :- get_line(Instream,Line), split(Line,['\t'],L), '20×20のボックスの生成'(Instream,R). '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス) :- atom_chars(_ある文字列,_文字ならび), '20×20のボックスの中からある文字列を取り出す'(_文字ならび,_20掛ける20のボックス,L), 解の表示(L). '20×20のボックスの中からある文字列を取り出す'([],_20掛ける20のボックス,[]) :- !. '20×20のボックスの中からある文字列を取り出す'([_文字|_残り文字ならび],_20掛ける20のボックス_1,[[_文字,_行目,_列目]|R]) :- ある文字を取り出す(_文字,_20掛ける20のボックス_1,1,_列目,_20掛ける20のボックス_2), '20×20のボックスの中からある文字列を取り出す'(_残り文字ならび,_20掛ける20のボックス_2,R). ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行_2|R_1]) :- nth1(_列目,_行,_文字), 行を更新する(_行,_列目,_行_2),!. ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行|R_2]) :- _行目_2 is _行目 + 1, ある文字を取り出す(_文字,R_1,_行目_2,_列目,R_2). 行を更新する(_行,_列目,_行_2) :- length([_|L1],_列目), append(L1,[_|R],_行), append(L1,[''|R],_行_2),!. 解の表示(L) :- tell('ans.txt'), forall(member([_文字,_行目,_列目],L),writef('%t,%t,%t\n',[_文字,_行目,_列目])), told. get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). split('',_,[],[]) :- !. split(_文字列,_区切り文字列ならび,[_区切り文字列|R3],[_副文字列|R4]) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列), split(_残り文字列,_区切り文字列ならび,R3,R4). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), atom_length(_区切り文字列,_長さ), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). :- '20×20のボックスの生成'(_CSVファイル). :- '20×20のボックス'(_20掛ける20のボックス), '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # '20×20のボックスの中からある文字列を取り出す'(_20掛ける20のボックス,_行目,_列目,_ある文字列) :- '20×20のボックスの中から'(_20掛ける20のボックス), ある文字列を取り出す(_20掛ける20のボックス,_行目,_列目,_ある文字列). '20×20のボックスの中から'(_20掛ける20のボックス) :- length(_20掛ける20のボックス,20), forall( member(_20のボックス,_20掛ける20のボックス), '20のボックス'(_20のボックス)). '20のボックス'(_20のボックス) :- length(_20のボックス,20), forall( member(_ボックス,_20のボックス), ボックス(_ボックス)). ボックス([_|_]) :- !. ボックス([]). ある文字列を取り出す(_20掛ける20のボックス,_行目,_列目,_ある文字列) :- nth1(_行目,_20のボックス,_20掛ける20のボックス), nth1(_列目,_20のホックス,_ボックス), member(_ある文字列,_ボックス). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # '20×20のボックスの中からある文字列を取り出す'(_20掛ける20のボックス,_行目,_列目,_ある文字列) :- _ボックス = [_|_], '20×20のボックス'(_20掛ける20のボックス), nth1(_行目,_20のボックス,_20掛ける20のボックス), nth1(_列目,_20のホックス,_ボックス), member(_ある文字列,_ボックス). '20×20のボックス'(_20掛ける20のボックス) :- length(_20掛ける20のボックス,20), forall(member(_20のボックス,_20掛ける20のボックス),length(_20のボックス,20)). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # '20×20のボックスの中からある文字列を取り出す'(_20掛ける20のボックス,_行目,_列目,_ある文字列) :- '20×20のボックス'(_20掛ける20のボックス), nth1(_行目,_20のボックス,_20掛ける20のボックス), nth1(_列目,_20のホックス,_ボックス), member(_ある文字列,_ボックス). '20×20のボックス'(_20掛ける20のボックス) :- length(_20掛ける20のボックス,20), forall(member(_20のボックス,_20掛ける20のボックス),length(_20のボックス,20)). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # '20×20のボックスの中からある文字列を取り出す'(_20掛ける20のボックス,_行目,_列目,_ある文字列) :- '20×20のボックス'(_20掛ける20のボックス), nth1(_行目,_20のボックス,_20掛ける20のボックス), nth1(_列目,_20のホックス,[_ある文字列]). '20×20のボックス'(_20掛ける20のボックス) :- length(_20掛ける20のボックス,20), forall(member(_20のボックス,_20掛ける20のボックス),length(_20のボックス,20)). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/300 # お題:次のような規則の配列でインデックス番号iの配列の値を求める。 # ・インデックス番号1の配列の値A(1)は1である。 # ・配列の値は昇順である。 # ・インデックス番号iの配列の値A(i)は配列内のiの個数である。 # 例 # A(10) -> 4 # A(100) -> 14 # A(1000) -> 45 # '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_i,X) :- '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'([],2,_i,2,_a), nth1(_i,_a,X). '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_a,_インデッスク,_i,_繰り返し数_1,_a) :- _インデックス > _i,!. '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_a_1,_インデッスク,_i,_繰り返し数_1,_a) :- 繰り返し数_1から繰り返し個数を求めてインデックス列を登録する(_a_1,_インデックス,_繰り返し数_1,_次のインデックス,_繰り返し数_2,_a_2), '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_a_2,_次のインデックス,_i,_繰り返し数_2,_a). 繰り返し数_1から繰り返し数を求めてインデックス列を登録する(_a_1,_インデックス,_繰り返し数_1,_次のインデックス,_繰り返し数_2,_a) :- 繰り返し個数を得る(_a_1,_繰り返し数_1,_繰り返し数), _次のインデックス is _インデックス + _繰り返し数, インデッスク列の生成(_インデックス,_繰り返し数,L), _繰り返し数_2 is _繰り返し数_1 + 1, append(_a_1,L,_a),!. 繰り返し数を得る(_a,N,M) :- nth1(N,_a,M),!. 繰り返し数を得る(_,N,N). インデッスク列の生成(_インデックス,_繰り返し数,L) :- _インデックス_2 is _インデックス + _繰り返し数 - 1, findall(N,( between(_インデックス,_インデックス_2,N)), L). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/282 # お題:1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 # のこりの数からとりのぞいた2個の数を求める。 # 例 # 3,1,2,6 -> 4,5 # # '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 のこりの数からとりのぞいた2個の数を求める。'(_n,_とりのぞいた数_1,_とりのぞいた数_2) :- '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数), 'のこりの数からとりのぞいた2個の数を求める。'(1,_2個をとりのぞいたのこりの数,[],[_とりのぞいた数_1,_とりのぞいた数_2]). '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数) :- '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数), シャッフルして(_n,_1からnのn個の連続した整数,_シャッフルした1からnのn個の連続した整数), '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数). '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数) :- findall(M,between(1,_n,M),_1からnのn個の連続した整数). シャッフルして(_n,L1,L2) :- シャッフルして(1000,_n,L1,L2),!. シャッフルして(0,_,L,L). シャッフルして(M,_n,L1,L) :- R is random(_n) + 1, select(R,L1,L2), M_1 is M - 1, シャッフルして(M_1,_n,[R|L2],L). '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :- 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[],[_数_1,_数_2]), 'とりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数). 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[A,B],[A,B]) :- !. 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,L1,L) :- 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数), 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[_適当に選んだ数|L1],L). 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数) :- length(_シャッフルした1からnのn個の連続した整数,Len), R1 is random(Len), nth0(R1,_シャッフルした1からnのn個の連続した整数,_適当に選んだ数), \+(member(_適当に選んだ数,L1)),!. 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数) :- 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数). 'とりのぞく。'(_数_1,_数_2,_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :- select(_数_1,_シャッフルした1からnのn個の連続した整数,L1), select(_数_2,L1,_2個をとりのぞいたのこりの数). 'のこりの数からとりのぞいた2個の数を求める。'(_,_,L,L) :- length(L,2),!. 'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :- select(_n,L1,L1_2),!, _n_2 is _n + 1, 'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1_2,L2,L). 'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :- _n_2 is _n + 1, 'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1,[_n|L2],L). % 以下のサイトは % % カレンダー矩形/3 % '年カレンダー'(_年) :- 横並びカレンダーを表示する(_年,[1,2,3]), 横並びカレンダーを表示する(_年,[4,5,6]), 横並びカレンダーを表示する(_年,[7,8,9]), 横並びカレンダーを表示する(_年,[10,11,12]). 横並びカレンダーを表示する(_年,_月ならび) :- 月カレンダーを直列する(_年,_月ならび,LL1), 見出し表示(_年,_月ならび), カレンダー行の表示(LL2). 月カレンダーを直列する(_,[],[]). 月カレンダーを直列する(_年,[_月|R],LL) :- カレンダー矩形(_年,_月,LL1), 月カレンダーを直列する(_年,R,LL2), append(LL1,LL2,LL). 見出し表示(_年,_月ならび) :- write('\n'), forall(member(_月,_月ならび),writef('%6c%4r年 %2r月%8c')), write('\n\n'). カレンダー行の表示(_月カレンダー矩形ならび) :- between(1,7,_行), forall(member(_月カレンダー矩形,_月カレンダー矩形ならび), 週表示(_行,_月カレンダー矩形)), write('\n'), _行 = 7,!. 週表示(_行,_月カレンダー矩形) :- nth1(_行,_月カレンダー矩形,[_1,_2,_3,_4,_5,_6,_7]), writef('%3r%3r%3r%3r%3r%3r%3r ',[_1,_2,_3,_4,_5,_6,_7]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/83 # お題:次の式をn=10について計算し、大きい順に式と値を表示する。 # logは自然対数、sqrtは平方根、!は階乗、^は累乗とする。 # 2^n # 2^log(n) # 4^n # n # n^2 # n! # n*log(n) # log(n!) # log(log(n)) # sqrt(log(n)) # # '次の式をn=10について計算し、大きい順に式と値を表示する。 logは自然対数、sqrtは平方根、!は階乗、^は累乗とする。 2^n,2^log(n),4^n,n,n^2,n!,n*log(n),log(n!),log(log(n)),sqrt(log(n))' :- _n = 10, _nの階乗 is 10*9*8*7*6*5*4*3*2*1, findall([X,A],( nth1(_nth1,[2^_n,2^log(_n),4^_n,_n,_n^2,_nの階乗,_n*log(_n),log(_nの階乗),log(log(_n)),sqrt(log(_n))],F), nth1(_nth1,[2^_n,2^log(_n),4^_n,_n,_n^2,'10!',_n*log(_n),log('10!'),log(log(_n)),sqrt(log(_n))],A), X is F), L1), '大きい順に式と値を表示する。'(L1). '大きい順に式と値を表示する。'(L1) :- sort(L1,L2), reverse(L2,L3), forall(member([X,F],L3),writef('%t=%t\n',[F,X])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/3 # お題:aをもっとも近いbの倍数に丸める。ちょうど中間の場合は # 0から遠ざかる方向へ丸める。bが実数の場合は誤差はやむを得ないものとする。 # 例 # a=123,b=12 -> 120 # a=126,b=12 -> 132 # a=-123,b=12 -> -120 # a=-126,b=12 -> -132 # a=1.234,b=0.01 -> 1.23 # a=1.235,b=0.01 -> 1.24 # # 'aをもっとも近いbの倍数に丸める。ちょうど中間の場合は0から遠ざかる方向へ丸める。 bが実数の場合は誤差はやむを得ないものとする。'(_a,_b,_aにもっとも近いbの倍数) :- findall(_bの倍数,( nth1(_倍数,_,_), _bの倍数 is _b * _倍数, ( bの倍数がaをb以上超えたら終了(_bの倍数,_a,_b),!,fail;'bの倍数がaの前後(ただしaを超える場合はbの倍数とaの差はb未満)'(_bの倍数,_a,_b))), [_aに等しいかaより小さい数,_aに等しいかaより大きい数]), 'aをもっとも近いbの倍数に丸める。ちょうど中間の場合は0から遠ざかる方向へ丸める。'(_a,_aに等しいかaより小さい数,_aに等しいかaより大きい数,_aにもっとも近いbの倍数). bの倍数がaをb以上超えたら終了(_bの倍数,_a,_b) :- abs(_bの倍数) >= abs(_a + _b). 'bの倍数がaの前後(ただしaを超える場合はbの倍数とaの差はb未満)'(_bの倍数,_a,_b) :- abs(_bの倍数 - _a) =< abs(_b). 'aをもっとも近いbの倍数に丸める。ちょうど中間の場合は0から遠ざかる方向へ丸める。'(_a,_aに等しいかaより小さい数,_aに等しいかaより大きい数,_aに等しいかaより大きい数) :- abs(_aに等しいかaより大きい数 - _a) =< abs(_aに等しいかaより小さい数 - _a),!. 'aをもっとも近いbの倍数に丸める。ちょうど中間の場合は0から遠ざかる方向へ丸める。'(_,_aに等しいかaより小さい数,_aに等しいかaより大きい数,_aに等しいかaより小さい数). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/901 # [2] 要素の数が10の配列に2から始まる倍数を逆順に表示せよ # '要素の数が10のならびに2から始まる倍数を逆順に格納した後、表示せよ'(_要素の数が10のならび) :- 要素の数が10のならびに(_要素の数が10のならび), '2から始まる倍数を逆順に格納した後、'(10,1,_要素の数が10のならび), 表示せよ(_要素の数が10のならび). 要素の数が10のならびに(_要素の数が10のならび) :- length(_要素の数が10のならび,10). '2から始まる倍数を逆順に格納した後、'(0,_,_要素の数が10のならび) :- !. '2から始まる倍数を逆順に格納した後、'(_位置,N,_要素の数が10のならび) :- nth1(_位置,_要素の数が10のならび,N_1), N_1 is N * 2, _位置_1 is _位置 - 1, '2から始まる倍数を逆順に格納した後、'(_位置_1,N_1,_要素の数が10のならび). 表示せよ(_要素の数が10のならび) :- forall(member(N,_要素の数が10のならび),writef('%t ',[N])), write('\n'). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/955 # お題:自然数nの階乗の素因数2の個数を求める。(2014年センター試験) # n=5 -> 3 # n=13 -> 10 # # '自然数nの階乗の素因数2の個数を求める。(2014年センター試験)'(_n,_自然数nの階乗の素因数2の個数) :- findsum(_素因数2の個数,( between(1,_n,N), findsum(1,( nth1(_nth1,_,_), (\+(0 is N mod (2 ^ _nth1)),!,fail;true)), _素因数2の個数)), _自然数nの階乗の素因数2の個数). findsum(A,B,C) :- findall(A,B,L), sumlist(L,C). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/955 # お題:自然数nの階乗の素因数2の個数を求める。(2014年センター試験) # n=5 -> 3 # n=13 -> 10 # # '自然数nの階乗の素因数2の個数を求める。(2014年センター試験)'(_自然数n,_自然数nの階乗の素因数2の個数) :- findsum(_ある自然数の素因数2の個数,( between(1,_自然数n,_ある自然数), ある自然数の素因数2の個数を求める(_ある自然数,_ある自然数の素因数2の個数)), _自然数nの階乗の素因数2の個数). ある自然数の素因数2の個数を求める(_ある自然数,_ある自然数の素因数2の個数) :- nth0(_ある自然数の素因数2の個数,_,_), \+(0 is _ある自然数 mod (2 ^ (_ある自然数の素因数2の個数 + 1))),!. findsum(_選択項,_副目標,_合計) :- findall(_選択項,_副目標,_選択項ならび), sumlist(_選択項ならび,_合計). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/868 # [2] 入力した5文字までの文字列を5個まで格納して表示する。 # 5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、入力したすべての文字列を表示。 # '入力した5文字までの文字列を5個まで格納して表示する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、入力したすべての文字列を表示。' :- '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(_文字列を5個まで格納), '入力したすべての文字列を表示。'(_文字列を5個まで格納). '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(_文字列を5個まで格納) :- length(Ln,5), '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(Ln,_文字列を5個まで格納). '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'([_|Ln],[_5文字までの文字列|R]) :- 入力した5文字までの文字列を(_5文字までの文字列), \+(_文字列=''), '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(Ln,R). '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(_,_,[]). 入力した5文字までの文字列を(_5文字までの文字列) :- findall(_文字,( nth1(Nth1,_,_), ( Nth1 > 5,!,fail; get_char(_文字), ( _文字 = '\n',!,fail; true))), _入力文字ならび), atomic_list_concat(_入力文字ならび,_5文字までの文字列). '入力したすべての文字列を表示。'(_文字列を5個まで格納) :- forall(member(_文字列,_文字列を5個まで格納),writef('%t\n',[_文字列])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/929 # お題:3次元の配列を連番で初期化する。 # Jの場合 # a=:i.2 3 4 # a # 0 1 2 3 # 4 5 6 7 # 8 9 10 11 # # 12 13 14 15 # 16 17 18 19 # 20 21 22 23 # # (<1;2;3){a # 23 # # '3次元のならびを連番で初期化する。'(_3次元のならび,_初期化された3次元のならび) :- ならびの構造(_3次元のならび,_1,_2,_3), findall(_初期化された2次元ならび,( nth0(N1,_3次元のならび,_), findall(_初期化された1次元ならび,( nth0(N2,_2次元ならび,_), findall(N,( U is _1 * _2, U_2 is U + _3 - 1, between(U,U_2,N)), _初期化された1次元ならび)), _初期化された2次元ならび)), _初期化された3次元ならび). ならびの構造(LLL,_1,_2,_3) :- length(_3次元のならび,_1), _3次元のならび = [_2次元のならび|_], length(_2次元のならび,_2), _2次元のならび = [_1次元のならび|_], length(_1次元のならび,_3). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/696 # [1] 授業単元: Cプログラミング # [2] 問題文(含コード&amp;リンク): データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が # 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の # 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 # 探索は二分探索法を使いソートにはクイックソートを使うこと。 # # 表示は以下のようにすること。 # Input A Student Number: 14【Enter】 # Ranking : #269 /*最高得点は1位とせよ.*/ # Subject A : 86 # Subject B : 59.1 # Subject C : 220.42 # Total : 365.52 # # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/697 # 【備考】 # 科目 A の得点は int 型,科目 B,C の得点は double 型で扱うこと. # 合計点が同じになる学生はいないということは既知とせよ. # データの人数は 1000 人であることもわかっているとせよ. # 学籍番号には抜けがある.学籍番号が存在しない場合は,”No data”と表示するようにせよ. # 雛型 (121.c) を用いよ.main 関数は完成しているので,main 関数内で呼び出している関数を作成せよ. # 'データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 探索は二分探索法を使いソートにはクイックソートを使うこと。' :- 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび), 合計得点の順位表を作る(_学生成績ならび,_合計得点の順位表), キーボードから入力された学籍番号の(_学籍番号), 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績), '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績). 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび) :- get_lines('rep_data.txt',Lines), findall(L,( member(_行,Lines), split(_行,[','],L)), _学生成績ならび). 合計得点の順位表を作る(_学生成績ならび,_合計得点の重複要素を許す降順ならび) :- findall(_合計,( member([_,A,B,C],_学生成績ならび), _合計 is A + B + C), _合計得点ならび), 重複要素を許す降順整列(_合計得点ならび,_合計得点の重複要素を許す降順ならび). キーボードから入力された学籍番号の(_学籍番号) :- 整数を得る(学籍番号,_学籍番号 >= 0,_学籍番号). キーボードから入力された学籍番号の(_学籍番号) :- キーボードから入力された学籍番号の(_学籍番号). 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績) :- length(Lines,_最大要素位置), 二分探索法を使い学生の成績を得る(1,_最大要素位置,_最大要素位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_要素位置,_要素位置,Lines,_学籍番号,_学生の成績) :- !, nth1(_要素位置,Lines,[_学籍番号|_学生の成績]). 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- succ(_要素位置_1,1,_要素位置_2),!, 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績), 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- _検索位置 is (_要素位置_1 + _要素位置_2) // 2, nth1(_検索位置,Lines,[_学籍番号_1|_学生の成績_1]), 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_学生の成績_1,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績,_学籍番号,_学生の成績) :- !. 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @< _学籍番号, 二分探索法を使い学生の成績を得る(_要素位置_1,_検索位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @> _学籍番号, 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_2,Lines,_学籍番号,_学生の成績). 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_1,Lines,[_学籍番号|_学生の成績]),!. 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_2,Lines,[_学籍番号|_学生の成績]). 重複要素を許す降順整列([],[]). 重複要素を許す降順整列([_軸要素|_残りならび],_合計得点の重複要素を許す降順ならび) :- 重複要素を許す降順分割(_軸要素,_残りならび,_軸要素と等しいか大きいならび,_軸要素より小さいならび), 重複要素を許す降順整列(_軸要素と等しいか大きいならび,_合計得点の重複要素を許す降順ならび_1), 重複要素を許す降順整列(_軸要素より小さいならび,_合計得点の重複要素を許す降順ならび_2), append(_合計得点の重複要素を許す降順ならび_1,[_軸要素|_合計得点の重複要素を許す降順ならび_2],_合計得点の重複要素を許す降順ならび). 重複要素を許す降順分割(_,[],[],[]) :- !. 重複要素を許す降順分割(_軸要素,[A|R],[A|R2],R3) :- A @>= _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). 重複要素を許す降順分割(_軸要素,[A|R],R2,[A|R3]) :- A @< _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績) :- _学生の成績 = [_科目Aの得点,_科目Bの得点,_科目Cの得点], _学生の合計得点 = _科目Aの得点+_科目Bの得点+_科目Cの得点, nth1(_順位,_合計得点の重複を許す降順ならび,_学生の合計得点), writef('学籍番号 :: %t\n順位 :: #%t\n,科目%t :: %t\n科目%t :: %t\n科目%t :: %t\n',[_学籍番号,_順位,'A',_科目Aの得点,'B',_科目Bの得点,'C',_科目Cの得点]). get_lines(Lines) :- get_lines(user_input,Lines). get_lines(Stream,Lines) :- findall(Line,( get_line(Stream,Line), ( Line=end_of_file,!,fail; true)), Lines). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_line(user_input,X). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/775 # お題:文字を円形に並べる。一番上が最初の文字。時計回りに等間隔で並べる。 # 半径は文字間隔が離れすぎず近すぎない程度になるよう適当に選ぶ。 # # '文字を円形に並べる。一番上が最初の文字。時計回りに等間隔で並べる。'(_文字列) :- atom_chars(_文字列,_文字ならび), 文字盤を用意する(_文字ならび,_文字盤), 文字盤に円形に文字を書き込む(_文字ならび,_文字盤), 文字を表示する(_文字盤). 文字盤を用意する(_文字ならび,_文字盤) :- length(_文字ならび,_文字数), '_文字数+1の文字盤を作る'(_文字数,_文字盤). '_文字数+1の文字盤を作る'(_文字数,_文字盤) :- _文字数_1 is _文字数 + 1, length(_文字盤,_文字数_1), findall(L,( length(L,_文字数_1)), _文字盤). 円形に文字を書き込む(_文字ならび,_文字盤) :- length(_文字ならび,_文字ならびの要素数), _半径 is _文字ならびの要素数 // 2, 点に文字を書き込む(0,_文字ならび,_文字ならびの要素数,_半径,_文字盤). 点に文字を書き込む(_,[],_,_,_文字盤) :- !. 点に文字を書き込む(_n,[_文字|R],_分割数,_半径,_文字盤) :- '_x,_yの座標点を得る'(_n,_半径,_分割数,_x,_y), '文字盤の_x,_yに_文字を埋める'(_x,_y,_文字,_文字盤), _n_2 is _n + 1, 点に文字を書き込む(_n_2,R,_分割数,_半径,_文字盤). '_x,_yの座標点を得る'(_n,_半径,_分割数,_x,_y) :- _x is truncate(sin((2 * pi) / _分割数 * _n + (pi / 2)) * _半径 + _半径 + 0.5), _y is truncate(cos((2 * pi) / _分割数 * _n + (pi / 2)) * _半径 + _半径 + 0.5). '文字盤の_x,_yに_文字を埋める'(_x,_y,_文字,_文字盤) :- nth1(_y,_文字盤,L), nth1(_x,L,_文字),!. 文字を表示する([]) :- !. 文字を表示する([L|R]) :- forall(member(A,L),変数は空白に埋めて文字を出力する(A)), write('\n'), 文字を表示する(R). 変数は空白に埋めて文字を出力する(A) :- var(A), write(' '),!. 変数は空白に埋めて文字を出力する(A) :- write(A). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/619 # 2014の2014乗の下4桁を標準出力に表示せよ # # 制限 # ・インクルードはstdio.hのみ # ・main実行開始から、出力間までの時間が1秒未満 # ・実行ファイルサイズ 50KB未満 # # '2014の2014乗の下4桁を標準出力に表示せよ' :- '2014の2014乗の下4桁を'(1,2014,_下4桁ならび), 標準出力に表示せよ(_下4桁ならび),!. '2014の2014乗の下4桁を'(2014,N,_下4桁ならび) :- 下4桁ならび(N,_下4桁ならび),!. '2014の2014乗の下4桁を'(_nth1_1,N_1,N) :- N_2 is N_1 * 2014 mod 10000, _nth1_2 is _nth1_1 + 1, '2014の2014乗の下4桁を'(_nth1_2,N_2,N). 下4桁ならび(N,[_1,_2,_3,_4]) :- number_chars(N,L2), append(L1,L2,[_1,_2,_3,_4]), all(L1,0). 標準出力に表示せよ(_下4桁ならび) :- writef('%t%t%t%t\n',_下4桁ならび). all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/712 # 以前どこかで見かけた問題だけど # 「デジタル式の時計をアナログ式に変換する」 # 入出力サンプル # http://ime.nu/codepad.org/XcWCtEF5 # 目盛りをo、短針をX、長針をxで表す # 重なったときはXで表す # ただし短針は最も近い目盛りを指すようにする # # # X # o o # # o o # # o o # # o o # # o o # o # # (0時0分) # 時計板(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11, [[' ',' ',' ',' ',' ',' ',' ',' ',' ',_0,' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',_11,' ',' ',' ',' ',' ',' ',' ',' ',' ',_1,' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',_10,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',_2,' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [_9,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',_3], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',_8,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',_4,' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',_7,' ',' ',' ',' ',' ',' ',' ',' ',' ',_5,' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',_6,' ',' ',' ',' ',' ',' ',' ',' ',' ']]). 'デジタル式の時計をアナログ式に変換する。 目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分) :- 時計板(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_時計板), '目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11), 時計板の表示(_時計板). '目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11) :- '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]), '長針はxで表す。 重なったときはXで表す。'(_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]), 変数として残っている所にoを埋める([_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]). '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- '0分から29分までは短針の位置は本来の時の位置である'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]),!. '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- '30分から59分までは短針は次の時に移動する'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]). '0分から29分までは短針の位置は本来の時の位置である'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- _分 < 30, nth0(_時,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11],'X'). '30分から59分までは短針は次の時に移動する'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- _分 >= 30, _時_2 is (_時 + 1) mod 12, nth0(_時_2,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11],'X'). '長針はxで表す。 重なったときはXで表す。'(_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- _分_1 is truncate((_分 / 12) + 0.5), 分を埋める(_分_1,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]). 分をxで埋める(_分_1,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- nth0(_分_1,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11],'x'),!. 分をxで埋める(_,_). 変数として残っている所にoを埋める([]). 変数として残っている所にoを埋める([o|R]) :- 変数として残っている所にoを埋める(R),!. 変数として残っている所にoを埋める([_|R]) :- 変数として残っている所にoを埋める(R). 時計板の表示(_時計板) :- forall(member(_行,_時計板),行を表示する(_行)). 行を表示する(_行) :- atomic_list_concat(_行,_表示行), writef('%t\n',[表示行]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/712 # 以前どこかで見かけた問題だけど # 「デジタル式の時計をアナログ式に変換する」 # 入出力サンプル # http://ime.nu/codepad.org/XcWCtEF5 # 目盛りをo、短針をX、長針をxで表す # 重なったときはXで表す # ただし短針は最も近い目盛りを指すようにする # # # X # o o # # o o # # o o # # o o # # o o # o # # (0時0分) # 時計板([_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11], [[' ',_0,' '], [' ',_11,' ',_1,' '], [' '], [' ',_10,' ',_2,' '], [' '], [_9,' ',_3], [' '], [' ',_8,' ',_4,' '], [' '], [' ',_7,' ',_5,' '], [' ',_6,' ']]). 'デジタル式の時計をアナログ式に変換する。 目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分) :- 時計板(_0から_11までの変数ならび,_時計板), '目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび), 時計板の表示(_時計板). '目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび) :- '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび), '長針はxで表す。 重なったときはXで表す。'(_分,_0から_11までの変数ならび), 変数として残っている所にoを埋める(_0から_11までの変数ならび). '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび) :- '0分から29分までは短針の位置は本来の時の位置である'(_時,_分,_0から_11までの変数ならび),!. '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび) :- '30分から59分までは短針は次の時に移動する'(_時,_分,_0から_11までの変数ならび). '0分から29分までは短針の位置は本来の時の位置である'(_時,_分,_0から_11までの変数ならび) :- _分 < 30, nth0(_時,_0から_11までの変数ならび,'X'). '30分から59分までは短針は次の時に移動する'(_時,_分,_0から_11までの変数ならび) :- _分 >= 30, _時_2 is (_時 + 1) mod 12, nth0(_時_2,_0から_11までの変数ならび,'X'). '長針はxで表す。 重なったときはXで表す。'(_分,_0から_11までの変数ならび) :- _分_1 is truncate((_分 / 12) + 0.5), 分を埋める(_分_1,_0から_11までの変数ならび). 分をxで埋める(_分_1,_0から_11までの変数ならび) :- nth0(_分_1,_0から_11までの変数ならび,'x'),!. 分をxで埋める(_,_). 変数として残っている所にoを埋める([]). 変数として残っている所にoを埋める([o|R]) :- 変数として残っている所にoを埋める(R),!. 変数として残っている所にoを埋める([_|R]) :- 変数として残っている所にoを埋める(R). 時計板の表示(_時計板) :- forall(member(_行,_時計板),行を表示する(_行)). 行を表示する(_行) :- atomic_list_concat(_行,_表示行), writef('%t\n',[表示行]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/684 # お題: ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ # # 出力: http://ime.nu/codepad.org/9Qm1zRxy # # 一番上の「☆」と土台の「||」は固定でよい # 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する # # 解答例: http://ime.nu/codepad.org/aR7eI9F2 # # ☆ # || # ☆ # ** # || # ☆ # b* # *i*o # || # ☆ # ** # **** # ****** # || # ☆ # *b # **** # i**%*J # *Ni***** # || # ☆ # ** # *%** # *****i # **JX**** # ********** # || # ☆ # %* # **%* # *i***o # ******** # ****%***** # **o%****oi*b # || 葉と飾り(20,[*,*,*,*,*,*,*,*,*,*,*,*,*,'N','i','X','J',o,'%',b]). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ 出力: http://ime.nu/codepad.org/9Qm1zRxy 一番上の「☆」と土台の「||」は固定でよい 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する' :- forall((between(2,8,_何段), 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_何段,_クリスマスツリー)), クリスマスツリーの表示(_クリスマスツリー)). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_何段,_クリスマスツリー) :- length(_クリスマスツリー,_何段), append([☆|L1],['||'],_クリスマスツリー), findall(_段,( nth1(_段目,_クリスマスツリー,_段), 一段生成(_段目,_段)), _クリスマスツリー). 一段生成(_段目,_飾りを含む葉) :- var(_飾りを含む葉), length(_段,_段目), 飾りを含む葉の生成(_段,_飾りを含む葉),!. 一段生成(_,_既に存在するもの) :- \+(var(_既に存在するもの)). 飾りを含む葉の生成(_段,_一段の葉飾り) :- 葉と飾り(_基数,_葉と飾りならび), findall(_葉または飾り,( 葉または飾りの選択(_段,_基数,_葉と飾りならび,_葉または飾り)), _葉または飾りならび), atomic_list_concat(_葉または飾りならび,_一段の葉飾り),!. 葉または飾りの選択(_段,_基数,_葉と飾りならび,_葉または飾り) :- member(_葉または飾り,_段), _乱数 is random(_基数), nth0(_乱数,_葉と飾りならび,_葉または飾り). クリスマスツリーの表示(_クリスマスツリー) :- forall(member(_段,_クリスマスツリー), writef('%t\n',[_段])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/684 # お題: ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ # # 出力: http://ime.nu/codepad.org/9Qm1zRxy # # 一番上の「☆」と土台の「||」は固定でよい # 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する # # 解答例: http://ime.nu/codepad.org/aR7eI9F2 # # ☆ # || # ☆ # ** # || # ☆ # b* # *i*o # || # ☆ # ** # **** # ****** # || # ☆ # *b # **** # i**%*J # *Ni***** # || # ☆ # ** # *%** # *****i # **JX**** # ********** # || # ☆ # %* # **%* # *i***o # ******** # ****%***** # **o%****oi*b # || 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ 出力: http://ime.nu/codepad.org/9Qm1zRxy 一番上の「☆」と土台の「||」は固定でよい 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する' :- forall((between(2,8,_段), 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_段,_クリスマスツリー)), クリスマスツリーの表示(_クリスマスツリー)). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_段,_クリスマスツリー) :- length(L,_段), append([☆|L1],['||'],L), findall(A,( nth1(_nth1,L,A), '一段生成'(_nth1,A)), L). '一段生成'(_nth1,A) :- var(A), length(L,_nth1), 飾りを含む葉の生成(L,A),!. '一段生成'(_,A) :- \+(var(A)). 飾りを含む葉の生成(L,A) :- findall(B,( member(B,L), _乱数 is random(20), nth0(_乱数,[*,*,*,*,*,*,*,*,*,*,*,*,*,'N','i','X','J',o,'%',b],B)), L), atomic_list_concat(L,A),!. クリスマスツリーの表示(_クリスマスツリー) :- forall(member(A,_クリスマスツリー), writef('%t\n',[A])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/667 # Cゲンガーの逆襲! # スレにコントリビュートするために問題作ったよ!! # 64ビット変数の基数62のハッシュを作ってみよう。 # あぁ、別に64ビットじゃなくてもいいや。とにかく基数62のハッシュを作ってみよう。 # これを知っていると、例えばURLの字数短縮したりとかまぁチョイチョイ使い道がある。 # 数学苦手だからこの程度しかできなくてごめんね。 # ちなみに62なのは、数字と、アルファベットの大文字小文字を全部足すと62になるから。 # 64のほうがキリがいいよね。 '64ビット変数の基数62のハッシュを作ってみよう。'(_64ビット整数) :- atom_chars('0123456789abcdefghijkomnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',_変換符号ならび), 基数62のハッシュを作る(_64ビット整数,_変換符号ならび,[],_ハッシュ値), writef('%t -> %t\n',[_64ビット整数,_ハッシュ値]),!. 基数62のハッシュを作る(0,_,L,_ハッシュ値) :- atomic_list_concat(L,_ハッシュ値),!. 基数62のハッシュを作る(_実,_変換符号ならび,L,_ハッシュ値) :- 基数62のハッシュ符号化(_実,_変換符号ならび,_商,_変換された符号), 基数62のハッシュを作る(_商,_変換符号ならび,[_変換された符号|L],_ハッシュ値). 基数62のハッシュ符号化(_実,_変換符号ならび,_商,_変換された符号) :- _剰余 is _実 mod 62, _商 is _実 // 62, nth0(_剰余,_変換符号ならび,_変換された符号). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/642 # お題:"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。 # "11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を # 返す。"1"から始めてこの操作を10回繰り返し、途中経過を表示する。 # 例 # 1 # 11 # 21 # 1211 # 111221 # 312211 # 13112221 # 1113213211 # 31131211131221 # 13211311123113112211 # 11131221133112132113212221 # # '"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。"11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を返す。"1"から始めてこの操作(以下、"この操作"とする)を10回繰り返し、途中経過を表示する。' :- length(Ln,10), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],'1'). '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([],_文字列) :- !. '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],_文字列) :- writef('%t\n',[_文字列]), この操作を(_文字列,_次の文字列), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,_次の文字列). この操作を(_文字列,_次の文字列) :- findall(_個数と連続した記号の結合文字列,( '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数), atomic_list_concat([_個数,_連続した記号],_個数と連続した記号の結合文字列)), _個数と連続した記号の結合文字列ならび), 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列). '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数) :- atom_chars(_文字列,_文字ならび), 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数). 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数) :- append([L1,L2,L3],_文字ならび), 'L2は_記号が_個数連続している'(L2,_連続した記号,_個数), '両隣は_連続した記号と異なる'(_連続した記号,L1,L3). '両隣は_連続した記号と異なる'(_連続した記号,L1,L3) :- \+((last(L1,A0),A0=_連続した記号)), \+((nth1(1,L3,A3),A3=_連続した記号)). 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列) :- atomic_list_concat(_個数と連続した記号の結合文字列ならび,_次の文字列). 'L2は_記号が_個数連続している'(L2,_記号,_個数) :- L2 = [_記号|R], all(R,_記号), length([_記号|R],_個数). all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/642 # お題:"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。 # "11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を # 返す。"1"から始めてこの操作を10回繰り返し、途中経過を表示する。 # 例 # 1 # 11 # 21 # 1211 # 111221 # 312211 # 13112221 # 1113213211 # 31131211131221 # 13211311123113112211 # 11131221133112132113212221 # # '"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。"11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を返す。"1"から始めてこの操作(以下、"この操作"とする)を10回繰り返し、途中経過を表示する。' :- length(Ln,10), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,'1'). '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([],_文字列) :- !. '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],_文字列) :- writef('%t\n',[_文字列]), この操作を(_文字列,_次の文字列), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,_次の文字列). この操作を(_文字列,_次の文字列) :- findall(_個数と連続した記号の結合文字列,( '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数), atomic_list_concat([_個数,_連続した記号],_個数と連続した記号の結合文字列)), _個数と連続した記号の結合文字列ならび), 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列). '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数) :- atom_chars(_文字列,_文字ならび), 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数). 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数) :- append(L1,L2,L3,_文字ならび), 'L2は_記号が_個数連続している'(L2,_連続した記号,_個数), '両隣は_連続した記号と異なる'(_連続した記号,L1,L3). '両隣は_連続した記号と異なる'(_連続した記号,L1,L3) :- \+((last(L1,A0),A0=_連続した記号)), \+((nth1(1,L3,A3),A3=_連続した記号)). 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列) :- atomic_list_concat(_個数と連続した記号の結合文字列ならび,_次の文字列). 'L2は_記号が_個数連続している'(L2,_記号,_個数) :- L2 = [_記号|R], all(R,_記号), length([_記号|R],_個数). all([],_). all([V|R],V) :- all(R,V). append([],L2,L3,L) :- append(L2,L3,L). append([U|R1],L2,L3,[U|R4]) :- append(R1,L2,L3,R4). % 以下のサイトは # 出題場所 :: 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. % 以下のサイトは # prologについてです。 # 2乗和のプログラムが書けなくて困っています。1からXまでの2乗和Yを計算するプログラムssq(X,Y)を”一切isを用いず”に作成していただけないでしょうか?よろしくお願いします。 '2乗和のプログラムが書けなくて困っています。 1からXまでの2乗和Yを計算するプログラムssq(X,Y)を”一切isを用いず”に作成していただけないでしょうか? よろしくお願いします。'(X,Y) :- ssq(X,Y). ssq(X,Y) :- '1からXまでの2乗和Yを"一切isを用いず"に計算する'(X,Y). '1からXまでの2乗和Yを"一切isを用いず"に計算する'(X,_2乗和Y) :- '2乗和をリストとして表現する(ただしリストは平坦化されていない)'(X,_2乗和リスト表現), リストを平坦化してその要素数を数える(_2乗和リスト表現,_2乗和Y). '2乗和をリストとして表現する(ただしリストは平坦化されていない)'(X,_2乗和リスト表現) :- findall(LL,( '1からXまでの整数を要素数とするリストLを生成する'(X,L), リストによって2乗を表現する(L,LL)), _2乗和リスト表現). '1からXまでの整数を要素数とするリストLを生成する'(X,L) :- between(1,X,N), length(L,N). リストによって2乗を表現する(L1,LL) :- findall(L1,nth1(_,L1,_),LL). リストを平坦化してその要素数を数える(LL,_要素数) :- flatten(LL,L), length(L,_要素数). % 以下のサイトは # prologについてです。 # 2乗和のプログラムが書けなくて困っています。1からXまでの2乗和Yを計算するプログラムssq(X,Y)を”一切isを用いず”に作成していただけないでしょうか?よろしくお願いします。 ssq(X,Y) :- findall(LL,( between(1,X,M), length(L,M), findall(L,nth1(_,L,_),LL)), LL2), flatten(LL2,L2), length(L2,Y). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/449 # お題:与えられた配列をなるべくN等分せよ。 # 要素の順番は入れ替えず、配列の配列として返す。 # Nは1以上とする。 # データ構造は、リスト、ベクタ、タプルなどでも可。 # # 回答例およびチェック用出力例: ruby 1.8.6 # def narudiv(a, n) # d, m = a.size.divmod(n) # (1..n).map {|i| a.slice!(0, d + (i <= m ? 1 : 0))} # end # p narudiv((1..10).to_a, 3) # p narudiv((1..15).to_a, 4) # ↓ # [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]] # [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15]] # # '与えられた配列をなるべくN等分せよ。 要素の順番は入れ替えず、配列の配列として返す。 Nは1以上とする。 データ構造は、リスト、ベクタ、タプルなどでも可。'(_N,_ならび,_N等文されたならび) :- length(_ならび,_要素数), _D is _要素数 // _N, _M is _要素数 mod N, '_Mを各_Dに割り振る'(_D,_M,_N,_N等分されたならび), flatten(_N等分されたならび,_ならび). '_Mを各_Dに割り振る'(_D,_M,_N,_N等分されたならび) :- length(_N等分されたならび,_N), findall(_n,between(1,_N,_n),L1), 組合せ(L1,_M,_組合せ), '_N等分されたならびを充実させる'(_D,_組合せ,_N等分されたならび). '_N等分されたならびを充実させる'(_D,_組合せ,_N等分されたならび) :- findall(L2,( nth1(_nth1,_N等分されたならび,L), length(L,_D), '_nth1が_組合せに存在するときには枠を追加する'(_nth1,L,_組合せ,L2)), _N等分されたならび). '_nth1が_組合せに存在するときには枠を追加する'(_nth1,L,_組合せ,[_|L]) :- member(_nth1,_組合せ),!. '_nth1が_組合せに存在するときには枠を追加する'(_,L,_組合せ,L). 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R3]) :- N > 1, M is N - 1, 組合せ(R1,M,R3). 組合せ([_|R1],N,L) :- N > 1, 組合せ(R1,N,L). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/365 # お題:偶数の目が奇数の目より二倍でやすいイカサマさいころの実装と、 # それを実際に10万回ふって出た目の数を集計し出力するコード。 # # 出力例 # 1: 11103 # 2: 22287 # 3: 11114 # 4: 22170 # 5: 11089 # 6: 22237 # # 余力があれば、任意の目の数と出やすさに対応できるコードにしてください。 # # 偶数の目が奇数の目より二倍でやすいイカサマさいころ(_イカサマさいころの目) :- _乱数値 is random(9), nth0(_乱数値,[1,2,3,4,5,6,2,4,6],_イカサマさいころの目),!. 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際に10万回ふって出た目の数を集計し出力する :- 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し([],[],[],[],[],[],[],Ln,_1,_2,_3,_4,_5,_6), length(Ln,100000), 出力する(_1,_2,_3,_4,_5,_6). 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し(Ln,_1,_2,_3,_4,_5,_6,Ln,_1,_2,_3,_4,_5,_6). 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し(Ln_1,LL_1,Ln,LL) :- 偶数の目が奇数の目より二倍でやすいイカサマさいころ(_イカサマさいころの目), 出た目の数を集計し(_イカサマさいころの目,LL_1,LL_2), 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し([_|Ln_1],LL_2,Ln,LL). 出た目の数を集計し(_イカサマさいころの目,LL_1,LL_2) :- length([_|LL0],_イカサマさいころの目), append(LL0,[L|LL2],LL_1), append(LL0,[[_|L]|LL2],LL_2),!. 出力する(_1,_2,_3,_4,_5,_6) :- forall((nth1(_nth1,[_1,_2,_3,_4,_5,_6],L),length(L,_集計値)), writef('%t: %t\n',[_nth1,_集計値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/328 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # a) 4桁の西暦を入力として受け取り # b) その年のすべての日について次の演算を行い # c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 # (例) # 20 + 13 + 11 + 25 = 69 # d) 各日の小計を大きいものから順に # 20131231 = 76 # ... # 20131125 = 69 # ... # 20130101 = 35 # のように表示させるプログラムを作りなさい # 'a) 4桁の西暦を入力として受け取り b) その年のすべての日について次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 (例) 20 + 13 + 11 + 25 = 69 d) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させるプログラムを作りなさい '(_四桁の西暦) :- findall([_小計,_年月日整数],( 'b) その年のすべての日について'(_四桁の西暦,_年月日整数), '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計)), _小計_年月日整数ならび), 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_四桁の西暦,_小計_年月日整数ならび). 'b) その年のすべての日について'(_四桁の西暦,_年月日整数) :- between(1,12,_月整数), 月末日(_四桁の西暦,_月整数,_月末日整数), between(1,_月末日整数,_日整数), _年月日整数 is _四桁の西暦 * 10000 + _月整数 * 10 + _日整数. 月末日(_年整数,_月整数,_月末日整数) :- うるう年(_年整数), nth1(_月整数,[31,29,31,30,31,30,31,31,30,31,30,31],_月末日整数). 月末日(_年整数,_月整数,_月末日整数) :- \+(うるう年(_年整数)), nth1(_月整数,[31,28,31,30,31,30,31,31,30,31,30,31],_月末日整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4. '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計) :- 年の上位2桁(_年月日整数,_年の上位2桁), 年の下位2桁(_年月日整数,_年の下位2桁), 月(_年月日整数,_月整数), 日(_年月日整数,_日整数), _小計 is _年の上位2桁 + _年の下位2桁 + _月整数 + _日整数. 年の上位2桁(_年月日整数,_年の上位2桁) :- _年の上位2桁 is _年月日整数 // 1000000. 年の下位2桁(_年月日整数,_年の下位2桁) :- _剰余 is _年月日整数 mod 10000, _年の下位2桁 is _剰余 mod 100. 月(_年月日整数,_月整数) :- _剰余 is _年月日整数 mod 10000, _月整数 is _剰余_1 // 100. 日(_年月日整数,_日整数) :- _日整数 is _年月日整数 mod 100. 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_年整数,_小計_年月日整数ならび) :- 年の組みの合計(_年整数,_年の組みの合計), forall((for(43,N,2),_小計 is _年の組みの合計 + N,member([_小計,_年月日整数],_小計_年月日整数ならび)),writef('%t = %t\n',[_年月日整数,_小計])). 年の組みの合計(_年整数,_年の組みの合計) :- _年の組みの合計 is _年整数 // 100 + _年整数 mod 100. % for/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/328 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # a) 4桁の西暦を入力として受け取り # b) その年のすべての日について次の演算を行い # c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 # (例) # 20 + 13 + 11 + 25 = 69 # d) 各日の小計を大きいものから順に # 20131231 = 76 # ... # 20131125 = 69 # ... # 20130101 = 35 # のように表示させるプログラムを作りなさい # 'a) 4桁の西暦を入力として受け取り b) その年のすべての日について次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 (例) 20 + 13 + 11 + 25 = 69 d) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させるプログラムを作りなさい '(_四桁の西暦) :- findall([_小計,_年月日整数],( 'b) その年のすべての日について'(_四桁の西暦,_年月日整数), '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計)), _小計_年月日整数ならび), 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_小計_年月日整数ならび). 'b) その年のすべての日について'(_四桁の西暦,_年月日整数) :- between(1,12,_月整数), 月末日(_四桁の西暦,_月整数,_月末日整数), between(1,_月末日整数,_日整数), _年月日整数 is _四桁の西暦 * 10000 + _月整数 * 10 + _日整数. 月末日(_年整数,_月整数,_月末日整数) :- うるう年(_年整数), nth1(_月整数,[31,29,31,30,31,30,31,31,30,31,30,31],_月末日整数). 月末日(_年整数,_月整数,_月末日整数) :- \+(うるう年(_年整数)), nth1(_月整数,[31,28,31,30,31,30,31,31,30,31,30,31],_月末日整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4. '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計) :- 年の上位2桁(_年月日整数,_年の上位2桁), 年の下位2桁(_年月日整数,_年の下位2桁), 月(_年月日整数,_月整数), 日(_年月日整数,_日整数), _小計 is _年の上位2桁 + _年の下位2桁 + _月整数 + _日整数. 年の上位2桁(_年月日整数,_年の上位2桁) :- _年の上位2桁 is _年月日整数 // 1000000. 年の下位2桁(_年月日整数,_年の下位2桁) :- _剰余 is _年月日整数 mod 10000, _年の下位2桁 is _剰余 mod 100. 月(_年月日整数,_月整数) :- _剰余 is _年月日整数 mod 10000, _月整数 is _剰余_1 // 100. 日(_年月日整数,_日整数) :- _日整数 is _年月日整数 mod 100. 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_小計_年月日整数ならび) :- 各日の小計を大きいものから順に(_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび), forall(member([_小計,_年月日整数],_大きいものから順に整列した_小計_年月日整数ならび),writef('%t = %t\n',[_年月日整数,_小計])). 各日の小計を大きいものから順に(_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび) :- sort(_小計_年月日整数ならび,_小さいものから順に整列した_小計_年月日整数ならび), reverse(_小さいものから順に整列した_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび), % 以下のサイトは # 【 課題 】マス取りゲーム # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11/27 24:00 # 【 Ver  】"1.7.0_45" # 【 補足 】3×3のマスに『○』と『×』を交互に入力して9マス埋まったら終了です。 # 勝ち負けはいりません 戦略なしマス取りゲーム(_手順) :- 戦略なしマス取りゲーム(○,[a1,a2,a3,b1,b2,b3,c1,c2,c3],_手順). 戦略なしマス取りゲーム(_手番,[],[]) :- !. 戦略なしマス取りゲーム(_手番,_残りマスならび,_手順) :- 空いたマスがあれば戦略なしマス取りゲームを続ける(_手番,_残りマスならび,_手順). 空いたマスがあれば戦略なしマス取りゲームを続ける(_手番,_残りマスならび,[[_手番,_マス]|_手順]) :- 手番がマスをひとつ取る(_手番,_残りマスならび,_次の手番,_マス,_ひとつマスを取られた残りマスならび), 戦略なしマス取りゲーム(_次の手番,_ひとつマスを取られた残りマスならび,_手順). 手番がマスをひとつ取る(_手番,_残りマスならび,_次の手番,_マス,_ひとつマスを取られた残りマスならび) :- マスをひとつ取る(_残りマスならび,_マス), ひとつマスを取られた残りマスならび(_マス,_残りマスならび,_ひとつマスを取られた残りマスならび), 次の手番(_手番,_次の手番). マスをひとつ取る(_残りマスならび,_マス) :- length(_残りマスならび,_残りマス数), _乱順数 is random(_残りマス数), nth0(_乱順数,_残りマスならび,_マス). ひとつマスを取られた残りマスならび(_マス,_残りマスならび,_ひとつマスを取られた残りマスならび) :- select(_マス,_残りマスならび,_ひとつマスを取られた残りマスならび). 次の手番(○,×). 次の手番(×,○). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/68 # # お題:文字列をランダムに並べ替える。 # ただし、どの文字も元と同じ位置ではないこと。 '文字列をランダムに並べ替える。 ただし、どの文字も元と同じ位置ではないこと。'(_文字列,_ランダムに並べ替えた文字列) :- 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび), 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列). 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび) :- atom_length(_文字列,_文字列の長さ), length(_位置決めならび,_文字列の長さ), findall(N,between(1,_文字列の長さ,N),_整数順ならび), 位置を置換する(_整数順ならび,_文字列の置換位置ならび). 位置を置換する([],_位置決めならび) :- !. 位置を置換する([_位置1,_位置2,_位置3],_位置決めならび) :- 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび). 位置決めならび(L,_位置決めならび) :- 位置の交換(L,R,_位置決めならび), 位置を置換する(R,_位置決めならび). 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび) :- nth1(_位置1,_位置決めならび,_位置2), nth1(_位置2,_位置決めならび,_位置3), nth1(_位置3,_位置決めならび,_位置1),!. 位置の交換(L,L2,_位置決めならび) :- 位置選択(L,N1,L1), 位置選択(N2,L1,L2), nth1(N1,_位置決めならび,N2), nth1(N2,_位置決めならび,N1),!. 位置選択(L,_位置,L2) :- length(L,Len), _乱数値 is random(Len), length(L0,Len), append(L0,[_位置|R],L), append(L0,R,L2),!. 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列) :- findall(_文字,( member(_位置,_文字列の置換位置ならび), _位置_1 is _位置 - 1, sub_atom(_文字列,_位置_1,1,_,_文字)), _ランダムに並べ替えた文字ならび), atomic_list_concat(_ランダムに並べ替えた文字ならび,_ランダムに並べ替えた文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/194 # # [1] 授業単元:C言語 # # [2] 問題文(含コード&リンク): # 1〜100の整数のうち「6の倍数」の個数を表示するプログラムを作成しなさい、ただし、for文とif文を用いて作成すること # 1次元配列を用いて5人分の数学の得点を100点満点で入力し、「数学の得点の最小値と最大値」を画面表示、およびファイルに書き出すプログラムを作成しなさい。ただし、書き出し用ファイル名は「sugaku.txt」にしなさい。 # # '1次元配列を用いて5人分の数学の得点を100点満点で入力し、「数学の得点の最小値と最大値」を画面表示、およびファイルに書き出すプログラムを作成しなさい。ただし、書き出し用ファイル名は「sugaku.txt」にしなさい。' :- '1次元配列を用いて5人分の数学の得点を100点満点で入力し'(_5人文の数学の得点), '「数学の得点の最小値と最大値」を'(_5人分の数学の得点,_数学得点の最小値,_数学得点の最大値), '画面表示、'(_数学得点の最小値,_数学得点の最大値), 'およびファイルに書き出すプログラムを作成しなさい。ただし、書き出し用ファイル名は「sugaku.txt」にしなさい。'(_5人分の数学の得点). '1次元配列を用いて5人分の数学の得点を100点満点で入力し'(_5人文の数学の得点) :- length(_5人分の数学の得点,5), forall(nth1(_nth1,_5人分の数学の得点,_数学の得点),整数を得る(数学の得点,(_数学の得点>=0,_数学の得点=<100),_数学の得点)). '「数学の得点の最小値と最大値」を'(_5人分の数学の得点,_数学得点の最小値,_数学得点の最大値,_数学得点の最小値,_数学得点の最大値) :- 数学の得点の最小値(_5人分の数学の得点,_数学得点の最小値), 数学の得点の最大値(_5人分の数学の得点,_数学得点の最大値). 数学の得点の最小値(_5人分の数学の得点,_数学得点の最小値) :- select(_数学得点の最小値,_5人分の数学の得点,_残りの数学の得点), forall(member(N,_残りの数学の得点),N>=_数学得点の最小値). 数学の得点の最大値(_5人分の数学の得点,_数学得点の最大値) :- select(_数学得点の最大値,_5人分の数学の得点,_残りの数学の得点), forall(member(N,_残りの数学の得点),N=<_数学得点の最大値). '画面表示、'(_数学得点の最小値,_数学得点の最大値) :- writef('数学得点の最小値 = %t\n数学得点の最大値 = %t\n',[_数学得点の最小値,_数学得点の最大値]). 'およびファイルに書き出すプログラムを作成しなさい。ただし、書き出し用ファイル名は「sugaku.txt」にしなさい。'(_5人分の数学の得点) :- open('sugaku.txt',write,Outstream), forall(nth1(_nth1,_5人分の数学の得点,_数学の得点),writef(Outstream,'%t\n',[_数学の得点])), close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/142 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ # input関数とshow関数を作ること # コマンド引数にテキストファイルの名前を入れること # 'テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ。コマンド引数にテキストファイルの名前を入れること' :- コマンド引数からテキストファイルの名前を得る(_テキストファイル), テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル). コマンド引数からテキストファイルの名前を得る(_テキストファイル) :- current_prolog_flag(argv,ParameterList), append(_,['--'|[_テキストファイル]],ParameterList). テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル) :- テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル,Outstream), そのテキストファイルの中身を出力せよ(_テキストファイル). テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル) :- open(_テキストファイル,write,Outstream). そのなかに整数5個数字を入れる(Outstream), close(Outstream). そのなかに整数5個数字を入れる(Outstream) :- between(1,5,_何番目), 整数を得る(_整数), writef(Outstream,'%t\n',[_整数]), _何番目 = 5. そのテキストファイルの中身を出力せよ(_テキストファイル) :- open(_テキストファイル,read,Instream), copy_stream_data(Instream,user_output), close(Instream). % % ここではズルをして組込述語 copy_stream_data/2 を使って見た。 % % 本来ならget_lines/2とput_lines/2の組合せでコピーを表現するところ。 % % そのテキストファイルの中身を出力せよ(_テキストファイル) :- % get_lines(_テキストファイル,_行ならび), % put_lines(user_output,_行ならび). % % get_lines(_ファイル名,_行ならび) :- % open(_ファイル名,read,Instream), % findall(_行,( % repeat, % ( at_end_of_stream(Instream),!,fail; % get_line(Instream,_行))), % _行ならび), % close(Instream). % % put_lines(_ファイル名,_行ならび) :- % open(_ファイル名,write,Outstream), % forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), % close(Outstream). % % 以下のサイトは # # ●Regular Expressionの使用環境 # Visual C# # # ●検索か置換か? # 検索 # # ●説明 # 同じ文字が5回以上繰り返されている箇所のある行を検索したい # # ●対象データ→結果 # うわあああああい → マッチ # aaaaaaaa      → マッチ # あいあいあい   → マッチせず # 同じ文字が5回以上繰り返されている箇所のある行を検索したい(_文字列,_行) :- split(_文字列,['\n'],_行ならび), 同じ文字が5回以上繰り返されている箇所のある行ならびを検索する(_行ならび,_行). 同じ文字が5回以上繰り返されている箇所のある行ならびを検索する(_行ならび,_行) :- nth1(_,_行ならび,_行), 同じ文字が5回以上繰り返されている箇所のある行(_行). 同じ文字が5回以上繰り返されている箇所のある行(_文字列) :- sub_atom(_文字列,_,5,_,_適合文字列), atom_chars(_適合文字列,[A,A,A,A,A]),!. % 以下のサイトは # WinXP HomeでBorland C++ Compiler 5.5 # ・1からnまでの整数1個ずつで構成される全部でn個の要素から、 # r個の要素を重複なく取り出した場合の組み合わせを全て昇順で並べたものの中で、 # 具体的な組み合わせと具体的な序列が何番目かを相互に返すプログラム。 # 例 43C6なら、序数5054214は組み合わせ11,14,17,18,34,36 # 例 43C6なら、組み合わせ13,28,29,37,38,41は5498643 # コマンドはncr.exe [n],[r] [co][ra] x.txtの様な感じで '1からnまでの整数1個ずつで構成される全部でn個の要素から、 r個の要素を重複なく取り出した場合の組み合わせを全て昇順で並べたものの中で、 具体的な組み合わせと具体的な序列が何番目かを相互に返す'(_n,_r,_序数,_具体的な組合せ) :- findall(M,between(1,_n,M),L), findall(_組合わせ,組合せ(L,_r,_組合わせ),_組合わせならび), nth1(_序数,_組合わせならび,_具体的な組合わせ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R3]) :- N > 1, M is N - 1, 組合せ(R1,M,R3). 組合せ([_|R1],N,L) :- N > 1, 組合せ(R1,N,L). % 以下のサイトは 行列から行を取り出す(_行列,_行) :- 行列から行を取り出す(_行列,_,_行). 行列から行を取り出す(_行列,_行目,_行) :- nth1(_行目,_行列,_行). 行列から列を取り出す(_行列,_列) :- 行列から列を取り出す(_行列,_nth1,_列). 行列から列を取り出す(_行列,_列目,_列) :- 転置(_行列,_転置された行列), nth1(_列目,_転置された行列,_列). 行列の位置要素を取り出す(_行列,_行目,_列目,_要素) :- nth1(_行目,_行列,_行), nth1(_列目,_行,_要素). 行列の要素を置換する(_行列,_置換対象値,_置換値,_置換された行列) :- findall(_置換された行,( member(_行,_行列), 行を全置換する(_行,_置換対象値,_置換値,_置換された行)), _置換された行列). 行を全置換する([],_,_,[]). 行を全置換する([A|R1],A,B,[B|R4]) :- 行を全置換する(R1,A,B,R4),!. 行を全置換する([C|R1],A,B,[C|R4]) :- 行を全置換する(R1,A,B,R4). 行列の位置要素を置換する(_行列,_行目,_列目,_値,_置換された行列) :- 行を取り出す(_行列,_行目,_それまでの行ならび,_行,_それより後の行ならび), 行の列要素を置換する(_行,_列目,_値,_置換された行),!, append(_それまでの行ならび,[_置換された行|_それより後の行ならび],_置換された行列). 行を取り出す(_行列,_行目,_それまでの行ならび,_行,_それより後の行ならび) :- _行目_1 is _行目 - 1, length(_それまでの行ならび,_行目_1), append(_それまでの行ならび,[_行|_それより後の行ならび],_行列). 行の列要素を置換する(_行,_列目,_値,_置換された行) :- _列目_1 is _列目 - 1, length(L0,_列目_1), append(L0,[_|R],_行), append(L0,[_値|R],_置換された行). 行列の行を入れ替える(_行列,_行目_1,_行目_2,_入れ替えた行列) :- _行目_1 > _行目_2, 行列の行を入れ替える(_行列,_行目_2,_行目_1,_入れ替えた行列). 行列の行を入れ替える(_行列,_行目_1,_行目_2,_入れ替えた行列) :- _行目_1 < _行目_2, 行列の行を取り出す(_行列,_行目_2,_前ならび_2,_行_2,_後ろならび_2), 行列の行を取り出す(_前ならび_2,_行目_1,_前ならび_1,_行_1,_後ろならび_1), append(_前ならび_1,[_行_2|_後ろならび_1],_前ならび_2_2), append(_前ならび_2_2,[_行_1|_後ろならび_2],_入れ替えた行列). 行列の行を取り出す(_行列,_行目_2,_前ならび_2,_行_2,_後ろならび_2) :- _行目_2_1 is _行目_2 - 1, length(_前ならび_2,_行目_2_1), append(_前ならび_2,[_行_2|_後ろならび_2],_行列). 行列の行を取り出す(_前ならび_2,_行目_1,_前ならび_1,_行_1,_後ろならび_1) :- _行目_1_1 is _行目_1 - 1, length(_前ならび_1,_行目_1_1), append(_前ならび_1,[_行_1|_後ろならび_1],_前ならび_2). 行列の列を入れ替える(_行列,_列目_1,_列目_2,_入れ替えた行列) :- 転置(_行列,_転置された行列), 行列の行を入れ替える(_転置された行列,_列目_1,_列目_2,_入れ替えた転置された行列), 転置(_入れ替えた転置された行列,_入れ替えた行列). 行全体をn倍する(_行列,_行目,_n倍,_行がn倍された行列) :- _行目_1 is _行目 - 1, length(L0,_行目_1), append(L0,[_行|R],_行列), 行要素全てをn倍する(_行,_n倍,_全ての要素がn倍された行), append(L0,[_全ての要素がn倍された行|R],_行がn倍された行列). 行要素全てをn倍する([],_,[]) :- !. 行要素全てをn倍する([A|R1],_n倍,[B|R2]) :- B is A * _n倍, 行要素全てをn倍する(R1,_n倍,R2). 列全体をn倍する(_行列,_列目,_n倍,_列がn倍された行列) :- 転置(_行列,_転置された行列), 行全体をn倍する(_転置された行列,_列目,_n倍,_行がn倍された転置された行列), 転置(_行がn倍された転置された行列,_列がn倍された行列). 二つの行のある列要素がそれぞれの最小公倍数になるように二つの行を倍する(_行列,_行目_1,_行目_2,_列目,_変形した行列) :- 行列の位置要素を取り出す(_行列,_行目_1,_列目,_要素_1), 行列の位置要素を取り出す(_行列,_行目_2,_列目,_要素_2), 最小公倍数を取る(_要素_1,_要素_2,_最小公倍数), _行目_1の倍数 is _最小公倍数 // _要素_1, _行目_2の倍数 is _最小公倍数 // _要素_2, 行全体をn倍する(_行列,_行目_1,_行目_1の倍数,_行列_2), 行全体をn倍する(_行列,_行目_2,_行目_2の倍数,_変形した行列). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは nth1(_nth1,L,A) :- nth1([_],_nth1,L,A). nth1(Ln,_nth1,[A|_],A) :- length(Ln,_nth1). nth1(Ln,_nth1,[_|R],A) :- integer(_nth1), length(L2,_nth1), append(Ln,_,L2), nth1([_|Ln],_nth1,R,A). nth1(Ln,_nth1,[_|R],A) :- var(_nth1), nth1([_|Ln],_nth1,R,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/676 # # 【 課題 】カンマ区切られているtest.txtのx列のみを取り出し移動平均で値を出しなさい。平均をとる範囲は10とする。 # 【 形態 】Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】提出期限なし # 【 Ver  】java version "1.7.0_21" # 【 補足 】txtははこちらです。よろしくお願いします。 # www.dotup.org/uploda/www.dotup.org4425870.txt.html # # 'カンマ区切られているtest.txtのx列のみを取り出し移動平均で値を出しなさい。平均をとる範囲は10とする。'(_x列,_x列の移動平均ならび) :- 'カンマ区切られているtest.txtのx列のみを取り出し'(_x列,_x列ならび), '移動平均で値を出しなさい。平均をとる範囲は10とする。'(_x列ならび,_x列の移動平均ならび). 'カンマ区切られているtest.txtのx列のみを取り出し'(_x列,_x列ならび) :- get_split_lines('test.txt',[','],LL), findall(S,( member(L,LL), nth1(_x列,L,S)), _x列ならび). '移動平均で値を出しなさい。平均をとる範囲は10とする。'(_x列ならび,_x列の移動平均ならび) :- findall(_単純移動平均,( 単純移動平均(_x列ならび,10,_単純移動平均)), _x列の移動平均ならび). 単純移動平均(_データならび,_サンプル数,_単純移動平均) :- length(L1,_サンプル数), append(L0,L1,_データならび), 相加平均(L1,_単純移動平均). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/329 # # [1] 授業単元:ソート # [2] 問題文(含コード&amp;リンク): # # 次の条件を満たす関数を作ってください。 # # 第1引数はint型の配列。 # 第2引数はint型で第1引数の配列の要素数。 # 第3引数はint型の値。 # # 配列内の要素を並び替えて、第3引数の値より小さなものが配列の最初の方に位置するようにし、 # その次に第3引数の値と同じものが位置するようにし、その次に第3引数の値より大きなものが位置するように # してください。 # # 戻り値は、第3引数の値より小さなもののうち最も後方のインデックスをstruct Pairのfirstにセットし、 # 第3引数の値と同じもののうち、最も後方のインデックスをstruct Pairのsecondにセットして # struct Pair型の値を返してください。 # # struct Pair { # int first; # int second; # }; # # できるだけ速く処理できるよう実装を工夫してください。 # # '次の条件を満たす関数を作ってください。 第1引数はint型の配列。 第2引数はint型で第1引数の配列の要素数。 第3引数はint型の値。 配列内の要素を並び替えて、第3引数の値より小さなものが配列の最初の方に位置するようにし、 その次に第3引数の値と同じものが位置するようにし、その次に第3引数の値より大きなものが位置するように してください。 戻り値は、第3引数の値より小さなもののうち最も後方のインデックスをstruct Pairのfirstにセットし、 第3引数の値と同じもののうち、最も後方のインデックスをstruct Pairのsecondにセットして struct Pair型の値を返してください。 '(_ならび,_要素数,_第3引数の値,_第3引数の値より小さなもののうち最も後方のインデックス,_第3引数の値と同じのもののうち最も後方のインデックス) :- findall(_nth1,( nth1(_nth,_ならび,A), A @< _第3引数の値), L1), findall(_第3引数の値,( nth1(_nth1,_ならび,_第3引数の値)), L2), findall(A,( nth1(_nth1,_ならび,A), A @> _第3引数の値), L3), append(L1,L2,L3,_並び替えたならび), last(L1,_第3引数の値より小さなもののうち最も後方のインデックス), last(L2,_第3引数の値と同じのもののうち最も後方のインデックス), % 以下のサイトは ハミング距離(_a,_b,_ハミング距離) :- length(_a,_n), length(_b,_n), findsum(X,( nth1(_k,_a,A), nth1(_k,_b,B), X is abs(A-B)), _ハミング距離). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/159 # # [1] 授業単元:タンシバへの挑戦状 # [2] 問題文:入力された正の整数をローマ数字に変換するプログラムを作れ。 # 正の整数をローマ数字に変換(_正の整数,_ローマ数字) :- 正の整数をローマ数字に変換([1,4,5,9,10,40,50,90,100,400,500,900,1000],['I','IV','V','IX','X','XL','L','XC','C','CD','D','CM','M'],_正の整数,_ローマ数字). 正の整数をローマ数字に変換(L1,L2,_正の整数,_ローマ数字) :- '正の整数がL1に存在した時はL2から対応するローマ数字を得る'(L1,L2,_正の整数,_ローマ数字). 正の整数をローマ数字に変換(L1,L2,_正の整数,_ローマ数字) :- '正の整数がL1に存在しない場合はL2から正の整数より小さくかつ最大のローマ数字単位とローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字_1), '正の整数からローマ数字単位を引いた整数のローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字_2), concat_atom(_ローマ数字_1,_ローマ数字_2,_ローマ数字). '正の整数がL1に存在した時はL2から対応するローマ数字を得る'(L1,L2,_正の整数,_ローマ数字) :- nth1(_nth1,L1,_正の整数), nth1(_nth1,L2,_ローマ数字),!. '正の整数がL1に存在しない場合は正の整数より小さくかつ最大のローマ数字単位とローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字) :- 正の整数より小さくかつ最大のローマ数字単位(L1,L0,_ローマ数字単位), 正の整数より小さくかつ最大のローマ数字(L2,L0,_ローマ数字). 正の整数より小さくかつ最大のローマ数字単位(L1,L0,_ローマ数字単位) :- append(L0,[_ローマ字数字単位|R],L1), _ローマ字数字単位 < _正の整数, \+((member(_ローマ字数字単位_1,R),_ローマ字数字単位_1 < _正の整数)). 正の整数より小さくかつ最大のローマ数字(L2,L0,_ローマ数字) :- length(L0,_nth0), nth0(_nth0,L2,_ローマ数字). '正の整数からローマ数字単位を引いた整数のローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字_2) :- _差分整数 is _正の整数 - _ローマ数字単位, 正の整数をローマ数字に変換(L1,L2,_差分整数,_ローマ数字_2). % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 色(赤). 色(青). 色(緑). 塗り分けならび(_塗り分けならび) :- findall(_塗り分けならび,塗り分け(_塗り分けならび),_塗り分けならび). 全色塗り分けならび(_塗り分けならび) :- findall(_塗り分けならび,全色塗り分け(_塗り分けならび),_塗り分けならび). 塗り分け(_塗り分けならび) :- 領域名と色の対ならび(_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), 色検査(_塗り分けならび). 全色塗り分け(_塗り分けならび) :- 領域名と色の対ならび(_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), forall(member(_色,_色ならび),member([_,_色],_塗り分けならび)), 色検査(_塗り分けならび). 領域名と色の対ならび(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), 色ならび(_色ならび), 対ならびの形成(_領域名ならび,_色ならび,_塗り分けならび). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 色ならび(_色ならび) :- findall(_色,色(_色),_色ならび). 対ならびの形成(_領域名ならび,_色ならび,_塗り分けならび) :- length(_領域名ならび,Len), length(_塗り分けならび,Len), findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,_塗り分けならび,_色)), _塗り分けならび). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(_塗り分けならび) :- forall((member([A,C],_塗り分けならび),領域が隣接している(A,B)),\+(member([B,C],_塗り分けならび))). 領域が隣接している(A,A) :- 領域が孤立している,!,fail. 領域が隣接している(A,B) :- 隣接(A,B). 領域が孤立している. % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 全色塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(_塗り分けならび,Len), findall(_塗り分けならび,塗り分け(_領域名ならび,_色ならび,_塗り分けならび),_塗り分けならび). 塗り分け(_領域名ならび,_色ならび,_塗り分けならび) :- 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), 色検査(_塗り分けならび). 全色塗り分け(_領域名ならび,_色ならび,_塗り分けならび) :- 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), forall(member(_色,_色ならび),member([_,_色],_塗り分けならび)), 色検査(_塗り分けならび). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび) :- findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,_塗り分けならび,_色)), _塗り分けならび). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(_塗り分けならび) :- forall((member([A,C],_塗り分けならび),隣接(A,B)),\+(member([B,C],_塗り分けならび))). % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 全色塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 塗り分け(_領域名ならび,_色ならび,LL) :- 領域名と色の対ならび(_領域名ならび,_色ならび,LL), 色を割り振る(_色ならび,LL), 色検査(LL). 全色塗り分け(_領域名ならび,_色ならび,LL) :- 領域名と色の対ならび(_領域名ならび,_色ならび,LL), 色を割り振る(_色ならび,LL), forall(member(_色,_色ならび),member([_,_色],LL)), 色検査(LL). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 領域名と色の対ならび(_領域名ならび,_色ならび,LL) :- findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,LL,_色)), LL). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(L) :- forall((member([A,C],L),隣接(A,B)),\+(member([B,C],L))). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/ # # # お題:ヴィジュネル暗号で暗号・復号化する関数を作成せよ。 # ・平文は "programming" とする。 # ・鍵は任意とする。 # ヴィジュネル復号化(_平文,_鍵,_暗号文) :- \+(atom(_平文)), atom_chars(_暗号文,_暗号文文字ならび), atom_chars(_鍵,_鍵文字ならび), ヴィジュネル暗号(_平文文字ならび,_鍵文字ならび,_暗号文文字ならび), atom_chars(_平文,_平文文字ならび). ヴィジュネル暗号化(_平文,_鍵,_暗号文) :- atom(_平文), atom_chars(_平文,_平文文字ならび), atom_chars(_鍵,_鍵文字ならび), ヴィジュネル暗号(_平文文字ならび,_鍵文字ならび,_暗号文文字ならび), atom_chars(_暗号文,_暗号文文字ならび). ヴィジュネル暗号([],_,[]). ヴィジュネル暗号([_文字|R1],_鍵文字ならび,[_暗号文字|R3]) :- ヴィジュネル暗号の文字変換(_文字,_鍵文字ならび,_一文字回転した鍵文字ならび,_暗号文字), ヴィジュネル暗号(R1,_一文字回転した鍵文字ならび,R3). ヴィジュネル暗号の文字変換(_文字,[_鍵文字|R2],_一文字回転した鍵文字ならび,_暗号文字) :- ならびの回転(左方向,_,['B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A'],[_鍵文字|R]), nth1(_nth1,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_文字), nth1(_nth1,[_鍵文字|R],_暗号文字), ならびの回転(左方向,1,[_鍵文字|R2],_一文字回転した鍵文字ならび),!. % 以下のサイトは # お題:表計算ソフトで使われる列名 A,B,C,...,Z,AA,AB,AC,...,AZ,BA,BB,BC,... # をAを1番目とした番号に変換せよ '表計算ソフトで使われる列名 A,B,C,...,Z,AA,AB,AC,...,AZ,BA,BB,BC,...をAを1番目とした番号に変換せよ'(_列名,_番号) :- '列名を文字順序番号ならびに変換'(_列名,_文字順序番号ならび), 文字順序番号ならびを連続番号に変換(_文字順序番号ならび,0,_番号). 列名を文字順序番号ならびに変換(_列名,_文字順序番号ならび) :- findall(_文字順序番号,( 列名を文字順序番号に変換(_列名,_文字順序番号)),_文字順序番号ならび). 列名を文字順序番号に変換(_列名,_文字順序番号) :- sub_atom(_列名,_,1,_,_文字), nth1(_文字順序番号,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_文字). 文字順序番号ならびを連続番号に変換([],_連続番号,_連続番号). 文字順序番号ならびを連続番号に変換(_文字順序番号ならび,_番号_1,_連続番号) :- '文字順序番号ならびを連続番号に、桁上げしながら変換して行く'(_文字順序番号ならび,_番号_1,_連続番号). '文字順序番号ならびを連続番号に、桁上げしながら変換して行く'([_文字順序番号|_残り文字順序番号ならび],_番号_1,_連続番号) :- _番号_2 is _番号_1 * 26 + _文字順序番号, 文字順序番号ならびを連続番号に変換(_残り文字順序番号ならび,_番号_2,_連続番号). % 以下のサイトは # 無題 投稿者:774 投稿日:2013/04/16(Tue) 17:04 No.6 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 一次配列を指定した数参照(例だと3つ),配列の終わりに到達したら,最初に戻る. # これを数回繰り返すプログラム(例1) # また,例1で特定の条件を満たす場合,次回はその条件を満たした配列の次からスタート. # ※例2:条件を満たす数が複数含まれている場合,後ろを優先 # 例1 # a[4]={1,2,3,4,5} # 回数3 # 1回目 a[0]=1,a[1]=2,a[2]=3 # 2回目 a[3]=4,a[4]=5,a[0]=1 # 3回目 a[1]=2,a[2]=3,a[3]=4 # # 例2 # 条件:2の倍数→2と4 # a[5]={1,2,3,4,5,6} # 回数5 # 1回目 a[0]=1,a[1]=2,a[2]=3 # ※a[1]が条件を満たすので,次回はa[2]から # 2回目 a[2]=3,a[3]=4,a[4]=5 # ※a[3]が条件を満たすので,次回はa[4]から # 3回目 a[4]=5,a[5]=6,a[0]=1 # 4回目 a[1]=2,a[2]=3,a[3]=4 # ※a[1],a[3]が条件を満たすので,次回はa[4]から # 5回目 a[4]=5,a[5]=6,a[0]=1 # # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン:gcc v3.3 #  [3.3] 言語:C # [4] 期限: 4/18 # [5] その他の制限:stdio.h stdlib.hのみ # わかりにくい問題でごめんなさい。ヒントだけでもよろしくお願いします。 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(_参照) :- 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,_参照), Ln = [],!. 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,_参照) :- ならびを入力する(_ならび), 繰り返し回数を入力する(_回数,_限界回数L), 参照限界数を入力する(_参照限界数,_参照限界数L), 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([],_参照限界数L,[],_回数L,_ならび,_ならび,[],_参照), _回数L = _限界回数L. ならびを入力する(_ならび) :- write('ならびを項として入力してください(ピリオドで終わる) : '), read(_ならび). 繰り返し回数を入力する(_回数,Ln) :- 整数を得る(繰り返し回数,_回数 > 0,_回数), length(Lmax,_回数). 参照限界数を入力する(_参照限界数,Lmax) :- 整数を得る(参照限界数,_参照限界数 > 0,_参照限界数), length(Ln,_参照限界数). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Lmax,Lmax,_回数L,_回数L,_,_,L1,L) :- reverse(L1,L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Lmax,Lmax,_回数L_1,_回数L,_ならび_1,_ならび,L1,L) :- 次の開始ならびを決める(L1,_ならび,_ならび_2), 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([],Lmax,[_|_回数L_1],_回数L,_ならび_2,_ならび,[],L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,[],_ならび,L1,L) :- 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,_ならび,_ならび,L1,L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,[_値|R1],_ならび,L1,L) :- 参照位置を得る([_値|R1],_ならび,_参照位置), 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([_|Ln],Lmax,_回数L_1,_回数L,R1,_ならび,[[_参照位置,_値]|R2],L). 参照位置を得る(L1,_ならび,N) :- append(L0,L1,_ならび), length(L0,N),!. 次の開始ならびを決める(L1,_ならび,_ならび_2) :- 値が偶数でそれより後にリセットされていない(L1,_nth0,_値,L0), length(L0_1,_nth0), append([_|L0_1],_ならび_2,_ならび),!. 次の開始ならびを決める(L1,_,L1). 値が偶数でそれより後にリセットされていない(L1,_nth0,_値,L0) :- append(L0,[[_nth0,_値]|R],L1), 偶数(_値), \+(member([0,_],L0)),!. 偶数(_値) :- 0 is _値 mod 2. % 以下のサイトは タブ区切りのn列のm字目からn字目までを切り出す(_n列,_m字目,_n字目,_文字列,_副文字列) :- nth1_split(_n列,_文字列,['\t'],_副文字列_1), _n_1 is _n - 1, sub_atom(_副文字列_1,_m字目,_n_1,_,_副文字列). タブ区切りのn列を切り出す(_n列,_m字目,_n字目,_文字列,_副文字列) :- nth1_split(_n列,_文字列,['\t'],_副文字列),!. nth1_split(_nth1,_文字列,_区切り文字ならび,_副文字列) :- split(_文字列,_区切り文字ならび,1,_nth1,_区切り文字列,_副文字列,_残り文字列). split('',_,_,_,_,_,_) :- !,fail. split(_文字列,_区切り文字列ならび,_nth1_1,_nth1,_区切り文字列,_副文字列,_残り文字列) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列_1,_副文字列_1,_残り文字列_1), split_1(_区切り文字列ならび,_nth1_1,_区切り文字列_1,_副文字列_1,_残り文字列_1,_nth1,_区切り文字列,_副文字列,_残り文字列). split_1(_区切り文字列ならび,_nth1,_区切り文字列,_副文字列,_残り文字列,_nth1,_区切り文字列,_副文字列,_残り文字列). split_1(_区切り文字列ならび,_nth1_1,_,_,_残り文字列_1,_nth1,_区切り文字列,_副文字列,_残り文字列) :- _nth1_2 is _nth1_1 + 1, split(_残り文字列_1,_区切り文字列ならび,_nth1_2,_nth1,_区切り文字列,_副文字列,_残り文字列). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), sub_atom(_区切り文字列,_,_長さ,_,_区切り文字列), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). % 以下のサイトは nth1_split(_nth1,_文字列,_区切り文字,_副文字列) :- split(_文字列,[_区切り文字],_,L2), nth1(_nth1,L2,_副文字列). split('',_,[],[]) :- !. split(_文字列,_区切り文字列ならび,[_区切り文字列|R3],[_副文字列|R4]) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列), split(_残り文字列,_区切り文字列ならび,R3,R4). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), atom_length(_区切り文字列,_長さ), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/905 # # [1]c++ # [2]2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。 # また、対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。 # ただし、対角要素は左上隅から右下隅への対角線上の要素とする。次の図は実行例であ る。 # --- (2)配列nの内容 --- # # 100000000 # 010000000 # 001000000 # 000100000 # 000010000 # 000001000 # 000000100 # 000000010 # 000000001 '2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。' :- '2次元配列n[10][10]のすべての要素に1を代入してから'(LL), 'その内容を表示しなさい。'(LL). '2次元配列n[10][10]のすべての要素に1を代入してから'(LL) :- findall(_行,( '10行ある', '10要素の行のすべての要素に1を代入'(_行)),LL). '10行ある' :- between(1,10,_). '10要素の行のすべての要素に1を代入'(_行) :- '10要素の行の'(_行), すべての要素に1を代入(_行). '10要素の行の'(_行) :- length(_行,10). すべての要素に1を代入([]). すべての要素に1を代入([1|R]) :- すべての要素に1を代入(R). 'その内容を表示しなさい。'(LL) :- 表示しなさい(LL). 表示しなさい(LL) :- forall(行を表示文字列に変換する(LL,_表示文字列),writef('%w\n',[_表示文字列])). 行を表示文字列に変換する(LL,_表示文字列) :- member(_行,LL), atomic_list_concat(_行,' ',_表示文字列). '対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。' :- 対角要素だけ1を代入しほかは全て0を代入してから(LL), 表示しなさい(LL). 対角要素だけ1を代入しほかは全て0を代入してから(LL) :- findall(L,( between(1,10,_n), 対角要素だけ1を代入しほかは全て0を代入(_n,L)),LL). 対角要素だけ1を代入しほかは全て0を代入(_n,L) :- 対角要素だけ1を代入し(_n,L), 他の全ての変数要素は0に(L). 対角要素だけ1を代入し(_n,L) :- length(L,10), reverse(L,RL), 対角要素だけ1を代入し(_n,RL,L). 対角要素だけ1を代入し(_n,RL,L) :- nth1(_n,L,1), nth1(_n,RL,1). 他の全ての変数要素は0に(L) :- findall(N,( member(N,L), 変数要素は0に(N)),L). 変数要素は0に(0) :- !. 変数要素は0に(N). % 以下のサイトは # [1] 授業単元:Python # [2] 問題文(含コード&リンク): 課題2 # http://pc12.2ch.net/test/read.cgi/tech/1153585095/789 [1] 授業単元:Python [2] 問題文(含コード&リンク): 下の例参照 与えられた数字のみからなる文字列から各桁の数字に分割し、 隣り合う数字の合計の下一桁の値を並べたものを次の文字列とし、 結果が一桁になるまで繰り返しそれぞれの過程の文字列を出力する。 [3] 環境:特になし [4] 期限: 明日まで [5] その他の制限: 例 # 525123214112431 # 77635535523674 # 4398088075931 # 727886872424 # 99564459666 # 8410894522 # 251873974 # 76950261 # 3545287 # 899705 # 78675 # 5432 # 95 # 4 # # 上から2段目から最後の段までに現れる0から9数字の # 総出現数と各数字毎の出現比率を出力する。 # [3] 環境:特になし # [4] 期限: 明日まで # [5] その他の制限: # # 129個 # 0: 10回 3% # 1: 43回 20% # 2: 8回 2% # ... # 9: 18回 6% # のように出力してください。 対象となる文字列('525123214112431'). 対象となる文字列('77635535523674'). 対象となる文字列('4398088075931'). 対象となる文字列('727886872424'). 対象となる文字列('99564459666'). 対象となる文字列('8410894522'). 対象となる文字列('251873974'). 対象となる文字列('76950261'). 対象となる文字列('3545287'). 対象となる文字列('899705'). 対象となる文字列('78675'). 対象となる文字列('5432'). 対象となる文字列('95'). 対象となる文字列('4'). '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を出力する。' :- findall(_文字列,( 対象となる文字列(_対象となる文字列), _行ならび), '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率), 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率). '上から2段目から最後の段までに現れる0から9数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率) :- '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで), '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数), '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率). '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで) :- _行ならび = [_|_上から2段目から最後の段まで]. '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数) :- atomic_list_concat(_上から2段目から最後の段まで,_文字列), findall(_度数,( member(_数字文字,['0','1','2','3','4','5','6','7','8','9']), count(sub_atom(_文字列,_,1,_,_数字文字),_度数)), _0から9までの数字の出現ならび), sum(_0から9までの数字の出現ならび,_総出現数). '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率) :- findall(_出現比率,( member(_度数,_0から9までの数字の出現数ならび), _出現比率 is _度数 / _総出現数 * 100.0)), _各数字毎の出現比率). 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率) :- write('数: 出現数 出現比率\n'), '数字の出現数・出現比率を一行で出力する'(_0から9までの数字の出現数ならび,_各数字毎の出現比率,N), N = 9. '数字の出現数・出現比率を一行で出力する'(N,_0から9までの数字の出現数ならび,_各数字毎の出現比率,N) :- nth0(N,_0から9までの数字の出現数ならび,_出現数), nth0(N,_各数字毎の出現比率,_出現比率), writef(' %t: %t回 ',[N,_出現数]), format('~1f%\n',[_出現比率]). % 以下のサイトは # [1] 授業単元:Python # [2] 問題文(含コード&リンク): 課題2 # http://pc12.2ch.net/test/read.cgi/tech/1153585095/789 [1] 授業単元:Python [2] 問題文(含コード&リンク): 下の例参照 与えられた数字のみからなる文字列から各桁の数字に分割し、 隣り合う数字の合計の下一桁の値を並べたものを次の文字列とし、 結果が一桁になるまで繰り返しそれぞれの過程の文字列を出力する。 [3] 環境:特になし [4] 期限: 明日まで [5] その他の制限: 例 # 525123214112431 # 77635535523674 # 4398088075931 # 727886872424 # 99564459666 # 8410894522 # 251873974 # 76950261 # 3545287 # 899705 # 78675 # 5432 # 95 # 4 # # 上から2段目から最後の段までに現れる0から9数字の # 総出現数と各数字毎の出現比率を出力する。 # [3] 環境:特になし # [4] 期限: 明日まで # [5] その他の制限: # # 129個 # 0: 10回 3% # 1: 43回 20% # 2: 8回 2% # ... # 9: 18回 6% # のように出力してください。 対象となる文字列('525123214112431 77635535523674 4398088075931 727886872424 99564459666 8410894522 251873974 76950261 3545287 899705 78675 5432 95 4'). '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を出力する。' :- 対象となる文字列(_対象となる文字列), split(_対象となる文字列,['\n'],_行ならび), '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率), 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率). '上から2段目から最後の段までに現れる0から9数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率) :- '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで), '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数), '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率). '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで) :- _行ならび = [_|_上から2段目から最後の段まで]. '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数) :- atomic_list_concat(_上から2段目から最後の段まで,_文字列), findall(_度数,( member(_数字文字,['0','1','2','3','4','5','6','7','8','9']), count(sub_atom(_文字列,_,1,_,_数字文字),_度数)), _0から9までの数字の出現ならび), sum(_0から9までの数字の出現ならび,_総出現数). '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率) :- findall(_出現比率,( member(_度数,_0から9までの数字の出現数ならび), _出現比率 is _度数 / _総出現数 * 100.0)), _各数字毎の出現比率). 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率) :- write('数: 出現数 出現比率\n'), '数字の出現数・出現比率を一行で出力する'(_0から9までの数字の出現数ならび,_各数字毎の出現比率,N), N = 9. '数字の出現数・出現比率を一行で出力する'(N,_0から9までの数字の出現数ならび,_各数字毎の出現比率,N) :- nth0(N,_0から9までの数字の出現数ならび,_出現数), nth0(N,_各数字毎の出現比率,_出現比率), writef(' %t: %t回 ',[N,_出現数]), format('~1f%\n',[_出現比率]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/727 # # [1] 授業単元: 暇つぶし # [2] 問題文:迷路を解くプログラム。 #  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 # ----- ここからテキスト ----- # 5 5 # sxrrr # rxrrr # rrrxr # rrxgr # ----- ここまでテキスト ----- #  テキストの1行目は順番に迷路の横幅と縦幅を表します。 #  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。 #  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。 #  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 # 1 step # sxrrr # +xrrr # rrrxr # rrxgr # <中略> # 9 step # sxrrr # +x+++ # +++x+ # rrxg+ # '問題文:迷路を解くプログラム。  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 ----- ここからテキスト ----- 5 5 sxrrr rxrrr rrrxr rrxgr ----- ここまでテキスト -----  テキストの1行目は順番に迷路の横幅と縦幅を表します。  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 1 step sxrrr +xrrr rrrxr rrxgr <中略> 9 step sxrrr +x+++ +++x+ rrxg+ '(_テキスト) :- 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト). 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト) :- テキストを入力とし(_テキスト,LL1,LL2), スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順), '道を表示してください。'(_スタートからゴールまでの道順,LL1). スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順) :- スタートを探す(LL1,LL2,_スタートの行,_スタートの列), ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列), 隣に移動する(_スタートの行,_スタートの列,_ゴールの行,_ゴールの列,LL1,LL2,[],_スタートからゴールまでの道順). テキストを入力とし(_テキスト,LL1,LL2) :- get_lines(_テキスト,[_不要要素|_行ならび]), findall(_文字ならび,( member(_一行,_行ならび), atom_chars(_一行,_文字ならび)), LL1), 転置(LL1,LL2). スタートを探す(LL1,LL2,_スタートの行,_スタートの列) :- nth1(_スタートの行,LL1,L), nth1(_スタートの列,L,s). ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列) :- nth1(_ゴールの行,LL1,L), nth1(_ゴールの列,L,g). 隣に移動する(_ゴールの行,_ゴールの列,_ゴールの行,_ゴールの列,LL1,LL2,_,[[_ゴールの行,_ゴールの列]]). 隣に移動する(_行,_列,_ゴールの行,_ゴールの列,LL1,LL2,_履歴1,[[_行,_列]|R]) :- 移動可能な隣接点を得る(_行,_列,LL1,LL2,_隣の行,_隣の列), \+(member([_隣の行,_隣の列],_履歴1)), 隣に移動する(_隣の行,_隣の列,_ゴールの行,_ゴールの列,LL1,LL2,[[_行,_列]|_履歴1],R). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 列の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列) :- nth1(_行,LL1,L), length([_|L0],_列), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の列). 列の移動可能な隣接点(_行,_列,LL1,LL2,_隣の行,_隣の列) :- nth1(_列,LL2,L), length([_|L0],_行), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の行). 移動可能な隣接点(L0,R,_隣) :- last(L0,r), length(L0,_隣). 移動可能な隣接点(L0,R,_隣) :- R = [r|_], length([_,_|L0],_隣). '道を表示してください。'(_スタートからゴールまでの道順,LL) :- append(LL0,[[_行,_列]|RR],_スタートからゴールまでの道順), length([_|LL0],_ステップ), write('%t\n',[_ステップ]), '通過点を+に置換してLLを表示する'(_行,_列,LL), R = []. '通過点を+に置換してLLを表示する'(_行,_列,LL) :- append(L0,[L1|R],LL), length([_|L0],_行_1), 列の置換(_行_1,_行,_列,L1,L2), ならびを文字列に変換して表示(L2), R = []. 列の置換(_行,_行,_列,L1,L2) :- length([_|L0],_列), append(L0,[_|R],L1), append(L0,[+|R],L2),!. 列の置換(_,_,_,L,L). ならびを文字列に変換して表示(L) :- atomic_list_concat(L,S), writef('%t\n',[S]). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # # ある専門学校の受験資格のデシジョンテーブル # # <条件> 1 2 3 4 5 6 7 8 # # 体重が軽い N N N N Y Y Y Y # 体が柔らかい N N Y Y N Y N Y # 敏捷である N Y Y N N N Y Y # # <行動> # # 受験資格がある X # 受験資格がない X X X X X X X 体重が軽い(偽,偽,偽,偽,真,真,真,真). 体が柔らかい(偽,偽,真,真,偽,真,偽,真). 敏捷である(偽,真,真,偽,偽,偽,真,真). 受験資格がある(偽,偽,偽,偽,偽,偽,偽,真). 受験資格がない(真,真,真,真,真,真,真,偽). デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_行動述語名ならび,_nth1,_行動ならび) :- デシジョンテーブル引数を取得して転置する(_アリティ,_条件述語名ならび,LL2), nth1(_nth1,LL2,_真偽値ならび), 行動述語から行動ならびを得る(_アリティ,_nth1,_行動述語名ならび,_行動ならび). デシジョンテーブル引数を取得して転置する(_アリティ,_条件述語名ならび,LL2) :- findall(_引数ならび,( member(_条件述語名,_条件述語名ならび), length(_引数ならび,_アリティ), P =.. [_条件述語名|_引数ならび], call(P)), LL2), 転置(LL1,LL2). 行動述語から行動ならびを得る(_アリティ,_nth1,_行動述語名ならび,_行動ならび) :- findall(_行動,( '行動述語の_nth1引数を得る'(_アリティ,_nth1,_行動述語名ならび,_行動)), _行動ならび). '行動述語の_nth1引数を得る'(_アリティ,_nth1,_行動述語名ならび,_行動) :- member(_行動述語名,_行動述語名ならび), length(L,_アリティ), P =.. [_行動述語名|L], call(P), nth1(_nth1,L,_行動). 転置([],[],[]):- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]):- 転置(R2,R3,R4). 転置([[]|_],[]):- !. 転置(L,[L1|R2]):- 転置(L,L2,L1), 転置(L2,R2) . % % ?- デシジョンテーブル(8,[体重が軽い,体が柔らかい,敏捷である],[真,偽,真],[受験資格がある],_nth1,_行動ならび). % % _nth1 = 7, % _行動ならび = [偽] % % 以下のサイトは # # ある専門学校の受験資格のデシジョンテーブル # # <条件> 1 2 3 4 5 6 7 8 # # 体重が軽い N N N N Y Y Y Y # 体が柔らかい N N Y Y N Y N Y # 敏捷である N Y Y N N N Y Y # # <行動> # # 受験資格がある X # 受験資格がない X X X X X X X 体重が軽い(偽,偽,偽,偽,真,真,真,真). 体が柔らかい(偽,偽,真,真,偽,真,偽,真). 敏捷である(偽,真,真,偽,偽,偽,真,真). 受験(諦める,諦める,ダイエットして来年受験する,諦める,諦める,諦める,ヨガに一年通ってから受験する,受験してみる). デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_行動述語名ならび,_選択列,_行動ならび) :- デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_選択列), findall(_行動,( '行動述語の_選択列引数を得る'(_アリティ,_選択列,_行動述語名ならび,_行動)), _行動ならび). デシジョンテーブル(_,[],_,_選択列). デシジョンテーブル(_アリティ,[_述語名|R1],[_真偽値|R2],_選択列) :- 条件述語を実行する(_アリティ,_述語名,_真偽値ならび), nth1(_選択列,_真偽値ならび,_真偽値), デシジョンテーブル(_アリティ,R1,R2,_選択列). 条件述語を実行する(_アリティ,_述語名,_真偽値ならび) :- length(_真偽値ならび,_アリティ), P =.. [_述語名|_真偽値ならび], call(P). '行動述語の_選択列引数を得る'(_アリティ,_選択列,_行動述語名ならび,_行動) :- member(_行動述語名,_行動述語名ならび), 行動述語名の行動ならびを得る(_アリティ,_行動述語名,_行動選択ならび), nth1(_選択列,_行動選択ならび,_行動). 行動述語名の行動選択ならびを得る(_アリティ,_行動述語名,_行動選択ならび) :- length(_行動選択ならび,_アリティ), P =.. [_行動述語名|_行動選択ならび], call(P). % % ?- デシジョンテーブル(8,[体重が軽い,体が柔らかい,敏捷である],[真,偽,真],[受験],_選択列,_行動ならび). % % _選択列 = 7, % _行動ならび = [ヨガに一年通ってから受験する] % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362715265/18 # :- dynamic(todo/1). 'お題 こんな感じにコマンドラインで動くTODO管理アプリを作りなさい $ ./todo add "本屋でPythonの本を買ってくる" $ ./todo add "たいやきを買ってくる" $ ./todo list 1: 本屋でPythonの本を買ってくる 2: たいやきを買ってくる $ ./todo done 2 $ ./todo list 1: たいやきを買ってくる アドリブも可' :- todoを準備する, user_parameters(_パラメーター), 解析実行(_パラメーター), todoデータを保存する. 解析実行([add,_文字列]) :- assertz(todo(_文字列)),!. 解析実行([done,N]) :- 'N行目のtodoデータを削除する'(N). 解析実行([list]) :- 行番号を振ってtodoデータを表示する. 'N行目のtodoデータを削除する'(N) :- 一旦todoデータを削除しながらリストに取得し(L1), 'N番目の要素を削除して'(N,L1,L2), todoデータを定義し直す(L2). 一旦todoデータを削除しながらリストに取得し(L) :- findall(_データ,( retract(todo(_データ)), L). 'N番目の要素を削除して'(N,L1,L2) :- length([_|L0],N), append(L0,[_|R],L1), append(L0,R,L2). todoデータを定義し直す(L2) :- forall( member(_データ,L2), assertz(todo(_データ))). 行番号を振ってtodoデータを表示する :- findall(_データ,todo(_データ),L), forall(( nth1(No,L,_データ), writef('%t %t\n',[No,_データ]). todoデータを準備する :- reconsult('todo.pro'). todoデータを保存する :- tell('todo.pro'), listing(todo/1), told. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/140 # # [1] 授業単元: Cプロ # [2] 問題文(含コード&リンク): # 3行3列の行列aを入力後、余因子行列で行列値|a|を求める # '3行3列の行列aを入力後、余因子行列で行列値|a|を求める' :- '3行3列の行列aを入力'(_a), '余因子行列で行列値|a|を求める'(_a,_行列式_aの値), writef('行列値|a|は%tです。\n',[_行列式_aの値]). '3行3列の行列aを入力'(_a) :- length(_a,3), findall(L,( nth1(_nth1,_a,L), length(L,3), '3列入力する'(_nth1,1,L)), _a). '3列入力する'(_,_,[]). '3列入力する'(_行位置,_列位置,[V|R]) :- writef('列入力[%t][%t] : ',[_行位置,_列位置]), get_line(Line), atom_to_term(Line,V,_), _列位置_2 is _列位置 + 1, '3列入力する'(_行位置,_列位置_2,R). '余因子行列を使って逆行列を得る'(_n,_正方行列,_逆行列) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値), 余因子行列(_n,_正方行列,_余因子行列), 転置(_余因子行列,_転置された余因子行列), 行列のすべての要素に値を掛ける(1,_n,_転置された余因子行列,1 / _行列式の値,_逆行列). 行列のすべての要素に値を掛ける(_行目,_n,LL,_,LL) :- _行目 > _n,!. 行列のすべての要素に値を掛ける(_行目,_n,LL1,_乗数 / _除数,LL2) :- '行基本変形'(_乗数 / _除数 # _行目,LL1,LL3), _行目_2 is _行目 + 1, 行列のすべての要素に値を掛ける(_行目_2,_n,LL3,_乗数 / _除数,LL2). '余因子行列で行列値|a|を求める'(_a,_行列式_aの値) :- 余因子行列(_a,_余因子行列), _a = [_aの第一行|_], _余因子行列 = [_余因子行列の第一行|_], '二つのならびの積の和'(_aの第一行,_余因子行列の第一行,_行列式_aの値). '二つのならびの積の和'([],[],0). '二つのならびの積の和'([A|R1],[B|R2],S) :- '二つのならびの積の和'(R1,R2,S_1), S is S_1 + A * B. 余因子行列(_正方行列,_余因子行列) :- length(_正方行列,_n), 余因子行列(_n,_正方行列,_余因子行列). 余因子行列(_n,_正方行列,_余因子行列) :- length(_余因子行列,_n), findall(L,( nth1(_i,_余因子行列,L), 余因子行列の要素が余因子である(_n,_正方行列,_i,L)), _余因子行列). 余因子行列の要素が余因子である(_n,_正方行列,_i,L) :- length(L,_n), findall(_余因子,( nth1(_j,L,_余因子), 余因子(_n,_正方行列,_i,_j,_余因子)), L). 行列式の値(1,[[_]],1) :- !. 行列式の値(2,_正方行列,_行列式の値) :- 二つの対角要素の積の差を得る(_n,_正方行列,_行列式の値),!. 行列式の値(_n,_正方行列,_行列式の値) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値). 余因子(_n,_正方行列,_i,_j,_余因子) :- 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子). 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) :- '正方行列からi行j列を取り除いた行列式の値'(_n,_正方行列,_i,_j,_n_1次正方行列の行列式の値), 'i,jから乗数を得る'(_i,_j,_乗数), _余因子 is _乗数 * _n_1次正方行列の行列式の値. '正方行列からi行j列を取り除いた行列式の値'(_n,_正方行列,_i,_j,_n_1次正方行列の行列式の値) :- '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列), _n_1 is _n - 1, 行列式の値(_n_1,_n_1次正方行列,_n_1次正方行列の行列式の値). '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列) :- '第何行を取り除く'(_正方行列,_i,_第i行が取り除かれた行列), 転置(_第i行が取り除かれた行列,_転置された第i行が取り除かれた行列), '第何行を取り除く'(_転置された第i行が取り除かれた行列,_j,_転置された第i行第j列が取り除かれた行列), 転置(_転置された第i行第j列が取り除かれた行列,_n_1次正方行列). '第何行を取り除く'(_正方行列,_第何行,_第i行が取り除かれた行列) :- append(L0,[L|R],_正方行列), length([_|L0],_第何行), append(L0,R,_第i行が取り除かれた行列). 二つの対角要素の積の差を得る(0,[],1) :- !. 二つの対角要素の積の差を得る(1,[[N]],N) :- !. 二つの対角要素の積の差を得る(_n,_正方行列,_二つの対角要素の積の差) :- 二つの対角要素の積を得る(_正方行列,_右下がり対角要素の積,_右上がり対角要素の積), _二つの対角要素の積の差 is _右下がり対角要素の積 - _右上がり対角要素の積. 二つの対角要素の積を得る(_正方行列,_右下がり対角要素の積,_右上がり対角要素の積) :- 二つの対角要素を得る(_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび), 対角要素の掛算(_右下がり対角要素ならび,_右下がり対角要素の積), 対角要素の掛算(_右上がり対角要素ならび,_右上がり対角要素の積). 二つの対角要素を得る(_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび) :- 右下がり対角要素ならび(_正方行列,_右下がり対角要素ならび), 右上がり対角要素ならび(_正方行列,_右上がり対角要素ならび). 右下がり対角要素ならび(_正方行列,_右下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), nth1(_nth1,L,V)), _右下がり対角要素ならび). 右上がり対角要素ならび(_正方行列,_右上がり対角要素ならび) :- reverse(_正方行列,_行を逆転した正方行列), 右下がり対角要素ならび(_行を逆転した正方行列,_右上がり対角要素ならび). 左下がり対角要素ならび(_正方行列,_左下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), length([_|R],_nth1), append(_,[V|R],L)), _左下がり対角要素ならび),!. 左上がり対角要素ならび(_正方行列,_左上がり対角要素ならび) :- reverse(_正方行列,_行を逆転した正方行列), 左下がり対角要素ならび(_行を逆転した正方行列,_左上がり対角要素ならび). 'i,jから乗数を得る'(_i,_j,(-1)) :- 1 is (_i + _j) mod 2,!. 'i,jから乗数を得る'(_i,_j,1) :- 0 is (_i + _j) mod 2,!. 対角要素の掛算([],1). 対角要素の掛算([A|R],X) :- 対角要素の掛算(R,Y), X is A * Y. 'n次正方行列の要素を行・列順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_i行), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素). 'n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_j列), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/651 # # 2010年度の月毎の件数をまとめたデータですが # 累計を求めたいです。 # # 月 2010年度 # 01 1 # 02 2 # 03 1 # 04 3 # 05 2 # 06 2 # 07 2 # 08 1 # 09 2 # 10 2 # 11 2 # 12 1 # # 求めたい結果 # 月 2010年度累計 # 04 3 # 05 5 # 06 7 # 07 9 # 08 10 # 09 12 # 10 14 # 11 16 # 12 17 # 01 18 # 02 20 # 03 21 # # これだけのデータから # スタートを4月にして累計を求める方法は # ありますでしょうか? # よろしくお願いします。 # '2010年度データ'('01',1). '2010年度データ'('02',2). '2010年度データ'('03',1). '2010年度データ'('04',3). '2010年度データ'('05',2). '2010年度データ'('06',2). '2010年度データ'('07',2). '2010年度データ'('08',1). '2010年度データ'('09',2). '2010年度データ'('10',2). '2010年度データ'('11',2). '2010年度データ'('12',1). '2010年度の月毎の件数をまとめたデータですが累計を求めたいです。'(_月,_累計件数) :- _月順序 = ['04','05','06','07','08','09','10','11','12','01','02','03'], findall(_件数,( member(_月,_月順序), '2010年度データ'(_月,_件数)), _月別件数), 累計表示(_月順序,_月別件数,_月,_累計件数). 累計表示(_月順序,_月別件数,_月,_累計件数) :- append(L1,[_件数|R],_月別件数), length(L1,_nth0), nth0(_nth0,_月順序,_月), sum([_件数|L1],_累計件数). sum([],0). sum([N|R],S) :- sum(R,S_1), S is S_1 + N. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/651 # # 2010年度の月毎の件数をまとめたデータですが # 累計を求めたいです。 # # 月 2010年度 # 01 1 # 02 2 # 03 1 # 04 3 # 05 2 # 06 2 # 07 2 # 08 1 # 09 2 # 10 2 # 11 2 # 12 1 # # 求めたい結果 # 月 2010年度累計 # 04 3 # 05 5 # 06 7 # 07 9 # 08 10 # 09 12 # 10 14 # 11 16 # 12 17 # 01 18 # 02 20 # 03 21 # # これだけのデータから # スタートを4月にして累計を求める方法は # ありますでしょうか? # よろしくお願いします。 # '2010年度データ'('01',1). '2010年度データ'('02',2). '2010年度データ'('03',1). '2010年度データ'('04',3). '2010年度データ'('05',2). '2010年度データ'('06',2). '2010年度データ'('07',2). '2010年度データ'('08',1). '2010年度データ'('09',2). '2010年度データ'('10',2). '2010年度データ'('11',2). '2010年度データ'('12',1). '2010年度の月毎の件数をまとめたデータですが累計を求めたいです。'(_月,_累計件数) :- _月順序 = ['04','05','06','07','08','09','10','11','12','01','02','03'], 月別件数を得る(_月順序,_月別件数), 累計表示(_月順序,_月別件数,_月,_累計件数). 月別件数を得る([],[]). 月別件数を得る([_月|R1],[_件数|R2]) :- '2010年度データ'(_月,_件数), 月別件数を得る(R1,R2). 累計表示(_月順序,_月別件数,_月,_累計件数) :- append(L1,[_件数|R],_月別件数), length(L1,_nth0), nth0(_nth0,_月順序,_月), sum([_件数|L1],_累計件数). sum([],0). sum([N|R],S) :- sum(R,S_1), S is S_1 + N. % 以下のサイトは %%%% zipの再帰的定義 %%%% zip([],[],[]). zip([A|R1],[B|R2],[[A,B]|R3]) :- zip(R1,R2,R3). %%%% zipの再帰を使わない定義 %%%% zip(L1,L2,L3) :- findall([A,B],( nth1(_nth1,L1,A), nth1(_nth1,L2,B)), L3). % L1,L2の要素数がそれぞれ1000だとすると, 1000 * 1000 = 1000000回 nth1が導出される % から注意。 % 以下のように改善が可能。 zip(L1,L2,L3) :- findall([A,B],( nth1(_nth1,L1,A), zip_1(_nth1,L2,B)), L3). zip_1(_nth1,L2,B) :- nth1(_nth1,L2,B),!. % 以下のサイトは # 出典:: http://pc8.2ch.net/test/read.cgi/tech/1136768567/ # # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): #   2つのグラフが同型であるかどうかを判定するプログラムを作成しなさい。ただし、入力データは講義で配布した形式(mat4,mat5,...)のものとする。また、次の条件を守ること。 # # * プログラムはC言語で作成して下さい。 # * 同型の場合はその対応(全単射)も出力すること。 # * 可能な限り速いプログラムを作成しなさい。例えば、各頂点の次数に着目したり、木を探索する際途中で探索しても無意味だと判明した時点でそれ以下の探索を中止するなど枝刈りを行うことで高速化できます。 # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン: gcc #  [3.3] 言語:どちらでも可 # [4] 期限: 2006年01月11日16:00 # # 入力データ # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1426.zip '2つのグラフが同型であるかどうかを判定する'(_第一グラフ,_第二グラフ) :- functor(_第一グラフ,_第一関数,_引数の数), functor(_第二グラフ,_第二関数,_引数の数), 引数のすべてがグラフとして同型である(0,_引数の数,_第一グラフ,_第二グラフ). 引数のすべてがグラフとして同型である(_引数の数,_引数の数,_,_) :- !. 引数のすべてがグラフとして同型である(_nth0,_引数の数,_第一グラフ,_第二グラフ) :- _nth1 is _nth0 + 1, '_nth1番目の引数が同型である'(_nth1,_第一グラフ,_第二グラフ), 引数のすべてがグラフとして同型である(_nth1,_引数の数,_第一グラフ,_第二グラフ). '_nth1番目の引数が同型である'(_nth1,_第一グラフ,_第二グラフ) :- arg(_nth1,_第一グラフ,_第一グラフの引数), arg(_nth1,_第二グラフ,_第二グラフの引数), '2つのグラフが同型であるかどうかを判定する'(_第一グラフの引数,_第二グラフの引数). % 以下のサイトは # http://d.hatena.ne.jp/E_Mattsan/20130211/1360590408 # 「E.Mattsan氏のブログ 20130211より」 # # 設問 # # まず、パタンマッチングの部分だけが見やすくなるように、「どう書く」の問題からいろいろ取り去ってより簡単な問題を作りました。 # # # 要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 # コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 # 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 # 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 # 要素がコンテナ中に見つからない場合、-1を返す。 # '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- search(_指定された要素,_コンテナ,_最初の場所の最初の要素の位置). search(A,L,_nth0) :- append(L0,[A,A,A|_],L), length(L0,_nth0),!. search(A,L,_nth0) :- append(L0,[A,A|_],L), length(L0,_nth0),!. search(A,L,_nth0) :- append(L0,[A|_],L), length(L0,_nth0),!. search(A,L,-1). % 以下のサイトは # http://mimizun.com/log/2ch/tech/972032579/115 # 115 :初心者 :2000/10/23(月) 16:45 # Cでのプログラミングをはじめて1ヶ月なんですが、 # 逆行列を計算するプログラムを作るという宿題が出ました。 # 手始めに4×4行列の逆行列を作ることが宿題です。 # おねいさんお願いします '4×4行列の逆行列を作る'(_対象行列,_4×4行列の逆行列) :- 単位行列(4,_単位行列), 対象行列の各行に対応する単位行列行を追加(_対象行列,_単位行列,_対象行列_2), 既約ガウス行列に変形(_対象行列_2,_既約ガウス行列), '5-8列を切り取る'(_既約ガウス行列,_4×4行列の逆行列),!. 対象行列の各行に対応する単位行列行を追加(_対象行列,_単位行列,_対象行列_2) :- findall(_行,( nth1(_nth1,_対象行列,_行_1), nth1(_nth1,_単位行列,_行_2), append(_行_1,_行_2,_行)), _対象行列_2). '5-8列を'(_既約ガウス行列,_4×4行列の逆行列) :- findall(R,( member([_,_,_,_|R],_既約ガウス行列)), _4×4行列の逆行列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/586 # # [1] 授業単元: プログラミングC # [2] 問題文(含コード&リンク): # キーボードから半角英数で文字列を入力し、英字については大文字を小文字に、小文字を大文字にするプログラムを作成せよ。 # # 実行例 文字列入力 :AbCdEfG123 #     変換文字列 :aBcDeFg123 # 'キーボードから半角英数で文字列を入力し、英字については大文字を小文字に、小文字を大文字にする' :- rawmode, 'キーボードから半角英数で文字列を入力し、英字については大文字を小文字に、小文字を大文字にする', norawmode. 'キーボードから半角英数で文字列を入力し、英字については大文字を小文字に、小文字を大文字にする' :- repeat, get_char(_文字), 文字を変換して(_文字,_変換された文字), 表示する(_変換された文字), _文字 = '\n'. 文字を変換して('\n','\n') :- !. 文字を変換して(_文字,_変換された文字) :- 大文字(_文字), 文字を変換して(_文字,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_変換された文字). 文字を変換する(_文字,_変換された文字) :- 小文字(_文字), 文字を変換して(_文字,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_変換された文字). 大文字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. 小文字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 文字を変換して(_文字,L1,L2,_変換された文字) :- nth1(_nth1,L1,_文字), nth1(_nth1,L2,_変換された文字). 表示する('\n') :- !. 表示する(_変換された文字) :- writef('%t',[_変換された文字]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/586 # # [1] 授業単元: プログラミングC # [2] 問題文(含コード&リンク): # キーボードから半角英数で文字列を入力し、英字については大文字を小文字に、小文字を大文字にするプログラムを作成せよ。 # # 実行例 文字列入力 :AbCdEfG123 #     変換文字列 :aBcDeFg123 # 'キーボードから半角英数で文字列を入力し、英字については大文字を小文字に、小文字を大文字にする' :- write('文字列入力 : '), get_line(_文字列), '入力された文字列の英字については大文字を小文字に、小文字を大文字にする'(_文字列,_変換文字列), writef('変換文字列 : %t\n',[_変換文字列]). '入力された文字列の英字については大文字を小文字に、小文字を大文字にする'(_文字列,_変換文字列) :- atom_chars(_文字列,_文字ならび), '文字ならびの英字については大文字を小文字に、小文字を大文字にする'(_文字ならび,_変換されたもじれならび), atom_chars(_変換文字列,_変換された文字ならび). '文字ならびの英字については大文字を小文字に、小文字を大文字にする'([],[]) :- !. '文字ならびの英字については大文字を小文字に、小文字を大文字にする'([_文字_1|R1],[_文字_2|R2]) :- 文字を変換する(_文字_1,_文字_2), '文字ならびの英字については大文字を小文字に、小文字を大文字にする'(R1,R2). '文字ならびの英字については大文字を小文字に、小文字を大文字にする'([_|R1],R2) :- '文字ならびの英字については大文字を小文字に、小文字を大文字にする'(R1,R2). 文字を変換する(_文字,_変換された文字) :- _文字 @>= 'A', _文字 @=< 'Z', nth1(_nth1,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_文字), nth1(_nth1,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_変換された文字),!. 文字を変換する(_文字,_変換された文字) :- _文字 @>= 'a', _文字 @=< 'z', nth1(_nth1,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_文字), nth1(_nth1,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_変換された文字),!. % 以下のサイトは うるう年は何回来るか(_年起点,_年終点,_うるう年の回数) :- count(( between(_年起点,_年終点,_年), うるう年(_年)), _うるう年の回数). 'ある日から後の年のある日は何日目か(起点日と終点日はそれぞれ日数に含める)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はそれぞれ日数に含める, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2. 'ある日から後の年のある日は何日目か(起点日と終点日はともに日数に含めない)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はともに日数に含めない, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2 - 2. 'ある日から後の年のある日は何日目か(起点日と終点日のどちらかは日数に含めない)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はともに日数に含めない, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2 - 1. ある年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目) :- うるう年は何回来るか(_年起点,_年終点,_うるう年の回数), '基本は一年365日で計算し、それにうるう年の回数(日数)を加える'(_年起点,_年終点,_うるう年の回数,_何日目). '基本は一年365日で計算し、それにうるう年の回数(日数)を加える'(_年起点,_年終点,_うるう年の回数,_何日目) :- _何日目 is _うるう年の回数 + 365 * (_年終点 - _年起点 + 1). 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目) :- _翌年 is _年起点 + 1, ある年の元旦から後の年の大晦日は何日目か(_翌年,_年終点,_何日目). ある年の元旦から後の年のある日は何日目か(_年起点,_年終点,_月終点,_日終点,_何日目) :- _前年 is _年終点 - 1, ある年の元旦から後の年の大晦日は何日目か(_年起点,_前年,_何日目_1), ある年月日はその年の元旦から何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _何日目_1 + _何日目_2. ある年月日はその年の元旦から何日目か(_年,_月,_日,_元旦から何日) :- 月日数ならび(_年,_月日数ならび), _前月 is _月 - 1, length(L0,_月), append(L0,_,_月日数ならび), sum(L0,_前月末日までの日数), _元旦から何日 is _前月末日までの日数 + _日. 大晦日は何日目か(_年,_月,_日,_大晦日は何日目) :- 月日数ならび(_年,_月日数ならび), 翌月から一日から大晦日は何日目か(_年,_月,_日,_月日数ならび,_翌月の一日から大晦日は何日目), 今日を含めて今月末日までの日数(_年,_月,_日,_月日数ならび,_今日を含めて今月の末日までの日数), _大晦日は何日目 is _今日を含めて今月の末日までの日数 + _翌月の一日から大晦日は何日目. 翌月から一日から大晦日は何日目か(_年,_月,_日,_月日数ならび,_何日目) :- length(L0,_月), append(L0,_翌月からの月日数ならび,_月日数ならび), sum(_翌月からの月日数ならび,_何日目). 今日を含めて今月末日までの日数(_年,_月,_日,_月日数ならび,_今日を含めて今月の末日までの日数) :- nth1(_月,_月日数ならび,_今月の日数), _今日を含めて今月の末日までの日数 is _今月の日数 - _日 + 1. 明日から今月末日までの日数(_年,_月,_日,_月日数ならび,_明日から今月の末日までの日数) :- nth1(_月,_月日数ならび,_今月の日数), _明日から今月の末日までの日数 is _今月の日数 - _日. 月日数ならび(_年,[31,29,31,30,31,30,31,31,30,31,30,31]) :- うるう年(_年),!. 月日数ならび(_年,[31,28,31,30,31,30,31,31,30,31,30,31]). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_),!, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 起点日と終点日はそれぞれ日数に含める. 起点日と終点日はともに日数に含めない. % 以下のサイトは # 出典:: 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/db/1343899481/598 # # mysql 5.5 # # テーブル master # tcode # tname # lastdate # 〜 # # daily_data # select tcode,max(tdate) as maxdate # from daily_date # group by tcode; # # このdaily_dateから得られるmaxdateを使って # masterのtcodeの対応するlastdateに入れたいのですが、 # どのようにupdateを書けば良いのでしょうか? # 'daily_dateから得られるmaxdateを使ってmasterのtcodeの対応するlastdateに入れたい' :- dail_dateテーブルの構造(P1,_daily_date_tcode,_date), masterテーブルの構造(P2,_master_tcode,_lastdate), findsetof(_tcode,P1,L1), 最大日付に変更する(L1,P1,P2,_daily_date_tcode,_date,_master_tcode,_lastdate),!. daily_dateテーブルの構造(P,_tcode,_date) :- count(テーブル定義(daily_date,_,_),_アリティ), length(L,_アリティ), P =.. [daily_date|L], tcodeとdateの列位置を確定する(L,_tcode,_date),!. tcodeとdateの列位置を確定する(L,_tcode,_date),!. テーブル定義(daily_date,_nth1_tcode,tcode), テーブル定義(daily_date,_nth1_date,date), nth1(_nth1_tcode,L,_tcode), nth1(_nth1_date,L,_date),!. masterテーブルの構造(P,_tcode,_date) :- count(テーブル定義(master,_,_),_アリティ), length(L,_アリティ), P =.. [master|L], tcodeとlastdateの列位置を確定する(L,_tcode,_lastdate),!. tcodeとlastdateの列位置を確定する(L,_tcode,_date),!. テーブル定義(master,_nth1_tcode,tcode), テーブル定義(master,_nth1_lastdate,lastdate), nth1(_nth1_tcode,L,_tcode), nth1(_nth1_date,L,_lastdate),!. 最大日付に変更する(L1,P1,P2,_daily_date_tcode,_date,_master_tcode,_lastdate) :- forall(( member(_tcode,L1), findmax(_date,P1,_maxdate), lastdateの更新(_maxdate,P2,_tcode,_lastdate)), true). lastdateの更新(_maxdate,P,_tcode,_lastdate) :- retract(P), _lastdate = _maxdate, asserta(P),!. lastdateの更新(_maxdate,P,_tcode,_lastdate) :- _lastdate = _maxdate, asserta(P),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/227 # # [1] 授業単元: 配列の整列 # [2] 問題文(含コード&リンク):字数超えてしまったのでリンク張ります。 # [ http://ime.nu/codepad.org/YCoV3saL ] # # /* # # 2次元配列の整列 # # ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 # # | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | # # これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) # 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合計点で照準に整列して表示する(整列後)。 # # 【実行例】 # # 整列前 # 番号 問1  問2 問3 問4 問5 合計 # 1001 20 30 49 41 90 230 # 1002 50 30 24 0 95 199 # 1003 20 33 55 35 90 233 # 1004 93 55 56 61 90 355 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1025 80 90 52 50 91 363 # 合計 1145 1015 1297 978 2292 # # 整列後 # 番号 問5  問3 問1 問2 問4 合計 # 1025 91 52 80 90 50 363 # 1004 90 56 93 55 61 355 # 1003 90 50 94 50 49 233 # 1004 100 49 70 30 62 311 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1015 90 53 20 20 0 183 # 合計 2292 1297 1145 1015 978 # # ※実行例が長くなってしまうので途中省略しています。 # # */ 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。' :- 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1), '学生ごとの合格点と、問ごと合計点を求めて表示する'(LL1,LL2), '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(LL2). 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1) :- get_split_lines('seiseki.dat',[' '],LL1). '学生ごとの合格点と、問ごと合計点を求めて表示する'(LL1,LL2) :- '行列を列の合計で降順に整列して列位置を交換し(LL1,LL2), 問いごとの合計を表示する(LL2). 列の合計で降順に整列して列位置を交換し(LL,LL1) :- 転置(LL,_転置されたLL), findall([_合計,_nth1|L],( nth1(_nth1,_転置されたLL,L), sum(L,_合計)), _転置され合計を付加されたLL), 降順バブルソート(_転置され合計と列位置が付加されたLL,_降順に整列された転置され合計と列位置が付加されたLL), 転置(_降順に整列された転置され合計と列位置が付加されたLL,LL1). 問いごとの合計を表示する(LL2) :- between(1,6,_nth), nth0(_nth,LL2,[_合計|_]), atomic_list_concat([問,_nth,' = ',_合計],S), writef(' %t,',[S]), _nth = 6, write('\n'). '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(LL1) :- 列の合計で降順に整列して列位置を交換し(LL1,LL2), 行合計で降順に整列する(LL2,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL), 表示する(_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL). 行合計で降順に整列する(LL1,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL) :- findall([_合計|L2],( member(L,LL1), 要素の合計を最終要素に付加(L,_合計,L2)), LL2), 降順バブルソート(LL2,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL). 要素の合計を最終要素に付加(L1,_合計,L2) :- 要素の合計を最終要素に付加(L1,0,_合計,L2). 要素の合計を最終要素に付加([],_合計,_合計,[_合計]). 要素の合計を最終要素に付加([N|R1],_合計_1,_合計,[N|R2]) :- _合計_2 is _合計 + N, 要素の合計を最終要素に付加(R1,_合計_2,_合計,R2). 表示する(LL2) :- 最終見出しを得る(LL2,_見出し), writef('%t\n',[_見出し]), 行列部分の表示(LL2), 最終合計の表示(LL2). 行列部分の表示(LL) :- append(_,[[_|L]|R],LL), writef('%5l%5r%5r%5r%5r%5r%5r\n',L), R = []. 最終合計の表示([_最終合計ならび|_]) :- writef(' %5r%5r%5r%5r%5r%5r\n',_最終合計ならび). 合計点の表示(_順位づけられた合計点ならび) :- findall(_合計点,( member([_合計点,_],_順位づけられた合計点ならび)), _合計点ならび), writef(' %5r%5r%5r%5r%5r%5r\n',_合計点ならび). 最終見出しを得る([_,L|_],_最終見出し) :- findall(S,( member(N,L), atomic_list_concat(['問',_nth1,' '],S)), L), atomic_list_concat(['番号 '|L],_最終見出し). 降順バブルソート(L1,L2) :- append(L0,[A,B|R],L1), A @< B, append(L0,[B,A|R],L3), 降順バブルソート(L3,L2),!. 降順バブルソート(L,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/227 # # [1] 授業単元: 配列の整列 # [2] 問題文(含コード&リンク):字数超えてしまったのでリンク張ります。 # [ http://ime.nu/codepad.org/YCoV3saL ] # # /* # # 2次元配列の整列 # # ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 # # | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | # # これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) # 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合計点で照準に整列して表示する(整列後)。 # # 【実行例】 # # 整列前 # 番号 問1  問2 問3 問4 問5 合計 # 1001 20 30 49 41 90 230 # 1002 50 30 24 0 95 199 # 1003 20 33 55 35 90 233 # 1004 93 55 56 61 90 355 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1025 80 90 52 50 91 363 # 合計 1145 1015 1297 978 2292 # # 整列後 # 番号 問5  問3 問1 問2 問4 合計 # 1025 91 52 80 90 50 363 # 1004 90 56 93 55 61 355 # 1003 90 50 94 50 49 233 # 1004 100 49 70 30 62 311 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1015 90 53 20 20 0 183 # 合計 2292 1297 1145 1015 978 # # ※実行例が長くなってしまうので途中省略しています。 # # */ 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。' :- 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1), '学生ごとの合格点と、問ごと合計点を求めて表示する(整列前)'(LL1,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列), 'さらに、学生の合格点で照準に整列して表示する(整列後)。'(_問いごとの合計点ならび,転置された学生の合格点付き点数行列). 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1) :- get_split_lines('seiseki.dat',[' '],LL1). '学生ごとの合格点と、問ごと合計点を求めて表示する(整列前)'(LL1,LL4,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列) :- '学生ごとの合格点と、'(LL1,_学生の合格点付き点数行列), '問ごと合計点を求めて'(_学生の合格点付き点数行列,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列), 表示する(_学生の合格点付き点数行列,_問いごとの合計点ならび). '学生ごとの合格点と、'([],[]). '学生ごとの合格点と、'([[_学生番号|L1]|R1],[[_学生番号|L2]|R2]) :- sum(L1,_sum), 学生ごとの合格点(L1,0,L2), '学生ごとの合格点と、'(R1,R2). 学生ごとの合格点([],_合計点,[_合計点]). 学生ごとの合格点([A|R1],_合計点_1,[A|R2]) :- _合計点2 is A + _合計点_1, 学生ごとの合格点(R1,R2). 問ごと合計点を求めて(_学生の合格点付き点数行列,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列) :- 転置(_学生の合格点付き点数行列,_転置された学生の合格点付き点数行列), 問ごと合計点(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび). 問ごと合計点([],[]). 問ごと合計点([L1|R1],[S|R2]) :- sum(L1,S), 問ごと合計点(R1,R2). 表示する(_学生の合格点付き点数行列,_問いごとの合計点ならび) :- write('番号 問1  問2 問3 問4 問5 合計\n'), append(_,[L|R],_学生の合格点付き点数行列), writef('%5l%5r%5r%5r%5r%5r%5r\n',L), R = [], writef(' %5r%5r%5r%5r%5r%5r\n',_問いごとの合計点ならび). '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび) :- '次に、問の合計点の降順に左から右に向かって整列し、'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび,LL_1), 'さらに、学生の合格点で照準に整列して'(LL_1,LL_2), 表示する_2(_問いごとの合計点ならび,LL_2). '次に、問の合計点の降順に左から右に向かって整列し、'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび) :- 順位づけする(_問いごとの合計点ならび,_順位づけされた合計点ならび), findall(L,( between(1,5,N), nth1(N,_順位づけされた合計点ならび,[_,_項目番号]), nth1(_項目番号,_転置された学生の合格点付き点数行列,L)), LL_1), 転置([_学生番号ならび|LL_1],LL_2). 'さらに、学生の合格点で照準に整列して'(LL1,LL2) :- findall([A|L],( member(L,LL1), last(L,A)), LL3), 整列(LL3,LL4), 鍵を切り離して逆順にならび替え(LL4,[],LL2). 鍵を切り離して逆順にならび替え([],LL,LL). 鍵を切り離して逆順にならび替え([[A|L]|R1],L_1,LL) :- 鍵を切り離して逆順にならび替え(R1,[L|L_1],LL). 順位づけする(_問いごとの合計点ならび,_順位づけされた合計点ならび) :- findall([_合計点,_nth1],( between(1,5,_nth1), nth1(_nth1,_問いごとの合計点ならび,_合計点)), LL1), 降順整列(LL1,_順位づけされた合計点ならび). 降順整列(LL1,_順位づけされた合計点ならび) :- 整列(LL1,LL2), reverse(LL2,_順位づけされた合計点ならび). 表示する_2(LL_2,_順位づけられた合計点ならび) :- 見出し表示(_順位づけられた合計点ならび), 行列部分の表示(LL_2), 合計点の表示(_順位づけられた合計点ならび). 見出し表示(_順位づけられた合計点ならび) :- findall(_項目番号,( member([_,_項目番号],_順位づけられた合計点ならび)), _項目番号ならび), writef('番号 %5r%5r%5r%5r%5r%5r合計\n',_項目番号ならび). 行列部分の表示(LL) :- append(_,[L|R],LL), writef('%5l%5r%5r%5r%5r%5r%5r\n',L), R = []. 合計点の表示(_順位づけられた合計点ならび) :- findall(_合計点,( member([_合計点,_],_順位づけられた合計点ならび)), _合計点ならび), writef(' %5r%5r%5r%5r%5r%5r\n',_合計点ならび). % 以下のサイトは # # 教育漢字から任意の一文字を選択する # 教育漢字から任意の二文字を選択する # 教育漢字から任意の三文字を選択する # 教育漢字ならび([一,右,雨,円,王,音,下,火,花,貝,学,気,九,休,玉,金,空,月,犬,見,五,口,校,左,三,山,子,四,糸,字,耳,七,車,手,十,出,女,小,上,森,人,水,正,生,青,夕,石,赤,千,川,先,早,草,足,村,大,男,竹,中,虫,町,天,田,土,二,日,入,年,白,八,百,文,木,本,名,目,立,力,林,六,引,羽,雲,園,遠,何,科,夏,家,歌,画,回,会,海,絵,外,角,楽,活,間,丸,岩,顔,汽,記,帰,弓,牛,魚,京,強,教,近,兄,形,計,元,言,原,戸,古,午,後,語,工,公,広,交,光,考,行,高,黄,合,谷,国,黒,今,才,細,作,算,止,市,矢,姉,思,紙,寺,自,時,室,社,弱,首,秋,週,春,書,少,場,色,食,心,新,親,図,数,西,声,星,晴,切,雪,船,線,前,組,走,多,太,体,台,地,池,知,茶,昼,長,鳥,朝,直,通,弟,店,点,電,刀,冬,当,東,答,頭,同,道,読,内,南,肉,馬,売,買,麦,半,番,父,風,分,聞,米,歩,母,方,北,毎,妹,万,明,鳴,毛,門,夜,野,友,用,曜,来,里,理,話,悪,安,暗,医,委,意,育,員,院,飲,運,泳,駅,央,横,屋,温,化,荷,開,界,階,寒,感,漢,館,岸,起,期,客,究,急,級,宮,球,去,橋,業,曲,局,銀,区,苦,具,君,係,軽,血,決,研,県,庫,湖,向,幸,港,号,根,祭,皿,仕,死,使,始,指,歯,詩,次,事,持,式,実,写,者,主,守,取,酒,受,州,拾,終,習,集,住,重,宿,所,暑,助,昭,消,商,章,勝,乗,植,申,身,神,真,深,進,世,整,昔,全,相,送,想,息,速,族,他,打,対,待,代,第,題,炭,短,談,着,注,柱,丁,帳,調,追,定,庭,笛,鉄,転,都,度,投,豆,島,湯,登,等,動,童,農,波,配,倍,箱,畑,発,反,坂,板,皮,悲,美,鼻,筆,氷,表,秒,病,品,負,部,服,福,物,平,返,勉,放,味,命,面,問,役,薬,由,油,有,遊,予,羊,洋,葉,陽,様,落,流,旅,両,緑,礼,列,練,路,和,愛,案,以,衣,位,囲,胃,印,英,栄,塩,億,加,果,貨,課,芽,改,械,害,街,各,覚,完,官,管,関,観,願,希,季,紀,喜,旗,器,機,議,求,泣,救,給,挙,漁,共,協,鏡,競,極,訓,軍,郡,径,型,景,芸,欠,結,建,健,験,固,功,好,候,航,康,告,差,菜,最,材,昨,札,刷,殺,察,参,産,散,残,士,氏,史,司,試,児,治,辞,失,借,種,周,祝,順,初,松,笑,唱,焼,象,照,賞,臣,信,成,省,清,静,席,積,折,節,説,浅,戦,選,然,争,倉,巣,束,側,続,卒,孫,帯,隊,達,単,置,仲,貯,兆,腸,低,底,停,的,典,伝,徒,努,灯,堂,働,特,得,毒,熱,念,敗,梅,博,飯,飛,費,必,票,標,不,夫,付,府,副,粉,兵,別,辺,変,便,包,法,望,牧,末,満,未,脈,民,無,約,勇,要,養,浴,利,陸,良,料,量,輪,類,令,冷,例,歴,連,老,労,録,圧,移,因,永,営,衛,易,益,液,演,応,往,桜,恩,可,仮,価,河,過,賀,快,解,格,確,額,刊,幹,慣,眼,基,寄,規,技,義,逆,久,旧,居,許,境,均,禁,句,群,経,潔,件,券,険,検,限,現,減,故,個,護,効,厚,耕,鉱,構,興,講,混,査,再,災,妻,採,際,在,財,罪,雑,酸,賛,支,志,枝,師,資,飼,示,似,識,質,舎,謝,授,修,述,術,準,序,招,承,証,条,状,常,情,織,職,制,性,政,勢,精,製,税,責,績,接,設,舌,絶,銭,祖,素,総,造,像,増,則,測,属,率,損,退,貸,態,団,断,築,張,提,程,適,敵,統,銅,導,徳,独,任,燃,能,破,犯,判,版,比,肥,非,備,俵,評,貧,布,婦,富,武,復,複,仏,編,弁,保,墓,報,豊,防,貿,暴,務,夢,迷,綿,輸,余,預,容,略,留,領,異,遺,域,宇,映,延,沿,我,灰,拡,革,閣,割,株,干,巻,看,簡,危,机,貴,揮,疑,吸,供,胸,郷,勤,筋,系,敬,警,劇,激,穴,絹,権,憲,源,厳,己,呼,誤,后,孝,皇,紅,降,鋼,刻,穀,骨,困,砂,座,済,裁,策,冊,蚕,至,私,姿,視,詞,誌,磁,射,捨,尺,若,樹,収,宗,就,衆,従,縦,縮,熟,純,処,署,諸,除,将,傷,障,城,蒸,針,仁,垂,推,寸,盛,聖,誠,宣,専,泉,洗,染,善,奏,窓,創,装,層,操,蔵,臓,存,尊,宅,担,探,誕,段,暖,値,宙,忠,著,庁,頂,潮,賃,痛,展,討,党,糖,届,難,乳,認,納,脳,派,拝,背,肺,俳,班,晩,否,批,秘,腹,奮,並,陛,閉,片,補,暮,宝,訪,亡,忘,棒,枚,幕,密,盟,模,訳,郵,優,幼,欲,翌,乱,卵,覧,裏,律,臨,朗,論]). 教育漢字から一文字を選択する(_漢字) :- 教育漢字ならび(_教育漢字ならび), 教育漢字から一文字を選択する(_教育漢字ならび,_漢字). 教育漢字から一文字を選択する(_教育漢字ならび,_漢字) :- _nth0 is random(1006), nth0(_nth0,_教育漢字ならび,_漢字). 教育漢字から重複なく二文字を選択する(_漢字_1,_漢字_2) :- 教育漢字から重複なくn文字を選択する(2,[_漢字_1,_漢字_2]). 教育漢字から重複なく三文字を選択する(_漢字_1,_漢字_2,_漢字_3) :- 教育漢字から重複なくn文字を選択する(3,[_漢字_1,_漢字_2,_漢字_3]). 教育漢字から重複なくn文字を選択する(_n,_漢字ならび) :- 教育漢字ならび(_教育漢字ならび), 教育漢字から重複なくn文字を選択する(_n,_教育漢字ならび,[],_漢字ならび). 教育漢字から重複なくn文字を選択する(_n,_,L,L) :- length(L,_n),!. 教育漢字から重複なくn文字を選択する(_n,_教育漢字ならび,L1,L) :- 重複なくn文字を選択して行く(_n,_教育漢字ならび,L1,L). 重複なくn文字を選択して行く(_n,_教育漢字ならび,L1,L) :- 重複なく一文字を選択する(_教育漢字ならび,L1,_漢字), 教育漢字から重複なくn文字を選択する(_n,_教育漢字ならび,[_漢字|L1],L). 重複なく一文字を選択する(_教育漢字ならび,L1,_漢字) :- 教育漢字から一文字を選択する(_教育漢字ならび,_漢字), 重複検査(_教育漢字ならび,L1,_漢字). 重複検査(_教育漢字ならび,L1,_漢字) :- 重複なく(_漢字,L1),!. 重複検査(_教育漢字ならび,L1,_漢字) :- 重複なく一文字を選択する(_教育漢字ならび,L1,_漢字). 重複なく(_漢字,L1) :- \+(member(_漢字,L1)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/149 # # [1] 授業単元:データ構造アルゴリズム # [2] 問題文(含コード&リンク) : qsort関数を用いてソートするプログラムを作成しなさい。身長の昇順、視力の降順など、複数の条件でソートすること。 # ※qsort関数 # 書式 void qsort(void*base,size_t nmemb,size_t size,int(*compar)(const void*,const void)) # 'qsort関数を用いてソートするプログラムを作成しなさい。身長の昇順、視力の降順など、複数の条件でソートすること。'(_テーブル名,_昇順降順,_鍵ならび,L) :- 単位節からリストに変換(_テーブル名,_属性名ならび,L1), 鍵位置ならびを得る(_鍵ならび,_属性名ならび,_鍵位置ならび), 鍵付きqsort(L1,_昇順降順,_鍵位置ならび,L2). 単位節からリストに変換(_テーブル名,_属性名ならび,L1) :- findall(_属性名,( テーブル定義(_テーブル名,_,_属性名)), _属性名ならび), length(_属性名ならび,Len), length(_引数ならび,Len), P =.. [_身体検査|_引数ならび], findall(_引数ならび,( call(P)), L1). 鍵位置ならびを得る([],_,[]). 鍵位置ならびを得る([_鍵|R1],_属性名ならび,[_鍵位置|R3]) :- nth1(_鍵位置,_属性名ならび,_鍵), 鍵位置ならびを得る(R1,_属性名ならび,R3). 鍵付きqsort([],_,_,[]) :- !. 鍵付きqsort([_軸要素|R1],_昇順降順,_鍵位置ならび,LL2) :- 鍵取得(_鍵位置ならび,_軸要素,_軸要素の鍵ならび), 分割(_軸要素の鍵ならび,R1,_昇順降順,_鍵位置ならび,LL1,LL2), 鍵付きqsort(LL1,_鍵位置ならび,LL1_s), 鍵付きqsort(LL2,_鍵位置ならび,LL2_2), append(LL1_s,[_軸要素|LL2_s],LL2). 鍵取得([],_,[]). 鍵取得([_鍵位置|R1],L,[_鍵|R3]) :- nth1(_鍵位置,L,_鍵), 鍵取得(R1,L,R3). 分割(_軸要素の鍵ならび,[],_,_鍵位置ならび,[],[]). 分割(_軸要素の鍵ならび,[L1|R2],_昇順降順,_鍵位置ならび,L2,L3) :- 鍵取得(_鍵位置ならび,L1,_鍵ならび_2), 分割_2(_昇順降順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,L2,L3), 分割(_軸要素の鍵ならび,R2,_昇順降順,_鍵位置ならび,R2,R3). 分割_2(昇順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,[_鍵ならび|R2],R3) :- _軸要素の鍵ならび @=< _鍵ならび. 分割_2(昇順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,R2,[_鍵ならび|R3]) :- _軸要素の鍵ならび @> _鍵ならび. 分割_2(降順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,[_鍵ならび|R2],R3) :- _軸要素の鍵ならび @>= _鍵ならび. 分割_2(降順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,R2,[_鍵ならび|R3]) :- _軸要素の鍵ならび @< _鍵ならび. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/94 # # [1] 授業単元: Cコーディング初級 # [2] 問題文(含コード&リンク): # # プログラムを実行した日がその年の第何週目にあるかを終了コードとして整数で返す # # [3] 環境 #  [3.1] OS: Windows #  [3.2] gcc 4.3.4 #  [3.3] 言語: C # [4] 期限: 1/17 # [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) time.h を使います # 週の頭は日曜から始まります # 1月1日を含む週に4日以上ある場合に第1週となります # つまり1月1日が日曜から始まっているときはその週が第1週ですが # 1月4日が日曜から始まっているときはその週が第1週になります 'プログラムを実行した日がその年の第何週目にあるかを終了コードとして整数で返す 週の頭は日曜から始まります 1月1日を含む週に4日以上ある場合に第1週となります つまり1月1日が日曜から始まっているときはその週が第1週ですが 1月4日が日曜から始まっているときはその週が第1週になります'(_その年の第何週目) :- プログラムを実行した日が(_年,_月,_日), 'その年の第何週目にあるかを終了コードとして整数で返す 1月1日を含む週に4日以上ある場合に第1週となります つまり1月1日が日曜から始まっているときはその週が第1週ですが 1月4日が日曜から始まっているときはその週が第1週になります'(_年,_月,_日,_その年の第何週目). プログラムを実行した日が(_年,_月,_日) :- date(_年,_月,_日). 'その年の第何週目にあるかを終了コードとして整数で返す 1月1日を含む週に4日以上ある場合に第1週となります つまり1月1日が日曜から始まっているときはその週が第1週ですが 1月4日が日曜から始まっているときはその週が第1週になります'(_年,_月,_日,_その年の第何週目) :- 'Zellerの公式を用いて曜日を得る'(_年,1,1,_曜日を表す値,_曜日), _曜日を表す値 >= 4, _今年に入ってからの第一週以前の日数 is 7 - _曜日を表す値, 一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数), _その年の第何週目 is (_一月一日からの累積日数 - _今年に入ってからの第一週以前の日数) // 7 + 1. 'その年の第何週目にあるかを終了コードとして整数で返す 1月1日を含む週に4日以上ある場合に第1週となります つまり1月1日が日曜から始まっているときはその週が第1週ですが 1月4日が日曜から始まっているときはその週が第1週になります'(_年,_月,_日,_その年の第何週目) :- 'Zellerの公式を用いて曜日を得る'(_年,1,1,_曜日を表す値,_曜日), _曜日を表す値 < 4, 一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数), _その年の第何週目 is _一月一日からの累積日数 // 7 + 1. 一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数) :- うるう年(_年), findsum(_日数,( nth1(_nth1,[31,29,31,30,31,30,31,31,30,31,31],_日数), _nth1 < _月), 累積日数_1), _累積日数 is _累積日数 + _日. 一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数) :- \+(うるう年(_年)), findsum(_日数,( nth1(_nth1,[31,28,31,30,31,30,31,31,30,31,31],_日数), _nth1 < _月), 累積日数_1), _累積日数 is _累積日数 + _日. 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 'Zellerの公式で使う曜日を表す値'(_曜日を表す値,_曜日),!. 'Zellerの公式で使う曜日を表す値'(0,'日曜'). 'Zellerの公式で使う曜日を表す値'(1,'月曜'). 'Zellerの公式で使う曜日を表す値'(2,'火曜'). 'Zellerの公式で使う曜日を表す値'(3,'水曜'). 'Zellerの公式で使う曜日を表す値'(4,'木曜'). 'Zellerの公式で使う曜日を表す値'(5,'金曜'). 'Zellerの公式で使う曜日を表す値'(6,'土曜'). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/490 # # SQL SERVER2012です。 # # 列1をaとbで検索して # 新しく列2,列3を作成。 # 列2にaの値を # 列3にbの値を表示することが # 可能ならばやり方を教えてもらえませんでしょうか。 # # 列1 # a # b # a # b # c # # 求めたい結果 # 列2 列3 # a b # a b # # 宜しくお願いします。 # # '列1をaとbで検索して 新しく列2,列3を作成。 列2にaの値を 列3にbの値を表示する'(_列2,_列3) :- findall(a,table(a),L1), findall(b,table(b),L2), nth1(_nth1,L1,_列2), nth1(_nth1,L2,_列3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/79 # # [1] 授業単元: システム開発 # [2] 問題文(含コード&amp;リンク): # 以下のヒントを元に、生徒の成績を管理するプログラムを作りなさい # http://ime.nu/codepad.org/vevYc04f # http://ime.nu/codepad.org/rCOCOccX # # /* seiseki.c 成績処理システム */ # #include /* 標準入出力 */ # #include /* 標準ライブラリー */ # #include /* 数学的関数 */ # #include /* 文字列関数 */ # #define SEN "--------------------\n" /* マクロ定義 */ # #define KEISEN "=====================\n" # # /* サブルーチンの宣言 */ # void data_write(void); /* データの書き込み */ # void data_read(void); /* データの読み込み */ # void data_disp(void); /* 成績一覧表の表示 */ # void data_kensk(void); /* 検索処理 */ # void the_end(void); /* プログラムの終了処理 */ # # /* 変数, 構造体の宣言 */ # struct seiseki{ # char simei[20]; /* 氏名 */ # int bango, kokugo, eigo, suugaku; /* 番号, 国語, 英語, 数学 */ # }; # struct seiseki a[100]; /* 登録数は100名まで */ # int n, i, goukei; /* 変数の定義 */ # double heikin, std; # # main() # { # int k; /* switch-case用の処理番号 */ # do{ /* 繰り返し処理do-while */ # /* 初期メニュー画面 */ # printf("\n"); # printf("☆☆ 成績処理メニュー ☆☆\n"); # printf(SEN); # printf("データの書き込み・・・・・・・・・【1】\n"); # printf("データの読み込み・・・・・・・・・【2】\n"); # printf("成績一覧表・・・・・・・・・・・・【3】\n"); # printf("検索処理・・・・・・・・・・・・・【4】\n"); # printf("終わり・・・・・・・・・・・・・・【9】\n"); # printf(SEN); # printf("処理番号を入力してください:"); # scanf("%d",&k); # printf("\n"); # # /* 関数の呼び出し */ # switch(k){ # case 1:data_write();break; # case 2:data_read();break; # case 3:data_disp();break; # case 4:data_kensk();break; # case 9:the_end();break; # default:printf("該当番号なし\n");break; # } # }while(k < 10); # } # # /* 成績一覧表の作成 */ # void data_disp(void) # { # int goukei_k=0, goukei_e=0, goukei_s=0; # double heikin_k=0.0, heikin_e=0.0, heikin_s=0.0; # double std_k=0.0, std_e=0.0, std_s=0.0; # # printf("☆☆☆ 成績一覧表 ☆☆☆\n"); # printf(KEISEN); # printf("番号 名前 国語 英語 数学 合計 平均\n"); # for(i=0;i < n;i++){ # printf("%5d %-10s %5d %5d %5d", a[i].bango, a[i].simei, a[i].kokugo, a[i].eigo, a[i].suugaku); # /* 3科目の合計計算 */ # goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku); # printf("%5d",goukei); # /* キャスト:3科目の平均計算 */ # heikin=(double)goukei/3; # printf("%6.1f\n",heikin); # } # printf("\n"); # # /* 各科目の合計計算 */ # for(i=0;i < n;i++){ # goukei_k+=a[i].kokugo; # goukei_e+=a[i].eigo; # goukei_s+=a[i].suugaku; # } # # /* 各科目の平均計算 */ # heikin_k=(double)goukei_k/n; # heikin_e=(double)goukei_e/n; # heikin_s=(double)goukei_s/n; # # /* 偏差の二乗和の計算 */ # for(i=0;i < n;i++){ # std_k+=pow((a[i].kokugo-heikin_k),2); # std_e+=pow((a[i].eigo-heikin_e),2); # std_s+=pow((a[i].suugaku-heikin_s),2); # } # # /* 標準偏差の計算 */ # std_k=sqrt(std_k/n); # std_e=sqrt(std_e/n); # std_s=sqrt(std_s/n); '繰り返し処理do-while'(P) :- 'do{ /* 繰り返し処理do-while */ }while(k < 10);'(P). 初期メニュー画面(_k) :- '/* 初期メニュー画面 */ printf("\n"); printf("☆☆ 成績処理メニュー ☆☆\n"); printf(SEN); printf("データの書き込み・・・・・・・・・【1】\n"); printf("データの読み込み・・・・・・・・・【2】\n"); printf("成績一覧表・・・・・・・・・・・・【3】\n"); printf("検索処理・・・・・・・・・・・・・【4】\n"); printf("終わり・・・・・・・・・・・・・・【9】\n"); printf(SEN); printf("処理番号を入力してください:"); scanf("%d",&k); printf("\n");'(_k). 関数の呼び出し(_k) :- '/* 関数の呼び出し */ switch(k){ case 1:data_write();break; case 2:data_read();break; case 3:data_disp();break; case 4:data_kensk();break; case 9:the_end();break; default:printf("該当番号なし\n");break; }'(_k). '3科目の合計計算'(_i,_a,_goukei) :- '/* 3科目の合計計算 */ goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku); printf("%5d",goukei);'(_i,_a,_goukei). 'キャスト:3科目の平均計算'(_goukei,_heikin) :- '/* キャスト:3科目の平均計算 */ heikin=(double)goukei/3; printf("%6.1f\n",heikin);'(_goukei,_heikin). 各科目の合計計算(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :- '/* 各科目の合計計算 */ for(i=0;i < n;i++){ goukei_k+=a[i].kokugo; goukei_e+=a[i].eigo; goukei_s+=a[i].suugaku; }'(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s). 各科目の平均計算((_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s) :- '/* 各科目の平均計算 */ heikin_k=(double)goukei_k/n; heikin_e=(double)goukei_e/n; heikin_s=(double)goukei_s/n;'(_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s). 偏差の二乗和の計算(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- '/* 偏差の二乗和の計算 */ for(i=0;i < n;i++){ std_k+=pow((a[i].kokugo-heikin_k),2); std_e+=pow((a[i].eigo-heikin_e),2); std_s+=pow((a[i].suugaku-heikin_s),2); }'(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s). 標準偏差の計算(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- '/* 標準偏差の計算 */ std_k=sqrt(std_k/n); std_e=sqrt(std_e/n); std_s=sqrt(std_s/n);'(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'do{ /* 繰り返し処理do-while */ }while(k < 10);'(P) :- between(1,10,N), call(P), N = 10. '/* 初期メニュー画面 */ printf("\n"); printf("☆☆ 成績処理メニュー ☆☆\n"); printf(SEN); printf("データの書き込み・・・・・・・・・【1】\n"); printf("データの読み込み・・・・・・・・・【2】\n"); printf("成績一覧表・・・・・・・・・・・・【3】\n"); printf("検索処理・・・・・・・・・・・・・【4】\n"); printf("終わり・・・・・・・・・・・・・・【9】\n"); printf(SEN); printf("処理番号を入力してください:"); scanf("%d",&k); printf("\n");'(_k) :- write('\n'), writef('☆☆ 成績処理メニュー ☆☆\n'), write('%t',['--------------------\n']), write('データの書き込み・・・・・・・・・【1】\n'), write('データの読み込み・・・・・・・・・【2】\n'), write('成績一覧表・・・・・・・・・・・・【3】\n'), write('検索処理・・・・・・・・・・・・・【4】\n'), write('終わり・・・・・・・・・・・・・・【9】\n'), write('--------------------\n'), write('処理番号を入力してください:'), 整数を得る(_k), write('\n'). '/* 関数の呼び出し */ switch(k){ case 1:data_write();break; case 2:data_read();break; case 3:data_disp();break; case 4:data_kensk();break; case 9:the_end();break; default:printf("該当番号なし\n");break; }'(_k) :- '_kの値によって述語を呼び出す'(_k). '_kの値によって述語を呼び出す'(1) :- data_write. '_kの値によって述語を呼び出す'(2) :- data_read. '_kの値によって述語を呼び出す'(3) :- data_disp. '_kの値によって述語を呼び出す'(4) :- data_kensk. '_kの値によって述語を呼び出す'(9) :- the_end. '/* 3科目の合計計算 */ goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku); printf("%5d",goukei);'(_i,_a,_goukei) :- nth0(_i,_a,[_kokugo,_eigo,_suugaku]), _goukei is _kokugo + _eigo + _suugaku, writef('%t',[_goukei]). '/* キャスト:3科目の平均計算 */ heikin=(double)goukei/3; printf("%6.1f\n",heikin);'(_goukei,_heikin) :- _heikin is _goukei / 3, format('~1f\n',[_heikin]). '/* 各科目の合計計算 */ for(i=0;i < n;i++){ goukei_k+=a[i].kokugo; goukei_e+=a[i].eigo; goukei_s+=a[i].suugaku; }'(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :- 各科目の合計計算(0,_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s). 各科目の合計計算(_n_1,_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :- _n_1 < _n, nth1(_nth1,_a,[_kokugo,_eigo,_suugaku]), _goukei_k_2 is _goukei_k_1 + _kokugo, _goukei_e_2 is _goukei_e_1 + _eigo, _goukei_s_2 is _goukei_s_1 + _suugaku, _n_2 is _n_1 + 1, 各科目の合計計算(_n_2,_n,_a,_goukie_k_2,_goukei_e_2,_goukei_s_2,_goukie_k,_goukei_e,_goukei_s). 各科目の合計計算(_n_1,_n,_a,_goukie_k,_goukei_e,_goukei_s,_goukie_k,_goukei_e,_goukei_s) :- _n_1 >= _n. '/* 各科目の平均計算 */ heikin_k=(double)goukei_k/n; heikin_e=(double)goukei_e/n; heikin_s=(double)goukei_s/n;'(_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s) :- _heikin_k is _heikin_k_1 + _goukei_k / _n, _heikin_e is _heikin_e_1 + _goukei_e / _n, _heikin_s is _heikin_s_1 + _goukei_s / _n. '/* 偏差の二乗和の計算 */ for(i=0;i < n;i++){ std_k+=pow((a[i].kokugo-heikin_k),2); std_e+=pow((a[i].eigo-heikin_e),2); std_s+=pow((a[i].suugaku-heikin_s),2); }'(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- 偏差の二乗和の計算(0,_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s). 偏差の二乗和の計算(_i_1,_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- _i_1 < _n, 偏差の二乗を加える(_i_1,_n,_a,_std_k_1,_std_e_1,std_s_1,_std_k_2,_std_e_2,std_s_2), _i_2 is _i_1 + 1, 偏差の二乗和の計算(_i_2,_n,_a,_std_k_2,_std_e_2,_std_s_2,_std_k,_std_e,_std_s). 偏差の二乗和の計算(_i_1,_n,_a,_std_k,_std_e,_std_s,_std_k,_std_e,_std_s) :- _i_1 >= _n. 偏差の二乗を加える(_i_1,_a,_std_k_1,_std_e_1,std_s_1,_std_k_2,_std_e_2,std_s_2) :- nth1(_i_1,_a,[_kokugo_heikin_k,_eigo_heikin_e,_suugaku_heikin_s]), _std_k_2 is _std_k_1 + _kokugo_heikin_k ^ 2, _std_e_2 is _std_e_1 + _eigo_heikin_e ^ 2, _std_s_2 is _std_s_1 + _suugaku_heikin_s ^ 2. '/* 標準偏差の計算 */ std_k=sqrt(std_k/n); std_e=sqrt(std_e/n); std_s=sqrt(std_s/n);'(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- _std_k is sqrt(_std_k_1) / _n, _std_e is sqrt(_std_e_1) / _n, _std_s is sqrt(_std_s_1) / _n. % 以下のサイトは # 出典:: 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). % 以下のサイトは # [1] 授業単元:C言語 # [2] 問題 http://ime.nu/codepad.org/yV0KrZox # # 問題4 # 9行9列の九九の表のそれぞれの値を計算によって算出し、表示するプログラムを、二次元配列を用いて作成しなさい。 # ------------------------------------------------------------------- # 1 2 3 4 5 6 7 8 9 # 2 4 6 8 10 12 14 16 18 # 3 6 9 12 15 18 21 24 27 # 4 8 12 16 20 24 28 32 26 # 5 10 15 20 25 30 35 40 45 # 6 12 18 24 30 36 42 48 54 # 7 14 21 28 35 42 49 56 63 # 8 16 24 32 40 48 56 64 72 # 9 18 27 36 45 54 63 72 81 # -------------------------------------------------------------------- # '9行9列の九九の表のそれぞれの値を計算によって算出し、表示するプログラムを、二次元配列を用いて作成しなさい。' :- length(LL,9), findall(L,行の計算(LL,L),LL), 表示する(LL). 行の計算(LL,L) :- nth1(M,LL,L), length(L,9), findall(X,列の計算(M,L,X),L). 列の計算(M,L,X) :- nth1(N,L,_), X is M * N. 表示する(LL) :- write('-------------------------------------------------------------------\n'), 行を表示する(LL,R), R = [], write('-------------------------------------------------------------------\n'). 行を表示する(LL,R) :- append(_,[L|R],LL), writef('%3r%3r%3r%3r%3r%3r%3r%3r%3r\n',L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/78 # # [1] 授業単元:C言語 # [2] 問題 http://ime.nu/codepad.org/yV0KrZox # # 問題2 # 以下2つの3行3列の行列の和を求め、表示するプログラムを、配列を用いて作成しなさい。 # ---------------------------------------------------------------------- # A = # 8 6 9 # 1 5 2 # 2 5 5 # B = # 3 2 3 # 8 6 7 # 2 5 1 # A + B = # 11 8 12 # 9 11 9 # 4 10 6 # --------------------------------------------------------------------- '2つの3行3列の行列の和を求め、表示する'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]) :- '2つの3行3列の行列の和を求め、'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]), 表示する([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]). '2つの3行3列の行列の和を求め、'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]) :- _C_1_1 is _A_1_1 + _B_1_1, _C_1_2 is _A_1_2 + _B_1_2, _C_1_3 is _A_1_3 + _B_1_3, _C_2_1 is _A_2_1 + _B_2_1, _C_2_2 is _A_2_2 + _B_2_2, _C_2_3 is _A_2_3 + _B_2_3, _C_3_1 is _A_3_1 + _B_3_1, _C_3_2 is _A_3_2 + _B_3_2, _C_3_3 is _A_3_3 + _B_3_3. 表示する([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]) :- 'A行列の表示'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]), 'B行列の表示'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]), 'A+B行列の表示'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]). 'A行列の表示'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]) :- write('A =\n'), append(_,[[_A_1,_A_2,_A_3]|R],[[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]), atomic_list_concat([_A_1,_A_2,_A_3],' ',S), writef('%t\n',[S]), R = []. 'B行列の表示'([[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]]) :- write('B =\n'), append(_,[[_B_1,_B_2,_B_3]|R],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]]), atomic_list_concat([_B_1,_B_2,_B_3],' ',S), writef('%t\n',[S]), R = []. 'A+B行列の表示'([[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]) :- write('A + B =\n'), append(_,[[_C_1,_C_2,_C_3]|R],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]), atomic_list_concat([_C_1,_C_2,_C_3],' ',S), writef('%t\n',[S]), R = []. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの3行3列の行列の和を求め、表示する'(_A,_B,_行列の和) :- すべての同一位置の要素の和を求める(_A,_B,_行列の和), 表示する([['A',_A],['B',_B],['A + B',_行列の和]]). すべての同一位置の要素の和を求める(_A,_B,_行列の和) :- findall(_同一列の和ならび,( nth1(_nth1,_A,_行_A), nth1(_nth1,_B,_行_B), 同一列の和を求める(_行_A,_行_B,_同一列の和ならび)), _行列の和). 同一列の和を求める(_行_A,_行_B,_同一列の和ならび) :- findall(_列の和,( nth1(_nth1,_行_A,_列の値_1), nth1(_nth1,_行_B,_列の値_2), _列の和 is _列の値_1 + _列の値_2), _同一列の和ならび). 表示する(LL) :- append(_,[_行列のシンボル,_行列]|R],LL), writef('%t =\n',[_行列のシンボル]), 行列の表示(_行列), R = []. 行列の表示(_行列) :- append(_,[[_行_1,_行_2,_行_3]|R_1],_行列), atomic_list_concat([_行_1,_行_2,_行_3],' ',_行表示), writef('%t\n,[_行表示]), R = [],!. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 161代目 #984 # [1] 授業単元:プログラミング応用 # [2] 問題文(含コード&リンク):西暦を年号に変換するプログラムを作成する。 # ただし、入力できるのは、1868年以降からであり、2008年以降も平成とする。 # 明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。 # 下記を参考にプログラムを作成しなさい。 # int gannen[]={1989, 1926, 1912, 1868}; # char nengou[][8]={"heisei", "syouwa", "taisyou", "meiji"}; # '西暦を年号に変換するプログラムを作成する。 ただし、入力できるのは、1868年以降からであり、2008年以降も平成とする。 明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。'(_西暦,_年号) :- 'ただし、入力できるのは、1868年以降からであり、'(_西暦), '明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。'(_元号ならび,_元年の西暦ならび), 西暦を年号に変換する(_西暦,_元号ならび,_元年の西暦ならび,_年号). 'ただし、入力できるのは、1868年以降からであり、'(_西暦) :- _西暦 >= 1868. '明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。'([明治,大正,昭和,平成],[1868,1912,1926,1989]). 西暦を年号に変換する(_西暦,_元号ならび,_元年の西暦ならび,_年号) :- 西暦から元号と元年の西暦を得る(_西暦,_元号ならび,_元年の西暦ならび,_元号,_元年の西暦), 年号を得る(_西暦,_元号,_元年の西暦,_年号). 西暦から元号と元年の西暦を得る(_西暦,_元号ならび,_元年の西暦ならび,_元号,_元年の西暦) :- 元号候補とその元年の西暦を得る(_元号ならび,_元年の西暦ならび,_元号,_元年の西暦), 西暦が存在する元号の元年の西暦(_西暦,_元年の西暦ならび,_元年の西暦). 元号候補とその元年の西暦を得る(_元号ならび,_元年の西暦ならび,_元号,_元年の西暦) :- nth1(_nth1,_元号ならび,_元号), nth1(_nth1,_元年の西暦ならび,_元年の西暦). 西暦が存在する元号の元年の西暦(_西暦,_元年の西暦ならび,_元年の西暦) :- append(L1,[_元年の西暦|L2],_元年の西暦ならび), forall(member(N,L1),N < _西暦), forall(member(N,L2),N > _西暦). 年号を得る(_西暦,_元号,_元年の西暦,_年号) :- N is _西暦 - _元年の西暦 + 1, 和年表現(N,_和年), atomic_list_concat([_元号,_和年],_年号). 和年表現(N,_和年) :- '二十未満の和年表現'(N,_和年). 和年表現(N,_和年) :- '二十以上の和年表現'(N,_和年). '二十未満の和年表現'(N,_和年) :- between(1,19,N), nth0(N,['',元年,二年,三年,四年,五年,六年,七年,八年,九年,十年,十一年,十二年,十三年,十四年,十五年,十六年,十七年,十八年,十九年],_和年). '二十以上の和年表現'(N,_和年) :- N >= 20, '二十以上の十の位、一の位'(N,_十の位,_一の位), atomic_list_concat([_十の位,十,_一の位,年],_和年). '二十以上の十の位、一の位'(N,_十の位,_一の位) :- N_1 is N // 10, N_2 is N mod 10, nth0(N_1,['',一,二,三,四,五,六,七,八,九],_十の位), nth0(N_2,['',一,二,三,四,五,六,七,八,九],_一の位). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/841 # # お願いします。 # # [1] 授業単元: 課題 # [2] 問題文 # # 1. 10*10(=100)の領域に、ランダムに30個の点を配置する # 2. ランダムに2点 A, B を選ぶ # 3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ # # '1. 10*10(=100)の領域に、ランダムに30個の点を配置する 2. ランダムに2点 A, B を選ぶ 3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ' :- '1. 10*10(=100)の領域に、ランダムに30個の点を配置する'(L), '2. ランダムに2点 A, B を選ぶ'(L,_A,_B), '3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ'(L,_A,_B). '1. 10*10(=100)の領域に、ランダムに30個の点を配置する'(L) :- fidnall((_x,_y),( between(1,30,_), _x is (random(10000) + 1) / 1000, _y is (random(10000) + 1) / 1000), L). '2. ランダムに2点 A, B を選ぶ'(L,_A,_B) :- ランダムに点を選ぶ(L,_A), ランダムに点を選ぶ(L,_B), \+(_A = _B),!. '2. ランダムに2点 A, B を選ぶ'(L,_A,_B) :- '2. ランダムに2点 A, B を選ぶ'(L,_A,_B). ランダムに点を選ぶ(L,_点) :- R is random(30), nth0(R,L,_点). '3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ'(L,(_x1,_y1),(_x2,_y2)) :- 距離10以内にある点を経由し移動可能(L,(_x,_y),(_x1,_y1),(_x2,_y2)), writef('点(%t,%t)で可能です\n',[_x,_y]). '3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ'(_,_,_) :- write('可能な点はありません\n'). 距離10以内にある点を経由し移動可能(L,(_x,_y),(_x1,_y1),(_x2,_y2)) :- 経由する点候補を得る(L,(_x,_y),(_x1,_y1),(_x2,_y2)), 距離10以内にある((_x,_y),(_x1,_y1),(_x2,_y2)). 経由する点候補を得る(L,(_x,_y),(_x1,_y1),(_x2,_y2)) :- member((_x,_y),L), \+((_x,_y)=(_x1,_y1)), \+((_x,_y)=(_X2,_y2)). 距離10以内にある((_x,_y),(_x1,_y1),(_x2,_y2)) :- sqrt((_x - _x1) * (_x - _x1) + (_y - _y1) * (_y - _y1)) + sqrt((_x - _x2) * (_x - _x2) + (_y - _y2) * (_y - _y21)) =< 10.0. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/682 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 以下の手順に従ってプログラムを作成せよ。 # 適宜printfを利用して、入力支援(「文字列を入力してください」等の画面表示)を行うこと。 # 1.文字配列name[5][64]を作成 # 2.キーボードから5人分の名前を入力し、name配列に格納 # 3.キーボードから名前を入力し、name配列の何番目に格納されているかを検索して表示 # (見つからなかった場合は「見つかりません」と表示) # 4.「quit」が入力されるまで3の処理を繰り返す # '以下の手順に従ってプログラムを作成せよ。 適宜printfを利用して、入力支援(「文字列を入力してください」等の画面表示)を行うこと。 1.文字配列名前[5][64]を作成 2.キーボードから5人分の名前を入力し、名前配列に格納 3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す' :- '1.文字配列名前[5][64]を作成'(_名前配列), '2.キーボードから5人分の名前を入力し、名前配列に格納'(_名前配列), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前). '1.文字配列名前[5][64]を作成'(LL) :- length(_名前配列,5), findall(L,( member(L,_名前配列), length(L,64)), _名前配列). '2.キーボードから5人分の名前を入力し、名前配列に格納'(_名前配列) :- findall(L,( member(L,_名前配列), 名前を入力し(_名前), 名前配列に格納(_名前,L)), _名前配列). 名前を入力し(_名前) :- write('名前を入力してください : '), get_line(_名前). 名前配列に格納(_名前,L) :- atom_chars(_名前,Chars), append(Chars,R,L), all(R,' '). '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前) :- 'キーボードから名前を入力し'(_名前), '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前). 'キーボードから名前を入力し'(_名前) :- write('検索する名前を入力してください : '), get_line(_名前). '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '4.「quit」が入力されるまで3の処理を繰り返す'(_名前),!. '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '名前配列の何番目に格納されているかを検索して'(_名前,_名前配列,_nth1), writef('%t番目 %t\n',[_nth,_名前]),!, fail. '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '見つからなかった場合は「見つかりません」と表示', fail. '見つからなかった場合は「見つかりません」と表示' :- write('見つかりません\n'). '名前配列の何番目に格納されているかを検索して'(_名前,_名前配列,_nth1) :- atom_chars(_名前,Chars), nth1(_nth1,_名前配列,L), append(Chars,R,L), all(R,' '). '4.「quit」が入力されるまで3の処理を繰り返す'(quit). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/431 # # UPDATE list SET target=1 WHERE id=1 # というので更新をかけたいのですが、id=1が複数あります。 # どれでもいいのでid=1のものを1つ更新をかけたいのですがそういったことは可能でしょうか? # 最後に「LIMIT 1」とつけたら # SQLSTATE[HY000]: General error: 1 near "LIMIT": syntax errorとエラーが表示されましたので間違っているとは思うのですが # こういったことが可能であれば構文的にご指摘いただけないでしょうか。 # # 'UPDATE list SET target=1 WHERE id=1 というので更新をかけたいのですが、id=1が複数あります。 どれでもいいのでid=1のものを1つ更新をかけたい' :- テーブルの更新(list,[id],[1],true,[target],[1]). テーブルの更新(_テーブル名,_鍵属性ならび,_鍵値ならび,_条件,_置換属性ならび,_置換値ならび) :- テーブル定義から実行項と引数ならびを得る(_テーブル名,P,_引数ならび), 鍵を設定する(_テーブル名,_鍵属性ならび,_鍵値ならび,_引数ならび), 条件に適合した節を削除する(P,_条件), 引数ならびの値を置換する(_テーブル名,_置換属性ならび,_置換値ならび,_引数ならび,_置換された引数ならび), 置換された節を先頭に加える(_テーブル名,_置換された引数ならび). 条件に適合した節を削除する(P,_条件) :- retract(P), '診断: 条件に適合した節を削除する'(P,_条件). '診断: 条件に適合した節を削除する'(P,_条件) :- call(_条件),!. '診断: 条件に適合した節を削除する'(P,_条件) :- asserta(P). テーブル定義から実行項と引数ならびを得る(_テーブル名,P,_引数ならび) :- findall(_,テーブル定義(_テーブル名,_,_),_引数ならび), P =.. [_テーブル名|_引数ならび],!. 鍵を設定する(_,[],[],_引数ならび). 鍵を設定する(_テーブル名,[_鍵属性|R1],[_鍵値|R2],_引数ならび) :- テーブル定義(_テーブル名,_nth1,_鍵属性), nth1(_nth1,_引数ならび,_鍵値), 鍵を設定する(_テーブル名,R1,R2,_引数ならび). 引数ならびの値を置換する(_,[],[],_置換された引数ならび,_置換された引数ならび). 引数ならびの値を置換する(_テーブル名,[_置換属性|R1],[_置換値|R2],_引数ならび,_置換された引数ならび) :- テーブル定義(_テーブル名,_nth1,_置換属性), 要素番号によるならびの置換(_nth1,_置換値,_引数ならび,_引数ならび_2), 引数ならびの値を置換する(_テーブル名,R1,R2,_引数ならび_2,_置換された引数ならび). 要素番号によるならびの置換(_要素番号,_置換要素,_対象ならび,_置換ならび) :- length([_|L0],_要素番号), append(L0,[_|R],_対象ならび), append(L0,[_置換要素|R],_置換ならび),!. 置換された節を先頭に加える(_テーブル名,_置換された引数ならび) :- P =.. [_テーブル名|_置換された引数ならび], asserta(P). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/648 # # [1] 授業単元:Cプログラミング # [2] 問題文(含コード&リンク): # 下記のアップロードされたファイル(数字の羅列)を読み込み、並び替え方法(昇順/降順)で指定されたファイル(out.txt) # へ出力するプログラムを作成せよ # http://ime.nu/www1.axfc.net/uploader/He/so/280605 # 以下実行結果 # # 並び替え方法をしていしてください(1:昇順、2:降順) # 1 # # 並び替えたファイルへ出力しました。 # # cat out.txt ←catコマンドで中身確認 # 1 # 3 # 3 # 3 # 'アップロードされたファイル(数字の羅列)を読み込み、並び替え方法(昇順/降順)で指定されたファイル(out.txt)へ出力する'(_アップロードされたファイル名) :- 'アップロードされたファイル(数字の羅列)を読み込み'(_アップロードされたファイル名,_行ならび), '並び替え方法(昇順/降順)で指定されたファイル(out.txt)へ出力する'(_行ならび). 'アップロードされたファイル(数字の羅列)を読み込み'(_行ならび) :- get_lines('input.txt',_行ならび). '並び替え方法(昇順/降順)で指定されたファイル(out.txt)へ出力する'(_行ならび) :- '並び替え方法を指定してください(1:昇順、2:降順)'(_並び替え方法), 並び替え(_並び替え方法,_行ならび,_並び替えた行ならび), '指定されたファイル(out.txt)へ出力する'(_並び替えた行ならび). '並び替え方法を指定してください(1:昇順、2:降順)'(_並び替え方法) :- write('並び替え方法を指定してください(1:昇順、2:降順)'), 整数を得る('並び替え方法を指定してください(1:昇順、2:降順)',between(1,2,N),N), 並び替え方法(N,_並び替え方法). 並び替え方法(1,昇順). 並び替え方法(2,降順). 並び替え(昇順,_行ならび,_並び替えた行ならび) :- 整列(_行ならび,_並び替えた行ならび). 並び替え(降順,_行ならび,_並び替えた行ならび) :- 整列(_行ならび,_並び替えた昇順行ならび), reverse(_並び替えた昇順行ならび,_並び替えた行ならび). '指定されたファイル(out.txt)へ出力する'(_並び替えた行ならび) :- put_lines('out.txt',_並び替えた行ならび). put_lines(_ファイル名,_行ならび) :- open(_ファイル名,write,Outstream), forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/386 # # 二つの2×3型行列を # A=1.1 -2.2 0.9 #  -0.2  2.7 0.3 # # B= 1.8 0.5 1.3 # -0.4 0.6 -0.3 # と定義する。 # # これらの二つの行列の宣言、初期化し、C≡A+B C≡A-Bを算出して # 2×3型の表形式で出力するプログラムを作成せよ。ただし、行列CとDは固定長 # 配列とし、関数内の演算を行うこと # # 上記の問題と同じように行列A、Bを用いて、積C≡ABt を算出し、2×2型の表 # 形式で出力せよ。ただし、Bの転置行列、Btはプログラム中に直接記述するのでは # なく、Bより作成すること。また、Cはnew演算子によりメモリを確保し、関数内で # 演算を行うこと。 # # # だれかこのプログラムおしえてくださいm(_ _)m # # '行列A、Bを用いて、積C≡ABt を算出し、2×2型の表形式で出力せよ。ただし、Bの転置行列、Btはプログラム中に直接記述するのではなく、Bより作成すること。'(A,B,C) :- 転置(B,Bt), 行列の掛算_1(A,Bt,C), '2×2型の表形式で出力せよ'(C). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2) . 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 行列の掛算_1([],_,[]) :- !. 行列の掛算_1([A|R1],L,[S1|R3]) :- 行列の掛算_2(A,L,S1), 行列の掛算_1(R1,L,R3). 行列の掛算_2(_,[],[]) :- !. 行列の掛算_2(A,[B|R2],[C|R3]) :- 行列の掛算_3(A,B,C), 行列の掛算_2(A,R2,R3). 行列の掛算_3([],[],0) :- !. 行列の掛算_3([A|R1],[B|R2],S) :- 分数を含む掛算(A,B,S1), 行列の掛算_3(R1,R2,S2), 分数を含む加算(S1,S2,S),!. 分数を含む加算(A1 / A2,B1 / B2,C) :- S1 is A1 * B2 + A2 * B1, S2 is A2 * B2, 約分(S1 / S2,C),!. 分数を含む加算(A1 / A2,B,C) :- S1 is A1 + A2 * B, 約分(S1 / A2,C),!. 分数を含む加算(A,B1 / B2,C) :- S1 is B1 + B2 * A, 約分(S1 / B2,C),!. 分数を含む加算(A,B,C) :- C is A + B. 約分(B / A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(0,_,0) :- !. 約分の二(0.0,_,0) :- !. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子,_分母,_分子 / _分母). 最大公約数(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). '2×2型の表形式で出力せよ'(LL) :- 'M×Nの表形式で出力する'(2,2,LL). 'M×Nの表形式で出力する'(M,N,LL) :- 'N列カンマ区切り行表示形式'(N,_行表示形式), nth1(_nth1,LL,L), writef(_行表示形式,L), _nth1 = M. 'N列カンマ区切り行表示形式'(N,_行表示形式) :- findall('%t',between(1,N,_),PL), atomic_list_concat(PL,',',S1), atom_concat(S1,'\n',_行表示形式). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/386 # # 二つの2×3型行列を # A=1.1 -2.2 0.9 #  -0.2  2.7 0.3 # # B= 1.8 0.5 1.3 # -0.4 0.6 -0.3 # と定義する。 # # これらの二つの行列の宣言、初期化し、C≡A+B C≡A-Bを算出して # 2×3型の表形式で出力するプログラムを作成せよ。ただし、行列CとDは固定長 # 配列とし、関数内の演算を行うこと # # 上記の問題と同じように行列A、Bを用いて、積C≡ABt を算出し、2×2型の表 # 形式で出力せよ。ただし、Bの転置行列、Btはプログラム中に直接記述するのでは # なく、Bより作成すること。また、Cはnew演算子によりメモリを確保し、関数内で # 演算を行うこと。 # # # だれかこのプログラムおしえてくださいm(_ _)m # # '二つの2×3型行列を A=1.1 -2.2 0.9  -0.2  2.7 0.3 B= 1.8 0.5 1.3 -0.4 0.6 -0.3 と定義する。 これらの二つの行列の宣言、初期化し、C≡A+B C≡A-Bを算出して 2×3型の表形式で出力する' :- これらの二つの行列の宣言(A,B), 'C≡A+B C≡A-Bを算出して'(A,B,C), '2×3型の表形式で出力する'(C), '2×3型の表形式で出力する'(D). これらの二つの行列の宣言(A,B) :- A = [[1.1,-2.2,0.9],[-0.2,2.7,0.3]], B = [[1.8,0.5,1.3],[-0.4,0.6,-0.3]]. 'C≡A+B C≡A-Bを算出して'(A,B,C) :- 行列の和(A,B,C), 行列の差(A,B,D). 行列の和([],[],[]). 行列の和([L1|R1],[L2|R2],[L3|R3]) :- 行の和(L1,L2,L3), 行列の和(R1,R2,R3). 行の和([],[],[]). 行の和([A|R1],[B|R2],[C|R3]) :- 分数を含む加算(A,B,C), 行の和(R1,R2,R3). 行列の差([],[],[]). 行列の差([L1|R1],[L2|R2],[L3|R3]) :- 行の差(L1,L2,L3), 行列の差(R1,R2,R3). 行の差([],[],[]). 行の差([A|R1],[B|R2],[C|R3]) :- B_1 is B * (-1). 分数を含む加算(A,B_1,C), 行の差(R1,R2,R3). 分数を含む加算(A1 / A2,B1 / B2,C) :- S1 is A1 * B2 + A2 * B1, S2 is A2 * B2, 約分(S1 / S2,C),!. 分数を含む加算(A1 / A2,B,C) :- S1 is A1 + A2 * B, 約分(S1 / A2,C),!. 分数を含む加算(A,B1 / B2,C) :- S1 is B1 + B2 * A, 約分(S1 / B2,C),!. 分数を含む加算(A,B,C) :- C is A + B. 約分(B / A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(0,_,0) :- !. 約分の二(0.0,_,0) :- !. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子,_分母,_分子 / _分母). 最大公約数(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). '2×3型の表形式で出力する'(LL) :- 'M×Nの表形式で出力する'(2,3,LL). 'M×Nの表形式で出力する'(M,N,LL) :- 'N列カンマ区切り行表示形式'(N,_行表示形式), nth1(_nth1,LL,L), writef(_行表示形式,L), _nth1 = M. 'N列カンマ区切り行表示形式'(N,_行表示形式) :- findall('%t',between(1,N,_),PL), atomic_list_concat(PL,',',S1), atom_concat(S1,'\n',_行表示形式). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/268 # # [1] 授業単元:構造体ポインタ # [2] 問題文(含コード&amp;リンク):codepad.org/zqcRJhyk # # #include < stdio.h > # #include < string.h > // 文字列をコピーするstrcpy関数を使うため # # struct stats # { # char name[20]; // 名前 # double average; // 打率 # int HR; // ホームラン(HR)数 # }; # # void sort_mlb(int flag, ここを書く); # void disp_mlb(struct stats *data); // 構造体ポインタの示す内容を表示 # 必要ならば追加してよい # # int main() # { # int i; # struct stats mlb[5]; # 必要ならば追加してよい # # strcpy(mlb->name, "CABRERA"); // 文字列をコピーする(つまりname[]に名前を格納する) # // 文字列は数値のように代入できないため # mlb->average = 0.330; # mlb->HR = 44; # strcpy((mlb+1)->name, "HAMILTON"); # (mlb+1)->average = 0.285; # (mlb+1)->HR = 43; # strcpy((mlb+2)->name, "ENCARNACION"); # (mlb+2)->average = 0.280; # (mlb+2)->HR = 42; # strcpy((mlb+3)->name, "SUZUKI"); # (mlb+3)->average = 0.283; # (mlb+3)->HR = 9; # strcpy((mlb+4)->name, "TROUT"); # (mlb+4)->average = 0.326; # (mlb+4)->HR = 30; # # disp_mlb(mlb); # # sort_mlb(1, mlb); # disp_mlb(mlb); # # sort_mlb(2, mlb); # disp_mlb(mlb); # # sort_mlb(3, mlb); # disp_mlb(mlb); # # return 0; # } # # void sort_mlb(int flag, ここを書く) # { # ここを書く # } # # void disp_mlb(struct stats *data) // 構造体ポインタの示す内容を表示 # { # int i; # # for ( i=0 ; i < 5 ; i++ ) # printf("%d:%s\t %.3f\t %d\n", i+1, (data+i)->name, (data+i)->average, (data+i)->HR ); # printf("\n"); # } # # 関数 sort_mlb() は入力されたデータの並び替えを行う関数で, # 第1引数(flag)により以下のように並び替えを行う. #  flag = 1 の場合,名前のアルファベット順(A→Z)に並び替え #  flag = 2 の場合,打率の高い順に並び替え #  flag = 3 の場合,HR数の少ない順に並び替え # '関数 sort_mlb() は入力されたデータの並び替えを行う関数で, 第1引数(flag)により以下のように並び替えを行う.  flag = 1 の場合,名前のアルファベット順(A→Z)に並び替え  flag = 2 の場合,打率の高い順に並び替え  flag = 3 の場合,HR数の少ない順に並び替え' :- sort_mlb(_flag,LL1,LL2). sort_mlb(_flag,LL1,LL2) :- '入力されたデータの並び替えを行う関数で, 第1引数(flag)により以下のように並び替えを行う.  flag = 1 の場合,名前のアルファベット順(A→Z)に並び替え  flag = 2 の場合,打率の高い順に並び替え  flag = 3 の場合,HR数の少ない順に並び替え'(_flag,L1,L2). '入力されたデータの並び替えを行う関数で, 第1引数(flag)により以下のように並び替えを行う.  flag = 1 の場合,名前のアルファベット順(A→Z)に並び替え  flag = 2 の場合,打率の高い順に並び替え  flag = 3 の場合,HR数の少ない順に並び替え'(_flag,LL1,LL2) :- 'flag = 1 の場合,名前のアルファベット順(A→Z)に並び替え'(_flag,LL1,LL2). '入力されたデータの並び替えを行う関数で, 第1引数(flag)により以下のように並び替えを行う.  flag = 1 の場合,名前のアルファベット順(A→Z)に並び替え  flag = 2 の場合,打率の高い順に並び替え  flag = 3 の場合,HR数の少ない順に並び替え'(_flag,LL1,LL2) :- 'flag = 2 の場合,打率の高い順に並び替え'(_flag,LL1,LL2). '入力されたデータの並び替えを行う関数で, 第1引数(flag)により以下のように並び替えを行う.  flag = 1 の場合,名前のアルファベット順(A→Z)に並び替え  flag = 2 の場合,打率の高い順に並び替え  flag = 3 の場合,HR数の少ない順に並び替え'(_flag,LL1,LL2) :- 'flag = 3 の場合,HR数の少ない順に並び替え'(_flag,LL1,LL2). 'flag = 1 の場合,名前のアルファベット順(A→Z)に並び替え'(1,LL1,LL2) :- findall([_名前,_nth1],( nth1(_nth1,LL1,[_名前,_,_])), LL3), 整列する(LL3,LL4), findall(L,( member([_,_nth1_2],LL4), nth1(_nth1_2,LL1,L)), LL2). 'flag = 2 の場合,打率の高い順に並び替え'(2,LL1,LL2) :- findall([_打率,_nth1],( nth1(_nth1,LL1,[_,_打率,_])), LL3), 整列する(LL3,LL4), reverse(LL4,LL5), findall(L,( member([_,_nth1_2],LL5), nth1(_nth1_2,LL1,L)), LL2). flag = 3 の場合,HR数の少ない順に並び替え'(3,LL1,LL2) :- findall([_ホームラン数,_nth1],( nth1(_nth1,LL1,[_,_,_ホームラン数])), LL3), 整列する(LL3,LL4), findall(L,( member([_,_nth1_2],LL4), nth1(_nth1_2,LL1,L)), LL2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/150 # # [1] c言語 # [2] # (1) # キーボードから二つの文字列を配列x[256],y[256] に入力する.配列xに含まれる文字列の # 後ろに配列yに含まれる文字列をつなげたものを配列z[256] に代入し,画面表示するプログ # ラムを作成せよ.例えば二つの文字列が「sch」,「ool」の場合,配列z に「school」が代入され, # 画面表示される.なお,NULL文字「\0」の扱いに注意し,配列z の文字列の後ろにNULL文 # 字を入れておくこと # # (2)以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入 # 力して下さい」などの画面表示)を行うこと. # 文字配列name[5][64] を作成する. # キーボードから5 人分の名前を入力し,name 配列に格納する. # キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示 # する.ただし,見つからなかった場合には,「見つかりません」と表示する. # 「quit」が入力されるまでの処理を繰り返す. # # '以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入力して下さい」などの画面表示)を行うこと. 1) 文字配列name[5][64] を作成する. 2) キーボードから5 人分の名前を入力し,name 配列に格納する. 3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する. 4) 「quit」が入力されるまで3)の処理を繰り返す.' :- '1) 文字配列name[5][64] を作成する.'(_name), '2) キーボードから5 人分の名前を入力し,name 配列に格納する.'(_name), '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,_名前), '4) 「quit」が入力されるまで3)の処理を繰り返す.'(_名前). '1) 文字配列name[5][64] を作成する.'(_name) :- length(_name,5), findall(L,( member(L,LL), length(L,64)), _name). '2) キーボードから5 人分の名前を入力し,name 配列に格納する.'(_name) :- findall(L,( member(L,_name), '名前を入力し,name 配列に格納する'(L)), _name). '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,名前) :- キーボードから名前を入力し(_名前), 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(_名前,_name). '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,_名前) :- '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,_名前). 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(quit,_) :- !. 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(_名前,_name) :- 'name 配列の何番目に格納されているかを検索して'(_名前,_name), 表示する(_名前,_何番目),!. 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(_,_) :- writef('見つかりません\n'), fail. 'name 配列の何番目に格納されているかを検索して'(_名前,_name) :- atom_chars(_名前,Chars), nth1(_何番目,_name,L), append(Chars,_,L). 表示する(_名前,_何番目) :- writef('%tは%t番目にあります。\n',[_名前,_何番目]),!. '4) 「quit」が入力されるまで3)の処理を繰り返す.'(quit). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/138 # # [1] 授業単元: ファイル読み取り コサイン類似度 # [2] 問題文(含コード&amp;リンク):http://ime.nu/codepad.org/pX1MdXpC #   問題中のsample.txtの例 http://ime.nu/www1.axfc.net/uploader/so/2707638.txt #   問題中のtest.txtの例 http://ime.nu/www1.axfc.net/uploader/so/2707641.txt # # /* # 二つのtxtファイルがある # sample.txtはファイル名と500個の数値の文字列が一行書かれている。 # txtファイルを例として上げる # 例: # # test.txtはsample.txtと同じようなファイル名と500個の数値の文字列を一行とした文字列が # 不特定多数並んでいる。txtファイルを例として上げる。 # 例: # # この2つのtxtファイルを使って次の動作をするプログラムを作れ # # ?sample.txtに書かれている数値を読み取って、配列a[n]に格納する。 # nは数値の番号で0からはじめる。 # # ?test.txtを読み取って、一行ごとに数値を配列b[i][j]に格納する #  iには行数、jには数値の番号を入れる。番号は0からはじめる。 #  余裕があれば、ファイル名を別の配列に格納する # # ?それぞれ格納された配列の数値をつかって繰り返し文を使い # # c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数*sqrt(b[i][j]*b[i][j])をすべて足した数} # # の計算を行う。 # 考え方は下の用になる # # c[0]=(a[0]*b[0][0]+a[1]*b[0][1]+a[2]*b[0][2]+...+a[n]*b[0][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[0][0]*b[0][0]+b[0][1]*b[0][1]+b[0][2]*b[0][2]+...+b[0][j]*b[1][j])); # # c[1]=(a[0]*b[1][0]+a[1]*b[1][1]+a[2]*b[1][2]+...+a[n]*b[1][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[1][0]*b[1][0]+b[1][1]*b[1][1]+b[1][2]*b[1][2]+...+b[1][j]*b[1][j])); # # c[2]=(a[0]*b[2][0]+a[1]*b[2][1]+a[2]*b[2][2]+...+a[n]*b[2][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[2][0]*b[2][0]+b[2][1]*b[2][1]+b[2][2]*b[2][2]+...+b[2][j]*b[2][j])); # # ・ # ・ # ・ # # c[i]=(a[0]*b[i][0]+a[1]*b[i][1]+a[2]*b[i][2]+...+a[n]*b[i][j]) # / (sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+...+a[n]*a[n])*sqrt(b[i][0]*b[i][0]+b[i][1]*b[i][1]+b[i][2]*b[i][2]+...+b[i][j]*b[i][j])); # # # ?画面にc[i]をすべて表示させる。余裕があれば同時に?で格納したファイル名も出力する # # # /* # '二つのtxtファイルがある sample.txtはファイル名と500個の数値の文字列が一行書かれている。 txtファイルを例として上げる 例: test.txtはsample.txtと同じようなファイル名と500個の数値の文字列を一行とした文字列が 不特定多数並んでいる。txtファイルを例として上げる。 例: この2つのtxtファイルを使って次の動作をするプログラムを作れ 1)sample.txtに書かれている数値を読み取って、配列a[n]に格納する。 nは数値の番号で0からはじめる。 2)test.txtを読み取って、一行ごとに数値を配列b[i][j]に格納する  iには行数、jには数値の番号を入れる。番号は0からはじめる。  余裕があれば、ファイル名を別の配列に格納する 3)それぞれ格納された配列の数値をつかって繰り返し文を使い c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数*sqrt(b[i][j]*b[i][j])をすべて足した数} の計算を行う。'(_c) :- 'sample.txtに書かれている数値を読み取って、_aに格納する'(_a), 'test.txtを読み取って、配列bに格納する'(_b), 'c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数の計算を行う'(_a,_b,_c). 'sample.txtに書かれている数値を読み取って、_aに格納する。'(_a) :- get_numbers('sample.txt',_a). 'test.txtを読み取って、配列bに格納する'(_b) :- 'test.txtを読み取って'(Lines), 配列bに格納する(Lines,_b). 'test.txtを読み取って'(Lines) :- get_lines('test.txt',Lines). 配列bに格納する(Lines,_b) :- findall(L,( member(A,Lines), atom_codes(A,L)), _b). 'c[i]=a[n]*b[i][j]をすべて足した数/{sqrt(a[n]*a[n])をすべて足した数の計算を行う'(_a,_b,_c) :- 'sqrt(a[n]*a[n])をすべて足した数'(_a,V), findsum(X,( 'a[n]*b[i][j]をすべて足した数'(_a,_b,W), X is W / (V * sqrt(S_1))), _c). 'sqrt(a[n]*a[n])をすべて足した数'(_a,X) :- findsum(U,( member(A,_a), U is A * A), S_0), X is sqrt(S_1). 'a[n]*b[i][j]をすべて足した数'(_a,_bW) :- member(L,_b), findsum(Y,( nth0(_nth0_1,L,N), nth0(_nth0_1,_a,M), Y is M * N), W). get_numbers(File,Numbers) :- get_lines(File,Lines), findall(Number,( member(Line,Lines), atom_to_number(Line,Number)), Numbers). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/125 # # [1] 授業単元:c言語 関数&配列 # [2] 問題文 関数配列の問題です。 # http://www.dotup.org/uploda/www.dotup.org3703015.pdf # ベクトルの内積(_ベクトル_1,_ベクトル_2,_ベクトルの内積) :- findsum(X,( nth1(_nth1,_ベクトル_1,[X_1]), nth1(_nth1,_ベクトル_2,[X_2]), X is X_1 * X_2), _ベクトルの内積). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値). sum([],0). sum([A|R],S) :- sum(R,S1), S is A + S1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/119 # # [1]C言語 # [2]http://ime.nu/www.dotup.org/uploda/www.dotup.org3700396.jpg # 探索木についての課題です # 問題1. データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。 # # 問題2. 前問をプログラムとして、表示しなさい。表示する関数は再帰的に書きなさい。 # 左の子(部分木) を print,node を print, 右の子 (部分木) を print のように表示することをDFS 中間順と言います。 # # 問題3. 標準入力から文字を入力させ、その文字によって2分探索木に対して以下の動作をするプログラムを作成せよ。 # s ---> 数を1つ標準入力から入力されてデータが存在するか表示 # i ---> 数を1つ標準入力から入力させて2分探索木に追加 # p ---> 今まで入力された数をすべて表示 (DFS中間順で) # q ---> quit # # 問題4. 0から9999の整数の乱数を10000個生成して、2分探索木を作り、データの # 総数、木の深さの最大値、データの最小値と最大値を求めるプログラムを作成し # て確認せよ。 # # [3]ubuntu # gcc # c言語 # [4]期限:木曜日6:00 # 宜しくお願いします。 # 二分探索木ラベルの生成(_値ならび) :- nth1(_nth1,_値ならび,_値), atomic_list_concat(['L','_',_nth1],_ラベル), assertz(二分探索木ラベル(_ラベル,_値)), fail. 二分探索木ラベルの生成(_). 根を作る(_値,_ラベル) :- 二分探索木ラベル(_ラベル,_値), asserta(根(_ラベル,[],[])). 枝を作る(_値,_ラベル) :- 二分探索木ラベル(_ラベル,_値), asserta(枝(_ラベル,[],[])). 枝に追加(_根のラベル,_値) :- 二分探索木ラベル(_根のラベル,_根の値), 二分探索木ラベル(_値のラベル,_値), 枝に追加(_根のラベル,_値のラベル,_根の値,_値). 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, retract(枝(_根のラベル,[],_右枝)), 枝を作る(_値), asserta(根(_根のラベル,_値のラベル,_右枝)),!. 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, 枝(_根,_左枝,_右枝), 枝に追加(_左枝,_値). 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, retract(枝(_根,_左枝,[])), 枝を作る(_値), asserta(根(_根のラベル,_左枝,_値のラベル)),!. 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, 枝(_根のラベル,_左枝,_右枝), 枝に追加(_右枝,_値). 'データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。' :- 二分探索木ラベルの生成([6,4,3,8,5,9,7]), 根を作る(6,_根のラベル), append(_,[N|R],[4,3,8,5,9,7]), 枝に追加(_根のラベル,N), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/313 # # SET型について質問です。 # # 'りんご', 'みかん', 'ばなな', 'めろん' # # のようなfruitという名のフィールドがあった時、 # 'りんご' と 'ばなな' 両方が含まれているデータを取得したいのですが、どのようにしたら良いでしょうか? # # WHERE `fruit` & 5 # # このようにしたら、 'りんご' または 'ばなな' のいずれかを持つデータが取得されてしまいます。 # # # MySQL5を使用しています。 # どなたかご教授お願いしますm(_ _)m # # 'りんご, みかん, ばなな, めろん のようなfruitという名のフィールドがあった時、 りんご と ばなな 両方が含まれているデータを取得したいのですが、どのようにしたら良いでしょうか?'(_fruit) :- テーブル検索の副目標を得る(テーブル1,[fruit],_テーブル定義,_副目標,_値ならび,[_fruit]), _副目標, 'fruitという名のフィールドがあった時、りんご と ばなな 両方が含まれているデータを取得したい'(_fruit). テーブル検索の副目標を得る(_テーブル名,_鍵名ならび,_テーブル定義,_副目標,_値ならび,_鍵の変数ならび) :- テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび). 副目標に鍵を設定する(_テーブル定義,_鍵名ならび,_値ならび,_鍵の変数ならび),!. テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび) :- findall([_位置,_属性名],( テーブル定義(_テーブル名,_位置,_属性名)), _テーブル定義), length(_テーブル定義,Len), length(_値ならび,Len), _副目標 =.. [_テーブル名|_値ならび]. 副目標に鍵を設定する(_,[],_,[]). 副目標に鍵を設定する(_テーブル定義,[_鍵名|R2],_値ならび,[_鍵の変数|R4]) :- member([_鍵の位置,_鍵名],_テーブル定義), nth1(_鍵の位置,_値ならび,_鍵の変数), 副目標に鍵を設定する(_テーブル定義,R2,_値ならび,R4). 'fruitという名のフィールドがあった時、りんご と ばなな 両方が含まれているデータを取得したい'(_fruit) :- sub_atom(_fruit,_,_,_,りんご), sub_atom(_fruit,_,_,_,ばなな). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/318 # # MySQL5.1 # # table1 # id,hoge1,hoge2 # # idが2,4,6の中で、hoge1が1,3,5のidを取得したい。 # # SELECT `id` FROM `table1` WHERE (`id` IN (2,4,6)) AND (`hoge1` IN (1,3,5)); # # このsqlでidが2,4,6の3件からの検索なりますか? # もっといいsqlありますか? # # 'table1 id,hoge1,hoge2 idが2,4,6の中で、hoge1が1,3,5のidを取得したい。'(_id) :- テーブル検索の副目標を得る(table1,[id,hoge1],_,_副目標,_,[_id,_hoge1]), member(_id,[2,4,6]), member(_hoge1,[1,3,5]), _副目標. テーブル検索の副目標を得る(_テーブル名,_鍵名ならび,_テーブル定義,_副目標,_値ならび,_鍵の変数ならび) :- テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび). 副目標に鍵を設定する(_テーブル定義,_鍵名ならび,_値ならび,_鍵の変数ならび),!. テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび) :- findall([_位置,_属性名],( テーブル定義(_テーブル名,_位置,_属性名)), _テーブル定義), length(_テーブル定義,Len), length(_値ならび,Len), _副目標 =.. [_テーブル名|_値ならび]. 副目標に鍵を設定する(_,[],_,[]). 副目標に鍵を設定する(_テーブル定義,[_鍵名|R2],_値ならび,[_鍵の変数|R4]) :- member([_鍵の位置,_鍵名],_テーブル定義), nth1(_鍵の位置,_値ならび,_鍵の変数), 副目標に鍵を設定する(_テーブル定義,R2,_値ならび,R4). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/84 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # コマンド選択で,0) 終了,1) 追加,2) 検索(id),3) リスト表示,4) 変更 5) 削除 6) 特殊機能 が行える商品在庫管理プログラムを作成する。 # データは,商品の番号 商品名 数 単価 の形式で商品のデータを持っているファイルとする. # 上の機能ルーチンは,全て関数として作成すること. # ただし,追加と検索は実装済みである. # # 'コマンド選択で,0) 終了,1) 追加,2) 検索(id),3) リスト表示,4) 変更 5) 削除 6) 特殊機能 が行える商品在庫管理プログラムを作成する。データは,商品の番号 商品名 数 単価 の形式で商品のデータを持っているファイルとする.' :- reconsult('在庫管理.pro'), コマンド選択で(_コマンド), '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(_コマンド), '在庫管理.proの保存'. コマンド選択で(_コマンド) :- 整数を得る('0) 終了,1) 追加,2) 検索(id),3) リスト表示,4) 変更 5) 削除 6) 特殊機能を整数で',member(_整数,between(0,6,_整数),_整数), nth0(_整数,[終了,追加,'検索(id)',リスト表示,変更,削除,特殊機能],_コマンド). '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(終了) :- !. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(追加) :- 在庫追加. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(検索) :- 在庫検索. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(リスト表示) :- リスト表示. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(変更) :- 在庫変更. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(削除) :- 在庫削除. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(特殊機能) :- 特殊機能. 在庫追加 :- 商品名を得る(_商品名), 数量を得る(_数量), 在庫追加(_商品名,_数量). 在庫追加(_商品名,_数量). retract(在庫(_商品名,_現在の数量)), _更新された数量 is _現在の数量 + _数量, asserta(在庫(_商品名,_更新された数量)),!. 在庫追加(追加,_商品名,_数量) :- asserta(在庫(_商品名,_数量)),!. '在庫検索(id)' :- 商品名を得る(_商品名), 在庫(_商品名,_数量), writef('現在の在庫数量は %t です\n',[_数量]),!. '在庫検索(id)' :- write('現在の在庫はありません\n'). リスト表示 :- 在庫(_商品名,_数量), writef('%t,%t\n',[_商品名,_数量]), fail. リスト表示. 在庫変更 :- 整数を得る('1..商品名 2..数量 どちらを変更するか',between(1,2,_整数),_整数), 在庫変更(_整数). 在庫変更(1) :- 現在の商品名を得る(_現在の商品名), 正しい商品名を得る(_正しい商品名), 在庫変更(_現在の商品名,_正しい商品名),!. 在庫変更(1) :- 在庫変更(1). 在庫変更(2) :- 商品名を得る(_商品名), '診断:: 商品名'(_商品名), 数量を得る(_数量), retract(在庫(_商品名,_)), asserta(在庫(_商品名,_数量)),!. 現在の商品名を得る(_現在の商品名) :- write('現在の商品名を入力してください : '), get_line(_現在の商品名), '診断:: 現在の商品名'(_現在の商品名),!. '診断:: 現在の商品名'(_現在の商品名) :- 在庫(_現在の商品名,_),!. '診断:: 現在の商品名'(_商品名) :- writef('入力された商品名の在庫はありません\n',[_商品名]), fail. 正しい商品名を得る(_正しい商品名) :- write('正しい商品名を入力してください : '), get_line(_正しい商品名),!. '診断:: 商品名'(_商品名) :- 在庫(_商品名,_),!. '診断:: 商品名'(_商品名) :- writef('指定された商品名の %t の在庫登録はありません\n',[_商品名]), fail. 在庫変更(_現在の商品名,_正しい商品名) :- retract(在庫(_現在の商品名,_数量)), asserta(在庫(_正しいの商品名,_数量)),!. 在庫削除 :- 商品名を得る(_商品名), retract(在庫(_商品名,_)). 特殊機能. 数量を得る(_数量) :- 数を得る(数量,true,_数量). '在庫管理.proの保存' :- tell('在庫管理.pro'), listing(在庫), told. % 以下のサイトは # # ならびの中央値 # 中央値(L,_中央値) :- 整列(L,L1), length(L,_要素数), Div_2 is _要素数 // 2, Mod_2 is _要素数 mod 2, 中央値(L1,Div_2,Mod_2,_中央値). 中央値(L,Div_2,1,_中央値) :- nth0(Div_2,L,_中央値). 中央値(L,Div_2,0,_中央値) :- nth1(Div_2,L,_値_1), nth0(Div_2,L,_値_2), _中央値 is (_値_1 + _値_2) / 2. 整列([],[]). 整列([_軸要素|R],L2) :- 分割(_軸要素,R,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび), 整列(_軸要素に等しいか小さい要素ならび,_整列した軸要素に等しいか小さい要素ならび), 整列(_軸要素より大きい要素ならび,_整列した軸要素より大きい要素ならび), append(_整列した軸要素に等しいか小さい要素ならび,[_軸要素|_整列した軸要素より大きい要素ならび],L2). 分割(_,[],[],[]). 分割(_軸要素,[_値|R1],[_値|R2],R3) :- _値 @=< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[_値|R1],R2,[_値|R3]) :- _値 @> _軸要素, 分割(_軸要素,R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/7 # # [1] 授業単元:問題1:二次元配列 問題2:関数 # [2] 問題文(含コード&リンク): # 問題1:ファイルから入力した英小文字a-zの頻度のヒストグラムを # 出力するプログラムを書いてください。入力ファイルはプログラムファイルを使えば良い。 # # 問題2:1文字を引数としてそれが小文字であれば大文字にして返し # そうでなければそのまま文字を返す関数を作成しキーボードから # 文字入力としてこの関数の動作を確認せよ。 # [3.1] OS: windows vista #  [3.2] コンパイラ名とバージョン:visual studio2010 #  [3.3] 言語: C言語 # [4] 期限: 11月30日 # [5]ポインタはやってません。宜しくお願いします 。 # # '1文字を引数としてそれが小文字であれば大文字にして返し そうでなければそのまま文字を返す関数を作成しキーボードから 文字入力としてこの関数の動作を確認せよ。' 'キーボードから文字入力としてこの関数の動作を確認せよ'. 'キーボードから文字入力としてこの関数の動作を確認せよ' :- get_char(_文字), '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返された文字_1), to_upper(_文字,_返された文字_2), writef('キーボードから入力した文字 "%t",返された文字 "%t"\n',[_返された文字_1,_返された文字_2]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- to_upper(_文字,_返す文字). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字). それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字) :- それが小文字であれば(_文字), 大文字にして返し(_文字,_返す文字). それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字) :- そうでなければ(_文字), _返す文字 = _文字. それが小文字であれば(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 大文字にして返し(_文字,_返す文字) :- nth1(Nth,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_文字), nth1(Nth,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_返す文字). そうでなければ(_文字) :- \+(_文字 @>= 'a'),!. そうでなければ(_文字) :- \+(_文字 @=< 'z'),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% それが小文字であれば(_文字) :- char_code(_文字,_文字コード), between(97,122,_文字コード). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% それが小文字であれば(_文字) :- char_code(_文字,_文字コード), _文字コード >= 97, _文字コード =< 122. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 大文字にして返し(_文字,_返す文字) :- 小文字大文字(_文字,_大文字). 小文字大文字(a,'A'). 小文字大文字(b,'B'). 小文字大文字(c,'C'). 小文字大文字(d,'D'). 小文字大文字(e,'E'). 小文字大文字(f,'F'). 小文字大文字(g,'G'). 小文字大文字(h,'H'). 小文字大文字(i,'I'). 小文字大文字(j,'J'). 小文字大文字(k,'K'). 小文字大文字(l,'L'). 小文字大文字(m,'M'). 小文字大文字(n,'N'). 小文字大文字(o,'O'). 小文字大文字(p,'P'). 小文字大文字(q,'Q'). 小文字大文字(r,'R'). 小文字大文字(s,'S'). 小文字大文字(t,'T'). 小文字大文字(u,'U'). 小文字大文字(v,'V'). 小文字大文字(w,'W'). 小文字大文字(x,'X'). 小文字大文字(y,'Y'). 小文字大文字(z,'Z'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 大文字にして返し(_文字,_返す文字) :- char_code(_文字,_文字コード), _大文字の文字コード is _文字コード - 32, char_code(_返す文字,_大文字の文字コード),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- 小文字大文字(_文字,_返す文字). 小文字大文字(a,'A') :- !. 小文字大文字(b,'B') :- !. 小文字大文字(c,'C') :- !. 小文字大文字(d,'D') :- !. 小文字大文字(e,'E') :- !. 小文字大文字(f,'F') :- !. 小文字大文字(g,'G') :- !. 小文字大文字(h,'H') :- !. 小文字大文字(i,'I') :- !. 小文字大文字(j,'J') :- !. 小文字大文字(k,'K') :- !. 小文字大文字(l,'L') :- !. 小文字大文字(m,'M') :- !. 小文字大文字(n,'N') :- !. 小文字大文字(o,'O') :- !. 小文字大文字(p,'P') :- !. 小文字大文字(q,'Q') :- !. 小文字大文字(r,'R') :- !. 小文字大文字(s,'S') :- !. 小文字大文字(t,'T') :- !. 小文字大文字(u,'U') :- !. 小文字大文字(v,'V') :- !. 小文字大文字(w,'W') :- !. 小文字大文字(x,'X') :- !. 小文字大文字(y,'Y') :- !. 小文字大文字(z,'Z') :- !. 小文字大文字(_文字,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/7 # # [1] 授業単元:問題1:二次元配列 問題2:関数 # [2] 問題文(含コード&リンク): # 問題1:ファイルから入力した英小文字a-zの頻度のヒストグラムを # 出力するプログラムを書いてください。入力ファイルはプログラムファイルを使えば良い。 # # 問題2:1文字を引数としてそれが小文字であれば大文字にして返し # そうでなければそのまま文字を返す関数を作成しキーボードから # 文字入力としてこの関数の動作を確認せよ。 # [3.1] OS: windows vista #  [3.2] コンパイラ名とバージョン:visual studio2010 #  [3.3] 言語: C言語 # [4] 期限: 11月30日 # [5]ポインタはやってません。宜しくお願いします 。 # # 'ファイルから入力した英小文字a-zの頻度のヒストグラムを出力するプログラムを書いてください。入力ファイルはプログラムファイルを使えば良い。' :- get_chars('c161_7.html',Chars), '英小文字a-zの頻度の'(Chars,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]), ヒストグラムを出力する([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]). '英小文字a-zの頻度の'([],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]). '英小文字a-zの頻度の'([_文字|_残りならび],L1,L) :- 英小文字ならば頻度を更新(_文字,L1,L2), '英小文字a-zの頻度の'(_残りならび,L2,L),!. '英小文字a-zの頻度の'([_|_残りならび],L1,L) :- '英小文字a-zの頻度の'(_残りならび,L1,L). 英小文字ならば頻度を更新(_文字,L1,L2) :- nth0(Nth0,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_文字), length(L0,Nth0), append(L0,[S|R],L1), S2 is S + 1, append(L0,[S2|R],L2). ヒストグラムを出力する(L) :- ヒストグラムの用意(L,LL1), 転置(LL1,LL2), 出力する(LL2). ヒストグラムの用意(L,LL1) :- 最大値(L,_最大値), length(L1,_最大値), findall(L1,( 星のリストに変換(L,L1)), LL1). 星のリストに変換(L,L1) :- member(N,L), length(R,N), append(L0,R,L1), all(L0,' '), all(R,*). 出力する([]). 出力する([L|R]) :- atomic_list_concat(L,S), writef('%t\n',[S]), 出力する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/7 # # [1] 授業単元:問題1:二次元配列 問題2:関数 # [2] 問題文(含コード&リンク): # 問題1:ファイルから入力した英小文字a-zの頻度のヒストグラムを # 出力するプログラムを書いてください。入力ファイルはプログラムファイルを使えば良い。 # # 問題2:1文字を引数としてそれが小文字であれば大文字にして返し # そうでなければそのまま文字を返す関数を作成しキーボードから # 文字入力としてこの関数の動作を確認せよ。 # [3.1] OS: windows vista #  [3.2] コンパイラ名とバージョン:visual studio2010 #  [3.3] 言語: C言語 # [4] 期限: 11月30日 # [5]ポインタはやってません。宜しくお願いします 。 # # '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- to_upper(_文字,_返す文字). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字). それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字) :- それが小文字であれば(_文字), 大文字にして返し(_文字,_返す文字). それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字) :- そうでなければ(_文字), _返す文字 = _文字. それが小文字であれば(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 大文字にして返し(_文字,_返す文字) :- nth1(Nth,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_文字), nth1(Nth,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_返す文字). そうでなければ(_文字) :- \+(_文字 @>= 'a'),!. そうでなければ(_文字) :- \+(_文字 @=< 'z'),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% それが小文字であれば(_文字) :- char_code(_文字,_文字コード), between(97,122,_文字コード). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% それが小文字であれば(_文字) :- char_code(_文字,_文字コード), _文字コード >= 97, _文字コード =< 122. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 大文字にして返し(_文字,_返す文字) :- 小文字大文字(_文字,_大文字). 小文字大文字(a,'A'). 小文字大文字(b,'B'). 小文字大文字(c,'C'). 小文字大文字(d,'D'). 小文字大文字(e,'E'). 小文字大文字(f,'F'). 小文字大文字(g,'G'). 小文字大文字(h,'H'). 小文字大文字(i,'I'). 小文字大文字(j,'J'). 小文字大文字(k,'K'). 小文字大文字(l,'L'). 小文字大文字(m,'M'). 小文字大文字(n,'N'). 小文字大文字(o,'O'). 小文字大文字(p,'P'). 小文字大文字(q,'Q'). 小文字大文字(r,'R'). 小文字大文字(s,'S'). 小文字大文字(t,'T'). 小文字大文字(u,'U'). 小文字大文字(v,'V'). 小文字大文字(w,'W'). 小文字大文字(x,'X'). 小文字大文字(y,'Y'). 小文字大文字(z,'Z'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 大文字にして返し(_文字,_返す文字) :- char_code(_文字,_文字コード), _大文字の文字コード is _文字コード - 32, char_code(_返す文字,_大文字の文字コード),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- 小文字大文字(_文字,_返す文字). 小文字大文字(a,'A') :- !. 小文字大文字(b,'B') :- !. 小文字大文字(c,'C') :- !. 小文字大文字(d,'D') :- !. 小文字大文字(e,'E') :- !. 小文字大文字(f,'F') :- !. 小文字大文字(g,'G') :- !. 小文字大文字(h,'H') :- !. 小文字大文字(i,'I') :- !. 小文字大文字(j,'J') :- !. 小文字大文字(k,'K') :- !. 小文字大文字(l,'L') :- !. 小文字大文字(m,'M') :- !. 小文字大文字(n,'N') :- !. 小文字大文字(o,'O') :- !. 小文字大文字(p,'P') :- !. 小文字大文字(q,'Q') :- !. 小文字大文字(r,'R') :- !. 小文字大文字(s,'S') :- !. 小文字大文字(t,'T') :- !. 小文字大文字(u,'U') :- !. 小文字大文字(v,'V') :- !. 小文字大文字(w,'W') :- !. 小文字大文字(x,'X') :- !. 小文字大文字(y,'Y') :- !. 小文字大文字(z,'Z') :- !. 小文字大文字(_文字,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/271 # # Oracle11gR2で # # ID  Count # 1 3 # 2 2 # 3 3 # # こういうデータを元に # # Seq ID # 1 1 # 2 1 # 3 1 # 4 2 # 5 2 # 6 3 # 7 3 # 8 3 # # こんな感じのCount(*)の逆を作りたいけど、PL/SQL使わずに作るには、どうしたらいい? # Seqはなくてもいい # 'ID  Count 1 3 2 2 3 3 こういうデータを元に Seq ID 1 1 2 1 3 1 4 2 5 2 6 3 7 3 8 3 こんな感じのCount(*)の逆を作りたいけど、PL/SQL使わずに作るには、どうしたらいい?'(_テーブル名,_Seq,_ID) :- 実行項の生成(_テーブル名,_ID,_実行項), 'IDごとのカウントを取る'(_ID,_実行項,_ID_頻度ならび), sort(_ID_頻度ならび,_整列した_ID_頻度ならび), 'Seq組を生成'(1,_整列した_ID_頻度ならび,_Seq,_ID). 実行項の生成(_テーブル名,_ID,_実行項) :- findmax(Nth1,テーブル定義(_テーブル名,Nth1,_),_組の要素数), length(L,_組の要素数), _実行項 =.. [_テーブル名|L], テーブル定義(_テーブル名,_IDの位置,'ID'), nth1(_IDの位置,L,_ID). 'IDごとのカウントを取る'(_ID,_実行項,_ID_頻度ならび) :- setof(_ID,[_ID,_実行項] ^_実行項,_IDならび), findall([_ID,_頻度],( member(_ID,_IDならび), count(_実行項,_頻度ならび)),_ID_頻度ならび). 'Seq組を生成'(N_1,[[_ID,_頻度]|R],_Seq,_ID) :- N_2 is N_1 + _頻度 - 1, between(N_1,N_2,_Seq). 'Seq組を生成'(N_1,[[_ID,_頻度]|R],_Seq,_ID) :- N_2 is N_1 + _頻度, 'Seq組を生成'(N_2,R,_Seq,_ID). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/722 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文 行列ベクトル積 # http://ime.nu/ideone.com/21ECGq # 行列ベクトル積(_行列,_ベクトル,_行列ベクトル積) :- findall([S],( append(_,[L|_],_行列), findsum(U,( nth1(Nth1,L,A), nth1(Nth1,_ベクトル,[B]), U is A * B), S)), _行列ベクトル積). findsum(T,P,Sum) :- findall(T,P,L), sum_list(L,Sum). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/628 # # [1] c言語 # [2] 問題文:C言語でのポインタを使った行列の操作です。 # 1 2 3 0 # 0 0 0 1 # 2 0 0 2 # 0 0 0 1 # をファイルから読み込み,以下の操作を実行せよ。 # 1,非零の要素を左から右へ、上から下へ書きならべた配列を作り、 # [1 2 3 1 2 2 1]とする。 # 2,各要素が何行目・何列目にあるかを別の配列に格納し、 # A = [1 2 3 1 2 2 1] 非零要素リスト # IA = [1 1 1 2 3 3 4] i行 # JA = [1 2 3 4 1 4 4] j列 # の配列が出力されるようにせよ。 # 3,何番目の要素からiが始まるかを書きならべる。 # IAの中で、1が初めに出現するのは1番目、2が初めに出現するのは4番目、3が初めに出現するのは5番目、4が初めに出現するのは7番目なので、 # IA' = [1 4 5 7] の配列が出力されるようにせよ # # '非零の要素を左から右へ、上から下へ書きならべた配列を作り'(_行列,_非零要素ならび) :- flatten(_行列,_要素ならび), findall(_非零要素,( member(_非零要素,_行列), \+(_非零要素 = 0)), _非零要素ならび). '各要素が何行目・何列目にあるかを別の配列に格納し'(_行列,_非零要素ならび,_非零要素の元々の行位置ならび,_非零要素の元々の列位置ならび) :- findall([_非零要素,_非零要素の元々の行位置,_非零要素の元々の列位置],( nth1(_非零要素の元々の行位置,_行列,_行), nth1(_非零要素の元々の列位置,_行,_非零要素), \+(_非零要素 = 0)), LL), 三つのならびに分解(LL,_非零要素ならび,_非零要素の元々の行位置ならび,_非零要素の元々の列位置ならび). 三つのならびに分解([],[],[],[]). 三つのならびに分解([[A,B,C]|R1],[A|R2],[B|R3],[C|R4]) :- 三つのならびに分解(R1,R2,R3,R4). '何番目の要素からiが始まるかを書きならべる。IAの中で、1が初めに出現するのは1番目、2が初めに出現するのは4番目、3が初めに出現するのは5番目、4が初めに出現するのは7番目なので、IA = [1 4 5 7] の配列が出力されるようにせよ'(_非零要素の元々の行位置ならび,_何番目の非零要素から元々の行列での行が変わったかを示すならび) :- findall(_何番目,( append(L0,[I|R],_非零要素の元々の行位置ならび), \+(member(I,L0), length([_|L0],_何番目)), _何番目の非零要素から元々の行列での行が変わったかを示すならび). % 以下のサイトは # # @kamizen1 @sym_num 最初の述語は多分こんな感じ。 http://nojiriko.asia/prolog/twitter_by_kamizen1_20121109.html … 実行して確かめてはいないけれど。 # % ?- hir_zen( 'う゛おう゛う゛お---;;;;,,,,...', P ). の様に使う。ひらがな -> 全角カタカナ (ひらがな ではない文字は、素通りします。) hir_zen( _文字列, _変換後 ) :- /* ここが質問のはじめ : main() */ atom(_文字列), atom_chars( _文字列, _処理前リスト ), hir_zen_henkan( _処理前リスト, _処理後リスト ), atom_chars( _変換後, _処理後リスト ). hir_zen( _変換後, _文字列 ) :- /* ここが質問のはじめ : main() */ atom(_文字列), var(_変換後), atom_chars( _文字列, _処理前リスト ), hir_zen_henkan( _処理後リスト,_処理前リスト ), atom_chars( _変換後, _処理後リスト ). hir_zen_henkan( [], [] ). /* 停止判定 */ hir_zen_henkan( [A,B|L], ['ヴ'|Z] ) :- /* _処理前リストの最初の2文字が 'う', '゛' の場合 */ atom_chars('う゛', V), V=[A,B], !, hir_zen_henkan( L, Z ). hir_zen_henkan(L1, [ZZ|Z]) :- /* _処理前リストの最初の1文字が、hir( **リスト** ). にある場合 */ \+(var(L1)), L1 = [A|L], hir( Hira ), nth1( N, Hira, A ), zen( Zen ), nth1( N, Zen, ZZ ), !, hir_zen_henkan( L, Z ). hir_zen_henkan(L1, L2) :- /* _処理前リストの最初の1文字が、hir( **リスト** ). にある場合 */ var(L1), \+(var(L2)), L2 = [ZZ|Z], L1 = [A|L], zen( Zen ), nth1( N, Zen, ZZ ), hir( Hira ), nth1( N, Hira, A ), !, hir_zen_henkan( L, Z ). hir_zen_henkan( [A|L], [A|Z] ) :- /* _処理前リストの最初の1文字が、hir( **リスト** ). にない場合 */ !, hir_zen_henkan( L, Z ). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/212 # # 質問です。 # 開始地点を表すカラム start_point と終了地点を表すカラム end_point があり、その距離は # ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point))) # で計算できます。 # それで、 # ・select で距離を計算するときは round() するけど # ・order by でソートする時は round() なしで(つまりfloatのまま)ソートする # ということをしたいです。 # SQLはこんな感じになるんですけど、 # select round(ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point)))) as distance # from geo_data # order by ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point))) # これだと距離の計算が二重に行われてしまい、無駄です。 # これを、距離の計算を二重に行わずに意図した通りのSQLを発行することはできますか。 # よろしくお願いします。 # 環境:PostgreSQL 9.1 # テーブル定義(geo,1,id). テーブル定義(geo,2,start_point). テーブル定義(geo,3,end_point). '開始地点を表すカラム start_point と終了地点を表すカラム end_point があり、その距離を小さい順に取り出す(距離を四捨五入)'(_start_point,_end_point,_distance) :- テーブル述語を得る(geo,[start_point,end_point],[_start_point,_end_point],P), 四捨五入しない距離で整列(P,_start_point,_end_point,L2), member([_distance_1,_start_point,_end_point],L2), 四捨五入(_distance_1,_distance). テーブル述語を得る(_テーブル名,_カラムならび,_カラム変数ならび,_テーブル述語) :- findall(_,( テーブル定義(テーブル名,_,_)), L, カラム変数ならびを得る(_テーブル名,_カラムならび,_カラム変数ならび,L), _テーブル述語 =.. [_テーブル名|L]. カラム変数ならびを得る(_テーブル名,_カラムならび,[],L) :- !. カラム変数ならびを得る(_テーブル名,[_カラム|R1],[_カラム変数|R2],L) :- テーブル定義(_テーブル名,Nth,_カラム), nth1(Nth,L,_カラム変数), カラム変数ならびを得る(_テーブル名,R1,R2,L). 四捨五入しない距離で整列(P,_start_point,_end_point,L2) :- findall([_distance,_start_point,_end_point],( _テーブル述語, _distance is _end_point - _start_point), L1), 整列(L1,L2). 四捨五入(A,B) :- B is round(A). % 以下のサイトは # 出典 :: 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'),!. 参加者全員がビンゴとなるまでガラガラを繰り返す(_参加者ビンゴカードならび,L1) :- ガラガラ(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個をビンゴカードに適用(_重複しない100個の乱数ならび,_ビンゴカード) :- ビンゴカード(_重複しない100個の乱数ならび,_ビンゴカード). ビンゴカード(_重複しない100個の乱数ならび,_ビンゴカード) :- _ビンゴカード=[[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_]], flatten(_ビンゴカード,L), append(L,_,_重複しない100個の乱数ならび). 'ガラガラは1〜100までの重複しない乱数を作る機械であり、ビンゴカード作成に用いた乱数列とガラガラで使う乱数列は別物である'(_ガラガラで使う乱数列) :- 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(_ガラガラで使う乱数列),!. ビンゴになったカードを探し賞品を渡してそのカードを削除(_,[],[]). ビンゴになったカードを探し賞品を渡してそのカードを削除(_数字,[[_ビンゴ参加者,_ビンゴカード_1]|R1],R) :- 一致した数字があったら穴をあける(_数字,_ビンゴカード_1,_ビンゴカード_2), ビンゴになったカードを探し賞品を渡してそのカードを削除_2(_数字,[[_ビンゴ参加者,_ビンゴカード_2]|R1],R). ビンゴになったカードを探し賞品を渡してそのカードを削除_2(_数字,[[_ビンゴ参加者,_ビンゴカード_1]|R1],R) :- ビンゴだったら賞品を渡してその人は上がり(_ビンゴカード_1,_ビンゴ参加者), ビンゴになったカードを探し賞品を渡してそのカードを削除(_数字,R1,R),!. ビンゴになったカードを探し賞品を渡してそのカードを削除_2(_数字,[[_ビンゴ参加者,_ビンゴカード_1]|R1],[[_ビンゴ参加者,_ビンゴカード_1]|R]) :- ビンゴになったカードを探し賞品を渡してそのカードを削除(_数字,R1,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,穴),!. ビンゴ表示(_ビンゴカード) :- forall(member(L,_ビンゴカード),ビンゴ行表示(L)). ビンゴ行表示([]) :- write('\n'). ビンゴ行表示([A|R]) :- 表示変換(A,B), writef('%w ',[B]), ビンゴ行表示(R). 表示変換(穴,穴) :- !. 表示変換(N,A) :- N < 10, atomic_list_concat([' ',N],A),!. 表示変換(N,A) :- atom_number(A,N). 賞品を渡す(_参加者) :- retract(賞品(_賞品)), writef('%t君はビンゴになりました。賞品は %t です!\n',[_参加者,_賞品]),!. all([],_). all([A|R],A) :- all(R,A). ガラガラ(L1,_数字,L2) :- length(L1,_nth_1), Nth is random(_nth_1) + 1, '重複しない1〜100の乱数'(Nth,L1,_数字,L2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/165 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/YKwOhX0L # # /* # ・仕様 # ・配るカードは13枚 # ・スートはSuiteという列挙体で定義され、Spade(スペード)、Club(クラブ)、Heart(ハート) # Dia(ダイア)という定数を持つ # ・カードはCARDという構造体で定義され、Suite列挙体のsuiteと、カードのランクを表す # int型のrankという2つのメンバを持つ # ・カードは配列 # ・13枚のカードのスートとランクは乱数で決定。現実にはありえないカードの配り方 # になってもよい(例:13枚の中にスペードのエースが5枚ある等) # ・スートはスペード→ハート→クラブ→ダイヤの順にソートし、ランクは小さい順(1,2,3,…13) # にソート、またランクよりもスートを優先 # 例:4枚のカードの内訳がスペードの2と5、ハートの3、クラブの10なら # スペードの2→スペードの5→ハートの3→クラブの10とソートされる # ・ソートのアルゴリズムはバブルソートを使う # ソートの前とソートの後のカードを表示する # */ '乱数を使ってカードを13枚配りそれをバブルソートする'(_配られたカード,_ソートされたカード) :- '乱数を使ってカードを13枚配り'(_配られたカード), それをバブルソートする(_配られたカード,_ソートされたカード). '乱数を使ってカードを13枚配り'(_配られたカード) :- 'カードを13枚'(_配られたカード), スートとランクを当て嵌める(_配られたカード). 'カードを13枚'(_配られたカード) :- length(_配られたカード,13). スートとランクを当て嵌める(_配られたカード) :- findall([_スート,_ランク],( member(_カード,_配られたカード), スートを決める(_スート), ランクを決める(_ランク)), _配られたカード). スートを決める(_スート) :- _乱数 is random(4), スートを決める(_乱数,_スート). スートを決める(0,スペード). スートを決める(1,ハート). スートを決める(2,クラブ). スートを決める(3,ダイヤ). ランクを決める(_ランク) :- _ランク is random(13) + 1. それをバブルソートする(_配られたカード,_ソートされたカード) :- 'スート・ランク仕様のバブルソート'(_配られたカード,_ソートされたカード). 'スート・ランク仕様のバブルソート'(L1,L2) :- 軽い泡はちょっと浮き上がる(L1,L3), 泡が浮き上がったら最初からやり直す(L3,L2),!. 'スート・ランク仕様のバブルソート'(L,L) :- 浮き上がる泡がなくなったらバブルソート終了. 軽い泡はちょっと浮き上がる(L1,L3) :- append(L0,[_重い泡,_軽い泡|R],L1), 泡の重さを量る(_重い泡,_軽い泡), append(L0,[_軽い泡,_重い泡|R],L3). 泡の重さを量る([_スート_1,_],[_スート_2,_]) :- スート強度(_スート_1,_スート_2),!. 泡の重さを量る([_スート,_ランク_1],[_スート,_ランク_2]) :- _ランク_1 >= _ランク_2. スート強度(_スート_1,_スート_2) :- nth1(N1,[ダイヤ,クラブ,ハート,スペード],_スート_1), nth1(N2,[ダイヤ,クラブ,ハート,スペード],_スート_2), N1 > N2,!. 泡が浮き上がったら最初からやり直す(L3,L2) :- 'スート・ランク仕様のバブルソート'(L3,L2). 浮き上がる泡がなくなったらバブルソート終了. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/165 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/YKwOhX0L # # /* # ・仕様 # ・配るカードは13枚 # ・スートはSuiteという列挙体で定義され、Spade(スペード)、Club(クラブ)、Heart(ハート) # Dia(ダイア)という定数を持つ # ・カードはCARDという構造体で定義され、Suite列挙体のsuiteと、カードのランクを表す # int型のrankという2つのメンバを持つ # ・カードは配列 # ・13枚のカードのスートとランクは乱数で決定。現実にはありえないカードの配り方 # になってもよい(例:13枚の中にスペードのエースが5枚ある等) # ・スートはスペード→ハート→クラブ→ダイヤの順にソートし、ランクは小さい順(1,2,3,…13) # にソート、またランクよりもスートを優先 # 例:4枚のカードの内訳がスペードの2と5、ハートの3、クラブの10なら # スペードの2→スペードの5→ハートの3→クラブの10とソートされる # ・ソートのアルゴリズムはバブルソートを使う # ソートの前とソートの後のカードを表示する # */ '乱数を使ってカードを13枚配りそれをバブルソートする'(_配られたカード,_ソートされたカード) :- '乱数を使ってカードを13枚配り'(_配られたカード), それをバブルソートする(_配られたカード,_ソートされたカード). '乱数を使ってカードを13枚配り'(_配られたカード) :- 'カードを13枚'(_配られたカード), スートとランクを当て嵌める(_配られたカード). 'カードを13枚'(_配られたカード) :- length(_配られたカード,13). スートとランクを当て嵌める(_配られたカード) :- findall([_スート,_ランク],( member(_カード,_配られたカード), スートを決める(_スート), ランクを決める(_ランク)), _配られたカード). スートを決める(_スート) :- _乱数 is random(4), スートを決める(_乱数,_スート). スートを決める(0,スペード). スートを決める(1,ハート). スートを決める(2,クラブ). スートを決める(3,ダイヤ). ランクを決める(_ランク) :- _ランク is random(13) + 1. それをバブルソートする(_配られたカード,_ソートされたカード) :- 'スート・ランク仕様のバブルソート'(_配られたカード,_ソートされたカード). 'スート・ランク仕様のバブルソート'(L1,L2) :- 軽い泡はちょっと浮き上がる(L1,L3), 泡が浮き上がったら最初からやり直す(L3,L2),!. 'スート・ランク仕様のバブルソート'(L,L) :- 浮き上がる泡がなくなったらバブルソート終了. 軽い泡はちょっと浮き上がる(L1,L3) :- append(L0,[_重い泡,_軽い泡|R],L1), 泡の重さを量る(_重い泡,_軽い泡), append(L0,[_軽い泡,_重い泡|R],L3). 泡の重さを量る([_スート_1,_],[_スート_2,_]) :- スート強度(_スート_1,_スート_2),!. 泡の重さを量る([_スート,_ランク_1],[_スート,_ランク_2]) :- _ランク_1 >= _ランク_2. スート強度(_スート_1,_スート_2) :- nth1(N1,[ダイヤ,クラブ,ハート,スペード],_スート_1), nth1(N2,[ダイヤ,クラブ,ハート,スペード],_スート_2), N1 > N2,!. 泡が浮き上がったら最初からやり直す(L3,L2) :- 'スート・ランク仕様のバブルソート'(L3,L2). 浮き上がる泡がなくなったらバブルソート終了. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349630528/ # # hash = [ #  {"field1", "field2", "field3", "field4"}, #  {1, 2, 3, 4} #  {10, 20, 30, 40}, #  {100, 200, 300, 400} # ] # # こういうハッシュの書き方ができる言語ってないの? hash(hash,[[field1,field2,field3,field4],[1,2,3,4],[10,20,30,40],[100,200,300,400]]). hash(_ハッシュ名,_ハッシュ,_値) :- hash(_ハッシュ名,[_ハッシュならび|_値ならびのならび]), nth1(_何番目,_ハッシュならび,_ハッシュ), member(_値ならび,_値ならびのならび), nth1(_何番目,_値ならび,_値). ?- hash(hash,field3,X). X = 3; X = 30; X = 300; ?- % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/844 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/DXRUGC3J # http://ime.nu/codepad.org/e9CIf3Iy # # /* # # 4. # 2次元平面上の3つの座標 p1、p2、 p3 を頂点とする # 3角形を考え、構造体 triangle を以下のように定義する。 # struct triangle { # double p1[2]; double p2[2]; double p3[2]; # }; # # 構造体 triangle に対して、以下の関数を作成せよ。 適当な構造体 triangle の変数を # いくつか作成して、この関数が正しく動作することを確認するプログラムを作成せよ。 # # int congruence (structure triangle *a, structure triangle *b) # # 三角形 a と三角形 b が合同かどうかを判定する、 # 合同なら 1 を合同でないなら 0 を返す # # */ # # /* # # 5.構造体Tri は三角形に対応するものであり、3 つの辺の長さ(a,b,c) とその三角形の面積(area) を # メンバーとしてして持つ。 # struct Tri { # int a; # int b; # int c; # double area # }; # # 構造体Tri の変数をランダムにn 個作成して、三角形の面積が大きい順に表示するプログラムを作成 # する。ただしn はプログラムの引数として与える。また構造体Tri の変数をランダムに作成する際 # に、a とb には3 以上30 以下の整数をランダムに入れ、c にはa とb の値から、3 辺a, b, c から三 # 角形ができるようにランダムに正の整数を入れる。 # # [実行結果] # > ./a.out 1000 # 1 番目に大きい三角形は3 辺が( 30, 29, 41 ) で面積は434.741302 # 2 番目に大きい三角形は3 辺が( 29, 29, 43 ) で面積は418.422260 # 3 番目に大きい三角形は3 辺が( 30, 27, 37 ) で面積は399.749922 # ... # 998 番目に大きい三角形は3 辺が( 4, 3, 3 ) で面積は4.472136 # 999 番目に大きい三角形は3 辺が( 3, 3, 3 ) で面積は3.897114 # 1000 番目に大きい三角形は3 辺が( 3, 3, 1 ) で面積は1.479020 # # */ '三角形の面積が大きい順に表示する'(_n) :- 三角形をn個生成する(_n,_n個の三角形ならび), 大きい順に表示する(_n個の三角形ならび). 三角形をn個生成する(_n,_n個の三角形ならび) :- findall([_a,_b,_c],( between(1,_n,_), 三辺の長さを生成する(_a,_b,_c)), _n個の三角形ならび). 三辺の長さを生成する(_a,_b,_c) :- _a is random(100) + 1, _b is random(100) + 1, _c is random(100) + 1. 大きい順に表示する(_n個の三角形ならび) :- 三角形の面積と相対位置のならびを作る(0,_n個の三角形ならび,_面積と相対位置のならび), 大きい順に(_面積と相対位置のならび,_大きい順に整列した面積と相対位置のならび), 表示する(0,_大きい順に整列した面積と相対位置のならび,_n個の三角形ならび). 三角形の面積と相対位置のならびを作る(_,[],[]). 三角形の面積と相対位置のならびを作る(N_1,[[_a,_b,_c]|R1],[[_三角形の面積,N_2]|R2]) :- N_2 is N + 1, ヘロンの公式(_a,_b,_c,_三角形の面積), 三角形の面積と相対位置のならびを作る(0,R1,R2). ヘロンの公式(_a,_b,_c,_三角形の面積) :- _周囲の半分 is (_a + _b + _c) / 2, _三角形の面積 is sqrt(_周囲の半分 * (_周囲の半分 - _a) * (_周囲の半分 - _b) * (_周囲の半分 - _c)). 大きい順に([],[]). 大きい順に([_軸要素|L1],L2) :- 大きい順に分割する(_軸要素,L1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび), 大きい順に(_軸要素に等しいか大きい要素ならび,_大きい順に整列した軸要素に等しいか大きい要素ならび), 大きい順に(_軸要素より小さい要素ならび,_大きい順に整列した軸要素より小さい要素ならび), append(_大きい順に整列した軸要素に等しいか大きい要素ならび,[_軸要素|_大きい順に整列した軸要素より小さい],L2). 大きい順に分割する(_,[],[],[])). 大きい順に分割する(_軸要素,[_要素|R1],[_要素|_軸要素に等しいか大きい要素ならび],_軸要素より小さい要素ならび) :- _要素 @>= _軸要素, 大きい順に分割する(_軸要素,R1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび). 大きい順に分割する(_軸要素,[_要素|R1],_軸要素に等しいか大きい要素ならび,[_要素|_軸要素より小さい要素ならび]) :- _要素 @< _軸要素, 大きい順に分割する(_軸要素,R1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび). 表示する(_,[],_). 表示する(_順位_0,[[_面積,_相対番号]|R1],_n個の三角形ならび) :- _順位 is _順位_0 + 1, nth1(_相対番号,_n個の三角形ならび,[_a,_b,_c]), writef('%t 番目に大きい三角形は3 辺が( %t, %t, %t ) で面積は%t\n',[_順位,_a,_b,_c,_面積]), 表示する(_順位,R1,_n個の三角形ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/667 # # [1] 授業単元:C言語 # [2] 問題文: http://ime.nu/ideone.com/tRkzM # # 1. 10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示するプログラムを作成せよ。 #   ただし数値は何番目に生成した数値かも表示する。 # #   例)1番目に小さい数は475番目の数10049です。 # # 2. 10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を  表示するプログラムを作成せよ。また、各数値は何番目に生成したかも表示する。 # #   例)1番目に平均との差が小さい数は680番目の数69383です。 平均値との差は10.505です。 # # 3. n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。 #   ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15は仮定する。 # #   例)program 5 # a,b,c,d,e # a,b,c,e,d # a,b,d,c,e # ・ #       ・ #     e,d,c,b,a '10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を表示する。各数値は何番目に生成したかも表示する' :- '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび), '各数値と平均値との差をもとめ、その差が小さい順にその数値を表示する。各数値は何番目に生成したかも表示する'(_自然数ならび). '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび) :- findall(N,( between(1,10000,_), N is random(10000) + 10000), _自然数ならび). '各数値と平均値との差をもとめ、その差が小さい順にその数値を表示する'(_自然数ならび) :- 各数値と平均値との差をもとめ(_自然数ならび,_何番目かの情報を付けた平均との差ならび), その差が小さい順に(_何番目かの情報を付加した平均との差ならび,_小さい順に整列した何番目かの情報を付加した平均との差ならび), その数値を表示する(_小さい順に整列した何番目かの情報を付加した平均との差ならび). 各数値と平均値との差をもとめ(_自然数ならび,_何番目かの情報を付加した平均との差ならび) :- 平均値(_自然数ならび,_平均値), findall([_差,_何番目],( append(L0,[_数値|_],_自然数ならび), length([_|L0],_何番目), _差 is abs(_数値 - _平均値)), _何番目かの情報を付加した平均との差ならび). 平均値(_自然数ならび,_平均値) :- 相加平均(_自然数ならび,_平均値). 小さい順にこれら数値を表示する(_自然数ならび) :- 小さい順に数値を(_自然数ならび,_小さい順に整列した自然数ならび), 表示する(_小さい順に整列した自然数ならび) その差が小さい順に([],[]). その差が小さい順に([_軸要素|_残りならび],_小さい順に整列した自然数ならび) :- 分割(_軸要素,_残りならび,_軸要素と等しいか小さい自然数ならび,_軸要素より大きい自然数ならび), その差が小さい順に(_軸要素と等しいか小さい自然数ならび,_小さい順に整列した軸要素と等しいか小さい自然数ならび), その差が小さい順に(_軸要素より大きい自然数ならび,_小さい順に整列した軸要素より大きい自然数ならび), append(_小さい順に整列した軸要素と等しいか小さい自然数ならび,[_軸要素|_小さい順に整列した軸要素より大きい自然数ならび],_小さい順に整列した自然数ならび). 分割(_,[],[]). 分割(_軸要素,[A|R],[A|R1],R2) :- A @=< _軸要素, 分割(_軸要素,R,R1,R2). 分割(_軸要素,[A|R],R1,[A|R2]) :- A @> _軸要素, 分割(_軸要素,R,R1,R2). 'その数値を表示する。各数値は何番目に生成したかも表示する'(_,[]). 'その数値を表示する。各数値は何番目に生成したかも表示する'(_自然数ならび,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10|R]) :- '数値と何番目かを表示する'(_自然数ならび,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), 'その数値を表示する。各数値は何番目に生成したかも表示する'(_自然数ならび,R). '数値と何番目かを表示する'(_,[]) :- write('\n'). '数値と何番目かを表示する'(_自然数ならび,[[_,_位置]|R]) :- nth1(_位置,_自然数ならび,_数値), writef('%t(%t) ',[_位置,_数値]), '数値と何番目かを表示する'(_自然数ならび,R). 相加平均(_値ならび,_相加平均) :- length(_値ならび,_標本数), 相加平均(_値ならび,_標本数,0,_相加平均). 相加平均([],_標本数,_合計,_相加平均) :- _相加平均 is _合計 / _標本数,!. 相加平均([V|R],_標本数,_合計_1,_相加平均) :- _合計_2 is _合計_1 + V, 相加平均(R,_標本数,_合計_2,_相加平均). % 以下のサイトは # 出典:: 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/1342966104/466 # # # [1] 授業単元:C言語 # [2] 問題文:プレイフェア暗号の作成 #       参考:http://ime.nu/www.tamagaki.com/math/PlayfairCipher.html # # #  プレイフェア暗号(Playfair cipher) # # プレイフェア暗号はイギリス人サー・チャールズ・ホイートストン(Sir Charles Wheatstone)により開発されライアン・プレイフェア(Lyon Playfair)が普及させました。プレイフェア暗号を用いて暗号化するとき、まずキーワードまたはキーフレーズをあらかじめ決めておきます。仮にキーワードをPlayfairとします。次にこのキーワードをアルファベットが重複することなく下の5×5の表に入れていきます。 # # ここで残りのセルに余ったアルファベットを挿入していくわけですが、アルファベットは26文字あって5×5では一字余ります。そこで I と J は同じセルに入れるとあらかじめ決めておきます。そこで新たに作られた表が下のようになります。 # # 準備ができたところで、次のメッセージを暗号化してみましょう。 # # メッセージ Abandon hope, all ye who enter here. # # このメッセージをまず二文字ずつ区切っていきます。 # # Ab-an-do-nh-op-ea-ll-ye-wh-oe-nt-er-he-re # # ここで7番目に ll と同じ文字が重複しているので間に x を入れます。 # # Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-e # # そうすると最後に e が一つ余ります。ここにもやはり x を入れておきます。 # # Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-ex # # まず最初の二文字 ab を暗号化してみましょう。ab は先ほど作った表では同じ列にあります。このときは ab の列のすぐ下の文字で置き換えます。 # # つまり ab は BH に変わります。ただし一番下の文字例えば w は一番上の文字 A に変換されます。 # # 同様に同じ行に入る二文字も出てきたとします。例えば ap などは右隣の文字に置き換えます。 # # つまり ap は YL になるわけですね。この場合も一番右の文字例えば f は一番左の文字 p に変換されます。 # # 最後に行も列も違う二文字が出てきた場合は次のようにします。例えば an を考えます。下の表のように a n それぞれの行および列を塗り分け、その交点となる文字を見ます。この場合、P と Q になります。 # # そこで a は、a h と同じ行の P に、n は、n と同じ行の Q に変換します。つまり、 # # do → RT # # nh → QE # # op → NL # # となるわけです。このルールに従って、先ほどのメッセージを暗号化すると、 # # 平文  Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-ex # # 暗号文 BH PQ RT QE NL HP YV AF HU GQ NU NM BG GI KU # # これでプレイフェア暗号による暗号化が終了したわけです。 # # この暗号はイギリスがボーア戦争(ブール戦争 BoreWar)で使用したといわれています。 プレイフェア暗号表の作成(_鍵文,_暗号表) :- 鍵文を25要素のならびに拡張して(_鍵文,_25要素ならび,_鍵文字以外の変数ならび), 'Jを除いたA-Zならびを切る'(_Jを除いたA_Zならび), 変数を埋める(_Jを除いたA_Zならび,Chars,_鍵文字以外の変数ならび), 'N個組'(5,_25要素のならび,_暗号表). 鍵文を25要素のならびに拡張して(_鍵文,_25要素ならび,_鍵文字ならび,_鍵文字以外の変数ならび) :- length(_25要素ならび,25), atom_chars(_鍵文,_鍵文字ならび), append(_鍵文字ならび,_鍵文字以外の変数ならび,_25要素ならび). 'A-Zならびを切る'(_Jを除いたA_Zならび) :- _切る回数 is random(113) + 1, トランプを切るようにならびを切る(_切る回数,25,['A','B','C','D','E','F','G','H','I','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_Jを除いたA_Zならび). 変数を埋める(_,_,[]). 変数を埋める(L_1,Chars,[V|R]) :- select(V,L_1,L_R), \+(member(V,Chars)), 変数を埋める(L_R,Chars,R). プレイフェア暗号による暗号化(_平文,_暗号文) :- メッセージをまず二文字ずつ区切っていきます(_平文,_二文字ずつに区切られたならび), プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号文字ならび), atomic_list_concat(_暗号文字ならび,_暗号文). メッセージをまず二文字ずつ区切っていきます(_平文,_二文字ずつに区切られたならび) :- atom_chars(_平文,Chars), すべての文字を大文字に変換(Chars,_大文字の文字ならび), メッセージをまず二文字ずつ区切っていきます(_大文字の文字ならび,_二文字ずつに区切られたならび). メッセージをまず二文字ずつ区切っていきます([],[]). メッセージをまず二文字ずつ区切っていきます(['J'|R1],[['J','J']|R2]) :- メッセージをまず二文字ずつ区切っていきます(R1,R2). メッセージをまず二文字ずつ区切っていきます([A],[[A,'X']]). メッセージをまず二文字ずつ区切っていきます([A,A|R1],[[A,'X']|R2]) :- メッセージをまず二文字ずつ区切っていきます([A|R1],R2). メッセージをまず二文字ずつ区切っていきます([A,B|R1],[[A,B]|R2]) :- \+(A=B), メッセージをまず二文字ずつ区切っていきます(R1,R2). プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号文字ならび) :- 暗号表(_暗号表), 転置(_暗号表,_転置された暗号表), プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号表,_転置された暗号表,_暗号文字ならび). プレイフェア暗号化([],_,_,[]). プレイフェア暗号化([['J','J']|R1],_暗号表,_転置された暗号表,['J'|R2]) :- プレイフェア暗号化(R1,_暗号表,_転置された暗号表,R2). プレイフェア暗号化([[A,B]|R1],_暗号表,_転置された暗号表,[C,D|R2]) :- 暗号に変換(A,B,_暗号表,C,D), プレイフェア暗号化(R1,_暗号表,_転置された暗号表,R2). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- member(L,_転置された暗号表), 'A,Bが暗号表の同一行または列にある'(A,B,L,C,D). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- member(L,_暗号表), 'A,Bが暗号表の同一行にある'(A,B,L,C,D). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- 暗号コードは矩形を仮想した時の他の二角(A,B,_暗号表,C,D). 'A,Bが暗号表の同一行または列にある'(A,B,L,C,D) :- member(A,L), member(B,L), 'A,Bの次の要素'(L,A,C), 'A,Bの次の要素'(L,B,D). 'A,Bの次の要素'(L,X,Y) :- append([Y|_],[X],L). 'A,Bの次の要素'(L,X,Y) :- append(_,[X,Y|_],L). 暗号コードは矩形を仮想した時の他の二角(A,B,_表,C,D) :- 'A,Bの行と列位置を得る'(A,B,_表,L_1,_列_A,L_2,_列_B), nth1(_列_B,L_1,C), nth1(_列_A,L_2,D). 'A,Bの行と列位置を得る'(A,B,_表,L_1,_列_A,L_2,_列_B) :- nth1(_行_A,_表,L_1), nth1(_列_A,L_1,A), nth1(_行_B,_表,L_2), nth1(_列_B,L_2,B). % 以下のサイトは # module regwrite #   ( #   output reg rout, #   input clk, #   input [3:0] in, #   input [3:0] ctrl #   ); #   always @(posedge clk) #     case(1) #       ctrl[0]:rout <= in[0]; #       ctrl[1]:rout <= in[1]; #       ctrl[2]:rout <= in[2]; #       ctrl[3]:rout <= in[3]; #     endcase // case(1) # endmodule // regwrite # module regwrite regwrite(_rout,_clk,_in,_ctrl) :- case(_ctrl,_rout). case(_ctrl,_in,_rout) :- nth0(0,_ctrl,1), nth0(0,_in,_rout). case(_ctrl,_in,_rout) :- nth0(1,_ctrl,1), nth0(1,_in,_rout). case(_ctrl,_in,_rout) :- nth0(2,_ctrl,1), nth0(2,_in,_rout). case(_ctrl,_in,_rout) :- nth0(3,_ctrl,1), nth0(3,_in,_rout). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1344655285/162 # # rubyで一番よく使うのはmap、これは戻り値に配列を返す # 普通に書いたら # p [1,2,3].map { |x| x*2 } # => [2, 4, 6] # # だけど、メソッド(イテレータ)チェインする事によって、本来配列を返さない # each_with_indexなども # p [1,2,3].each_with_index { |x,i| x*(2+i) } # => [1, 2, 3] # # mapを置く事による戻り値を変えられる # p [1,2,3].each_with_index.map { |x,i| x*(2+i) } # => [2, 6, 12] # # これをforで書くとこう # s = [] # i = 0 # for x in [1,2,3] # s << x*(2+i) # i += 1 # end # p s # # for文とイテレータじゃ力の差が有りすぎて異論の余地すらない # >>> [val*(2+idx) for idx,val in enumerate(sorted([3,2,1]))] # [2, 6, 12] # irb(main):001:0> [3,2,1].sort.each_with_index.map { |x, i| x * (2 + i) } # => [2, 6, 12] 'p [1,2,3].map { |x| x*2 } # => [2, 4, 6]' :- findall(_y,( member(_x,[1,2,3]), _y is _x * 2), L), writef('%t\n',[L]). 'p [1,2,3].each_with_index.map { |x,i| x*(2+i) } # => [2, 6, 12]' :- findall(_y,( nth1(_i,[1,2,3],_x), _y is _x * (2 + _i)), L), writef('%t\n',[L]). '>>> [val*(2+idx) for idx,val in enumerate(sorted([3,2,1]))]'(L) :- sort([3,2,1],L1), findall(_y,( nth1(_idx,L1,_x), _y is _x * (2 + _idx)), L). '[3,2,1].sort.each_with_index.map { |x, i| x * (2 + i) }'(L) :- sort([3,2,1],L1), findall(_y,( nth1(_i,L1,_x), _y is _x * (2 + _i)), L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1269704830/946 # # # 質問です。メモ帳のデータをfortranで読み込んだ後、指定したデータを掛け算し、 # その合計値を算出したいいのですが、どのようにプログラミングしたらいいでしょうか? # # depth 0, 5 cm P, S, P+S # 1 .000E+00 .121E+06 .121E+06 .000E+00 .859E+06 .859E+06 # 2 .320E+02 .325E+06 .325E+06 .170E+02 .798E+06 .798E+06 # 3 .300E+01 .671E+06 .671E+06 .100E+01 .116E+07 .116E+07 # 4 .247E+05 .173E+07 .175E+07 .120E+05 .160E+07 .161E+07 # 5 .440E+06 .151E+07 .195E+07 .229E+06 .152E+07 .175E+07 # 6 .146E+07 .474E+06 .194E+07 .793E+06 .899E+06 .169E+07 # 7 .253E+07 .124E+06 .266E+07 .143E+07 .763E+06 .219E+07 # 8 .329E+07 .280E+05 .332E+07 .191E+07 .757E+06 .267E+07 # 9 .373E+07 .526E+04 .373E+07 .222E+07 .753E+06 .297E+07 # 10 .391E+07 .315E+04 .392E+07 .239E+07 .732E+06 .312E+07 # 11 .394E+07 .516E+05 .399E+07 .245E+07 .772E+06 .322E+07 # 12 .387E+07 .910E+02 .387E+07 .245E+07 .636E+06 .309E+07 # 13 .375E+07 .480E+02 .375E+07 .242E+07 .583E+06 .300E+07 # ↓ #  ↓ #  ↓ #  400 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 # # 上記のデータの説明をさせていただきます。深さ0cmと5cmのそれぞれにP,S,P+Sという3種類のデータ # が存在し、まず、5cmのP+Sのデータを縦に読み込み、X=1〜400とおいて各数字をX*50-25と変更した後、 # 5cmのP+Sの行と対応した「1〜400の変更した値」で順番に掛けてその合計を計算するようにプログラミング # したいのですが、うまくできず、困っています。 # (5cmのP+Sのデータは、左から数えて7番目のデータです。.859E+06から始まる行になります。) # # 具体的には、1〜400までの数字をそれぞれ1の場合、(1×50-25)×.859E+06という計算を縦に行っていき、 # (400×50-25)×.000E+00まで計算し、その合計値を算出できるようにプログラミングしたいと考えています。 # # '5cmのP+Sのデータを縦に読み込み、X=1〜400とおいて各数字をX*50-25と変更した後、5cmのP+Sの行と対応した「1〜400の変更した値」で順番に掛けてその合計を計算する'(_ファイル名,_合計) :- '5cmのP+Sのデータを縦に読み込み、X=1〜400とおいて各数字をX*50-25と変更した後'(_ファイル名,L), findsum(Y,( nth1(_nth,L,X), Y is _nth * X), _合計). '5cmのP+Sのデータを縦に読み込み、X=1〜400とおいて各数字をX*50-25と変更した後'(_ファイル名,L) :- get_lines(_ファイル名,[' '],LL), findall(X,( member(L_1,LL), nth1(7,L_1,X_1), X is X_1 * 50 - 25), L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/830 # # 誰か助けて # # 問題1 # はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示するプログラムをex08-02.rbで保存して実行してください. # # 問題2 # 問題1のプログラムは、nilのスロットが指定されると、そのままnilを返します.このときには「そのスロットには文字列はありません.」と表示されるように、書き換えて、ex08-03.rbで保存して実行してください. # # 問題3 # はじめに文字列の値を設定した配列変数の各スロットについて、その文字列の文字数を表示するプログラムをex08-04.rbで保存して実行してください.たとえばstrings=[’dog’,’cat’,’mouse’]の場合、以下のように出力させます. # dogは3文字 # catは3文字 # mouseは5文字 # # 問題4 # はじめに文字列の値を設定した配列変数の各スロットの内容を3回ずつ表示するプログラムをex08-05.rbで保存して実行してください. # # 問題5 # 以下のように入力したいだけの文字列を入力するよう求めて、Enterが押されたらそれを入力した順につなげて1行に出力するプログラムをex08-07.rbで保存して実行してください. # 文字列を入力してください # dog[Enter] # 文字列を入力してください # cat[Enter] # 文字列を入力してください # elephant[Enter] # 文字列を入力してください # [Enter] # あなたの入力した文字列は # dog,cat,elephant # です. # # 問題6 # 問題5のプログラムを、文字列を入力とは逆順に出力するように書き換えたプログラムをex08-08.rbで保存して実行してください. # # 問題7 # 問題5のプログラムを、3文字の文字列のみを出力するように書き換えたプログラムをex08-09.rbで保存して実行してください. # # '問題1: はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示する' :- 入力された数字(_入力された数字), 文字列ならび(_文字列ならび), nth1(_入力された数字,_文字列ならび,_文字列), writef('%t\n',[_文字列]). 入力された数字(_入力された数字) :- 数を得る(数字,_入力された数字). '問題2: はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する' :- 入力された数字(_入力された数字), 文字列ならび(_文字列ならび), nth1(_入力された数字,_文字列ならび,_文字列), 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'(_文字列). 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'('') :- writef('%t\n',['そのスロットには文字列はありません.']). 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'(_文字列) :- \+(_文字列=''), writef('%t\n',[_文字列]). '問題3: はじめに文字列の値を設定した配列変数の各スロットについて、その文字列の文字数を表示する' :- 文字列ならび(_文字列ならび), append(_,[_文字列|R],_文字列ならび), atom_length(_文字列,_文字数), writef('%tの文字数は%t\n',[_文字列,_文字数]), R = []. '問題4: はじめに文字列の値を設定した配列変数の各スロットの内容を3回ずつ表示する' :- 文字列ならび(_文字列ならび), append(_,[_文字列|R],_文字列ならび), writef('%t\n%t\n%t\n',[_文字列,_文字列,_文字列]), R = []. '問題5: 入力したいだけの文字列を入力するよう求めて、Enterが押されたらそれを入力した順につなげて1行に出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), それを入力した順につなげて1行に出力する(_文字列ならび). 文字列を入力する(_文字列) :- writef('%t ',[文字列を入力してください]), get_line(_文字列). 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'('',[]) :- !. 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列,[_文字列|R]) :- 文字列を入力する(_文字列_2), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_2,R). それを入力した順につなげて1行に出力する(_行ならび) :- atomic_list_concat(_行ならび,_表示文字列), writef('%t\n',[_表示文字列]). '問題6: 問題5のプログラムを、文字列を入力とは逆順に出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), reverse(_文字列ならび,_反転した文字列ならび), 各文字列を反転して表示する(_反転した文字列ならび). 各文字列を反転して表示する(_反転した文字列ならび) :- append(_,[_文字列|R],_反転した文字列ならび), 文字列を反転する(_文字列,_反転した文字列), writef('%t\n',[_反転した文字列]), R = []. 文字列を反転する(_文字列,_反転した文字列) :- atom_chars(_文字列,Chars), reverse(Chars,Chars_2), atom_chars(_反転した文字列,Chars_2). '問題7: 問題5のプログラムを、3文字の文字列のみを出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), '入力された文字列のうち3文字の文字列のみを出力する'(_文字列ならび). '入力された文字列のうち3文字の文字列のみを出力する'([]). '入力された文字列のうち3文字の文字列のみを出力する'([_文字列|R]) :- '3文字の文字列のみを出力する'(_文字列), '入力された文字列のうち3文字の文字列のみを出力する'(R). '3文字の文字列のみを出力する'(_文字列) :- atom_length(_文字列,3), writef('%t\n',[_文字列]),!. '3文字の文字列のみを出力する'(_). % 以下のサイトは 相対番号を付加して降順に整列する(_対象ならび,_降順に整列したならび) :- 相対番号を付加する(1,_対象ならび,_相対番号付きならび), 相対番号を付加されたならびを降順に整列する(_相対番号付きならび,_降順に整列した相対番号付きならび), 相対番号を鍵に対象ならびから降順に整列したならびを得る(_降順に整列した相対番号付きならび,_対象ならび,_降順に整列したならび). 相対番号を付加する(_,[],[]). 相対番号を付加する(N,[A|R1],[[A,N]|R2]) :- N_2 is N + 1, 相対番号を付加する(N_2,R1,R2). 相対番号を付加されたならびを降順に整列する([],[]). 相対番号を付加されたならびを降順に整列する([[_軸要素,_相対番号]|_残り要素],_降順に整列した相対番号付きならび) :- 降順分割([_軸要素,_相対番号],_残り要素,_軸要素より大きい要素のならび,_軸要素に等しいか小さいならび), 相対番号を付加されたならびを降順に整列する(_軸要素より大きい要素のならび,_降順に整列した軸要素より大きいならび), 相対番号を付加されたならびを降順に整列する(_軸要素に等しいか小さいならび,_降順に整列した軸要素に等しいか小さいならび), append(_降順に整列した軸要素より大きいならび,[[_軸要素,_軸要素の相対番号]|_降順に整列した軸要素に等しいか小さいならび],_降順に整列した相対番号付きならび). 降順分割(_,[],[],[]). 降順分割(_軸要素,[_要素|R1],[_要素|R2],R3) :- _要素 @> _軸要素, 降順分割(_軸要素,R1,R2,R3). 降順分割(_軸要素,[_要素|R1],R2,[_要素|R3]) :- _要素 @=< _軸要素, 降順分割(_軸要素,R1,R2,R3). 相対番号を鍵に対象ならびから降順に整列したならびを得る([],_,[]). 相対番号を鍵に対象ならびから降順に整列したならびを得る([[_,_nth1]|R1],_対象ならび,[_対象ならび要素|R2]) :- nth1(_nth1,_対象ならび,_対象ならび要素), 相対番号を鍵に対象ならびから降順に整列したならびを得る(R1,_対象ならび,R2 % 以下のサイトは 相対番号を付加して昇順に整列する(_対象ならび,_昇順に整列したならび) :- 相対番号を付加する(1,_対象ならび,_相対番号付きならび), 相対番号を付加されたならびを昇順に整列する(_相対番号付きならび,_昇順に整列した相対番号付きならび), 相対番号を鍵に対象ならびから昇順に整列したならびを得る(_昇順に整列した相対番号付きならび,_対象ならび,_昇順に整列したならび). 相対番号を付加する(_,[],[]). 相対番号を付加する(N,[A|R1],[[A,N]|R2]) :- N_2 is N + 1, 相対番号を付加する(N_2,R1,R2). 相対番号を付加されたならびを昇順に整列する([],[]). 相対番号を付加されたならびを昇順に整列する([_相対番号を付加した軸要素|_残り要素],_昇順に整列した相対番号付きならび) :- 昇順分割(_相対番号を付加した軸要素,_残り要素,_軸要素より小さい要素のならび,_軸要素に等しいか大きい要素ならび), 相対番号を付加されたならびを昇順に整列する(_軸要素より小さい要素のならび,_昇順に整列した軸要素より小さいならび), 相対番号を付加されたならびを昇順に整列する(_軸要素に等しいか大きいならび,_昇順に整列した軸要素に等しいか大きいならび), append(_昇順に整列した軸要素より小さいならび,[_相対番号を付加した軸要素|_昇順に整列した軸要素に等しいか大きいならび],_昇順に整列した相対番号付きならび). 昇順分割(_,[],[],[]). 昇順分割(_軸要素,[_要素|R1],[_要素|R2],R3) :- _要素 @< _軸要素, 昇順分割(_軸要素,R1,R2,R3). 昇順分割(_軸要素,[_要素|R1],R2,[_要素|R3]) :- _要素 @>= _軸要素, 昇順分割(_軸要素,R1,R2,R3). 相対番号を鍵に対象ならびから昇順に整列したならびを得る([],_,[]). 相対番号を鍵に対象ならびから昇順に整列したならびを得る([[_,_nth1]|R1],_対象ならび,[_対象ならび要素|R2]) :- nth1(_nth1,_対象ならび,_対象ならび要素), 相対番号を鍵に対象ならびから昇順に整列したならびを得る(R1,_対象ならび,R2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/63 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/img/371.txt # #include # int main(){ # int a[4][3]={ # {3,5,3}, # {4,3,5}, # {2,2,3}, # {1,8,7} # }; # # int b[4],x,y; # # for(y=0;y<=3;y++){ # b[y]=0; # for(x=0;x<=2;x++){ # b[y] += a[y][x]; # } # } # # for(y=0;y<=3;y++){ # printf("%d\n",b[y]); # } # } # 上のコードは、配列a[4][3]の各行の合計を求め、配列b[4]に保存し、求めた値を出力するプログラムです。 # これを改造して次のプログラムを作成せよ。 # # ・配列a[4][3]の各行において、その合計の昇順に行を並び替え、配列 c[4][3]に保存し、出力しなさい。 # ただし、各行の合計の値が等しいものがあった場合、行番号が小さいものを小さい順番にする。 # # '行列の各行において、その合計の昇順に行を並び替え、出力しなさい。ただし、各行の合計の値が等しいものがあった場合、行番号が小さいものを小さい順番にする。'(_行列,_行合計で整列した行列) :- 'その合計の昇順に行を並び替え'(_行列,_行合計で整列した行列), 出力しなさい(_行合計で整列した行列). 'その合計の昇順に行を並び替え'(_行列,_行合計で整列した行列) :- findsort([_行合計,_行番号],( nth1(_行番号,_行列,_行), sum(_行,_行合計)), _行合計で整列した行列). 出力しなさい(_行合計で整列した行列) :- 表示形式文字列の生成(_行合計で整列した行列,_表示形式文字列), append(_,[[_行合計,_行番号]|_残り行],_行合計で整列した行列), nth1(_行番号,_行列,_行), writef(_表示形式文字列,_行), _残り行 = []. 表示形式文字列の生成(_行合計で整列した行列,_表示形式文字列) :- nth1(1,_行合計で整列した行列,_行), length(_行,_列数), findall('%t',between(1,_列数,_),L), atomic_list_concat(L,',',S), atomic_list_concat(['| ',S,' |\n'],_表示形式文字列). findsort(_射影項,_目標,_整列した射影項ならび) :- findall(_射影項,_目標,_射影項ならび), sort(_射影項ならび,_整列した射影項ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/46 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):次のプログラムを一つ一つ手順を追って説明せよ。 # http://ime.nu/codepad.org/iARWUPGk # # #include # #include # # #define BIRDTHDAY_SIZE (3) # #define BOOKSIZE (128) # # struct addressSheet { # char *name; # int group; # char *phone; # char *address; # int birthday[BIRDTHDAY_SIZE]; /* 年月日 */ # }; # # #define NUM (4) # struct addressSheet addressBook[BOOKSIZE] = { # {"Mary", 2, "075-123-1232", "Aneyakouji, Shimogyo", {1983, 12, 1}}, # {"John", 1, "075-123-2135", "Rokkaku, Shimogyo", {1978, 5, 17}}, # {"Tom", 3, "075-123-1234", "Takoyakushi, Shimogyo", {1980, 1, 15}}, # {"Sam", 1, "075-321-2214", "Nishiki, Shimogyo", {1979, 6, 25}}, # }; # # void sortByName(struct addressSheet *, int); # int findMin(struct addressSheet *, int, int); # void swap(struct addressSheet *, int, int); # int compare(struct addressSheet *, struct addressSheet *); # void printSheet(struct addressSheet *); # # int main(void) # { # int i; # # sortByName(addressBook, 4); # # for (i=0; iname, q->name)); # } # # void swap(struct addressSheet ary[], int i, int j) # { # struct addressSheet tmp; /* データの待避先 */ # # tmp = ary[i]; # ary[i] = ary[j]; # ary[j] = tmp; # # return; # } # # void printSheet(struct addressSheet *sheet) # { # printf("Name:\t%s\n", sheet->name); # printf("Group:\t%d\n", sheet->group); # printf("Tel:\t%s\n", sheet->phone); # printf("Address:\t%s\n", sheet->address); # printf("Birthday:\t%d/%d/%d\n", sheet->birthday[0], sheet->birthday[1], sheet->birthday[2]); # # return; # } 住所録(毬,2,'075-123-1232','姉屋小路,下京', 1983/12/1). 住所録(慈恩,2,'075-123-2135','六角,下京', 1978/5/17). 住所録(富武,3,'075-123-1234','凧薬師,下京',1980/1/15). 住所録(佐武,1,'075-321-2214','西区,下京',1979/6/25). テーブル定義(住所録,1,名前). テーブル定義(住所録,2,所属). テーブル定義(住所録,3,電話番号). テーブル定義(住所録,4,住所). テーブル定義(住所録,5,生年月日). 名前順に整列(_名前順に整列した住所録) :- 名前を鍵として副目標を生成する(_副目標,_鍵,L1), findall([_鍵|L1],call(_副目標),LL1), 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録). 名前を鍵として副目標を生成する(_副目標,_鍵,L) :- findall(_,(テーブル定義(住所録,_,_)),L), _副目標 =.. [住所録|L], テーブル定義(住所録,N,名前), nth1(N,L,_鍵). 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録) :- sort(LL1,LL2), 鍵を取り除く(LL2,_名前順に整列した住所録). 鍵を取り除く(LL2,_名前順に整列した住所録) :- findall(L,member([_|L],LL2),_名前順に整列した住所録). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/46 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):次のプログラムを一つ一つ手順を追って説明せよ。 # http://ime.nu/codepad.org/iARWUPGk # # #include # #include # # #define BIRDTHDAY_SIZE (3) # #define BOOKSIZE (128) # # struct addressSheet { # char *name; # int group; # char *phone; # char *address; # int birthday[BIRDTHDAY_SIZE]; /* 年月日 */ # }; # # #define NUM (4) # struct addressSheet addressBook[BOOKSIZE] = { # {"Mary", 2, "075-123-1232", "Aneyakouji, Shimogyo", {1983, 12, 1}}, # {"John", 1, "075-123-2135", "Rokkaku, Shimogyo", {1978, 5, 17}}, # {"Tom", 3, "075-123-1234", "Takoyakushi, Shimogyo", {1980, 1, 15}}, # {"Sam", 1, "075-321-2214", "Nishiki, Shimogyo", {1979, 6, 25}}, # }; # # void sortByName(struct addressSheet *, int); # int findMin(struct addressSheet *, int, int); # void swap(struct addressSheet *, int, int); # int compare(struct addressSheet *, struct addressSheet *); # void printSheet(struct addressSheet *); # # int main(void) # { # int i; # # sortByName(addressBook, 4); # # for (i=0; iname, q->name)); # } # # void swap(struct addressSheet ary[], int i, int j) # { # struct addressSheet tmp; /* データの待避先 */ # # tmp = ary[i]; # ary[i] = ary[j]; # ary[j] = tmp; # # return; # } # # void printSheet(struct addressSheet *sheet) # { # printf("Name:\t%s\n", sheet->name); # printf("Group:\t%d\n", sheet->group); # printf("Tel:\t%s\n", sheet->phone); # printf("Address:\t%s\n", sheet->address); # printf("Birthday:\t%d/%d/%d\n", sheet->birthday[0], sheet->birthday[1], sheet->birthday[2]); # # return; # } 住所録(毬,2,'075-123-1232','姉屋小路,下京', 1983/12/1). 住所録(慈恩,2,'075-123-2135','六角,下京', 1978/5/17). 住所録(富武,3,'075-123-1234','凧薬師,下京',1980/1/15). 住所録(佐武,1,'075-321-2214','西区,下京',1979/6/25). テーブル定義(住所録,1,名前). テーブル定義(住所録,2,所属). テーブル定義(住所録,3,電話番号). テーブル定義(住所録,4,住所). テーブル定義(住所録,5,生年月日). 名前順に整列(_名前順に整列した住所録) :- 名前を鍵として副目標を生成する(_副目標,_鍵,L1), findall([_鍵|L1],call(_副目標),LL1), 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録). 名前を鍵として副目標を生成する(_副目標,_鍵,L) :- findall(_,(テーブル定義(住所録,_,_)),L), _副目標 =.. [住所録|L], テーブル定義(住所録,N,名前), nth1(N,L,_鍵). 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録) :- sort(LL1,LL2), 鍵を取り除く(LL2,_名前順に整列した住所録). 鍵を取り除く(LL2,_名前順に整列した住所録) :- findall(L,member([_|L],LL2),_名前順に整列した住所録). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/46 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):次のプログラムを一つ一つ手順を追って説明せよ。 # http://ime.nu/codepad.org/iARWUPGk # # #include # #include # # #define BIRDTHDAY_SIZE (3) # #define BOOKSIZE (128) # # struct addressSheet { # char *name; # int group; # char *phone; # char *address; # int birthday[BIRDTHDAY_SIZE]; /* 年月日 */ # }; # # #define NUM (4) # struct addressSheet addressBook[BOOKSIZE] = { # {"Mary", 2, "075-123-1232", "Aneyakouji, Shimogyo", {1983, 12, 1}}, # {"John", 1, "075-123-2135", "Rokkaku, Shimogyo", {1978, 5, 17}}, # {"Tom", 3, "075-123-1234", "Takoyakushi, Shimogyo", {1980, 1, 15}}, # {"Sam", 1, "075-321-2214", "Nishiki, Shimogyo", {1979, 6, 25}}, # }; # # void sortByName(struct addressSheet *, int); # int findMin(struct addressSheet *, int, int); # void swap(struct addressSheet *, int, int); # int compare(struct addressSheet *, struct addressSheet *); # void printSheet(struct addressSheet *); # # int main(void) # { # int i; # # sortByName(addressBook, 4); # # for (i=0; iname, q->name)); # } # # void swap(struct addressSheet ary[], int i, int j) # { # struct addressSheet tmp; /* データの待避先 */ # # tmp = ary[i]; # ary[i] = ary[j]; # ary[j] = tmp; # # return; # } # # void printSheet(struct addressSheet *sheet) # { # printf("Name:\t%s\n", sheet->name); # printf("Group:\t%d\n", sheet->group); # printf("Tel:\t%s\n", sheet->phone); # printf("Address:\t%s\n", sheet->address); # printf("Birthday:\t%d/%d/%d\n", sheet->birthday[0], sheet->birthday[1], sheet->birthday[2]); # # return; # } 住所録(毬,2,'075-123-1232','姉屋小路,下京', 1983/12/1). 住所録(慈恩,2,'075-123-2135','六角,下京', 1978/5/17). 住所録(富武,3,'075-123-1234','凧薬師,下京',1980/1/15). 住所録(佐武,1,'075-321-2214','西区,下京',1979/6/25). テーブル定義(住所録,1,名前). テーブル定義(住所録,2,所属). テーブル定義(住所録,3,電話番号). テーブル定義(住所録,4,住所). テーブル定義(住所録,5,生年月日). 名前順に整列(_名前順に整列した住所録) :- 名前を鍵として副目標を生成する(_副目標,_鍵,L1), findall([_鍵|L1],call(_副目標),LL1), 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録). 名前を鍵として副目標を生成する(_副目標,_鍵,L) :- findall(_,(テーブル定義(住所録,_,_)),L), _副目標 =.. [住所録|L], テーブル定義(住所録,N,名前), nth1(N,L,_鍵). 名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録) :- sort(LL1,LL2), 鍵を取り除く(LL2,_名前順に整列した住所録). 鍵を取り除く(LL2,_名前順に整列した住所録) :- findall(L,member([_|L],LL2),_名前順に整列した住所録). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #880 # [1]授業単元:C言語 # [2]問題文 # マインスイーパのような爆弾ゲームプログラムを作成する。 # 1. マス目を8× 8に設定する。 # 2. 爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)。 # 3.まだ指定していないマス目には数字の0の代わりに記号'-'を表示する。 # 4.爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を # 表示する(最小で0、最大で8)。 # 5. 爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字 # の'x'を表示し、"Bomb!"と表示して終了する。 # # [3]環境 # [3.1]windows7 # [3.2]gcc # [3.3]C/C++ # [4]7月20日 # よろしくお願いします。 # マインスイーパ :- 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面). 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面) :- 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面), '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(_平坦なならびで表現された盤面). マインスイーパ(_平坦なならびで表現された盤面) :- 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面),!. マインスイーパ(_平坦なならびで表現された盤面) :- マインスイーパを継続する(_平坦なならびで表現された盤面). 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面) :- 度数((member(A,_平坦なならびで表現された盤面),atom(A)),64), write('あなたの勝ちです。\n'). マインスイーパを継続する(_平坦なならびで表現された盤面) :- '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置), マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置) :- 爆弾を隠して盤面を表示する(_平坦なならびで表現された盤面), マス目を選択させる(_行位置,_列位置). マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面),!. マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面), 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面) :- 平坦化した位置に変換(_行位置,_列位置,_nth1), nth1(_nth1,_平坦なならびで表現された盤面,0). 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面) :- 爆弾は周囲にいくつあるか(_nth1,_平坦なならびで表現された盤面,_個数), writef('周囲に爆弾は %w 個あります\n',[_個数]),!. '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面) :- 得点は(_平坦なならびで表現された盤面,_得点), 爆弾が置かれたすべてのマス目に小文字のxを表示し(_平坦なならびで表現された盤面), writef('\n Bomb! \n\n\n あなたの得点は %t です\n',[_得点]). 得点は(_平坦なならびで表現された盤面,_得点) :- 度数((member(A,_平坦なならびで表現された盤面),\+(var(A)),A==0),_得点). 爆弾が置かれたすべてのマス目に小文字のxを表示し([]) :- !. 爆弾が置かれたすべてのマス目に小文字のxを表示し(L) :- 爆弾が置かれたすべてのマス目に小文字のxを表示して行く(L). 爆弾が置かれたすべてのマス目に小文字のxを表示して行く([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾が置かれたすべてのマス目に小文字のxを表示し(R). 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 行末まで表示する(A,R). 行末まで表示する(A,R) :- 爆弾を含むマス目表示文字(A,_表示文字), 爆弾を含むマス目表示(R,_表示文字). 爆弾を含むマス目表示(R,_表示文字) :- writef('%w',[_表示文字]), R = [], write('\n'). マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R) :- append(_,[A|R],[_1,_2,_3,_4,_5,_6,_7,_8]). 爆弾を含むマス目表示文字(V,'-') :- var(V),!. 爆弾を含むマス目表示文字('x','x') :- !. 爆弾を含むマス目表示文字(_,0). 爆弾を隠して盤面を表示する([]). 爆弾を隠して盤面を表示する([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾を隠して盤面を表示する(R). 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 爆弾を隠して行末まで表示する(A,R). 爆弾を隠して行末まで表示する(A,R) :- 爆弾を隠すマス目表示文字(A,_表示文字), 爆弾を隠すマス目表示(_表示文字,R). 爆弾を隠すマス目表示(_表示文字,R) :- writef('%w',[_表示文字]), R = [], write('\n'). 爆弾を隠すマス目表示文字(V,'-') :- var(V),!. 爆弾を隠すマス目表示文字('x','-') :- !. 爆弾を隠すマス目表示文字(_,0). 平坦化した位置に変換(_行位置,_列位置,_nth1) :- _nth1 is (_行位置-1) * 8 + _列位置. 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面) :- length(_平坦なならびで表現された盤面,64). '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(L) :- 爆弾は10個にし(Lp), 同じマス目に重ならないようにランだけに配置する(Lp,L). 爆弾は10個にし(Lp) :- length(Lp,10). 同じマス目に重ならないようにランだけに配置する([],L) :- !. 同じマス目に重ならないようにランだけに配置する([_|R1],L) :- 同じマス目に重ならないようにランダムに一個爆弾を設置する(L), 同じマス目に重ならないようにランだけに配置する(R1,L). 同じマス目に重ならないようにランダムに一個爆弾を設置する(L) :- ランダムに(L,_nth0), 同じマス目に重ならないように一個爆弾を設置する(_nth0,L),!. ランダムに(L,_nth0) :- repeat, _nth0 is random(64). 同じマス目に重ならないように一個爆弾を設置する(_nth0,L) :- 同じマス目に重ならないように(_nth0,L,V), 一個爆弾を設置する(V). 同じマス目に重ならないように(_nth0,L,V) :- nth0(_nth0,L,V), var(V). 一個爆弾を設置する(x). 爆弾は周囲にいくつあるか(N,L,_個数) :- 度数(周囲の八箇所の中で爆弾があるのは(N,L),_個数). 周囲の八箇所の中で爆弾があるのは(N,L) :- 周辺の八箇所の中で(N,_nth1), '_nth1には爆弾がある'(_nth1,L). 周辺の八箇所の中で(N,_nth1) :- member(_式,[N-9,N-8,N-7,N-1,N,N+1,N+7,N+8,N+9]), _nth1 is _式. '_nth1には爆弾がある'(_nth1,L) :- nth1(_nth1,L,V), 変数ではなく爆弾がある(V). 変数ではなく爆弾がある(V) :- 変数ではなく(V), V = x. 変数ではなく(V) :- \+(var(V)). マス目を選択させる(_行位置,_桁位置) :- 整数を得る('マス目の行位置(1-8) ',between(1,8,_行位置),_行位置), 整数を得る('マス目の桁位置(1-8) ',between(1,8,_桁位置),_桁位置),!. 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から(_催促文,_行), 行を条件付きで整数に変換する(_行,_条件,_整数),!. 催促文付き行入力から(_催促文,_行) :- writef('%w',[_催促文]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_chars(_行,Codes). 行を条件付きで整数に変換する(_行,_条件,_整数) :- 行を整数に変換する(_行,_整数), 整数入力条件検査(_条件). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査(_整数). 整数検査(_整数) :- integer(_整数),!. 整数検査(_項) :- 整数検査再入力要請(_項). 整数検査再入力要請(_項) :- writef('入力された項 %w は整数になりません。再入力をお願いします。\n',[_項]), fail. 整数入力条件検査(_条件) :- catch(_条件,E,fail),!. 整数入力条件検査(_条件) :- 整数入力条件検査再入力要請(_条件). 整数入力条件検査再入力要請(_条件) :- writef('入力された %w は成立しません。再入力をお願いします。\n',[_条件]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/872 # # [1] 授業単元: C言語 # [2] 問題文: # 簡単な暗号化関数の作成 # 英文字を第1引数、正整数値のシフト幅nを第2引数として受け取り、第一 # 引数をASC競魁璽匹韮遒蘯分先に進めた文字を返す関数を作成せよ。 # たとえば第1引数が'b'(十進数の98)、第2引数6であった場合は戻り値は'h'(十進数の104)となる。 #  ただし、大文字を進めた場合に'z'より大きくなる場合には'A'に折り返す。たとえば、'W'を指定し # た場合は'C'が戻り値となる。小文字についても同様に、'z'を超える場合は'a'に折り返す。また、英大 # 文字・小文字以外が第一引数に与えられた場合は、第1引数をそのまま戻り値とする。 #  このような関数をcharshift()という名前で作成した上で、この関数を用いて以下の機能を持つプログ # ラムを作成せよ。 # # 「最初にキーボードから80文字以内の英文を1行入力し、次に正整数のシフト幅を入力する。 # そして、英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を1行に # 出力する」 # # このプログラムでは以下のような結果が得られる # Input English words. # UDU was established in 1907. (←キーボードからの入力) # Input shift number. # 6 (←キーボードからの入力) # AJA cgy kyzghroynkj ot 1907. # '英文字を第1引数、正整数値のシフト幅nを第2引数として受け取り、第一引数をASCIIコードでn進めた文字を返す'(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字) :- charsshift(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字). charsshift(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字) :- member(L,[[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']]), nth0(_nth0,L,_文字), _シフト is 26 + _シフト幅n - _nth0, ならびの回転(左方向,_シフト,L,_第一引数をASCIIコードでn進めた文字),!. '最初にキーボードから80文字以内の英文を1行入力し、次に正整数のシフト幅を入力する。そして、英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を1行に出力する' '最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文), '次に正整数のシフト幅を入力する'(_シフト幅), '英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を'(_80文字以内の文字列,_シフト幅,_変換された文字列), 一行で出力する(_変換された文字列). '最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文) :- get_line(_文字列), '診断: 最初にキーボードから80文字以内の英文を1行入力し'(_文字列,_80文字以内の英文),!. '診断: 最初にキーボードから80文字以内の英文を1行入力し'(_文字列,_80文字以内の英文) :- sub_atom(_文字列,0,80,_,_80文字以内の英文),!. '診断: 最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文,_80文字以内の英文). '次に正整数のシフト幅を入力する'(_シフト幅) :- 整数を得る(正整数のシフト幅,_シフト幅). '英文字のすべての文字を指定されたシフト幅だけcharsshiftで変換した文字列を'(_80文字以内の文字列,_シフト幅,_変換された文字列) :- findall(_変換された文字,( sub_atom(_80文字以内の英文,_,1,_,_英文字), charsshift(_英文字,_シフト幅,_変換された文字)), _変換された文字ならび), atomic_list_concat(_変換された文字ならび,_変換された文字列). 一行で出力する(_変換された文字列) :- writef('%t\n',[_変換された文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/849 # # [1] 授業単元: プログラミング # [2] 問題文: # 1文字を引数として受け取り、AならばZ,BならばY,aならばz,bならばy,0ならば9,1ならば8 # というように入れ替えた文字を戻り値とする関数をsymmetry()という名前で作成する。 # キーボードから80文字以内の英文を1行入力し、1行の全ての文字をsymmetry()で変換した # 文字列を1行に表示する。同じ操作を更にもう一度繰り返し、結果的に入力された英文と # 同じ文字列が表示されるようにする。 # 例:I was born in 1956.と打ち込んだ場合、R dzh ylim rm 8043.と表示されるようにする。 # 'キーボードから80文字以内の英文を1行入力し、1行の全ての文字をsymmetry述語で変換した文字列を1行に表示する。' :- 'キーボードから80文字以内の英文を1行入力し、'(_80文字以内の文字列), '1行の全ての文字をsymmetry述語で変換した文字列を'(_80文字以内の文字列,_変換した文字列), 表示する(_変換した文字列). 'キーボードから80文字以内の英文を1行入力し、'(_80文字以内の文字列) :- get_line(_文字列), '80文字以内の'(_文字列,_80文字以内の文字列). '80文字以内の'(_文字列,_80文字以内の文字列) :- sub_atom(_文字列,0,80,_,_80文字以内の文字列),!. '80文字以内の'(_文字列,_文字列). '1行の全ての文字をsymmetry述語で変換した文字列を'(_80文字以内の文字列,_変換した文字列) :- findall(_暗号文字,( sub_atom(_80文字以内の文字列,_,1,_,_文字), symmetry(_文字,_暗号文字)), _変換した文字ならび), atom_chars(_変換した文字列,_変換した文字ならび). 表示する(_変換した文字列) :- writef('%t\n',[_変換した文字列]). symmetry(_文字,_暗号文字) :- 暗号文字へずらす(_文字,_暗号文字),!. summetry(_文字,_文字). 暗号文字へずらす(_文字,_暗号文字) :- 文字種(_,_文字コード下限,_文字コード上限,L), nth0(_nth0,L,_文字), _シフト数 is _nth0 + (_文字コード上限 - _文字コード下限 + 1) // 2, ならびの回転(左方向,_シフト数,L,[_暗号文字|_]),!. 文字種(英小文字,97,122,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). 文字種(英大文字,65,90,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']). 文字種(数字,48,57,['0','1','2','3','4','5','6','7','8','9']). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/817 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # # the fox jumps over the dogs backというアルファベット文字列があるとする。 # 最後は"."で仕切られているかどうかは問わない. # 文字列には数字は含まないことにする. # 大文字は小文字に変換する. # そしてこれらを単語ごとに分解してその文字列を保持しなさい. # そのとき構造体をつかい単語の文字数、対応する文字のASCIIコードを納める配列を作りデータを入れなさい. # つまり構造体は以下のような形に例えば設定する; # # struct dict {char word[NMOJI]; int nchar; int asciiword[NMOJI]; int order; } ; # # ここでNMOJIは単語のことを考慮した一般的な数を想定してこの定義の前で#defineで設定しておく.orderは次で使う. # 1、すべての単語を整列させなさい.並び順は辞書にしたがう.順位をorderにしまいなさい. # 2、すべての単語を辞書整列分に並べなさい.これはorderに従う. # 3、単語を文字数の少ない分に並べなさい.これはncharに従う. # まず上の例文で試しなさい.続いてWebで適当に集めた文書で独自に試しなさい. # # 文字列データの取り扱いでは、ポインタを使ってプログラムを作りなさい. # # # 'the fox jumps over the dogs backというアルファベット文字列があるとする。最後は"."で仕切られているかどうかは問わない.文字列には数字は含まないことにする.大文字は小文字に変換する.そしてこれらを単語ごとに分解してその文字列を保持しなさい.' 大文字は小文字に変換する('the fox jumps over the dogs back',_大文字を小文字に変換した文字列), 単語ごとに分解して(_大文字を小文字に変換した文字列,_単語ならび), assertz(単語ならび(_単語ならび)). 大文字は小文字に変換する(_文字列,_大文字を小文字に変換した文字列) :- to_lower(_文字列,_大文字を小文字に変換した文字列). 単語ごとに分解して(_大文字を小文字に変換した文字列,_単語ならび) :- split(_大文字を小文字に変換した文字列,[' '],_単語ならび). 'すべての単語を整列させなさい.並び順は辞書にしたがう.順位をorderにしまいなさい'(_整列し順位付けられた単語ならび) :- 単語ならび(_単語ならび), すべての単語を整列させて順位付けする(_単語ならび,_整列し順位付けられた単語ならび). すべての単語を整列させて順位付けする(_単語ならび,_整列し順位付けられた単語ならび) :- sort(_単語ならび,_整列した単語ならび), findall([_順位,_単語],( nth1(_順位,_整列した単語ならび,_単語)), _整列し順位付けられた単語ならび). '単語を文字数の少ない分に並べなさい'(_文字数の少ない順の単語ならび) :- 単語ならび(_単語ならび), findall([_文字数,_単語],( member(_単語,_単語ならび), atom_length(_単語,_文字数)), L), sort(L,L2), findall(_単語,( member([_,_単語],L2)), _文字数の少ない順の単語ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/791 # # [1] 授業単元:C言語演習 # [2] 問題文: # ある教科の5人の得点の入った整数型配列 x[5] および2つの整数型変数max,minを引数とし # 最高点と最低点を計算する関数maxminを作成せよ。 # そして5人の数学、英語、国語の得点をキーボードからそれぞれ配列m[5], e[5], j[5]に入力すると # 各教科の最高点と最低点を計算して表示するプログラムをmaxmin関数を利用して作成せよ。 # <条件> # 引数maxおよびminは、参照によるアドレス渡しで受け取る。maxmin関数はvoid型となる。 # 'ある教科の5人の得点の入った ならび _x および2つの整数型変数_max,_minを引数とし最高点と最低点を計算する'([_得点],_得点,_得点) :- !. 'ある教科の5人の得点の入った ならび _x および2つの整数型変数_max,_minを引数とし最高点と最低点を計算する'([_得点|R],_max,_min) :- 'ある教科の5人の得点の入った ならび _x および2つの整数型変数_max,_minを引数とし最高点と最低点を計算する'(R,_max,_min), 'max,minの更新'(_得点,_max_1,_min_1,_max,_min). 'max,minの更新'(_得点,_max_1,_min_1,_max,_min) :- maxの更新(_得点,_max_1,_max), minの更新(_得点,_min_1,_min). maxの更新(_得点,_max_1,得点) :- _得点 > _max_1,!. maxの更新(_得点,_max_1,_max_1). minの更新(_得点,_min_1,得点) :- _得点 < _max_1,!. minの更新(_得点,_min_1,_min_1). '5人の数学、英語、国語の得点をキーボードから入力すると各教科の最高点と最低点を計算して表示する' :- '5人の数学、英語、国語の得点をキーボードから入力すると'(LL), '各教科の最高点と最低点を計算して表示する'(LL). '5人の数学、英語、国語の得点をキーボードから入力すると'(LL) :- '5人の'(LL), '数学、英語、国語の得点をキーボードから入力すると'(LL). '5人の'(LL) :- length(LL,5). '数学、英語、国語の得点をキーボードから入力すると'(LL) :- findall([_数学,_英語,_国語],( nth1(_,LL,_), get_split_line([',',' '],[_数学,_英語,_国語])), LL). '各教科の最高点と最低点を計算して表示する'(LL) :- nth(N,[数学,英語,国語],_教科), 教科の得点ならび(N,LL,_教科の得点ならび), 'ある教科の5人の得点の入った ならび _x および2つの整数型変数_max,_minを引数とし最高点と最低点を計算する'(L,_最高点,_最低点), writef('教科: %t 最高点: %t 最低点: %t\n',[_教科,_最高点,_最低点]), N = 3. 教科の得点ならび(N,LL,_教科の得点ならび) :- findall(_得点,( member([_数学,_英語,_国語],LL), nth1(N,[_数学,_英語,_国語],_得点)), _教科の得点ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/734 # # [1] 授業単元:プログラミング演習 # [2] 問題文 # 1)5科目の得点(整数)を入力し、合格科目(60点以上)の合計点(整数)と平均点(単精度浮動小数点数,float)を出力する。 # 2)繰り返しはfor文とwhile文どちらを使用してもよい # 3)平均点は小数点以下1桁まで出力する(計算方法に注意) # 4)全科目不合格の場合にも対応すること(その場合、平均点は出力しない) # 5)コメントを簡単に書く # 6)フローチャートを作成する # 7)可能であれば全科目の合計点と平均点も出力する # 【実行例】 # 1科目目の得点を入力してください。 80 # --->入力された得点は80点です # 2科目目の得点を入力してください。 50 # --->入力された得点は50点です # 3科目目の得点を入力してください。 100 # --->入力された得点は100点です # 4科目目の得点を入力してください。 40 # --->入力された得点は40点です # 5科目目の得点を入力してください。 70 # --->入力された得点は70点です # # 合格科目は3科目で合格科目の合計は250点です # 合格科目の平均は83.3点です # '5科目の得点(整数)を入力し、合格科目(60点以上)の合計点(整数)と平均点(単精度浮動小数点数,float)を出力する。' :- '5科目の得点(整数)を入力し'(_5科目の得点ならび), '合格科目(60点以上)の合計点(整数)と平均点(単精度浮動小数点数,float)を出力する。'(_5科目の得点ならび). '5科目の得点(整数)を入力し'(_5科目の得点ならび) :- length(_5科目の得点ならび,5), findall(_得点,( nth1(_n,_5科目の得点ならび,_), '_n科目の得点を入力する'(_n,_得点)), _5科目の得点ならび). '_n科目の得点を入力する'(_n,_得点) :- swritef(S,'%t科目の得点を入力してください。 ',[_n]), 整数を得る(S,_得点), writef('入力された得点は %t です。\n',[_得点]). '合格科目(60点以上)の合計点(整数)と平均点(単精度浮動小数点数,float)を出力する。'(_5科目の得点ならび) :- '合格科目(60点以上)の合計点(整数)を出力する'(_5科目の得点ならび), '平均点(単精度浮動小数点数,float)を出力する。'(_5科目の得点ならび). '合格科目(60点以上)の合計点(整数)を出力する'(_5科目の得点ならび) :- findall(_得点,( '合格科目(60点以上)の得点'(_5科目の得点ならび,_得点)), _合格科目の得点ならび), length(_合格科目の得点ならび,_合格科目数), sum(_合格科目の得点ならび,_合格科目の合計点), writef('合格科目数は %t で、合格科目の合計点は %t 点です。\n',[_合格科目数,_合格科目の合計点]). '合格科目(60点以上)の得点'(_5科目の得点ならび,_得点) :- member(_得点,_5科目の得点ならび), _得点 >= 60. '平均点(単精度浮動小数点数,float)を出力する。'(_5科目の得点ならび) :- 相加平均(_5科目の得点ならび,_平均点), writef('平均点は %t です。\n',[_平均点]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/720 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): # ASCIIコード表示関数 # Char型のASCII文字を第1引数として与え,第2引数に十進整数値の10または16を与えると、第1引数に対応する文字コードを十進記数法または十六記数法で画面に表示する関数を作成せよ。ただし、この関数内で用いてよいライブラリ関数はputs()のみとする。 # 例えば、printascii(‘j’,16)と実引数を指定して呼び出した場合、画面に4aを表示する。ASCII文字コードすべての範囲(0~127)に対応するように設計すること。 # このような関数をprintascii()という名前で作成した上で、キーボードから任意の1文字を入力し、対応する文字コードの十進および十六進表現をprintascii()によって出力するプログラムを作成せよ。 # なおprintascii()関数以外の場所では、入力すべき内容を指定したり1文字を読み込むためにputs()以外のライブラリ関数を用いてもよい。 # '第1引数に対応する文字コードを十進記数法または十六進記数法で画面に表示する'(_文字,_10進数_または_16進数) :- 'ASCII文字ならび'(_ASCII文字ならび), nth0(N,_ASCII文字ならび,_文字), '第1引数に対応する文字コードを十進記数法または十六進記数法で画面に表示する'(_10進数_または_16進数,N). '第1引数に対応する文字コードを十進記数法または十六進記数法で画面に表示する'(10,N) :- writef('%t',[N]),!. '第1引数に対応する文字コードを十進記数法または十六進記数法で画面に表示する'(16,N) :- D_1 is N // 16, D_2 is N mod 16, 十六進記数(D_1,_十六進記数_1), 十六進記数(D_2,_十六進記数_2), writef('0x%t%t',[_十六進記数_1,_十六進記数_2]). 十六進記数(D,D) :- D < 10, atom_number(A,D),!. 十六進記数(D,A) :- Code_2 is D + 65 - 10, char_code(A,Code_2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/707 # # 問題 # 明日が何曜日なのか表示せよ。 # % % SWI-Prologで明日はどうやって取得するのか。今日は date/1 で取得できる。 % '明日が何曜日なのか表示せよ。' :- date(date(_今日の年,_今日の月,_今日の日)), 翌日(_今日の年,_今日の月,_今日の日,_翌日の年,_翌日の月,_翌日の日), day_of_the_week(date(_翌日の年,_翌日の月,_翌日の日),_曜日番号), nth0(_曜日番号,[日曜,月曜,火曜,水曜,木曜,金曜,土曜],_曜日), writef('%t',[_曜日]). 翌日(_今日の年,12,31,_翌日の年,1,1) :- _翌日の年 is _今日の年 + 1,!. 翌日(_年,_今日の月,_今日の日,_年,_翌日の月,1) :- 月末日(_年,_今日の月,_今日の日), _翌日の月 is _今日の月 + 1,!. 翌日(_年,_月,_今日の日,_年,_月,_翌日の日) :- _翌日の日 is _今日の日 + 1. 月末日(_,2,29) :- !. 月末日(_年,2,28) :- \+(うるう年(_年)),!. 月末日(_,_今日の月,31) :- !. 月末日(_,_今日の月,30) :- member(_今日の月,[4,6,9,11]),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. うるう年(_年) :- \+(0 is _年 mod 4). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/902 # # DBMS:SQLite3.7.12.1(System.Data.SQLite1.0.81.0) # # [テーブルデータ] # # CREATE TABLE tblA( # id INTEGER, # status001 INTEGER, # status002 INTEGER, # status003 INTEGER, # status004 INTEGER, # . # . # . # status300 INTEGER # ); # # id |status001|status002|.... . |status300| # ----+--------+--------+ +--------| # 1| 0 | 0 | | 0 | # 2| 1 | 0 | | 0 | # 3| 0 | 0 | | 1 | # 4| 0 | 1 | | 1 | # 5| 0 | 0 | | 0 | # 6| 1 | 1 | | 0 | # 7| 0 | 1 | | 0 | # 8| 1 | 1 | | 1 | # 9| 1 | 1 | | 0 | # # 想定レコード数 50,000〜2000,000 # # [欲しい結果] # ------------------------------------------- # status001 | 4 //status001=1であるレコード数 # status002 | 5 //status002=1であるレコード数 # . # . # . # status300 | 3 //status300=1であるレコード数 # # 正規化に問題があるように思えますが # これらを一度のSQLで取得出来ないでしょうか。 # この結果を最も速く取得する方法を模索しています(__) # # 各フィールドの値が1である組数(_フィールド名,_組数) :- between(1,300,N), 引数ならびを生成し指定フィールドを1とする(L1), member([_フィールド名,L],L1), 指定フィールドが1の組数(L,_組数). 引数ならびを生成し指定フィールドを1とする(N,_フィールド名,L) :- フィールド名の復元(N,_フィールド名), length(L,300), nth1(N,L,1). 指定フィールドが1の組数(L,_組数) :- P =.. [tblA,_id|L], count(P,_組数), _組数 > 0. フィールド名の復元(_フィールド名_0,N,_フィールド名) :- '3要素のフィールド名識別名をならびで確保'(L), number_chars(N,Chars), append(L1,Chars,L), 変数として残った要素は0に単一化(L1), ならび要素を結合したものがフィールド名([_フィールド名_0|L],_フィールド名). '3要素のフィールド名識別名をならびで確保'(L) :- length(L,3). append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). 変数として残った要素は0に単一化([]). 変数として残った要素は0に単一化(['0'|R]) :- 変数として残った要素は0に単一化(R). ならび要素を結合したものがフィールド名(L,_フィールド名) :- atomic_list_concat(L,_フィールド名). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/693 # # 問題 # # 左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求めよ。 # 例 # 89 => 8^1 + 9^2 = 89 OK # 123 => 1^1 + 2^2 + 3^3 = 14 NG # '左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求める'(_4桁以下の数) :- '0から9999までの数'(_4桁以下の数), '4桁以下の数を数ならびに変換'(_4桁以下の数,_数ならび), 左端からn桁目の数のn乗を合計(_数ならび,_4桁の整数). '0から9999までの数'(_0から9999までの数) :- between(0,9999,_0から9999までの数). '4桁以下の数を数ならびに変換'(_4桁以下の数,_数ならび) :- '4桁以下の数を数字ならびに変換'(_4桁以下の数,_数字ならび), findall(_数,( 数字ならびの中の数字(_数字ならび,_数字), 数字を数に変換(_数字,_数)), _数ならび). '4桁以下の数を数字ならびに変換'(_4桁以下の数,_数字ならび) :- number_chars(_4桁以下の数,_数字ならび). 数字ならびの中の数字(_数字ならび,_数字) :- member(_数字,_数字ならび). 数字を数に変換(_数字,_数) :- atom_number(_数字,_数). 左端からn桁目の数のn乗を合計(_数字ならび,_4桁の整数) :- findsum(X,( 'n番目(1から始めて)の数を取り出す'(_数ならび,_n番目,_数), n乗する(_数,_n番目,X)), _4桁以下の数). n乗する(_数,_n,X) :- X is truncate(_数 ^ _n). 'n番目(1から始めて)の数を取り出す'(_数ならび,_n番目,_数) :- nth1(_n番目,_数ならび,_数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/693 # # 問題 # # 左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求めよ。 # 例 # 89 => 8^1 + 9^2 = 89 OK # 123 => 1^1 + 2^2 + 3^3 = 14 NG # '左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求める'(_4桁以下の数) :- '0から9999までの数'(_4桁以下の数), '4桁以下の数を数ならびに変換'(_4桁以下の数,_数ならび), 左端からn桁目の数のn乗を合計(_数ならび,_4桁の整数). '0から9999までの数'(_0から9999までの数) :- between(0,9999,_0から9999までの数). '4桁以下の数を数ならびに変換'(_4桁以下の数,_数ならび) :- '4桁以下の数を数字ならびに変換'(_4桁以下の数,_数字ならび), findall(_数,( 数字ならびの中の数字(_数字ならび,_数字), 数字を数に変換(_数字,_数)), _数ならび). '4桁以下の数を数字ならびに変換'(_4桁以下の数,_数字ならび) :- number_chars(_4桁以下の数,_数字ならび). 数字ならびの中の数字(_数字ならび,_数字) :- member(_数字,_数字ならび). 数字を数に変換(_数字,_数) :- atom_number(_数字,_数). 左端からn桁目の数のn乗を合計(_数字ならび,_4桁の整数) :- findsum(X,( 'n番目(1から始めて)の数を取り出す'(_数ならび,_n番目,_数), n乗する(_数,_n番目,X)), _4桁以下の数). n乗する(_数,_n,X) :- X is truncate(_数 ^ _n). 'n番目(1から始めて)の数を取り出す'(_数ならび,_n番目,_数) :- nth1(_n番目,_数ならび,_数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/693 # # 問題 # # 左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求めよ。 # 例 # 89 => 8^1 + 9^2 = 89 OK # 123 => 1^1 + 2^2 + 3^3 = 14 NG # '左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求める'(_4桁以下の数) :- between(0,9999,_4桁以下の数), number_chars(_4桁以下の数,_数字ならび), findsum(X,( nth1(_nth,_数字ならび,_数字), 'A^_n'(_数字,_nth,X)), _4桁以下の数). 'A^_n'(A,_n,X) :- atom_number(A,N), X is truncate(N ^ X). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/693 # # 問題 # # 左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求めよ。 # 例 # 89 => 8^1 + 9^2 = 89 OK # 123 => 1^1 + 2^2 + 3^3 = 14 NG # '左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求める'(_4桁以下の数) :- between(0,9999,_4桁以下の数), '4要素以下の数ならび'(_4桁以下の数,[],_4要素以下の数ならび), '左端からn桁目の数のn乗を合計したものが元の数に等しい'(_4要素以下の数ならび,_4桁以下の数). '4要素以下の数ならび'(_4要素以下の数ならび,_左端からn桁目の数のn乗を合計したもの) :- '4要素以下の数ならび'(1,_4要素以下の数ならび,0,_左端からn桁目の数のn乗を合計したもの). '4要素以下の数ならび'(_nth,_4要素以下の数ならび,S,S) :- _nth > 4,!. '4要素以下の数ならび'(_nth_1,_4要素以下の数ならび,S_1,S) :- nth1(_nth_1,_4要素以下の数ならび,X), S_2 is S_1 + truncate(X ^ _nth1), _nth_2 is _nth_1 + 1, '4要素以下の数ならび'(_nth_1,_4要素以下の数ならび,S_2,S). '4要素以下の数ならび'(0,L,L) :- !. '4要素以下の数ならび'(N,L_1,L) :- M is N mod 10, N_1 is N // 10, '4要素以下の数ならび'(N_1,[M|L_1],L). % 以下のサイトは # # 数値を数字のならびに変換する # ?- number_numbers(324,[3,2,4]). # 上位桁から数を取り出す(_整数,_何桁目,_上位桁から取り出された数) :- number_numbers(_整数,_数ならび), nth1(_何桁目,_数ならび,_上位桁から取り出された数). number_numbers(_数値,Numbers) :- number_chars(Number,Chars), findall(N,( member(A,Chars), number_numbers_2(A,N)), Numbers). number_numbers_2(A,N) :- A @>= '0', A @=< '9', atom_number(A,N),!. number_numbers_2(A,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/607 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # 品目1から品目4までの売値と売り上げ個数を、それぞれa[4]={1300, 2000, 2500, 3300};, b[4]={25, 18, 8, 5}; # と初期化する。但し上記の二つの配列の要素番号0, 1, 2, 3のデータはそれぞれ品目1から4のものに対応する。 # このとき、品目別の売上高を求めるプログラムをポインタ配列を用いて作成せよ。 # 品目(品目1). 品目(品目2). 品目(品目3). 品目(品目4). 売値(品目1,1300). 売値(品目1,2000). 売値(品目3,2500). 売値(品目4,3300). 売り上げ個数(品目1,25). 売り上げ個数(品目2,18). 売り上げ個数(品目3,8). 売り上げ個数(品目4,5). '品目1から品目4までの売値と売り上げ個数を、それぞれa[4]={1300, 2000, 2500, 3300};, b[4]={25, 18, 8, 5};と初期化する。但し上記の二つの配列の要素番号0, 1, 2, 3のデータはそれぞれ品目1から4のものに対応する。このとき、品目別の売上高を求める'(_品目,_売上高) :- 品目ならびを得る(_品目ならび), 売値ならびを得る(_品目ならび,_売値ならび), 売り上げ個数ならびを得る(_品目ならび,_売り上げ個数ならび), 品目別売上高を求める(_品目ならび,_売値ならび,_売り上げ個数ならび,_品目,_売上高). 品目ならびを得る(_品目ならび) :- findall(_品目,( 品目(_品目)), _品目ならび). 売値ならびを得る(_品目ならび,_売値ならび) :- findall(_売値,( member(_品目,_品目ならび), 売値(_品目,_売値)), _売値ならび). 売り上げ個数ならびを得る(_品目ならび,_売り上げ個数ならび) :- findall(_売り上げ個数,( member(_品目,_品目ならび), 売り上げ個数(_品目,_売り上げ個数)), _売り上げ個数ならび). 品目別売上高を求める(_品目ならび,_売値ならび,_売り上げ個数ならび,_品目,_売上高) :- between(0,3,Nth0), nth0(Nth0,_品目ならび,_品目), 売上高を求める(Nth0,_売値ならび,_売り上げ個数ならび,_売上高). 売上高を求める(Nth0,_売値ならび,_売り上げ個数ならび,_売上高) :- nth0(Nth0,_売値ならび,_売値), nth0(Nth0,_売り上げ個数ならび,_売り上げ個数), _売り上げ高 is _売値 * _売り上げ個数. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/496 # # [1] 授業単元: 多次元配列 # [2] 問題文(含コード&リンク): 横8マス×縦8マスの盤面がある。プログラムを実行すると20個の石が盤面上にランダムに置かれる、そしてキーボードから盤面上の位置を入力すると、その場所に石があるかどうかを判定するプログラムを書きなさい。 #                わかりやすいインターフェースにすること、詳細は考えなさい。 #                盤面は二次元配列を使うこと。 # '横8マス×縦8マスの盤面がある。プログラムを実行すると20個の石が盤面上にランダムに置かれる、そしてキーボードから盤面上の位置を入力すると、その場所に石があるかどうかを判定する'(_盤面,_判定) :- '横8マス×縦8マスの盤面がある'(_盤面), プログラムを実行すると20個の石が盤面上にランダムに置かれる(_盤面), 'そしてキーボードから盤面上の位置を入力すると、その場所に石があるかどうかを判定する'(_盤面,_判定). '横8マス×縦8マスの盤面がある'(_盤面) :- length(_盤面,8), findall(L,( member(L,_盤面), length(L,8)), _盤面). プログラムを実行すると20個の石が盤面上にランダムに置かれる(_盤面) :- length(_石ならび,20), all(_石ならび,石), 盤面上にランダムに置かれる(_石ならび,_盤面). 盤面上にランダムに置かれる([],_盤面). 盤面上にランダムに置かれる([_石|R],_盤面) :- 盤面上にランダムに(_盤面), 盤面上にランダムに置かれる(R,_盤面). 盤面上にランダムに置かれる(_石ならび,_盤面) :- 盤面上にランダムに置かれる(_石ならび,_盤面). 盤面上にランダムに(_盤面) :- ランダムに(_行位置_0_起点,_列位置_0_起点), 盤面上に(_行位置_0_起点,_列位置_0_起点,_盤面). ランダムに(_行位置_0_起点,_列位置_0_起点) :- _行位置_0_起点 is random(8), _列位置_0_起点 is random(8). 盤面上に(_行位置_0_起点,_列位置_0_起点,_盤面) :- nth0(_行位置_0_起点,_盤面,_行), nth0(_列位置_0_起点,_行,_升目), var(_升目), _石 = _升目,!. 'そしてキーボードから盤面上の位置を入力すると、その場所に石があるかどうかを判定する'(_盤面,_判定) :- キーボードから盤面上の位置を入力する(_行位置,_列位置), その場所に石があるかどうかを判定する(_盤面,_行位置,_列位置,_判定). キーボードから盤面上の位置を入力する(_行位置,_列位置) :- 整数を得る(行位置,(_行位置>=1,_行位置=<8),_行位置), 整数を得る(列位置,(_列位置>=1,_列位置=<8),_列位置),!. その場所に石があるかどうかを判定する(_盤面,_行位置,_列位置,_判定) :- nth1(_行位置,_盤面,_行), nth1(_列位置,_行,_升目), 判定する(_升目,_判定). 判定する(_升目,石があります) :- var(_升目),!. 判定する(_升目,石はありません) :- \+(var(_升目)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/787 # # id5とid10という2つの情報しかないのですが # id5がもつc1とid10がもつc1を交換するとき # どういうクエリーをかけばよいでしょうか? # # 1.select c1 from t where id=5 or id=10 order by id # 2.begin transaction # 3.update t set c1=? where id=5 (?は1でとったid10のc1値) # 4.update t set c1=? where id=10 (?は1でとったid5のc1値) # 5.commit # # 自分の能力ではこんな手順が限界ですが # サブクエリーを駆使したらupdate1文でいけたりするのでしょうか? # もしできたらどんな感じの文になるか教えていただきたいです # 'id5とid10という2つの情報しかないのですがid5がもつc1とid10がもつc1を交換する' :- '引数の数,c1の位置,idの位置'(_引数の数,_c1の位置,_idの位置), idが5の処理(_引数の数,_c1の位置,_idの位置), idが10の処理(_引数の数,_c1の位置,_idの位置), 交換する(L0_1,L0_2,R1,R2). '引数の数,c1の位置,idの位置'(_引数の数,_c1の位置,_idの位置) :- findmax(_位置,( テーブル定義(t,_位置,_), _引数の数), テーブル定義(t,_c1の位置,c1), テーブル定義(t,_idの位置,id). idが5の処理(_引数の数,_c1の位置,_idの位置,L0_1,R1) :- 'idが5のデータを一旦削除する'(_引数の数,_c1の位置,_idの位置,L1), 'L1をc1の前と後に分解'(L1,L0_1,R1). idが5のデータを一旦削除する(_引数の数,_c1の位置,_idの位置,L1) :- length(L1,_引数の数), P =.. [t|L1], nth1(_c1の位置,L1,_c1_1), nth1(_idの位置,L1,5), retract(P). idが10の処理(_引数の数,_c1の位置,_idの位置,L0_2,R2) :- idが10のデータを一旦削除する(_引数の数,_c1の位置,_idの位置,L2), 'L1をc1の前と後に分解'(L2,L0_2,R2). idが10のデータを一旦削除する(_引数の数,_c1の位置,_idの位置,L2) :- length(L2,_引数の数), P =.. [t|L2], nth1(_c1の位置,L2,_c1_2), nth1(_idの位置,L2,10), retract(P). 'L1をc1の前と後に分解'(L1,L0_1,R1) :- length([_|L0_1],_c1の位置), append(L0_1,[A|R1],L1). 交換して定義する(L0_1,L0_2,R1,R2) :- append(L0_1,[B|R1],L1), append(L0_2,[A|R2],L2), P_1 =.. [t|L1], P_2 =.. [t|L2], asserta(P_1), asserta(P_2). % 以下のサイトは # # 5要素のリストvxの各要素に数値を入力した後、任意の要素番号n(1=<_n=<5)を入力し、 # その要素番号nに格納している数値を表示させる。 # '5要素のリストvxの各要素に数値を入力した後、任意の要素番号n(1=<_n=<5)を入力し、その配列要素が格納している数値を表示させる' :- '5要素のリストvxの各要素に数値を入力した後'(_vx), '任意の要素番号n(1=<_n=<5)を入力し、その要素番号nに格納している数値を表示させる'(_vx). '5要素のリストvxの各要素に数値を入力した後'(_vx) :- '5要素のリストvx'(_vx), 各要素に数値を入力した後(_vx). '5要素のリストvx'(_vx) :- length(_vx,5). 各要素に数値を入力した後([]). 各要素に数値を入力した後([_数|R]) :- 数を得る(数値,_数), 各要素に数値を入力した後(R). '任意の要素番号n(1=<_n=<5)を入力し、その要素番号nに格納している数値を表示させる'(_vx) :- '任意の要素番号n(1=<_n=<5)を入力し'(_n), その要素番号nに格納している数値を(_n,_vx,_格納している数値), 表示させる(_n,_格納している値). '任意の要素番号n(1=<_n=<5)を入力し'(_n) :- 整数を得る('任意の要素番号n(1=<_n=<5)',(_n>=1,_n=<5),_n). その要素番号nに格納している数値を(_n,_vx,_格納している数値) :- nth1(_n,_vx,_格納している数値). 表示させる(_n,_格納している値) :- writef('要素番号[%t]の格納している値は %t です。\n',[_n,_格納している値]). % 数を得る/2 % 整数を得る/3 % 以下のサイトは # # 5要素のリストvxの各要素に数値を入力した後、任意の要素番号n(1=<_n=<5)を入力し、 # その要素番号nに格納している数値を表示させる。 # '5要素のリストvxの各要素に数値を入力した後、任意の要素番号n(1=<_n=<5)を入力し、その配列要素が格納している数値を表示させる' :- '5要素のリストvxの各要素に数値を入力した後'(_vx), '任意の要素番号n(1=<_n=<5)を入力し、その要素番号nに格納している数値を表示させる'(_vx). '5要素のリストvxの各要素に数値を入力した後'(_vx) :- '5要素のリストvx'(_vx), 各要素に数値を入力した後(_vx). '5要素のリストvx'(_vx) :- length(_vx,5). 各要素に数値を入力した後(_vx) :- findall(_数値,( member(_,_vx), 数を得る(数値,_数)), _vx). '任意の要素番号n(1=<_n=<5)を入力し、その要素番号nに格納している数値を表示させる'(_vx) :- '任意の要素番号n(1=<_n=<5)を入力し'(_n), その要素番号nに格納している数値を(_n,_vx,_格納している数値), 表示させる(_n,_格納している値). '任意の要素番号n(1=<_n=<5)を入力し'(_n) :- 整数を得る('任意の要素番号n(1=<_n=<5)',(_n>=1,_n=<5),_n). その要素番号nに格納している数値を(_n,_vx,_格納している数値) :- nth1(_n,_vx,_格納している数値). 表示させる(_n,_格納している値) :- writef('要素番号[%t]の格納している値は %t です。\n',[_n,_格納している値]). % 数を得る/2 % 整数を得る/3 % 以下のサイトは # # 5要素のならび_vxの各要素に数値を入力した後、 # 任意の要素番号(1=<_要素番号=<5)を入力し、その要素番号に格納している数値を表示させる。 # '5要素のならび_vxの各要素に数値を入力した後、任意の要素番号(1=<_要素番号=<5)を入力し、その要素番号に格納している数値を表示させる' :- '5要素のならび_vxの各要素に数値を入力した後'(_vx), '任意の要素番号(1=<_要素番号=<5)を入力し、その要素番号に格納している数値を表示させる'(_vx). '5要素のならび_vxの各要素に数値を入力した後'(_vx) :- '5要素のならび_vx'(_vx), 各要素に数値を入力した後(_vx). '5要素のならび_vx'(_vx) :- length(_vx,5). 各要素に数値を入力した後(_vx) :- findall(_数値,( member(_,_vx), 数を得る(数値,_数)), _vx). '任意の要素番号(1=<_要素番号=<5)を入力し、その要素番号に格納している数値を表示させる'(_vx) :- '任意の要素番号(1=<_要素番号=<5)を入力し'(_任意の要素番号), その要素番号に格納している数値を(_任意の要素番号,_vx,_格納している数値), 表示させる(_任意の要素番号,_格納している値). '任意の要素番号(1=<_要素番号=<5)を入力し'(_任意の要素番号) :- 整数を得る('任意の要素番号(1=<_要素番号=<5)',(_任意の要素番号>=1,_任意の要素番号=<5),_任意の要素番号). その要素番号に格納している数値を(_任意の要素番号,_vx,_格納している数値) :- nth1(_任意の要素番号,_vx,_格納している数値). 表示させる(_任意の要素番号,_格納している値) :- writef('要素番号[%t]の格納している値は %t です。\n',[_任意の要素番号,_格納している値]). % 数を得る/2 % 整数を得る/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/197 # # [1] 授業単元:プログラミングC # [2] 問題文(含コード&リンク): # 配列vx[5]の各要素に数値をscanfを用いて入力した後、 # ポインタptrを用いて任意の要素番号を指し、 # その配列要素が格納している数値を表示せよ。 # # ※ttp://kie.nu/dZp % % 問題文にある「配列」はPrologの仕様にはないため、以下のように問題を変更する。 % % 5要素のならび_vxの各要素に数値を入力した後、 % 任意の要素番号(1=<_要素番号=<5)を入力し、その要素番号に格納している数値を表示させる。 % '5要素のならび_vxの各要素に数値を入力した後、任意の要素番号(1=<_要素番号=<5)を入力し、その要素番号に格納している数値を表示させる' :- '5要素のならび_vxの各要素に数値を入力した後'(_vx), '任意の要素番号(1=<_要素番号=<5)を入力し、その要素番号に格納している数値を表示させる'(_vx). '5要素のならび_vxの各要素に数値を入力した後'(_vx) :- '5要素のならび_vx'(_vx), 各要素に数値を入力した後(_vx). '5要素のならび_vx'(_vx) :- length(_vx,5). 各要素に数値を入力した後(_vx) :- findall(_数値,( member(_,_vx), 数を得る(数値,_数)), _vx). '任意の要素番号(1=<_要素番号=<5)を入力し、その要素番号に格納している数値を表示させる'(_vx) :- '任意の要素番号(1=<_要素番号=<5)を入力し'(_任意の要素番号), その要素番号に格納している数値を(_任意の要素番号,_vx,_格納している数値), 表示させる(_任意の要素番号,_格納している値). '任意の要素番号(1=<_要素番号=<5)を入力し'(_任意の要素番号) :- 整数を得る('任意の要素番号(1=<_要素番号=<5)',(_任意の要素番号>=1,_任意の要素番号=<5),_任意の要素番号). その要素番号に格納している数値を(_任意の要素番号,_vx,_格納している数値) :- nth1(_任意の要素番号,_vx,_格納している数値). 表示させる(_任意の要素番号,_格納している値) :- writef('要素番号[%t]の格納している値は %t です。\n',[_任意の要素番号,_格納している値]). % 数を得る/2 % 整数を得る/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/136 # # [1] 授業単元: 情報B # [2] 問題文: アルファベット1文字目は1文字、2文字目は2文字、n文字目はn文字…分ずれるシーザー暗号を暗号・復号化それぞれ作りなさい。 # アルファベット(['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). 'アルファベット1文字目は1文字、2文字目は2文字、n文字目はn文字…分ずれるシーザー暗号を暗号化する'(_文字列,_暗号化した文字列) :- findall(_暗号化した文字,( sub_atom(_文字列,S,1,_,_文字), S_2 is S + 1, 文字の暗号化(S_2,_文字,_暗号化した文字)), _暗号化した文字ならび), atomic_list_concat(_暗号化した文字ならび,_暗号化した文字列). 'アルファベット1文字目は1文字、2文字目は2文字、n文字目はn文字…分ずれるシーザー暗号を復号化する'(_文字列,_復号化した文字列) :- findall(_暗号化した文字,( sub_atom(_文字列,S,1,_,_文字), S_2 is S + 1, 文字の復号化(S_2,_文字,_暗号化した文字)), _暗号化した文字ならび), atomic_list_concat(_暗号化した文字ならび,_暗号化した文字列). 文字の暗号化(S,_文字,_暗号化した文字) :- アルファベット(L), nth1(Nth,L,_文字), ならびの回転(左方向,S_2,L,L1), nth1(Nth,L1,_暗号化した文字),!. 文字の復号化(S,_文字,_復号化した文字) :- アルファベット(L), nth1(Nth,L,_文字), ならびの回転(右方向,S_2,L,L1), nth1(Nth,L1,_復号化した文字),!. % ならびの回転/4 % 以下のサイトは # # リストから部分リストを切り出す述語 部分ならび/8 # member/2,append/3のスーパー版 # 中間のリストにだけ開始位置(1から数えて)が付いているから注意 # 部分ならび(_対象ならび,_長さ_1,_部分ならび_1,_開始nth,_長さ_2,_部分ならび_2,_長さ_3,_残りならび_3) :- append(_ならび_1,_ならび_2,_ならび_3,_対象ならび), length(_ならび_1,_長さ_1), length(_ならび_2,_長さ_2), length(_ならび_3,_長さ_3), _開始Nth is _長さ_1 + 1. append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). % ?- 部分ならび([臨,兵,闘,者,皆,陣,列,在,前],_,_,Nth,6,L,_,_). % Nth = 1, L = [臨,兵,闘,者,皆,陣]; % Nth = 2, L = [兵,闘,者,皆,陣,列]; % Nth = 3, L = [闘,者,皆,陣,列,在]; % Nth = 4, L = [者,皆,陣,列,在,前] % % ?- 部分ならび([臨,兵,闘,者,皆,陣,列,在,前],Len1,_,Nth,Len2,[闘,者,皆,陣,列,在],Len3,_). % Len1 = 2, Nth = 3, Len2 = 6, Len3 = 1 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/54 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/Q5HCQPvq # 上記のプログラムを参考にしてa君、b君、c君の5教科(英語、数学、国語、理科、社会)の試験の得点をそれぞれ # a[5]={55,32,67,61,77};,b[5]={74,80,56,78,42};,c[5]={38,67,78,62,82}; と初期化する。 # 但し上記の3つの配列の要素番号0,1,2,3,4の得点は、それぞれ英語、数学、国語、理科、社会の得点に対応する。 # このとき、教科別の3人の平均点を求めるプログラムをポインタ配列を用いて作成せよ。 # 'a君、b君、c君の5教科(英語、数学、国語、理科、社会)の試験の得点をそれぞれ a[5]={55,32,67,61,77};,b[5]={74,80,56,78,42};,c[5]={38,67,78,62,82}; と初期化する。' :- '5教科を定義する'([英語,数学,国語,理科,社会]), 得点を定義する(a,[英語,数学,国語,理科,社会],[55,32,67,61,77]), 得点を定義する(b,[英語,数学,国語,理科,社会],[74,80,56,78,42]), 得点を定義する(c,[英語,数学,国語,理科,社会],[38,67,78,62,82]). '5教科を定義する'(_教科ならび) :- forall(nth0(_,_教科ならび,_教科),assertz(教科(_教科))). 得点を定義する(_,[],[]). 得点を定義する(_君,[_科目|R1],[_得点|R2]) :- assertz(得点(_君,_科目,_得点)), 得点を定義する(_君,R1,R2). 教科別の3人の平均点を求める(_教科,_3人の平均点) :- 教科別の(_教科), '3人の平均点を求める'(_教科,_3人の平均点). 教科別の(_教科) :- 教科(_教科). '3人の平均点を求める'(_教科,_3人の平均点) :- '3人の合計点を求める'(_教科,_3人の合計点), _平均点 is _3人の合計点 / 3. '3人の合計点を求める'(_教科,_3人の合計点) :- findall(_得点,得点(_,_教科,_得点),_得点ならび), sum_list(_得点ならび,_3人の合計点). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/423 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # 100点満点の試験の学生10人の得点データをキーボードから # 整数型配列data[10]に入力すると、最高点とその要素番号が出力されるプログラムを作成。 # 同点はないものとする。 # '100点満点の試験の学生10人の得点データをキーボードから入力すると、最高点とその要素番号が出力されるプログラムを作成。同点はないものとする。' :- '100点満点の試験の学生10人の得点データをキーボードから入力すると'([],_学生10人の得点データ), '最高点とその要素番号が出力される'(_学生10人の得点データ). '100点満点の試験の学生10人の得点データをキーボードから入力すると'(_学生10人の得点データ) :- length(_学生10人の得点データ,10), findall(_得点,( append(L0,[_得点|R],_学生10人の得点データ), '100点満点の得点の入力'(L0,_得点)), _学生10人の得点データ). '最高点とその要素番号が出力される'(_学生10人の得点データ) :- max(_学生10人の得点データ,_最高点), nth1(_要素番号,_学生10人の得点データ,_最高点), writef('最高点 = %t点, その要素番号(1起点) = %t\n',[_最高点,_要素番号]). '100点満点の得点(同点はないものとする)の入力'(L,L) :- length(L,10),!. '100点満点の得点(同点はないものとする)の入力'(_既に入力された得点ならび,L) :- length([_|_既に入力された得点ならび],_何人目), writef('%t人目の得点を入力してください : ',[_何人目]), get_line(Line), '100点満点の得点(同点はないものとする)の入力診断'(Line,_既に入力された得点ならび,_得点), append(_既に入力された得点ならび,[_得点],_入力された得点を加えたならび), '100点満点の得点(同点はないものとする)の入力'(_入力された得点を加えたならび,L),!. '100点満点の得点の入力'(_既に入力された得点ならび,L) :- '100点満点の得点の入力'(_既に入力された得点ならび,L). '100点満点の得点(同点はないものとする)の入力診断'(Line,_既に入力された得点ならび,_得点) :- atom_to_term(Line,_得点,_), integer(_得点), _得点 =< 100,!, 同点はないものとする(_得点,_既に入力された得点ならび). '100点満点の得点(同点はないものとする)の入力診断'(Line,_得点) :- writef('入力された%tからは適切な得点が得られません。再入力をお願いします。\n',[Line]), fail. 同点はないものとする(_得点,_既に入力された得点ならび) :- \+(member(_得点,_既に入力された得点ならび)),!. 同点はないものとする(_得点,_既に入力された得点ならび) :- writef('得点%tは既に入力されています。別の得点を入力しなおしてください。\n',[_得点]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/423 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # 100点満点の試験の学生10人の得点データをキーボードから # 整数型配列data[10]に入力すると、最高点とその要素番号が出力されるプログラムを作成。 # 同点はないものとする。 # '100点満点の試験の学生10人の得点データをキーボードから入力すると、最高点とその要素番号が出力されるプログラムを作成。同点はないものとする。' :- '100点満点の試験の学生10人の得点データをキーボードから入力すると'(_学生10人の得点データ), '最高点とその要素番号が出力される'(_学生10人の得点データ). '100点満点の試験の学生10人の得点データをキーボードから入力すると'(_学生10人の得点データ) :- length(_学生10人の得点データ,10), findall(_得点,( append(L0,[_得点|R],_学生10人の得点データ), '100点満点の得点の入力'(L0,_得点)), _学生10人の得点データ). '最高点とその要素番号が出力される'(_学生10人の得点データ) :- max(_学生10人の得点データ,_最高点), nth1(_要素番号,_学生10人の得点データ,_最高点), writef('最高点 = %t点, その要素番号(1起点) = %t\n',[_最高点,_要素番号]). '100点満点の得点の入力'(L0,_得点) :- length([_|L0],_何人目), writef('%t人目の得点を入力してください : ',[_何人目]), get_line(Line), '100点満点の得点の入力診断'(Line,_得点),!. '100点満点の得点の入力'(L0,_得点) :- '100点満点の得点の入力'(L0,_得点). '100点満点の得点の入力診断'(Line,_得点) :- atom_to_term(Line,_得点,_), integer(_得点), _得点 =< 100,!. '100点満点の得点の入力診断'(Line,_得点) :- writef('入力された%tからは適切な得点が得られません。再入力をお願いします。\n',[Line]), fail. % % この一般的な入力プログラムはこの課題には適さない。 % バックトラックしての入力はこれまでどのような入力があったかを % 検査することができない。 % この課題では同点はないものとするという条件があり、これを入力時に % 検査する為には再帰的な制御、すなわち集約が必要になる。 % 以下のサイトは # 出典:: 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/1332279659/101 # # a, b, c, d, e, zの昇順ソートされた整数配列があります。 # それぞれ、1000万要素程度あり、mallocで領域を確保してあります。 # # a〜eの配列のそれぞれの要素から、zに含まれている要素を抜いてから、 # 全て結合してソートして出力したいです。 # どういった方法が一番早いでしょうか? # # それぞれの配列で # aとz # bとz # cとzと順番に、それぞれでa[0]とz[0]から逐一比較していって、 # 一致しない要素をメモリに持っておき、 # 最後に結合して、ソート # というのを考えましたがこれが最良なのかどうか…朝からずっと悩んでいます。 # 'a〜eの配列のそれぞれの要素から、zに含まれている要素を抜いてから、全て結合してソートして出力する' :- 'a〜eの配列のそれぞれの要素から、zに含まれている要素を抜いてから'(_z,_a_1,_b_1,_c_1,_d_1,_e_1,_a_2,_b_2,_c_2,_d_2,_e_2), '全て結合してソートして出力する'(_a_2,_b_2,_c_2,_d_2,_e_2). 'a〜eの配列のそれぞれの要素から、zに含まれている要素を抜いてから'(_z,_a_1,_b_1,_c_1,_d_1,_e_1,_a_2,_b_2,_c_2,_d_2,_e_2,L) :- 'zに含まれている要素を抜いてから'(_z,_a_1,_a_2), 'zに含まれている要素を抜いてから'(_z,_b_1,_b_2), 'zに含まれている要素を抜いてから'(_z,_c_1,_c_2), 'zに含まれている要素を抜いてから'(_z,_d_1,_d_2), 'zに含まれている要素を抜いてから'(_z,_e_1,_e_2),!. 'zに含まれている要素を抜いてから'(_,[],[]) :-!. 'zに含まれている要素を抜いてから'([],L,L) :- !. 'zに含まれている要素を抜いてから'([Z|R],[Z|R1],R2) :- 'zに含まれている要素を抜いてから'([Z|R],R1,R2). 'zに含まれている要素を抜いてから'([Z|R],[A|R1],R2) :- Z @< A, 'zに含まれている要素を抜いてから'(R,[A|R1],R2). 'zに含まれている要素を抜いてから'([Z|R],[A|R1],R2) :- Z @> A, 'zに含まれている要素を抜いてから'([Z|R],R1,R2). '全て結合してソートして出力する'(_a_2,_b_2,_c_2,_d_2,_e_2) :- '全て結合してソートして'(_a_2,_b_2,_c_2,_d_2,_e_2,L), 出力する(L). '全て結合してソートして'([],[],[],[],[],[]). '全て結合してソートして'(_a_1,_b_1,_c_1,_d_1,_e_1,[Min|R]) :- 最小値と残りならび(_a_1,_b_1,_c_1,_d_1,_e_1,Min,_a_2,_b_2,_c_2,_d_2,_e_2), '全て結合してソートして'(_a_2,_b_2,_c_2,_d_2,_e_2,R). 最小値と残りならび(_a,_b,_c,_d,_e,Min,R,_b,_c,_d,_e) :- 先頭が最小(_a,_b,_c,_d,_e,1,Min,R),!. 最小値と残りならび(_a,_b,_c,_d,_e,Min,_a,Min,_c,_d,_e) :- 先頭が最小(_a,_b,_c,_d,_e,2,Min,R),!. 最小値と残りならび(_a,_b,_c,_d,_e,Min,_a,_b,R,_d,_e) :- 先頭が最小(_a,_b,_c,_d,_e,3,Min,R),!. 最小値と残りならび(_a,_b,_c,_d,_e,Min,_a,_b,_c,R,_e) :- 先頭が最小(_a,_b,_c,_d,_e,4,Min,R),!. 最小値と残りならび(_a,_b,_c,_d,_e,Min,_a,_b,_c,_d,R) :- 先頭が最小(_a,_b,_c,_d,_e,5,Min,R),!. 先頭が最小(_a,_b,_c,_d,_e,Nth,Min,R) :- 選択(_a,A,Ra), 選択(_b,B,Rb), 選択(_c,C,Rc), 選択(_d,D,Rd), 選択(_e,E,Re), 先頭が最小(1,[A,B,C,D,E],1,A,Nth,Min), nth1(Nth,[Ra,Rb,Rc,Rd,Re],R). 選択([_先頭|_残りならび],_先頭,_残りならび) :- !. 選択([],[],[]) :- !. 先頭が最小(_,[],Nth,Min,Nth,Min) :- !. 先頭が最小(N,[A|R],Nth_1,Min_1,Nth,Min) :- A @< Min_1, N_2 is N + 1, 先頭が最小(N_2,R,N,A,Nth,Min). 先頭が最小(N,[A|R],Nth_1,Min_1,Nth,Min) :- A @>= Min_1, N_2 is N + 1, 先頭が最小(N_2,R,Nth_1,Min_1,Nth,Min). 出力する([]) :- !. 出力する([N|R]) :- writef('%t ',[N]), 出力する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/666 # # SQLite3を使っています。 # # カラムがなかったらinsert # あったらupdateしたいのですが、 # どういうSQLをかけばいいのでしょうか? # # insert into t1(c1, c2) values("hoge",10) # update t1 set c2=10 WHERE c1="hoge" # このときc1はuniqueです。 # # よろしくお願いします。 # # 'カラムがなかったらinsert あったらupdateしたい'(_テーブル,_カラムならび,_鍵カラム,_鍵値) :- findall(_カラム,( テーブル定義(_テーブル,_番目,_カラム)), L1), 鍵値をセットする(_テーブル,_鍵カラム,_鍵値,P), 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび). 鍵値をセットする(_テーブル,L1,_鍵カラム,_鍵値,P) :- length(L1,Len), length(L2,Len), nth1(Nth,L1,_鍵カラム), nth1(Nth,L2,_鍵値), P =.. [_テーブル|L2]. 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび) :- call(P),!, ( retract(P), Q =.. [_テーブル|_カラムならび], asserta(Q), fail; true). 'カラムがなかったらinsert あったらupdateしたい'(_,_テーブル,_カラムならび) :- Q =.. [_テーブル|_カラムならび], asserta(Q). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/557 # # 初めて書き込みます。よろしくお願い致します。固定長バイトの文字列の中の一部を抜き出すところがわかりませんでした。 # 1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 文字列A(固定長150バイト)一万行以上と文字列B(CSV)一万行以上の # それぞれのテキストデータ・ファイルがある。 # 文字列A の5文字目から6文字分と文字列Bの2カラム目の4文字目から6文字分を # 比較し、 # 同じなら、文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を # 置き換える。 # 文字列Bの4カラム目が50バイト以下なら " "空白で埋める。 # 50バイトより大きい場合50バイトまでの大きさを対象とする。 # # 置き換え対象領域は日本語全角漢字含む文字列となる。 # 文字列Aの対象領域は2バイトx20文字+1バイト10文字で整形されている。 # 文字列AはSolaris10上のファイル。文字列BはエクセルファイルをCSV保存してFFFTPでSolaris10へコピーしたもの。 # 文字コード:文字列A(EUC-JP)、文字列B(sjis2eucで変換) # # 1ー77バイトが1バイト、77ー126が変換対象。126ー150が1バイトです。 '文字列A(固定長150バイト)一万行以上と文字列B(CSV)一万行以上のそれぞれのテキストデータ・ファイルがある。' :- get_lines('文字列A',Lines1), get_lines('文字列B',Lines2), '文字列Aの全行を置換する'(Lines1,Lines2,Lines3), 'Lines3を文字列Aに書き戻す'(Lines3,_文字列A),!. '文字列Aの全行を置換する'([],_,[]) :- !. '文字列Aの全行を置換する'([_文字列A|R1],Lines2,[_置換した文字列|R3]) :- 'Lines2を検索して文字列Aを置換する'(_文字列A,Lines2,_置換した文字列), '文字列Aの全行を置換する'(R1,Lines2,R3). 'Lines2を検索して文字列Aを置換する'(_文字列A,[],_文字列A) :- !. 'Lines2を検索して文字列Aを置換する'(_文字列A,[_文字列B|R2],_置換した文字列) :- '文字列Aを一行の置換'(_文字列A,_文字列B,_置換した文字列),!. 'Lines2を検索して文字列Aを置換する'(_文字列A,[_|R2],_置換した文字列) :- 'Lines2を検索して文字列Aを置換する'(_文字列A,R2,_置換した文字列),!. '文字列Aを一行の置換'(_文字列A,_文字列B,_置換した文字列) :- split(_文字列B,[' ',','],L), '文字列A の5文字目から6文字分と文字列Bの2カラム目の4文字目から6文字分を比較し同じなら'(_文字列A,L), '文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を置き換える'(_文字列A,L,_置換された文字列). '文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を置き換える'(_文字列A,L,_置換された文字列) :- sub_byte_atom(_文字列A,0,76,_,S1), sub_byte_atom(_文字列A,126,_,0,S3), '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2), concat_atom([S1,S2,S3],_置換された文字列),!. '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2) :- '文字列Bの4カラム目が'(L,S2_1), '50バイト以下なら'(S2_1), '" "空白で埋める'(S2_1,S2),!. '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2) :- nth1(4,L,S_1), sub_byte_atom(S_1,0,50,_,S2). '文字列Bの4カラム目が50バイト以下なら'(L) :- nth1(4,L,S_1), atom_byte_length(S_1,_長さ), _長さ =< 50,!. '" "空白で埋める'(S2_1,S2) :- length(L2,50), atom_byte_codes(S2_1,L_1), append(L_1,_,L2), 変数を空白に置換(L2), atom_byte_codes(S2,L2),!. 変数を空白に置換([]). 変数を空白に置換([' '|R]) :- 変数を空白に置換(R),!. 変数を空白に置換([A|R]) :- 変数を空白に置換(R). 'Lines3を文字列Aに書き戻す'(Lines3) :- put_lines('文字列A',Lines3). atom_byte_codes(Atom,ByteCodes) :- atom(Atom), atom_codes(Atom,Codes), バイトに分解(Codes,ByteCodes),!. atom_byte_codes(Atom,ByteCodes) :- \+(atom(Atom)), 'ByteCodes2Codes'(ByteCodes,Codes), atom_codes(Atom,Codes),!. 'ByteCodes2Codes'([],[]). 'ByteCodes2Codes'([A,B|R1],[C|R2]) :- A > 127, B > 127, C is 256 * A + B, 'ByteCodes2Codes'(R1,R2),!. 'ByteCodes2Codes'(R1,R2) :- 'ByteCodes2Codes'(R1,R2),!. atom_byte_length(Atom,ByteLength) :- atom_codes(_文字列,Codes), バイトに分解(Codes,ByteCodes), length(ByteCodes). atom_byte_codes(Atom,ByteCodes) :- atom_codes(Atom,Codes), バイトに分解(Code,ByteCodes). sub_byte_atom(_文字列,_スタートバイト位置,_バイト数,_残りバイト,_副文字列) :- atom_codes(_文字列,Codes), バイトに分解(Codes,ByteCodes), sub_byte_list(ByteCodes,_スタートバイト位置,_バイト数,_残りバイト,SubList), atom_code(_副文字列,SubList). sub_byte_list(ByteCodes,_スタートバイト位置,_バイト数,_残りバイト,SubList) :- length(L0,_スタートバイト位置), length(L1,_バイト数), append(L0,SubList,L2,ByteCodes), length(L2,_残りバイト),!. バイトに分解([],[]). バイトに分解([A|R1],[B,C|R2]) :- A > 255, B is A // 256, C is A mod 256, バイトに分解(R1,R2),!. バイトに分解([A|R1],[A|R2]) :- バイトに分解(R1,R2). % 以下のサイトは # # localtime/8 localtime/9 を定義する # localtime(_年,_月,_日,_曜日,_累計日数,_時,_分,_秒) :- get_time(Time), グリニッヂ時と地域時間の差(_グリニッヂ時との時間差), _地域秒 is truncate(Time) + _グリニッヂ時との時間差, localtime(_地域秒,_年,_月,_日,_曜日,_累計日数,_時,_分,_秒). localtime(_地域秒,_年,_月,_日,_曜日,_累計日数,_時,_分,_秒) :- localtime(1970,0,_地域秒,L), last(L,[_年,_開始秒]), _当年累秒数 is _地域秒 - _開始秒, '_年,_月,_日,_曜日,_累計日数,_時,_分,_秒を計算する'(_当年累秒数,_年,_月,_日,_曜日,_累計日数,_時,_分,_秒),!. localtime(_年,_開始秒,_現在秒,[]) :- _開始秒 > _現在秒,!. localtime(_年,_開始秒,_現在秒,[[_年,_開始秒]|R]) :- 年間秒(_年,_年間秒), _開始秒_2 is _開始秒 + _年間秒, _年_2 is _年 + 1, localtime(_年_2,_開始秒_2,_現在秒,R). 月初めの年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :- うるう年(_年), うるう年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数). 月初めの年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :- \+(うるう年(_年)), うるう年でない年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数). うるう年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :- 月初めの累積日数(_年,_月,[0,31,29,31,30,31,30,31,31,30,31,30],_月初めの累積日数), nth1(_月,[31,29,31,30,31,30,31,31,30,31,30,31,31],_月日数), _月初めの年初来の累秒数 is 86400 * _月初めの累積日数, _月末の年初来の累秒数 is _月初めの年初来の累秒数 + 86400 * _月日数. うるう年でない年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :- 月初めの累積日数(_年,_月,[0,31,28,31,30,31,30,31,31,30,31,30],_月初めの累積日数), nth1(_月,[31,28,31,30,31,30,31,31,30,31,30,31,31],_月日数), _月初めの年初来の累秒数 is 86400 * _月初めの累積日数, _月末の年初来の累秒数 is _月初めの年初来の累秒数 + 86400 * _月日数. 月初めの累積日数(_年,_月,_0から始まる月日数ならび,_月初めの累積日数) :- findsum(_日数,( between(1,_月,N), nth1(N,_0から始まる月日数ならび,_日数)), _月初めの累積日数_1), _月初めの累積日数 is truncate(_月初めの累積日数_1). '_年,_月,_日,_曜日,_累計日数,_時,_分,_秒を計算する'(_当年累秒数,_年,_月,_日,_曜日を表す値,_累計日数,_時,_分,_秒) :- '当年累積秒と月初めの年初来の累積秒と月末の年初来の累積秒から_月を得る'(_当年累秒数,_年,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数,_月), '_当年累積秒と_月初めの年初来の累積秒から_月,_日,_時,_分,_秒,を求める'(_当年累秒数,_月初めの年初来の累秒数,_月,_日,_時,_分,_秒), _累計日数 is _月初めの累積日数 + _日, 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日),!. '当年累積秒と月初めの年初来の累積秒と月末の年初来の累積秒から_月を得る'(_当年累秒数,_年,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数,_月) :- between(1,12,_月), 月初めの年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数), _当年累秒数 >= _月初めの年初来の累秒数, _当年累秒数 =< _月末の年初来の累秒数,!. '_当年累積秒と_月初めの年初来の累積秒から_月,_日,_時,_分,_秒,を求める'(_当年累秒数,_月初めの年初来の累秒数,_月,_日,_時,_分,_秒) :- _今月に入っての累秒数 is _当年累秒数 - _月初めの年初来の累秒数, '_秒数から _日,_時,_分,_秒を求める'(_今月に入っての累秒数,_日,_時,_分,_秒),!. '_秒数から _日,_時,_分,_秒を求める'(_秒数,_日,_時,_分,_秒) :- 商ならびと剰余ならび(_秒数,[86400,3600,60],[_日_1,_時,_分],[_,_,_秒]), _日 is _日_1 + 1. うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_),!, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 年間秒(_年,31536000) :- \+(うるう年(_年)),!. 年間秒(_年,31622400) :- うるう年(_年). グリニッヂ時と地域時間の差((32400)). 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 'Zellerの公式で使う曜日を表す値'(_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年月日,_曜日) :- atom(_年月日), atom(_曜日), '曜日'(_年月日,V), !, V = _曜日 . 'Zellerの公式を用いて曜日を得る'(_年月日,_曜日) :- atom(_年月日), var(_曜日), '8桁文字列で表された年月日を整数の年・月・日に分解'(_年月日,_年整数,_月整数,_日整数), 'Zellerの公式を用いて曜日を得る'(_年整数,_月整数,_日整数,_曜日を表す値,_曜日),!. 'Zellerの公式で使う曜日を表す値'(0,'日曜'). 'Zellerの公式で使う曜日を表す値'(1,'月曜'). 'Zellerの公式で使う曜日を表す値'(2,'火曜'). 'Zellerの公式で使う曜日を表す値'(3,'水曜'). 'Zellerの公式で使う曜日を表す値'(4,'木曜'). 'Zellerの公式で使う曜日を表す値'(5,'金曜'). 'Zellerの公式で使う曜日を表す値'(6,'土曜'). '8桁文字列で表された年月日を整数の年・月・日に分解'(_年月日,_年整数,_月整数,_日整数) :- atom_to_term(_年月日,_年月日整数,_), 商ならびと剰余ならび(_年月日整数,[10000,100],[_年整数,_月整数],[_,_日整数]). 商ならびと剰余ならび(_,[],[],[]). 商ならびと剰余ならび(_被除数,[_除数|R2],[_商|R3],[_剰余|R4]) :- 商と剰余(_被除数,_除数,_商,_剰余), 商ならびと剰余ならび(_剰余,R2,R3,R4). 商と剰余(_被除数,_除数,_商,_剰余) :- _商 is _被除数 // _除数, _剰余 is _被除数 mod _除数. findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # @ideoneさん 2012/03/12 のtwitterより # # test:-disp(6,[12,15,4,10,2,18,7,14,21,5],[7,8,10,5,-1,1,-1,6,-1,-1],[3,-1,-1,9,-1,4,-1,2,-1,-1],[]). # # disp(Index,Key,Left,Right,Stack):- # find(Key,Index,K), # write(K),write(' '), # find(Right,Index,R), # stackin(Stack,R,Stacktmp), # find(Left,Index,L), # stackin(Stacktmp,L,Newstack), # cal(Key,Left,Right,Newstack). # # cal(Key,Left,Right,[]). # cal(Key,Left,Right,[X|Z]):- # disp(X,Key,Left,Right,Z). # # stackin(Stack,-1,Stack). # stackin(Stack,V,Newstack):-push(Stack,V,Newstack). # # find([X|A],1,X). # find([X|A],V,Z):-W is V-1, find(A,W,Z). # # push(A,X,[X|A]). # # pop([X|A],X,A). # test :- disp(6,[12,15,4,10,2,18,7,14,21,5],[7,8,10,5,-1,1,-1,6,-1,-1],[3,-1,-1,9,-1,4,-1,2,-1,-1],[]). disp(Index,Key,Left,Right,Stack) :- disp([Index|Stack],Key,Left,Right). disp([],_,_,_). disp([Index|Stack_1],Key,Left,Right):- disp_Key(Index,Key), stackin(Index,Left,Right,Stack_1,Stack_2), disp(Stack_2,Key,Left,Right). disp_Key(Index,Key) :- nth1(Index,Key,K), writef('%t ',[K]). stackin(Index,Left,Right,Stack_1,Stack_2) :- find(Left,Index,V_1), stackin(Stack_1,V_1,Stack_3), find(Right,Index,V_2), stackin(Stack_3,V_2,Stack_2). stackin(Stack,-1,Stack). stackin(Stack,V,Newstack) :- push(Stack,V,Newstack). find([X|A],1,X) :- !. find([X|A],V,Z) :- W is V-1, find(A,W,Z). find([],_,-1). push(A,X,[X|A]). % 以下のサイトは # @ideoneさん 2012/03/12 のtwitterより # # test:-disp(6,[12,15,4,10,2,18,7,14,21,5],[7,8,10,5,-1,1,-1,6,-1,-1],[3,-1,-1,9,-1,4,-1,2,-1,-1],[]). # # disp(Index,Key,Left,Right,Stack):- # find(Key,Index,K), # write(K),write(' '), # find(Right,Index,R), # stackin(Stack,R,Stacktmp), # find(Left,Index,L), # stackin(Stacktmp,L,Newstack), # cal(Key,Left,Right,Newstack). # # cal(Key,Left,Right,[]). # cal(Key,Left,Right,[X|Z]):- # disp(X,Key,Left,Right,Z). # # stackin(Stack,-1,Stack). # stackin(Stack,V,Newstack):-push(Stack,V,Newstack). # # find([X|A],1,X). # find([X|A],V,Z):-W is V-1, find(A,W,Z). # # push(A,X,[X|A]). # # pop([X|A],X,A). # test :- disp(6,[12,15,4,10,2,18,7,14,21,5],[7,8,10,5,-1,1,-1,6,-1,-1],[3,-1,-1,9,-1,4,-1,2,-1,-1],[]). disp(Index,Key,Left,Right,Stack) :- disp([Index|Stack],Key,Left,Right). disp([],_,_,_). disp([Index|Stack_1],Key,Left,Right):- disp_Key(Index,Key), stackin(Index,Left,Right,Stack_1,Stack_2), disp(Stack_2,Key,Left,Right). disp_Key(Index,Key) :- nth1(Index,Key,K), writef('%t ',[K]). stackin(Index,Left,Right,Stack_1,Stack_2) :- nth1(Index,Left,V_1), stackin(Stack_1,V_1,Stack_3), nth1(Index,Right,V_2), stackin(Stack_3,V_2,Stack_2). stackin(Stack,-1,Stack). stackin(Stack,V,Newstack) :- push(Stack,V,Newstack). push(A,X,[X|A]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/812 # # [1] 授業単元: 何かの授業ではないんですが # [2] 問題文(含コード&リンク): # n個の要素を持つintの配列にランダムな順序で整数が入っている。 # このときk(0 <= k <= n-1)番目に小さい要素を見つけるプログラムを書け。 # 'n個の要素を持つintの配列にランダムな順序で整数が入っている。このときk(0 <= k <= n-1)番目に小さい要素を見つける'(_n,_k,_k番目に小さい要素) :- 'n個の要素を持つintの配列にランダムな順序で整数が入っている。'(_n,L), 整列(L,L1), lenth([_|L0],_k), append(L0,[_k番目に小さい要素|_],L1). 'n個の要素を持つintの配列にランダムな順序で整数が入っている。'(_n,L) :- length(L,_n), findall(M,( append(_,[_|_],L), M is random(1000)), L). 整列([],[]). 整列([A|R1],L) :- 分割(A,R1,L1,L2), 整列(L1,L1_2), 整列(L2,L2_2), append(L1_2,[A|L2_2],L). 分割(_,[],[],[]). 分割(A,[B|R1],[B|R2],R3) :- A @>= B, 分割(A,R1,R2,R3). 分割(A,[B|R1],R2,[B|R3]) :- A @< B, 分割(A,R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/489 # # MySQLです # # Year | Month # ------------ # 2012 | 1 # 2012 | 2 # 2012 | 3 # 2012 | 4 #  〜 略 〜 # 2012 | 10 # 2012 | 11 # 2012 | 12 # # の様なテーブルから「年度」を取得したいです。 # この場合は2011と2012を取得するにはどんなSQLを書けばよいでしょう? # IF文とか書く必要があるのであればプロシージャ作るのもOKです。 # # 'テーブルから「年度」を取得'(_年,_月,_年度) :- 年月(_年,_月), 年度(_年,_月,_年度). 年度(_年,_月,_年度) :- _月 >= 4, _月 =< 12, _年度 = _年,!. 年度(_年,_月,_年度) :- _年度 is _年 - 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/668 # # [1] 授業単元:ソート # [2] 問題文(含コード&リンク): # 1. savadata.txt内にあるデータを読み取り、名前順にソートして # 全員分のLEVEL、PLAYER NAME、POINTを表示するプログラムを # 作成せよ. # # 2. savadata.txt内にあるデータを読み取り、レベル別にPOINTが上位3人までのPlayerNameとそのPOINTおよび # レベル別の全体の平均点(Average)を表示させるプログラムを作成せよ. # # 出力例) # ■EASY # Rank1 : Tanaka 1000 POINT # Rank2 : Onishi 875 POINT # Rank3 : KItano 685 POINT # Average : 256 POINT # # ■Normal # Rank1 : Kuriyama 900 POINT # Rank2 : Onishi 775 POINT # Rank3 : KItano 605 POINT # Average : 232 POINT # # savedata.txt # http://ime.nu/www.kent-web.com/pubc/book/test/uploader/uploader.cgi?mode=downld&no=5099 # # HARD Ichihashi 230 # HARD Tanaka 170 # HELL Nakamura 10 # EASY kanzaki 130 # HARD Ichihashi 20 # VERY HARD Tamura 570 # HELL Ishii 1000 # EASY kanagawa 200 # HARD Kuriyama 250 # DETH Takeda 180 # HELL Nakanishi 10 # NORMAL kamida 450 # HARD Iguchi 290 # VERY HARD Tanaka 370 # DETH Murata 800 # VERY HARD THirano 290 # HARD Kanemoto 230 # NORNAL Yano 110 # HELL Kuji 10 # EASY Arai 130 # EASY Hamada 20 # VERY HARD Satoh 120 # NORNAL ishimura 900 # EASY Ushijima 200 # HARD Kumada 230 # NORNAL Nasuno 820 # HELL Hashimoto 0 # EASY Kim 130 # HARD John 20 # VERY HARD Kimura 170 # HARD Nishioka 470 # NORNAL Honda 400 # 'savadata.txt内にあるデータを読み取り、名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する' :- 'savadata.txt内にあるデータを読み取り'(LL), '名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL). 'savadata.txt内にあるデータを読み取り'(LL) :- get_lines('savadata.txt',Lines), Lines = [_見出し|_実データならび], '各行をLEVEL,PLAYER NAME,POINTに分割する'(1,_実データならび,LL). '各行をLEVEL,PLAYER NAME,POINTに分割する'(_,[],[]). '各行をLEVEL,PLAYER NAME,POINTに分割する'(N,[_行|R1],[[N,_LEVEL,_PLAYER_NAME,_POINT]|R2]) :- split(_行,[' ','\t'],L), 'LEVEL,PLAYER NAME,POINTに分割する'(L,_LEVEL,_PLAYER_NAME,_POINT), N2 is N + 1, '各行をLEVEL,PLAYER NAME,POINTに分割する'(N2,R1,R2). 'LEVEL,PLAYER NAME,POINTに分割する'(['VERY','HARD',_PLAYER_NAME,_POINT],'VERY HARD',_PLAYER_NAME,_POINT). 'LEVEL,PLAYER NAME,POINTに分割する'([_LEVEL,_PLAYER_NAME,_POINT],_LEVEL,_PLAYER_NAME,_POINT). '名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL) :- 名前を順に(LL,LL1), ソートして(LL1,LL2), '全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL2,LL). 名前を順に(LL,LL1) :- '鍵(名前)と行番号の対を作る'(LL,LL1). '鍵(名前)と行番号の対を作る'(LL,LL1) :- findall([_NAME,_行位置],( member([_行位置,_LEVEL,_PLAYER_NAME,_POINT],LL)), LL1). ソートして(LL1,LL2) :- 整列(LL1,LL2). '全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL1,LL) :- append(_,[[_,_行番号]|R],LL1), nth1(_行番号_1,LL,[_,_LEVEL,_PLAYER_NAME,_POINT]), writef('%t %t %t\n',[_LEVEL,_PLAYER_NAME,_POINT]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/779 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # キーボードから整数値を受け取り、その数値に該当する月の略称("Jan", "Feb",・・・)を表示するプログラムを作成しなさい。 # なお、月の略称はポインタ配列「 char *month[ ]={"Jan.", "Feb.", "Mar.", "Apr.", "May.", "Jun.", "Jul.", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."};」で定義するものとする。 # 'キーボードから整数値を受け取り、その数値に該当する月の略称("Jan", "Feb",・・・)を表示する。なお、月の略称はポインタ配列「 char *month[ ]={"Jan.", "Feb.", "Mar.", "Apr.", "May.", "Jun.", "Jul.", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."};」で定義するものとする。' :- 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値), 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値). 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値) :- get_line(Line), キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値),!. 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値) :- 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値). キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値) :- atom_to_term(Line,_キーボードから受け取った整数値,_), integer(_キーボードから受け取った整数値),!. キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値) :- writef('入力された %t からは月数に相当する数値が得られません。再入力をお願いします。\n',[Line]), fail. 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値) :- 数値に該当するピリオド付き月の略称ストリング(_キーボードから受け取った整数値,_ピリオド付き月の略称ストリング), append(L1,[_],_ピリオド付き月の略称ストリング), string_to_atom(L1,_その数値に該当する月の略称), writef('キーボードから受け取った数字 %t(月),該当する月の略称 %t\n',[_キーボードから受け取った整数値,_その数値に該当する月の略称]),!. 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値,_) :- writef('キーボードからの入力 %t に該当する月は存在しません。\n',[_キーボードから受け取った整数値,[_キーボードから受け取った整数値]). 数値に該当する月の略称ストリング(1,"Jan."). 数値に該当する月の略称ストリング(2,"Feb."). 数値に該当する月の略称ストリング(3,"Mar."). 数値に該当する月の略称ストリング(4,"Apr."). 数値に該当する月の略称ストリング(5,"May."). 数値に該当する月の略称ストリング(6,"Jun."). 数値に該当する月の略称ストリング(7,"Jul."). 数値に該当する月の略称ストリング(8,"Aug."). 数値に該当する月の略称ストリング(9,"Sep."). 数値に該当する月の略称ストリング(10,"Oct."). 数値に該当する月の略称ストリング(11,"Nov."). 数値に該当する月の略称ストリング(12,"Dec."). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/779 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # キーボードから整数値を受け取り、その数値に該当する月の略称("Jan", "Feb",・・・)を表示するプログラムを作成しなさい。 # なお、月の略称はポインタ配列「 char *month[ ]={"Jan.", "Feb.", "Mar.", "Apr.", "May.", "Jun.", "Jul.", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."};」で定義するものとする。 # 'キーボードから整数値を受け取り、その数値に該当する月の略称("Jan", "Feb",・・・)を表示する。なお、月の略称はポインタ配列「 char *month[ ]={"Jan.", "Feb.", "Mar.", "Apr.", "May.", "Jun.", "Jul.", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."};」で定義するものとする。' :- 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値), 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値). 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値) :- get_line(Line), キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値),!. 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値) :- 'キーボードから整数値を受け取り'(_キーボードから受け取った整数値). キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値) :- atom_to_term(Line,_キーボードから受け取った整数値,_), integer(_キーボードから受け取った整数値),!. キーボードからの整数値の受け取り診断(Line,_キーボードから受け取った整数値) :- writef('入力された %t からは月数に相当する数値が得られません。再入力をお願いします。\n',[Line]), fail. 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値) :- 数値に該当するピリオド付き月の略称ストリング(_キーボードから受け取った整数値,_ピリオド付き月の略称ストリング), append(L1,[_],_ピリオド付き月の略称ストリング), string_to_atom(L1,_その数値に該当する月の略称), writef('キーボードから受け取った数字 %t(月),該当する月の略称 %t\n',[_キーボードから受け取った整数値,_その数値に該当する月の略称]),!. 'その数値に該当する月の略称を表示する'(_キーボードから受け取った整数値,_) :- writef('キーボードからの入力 %t に該当する月は存在しません。\n',[_キーボードから受け取った整数値,[_キーボードから受け取った整数値]). 数値に該当する月の略称ストリング(1,"Jan."). 数値に該当する月の略称ストリング(2,"Feb."). 数値に該当する月の略称ストリング(3,"Mar."). 数値に該当する月の略称ストリング(4,"Apr."). 数値に該当する月の略称ストリング(5,"May."). 数値に該当する月の略称ストリング(6,"Jun."). 数値に該当する月の略称ストリング(7,"Jul."). 数値に該当する月の略称ストリング(8,"Aug."). 数値に該当する月の略称ストリング(9,"Sep."). 数値に該当する月の略称ストリング(10,"Oct."). 数値に該当する月の略称ストリング(11,"Nov."). 数値に該当する月の略称ストリング(12,"Dec."). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/305 # # MySQL5です。 # # programテーブル # `program_id`,`program_name` # # titleテーブル # `program_id`,`title_id`,`title` # # dataテーブル # `program_id`,`title_id`,`data_id`,`open_flag` # # という感じで3つのテーブルがあります。 # ここから、data.`open_flag`が'1'の物を含む、 # title.`title`を、program単位でランダムに5件抽出したいと思っていますが、 # # SELECT # ttl.`title` # ,prg.`program_id` # ,ttl.`title_id` # FROM `title` AS ttl # LEFT JOIN `program` AS prg ON prg.`program_id`=ttl.`program_id` # LEFT JOIN `data` AS dat ON dat.`program_id`=ttl.`program_id` AND dat.`title_id`=ttl.`title_id` # WHERE dat.`open_flag` = 1 # ORDER BY RAND() # LIMIT 0,5 # # とやった場合、同じprogram_idが重複して抽出される場合が出てきてしまいます。。 # この場合、重複せず必ずことなる`program_id`から抽出するにはどうしたら良いでしょうか? # # 'data.`open_flag`が 1 の物を含む、title.`title`を、program単位でランダムに5件抽出したい'(_title) :- program(_program_id,_program_name), writef('program_name = %t\n',[_program_name]), 'titleの蒐集'(_program_id,L), ランダムに5件抽出したい(L,_title). 'titleの蒐集'(_program_id,L) :- findall(_title_id,( data(_program_id,_title_id,_data_id,_open_flag), _open_flag = '1', title(_program_id,_title_id,_title)), L). ランダムに5件抽出したい(L,_title) :- length(L,Len), ランダムに5件抽出したい(Len,[_,_,_,_,_],L,[],_5件抽出したtitle), member(_title,_5件抽出したtitle). ランダムに5件抽出したい(_,[],L,_,[]). ランダムに5件抽出したい(Len,[_|Ln],L,L1,[_title|R2]) :- まだ抽出していないtitleを得る(Len,L,L1,_title), ランダムに5件抽出したい(Len,Ln,L,[_title|L1],R2). まだ抽出していないtitleを得る(Len,L,L1,_title) :- Nth is random(Len) + 1, nth1(Nth,L,_title), \+(member(_title,L1)),!. まだ抽出していないtitleを得る(Len,L,L1,_title) :- まだ抽出していないtitleを得る(Len,L,L1,_title). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/301 # # MySQLで質問させてください。 # ある条件で絞ったレコードを日付でソートして # 最新のn件以降を削除したい場合はどのようなSQLを書くのが良いでしょうか? # 'ある条件で絞ったレコードを日付でソートして最新のn件以降を削除する'(_テーブル,_条件,_n件) :- ある条件で絞ったレコードを(_テーブル,_条件,LL1), 日付でソートして(LL1,LL), 最新のn件以降を(LL,_n件,LL2), 削除する(_テーブル,LL2). ある条件で絞ったレコードを(_テーブル,_条件,_削除する件数,_ある条件で絞ったレコード) :- 属性ならびの取得(_テーブル,_属性名ならび,_属性ならび), P =.. [_テーブル|_属性ならび], findall(_属性ならび,( P, _条件), _ある条件で絞ったレコード). 属性ならびの取得(_テーブル,_属性名ならび,_属性ならび) :- setof([_属性順序,_属性名],( テーブル定義(_テーブル,_属性順序,_属性名)), L1), findall(_属性名,( member([_,_属性名],L2)), _属性名ならび), length(_属性名ならび,Len), length(_属性ならび,Len),!. 日付でソートして(_組ならび,_整列した組ならび) :- テーブル定義(_テーブル,_nth,日付), findall([_日付|_属性ならび],( member(_属性ならび,_組ならび)), LL2), sort(LL2,LL3), 鍵の日付を取り除く(LL3,_整列した組ならび). 最新のn件以降を(LL,_n件,LL2) :- length(LL2,_n件), append(LL1,LL2,LL),!. 削除する(_テーブル,LL) :- append(_,[L|R],LL). P =.. [_テーブル|L], retract(P), R = []. 鍵の日付を取り除く([],[]). 鍵の日付を取り除く([[_|L]|R1],[L|R2]) :- 鍵の日付を取り除く(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/128 # # 1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 1番:コマンドライン引数を用いて2つの10進数を入力し, # その2つの数を2進数表示したものについて,論理和,論理積, # 排他的論理和,を表示するプログラムを作成せよ。 # また,2進数で直接入力して計算できるようにせよ。 # # 2番:1番で求めた論理和,論理積,排他的論理和について、 # 指定したビット目の値、連続する0の数および1の数をそれぞれ数えて # 交互に表示するプログラムを作成せよ。 # # 3番目:1番で求めた論理和,論理積,排他的論理和について、 # 4桁ずつ区切って16進数で表示するプログラムを作成せよ. # # 例: # 論理和 : 000111101001001 # 1番目の区切り:0001 = 1 # 2番目の区切り:1110 = e # 3番目の区切り:1001 = 9 # 4番目の区切り:001 = 1 # ビット目の指定(_ならび,_nビット目,_nビット目の値) :- nth1(_nビット目,_ならび,_nビット目の値). '連続する0の数および1の数をそれぞれ数えて交互に表示する'(L) :- '連続する0の数および1の数をそれぞれ数えて'(L,L2), concat_atom(L2,',',_表示文字列), writef('%t\n',[_表示文字列]). '連続する0の数および1の数をそれぞれ数えて'(L,[Len|R2]) :- append(L0,[A|R],L), \+(member(A,L0)), length(L0,Len), '連続する0の数および1の数をそれぞれ数えて'([A|R],R2). '連続する0の数および1の数をそれぞれ数えて'(L,[Len]). length(L,Len). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1294641578/718 # # 最後から任意の件数を問い合わせたいのですが # select time from test order by time desc offset 0 limit 3;で # 呼び出すと下記のようになりますが # # time         # ------------------ # 2011-11-28 08:20:16 # 2010-10-26 06:20:16 # 2009-09-24 04:20:16 # # # ↓のように更にソートして呼び出すにはどう書けばよいのでしょうか? # time           # ------------------ # 2009-09-24 04:20:16 # 2010-10-26 06:20:16 # 2011-11-28 08:20:16 # # '最後から任意の件数を問い合わせる'(_任意の件数,L) :- テーブル構造の取得(test,time,P,_time), 全テーブルの取得(P,_time,LL1), 最後から任意の件数を取り出す(_任意の件数,LL1,L). テーブル構造の取得(_テーブル名,_鍵名,P,_項) :- findall(_,( テーブル定義(_テーブル名,_,_)), L), テーブル定義(_テーブル名,_項番号,_鍵名), nth1(_項番号,L,_項), P =.. [_テーブル名|L]. 全テーブルの取得(P,_time,LL1) :- findall([_time],( P), LL1). 逆順に整列(LL1,LL2) :- sort(LL1,LL3), reverse(LL3,LL2). 最後から任意の件数を取り出す(_任意の件数,LL,L) :- length(LL3,_任意の件数), append(LL3,_,LL2), 逆順に整列(LL1,LL2), member(L,LL3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/875 # # [1]プログラミング実習 # [2] # 表面に色が塗られたサイコロが二つあります # それぞれ共に # 赤が3面 # 青が2面 # 緑が1面 # あります # 二つのサイコロを同時に振ると色の組み合わせは # 1)赤赤 # 2)赤青 # 3)赤緑 # 4)青青 # 5)青緑 # 6)緑緑 # の6通りありますが # 出やすい組み合わせの順に並び替えて出力しなさい # [3]C # [4]11/30 # [5]標準ライブラリのみでコンソールに出力すること # # パターン(1,赤,赤). パターン(2,赤,青). パターン(2,青,赤). パターン(3,赤,緑). パターン(3,緑,赤). パターン(4,青,青). パターン(5,青,緑). パターン(5,緑,青). パターン(6,緑,緑). サイコロ(1,[赤,赤,赤,青,青,緑]). サイコロ(2,[赤,赤,赤,青,青,緑]). 出やすい組み合わせの順に並び替えて出力しなさい :- サイコロの出目を数える(100000,L), 大きい順に取り出す(L). サイコロの出目を数える(0,[[0,1],[0,2],[0,3],[0,4],[0,5],[0,6]]) :- !. サイコロの出目を数える(M,L) :- 'サイコロの目'(_目_1,_目_2), パターン(_パターン番号,_目_1,_目_2), M_1 is M - 1, サイコロの出目を数える(M_1,L_1), 'パターンの度数を更新'(_パターン番号,L_1,L). 'サイコロの目'(_目_1,_目_2) :- サイコロの目(1,_目_1), サイコロの目(2,_目_2). サイコロの目(N,_目_1) :- サイコロ(N,L1), M is rendom(6) + 1, nth1(M,L1,_目_1),!. 'パターンの度数を更新'(_パターン番号,L1,L2) :- append(L0,[[_度数_1,_パターン番号]|R],L1), _度数_2 is _度数 + 1, append(L0,[[_度数_2,_パターン番号]|R],L2). 大きい順に取り出す([]). 大きい順に取り出す(L) :- append(L0,[[_度数,_パターン番号]|R],L) :- 全て要素の度数が等しいか小さい(_度数,L0,R), 表示する(_パターン番号), append(L0,R,L2), 大きい順に取り出す(L2). 全ての要素の度数が等しいか小さい(A,L1,L2) :- append(L1,L2,L), \+((append(_,[B|_],L),B > A)),!. 表示する(_パターン番号) :- パターン(_パターン番号,_色1,_色2), writef('%t%t',[_色1,_色2]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/662 # # 【質問テンプレ】 # [1] 授業単元:プログラミング入門(C) # [2] 問題文(含コード&リンク): # 無限ループを用い、 1〜100までの数値を任意に10回分だけ入力し、その度数分布を求めよ。 # ただし、for文は用いず、while文で。度数分布は5等分して表示せよ。(例えば1~20に4個 21~40に3個 41~60に2個 61~80に1個 81~100に0個) # '無限ループを用い、 1〜100までの数値を任意に10回分だけ入力し、その度数分布を求めよ。'(_1_20,_21_40,_41_60,_61_80,_81_100) :- '無限ループを用い、 1〜100までの数値を任意に10回分だけ入力し、その度数分布を求めよ。'([],[],[],[],[],[],_1_20,_21_40,_41_60,_61_80,_81_100), 度数分布の表示(_1_20,_21_40,_41_60,_61_80,_81_100). '無限ループを用い、 1〜100までの数値を任意に10回分だけ入力し、その度数分布を求めよ。'([_,_,_,_,_,_,_,_,_,_],_1_20,_21_40,_41_60,_61_80,_81_100,_1_20,_21_40,_41_60,_61_80,_81_100). '無限ループを用い、 1〜100までの数値を任意に10回分だけ入力し、その度数分布を求めよ。'([_,_,_,_,_,_,_,_,_,_],_,_,_,_,_,_1_20,_21_40,_41_60,_61_80,_81_100) :- '無限ループを用い、 1〜100までの数値を任意に10回分だけ入力し、その度数分布を求めよ。'([],[],[],[],[],[],_1_20,_21_40,_41_60,_61_80,_81_100). '無限ループを用い、 1〜100までの数値を任意に10回分だけ入力し、その度数分布を求めよ。'(Ln,L1,L2,L3,L4,L5,_1_20,_21_40,_41_60,_61_80,_81_100) :- '1〜100までの数値を任意に10回分だけ入力し度数分布を'(L1,L2,L3,L4,L5,L1_2,L2_2,L3_2,L4_2,L5_2), '無限ループを用い、 1〜100までの数値を任意に10回分だけ入力し、その度数分布を求めよ。'([_|Ln],L1_2,L2_2,L3_2,L4_2,L5_2,_1_20,_21_40,_41_60,_61_80,_81_100). '1〜100までの数値を任意に10回分だけ入力し度数分布を'(L1,L2,L3,L4,L5,L1_2,L2_2,L3_2,L4_2,L5_2) :- _任意の数値 is random(100) + 1, _階級 is (_任意の数字 - 1) // 20 + 1, 分布ならびの更新(_階級,L1,L2,L3,L4,L5,L1_2,L2_2,L3_2,L4_2,L5_2), 分布ならびの更新(1,L1,L2,L3,L4,L5,[_|L1],L2,L3,L4,L5). 分布ならびの更新(2,L1,L2,L3,L4,L5,L1,[_|L2],L3,L4,L5). 分布ならびの更新(3,L1,L2,L3,L4,L5,L1,L2,[_|L3],L4,L5). 分布ならびの更新(4,L1,L2,L3,L4,L5,L1,L2,L3,[_|L4],L5). 分布ならびの更新(5,L1,L2,L3,L4,L5,L1,L2,L3,L4,[_|L5]). 度数分布の表示(_1_20,_21_40,_41_60,_61_80,_81_100) :- for(1,N,5), nth1(N,[_1_20,_21_40,_41_60,_61_80,_81_100],L), 度数表示(N,L), N = 5. 度数分布の表示(N,L) :- length(L,_度数), M1 is (N - 1) * 20 + 1, M2 is M * 20, writef('%t-%t %t個\n',[M1,M2,_度数]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/610 # # 【質問テンプレ】 # [1] 授業単元:情報技術 # [2] 問題文(含コード&リンク): # 以下の2つの要件を満たす、3行3列の行列の積を計算し、表示するプログラムmultiply.cを作成せよ。 # # (1)整数型の行列A,Bおよびそれらの行列積A*Bを、以下の配列名で宣言する(A,Bの値は各個人で自由に設定)。 # # int matrix_a[3][3]={{1,2,3},{4,5,6},{7,8,9}};/*行列A*/ # int matrix_b[3][3]={{10,11,12},{13,14,15},{16,17,18}};/*行列B*/ # int matrix_multiply_a_by_b[3][3]={{0,0,0},{0,0,0},{0,0,0}};/*計算結果代入用の行列*/ # # (2)行列の積A*Bのi行j列目の要素の計算を、for文を用いて行うこと。 # # matrix_a([[1,2,3],[4,5,6],[7,8,9]]). matrix_b([[10,11,12],[13,14,15],[16,17,18]]). '行列の積A*Bのi行j列目の要素の計算を、for文を用いて行うこと。'(_i行,_j列,_i行j列の要素) :- 'matrix_aのi行とmatrix_bのj列'(_i行目,_j列目,L1,L2), findsum(S,( for(1,N,3), nth1(N,L1,A), nth1(N,L2,B), S is A * B), _i行j列の要素). 'matrix_aのi行とmatrix_bのj列'(_i行目,_j列目,L1,L2) :- matrix_a(LL1), matrix_b(LL2), nth1(_i行,LL1,L1), 'matrix_bのj列ならび'(_j列目,LL2,L2). 'matrix_bのj列ならび'(_,_,[],[]). 'matrix_bのj列ならび'(_j列目,[L1|R1],[X|R2]) :- nth1(_j列目,L1,X), 'matrix_bのj列ならび'(_j列目,R1,R2). findsum(A,B,C) :- findall(A,B,L), sum(L,C). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '行列の積A*Bのi行j列目の要素の計算'(_i行,_j列,_i行j列の要素) :- 'matrix_aのi行とmatrix_bのj列'(_i行目,_j列目,L1,L2), 'i行j列目の要素は'(L1,L2,_i行j列目の要素). 'i行j列目の要素は'([A],[B],S) :- S is A * B,!. 'i行j列目の要素は'([A|R1],[B|R2],S) :- 'i行j列目の要素は'(R1,R2,S_2), S is A * B + S_2. 'matrix_aのi行とmatrix_bのj列'(_i行目,_j列目,L1,L2) :- matrix_a(LL1), matrix_b(LL2), 転置(LL2,LL2_2), nth1(_i行,LL1,L1), nth1(_j列,LL2_2,L2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '行列の積A*Bのi行j列目の要素の計算'(_i行,_j列,_i行j列の要素) :- matrix_a(LL1), matrix_b(LL2), '3×3の行列の掛算演算表'(LL1,LL2,LL3), nth1(_i行,LL3,L), nth1(_j列,L,_式), _i行j列の要素 is _式. '3×3の行列の掛算演算表'([ [A11,A12,A13], [A21,A22,A23], [A31,A32,A33]], [[B11,B12,B13], [B21,B22,B23], [B31,B32,B33]], [[A11*B11+A12*B21+A13*B31,A11*B12+A12*B22+A13*B32,A11*B13+A12*B23+A13*B33], [A21*B11+A22*B21+A23*B31,A21*B12+A22*B22+A23*B32,A21*B13+A22*B23+A23*B33], [A31*B11+A32*B21+A33*B31,A31*B12+A32*B22+A33*B32,A31*B13+A32*B23+A33*B33]]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/477 # # [1] 授業単元:C言語 # [2] 問題文:3*3の逆行列Aをもとめよ # http://ime.nu/ideone.com/erZBk # '3*3の逆行列Aをもとめよ'(_a,_逆行列A) :- var(_a), '3行3列の行列aを入力'(_a), 正方行列の逆行列(_a,_逆行列A). '3*3の逆行列Aをもとめよ'(_a,_逆行列A) :- \+(var(_a)), 正方行列の逆行列(_a,_逆行列A). 正方行列の逆行列(_正方行列,_正方行列の逆行列) :- 余因子行列(_正方行列,_余因子行列), 転置(_余因子行列,_チルダ余因子行列), 行列式の値(_正方行列,_正方行列の行列式の値), チルダ余因子行列を正方行列の行列式の値で割る(_チルダ余因子行列,_正方行列の行列式の値,_正方行列の逆行列). チルダ余因子行列を正方行列の行列式の値で割る([],_,[]). チルダ余因子行列を正方行列の行列式の値で割る(_チルダ余因子行列,_正方行列の行列式の値,_正方行列の逆行列) :- _チルダ余因子行列 = [_行_1|R1], 行列要素の割り算(_行_1,_正方行列の行列式の値,_行_2), _正方行列の逆行列 = [_行_2|R2], チルダ余因子行列を正方行列の行列式の値で割る(R1,_正方行列の行列式の値,R2). 行列要素の割り算([],_,[]). 行列要素の割り算([_被除数|R1],_除数,[N2|R2]) :- 約分(_被除数/_除数,N2), 行列要素の割り算([N1|R1],D,[N2|R2]). 約分(B / A,V) :- \+(integer(B)), V is B / A,!. 約分(B / A,V) :- \+(integer(A)), V is B / A,!. 約分(B / A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子,_分母,_分子 / _分母). '余因子行列で行列値|a|を求める'(_a,_行列式_aの値) :- 余因子行列(_n,_a,_余因子行列), _a = [_aの第一行|_], _余因子行列 = [_余因子行列の第一行|_], 二つのならびの積の和(_aの第一行,_余因子行列の第一行,_行列式_aの値). 余因子行列(_n,_正方行列,_余因子行列) :- length(_余因子行列,_n), findall(L,( nth1(_i,_余因子行列,L), 余因子行列の要素が余因子である(_n,_正方行列,_i,L)), _余因子行列). 余因子行列の要素が余因子である(_n,_正方行列,_i,L) :- length(L,_n), findall(_余因子,( nth1(_j,L,_余因子), 余因子(_n,_正方行列,_i,_j,_余因子)), L). 行列式の値(_正方行列,_i,_n,_行列式の値) :- findsum(W,( 'n次正方行列の要素を列・行取り出す'(_n,_正方行列,_i,_j,_正方行列の要素), 余因子(_n,_正方行列,_i,_j,_余因子), W is _正方行列の要素 * _余因子), _行列式の値). 余因子(_n,_正方行列,_i,_j,_余因子) :- 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子). 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) :- '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列), 'i,jから乗数を得る'(_i,_j,_乗数), 二つの対角要素の積を得る(_n,_n_1次正方行列,_右下がり対角要素の積,_右上がり対角要素の積), _余因子 is _乗数 * (_右下がり対角要素の積-_右上がり対角要素の積). '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列) :- '第何行を取り除く'(_正方行列,_i,_第i行が取り除かれた行列), 転置(_第i行が取り除かれた行列,_転置された第i行が取り除かれた行列), '第何行を取り除く'(_転置された第i行が取り除かれた行列,_j,_転置された第i行第j列が取り除かれた行列), 転置(_転置された第i行第j列が取り除かれた行列,_n_1次正方行列). '第何行を取り除く'(_正方行列,_第何行,_第i行が取り除かれた行列) :- append(L0,[L|R],_正方行列), length([_|L0],_第何行), append(L0,R,_第i行が取り除かれた行列). 二つの対角要素の積を得る(_n,_正方行列,_右下がり対角要素の積,_右上がり対角要素の積) :- 二つの対角要素を得る(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび), 対角要素の掛算(_右下がり対角要素ならび,_右下がり対角要素の積), 対角要素の掛算(_右上がり対角要素ならび,_右上がり対角要素の積). 二つの対角要素を得る(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび) :- 右下がり対角要素ならび(_n,_正方行列,_右下がり対角要素ならび), 右上がり対角要素ならび(_n,_正方行列,_右上がり対角要素ならび). 右下がり対角要素ならび(_n,_正方行列,_右下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), nth1(_nth1,L,V)), _右下がり対角要素ならび). 右上がり対角要素ならび(_n,_正方行列,_右上がり対角要素ならび) :- findall(V,( append(_,[L|R],_正方行列), length([_|R],_nth1), nth1(_nth1,L,V)), _右上がり対角要素ならび),!. 'i,jから乗数を得る'(_i,_j,(-1)) :- 1 is (_i + _j) mod 2,!. 'i,jから乗数を得る'(_i,_j,1) :- 0 is (_i + _j) mod 2,!. 対角要素の掛算([],1). 対角要素の掛算([A|R],X) :- 対角要素の掛算(R,Y), X is A * Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/398 # # [1] 授業単元: 画像処理 # [2] 問題文(含コード&リンク): # アフィン変換で画像を変換せよ。ただし回転の中心は画像の中心であるである # http://ime.nu/codepad.org/i8K01zBM # ここまでできたのですが画像の中心で回転してくれません。 # '100 * 100 の要素の中の中心からx軸方向+-10要素、y軸方向+-10要素をアフィン変換で回転する'(_表,_中心X座標,_中心Y座標,_回転角度) :- 回転変換行列(_回転角度,_回転変換行列), '100 * 100 の要素の中の中心からx軸方向+-10要素、y軸方向+-10要素をアフィン変換で回転する'(40,40,_表,_中心X座標,_中心Y座標,_回転角度,_回転変換行列). '100 * 100 の要素の中の中心からx軸方向+-10要素、y軸方向+-10要素をアフィン変換で回転する'(X,Y,_表,_中心X座標,_中心Y座標,_回転角度,_回転変換行列) :- X > 60,Y = 60,!. '100 * 100 の要素の中の中心からx軸方向+-10要素、y軸方向+-10要素をアフィン変換で回転する'(X,Y,_表,_中心X座標,_中心Y座標,_回転角度,_回転変換行列) :- X > 60, \+(Y = 60), Y_2 is Y + 1, '100 * 100 の要素の中の中心からx軸方向+-10要素、y軸方向+-10要素をアフィン変換で回転する'(40,Y_2,_表,_中心X座標,_中心Y座標,_回転角度,_回転変換行列),!. '100 * 100 の要素の中の中心からx軸方向+-10要素、y軸方向+-10要素をアフィン変換で回転する'(X,Y,_表,_中心X座標,_中心Y座標,_回転角度,_回転変換行列) :- 中心を原点移動した座標(X,Y,X_1,Y_1), 行列の掛算([[X_1,Y_1]],_回転変換行列,[[_x,_y]]), 平行移動(_x,_y,_x_1,_y_1), 要素の単一化(_表,X,Y,_x_1,_y_1), X_2 is X + 1, '100 * 100 の要素の中の中心からx軸方向+-10要素、y軸方向+-10要素をアフィン変換で回転する'(X_2,Y,_表,_中心X座標,_中心Y座標,_回転角度,_回転変換行列). 中心を原点移動した座標(X,Y,X_1,Y_1) :- X_1 is X - 50, Y_1 is Y - 50. 回転変換行列(_回転角度,[[U11,U12,U21,U22]]) :- U_11 is cos(_回転角度), U_12 is -1 * sin(_回転角度), U_21 is sin(_回転角度), U_22 is cos(_回転角度),!. 要素の単一化(_表,X,Y,_x_1,_y_1) :- 要素値(_表,_x_1,_y_1,_要素), var(_要素), 要素値(_表,X,Y,_要素). 要素の単一化(_,_,_,_,_). 要素値(_表,X,Y,_値) :- nth1(Y,_表,L), nth1(X,L,_値). 平行移動(_x,_y,_x_1,_y_1) :- _x_1 is truncate(floor(_x + 80 + 0.5)), _y_1 is truncate(floor(_y + 80 + 0.5)),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/399 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):http://ime.nu/i.imgur.com/UwzPZ.jpg # # # 下の例のような、学生の4科目の(数学、物理、科学、英語)の試験点数(100点満点)を # 書いたファイルがある。(学生数は100名以下) # # ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、 # 各科目の平均点を表示するプログラムを作成する。 # # ・ 科目名(6文字未満)を入れる文字列(文字の一次元配列)を4つ用意する。 # # ・ 学籍番号と点数を一緒に入れる二次元整数配列を用意する # 例 int tensu[ ? ][ ? ] # # 最初に二次元配列を表示して、実行例のように点数を表示し、次に各学生の # 平均点、各科目の平均点を表示する。 # # ただし、ファイルの先頭には学生数(この例では5名)があり、つぎに4科目の # 科目名(数学、物理、科学、英語)が記述され、続いて、1行目に指定した学生数分 # の学籍番号と各試験点数が書かれている。 # # # ファイルの例(5名の例) # # 5 # Math Phys Chem Eng # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 表示例 # # 点数 :::: # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 学生平均 :::: # 8001 : 80.0 # 8004 : 48.25 # 8013 : 85.50 # 8035 : 81.25 # 8062 : 47.25 # # 科目平均 # 数学 : 69.8 # 物理 : 65.0 # 科学 : 69.0 # 英語 : 70.0 # 'ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_ファイル名) :- 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび), '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび). 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- get_lines(_ファイル名,Lines), 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数), 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび), '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび),!. 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数) :- Lines = [_学生数文字列|_], atom_to_term(_学生数文字列,_学生数,_), integer(_学生数),!. 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび) :- Lines = [_,_二行目文字列|_], split(_二行目文字列,[' ',','],_科目名ならび),!. '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび) :- length(_学籍番号と各試験点数ならび,_学生数), Lines = [_,_|_残りLines], findall(_学籍番号と各点数,( append(_,[_学籍番号と各点数文字列|_],_残りLines), aplit(_学籍番号と各点数文字列,[' ',','],_学籍番号と各点数)), _学籍番号と各試験点数ならび). '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- 学生の科目の一覧を表示(_学籍番号と各試験点数ならび), '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび). 学生の科目の一覧を表示(_学籍番号と各試験点数ならび) :- append(_,[_学籍番号と各試験点数|R],_学籍番号と各試験点数ならび), concat_atom(_学籍番号と各試験点数,' ',_表示文字列), writef('%t\n',[_表示文字列]), R = []. '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび) :- 各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび), 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点ならび), 各学生の平均点を表示する(_各学生の平均点ならび), 各科目の平均点を表示する(_各科目の平均点ならび). 各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび) :- findall([_学籍番号,_平均点],( append(_,[[_学籍番号|L]|_],_学籍番号と各試験点数ならび), 相加平均(L,_平均点)), _各学生の平均点ならび). 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点ならび) :- 転置(_学籍番号と各試験点数ならび,[_|_科目別点数ならび]), findall([_科目名,_平均点],( 科目名と点数ならびを得る(_科目名ならび,_学籍番号と各試験点数ならび,_科目名,_点数ならび), 相加平均(_点数ならび,_平均点)), _各科目の平均点ならび). 科目名と点数ならびを得る(_科目名ならび,_学籍番号と各試験点数ならび,_科目名,_点数ならび) :- append(L0,[_科目名|_],_科目名ならび), length(L0,Len), nth1(Len,_科目別点数ならび,_点数ならび). 各学生の平均点を表示する(_各学生の平均点ならび) :- write('\n学生平均 ::::\n'), append(_,[[_学籍番号,_平均点]|R],_各学生の平均点ならび), writef('%8r : %5r\n',[_学籍番号,_平均点]), R = []. 各科目の平均点を表示する(_各科目の平均点ならび) :- write('\n科目平均 ::::\n'), append(_,[[_科目名,_平均点]|R],_各科目の平均点ならび), writef('8r : %5r\n',[_科目名,_平均点]), R = []. % % http://nojiriko.asia/prolog/c153_399.html の % 各学生の平均点以下の述語定義と比較して、 % どちらが、理解しやすいかを問う。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/307 # # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/iup.2ch-library.com/i/i0478374-1321368771.jpg # # 1. (データの新規追加) 引数を順に名前、電話番号、学籍番号を表す配列 name phone number を用いて実装せよ # 2. (データ項目の削除) 引数で指定されたデータ項目と合致する個人データを住所録から削除する関数 # 3. (データの検索) 引数で指定されたデータ項目を住所録から検索する関数 # 4. 住所録に登録されているすべての個人データを表示するものとする。未使用 # 領域も表示すること。 # 引数で指定されたデータ項目を住所録から検索する関数(_データ項目,_名前,_住所,_電話番号,_学籍番号) :- 登録位置を得る(_データ項目,_n番目), 指定された登録位置から各項目を取得する(_n番目,_名前,_住所,_電話番号,_学籍番号). 登録位置を得る(_データ項目,_n番目) :- 住所録(名前,_名前ならび), append(L0,[_名前|_],_名前ならび), sub_atom(_名前,_,_,_,_データ項目), length([_|L0],_n番目). 指定された登録位置から各項目を取得する(_n番目,_名前,_住所,_電話番号,_学籍番号) :- n番目の名前(_n番目,_名前), n番目の住所(_n番目,_住所), n番目の電話番号(_n番目,_電話番号), n番目の学籍番号(_n番目,_学籍番号). n番目の名前(_n番目,_名前) :- 住所録(名前,_名前ならび), nth1(_n番目,_名前ならび,_名前). n番目の電話番号(_n番目,_電話番号) :- 電話番号録(名前,_電話番号ならび), nth1(_n番目,_電話番号ならび,_電話番号). n番目の学籍番号(_n番目,_学籍番号) :- 学籍番号録(名前,_学籍番号ならび), nth1(_n番目,_学籍番号ならび,_学籍番号). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/307 # # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/iup.2ch-library.com/i/i0478374-1321368771.jpg # # 1. (データの新規追加) 引数を順に名前、電話番号、学籍番号を表す配列 name phone number を用いて実装せよ # 2. (データ項目の削除) 引数で指定されたデータ項目と合致する個人データを住所録から削除する関数 # 3. (データの検索) 引数で指定されたデータ項目を住所録から検索する関数 # 4. 住所録に登録されているすべての個人データを表示するものとする。未使用 # 領域も表示すること。 # '引数で指定されたデータ項目と合致する個人データを住所録から削除する'(_データ項目) :- 住所録(名前,_名前ならび), nth1(_n番目,_名前ならび,_データ項目), 各項目を住所録から削除する(_n番目). 各項目を住所録から削除する(_n番目) :- 名前を削除する(_n番目,_名前ならび,_削除された名前ならび), 住所を削除する(_n番目,_住所ならび,_削除された住所ならび), 電話番号を削除する(_n番目,_電話番号ならび,_削除された電話番号ならび), 学籍番号を削除する(_n番目,_学籍番号ならび,_削除された学籍番号ならび). 名前を削除する(_n番目,_名前ならび) :- retract(住所録(名前,_名前ならび)), n番目の文字項目を削除(_n番目,_名前ならび,_削除された名前ならび), assertz(住所録(名前,_削除された名前ならび)). 住所を削除する(_n番目,_住所ならび) :- retract(住所録(住所,_住所ならび)), n番目の文字項目を削除(_n番目,_住所ならび,_削除された住所ならび), assertz(住所録(住所,_削除された住所ならび)). 電話番号を削除する(_n番目,_電話番号ならび) :- retract(住所録(電話番号,_電話番号ならび)), n番目の文字項目を削除(_n番目,_電話番号ならび,_削除された電話番号ならび), assertz(住所録(電話番号,_削除された電話番号ならび)). 学籍番号を削除する(_n番目,_学籍番号ならび) :- retract(住所録(学籍番号,_学籍番号ならび)), n番目の数値項目を削除(_n番目,_学籍番号ならび,_削除された学籍番号ならび), assertz(住所録(学籍番号,_削除された学籍番号ならび)). n番目の文字項目を削除(_n番目,L1,L2) :- length([_|L0],_n番目), append(L0,[''|R],L1), append(L0,R,L2). n番目の数値項目を削除(_n番目,L1,L2) :- length([_|L0],_n番目), append(L0,[0|R],L1), append(L0,R,L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/246 # # [1] 授業単元:プログラミングと実習2 # [2] 五目並べの石を並べる関数を作りる # 条件 # 1.読み込み部分を関数化する。場所の指定は、行(row,大文字)、 # 列(column,小文字)の順として連続した半角アルファベットとする。 # 例:Aa↓,Gg↓(↓はEnter)とする。 # 読み込んだ結果はA〜Zが0〜25,a〜zが0〜25とする #  出力例Bg # row=1 # columnp=6 # 3] 環境 #  [3.1] OS:windowsXP #  [3.2] コンパイラ名とバージョン: Visual C++ 2008 Express #  [3.3] 言語:C言語 # [4] 期限:11月15日 # [5]その他の制限:アルファベットを整数値に変換して*rowp,*columnpに #         格納し*rowo,*columnpの値を評価するプルグラムを作る # # どうかよろしくお願いします  # '五目並べの石を並べる'(_盤面) :- 盤面を用意する(_盤面), 石を並べる([_],黒,_盤面). 盤面を用意する(_盤面) :- length(_盤面,19), findall(_,( append(_,[L|_],_盤面), length(L,19)), _盤面). 石を並べる(Ln,_石の色,_盤面) :- 着手を得る(Ln,_手), 着手を解析して盤面に石を配置する(_手,_石の色,_盤面), 次の石の色(_石の色,_次の石の色), 石を並べる([_|Ln],_次の石の色,_盤面),!. 石を並べる(_,_,_). 着手を得る(Ln,_手) :- length(Ln,_何手目), writef('着手を入力して下さい(終了するときは改行だけ)\n第%t手目 : ',[_何手目]), get_line(_手). 着手を解析して盤面に石を配置(_手,_石の色,_盤面) :- 着手を解析して(_手,_行,_列), 盤面に石を配置する(_何行,_何列,_石の色,_盤面). 盤面に石を配置する(_何行,_何列,_石の色,_盤面) :- length([_|Ln1],_何行), length([_|Ln2],_何列), append(Ln1,[L|_],_盤面), append(Ln2,[_石の色|_],L),!. 手の解析(_手,_何行,_何列) :- sub_atom(_手,0,1,_,_行を表す英大文字), sub_atom(_手,1,1,_,_列を表す英小文字), 英大文字の何番目(_行を表す英大文字,_何行), 英小文字の何番目(_列を表す英小文字,_何列),!. 英大文字の何番目(_行を表す英大文字,_何行) :- nth1(_何行,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_行を表す英大文字). 英小文字の何番目(_列を表す英小文字,_何列) :- nth1(_何列,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_列を表す英小文字). 次の石の色(黒,白). 次の石の色(白,黒). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/140 # # [1] 授業単元: Cプロ # [2] 問題文(含コード&リンク): # 3行3列の行列aを入力後、余因子行列で行列値|a|を求める # '3行3列の行列aを入力後、余因子行列で行列値|a|を求める' :- '3行3列の行列aを入力'(_a), '余因子行列で行列値|a|を求める'(_a,_行列式_aの値), writef('行列値|a|は%tです。\n',[_行列値_aの値]). '3行3列の行列aを入力'(_a) :- length(_a,3), findall(L,( nth1(_nth1,_a,L), length(L,3), '3列入力する'(_nth1,1,L)), _a). '3列入力する'(_,_,[]). '3列入力する'(_行位置,_列位置,[V|R]) :- writef('列入力[%t][%t] : ',[_行位置,_列位置]), get_line(Line), atom_to_term(Line,V,_), _列位置_2 is _列位置 + 1, '3列入力する'(_行位置,_列位置_2,R). '余因子行列を使って逆行列を得る'(_n,_正方行列,_逆行列) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値), 余因子行列(_n,_正方行列,_余因子行列), 転置(_余因子行列,_転置された余因子行列), 行列のすべての要素に値を掛ける(1,_n,_転置された余因子行列,1 / _行列式の値,_逆行列). 行列のすべての要素に値を掛ける(_行目,_n,LL,_,LL) :- _行目 > _n,!. 行列のすべての要素に値を掛ける(_行目,_n,LL1,_乗数 / _除数,LL2) :- '行基本変形'(_乗数 / _除数 # _行目,LL1,LL3), _行目_2 is _行目 + 1, 行列のすべての要素に値を掛ける(_行目_2,_n,LL3,_乗数 / _除数,LL2). '余因子行列で行列値|a|を求める'(_a,_行列式_aの値) :- 余因子行列(_n,_a,_余因子行列), _a = [_aの第一行|_], _余因子行列 = [_余因子行列の第一行|_], '二つのならびの積の和'(_aの第一行,_余因子行列の第一行,_行列式_aの値). '二つのならびの積の和'([],[],0). '二つのならびの積の和'([A|R1],[B|R2],S) :- '二つのならびの積の和'(R1,R2,S_1), S is S_1 + A * B. 余因子行列(_n,_正方行列,_余因子行列) :- length(_余因子行列,_n), findall(L,( nth1(_i,_余因子行列,L), 余因子行列の要素が余因子である(_n,_正方行列,_i,L)), _余因子行列). 余因子行列の要素が余因子である(_n,_正方行列,_i,L) :- length(L,_n), findall(_余因子,( nth1(_j,L,_余因子), 余因子(_n,_正方行列,_i,_j,_余因子)), L). 行列式の値(_正方行列,_i,_n,_行列式の値) :- findsum(W,( 'n次正方行列の要素を列・行取り出す'(_n,_正方行列,_i,_j,_正方行列の要素), 余因子(_n,_正方行列,_i,_j,_余因子), W is _正方行列の要素 * _余因子), _行列式の値). 余因子(_n,_正方行列,_i,_j,_余因子) :- 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子). 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) :- '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列), 'i,jから乗数を得る'(_i,_j,_乗数), 二つの対角要素の積を得る(_n,_n_1次正方行列,_右下がり対角要素の積,_右上がり対角要素の積), _余因子 is _乗数 * (_右下がり対角要素の積-_右上がり対角要素の積). '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列) :- '第何行を取り除く'(_正方行列,_i,_第i行が取り除かれた行列), 転置(_第i行が取り除かれた行列,_転置された第i行が取り除かれた行列), '第何行を取り除く'(_転置された第i行が取り除かれた行列,_j,_転置された第i行第j列が取り除かれた行列), 転置(_転置された第i行第j列が取り除かれた行列,_n_1次正方行列). '第何行を取り除く'(_正方行列,_第何行,_第i行が取り除かれた行列) :- append(L0,[L|R],_正方行列), length([_|L0],_第何行), append(L0,R,_第i行が取り除かれた行列). 二つの対角要素の積を得る(_n,_正方行列,_右下がり対角要素の積,_右上がり対角要素の積) :- 二つの対角要素を得る(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび), 対角要素の掛算(_右下がり対角要素ならび,_右下がり対角要素の積), 対角要素の掛算(_右上がり対角要素ならび,_右上がり対角要素の積). 二つの対角要素を得る(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび) :- 右下がり対角要素ならび(_n,_正方行列,_右下がり対角要素ならび), 右上がり対角要素ならび(_n,_正方行列,_右上がり対角要素ならび). 右下がり対角要素ならび(_n,_正方行列,_右下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), nth1(_nth1,L,V)), _右下がり対角要素ならび). 右上がり対角要素ならび(_n,_正方行列,_右上がり対角要素ならび) :- findall(V,( append(_,[L|R],_正方行列), length([_|R],_nth1), nth1(_nth1,L,V)), _右上がり対角要素ならび),!. 左下がり対角要素ならび(_n,_正方行列,_左下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), length([_|R],_nth1), append(_,[V|R],L)), _左下がり対角要素ならび),!. 左上がり対角要素ならび(_n,_正方行列,_左下がり対角要素ならび) :- findall(V,( append(_,[L|R1],_正方行列), length([_|R1],_nth1), length([_|R2],_nth1), append(_,[V|R2],L)), _左上がり対角要素ならび),!. 'i,jから乗数を得る'(_i,_j,(-1)) :- 1 is (_i + _j) mod 2,!. 'i,jから乗数を得る'(_i,_j,1) :- 0 is (_i + _j) mod 2,!. 対角要素の掛算([],1). 対角要素の掛算([A|R],X) :- 対角要素の掛算(R,Y), X is A * Y. 行列式の値(_正方行列,_i,_n,_行列式の値) :- findsum(W,( 'n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i,_j,_正方行列の要素), 余因子(_n,_正方行列,_i,_j,_余因子), W is _正方行列の要素 * _余因子), _行列式の値). 'n次正方行列の要素を行・列順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_i行), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素). 'n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_j列), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1294641578/678 # # point順に並び替え、ランクを表示する # # テーブル名 :tbl_point # フィールド名:point # name # gender # # 表示    :p_rank, name, gender, point # # select rank() over (order by [point] desc) as [p_rank], name, point from [tbl_point]; # # p_rank | name | gender | point # # 1 | hoge | 1 | 98 # 2   | fuga | 2 | 80 # 3  | poyo | 2 | 70 # 4  | boke | 1 | 60 # # ここまではできるのですが # # p_rank | mp_rank | wp_rank | name | gender | point # # 1 | 1 | | hoge | 1 | 98 # 2 | | 1 | fuga | 2 | 80 # 3  | | 2 | poyo | 2 | 70 # 4  | 2 | | boke | 1 | 60 # # gender毎のも表示するにはどうすればいいですか? # 'gender毎のも表示する' :- ランクの作成(LL_R,LL1_R,LL2_R), write('p_rank | mp_rank | wp_rank | name | gender | point\n\n'), append(L0,[[_point,_gender,_name]|R],LL_R), 性別ランクを得る(LL1_R,LL2_R,_name,_gender,_mp_rank), 表示する(L0,_point,_name,_gender,_mp_rank), R = []. ランクの作成(LL_R,LL1_R,LL2_R) :- ポイントランクの作成(LL_R), 男性ランクの作成(LL1_R), 女性ランクの作成(LL2_R). ポイントランクの作成(LL_R) :- findall([_point,_name,_gender],( tbl_point(_point,_name,_gender)), LL), rsort(LL,LL_R),!. 男性ランクの作成(LL1_R) :- findall([_point,_name],( tbl_point(_point,_name,1)), LL1), rsort(LL1,LL1_R). 女性ランクの作成(LL2_R) :- findall([_point,_name],( tbl_point(_point,_name,2)), LL2), rsort(LL2,LL2_R), 性別ランクを得る(LL1_R,LL2_R,_name,1,_rank) :- nth1(_rank,LL1_R,[_,_name]),!. 性別ランクを得る(LL1_R,LL2_R,_name,2,_rank) :- nth1(_rank,LL2_R,[_,_name]),!. 表示する(L0,_point,_name,1,_mp_rank) :- length([_|L0],_p_rank), writef('%7l|%9c|%9c|%6c|%8c|%6r\n',[_p_rank,_mp_rank,' ',_name,1,_point]),!. 表示する(L0,_point,_name,2,_wp_rank) :- length([_|L0],_p_rank), writef('%7l|%9c|%9c|%6c|%8c|%6r\n',[_p_rank,' ',_wp_rank,_name,2,_point]),!. rsort(L1,L2) :- sort(L1,L3), reverse(L3,L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/12 # # 【 課題 】疑似乱数を生成する java.util.Random クラスを使って、 # 占いを行う Fortune クラスを作りなさい。fortune メソッドを作成し、 # そのメソッドに String クラスの # インスタンスを渡せば名前占いを、 # また整数 (int) を渡せば誕生日占いを # するようにしなさい。 # 名前占いと誕生日占いのアルゴリズムは # 適当に決めなさい。 # 占い結果は「絶好調!」「まあまあ」 # 「絶不調orz」とし、 # それぞれ30%、40%、40%の確率で # 出るようにしなさい。 # # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】6/29 0:00まで # 【 Ver  】java.version 1.6.0_25 # # 画像が消されてしまったようなので # 再書き込みさせてもらいました。 # 本日中にお願いします。 # # '擬似乱数を生成して、占いを行う'(_文字列または整数) :- '文字列を渡せば名前占いを、また整数 (int) を渡せば誕生日占いをする'(_文字列または整数,_占いの結果), writef('占いの結果は %t です。\n',[_占いの結果]). '文字列を渡せば名前占いを、また整数 (int) を渡せば誕生日占いをする'(_文字列,占いの結果) :- atom(_文字列), 名前占い(_文字列,_占いの結果). '文字列を渡せば名前占いを、また整数 (int) を渡せば誕生日占いをする'(_整数._占いの結果) :- integer(_整数), 誕生日占い(_整数,_占いの結果). 名前占い(_文字列,_占いの結果) :- atom_codes(_文字列,Codes), sum(Codes,Sum), N is Sum mod 12 + 1, '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(N,_占い結果). 誕生日占い(_整数,_占いの結果) :- 整数から星座を得る(_整数,_星座), nth1(_何番目,[牡牛座,双子座,蟹座,獅子座,乙女座,天秤座,蠍座,射手座,山羊座,山羊座,水瓶座,魚座],_星座), '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_何番目,_占い結果). '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(N,_占い結果) :- 擬似乱数を生成する(_擬似乱数), _判定数 is ((_擬似乱数 * N) mod 110) + 1, '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_判定数,_占い結果). '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_判定数,'絶好調!') :- _判定数 >= 1, _判定数 =< 30. '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_判定数,まあまあ) :- _判定数 >= 31, _判定数 =< 70. '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_判定数,'絶不調orz') :- _判定数 >= 71, _判定数 =< 110. 名前占い(_文字列,_占いの結果) :- atom_codes(_文字列,Codes), sum(Codes,Sum), N is Sum mod 12 + 1, '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(N,_占い結果). 誕生日占い(_整数,_占いの結果) :- 整数から星座を得る(_整数,_星座), nth1(_何番目,[牡牛座,双子座,蟹座,獅子座,乙女座,天秤座,蠍座,射手座,山羊座,山羊座,水瓶座,魚座],_星座), '占い結果は「絶好調!」「まあまあ」「絶不調orz」とし、それぞれ30%、40%、40%の確率で出る'(_何番目,_占い結果). 擬似乱数を生成する(_擬似乱数) :- _擬似乱数 is random(3521). 整数から星座を得る(_整数,_星座) :- _月 is _整数 // 100, _日 is _整数 mod 100, 星座判定(_月,_日,_星座). 星座判定(_月,_日,_星座) :- 星座(_星座,_月下限/_日下限-_月上限/_日上限), _月 = _月下限, _月 = _月上限, _日 >= _日下限, _日 =< _日上限,!. 星座判定(_月,_日,_星座) :- 星座(_星座,_月下限/_日下限-_月上限/_日上限), _月 = _月下限, _日 >= _日下限,!. 星座判定(_月,_日,_星座) :- 星座(_星座,_月下限/_日下限-_月上限/_日上限), _月 = _月上限, _日 =< _日上限,!. 星座(牡牛座,4/21-5/21). 星座(双子座,5/22-6/21). 星座(蟹座,6/22-7/22). 星座(獅子座,7/23-8/22). 星座(乙女座,8/23-9/23). 星座(天秤座,9/24-10/23). 星座(蠍座,10/24-11/22). 星座(射手座,11/23-12/21). 星座(山羊座,12/22-12/31). 星座(山羊座,1/1-1/20). 星座(水瓶座,1/21-2/18). 星座(魚座,2/19-3/20). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/994 # # 0から1000までの整数を英語で出力する # という課題があるのですが # # まったくわからないので教えてください # # '0から1000までの整数を英語で出力する'(0) :- write(zero),!. '0から1000までの整数を英語で出力する'(N) :- '1から1000までの整数を英語で出力する'(N,_英語表現), write(_英語表現),!. '1から1000までの整数を英語で出力する'(0,'') :- !. '1から1000までの整数を英語で出力する'(N,_英語表現) :- N =< 10, nth1(N,[one,two,three,four,five,six,seven,eight,nine,ten],_英語表現),!. '1から1000までの整数を英語で出力する'(N,_英語表現) :- N >= 11, N =< 19, M is N mod 10, nth1(M,[eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen],_英語表現),!. '1から1000までの整数を英語で出力する'(N,_英語表現) :- N >= 21, N =< 99, N_1 is N // 10 - 1, M is N mod 10, nth1(N_1,[twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety],_10の桁の英語表現), '0から1000までの整数を英語で出力する'(M,_1の桁の英語表現), concat_atom([_10の桁の英語表現,'-',_1の桁の英語表現],_英語表現). '1から1000までの整数を英語で出力する'(N,_英語表現) :- N >= 100, N =< 999, N_1 is N // 100, M is N mod 100, '1から1000までの整数を英語で出力する'(N_1,_100の桁の英語表現), '1から1000までの整数を英語で出力する'(M,_10の桁以下の英語表現), concat_atom([_100の桁の英語表現,' hundred and ',_10の桁以下の英語表現],_英語表現). '1から1000までの整数を英語で出力する'(1000,'one-thousand'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/153 # # if select * from t where id=1 # then update t set foo=bar where id=1 # # これをSQLで表現したいのですが可能でしょうか? # # 'if select * from t where id=1 then update t set foo=bar where id=1' :- '1要素のupdate'(t,id1,'1',foo,bar). '1要素のupdate'(_テーブル名,_鍵属性名,_鍵値,_置換属性名,_置換する値) :- 組構造を得る(_テーブル名,_属性名ならび), 鍵値を設定された項を作る(_テーブル名,_属性ならび,_鍵属性名,_鍵値,_現在の組,P), 置換する値を設定された項を作る(_テーブル名,_属性ならび,_置換属性名,_置換する値,_置換する組,_置換する項), retract(_現在の項), '置換される組の変数部分だけ元の値に単一化する'(_現在の組,_置換する組), asserta(_置換する項). 組構造を得る(_テーブル名,_属性名ならび) :- findall([_属性番号,_属性名],( テーブル構造(_テーブル名,_属性番号,_属性名)), L1), sort(L1,L2), findall(_属性名,( member([_,_属性名],L2)), _属性名ならび). 置換する値を設定された項を作る(_テーブル名,_属性ならび,_置換属性名,_置換する値,_置換する組,_置換項) :- 置換する組(_属性名ならび,_置換する組), 置換する値を置換する組に設定(_属性名ならび,_置換属性名,_置換する値,_置換する組), _置換項 =.. [_テーブル名|_置換する組]. 鍵値を設定された項を作る(_テーブル名,_属性ならび,_鍵属性名,_鍵値,_現在の組,_現在の項) :- 現在の組(_属性名ならび,_現在の組), 鍵を現在の組に設定(_属性名ならび,_鍵属性名,_鍵値,_現在の組), _現在の項 =.. [_テーブル名|_現在の組]. 現在の組(_属性名ならび,_現在の組) :- length(_属性名ならび,Len), length(_現在の組,Len). 置換する組(_属性名ならび,_置換する組) :- length(_属性名ならび,Len), length(_置換する組,Len). 鍵を現在の組に設定(_属性名ならび,_鍵名,_鍵値,_現在の組) :- nth1(_鍵属性名の位置,_属性名ならび,_鍵属性名), nth1(_鍵属性名の位置,_現在の組,_鍵値),!. 置換する値を置換する組に設定(_属性名ならび,_置換属性名,_置換する値,_置換する組) :- nth1(_置換属性名の位置,_属性名ならび,_鍵属性名), nth1(_鍵属性名の位置,_置換する組,_鍵値),!. '置換する組の変数部分だけ元の値に単一化する'([],[]). '置換する組の変数部分だけ元の値に単一化する'([A|R1],[A|R2]) :- '置換する組の変数部分だけ元の値に単一化する'(R1,R2). '置換する組の変数部分だけ元の値に単一化する'([A|R1],[B|R2]) :- \+(A = B), '置換する組の変数部分だけ元の値に単一化する'(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/853 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):(列挙体) # Sunday, Monday, Tuesday, Wednesday, Thursday, # Friday, Saturday という曜日を表す列挙体 # enum Days を定義せよ.以下の実行例のように, # 曜日を入力すると,enum Days の列挙定数を利用して # 週末,平日,それ以外の場合にそれぞれメッセージを # 表示するプログラムを作成せよ. # 例 % ./q3-3 # 曜日を入力して下さい # (0:日1:月2:火3:水4:木5:金6:土):0 # やった!週末だ # # 曜日を入力して下さい # (0:日1:月2:火3:水4:木5:金6:土):5 # 今日も講義頑張ろう! # # 曜日を入力して下さい # (0:日1:月2:火3:水4:木5:金6:土):7 # この日はないぞう... # 曜日([日,月,火,水,木,金,土]). '曜日を入力すると,曜日 の列挙定数を利用して 週末,平日,それ以外の場合にそれぞれメッセージを表示する' :- 曜日を入力すると(_曜日), '曜日 の列挙定数を利用して 週末,平日,それ以外の場合にそれぞれメッセージを'(_曜日,_メッセージ), 表示する'(_メッセージ),!. 曜日を入力すると(_曜日) :- write('曜日を入力してください [日,月,火,水,木,金,土] : '), get_line(_曜日),!. '曜日 の列挙定数を利用して 週末,平日,それ以外の場合にそれぞれメッセージを'(_曜日,週末は一家揃って中央競馬) :- 曜日から曜日番号を得る(_曜日,_曜日番号), 週末だ(_曜日番号),!. '曜日 の列挙定数を利用して 週末,平日,それ以外の場合にそれぞれメッセージを'(_曜日,平日も一家揃って公営競馬) :- 曜日から曜日番号を得る(_曜日,_曜日番号), 平日だ(_曜日番号),!. '曜日 の列挙定数を利用して 週末,平日,それ以外の場合にそれぞれメッセージを'(_曜日,_メッセージ) :- atomic_list_concat(['入力された ',_曜日,' は 日,月,火,水,木,金,土 のいずれでもありません],_メッセージ),!. 曜日から曜日番号を得る(_曜日,_曜日番号), 曜日(_曜日ならび), nth0(_曜日番号,_曜日ならび,_曜日). 週末だ(_曜日番号) :- 0 is _曜日番号 mod 6. 平日だ(_曜日番号) :- \+(0 is _曜日番号 mod 6). 表示する(_メッセージ) :- writef('%t\n',[_メッセージ]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/681 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク): # N×Nの行列を入力させ、その転置行列を出力するプログラムを作成せよ. # ただしNはプログラム内で記号定数として定義し,ここでは3とすること.転置行列とは、行と列を入れ替えた行列である. # 実行した時↓ # $ ./kadai # 3 x 3 matrix: # Row 1? 1 4 5 # Row 2? 10 8 9 # Row 3? 7 2 11 # Transposed matrix: # 1 10 7 # 4 8 2 # 5 9 11 # # 'N×N'(3). 'N×Nの行列を入力させ、その転置行列を出力するプログラムを作成せよ.ただしNはプログラム内で記号定数として定義し,ここでは3とすること.転置行列とは、行と列を入れ替えた行列である. ' :- 'N×Nの行列を入力させ'(_行列), 'N×Nの行列の転置行列を'(_行列,_転置行列), 出力する(_転置行列). 'N×Nの行列を入力させ'(_行列) :- 'N×N'(_N) length(_行列,_N), findall(L,( append(_,[L|_],_行列), length(L,_N), 入力する(L)), _行列). 入力する(_N,L) :- writef('%t要素の値をカンマ区切りで入力してください : ',[_N]), readln(L),!. 入力する(_N,L) :- writef('適切な%t項目の値が得られませんでした。再入力をお願いします。\n',[_N]), 入力する(_N,L). 'N×Nの行列の転置行列を'(_行列,_転置行列) :- 'N×N'(_N), 'N×Nの行列の転置行列を'(1,_N,_行列,_転置行列). 'N×Nの行列の転置行列を'(M,_N,_,[]) :- M > _N,!. 'N×Nの行列の転置行列を'(M,_N,_行列,[L|R]) :- findall(E,( append(_,[L|_],_行列), nth1(M,L,E)), L), M2 is M + 1, 'N×Nの行列の転置行列を'(M,_N,_行列,R). 出力する(_転置行列) :- append(_,[L|R1],_転置行列), append(_,[E|R2],L), writef('%5r,',[E]), R2 = [E2], writef('%5r\n',[E2]), R1 = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/666 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク): 月の英語名を初期値とした文字列配列(大きさは12x10)を使って # キーボードから月の英語名を入力しそれが何月かを表示するプログラムを作成せよ. # 実行例↓ # $./kadai # Month? October # October is 10 gatsu # # $./kadai # Month? May # May is 5 gatsu # '月の英語名を初期値とした文字列配列(大きさは12x10)を作る' :- length(LL,12), findall(L,( append(L0,[L|R],LL), length(L,10), length([_|L0],_nth), write('%t月の英語名を入力してください : '), get_line(Line), atom_chars(Line,Chars), append(Chars,_,L)), LL), assertz('月の英語名を初期値とした文字列配列(大きさは12x10)'(LL)). '月の英語名を初期値とした文字列配列(大きさは12x10)を使ってキーボードから月の英語名を入力しそれが何月かを表示する' :- '月の英語名を初期値とした文字列配列(大きさは12x10)'(_文字列配列), キーボードから月の英語名を入力し(_月の英語名), それが何月かを(_月の英語名,_文字列配列,_月), 表示する(_月). キーボードから月の英語名を入力し(_月の英語名) :- write('月の英語名を入力してください : '), get_line(_月の英語名). それが何月かを(_月の英語名,_文字列配列,_月) :- atom_chars(月の英語名,Chars), append(Chars,R,L), nth1(_月,_文字列配列,_月の英語名), すべてが変数(R),!. それが何月かを(_月の英語名,_文字列配列,_月) :- writef('%tは英語の月名ではありません。\n',[_月の英語名]), fail. 表示する(_月) :- writef('%t月です\n',[_月]). すべてが変数([]). すべてが変数([V|R]) :- var(V), すべてが変数(R). % % C152_666.htmlとは違って、無理に文字列配列(大きさは12x10)に近い構造を % 作ってみた。これでも、結局は処理はリストの先頭からだから、ここでの努力は % ほとんど無駄である。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/666 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク): 月の英語名を初期値とした文字列配列(大きさは12x10)を使って # キーボードから月の英語名を入力しそれが何月かを表示するプログラムを作成せよ. # 実行例↓ # $./kadai # Month? October # October is 10 gatsu # # $./kadai # Month? May # May is 5 gatsu # 月の英語名を初期値とした文字列ならびを使ってキーボードから月の英語名を入力しそれが何月かを表示する :- 月の英語名を入力し(_月の英語名), 月の英語名を初期値とした文字列ならび(_月の英語名を初期値とした文字列ならび), それが何月かを表示する(_月の英語名,_月の英語名を初期値とした文字列ならび). それが何月かを表示する(_月の英語名,_月の英語名を初期値とした文字列ならび) :- nth1(_月,_月の英語名を初期値とした文字列ならび,_月の英語名), 何月かを表示する(_月),!. それが何月かを表示する(_月の英語名,_月の英語名を初期値とした文字列ならび) :- writef('%tは月の英語名ではないのではないですか? \n',[_月の英語名]). 月の英語名を初期値とした文字列ならび(['January','Febrary','March','April','May','June','July','Augest','September','October','November','December']). 月の英語名を入力し(_月の英語名) :- write('月の英語名を入力してください : '), get_line(_月の英語名). 何月かを表示する(_月) :- writef('%t月です\n',[_月]). % % Prologに配列はないため、ここでは月の英語名のリスト、例によってリストを % ならびと表現した。Prologはリスト処理の言語であり、配列に当たる構造も % 全て先頭から処理するため、これでよいと思う。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/629 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # scanf により n を受け取り, n×n 行列を二次元乱数配列で定 義する (二次元乱数配列の作成には下記の参考プログラムを利用せよ). その行列の対角より下の成分の和を求めよ. ただし乱数の範囲は 0 〜 3 とする. # 'n を受け取り, n×n 行列を二次元乱数ならびで定 義する (二次元乱数ならびの作成には下記の参考プログラムを利用せよ). その行列の対角より下の成分の和を求める. ただし乱数の範囲は 0 〜 3 とする'(_n,_対角より下の成分の和) :- 'n×n 行列を二次元乱数ならびで定 義する ただし乱数の範囲は 0 〜 3 とする'(_n,_乱数行列), 'その行列の対角より下の成分の和を求める ただし乱数の範囲は 0 〜 3 とする'(_乱数行列,_対角より下の成分の和). 'n×n 行列を二次元乱数ならびで定 義する ただし乱数の範囲は 0 〜 3 とする'(_n,_乱数行列) :- length(_乱数行列,_n), findall(L,( append(_,[L|_],LL), length(L,3), '乱数ならびで定義する ただし乱数の範囲は 0 〜 3 とする'(L)), _乱数行列). '乱数ならびで定義する ただし乱数の範囲は 0 〜 3 とする'([]). '乱数ならびで定義する ただし乱数の範囲は 0 〜 3 とする'([N|R]) :- N is random(4), '乱数ならびで定義する ただし乱数の範囲は 0 〜 3 とする'(R). 'その行列の対角より下の成分の和を求める'(_乱数行列,_対角より下の成分の和) :- 'その行列の対角より下の成分の和を求める'(1,3,_乱数行列,_対角より下の成分の和),!. 'その行列の対角より下の成分の和を求める'(N,N,_,0) :- !. 'その行列の対角より下の成分の和を求める'(M,N,_行列,_総計) :- M2 is M + 1, list_nth(M2,_行列,_行), findsum(_値,( for(1,I,M), nth1(I,_行,_値)), _行の合計), 'その行列の対角より下の成分の和を求める'(M2,N,_行列,_総計の一), _総計 is _行の合計 + _総計の一. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/588 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 3x4 の行列を二次元配列で定義し, 行列の指定した行の和を計算するプログラムを作成せよ. # ただし, 一つの行の合計は, 行の先頭を指す整数型のポインタ a と列数をあらわす整数 n を受け取り, 一行の合計を返す 関数 int row_sum( int* a, int n ) を作成し計算せよ. (関数の引数と返り値の型を指定されたもので作ること) # # '3x4 の行列を二次元配列で定義し, 行列の指定した行の和を計算する'(_指定した行位置,_行の和) :- '3x4 の行列を二次元配列で定義し', '3x4 の行列'(_行列), '3x4 の行列を二次元配列で定義し, 行列の指定した行の和を計算する'(_行列,_指定した行位置,_行の和). '行列の指定した行の和を計算する'(_行列,_指定した行位置,_行の和) :- nth1(_指定した行位置,_行列,_指定した行), sum(_指定した行,_行の和). '3x4 の行列を二次元配列で定義し' :- length(LL,3), findall(L,( append(L0,[L|_],LL), length([_|L0],_行位置), length(L,4), 列を埋める(_行位置,L)), LL), assertz('3x4 の行列'(LL)). 列を埋める(_行位置,L) :- findall(_値,( append(L0,[_値|_],L), length([_|L0],_列位置), 整数入力(_行位置,_列位置,_値)), L). 整数入力(_行位置,_列位置,_値) :- writef('[%t][%t]: ',[_行位置,_列位置]), get_line(Line), 整数入力検査(Line,_値),!. 整数入力(_行位置,_列位置,_値) :- 整数入力(_行位置,_列位置,_値). 整数入力検査(Line,_値) :- atom_to_term(Line,_値,_), integer(_値),!. 整数入力検査(Line,_値) :- writef('入力された%tからは数値が得られません。再入力をお願いします。\n',[Line]), fail. sum([],0). sum([V|R],S) :- sum(R,S2), S is V + S2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/588 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 3x4 の行列を二次元配列で定義し, 行列の指定した行の和を計算するプログラムを作成せよ. # ただし, 一つの行の合計は, 行の先頭を指す整数型のポインタ a と列数をあらわす整数 n を受け取り, 一行の合計を返す 関数 int row_sum( int* a, int n ) を作成し計算せよ. (関数の引数と返り値の型を指定されたもので作ること) # # '3x4 の行列を二次元配列で定義し, 行列の指定した行の和を計算する'(_n行目,_行の和) :- '3x4 の行列を二次元配列で定義し'(LL), nth1(_n行目,LL,L), sum(L,_行の和). '3x4 の行列を二次元配列で定義し'(LL) :- length(LL,3), findall(L,( append(L0,[L|_],LL), length([_|L0],_行位置), length(L,4), 列を埋める(_行位置,L)), LL). 列を埋める(_行位置,L) :- findall(_値,( append(L0,[_値|_],L), length([_|L0],_列位置), 整数入力(_行位置,_列位置,_値)), L). 整数入力(_行位置,_列位置,_値) :- writef('[%t][%t]: ',[_行位置,_列位置]), get_line(Line), 整数入力検査(Line,_値),!. 整数入力(_行位置,_列位置,_値) :- 整数入力(_行位置,_列位置,_値). 整数入力検査(Line,_値) :- atom_to_term(Line,_値,_), integer(_値),!. 整数入力検査(Line,_値) :- writef('入力された%tからは数値が得られません。再入力をお願いします。\n',[Line]), fail. sum([],0). sum([V|R],S) :- sum(R,S2), S is V + S2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305217361/675 # # CSVモジュールを使用してCSVファイルを読み込み。 # 読み込んだファイル全体を指定フィールドでソートする方法を教えてください。 # csvfile = csv.reader(f) # csvfile.sort() # のような書き方をしたら、_csvredaerにそんなメソッドはない、的なエラーです。 # また、sortのkeyの書き方がよく解かりません。 # リスト(ファイル全体)の中のリスト(行)の中のリストのインデックス指定でソート # すればOKのような気がするのですが、書き方が不明です。よろしくお願いします。 'CSVファイルを読み込み。読み込んだファイル全体を指定フィールドでソートする'(_ファイル名,_フィールド位置) :- get_split_lines(_ファイル名,[','],LL), 指定フィールドでソートする(LL,_整列済みならび), ソートキーを剥がしながら出力する(_整列済みならび). 指定フィールドでソートする(LL,_ソートキーが先頭に付加された整列済みならび) :- ソートキーを先頭に付加(LL,LL2), sort(LL2,_ソートキーが先頭に付加された整列済みならび). ソートキーを先頭に付加(_キー位置,[],[]) :- !. ソートキーを先頭に付加(_キー位置,[L1|R1],[[K|L1]|R2]) :- nth1(_キー位置,L1,K), ソートキーを先頭に付加(_キー位置,R1,R2). ソートキーを剥がしながら出力する(_整列済みならび) :- ソートキーを剥がしながら(_整列済みならび,L,R), カンマ区切り文字列に変形(L,_カンマ区切り文字列), writef('%t\n',[_カンマ区切り文字列]), R = []. ソートキーを剥がしながら(_整列済みならび,L,R) :- append(_,[[_付加されたソートキー|L]|R],_整列済みならび). カンマ区切り文字列に変形(L,S) :- concat_atom(L,',',S). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/943 # # これらが5個の課題です。 # お願いします。 # # (5) 3×3行列に整数のデータを入力し,その縦・横・斜めに足した合計がすべて等しくなるかを確認するプログラムを作成せよ.プログラムは以下を満たすものとする. # 整数のデータの入力では,for文を用いること. # 予め3×3個の整数の要素を持つ二次元配列を準備する. # 縦は3本,横は3本,斜め2本のそれぞれの合計が等しいかを確認する必要がある. # '予め3×3個の整数の要素を持つ二次元配列を準備する'(_二次元配列) :- length(_二次元配列,3), findall(L,( append(L0,[L|_],_二次元配列), length(L,3), findall(_要素,( append(L01,[_要素|_],L), length([_|L0],_何行目), length([_|L01],_何列目), writef('[%t][%t] : ',[_何行目,_何列目]), get_integer(_要素)), L)), _二次元配列), assertz(予め用意した二次元配列(_二次元配列)),!. '3×3行列に整数のデータを入力し,その縦・横・斜めに足した合計がすべて等しくなるかを確認する' :- 予め用意した二次元配列(_二次元配列), 行合計が一致する(_二次元配列,_一致した合計), 転置(_二次元配列,_転置された二次元配列), 行合計が一致する(_転置された二次元配列,_一致した合計), 斜め要素の合計(_二次元配列,_一致した合計). 行合計が一致する(_二次元配列,_一致した合計) :- findsum(_合計,( append(_,[_行|_],_二次元配列), sum(_行,_合計)), L), all(L,_一致した合計). 斜め要素の合計(_二次元配列,_一致した合計) :- findsum(_斜め要素,( for(1,N,3), nth1(N,_二次元配列,_行), nth1(N,_行,_斜め要素)), _一致した合計), findsum(_斜め要素,( for(1,N,3), nth1(N,_二次元配列,_行), reverse(_行,_反転した行), nth1(N,_反転した行,_斜め要素)), _一致した合計),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/470 # # [1] 授業単元:C++プログラム # [2] 問題文 # Nr(i)は身長とし、Na(i)氏名のデータとする # どちらも10個の要素を持つ配列であり、それぞれは10人の身長と氏名のデータとして持つ。 #  キーボードから身長Xを入力し、二分検索処理を用いてXの氏名をもとめ、結果をディスプレイへ表示するプログラムを作成せよ。 # よろしくお願いたします # 二分検索がいまいち理解できないので軽く解説も書いていただければ幸いです # 'Nr(i)は身長とし、Na(i)氏名のデータとするどちらも10個の要素を持つ配列であり、それぞれは10人の身長と氏名のデータとして持つ。キーボードから身長Xを入力し、二分検索処理を用いてXの氏名をもとめ、結果をディスプレイへ表示する'(_Nr,_Na) :- 'Nr,Naを身長をキーに整列しておく', 'キーボードから身長Xを入力し'(_身長), 二分検索で身長をキーに氏名を得る(_身長,_氏名ならび), 結果をディスプレイに表示する(_身長,_氏名ならび). 'Nr,Naを身長をキーに整列しておく' :- retract('Nr'(_Nr)), retract('Na'(_Na)), '身長をキーに_Nr,_Naを整列する'(_Nr,_Na,_Nr2,_Na2), assertz('Nr'(_Nr2)), assertz('Na'(_Na2)). '身長をキーに_Nr,_Naを整列する'(_Nr,_Na,_Nr2,_Na2) :- findall([_身長,_氏名],( for(1,N,10), nth1(N,_Nr,_身長), nth1(N,_Na,_氏名)), L1), sort(L1,L2), findall(_身長,( append(_,[[_身長,_]|_],L2)), _Nr2), findall(_氏名,( append(_,[[_,_氏名]|_],L2)), _Nr2),!. 'キーボードから身長Xを入力し'(_身長) :- write('検索する身長を入力してください : '), readln([_身長]), integer(_身長),!. 'キーボードから身長Xを入力し'(_身長) :- 'キーボードから身長Xを入力し'(_身長). 二分検索で身長をキーに氏名を得る(_身長,_氏名ならび) :- 'Nr'(_身長ならび), 'Na'(_氏名ならび), length(_身長ならび,Len), findall(_氏名,( 二分検索で身長をキーに氏名を得る(1,Len,_身長ならび,_氏名ならび,_身長,_氏名),_氏名ならび), \+(_氏名ならび=[]),!. 二分検索で身長をキーに氏名を得る(_身長,'求める氏名は得られませんでした。\n'). 二分検索で身長をキーに氏名を得る(Nth1,Nth2,_身長ならび,_氏名ならび,_身長,_氏名) :- Nth3 is (Nth1 + Nth2) // 1, nth1(Nth3,_身長ならび,_身長1), 二分検索で身長をキーに氏名を得る(_身長,_身長1,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび,_氏名). 二分検索で身長をキーに氏名を得る(_身長,_身長1,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび,_氏名) :- _身長 > _身長1, 二分検索で身長をキーに氏名を得る(Nth1,Nth3,_身長ならび,_氏名ならび,_身長,_氏名). 二分検索で身長をキーに氏名を得る(_身長,_身長1,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび,_氏名) :- _身長 < _身長1, 二分検索で身長をキーに氏名を得る(Nth3,Nth2,_身長ならび,_氏名ならび,_身長,_氏名). 二分検索で身長をキーに氏名を得る(_身長,_身長,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび,_氏名) :- nth1(Nth3,_氏名ならび,_氏名). 二分検索で身長をキーに氏名を得る(_身長,_身長,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび) :- 要素位置によるならびからの削除(Nth3,_身長ならび,_身長ならび2), 要素位置によるならびからの削除(Nth3,_氏名ならび,_氏名ならび2), Nth2_1 is Nth2 - 1, 二分検索で身長をキーに氏名を得る(Nth1,Nth2_1,_身長ならび2,_氏名ならび2,_身長,_氏名). 結果をディスプレイに表示する(_身長,_氏名ならび) :- list(_氏名ならび), append(_,[_氏名|R],_氏名ならび), writef('身長%tの氏名は%tです\n',[_身長,_氏名]), R = [],!. 結果をディスプレイに表示する(_身長,_診断) :- atom(_診断), write(_診断),!. 要素位置によるならびからの削除(Nth,L1,L2) :- length([_|L0],Nth), append(L0,[_|R],L1), append(L0,R,L2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/28 # # (1)c言語(2)問題:日数計算プログラムをベースに基ずいて「ここに処理が入る」というところに入力をお願いします # 実行結果:数え始める西暦を入力してください   1967,8,7 # 数え終える西暦を入力してください        2009,6,12 # 1967,8,7から2009,6,12までの日数は15285日です # ベース # #include <stdio.h> # int uruu(int y); # int monthday(int y, int m); # int main(){ # int year_a, month_a, day_a; # int year_b, month_b, day_b; # int days; # int i; # days = 0; # printf("日数計算プログラム\n"); # printf("数え始める西暦年月日を入力してください\n"); # scanf("%d,%d,%d",&year_a, &month_a, &day_a); # printf("終わりの西暦年月日を入力してください\n"); # scanf("%d,%d,%d",&year_b, &month_b, &day_b); # ここに処理が入る # printf("%d年%d月%d日から%d年%d月%d日までの日数は%d日です。\n",year_a, month_a, day_a, year_b, month_b, day_b, days); # return 0;} # int uruu(int y){ # int ret; # ここに処理が入る # return ret; # } # int monthday(int y, int m){ # int d; # ここに処理が入る # return d; # } # 日数を数える :- 数え始める西暦を入力してください(_年1,_月1,_日1), 終わりの西暦年月日を入力してください(_年2,_月2,_日2), 日数を数える(_年1,_月1,_日1,_年2,_月2,_日2,0,_日数). writef('%t年%t月%t日から%t年%t月%t日までの日数は%t日です。\n',[_年1,_月1,_日1,_年2,_月2,_日2,_日数]). 日数を数える(_年2,_月1,_日1,_年2,_月2,_日2,_日数,_日数) :- _月1 >= _月2, _日1 >= _日2,!. 日数を数える(_年1,_月1,_日1,_年2,_月2,_日2,_日数1,_日数) :- 翌日(_年1,_月1,_日1,_翌日の年,_翌日の月,_翌日の日), _日数2 is _日数1 + 1, 日数を数える(_翌日の年,_翌日の月,_翌日の日,_年2,_月2,_日2,_日数). 翌日(_年1,12,31,_翌日の年,1,1) :- _翌日の年 is _年1 + 1,!. 翌日(_年,_月1,_日1,_年,_月2,1) :- 月末日(_年1,_月1,_日1), _月2 is _月1 + 1,!. 翌日(_年,_月,_日1,_年,_月,_日2) :- _日2 is _日1 + 1. 月末日(_年,2,29) :- !. 月末日(_年,2,28) :- \+(うるう年(_年)),!. 月末日(_,_,31) :- !. 月末日(_,_,30) :- member(_月,[4,6,9,11]),!. 数え始める西暦を入力してください(_年,_月,_日) :- write('数え始める西暦を入力してください '), readln([_年,_月,_日]). 終わりの西暦年月日を入力してください(_年,_月,_日) :- write('終わりの西暦年月日を入力してください '), readln([_年,_月,_日]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/456 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://codepad.org/dx3nSGGc # # //盤面データ構造体 # struct aa_t { # int cell[9][9]; # }; # # ・(r,c)に数字kは入らないとする関数 # マス(r,c)に9ビットの状態数が与えられています。 # たとえば110101110のとき、kが2なら、この関数によって110101100というようにします。 # このとき、元から0であり変更がなかったなら0を、1を0に変更したら1を返すようにします。 # int aa_del(struct aa_t *s, int r, int c, int k) { # if((s->cell[r][c] & (0001 << (k-1))) == 0000){return 0;} # else {s->cell[r][c] = (s->cell[r][c] & ( ~(0001 << (k-1)) ) );return 1;} # } # # ・横一列に同じ数字は入り得ないとする関数 # (r,c)には1~9のいずれかの数字が入ります。 # たとえば(r,c)のマスに3,6,9の数字が入る可能性がある事を100100100という状態数で表しています。 # もし(r,c)の状態数が000000100となると、(r,c)に3が入ることが確定します。 # このときc列に3が入る可能性を消す関数です。(もちろん(r,c)以外の) # そしてこの関数で実際に変更を受けたマスの数を戻り値として返すようにします。 '(r,c)に数字kは入らない'(_r,_c,_k,LL1,LL2,_b) :- findall(N,( bit_n(M,N), \+(M=_k)), L), sum(L,S), nth1(_r,LL1,L1), nth1(_c,L1,_b), _b2 is _B \/ S, '行列の置換'(_r,_c,_b2,LL1,LL2),!. '横一列に同じ数字は入り得ない'(_r,_c,_k,LL1,LL2) :- 'kを否定する為の数'(_k,S), 転置して列のビット処理(LL1,_r,_c,_k,S,LL2). 'kを否定する為の数'(_k,S) :- findall(N,( bit_n(M,N), \+(M=_k)), L), sum(L,S),!. 転置して列のビット処理(LL1,_r,_c,_k,S,LL2) :- 転置(LL1,LL3), 行とカラムを得る(LL3,_c,_r,L3,_b), 行全体のビットオフ(L3,S,L2), 指定カラムだけビットオン(L2,_k,_b,_b3,L4), 要素位置指定によるならびの置換(LL3,_c,L4,LL4), 転置(LL4,LL2),!. 行とカラムを得る(LL,_r,_c,L,_b) :- nth1(_r,LL,L), nth1(_c,L,_b),!. 行全体のビットオフ(L3,S,L2) :- findall(_b2,( member(I,L3), _b2 is I /\ S), L2),!. 指定カラムだけビットオン(L2,_k,_b,_b3,L4) :- bit_n(_k,J), _b3 is _b \/ J, 要素位置指定によるならびの置換(L2,_r,_b3,L4),!. bit_n(0,0). bit_n(1,1). bit_n(2,2). bit_n(3,4). bit_n(4,8). bit_n(5,16). bit_n(6,32). bit_n(7,64). bit_n(8,128). bit_n(9,256). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/4 # # 150スレ記念問題 # [1]授業単元:C言語演習 # [2] 16個の整数を降順に整列したものを標準出力する関数 # void sort(int a,intb,intc,intd, int e,int f,int g,inth, inti,int j,int k,int l, int m,int n,int o,int p) # を書きなさい # 但しコードには配列演算子やポインタ演算子が現れてはならない。 # [3]Linux(Ubuntu)/gcc4.5/C言語 # [4] この150スレが終わるまで # [5]どのようなパターンでも確実に整列されることが必要です。 # 出来るだけ短いコードでお願いします。 # # '16個の整数を降順に整列したものを標準出力する'(_a,_b,_c,_d,_e,_f,_g,_h,_i,_j,_k,_l,_m,_n,_o,_p) :- 整数を降順に整列したものを標準出力する([_a,_b,_c,_d,_e,_f,_g,_h,_i,_j,_k,_l,_m,_n,_o,_p]). 整数を降順に整列したものを標準出力する(_整数のならび) :- 整数を降順に整列(_整数のならび,_降順に整列した整数ならび), 標準出力する(_降順に整列した整数ならび). 整数を降順に整列([],[]) :- !. 整数を降順に整列(L1,[A|R]) :- 降順用選択(L1,A,L2), 整数を降順に整列(L2,R). 降順用選択(L1,A,L2) :- append(L0,[A|R1],L1), \+((member(B,L0),B @> A)), \+((member(C,R1),C @> A)), append(L0,R1,L2),!. 標準出力する(_降順に整列した整数ならび) :- concat_atom(_降順に整列した整数ならび,' ',S), writef('%t\n',[S]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/4 # # 150スレ記念問題 # [1]授業単元:C言語演習 # [2] 16個の整数を昇順に整列したものを標準出力する関数 # void sort(int a,intb,intc,intd, int e,int f,int g,inth, inti,int j,int k,int l, int m,int n,int o,int p) # を書きなさい # 但しコードには配列演算子やポインタ演算子が現れてはならない。 # [3]Linux(Ubuntu)/gcc4.5/C言語 # [4] この150スレが終わるまで # [5]どのようなパターンでも確実に整列されることが必要です。 # 出来るだけ短いコードでお願いします。 # # '16個の整数を昇順に整列したものを標準出力する'(_a,_b,_c,_d,_e,_f,_g,_h,_i,_j,_k,_l,_m,_n,_o,_p) :- 整数を昇順に整列したものを標準出力する([_a,_b,_c,_d,_e,_f,_g,_h,_i,_j,_k,_l,_m,_n,_o,_p]). 整数を昇順に整列したものを標準出力する(_整数のならび) :- 整数を昇順に整列(_整数のならび,_昇順に整列した整数ならび), 標準出力する(_昇順に整列した整数ならび). 整数を昇順に整列([],[]) :- !. 整数を昇順に整列(L1,[A|R]) :- append(L0,[A|R1],L1), \+((member(B,L0),B @< A)), \+((member(C,R1),C @< A)), append(L0,R1,L2), 整数を昇順に整列(L2,R). 標準出力する(_昇順に整列した整数ならび) :- concat_atom(_昇順に整列した整数ならび,' ',S), writef('%t\n',[S]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/304 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # January, February, March, April, May, June, July, August, September,October, November, December # を12個の文字列をポインタの配列を用いて宣言し、ASCIIコードで昇順に並び替えなさい。 # char *month[12] = { “January”, “February”, …, “December” } ; # ASCIIコードで昇順 # A<B<C< … <Z , i文字目まで同じ場合は、i+1文字目の大小で順序をつける #  [3.1] OS:windows #  [3.2] コンパイラ名とバージョン:cygwin #  [3.3] 言語: C # [4] 期限: 2011/7/6 # [5] その他の制限: # 現在ポインタを習っているところです。 # 出来るだけ簡単に書いてもらえると助かります。 # # 'January, February, March, April, May, June, July, August, September,October, November, December を12個の文字列をASCIIコードで昇順に並び替える' :- split('January, February, March, April, May, June, July, August, September,October, November, December',[' ',','],L), バブルソート(L,_昇順に並べ替えられた12個の文字列). バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一),!, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/293 # # 【1】c言語 【2】二つの西暦で入力された年月日から、その間の日数を計算するプログラムを作成してください。 # ここに処理が入る というとこのプログラムをお願いします # プログラムのベース # int uruu(int y); # int monthday(int y, int m); # //---------------------------------------------------- # int main(){ # int year_a, month_a, day_a; # int year_b, month_b, day_b; # int days; # int i; # days = 0; # printf("日数計算プログラム\n"); # printf("数え始める西暦年月日を入力してください\n"); # scanf("%d,%d,%d",&year_a, &month_a, &day_a); # printf("数え終わる西暦年月日を入力してください\n"); # scanf("%d,%d,%d",&year_b, &month_b, &day_b); # ここに処理が入いる # printf("%d年%d月%d日から%d年%d月%d日までの日数は%d日です。\n", year_a, month_a, day_a, year_b, month_b, day_b, days); # return 0; } # //うるう年ならtrue(1)、そうでないならfalse(0)を返す関数 # int uruu(int y){ # int ret; # ここに処理が入る # return ret; } # //年、月を受け取り、その月の日数を返す関数 # int monthday(int y, int m){ # int d; # ここに処理が入る # return d; } # # '二つの西暦で入力された年月日から、その間の日数を計算する' :- 起点年月日の入力(_起点年,_起点月,_起点日), 終点年月日の入力(_終点年,_終点月,_終点日), count(翌日(_起点年,_起点月,_起点日,_終点年,_終点月,_終点日,_,_,_),_日数), writef('日数は %t です。\n',[_日数]). 起点年月日の入力(_起点年,_起点月,_起点日) :- write('起点となる年を入力してください : '), get_integer(_起点年), write('起点となる月を入力してください : '), get_integer(_起点月), write('起点となる日を入力してください : '), get_integer(_起点日),!. 終点年月日の入力(_終点年,_終点月,_終点日) :- write('終点となる年を入力してください : '), get_integer(_終点年), write('終点となる月を入力してください : '), get_integer(_終点月), write('終点となる日を入力してください : '), get_integer(_終点日),!. 翌日(_集点年,_終点月,_終点日,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日) :- !,fail. 翌日(_年,_月,_日,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日) :- 月末日の翌日(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日). 翌日(_年,_月,_日,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日) :- 月末日ではない日の翌日(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日). 翌日(_年,_月,_日,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日) :- 月末日の翌日(_年,_月,_日,_翌日の年_1,_翌日の月_1,_翌日の日_1), 翌日(_翌日の年_1,_翌日の月_1,_翌日の日_1,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日). 翌日(_年,_月,_日,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日) :- 月末日でないない日の翌日(_年,_月,_日,_翌日の年_1,_翌日の月_1,_翌日の日_1), 翌日(_翌日の年_1,_翌日の月_1,_翌日の日_1,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日). 月末日の翌日(_年,2,28,_年,2,29) :- うるう年(_年),!. 月末日の翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 月末日の翌日(_年,12,31,_年_2,1,1) :- _年_2 is _年 + 1,!. 月末日の翌日(_年,_月,31,_年,_月_2,1) :- _月_2 is _月 + 1,!. 月末日の翌日(_年,_月,30,_年,_月_2,1) :- member(_月,[4,6,9,11]),!. 月末日ではない日の翌日(_年,_月,_日,_年,_月,_日_2) :- _日_2 is _日 + 1,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/131 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://codepad.org/EEw71Jn2 # # [問1] 長さ100のstruct rocker型の配列 struct rocker Rockers[100]; を定義して、この中の所定の数のロッカーに乱数を格納するプログラムを以下の手続きにしたがって作りなさい。 # # ○ データ構造として次の構造体を用意する。 # struct rocker { # int data; //保存するデータ # char name[20]; //ロッカーのラベル # }; # # ○ main関数の中身が次のようになるものとする。 # int main() { # int N; # struct rocker Rockers[100]; # scanf("%d", &N); # set_rockers(Rockers, N); # display_rockers(Rockers, N); # } # # 上記main関数の中の # void set_rockers(struct rocker rockers[], int length); //0番目からlength-1番目のロッカーにラベル(name)と乱数(data)を格納する関数 # および # void display_rockers(struct rocker rockers[], int length);//0番目からlength-1番目のロッカーのname, dataを全て表示する関数。 # を次の仕様を元に定義し、プログラムを完成させなさい。 # # set_rockers()の仕様: #  例えば0番目のロッカーには # rocker[0].name が "rocker-0"という文字列がラベルとしてセットされ、 # rocker[0].data に乱数(例:1804289383)がセットされます。 # # ラベルをセットするにはsprintf()を使用すると便利です。 #  sprintf()は例えば #  char str[100]; #  int i = 1; # sprintf(str, "rocker-%d", i); # とすると、strには"rocker-1"がセットされます。 # #  乱数はあらかじめ用意されている関数 int rand()を使用すると得ることが出来ます。ただし # #include # が必要です。rand()は呼び出すたびに全く異なる数を返してきます。なお、rand()を使う前にsrand(0)を実行するようにしてください。 # # display_rockers()の仕様: # printf("%s : %d\n", rockers[i].name, rockers[i].data); # をlength個分繰り返してください。 # # # gcc kadai11-1.c # ./a.out # 3 # rocker-0 : 1804289383 # rocker-1 : 846930886 # rocker-2 : 1681692777 # '長さ100のならびを定義して、この中の所定の数のロッカーに乱数を格納する' :- 長さ100のならびを定義して(_ロッカーならび), 所定の数を得る(_数), length(Ln,_数), ロッカー位置と格納する値を乱数で決める(Ln,_ロッカーならび). 長さ100のならびを定義して(_ロッカーならび) :- length(_ロッカーならび,100). 所定の数を得る(_数) :- write('1以上100以下の数を入力しなさい : '), get_line(Line), 所定の数診断(Line,_数),!. 所定の数を得る(_数) :- 所定の数を得る(_数). 所定の数診断(Line,_数) :- atom_to_term(Line,_数,_), integer(_数), _数 >= 1, _数 =< 100,!. 所定の数診断(Line,_) :- writef('入力された%tからは1以上100以下の数を得られませんでした。再入力をお願いします\n',[Line]), fail. ロッカー位置と格納する値を乱数で決める([],_ロッカーならび) :- !. ロッカー位置と格納する値を乱数で決める([_|R1],_ロッカーならび) :- '1から100の範囲のランダム値を得る'(_位置), 指定位置のロッカーが空だったら(_位置,_ロッカーならび,_ロッカー), ロッカーにランダム値を格納する(_ロッカー), ロッカー位置と格納する値を乱数で決める(R1,_ロッカーならび). ロッカー位置と格納する値を乱数で決める([_|R1],_ロッカーならび) :- ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|R1],_ロッカーならび). '1から100の範囲のランダム値を得る'(_ランダム値) :- _ランダム値 is random(100) + 1. 指定位置のロッカーが空だったら(_位置,_ロッカーならび,_ロッカー) :- nth1(_位置,_ロッカーならび,_ロッカー), var(_ロッカー). ロッカーにランダム値を格納する(_ロッカー) :- _ロッカー is random(0x100000000). ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|R1],_ロッカーならび) :- ロッカー位置と格納する値を乱数で決める([_|R1],_ロッカーならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/240 # # 【1】c言語 【2】二つの西暦で入力された年月日から、その間の日数を計算するプログラムを作成してください。 # ここに処理が入る というとこのプログラムをお願いします # プログラムのベース # int uruu(int y); # int monthday(int y, int m); # //---------------------------------------------------- # int main(){ # int year_a, month_a, day_a; # int year_b, month_b, day_b; # int days; int i; days = 0; # printf("日数計算プログラム\n"); # printf("数え始める西暦年月日を入力してください\n"); # scanf("%d,%d,%d",&year_a, &month_a, &day_a); # printf("数え終わる西暦年月日を入力してください\n"); # scanf("%d,%d,%d",&year_b, &month_b, &day_b); # ここに処理が入いる # printf("%d年%d月%d日から%d年%d月%d日までの日数は%d日です。\n", year_a, month_a, day_a, year_b, month_b, day_b, days); # return 0; } # //うるう年ならtrue(1)、そうでないならfalse(0)を返す関数 # int uruu(int y){ # int ret; # ここに処理が入る # return ret; } # //年、月を受け取り、その月の日数を返す関数 # int monthday(int y, int m){ # int d; # ここに処理が入る # return d; } # # '日数計算プログラム' :- 数え始める西暦年月日を入力してください(_年_1,_月_1,_日_1), 数え終わる西暦年月日を入力してください(_年_2,_月_2,_日_2), 日数計算(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2,_日数), writef('%d年%d月%d日から%d年%d月%d日までの日数は%d日です。',[_年_1,_月_1,_日_1,_年_2,_月_2,_日_2,_日数]). 数え始める西暦年月日を入力してください(_数え始める西暦年月日) :- write('数え始める西暦年月日を入力してください(yyyy,mm,dd) : '), 年月日の入力(_年,_月,_日). 数え終わる西暦年月日を入力してください(_年,_月,_日) :- write('数え終わる西暦年月日を入力してください(yyyy mm dd) : '), 年月日の入力(_年,_月,_日). 年月日の入力(_年,_月,_日) :- readln([_年,_月,_日]). 日数計算(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2,_日数) :- _年_2 - _年_1 > 1, _開始年の翌年 is _年_1 + 1, _最終年の前年 is _年_2 - 1, findsum(_年日数,( for(_開始年の翌年,_年,_最終年の前年), 一年間の日数(_年,_年日数)), _間の年の日数合計), 翌年の正月までの日数(_年_1,_月_1,_日_1,_翌年の正月までの日数), 積算日(_年_2,_月_2,_日_2,_積算日), _日数 is truncate(_翌年の正月までの日数 + _間の年の日数合計 + _積算日). '年、月を受け取り、その月の日数を返す'(_年,_月,31) :- member(_月,[1,3,5,7,8,10,12]),!. '年、月を受け取り、その月の日数を返す'(_年,_月,30) :- member(_月,[4,6,9,11]),!. '年、月を受け取り、その月の日数を返す'(_年,2,29) :- うるう年(_年),!. '年、月を受け取り、その月の日数を返す'(_年,2,28) :- \+(うるう年(_年)). 一年間の日数(_年,365) :- \+(うるう年(_年)). 一年間の日数(_年,366) :- うるう年(_年),!. 積算日(_,1,_日,_日) :- !. 積算日(_年,_月,_日,_積算日) :- _前月 is _月 - 1, findsum(_月日数,( for(1,_月_1,_前月), '年、月を受け取り、その月の日数を返す'(_年,_月_1,_月日数)), _正月から前月末日までの積算日), _積算日 is truncate(_正月から前月末日までの積算日 + _日). 翌年の正月までの日数(_年,_月,_日,_翌年の正月までの日数) :- findsum(_月日数,( for(_月,_月_1,12), '年、月を受け取り、その月の日数を返す'(_年,_月_1,_月日数)), _当月初日から翌年正月までの日数), _翌年の正月までの日数 is truncate(_当月初日から翌年正月までの日数 - _日 + 1). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/201 # # 【質問テンプレ】 # [1] 授業単元: C # [2] 問題文(含コード&リンク): # 次のアルファベットのキーワードを入力して計算する(例:sin45 sin0.78539)関数電卓プログラムを作成。 # なお、関数を容易に変更、修正、増加できるように。 # sin(正弦)、cos(余弦)、tan(正接)、arcsin(逆正弦)、arccos(逆余弦)、arctan(逆正接)、ln(自然対数)、log(常用対数)、exp(指数関数)、sqr(平方)、 # rad(入力データをラジアン単位にする)、deg(入力データを度を単位とする)、sinh(双曲線正弦)、cosh(双曲線余弦)、tanh(双曲線正接) # # 関数電卓 :- findall([_関数名,関数記号],( clause(関数(_関数名,_関数記号,_,_,_),_)), _関数名_関数記号ならび), 関数メニュー表示(_関数名_関数記号ならび), 関数の選択(_何番目), 関数電卓(_何番目). 関数電卓(0) :- !. 関数電卓(_何番目) :- nth1(_何番目,_関数名_関数記号ならび,[_関数名,_関数記号]), 式の入力(_式), 関数電卓の関数を評価して値を表示する(_関数名,_関数,_式,_値), 関数メニュー表示(_関数名_関数記号ならび), 関数の選択(_次の選択), 関数電卓(_次の選択). 関数電卓の関数を評価して値を表示する(_関数名,_関数,_式,_値) :- 関数電卓の関数を評価する(_関数名,_関数,_式,_値), 値を表示する(_関数,_値). 関数電卓の関数を評価する(_関数名,_関数,_式) :- 関数(_関数名,_,_関数,_式,_値),!. 関数電卓の関数を評価する(_関数名,_関数,_式) :- writef('%tの関数評価に失敗しました\n',[_関数名]), fail. 値を表示する(_関数,_値) :- writef('%t <- %t \n',[_値,_関数]). 関数メニュー表示(_関数名_関数記号ならび) :- write('関数を番号で選択してください\n0..関数電卓の終了\n'), append(L0,[[_関数名,_関数記号]|R],_関数名_関数記号ならび), length([_|L0],Nth), writef('%t..%t,%t\n',[Nth,_関数名,_関数記号]), R = [],!. 関数の選択(_何番目) :- get_integer(_何番目). 式の入力(_式) :- write('式を入力してください : '), get_line(Line), 式の診断(Line,_式),!. 式の診断(Line,_式) :- parse_atom(Line,_式,_),!. 式の診断(Line,_) :- writef('入力された %t からは適切な式が取り出せません。\n',[Line]), fail. 関数(正弦,sin,sin(_式),_式,_値) :- _値 is sin(_式). 関数(余弦,cos,cos(_式),_式,_値) :- _値 is cos(_式). 関数(正接,tan,tan(_式),_式,_値) :- _値 is tan(_式). 関数(逆正弦,arcsin,arcsin(_式),_式,_値) :- _値 is sin(_式) ^ (-1). 関数(逆余弦,arccos,arccos(_式),_式,_値) :- _値 is cos(_式) ^ (-1). 関数(逆正接,arctan,arctan(_式),_式,_値) :- _値 is tan(_式) ^ (-1). 関数(自然対数,ln,ln(_式),_式,_値) :- _値 is ln(_式). 関数(常用対数,log,log(_式),_式,_値) :- _値 is log(_式). 関数(指数関数,exp,exp(_式),_式,_値) :- _値 is exp(_式). 関数(平方,sqr,sqr(_式),_式,_値) :- _値 is sqr(_式). 関数(入力データをラジアン単位にする,rad,rad(_式,_値),_式,_値) :- rad(_式,_値). 関数(入力データを度を単位とする,deg,deg(_式,_値),_式,_値) :- deg(_式,_値). 関数(双曲線正弦,sinh,sinh(_式),_式,_値) :- _値 is sinh(_式),!. 関数(双曲線余弦,cosh,cosh(_式),_式,_値) :- _値 is cosh(_式),!. rad(X,Y) :- Y is (X / 180) * pi. deg(X,Y) :- Y is (X / pi) * 180. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/201 # # 【質問テンプレ】 # [1] 授業単元: C # [2] 問題文(含コード&リンク): # 次のアルファベットのキーワードを入力して計算する(例:sin45 sin0.78539)関数電卓プログラムを作成。 # なお、関数を容易に変更、修正、増加できるように。 # sin(正弦)、cos(余弦)、tan(正接)、arcsin(逆正弦)、arccos(逆余弦)、arctan(逆正接)、ln(自然対数)、log(常用対数)、exp(指数関数)、sqr(平方)、 # rad(入力データをラジアン単位にする)、deg(入力データを度を単位とする)、sinh(双曲線正弦)、cosh(双曲線余弦)、tanh(双曲線正接) # # 関数電卓 :- findall([_関数名,関数記号],( clause(関数(_関数名,_関数記号,_,_,_),_)), _関数名_関数記号ならび), 関数メニュー表示(_関数名_関数記号ならび), 関数の選択(_何番目), 関数電卓(_何番目). 関数電卓(0) :- !. 関数電卓(_何番目) :- nth1(_何番目,_関数名_関数記号ならび,[_関数名,_関数記号]), 式の入力(_式), 関数電卓の関数を評価して値を表示する(_関数名,_関数,_式,_値), 関数メニュー表示(_関数名_関数記号ならび), 関数の選択(_次の選択), 関数電卓(_次の選択). 関数電卓の関数を評価して値を表示する(_関数名,_関数,_式,_値) :- 関数電卓の関数を評価する(_関数名,_関数,_式,_値), 値を表示する(_関数,_値). 関数電卓の関数を評価する(_関数名,_関数,_式) :- 関数(_関数名,_,_関数,_式,_値),!. 関数電卓の関数を評価する(_関数名,_関数,_式) :- writef('%tの関数評価に失敗しました\n',[_関数名]), fail. 値を表示する(_関数,_値) :- writef('%t <- %t \n',[_値,_関数]). 関数メニュー表示(_関数名_関数記号ならび) :- write('関数を番号で選択してください\n0..関数電卓の終了\n'), append(L0,[[_関数名,_関数記号]|R],_関数名_関数記号ならび), length([_|L0],Nth), writef('%t..%t,%t\n',[Nth,_関数名,_関数記号]), R = [],!. 関数の選択(_何番目) :- get_integer(_何番目). 式の入力(_式) :- write('式を入力してください : '), get_line(Line), 式の診断(Line,_式),!. 式の診断(Line,_式) :- parse_atom(Line,_式,_),!. 式の診断(Line,_) :- writef('入力された %t からは適切な式が取り出せません。\n',[Line]), fail. 関数(正弦,sin,sin(_式),_式,_値) :- _値 is sin(_式). 関数(余弦,cos,cos(_式),_式,_値) :- _値 is cos(_式). 関数(正接,tan,tan(_式),_式,_値) :- _値 is tan(_式). 関数(逆正弦,arcsin,arcsin(_式),_式,_値) :- _値 is sin(_式) ^ (-1). 関数(逆余弦,arccos,arccos(_式),_式,_値) :- _値 is cos(_式) ^ (-1). 関数(逆正接,arctan,arctan(_式),_式,_値) :- _値 is tan(_式) ^ (-1). 関数(自然対数,ln,ln(_式),_式,_値) :- _値 is ln(_式). 関数(常用対数,log,log(_式),_式,_値) :- _値 is log(_式). 関数(指数関数,exp,exp(_式),_式,_値) :- _値 is exp(_式). 関数(平方,sqr,sqr(_式),_式,_値) :- _値 is sqr(_式). 関数(入力データをラジアン単位にする,rad,rad(_式,_値),_式,_値) :- rad(_式,_値). 関数(入力データを度を単位とする,deg,deg(_式,_値),_式,_値) :- deg(_式,_値). 関数(双曲線正弦,sinh,sinh(_式),_式,_値) :- _値 is sinh(_式),!. 関数(双曲線余弦,cosh,cosh(_式),_式,_値) :- _値 is cosh(_式),!. rad(X,Y) :- Y is (X / 180) * pi. deg(X,Y) :- Y is (X / pi) * 180. % 以下のサイトは # [1] 授業単元: 情報処理 # [2] 問題文(含コード&リンク): # テキストファイルの入力に対して行の文字数の短い順に並べて出力しなさい。 # 空行は出力しないこと。 # # 例) # abcd # abcdef # ab # abc # # 出力結果: # ab # abc # abcd # abcdef 'テキストファイルの入力に対して行の文字数の短い順に並べて出力しなさい。空行は出力しないこと'(_ファイル) :- テキストファイルの入力(_ファイル,_テキストならび), 行の文字数と行位置のならびを生成する(_テキストならび,_行の文字数と行位置のならび), 短い順に並べて(_行の文字数と行位置のならび,_整列した行の文字数と行位置のならび), 出力する(_テキストならび,_整列した行の文字数と行位置のならび),!. テキストファイルの入力(_ファイル,_テキストならび) :- get_lines(_ファイル,_テキストならび). 行の文字数と行位置のならびを生成する(_テキストならび,_行の文字数と行位置のならび) :- findall([_文字数,_行位置],( テキスト行を取り出し文字数と行位置を得る(_テキストならび,_文字数,_行位置)), _行の文字数と行位置のならび). テキスト行を取り出し文字数と行位置を得る(_テキストならび,_文字数,_行位置) :- append(L0,[_テキスト行|_],_テキストならび), subatom(_テキスト行,0,_文字数,0,_テキスト行), 行位置はL0の要素数よりひとつ大きな数(L0,_行位置). 行位置はL0の要素数よりひとつ大きな数(L0,_行位置) :- length([_|L0],_行位置). 短い順に並べて(_行の文字数と行位置のならび,_整列した行の文字数と行位置のならび) :- sort(_行の文字数と行位置のならび,_整列した行の文字数と行位置のならび). 出力する(_テキストならび,_整列した行の文字数と行位置のならび) :- 整列した行から順に行位置を取り出し(_整列した行の文字数と行位置のならび,_行位置,_残り行ならび), 行位置からテキスト行を取り出す(_行位置,_テキストならび,_テキスト行), writef('%t\n',[_テキスト行]), _残り行ならび = []. 整列した行から順に行位置を取り出し(_整列した行の文字数と行位置のならび,_行位置,_残り行ならび) :- append(_,[[_,_行位置]|_残り行ならび],_整列した行の文字数と行位置のならび). 行位置からテキスト行を取り出す(_行位置,_テキストならび,_テキスト行) :- nth1(_行位置,_テキストならび,_テキスト行). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/762 # # [1] 授業単元:C言語! # [2] 問題文(含コード&リンク):クラスごとの平均点の出力のかわりに,全クラスで得点の高い者順に,クラス・出席番号・得点のセットのデータ出力を行うプログラムを作成せよ. # <実行例> # $ ←プログラム実行のコマンドを入力 # ( 0) クラス:2 出席番号:5 得点:97 # ( 1) クラス:2 出席番号:3 得点:89 # ( 2) クラス:2 出席番号:1 得点:83 # ( 3) クラス:2 出席番号:4 得点:77 # ( 4) クラス:2 出席番号:2 得点:71 # ( 5) クラス:2 出席番号:0 得点:63 # # 'クラスごとの平均点の出力のかわりに,全クラスで得点の高い者順に,クラス・出席番号・得点のセットのデータ出力' :- 全クラスで得点の高い者順に(LL3), 'クラス・出席番号・得点のセットのデータ出力'(LL3). 全クラスで得点の高い者順に(LL3) :- findall([_得点,_クラス,_出席番号],( 成績(_クラス,_出席番号,_得点)), LL1), sort(LL1,LL2), reverse(LL2,LL3). 'クラス・出席番号・得点のセットのデータ出力'(LL3) :- append(L0,[[_得点,_クラス,_出席番号]|R],LL3), length(L0,_nth), writef('(%t) クラス:%t 出席番号:%t 得点:%t\n',[_クラス,_出席番号,_得点]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/762 # # [1] 授業単元:C言語! # [2] 問題文(含コード&リンク):クラスごとの平均点の出力のかわりに,全クラスで得点の高い者順に,クラス・出席番号・得点のセットのデータ出力を行うプログラムを作成せよ. # <実行例> # $ ←プログラム実行のコマンドを入力 # ( 0) クラス:2 出席番号:5 得点:97 # ( 1) クラス:2 出席番号:3 得点:89 # ( 2) クラス:2 出席番号:1 得点:83 # ( 3) クラス:2 出席番号:4 得点:77 # ( 4) クラス:2 出席番号:2 得点:71 # ( 5) クラス:2 出席番号:0 得点:63 # # 'クラスごとの平均点の出力のかわりに,全クラスで得点の高い者順に,クラス・出席番号・得点のセットのデータ出力' :- findall([_得点,_クラス,_出席番号],( 成績(_クラス,_出席番号,_得点)), LL1), sort(LL1,LL2), reverse(LL2,LL3), append(L0,[[_得点,_クラス,_出席番号]|R],LL3), length(L0,_nth), writef('(%t) クラス:%t 出席番号:%t 得点:%t\n',[_クラス,_出席番号,_得点]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/411 # # MySQL 5.1.46 # #   ≪item≫ # ───────── # id  name  category # ───────── # 1  Name1   2 # 2  Name2   1 # 3  Name3   1 # 4  Name4   6 # 5  Name5   4 # 6  Name6   8 # 7  Name7   2 # 8  Name8   2 # ───────── # # item 内のデータについて、 category が 2 のものだけ category の値を 7 に振り替えたいと思い # # UPDATE item SET category = 7 WHERE category = 2 # # を発行したのですが、うまく動作しません。 # こういう場合にうまくいく方法を教えてください。 # # 'item 内のデータについて、 category が 2 のものだけ category の値を 7 に振り替えたいと思い' :- 節順序を変更するupdate(item/3,[[3,2]],[[3,7]]). 節順序を変更するupdate(_述語名/_アリティ,_鍵情報ならび,_更新情報ならび,L) :- 節順序を変更するupdate(先頭,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび,L),!. 節順序を変更するupdate(先頭,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび) :- length(L1,_アリティ), 鍵情報を設定する(_鍵情報ならび,L1), _述語 =.. [_述語名|L1], findall(L2,( retract(_述語), 更新情報を設定する(_更新情報ならび,L1,L2)), L), 更新ならびを先頭に付加する(_述語名,L),!. 節順序を変更するupdate(末尾,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび) :- length(L1,_アリティ), 鍵情報を設定する(_鍵情報ならび,L1), _述語 =.. [_述語名|L1], findall(L2,( retract(_述語), 更新情報を設定する(_更新情報ならび,L1,L2)), L), 更新ならびを末尾に付加する(_述語名,L),!. 更新ならびを先頭に付加する(_述語名,L) :- append(_,[L3|R],L), _述語3 =.. [_述語名|L3], asserta(_述語3), R = []. 更新ならびを末尾に付加する(_述語名,L) :- append(_,[L3|R],L), _述語3 =.. [_述語名|L3], assertz(_述語3), R = []. 鍵情報を設定する([],L). 鍵情報を設定する([[_鍵位置,_鍵]|R],L) :- nth1(_鍵位置,L,_鍵), 鍵情報を設定する(R,L). 更新情報を設定する([],L,L). 更新情報を設定する([[_更新位置,_更新値]|R1],L1,L) :- append(L0,[_|R],L1), length([_|L0],_更新位置), append(L0,[_更新値|R],L2), 更新情報を設定する(R1,L2,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/232 # # [1] 授業単元:配列の並び替え # [2] 問題文(含コード&リンク): # ../test/read.cgi/tech/1307166756/189のシステムを以下のように拡張する。 # 指定済みの座標を入力した場合、「先手の負け」または「後手の負け」と表示する。 # 全てのマスが埋まったら、「試合終了」と表示する。 # この段階でも、勝ち負けの判定も行わない。 '先手、後手の順番で、x=1,2,3 y=1,2,3の座標の整数値をx yの順番で与えると、その場所に先手ならA、後手ならBを表示して、3目並べを実現する' :- length(LL,3), findall(L,(append(_,[L|_],LL),length(L,3)),LL), 3目並べを実現する(後手,LL,_診断). 3目並べを実現する(_,_,_診断) :- \+(var(_診断)),!. 3目並べを実現する(_,LL,正常終了) :- 打つところがない(LL), write('試合終了),!. 3目並べを実現する(_前の手番,LL,正常終了) :- 三目ならび完成(LL), writef('%tの勝ちです\n',[_前の手番]),!. 3目並べを実現する(_前の手番,LL,_診断) :- \+(三目ならび完成(LL)), 手番(_前の手番,_手番), 座標値を与える(_手番,LL,_診断), 3目並べを実現する(_手番,LL,_診断). 打つところがない([]). 打つところがない([L|R]) :- 全て変数(L), 打つところがない(R). すべて変数([]). すべて変数([V|R]) :- var(V), すべて変数(R). 三目ならび完成([[_,_,A],[_,A,_],[A,_,_]]) :- \+(var(A)),!. 三目ならび完成([[A,_,_],[_,A,_],[_,_,A]]) :- \+(var(A)),!. 三目ならび完成([[A,A,A]|_]) :- \+(var(A)),!. 三目ならび完成([_,[A,A,A]|_]) :- \+(var(A)),!. 三目ならび完成([_,_,[A,A,A]]) :- \+(var(A)),!. 三目ならび完成(L) :- 転置(L,L1), 三目ならび完成(L1). 手番(先手,後手). 手番(後手,先手). 着手記号(先手,'O'). 着手記号(後手,'@'). 座標値を与える(_手番,LL,_診断) :- 盤面表示(LL), writef('%t の手番です : \n',[_手番]), 座標値を得る(_x,_y), 座標値診断(_手番,_x,_y,LL),!. 座標値を得る(_x,_y) :- get_line(Line), split(Line,[' ',','],[_x,_y]),!. 座標値診断(_手番,_x,_y,LL,_診断) :- nth1(_y,LL,L), nth1(_x,L,V), var(V), 着手記号(_手番,_記号), V = _記号,!. 座標値診断(_手番,_,_,_,異常終了) :- write('%tの負けです。\n',[_手番]),!. 盤面表示(LL) :- write('---------\n'), append(_,[[A,B,C]|R],LL), 変数は空白に変換([A,B,C],[A2,B2,C2]), concat_atom([A2,B2,C2],'|',S), writef('|%t|\n',[S]), R = [], write('---------\n'),!. 変数は空白に変換([],[]). 変数は空白に変換([V|R1],[' '|R2]) :- var(V), 変数は空白に変換(R1,R2). 変数は空白に変換([V|R1],[V|R2]) :- \+(var(V)), 変数は空白に変換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/189 # # [1] 授業単元:配列の並び替え # [2] 問題文(含コード&リンク): # 先手、後手の順番で、x=1,2,3 y=1,2,3の座標の整数値をx yの順番で与えると、その場所に先手ならO、後手なら@を表示して、3目並べを実現するプログラムを作成しなさい。 # 操作は、先手・後手が交互に座標の数値を1ずつ与えるものとし、入力ミスは考えない。 # すでに指定済みの座標かどうかについては判定し、指定済みの座標を入力した場合は、「異常終了」と表示し、プログラムを終了することとする。 # この段階では、勝ち負けの判定も行わない。 # '先手、後手の順番で、x=1,2,3 y=1,2,3の座標の整数値をx yの順番で与えると、その場所に先手ならA、後手ならBを表示して、3目並べを実現する' :- length(LL,3), findall(L,(append(_,[L|_],LL),length(L,3)),LL), 3目並べを実現する(後手,LL,_診断), 診断値表示(_診断). 3目並べを実現する(_,_,_診断) :- \+(var(_診断)),!. 3目並べを実現する(_前の手番,LL,正常終了) :- 三目ならび完成(LL), writef('%tの勝ちです\n',[_前の手番]),!. 3目並べを実現する(_前の手番,LL,_診断) :- \+(三目ならび完成(LL)), 手番(_前の手番,_手番), 座標値を与える(_手番,LL,_診断), 3目並べを実現する(_手番,LL,_診断). 三目ならび完成([[_,_,A],[_,A,_],[A,_,_]]) :- \+(var(A)),!. 三目ならび完成([[A,_,_],[_,A,_],[_,_,A]]) :- \+(var(A)),!. 三目ならび完成([[A,A,A]|_]) :- \+(var(A)),!. 三目ならび完成([_,[A,A,A]|_]) :- \+(var(A)),!. 三目ならび完成([_,_,[A,A,A]]) :- \+(var(A)),!. 三目ならび完成(L) :- 転置(L,L1), 三目ならび完成(L1). 手番(先手,後手). 手番(後手,先手). 着手記号(先手,'O'). 着手記号(後手,'@'). 座標値を与える(_手番,LL,_診断) :- 盤面表示(LL), writef('%t の手番です : \n',[_手番]), 座標値を得る(_x,_y), 座標値診断(_手番,_x,_y,LL),!. 座標値を得る(_x,_y) :- get_line(Line), split(Line,[' ',','],[_x,_y]),!. 座標値診断(_手番,_x,_y,LL,_診断) :- nth1(_y,LL,L), nth1(_x,L,V), var(V), 着手記号(_手番,_記号), V = _記号,!. 座標値診断(_,_,_,_,異常終了). 診断値表示(異常終了) :- write('異常終了\n'),!. 診断値表示(_). 盤面表示(LL) :- write('---------\n'), append(_,[[A,B,C]|R],LL), 変数は空白に変換([A,B,C],[A2,B2,C2]), concat_atom([A2,B2,C2],'|',S), writef('|%t|\n',[S]), R = [], write('---------\n'),!. 変数は空白に変換([],[]). 変数は空白に変換([V|R1],[' '|R2]) :- var(V), 変数は空白に変換(R1,R2). 変数は空白に変換([V|R1],[V|R2]) :- \+(var(V)), 変数は空白に変換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/207 # # すみません、もう1問お願いします # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 寒暖の差が大きい順番に並び替えて、ファイルkadai07.datへ出力するプログラムkadai07.c を作成せよ。 # 寒暖の差: 最高の最高気温? 最低の最低気温 # '寒暖の差が大きい順番に並び替えて、ファイルkadai07.datへ出力する' :- '寒暖の差が大きい順番に並び替えて、'(_差が大きい順寒暖の差ならび), 'ファイルkadai07.datへ出力する'(_差が大きい順寒暖の差ならび). '40年間気温情報ならび'(_40年間気温情報ならび) :- get_split_lines('気温データ',[' '],_40年間気温情報ならび). '寒暖の差が大きい順番に並び替えて、'(_差が大きい順寒暖の差ならび) :- '40年間気温情報ならび'(_40年間気温情報ならび), '寒暖の差ならび'(_40年間気温情報ならび,_寒暖の差ならび), sort(_寒暖の差ならび,_差が小さい順寒暖の差ならび), reverse(_差が小さい順寒暖の差ならび,_差が大きい順寒暖の差ならび). '寒暖の差ならび'(_40年間気温情報ならび,_寒暖の差ならび) :- findall([_年温度差,_年度],( append(_,[_年気温情報ならび|_],_40年間気温情報ならび), 寒暖の差(_年気温情報ならび,_年度,_年温度差)), _寒暖の差ならび). 寒暖の差(_年気温情報ならび,_年度,_年温度差) :- nth1(1,_年気温情報ならび,_年度), nth1(4,_年気温情報ならび,_年最高気温), nth1(11,_年気温情報ならび,_年最低気温), _年温度差 is _年最高気温 - _年最低気温. 'ファイルkadai07.datへ出力する'(_差が大きい順寒暖の差ならび) :- tell('kadai07.dat'), append(_,[[_寒暖差,_年度]|R],_差が大きい順寒暖の差ならび), writef('%t %t\n',[_年度,_寒暖差]), R = [], told. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/300 # # 上手くいかないので質問させてください。 # ACCESS2007を使っています。 # 年フィールドと月フィールドを用いて「年度」の件数を抽出したいのですが、 # 以下のクエリでは月部分が干渉してか上手く抽出出来ません。 # # 22年4月〜23年3月 といった結果を出したいのですがどうしたらよいでしょうか? # # SELECT 年 FROM Table1 # WHERE (年>21 AND 月>3) AND (年<23 AND 月<4) # # '年フィールドと月フィールドを用いて「年度」の件数を抽出したい'(_テーブル,L) :- テーブル構造(_テーブル,年,M), テーブル構造(_テーブル,月,N), findmax(U,テーブル構造(_テーブル,_,U),Max), length(L1,Max), nth1(M,L1,_年), nth1(N,L1,_月), P =.. [_テーブル|L1], findall(_年度,( P, 年度のルール(_年,_月,_年度)), _年度ならび), findsetof(_年度,( append(_,[_年度|_],_年度ならび), L2), findall([_年度,_度数],( append(_,[_年度|_],L2), count(append(_,[_年度|_],_年度ならび),_度数)), L). 年度のルール(_年,_月,_年度) :- _月 >= 4, _年 = _年度,!. 年度のルール(_年,_月,_年度) :- _月 < 4, _年度 is _年 - 1,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/288 # # sqlite v3.6.23.1で、 # comment (text) ,postedtime (int) という形式にて掲示板を作っているのですが、 # 「最新の5コメント、但し、24時間以内の投稿については最大50個まで」を求めたくて # # SELECT comment FROM mm ORDER BY postedtime DESC LIMIT 50 # UNION # SELECT comment FROM mm WHERE postedtime > $nowtime - 3600*24 ORDER BY ptime DESC LIMIT 50 # # としてみたのですが($nowtimeには今の時間を入れてます)、 # 1st ORDER BY term does not match in the result set というエラーが出ます。 # (union前後のクエリそれぞれ単独ではエラーは出ません) # # 欲しい結果を求めるにはどのように書けばいいのでしょうか? # # '最新の5コメント、但し、24時間以内の投稿については最大50個まで'(_テーブル,_現在の時刻,P) :- split(_現在の時刻,[' ','/','-',':','.'],[_年,_月,_日,_時,_分,_秒,_]), テーブル構造(_テーブル,時刻,N), findmax(M,テーブル構造(_テーブル,_,M),Max), length(L1,Max), nth1(N,L1,_時刻), P =.. [_テーブル|L1], 選択(P,_年,_月,_日,_時,_分,_秒,L), append(_,[_時刻|_],L), call(P). 選択(P,_年,_月,_日,_時,_分,_秒,L) :- findsetof(_時刻,( call(P), 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻)), L1), 要素切り取り(L1,L),!. 選択(P,_年,_月,_日,_時,_分,_秒,L) :- findall(_時刻,( call(P), 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻)), L1), 整列(L1,L2), 要素切り取り(L2,L),!. 選択(P,_,_,_,_,_,_,L) :- findall(_時刻,( call(P)), L1), 整列(L1,L2), length(L,5), append(_,L,L2),!. 要素切り取り(L1,L) :- length(L1,Length), Length >= 50, length(L,50), append(_,L,L1),!. 要素切り取り(L1,L1) :- length(L1,Length), Length >= 5, length < 50,!. 時刻が24時間以内(_年,12,31,_時,_分,_秒,_時刻) :- split(_時刻,['/','-',':','.'],[_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]), _年_1 is _年 + 1, [_年_1,1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,2,29,_時,_分,_秒,_時刻) :- うるう年(_年), [_年,3,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,2,28,_時,_分,_秒,_時刻) :- \+(うるう年(_年)), [_年,3,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,30,_時,_分,_秒,_時刻) :- append(_,[_月|_],[4,6,9,11]), _月_1 is _月 + 1, [_年,_月_1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,31,_時,_分,_秒,_時刻) :- append(_,[_月|_],[1,3,5,7,8,10]), _月_1 is _月 + 1, [_年,_月_1,1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. 時刻が24時間以内(_年,_月,_日,_時,_分,_秒,_時刻) :- split(_時刻,['/','-',':','.'],[_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]), _日_1 is _日 + 1, [_年,_月,_日_1,_時,_分,_秒,_時刻] @>= [_年_2,_月_2,_日_2,_時_2,_分_2,_秒_2,_]),!. うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_), !, うるう年(_年整数) . うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/286 # # sql初心者で申し訳ありません。2つの要素でソートをしたい場合どのようにすればよいでしょうか? # point01(int)、point02(int)があります。point01でソートを行い、point01が同じ場合point02でさらにソートをしなければいけません。 # # '2つの要素でソートをしたい場合どのようにすればよいでしょうか?'(_テーブル,P) :- テーブル構造(_テーブル,point01,N1), テーブル構造(_テーブル,point02,N2), count(テーブル構造(_,_,_),Count), length(L,Count), nth1(N1,L,Point01), nth1(N2,L,Point02), P =.. [_テーブル|L], setof([Point01,Point02],P,L2), append(_,[[Point01,Point02]|R],L2), call(P). % 以下のサイトは # Hi, I use swi prolog and my code like this. I read data predicate # from file and its arity count can change. How can I generalize it. # For example, If data(a1,b1,c1) writes in the file, how can I find solution? # Do you have any idea? # # > basla:-consult('test.pl'), # > answer(L1,L2,L3,L4,L5), # > list_to_set(L1, X), # > # > write(X). # > answer(L1,L2,L3,L4,L5):- # > findall(First, data(First,_,_,_,_),L1), # > findall(Second, data(_,Second,_,_,_),L2), # > findall(Third, data(_,_,Third,_,_),L3). basla(Predicate/Arity) :- consult('test.pl'), length(L,Arity), for(1,Nth,Arity), findall(A,( nth1(Nth,L,A), P =.. [Predicate|L], call(P)), LX), list_to_set(LX,U), writef('%t\n',[LX]), Nth = Arity. % 以下のサイトは # 出典:: 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/97 # # select * from table1 where col1 in (select colx, coly from table2); # # 的な書き方は無い? # ↓ってするしかない? # # select * from table1 where col1 in (select colx from table2) or col1 in (select coly from table2) ; # # 'select * from table1 where col1 in (select colx from table2) or col1 in (select coly from table2)'(L1) :- テーブルの選択(table1,[col1],[_col1],L1,P1), テーブルの選択(table2,[colx,coly],[_colx,_coly],L2,P2), P1, P2, 選択条件(_col1,_colx,_coly). 選択条件(X,X,_) :- !. 選択条件(X,_,X) :- !. %%% テーブルが生成される時に定義される %%% テーブル構造(table1,1,col1). テーブル構造(table2,1,colx). テーブル構造(table2,2,coly). %%% 汎用述語 %%% テーブルの選択(_テーブル名,_鍵名ならび,_鍵変数ならび,L,P) :- findall(_,テーブル構造(_テーブル名,_,_),L), P =.. [_テーブル名|L], 鍵変数の指定(_テーブル名,L,_鍵名ならび,_鍵変数ならび). 鍵変数の指定(_テーブル名,L,[],[]) :- !. 鍵変数の指定(_テーブル名,L,[_鍵名|R1],[_鍵変数|R2]) :- テーブル構造(_テーブル名,_位置,_鍵名), list_nth(_位置,L,_鍵変数), 鍵変数の指定(_テーブル名,R1,R2,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1200175247/927 # # n=12 # x=[2,6,20,15,8,21,8,22,15,20,1,15] # y=["Jan","Feb","Mar","Apr","Mey","Jun","Jul","Aug","Sep","Oct","Nov","Dec"] # sx=0 # upper=0 # middle=0 # lower=0 # xmax=0 # xmin=0 # best_x=0 # worst_x=0 # # for i in 0..n-1 # sx=sx+x[i] # end # xave=sx/n # print "Sipments:Total=",sx," Average=",xave,"\n" # puts # for i in 0..n-1 # if x[i] >= xave*1.5 then # upper = upper + 1 # elsif x[i] <= xave*1.5*0.5 # middle = middle + 1 # else x[i] <= xave/2 # lower = lower + 1 # end # end # print "Sales:Upper=",upper," Middle=",middle," Lower=",lower,"\n" # puts # xmax=x[0] # xmin=x[0] # for i in 0..n-1 # if xmax >= x[i] then # best_x = best_x + 1 # else xmin <= x[i] # worst_x = worst_x + 1 # end # end # print "Best Month:",best_x, " Worst Month:",worst_x,"\n" # puts # 出力結果 # Sipments:Total=153 Average=12 # Sales:Upper=4 Middle=5 Lower=3 # Best Month:2 Worst Month:10 # 本当はBest Month:Aug、Worst Month:Novとしたいんですけど、どうしたらいいですか? # やっぱり変数がおかしいんですか?それとも条件の書き方ですか?? 値([2,6,20,15,8,21,8,22,15,20,1,15]). 月表示(['Jan','Feb','Mar','Apr','Mey','Jun','Jul','Aug','Sep','Oct','Nov','Dec']). 月毎の売上分析 :- 値(_値ならび), 月表示(_月表示ならび), 値と月表示を対にする(_値ならび,_月表示ならび,_値・月表示ならび), sum(_値ならび,_合計値), avg(_値ならび,_平均値), 月値評価度数(_値ならび,_平均値,_上,_中の上,_中の下,_下), max(_値・月表示ならび,[_Max,_最良月]), min(_値・月表示ならび,[_Min,_最悪月]), writef('合計値=%t,平均値=%t\n',[_合計値,_平均値]), writef('上=%t,中の上=%t,中の下=%t,下=%t\n',[_上,_中の上,_中の下,_下]), writef('最良月=%t,最悪月=%t\n',[_最良月,_最悪月]),!. 値と月表示を対にする([],[],[]). 値と月表示を対にする([_値|R1],[_月表示|R2],[[_値,_月表示]|R3]) :- 値と月表示を対にする(R1,R2,R3). 月値評価度数(_値ならび,_平均値,_上,_中の上,_中の下,_下) :- count((append(_,[_値|_],_値ならび),_値 >= _平均値 * 1.5),_上), count((append(_,[_値|_],_値ならび),_値 >= _平均値 * 1.5 / 2,_値 < _平均値 * 1.5),_中の上), count((append(_,[_値|_],_値ならび),_値 >= _平均値 * 0.5,_値 < _平均値 * 1.5 / 2),_中の下), count((append(_,[_値|_],_値ならび),_値 < _平均値 * 0.5),_下). % 以下のサイトは # 出典::MySQL 総合 Part19 #173 # 質問させてください # selectしたデータを一部だけ別のテーブルに入れる方法ってありますか? # # 例:insert into table2 (aaa,bbb,ccc) select aaa as aaa,bbb as bbb,ccc as ccc from table1 # この場合table1のデータがすべてtable2に入るのでaaaだけ別のデータを入れたいと思っています。 # よろしくお願いします。 # # :- dynamic(table2/3). 海に接していない都道府県名([栃木県,群馬県,埼玉県,山梨県,長野県,岐阜県,滋賀県,奈良県]). table1(東京都,1000,aa). table1(埼玉県,2000,ab). table1(新潟県,3000,ac). table1(奈良県,2000,ad). selectしたデータを一部だけ別のテーブルに入れる方法 :- 海に接していない都道府県名(_海に接していない都道府県名ならび), selectしたデータを一部だけ別のテーブルに入れる方法(_海に接していない都道府県名ならび) :- forall(( table1の海に接している都道府県名を海に接していない都道府県名に置き換える(_海に接していない都道府県名ならび,_都道府県名の二,_bbb,_ccc), assertz(table2(_都道府県名の二,_bbb,_ccc))). table1の海に接している都道府県名を海に接していない都道府県名に置き換える(_海に接していない都道府県名ならび,_都道府県名の二,_bbb,_ccc) :- table1(_都道府県名の一,_bbb,_ccc), 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二). 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の一) :- 都道府県名の一が海に接していない場合はそのまま(_海に接していない都道府県名ならび,_都道府県名の一),!. 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二) :- 'table2に未出の都道府県名を_海に接していない都道府県名ならび から得る'(_海に接していない都道府県名ならび,_都道府県名の二),!. 都道府県名の一が海に接していない場合はそのまま(_海に接していない都道府県名ならび,_都道府県名の一) :- member(_都道府県名の一,_海に接していない都道府県名ならび),!. 'table2に未出の都道府県名を_海に接していない都道府県名ならび から得る'(_海に接していない都道府県名ならび,_都道府県名の二) :- 海に接していない都道府県名から_aaaを一つ選択する(_海に接していない都道府県名ならび,R,_aaa), 'table2に未出の都道府県名を_海に接していない都道府県名ならび から得る'(_海に接していない都道府県名ならび,R,_aaa,_都道府県名の二). 海に接していない都道府県名から_aaaを一つ選択する(_海に接していない都道府県名ならび,R,_aaa) :- 乱数を得る(_海に接していない都道府県名ならび,_乱数), nth1(_乱数,_海に接していない都道府県名ならび,_aaa), select(_aaa,_海に接していない都道府県名ならび,R). 乱数を得る(_海に接していない都道府県名ならび,_乱数) :- length(_海の接していない都道府県名ならび,_要素数), _要素数 > 0, _乱数 is random(_要素数) + 1, 'table2に未出の都道府県名を_海に接していない都道府県名ならび から得る'(_海に接していない都道府県名ならび,R,_都道府県名の二,_都道府県名の二) :- table2にその都道府県名は未出である(_都道府県名の二),!. 'table2に未出の都道府県名を_海に接していない都道府県名ならび から得る'(_海に接していない都道府県名ならび,R,_都道府県名の一,_都道府県名の二) :- 新しい都道府県名の生成(R,_都道府県名の一,_都道府県名の二). table2にその都道府県名は未出である(_都道府県名の二) :- \+(table2(_都道府県名の二,_,_)). % 以下のサイトは # リストからランダムにひとつずつ情報を取り出します。 # ただし、一度取り出した情報は引かないこととします。 # このような非決定性の述語を定義してください。 # 第一引数にリスト、第二引数に何番目の要素を引いたか、第三引数に取り出した要素, # 最後の第四引数に取り出された要素以外の要素ならびを持つものとします。 # ならびから重複せず乱順に取得(_ならび,_N番目,_取得要素,_残り要素) :- length(_ならび,_要素数), findall(N,for(1,N,_要素数),_要素番号候補), ならびから重複せず乱順に収集(_ならび,[],_要素数,L), append(_,[[_N番目,_取得要素]|_],L), length([_|L0],_N番目), append(L0,[_|R1],_ならび), append(L0,R,_残り要素). ならびから重複せず乱順に収集(_,_,0,[]) :- !. ならびから重複せず乱順に収集(_ならび,L,_残り要素数,[[_N番目,_取得要素]|R]) :- M is (random mod _残り要素数) + 1, list_nth(M,L,_N番目), length([_|L0],_N番目), append(L0,[_取得要素|_],_ならび), _残り要素数_1 is _残り要素数 - 1, ならびから重複せず乱順に収集(_ならび,[_N番目|L],_残り要素数_1,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/337 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):次の書きこみにまとめます。 # # 地図データmap.dat に対して、出発点の交差点番号をキーボードから入力すると、 # A. 隣接する交差点名と交差点番号および出発点からの距離をディスプレイに表示 # する # B. 表示された交差点の中から次に進む交差点を選択できる # C. 選択された交差点に対して、A. の手順に戻り、順々に道案内する # プログラムを作成しなさい。手順A の距離は、出発点からの直線距離ではなく、 # 経路の累計移動距離を計算すること。また、プログラムを途中で終了させるコマ # ンドも用意すること。 # # # という問題について次のようなソースを書いたのですが、これでは経路の累計移動距離が計算されないため、不十分だと言われました。 # http://ime.nu/codepad.org/1hcQfHlM # 地図データはこちらに上げてあります # http://ime.nu/www1.axfc.net/uploader/Sc/so/202935.dat # どこをどう直せばいいのか、どなたかお願いします # # 1, 0.0, 0.0, A, 2, 2, 4 # 2, -0.6, 0.15, B, 3, 1, 3, 11 # 3, -0.83, 0.0, C, 4, 2, 4, 9, 10 # 4, -0.6, -0.38, D, 3, 1, 3, 5 # 5, -0.38, -0.68, E, 3, 4, 6, 7 # 6, 6.0, -0.3, F, 1, 5 # 7, -0.18, -1.02, G, 2, 5, 8 # 8,-0.84, -1.58, H, 3, 7, 9, 18 # 9, -0.9, -0.98, I, 2, 3, 8 # 10, -0.98, 0.15, J, 3, 3, 11, 13 # 11, -0.78, 0.3, K, 3, 2, 10, 12 # 12, -1.28, 0.68, L, 2, 11, 13 # 13, -1.32, 0.53, M, 4, 10, 12, 14, 15 # 14, -1.8, 0.98, N, 2, 13, 20 # 15, -1.43, -0.15, O, 2, 13, 16 # 16, -1.73, -0.26, P,3, 15, 17, 20 # 17, -1.8, -1.43, Q, 3, 16, 18, 19 # 18, -1.2, -1.73, R, 2, 8, 17 # 19, -2.48, -1.2, S, 2, 17, 20 # 20, -2.33, -0.51, T, 3, 14, 16, 19 交差点を進む(_出発交差点,_移動記録,_移動累積距離) :- 地図データを読み込む(_地図データ), 地図データの登録(_地図データ), 交差点を進む(_出発交差点,0.0,[],_移動記録,_移動累積距離). 交差点を進む(_交差点,_移動記録1,_移動累積距離1,_移動記録,_移動累積距離) :- 隣接交差点を表示する(_交差点), write_formatted('ここまでの移動累積距離は%tです\n',[_移動累積距離1]), write('どの交差点に進みますか ? '), get_line(_隣接交差点), 隣接交差点との距離(_交差点,_隣接交差点,_距離), _移動累積距離2 is _距離 + _移動累積距離1, 交差点を進む(_交差点,[_隣接交差点|_移動記録1],_移動累積距離2,_移動記録,_移動累積距離). 交差点を進む(_交差点,_移動記録,_移動累積距離,_移動記録,_移動累積距離) :- write_formatted('交差点%tは存在しません\nここまでの移動累積距離は%tでした\nプログラムを終了します\n',[_交差点,_累積移動距離]). 隣接交差点を表示する(_交差点) :- findall(_隣接交差点,隣接交差点(_交差点,_隣接交差点),_隣接交差点ならび), \+(_隣接交差点ならび=[]), concat_atom(_隣接交差点ならび,',',_隣接交差点表示), write_formatted('隣接交差点は %t があります\n',[_隣接交差点表示]). 隣接交差点との距離(_交差点,_隣接交差点,_距離) :- 交差点位置(_交差点,X1,Y1), 隣接交差点(_交差点,X2,Y2), _距離 is sqrt((X2 - X1) ^2 + (Y2 - Y1) ^ 2). 地図データを読み込む(_地図データ) :- get_split_lines('map.dat',[','],LL). 地図データの登録(_地図データ) :- 交差点位置の登録(_地図データ), 隣接交差点の登録(_地図データ). 交差点位置の登録(_地図データ) :- abolish(交差点位置/3), append(_,[[_,X,Y,_交差点|_]|R],_交差点データ), assertz(交差点位置(_交差点,X,Y)), R = []. 隣接交差点の登録(_地図データ) :- abolish(隣接交差点/2), append(_,[[_交差点ID,_,_,_交差点|_隣接交差点ならび]|R],_地図データ), 隣接交差点を得る(_地図データ,_隣接交差点IDならび,_隣接交差点), assertz(隣接交差点(_交差点,_隣接交差点)), R = []. 隣接交差点を得る(_地図データ,[_隣接交差点ID|R],_隣接交差点) :- list_nth(_隣接交差点ID,_地図データ,[_,_,_,_隣接交差点|_]). 隣接交差点を得る(_地図データ,[_|R],_隣接交差点) :- 隣接交差点を得る(_地図データ,R,_隣接交差点). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/122 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1311028.txt.html # # Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 # 県と県の間を半角開ける # # 1.北海道 2.青森県・・・47.沖縄県を表示 # 一行につき6県 # # (例) # _1.北海道____2.鹿児島県__3. # # ↑ # 桁が上がったとき用 # # # 43.□□□___44.□□ # # # 次に47都道府県のうち出発地と目的地の入力を要求する. # # 「出発の県を入力してください」 # 「目的の県を入力してください」 # # # # # 次に結果を表示. # # ・距離と経路を出力 # # 経路 # □□□□→□□□□→・・・→□□□□ # # -10byte-- # # 経路は7県まで # # # # とする # # # # map.datの中身は↓です # # 北海道,青森県,岩手県,宮城県,秋田県,山形県,福島県,茨城県,栃木県,群馬県,埼玉県,千葉県,東京都,神奈川県,新潟県,富山県,石川県,福井県,山梨県,長野県,岐阜県,静岡県,愛知県,三重県,滋賀県,京都府,大阪府,兵庫県,奈良県,和歌山県,鳥取県,島根県,岡山県,広島県,山口県,徳島県,香川県,愛媛県,高知県,福岡県,佐賀県,長崎県,熊本県,大分県,宮崎県,鹿児島県,沖縄県 # # 北海道,0,426,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 青森県,426,0,187,-1,190,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岩手県,-1,187,0,193,108,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 宮城県,-1,-1,193,0,258,72,84,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 秋田県,-1,190,108,258,0,212,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山形県,-1,-1,-1,72,212,0,102,-1,-1,-1,-1,-1,-1,-1,169,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 福島県,-1,-1,-1,84,-1,102,0,203,172,275,-1,-1,-1,-1,189,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 茨城県,-1,-1,-1,-1,-1,-1,203,0,76,-1,-1,116,128,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 栃木県,-1,-1,-1,-1,-1,-1,172,76,0,109,100,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 群馬県,-1,-1,-1,-1,-1,275,-1,109,0,103,-1,-1,-1,220,-1,-1,-1,-1,151,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 埼玉県,-1,-1,-1,-1,-1,-1,116,100,103,0,69,24,-1,-1,-1,-1,-1,157,215,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 千葉県,-1,-1,-1,-1,-1,-1,128,-1,-1,69,0,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 東京都,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,50,0,37,-1,-1,-1,-1,133,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 神奈川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,37,0,-1,-1,-1,-1,134,-1,-1,240,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 新潟県,-1,-1,-1,-1,169,189,-1,-1,220,-1,-1,-1,-1,0,250,-1,-1,-1,208,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 富山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,250,0,61,-1,-1,196,294,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 石川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,61,0,83,-1,-1,235,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 福井県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,83,0,-1,-1,160,-1,-1,-1,176,188,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山梨県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,164,-1,126,134,-1,-1,-1,-1,0,162,-1,109,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 長野県,-1,-1,-1,-1,-1,-1,-1,-1,-1,151,220,-1,-1,-1,208,196,-1,-1,162,0,295,271,272,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岐阜県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,294,235,160,-1,295,0,-1,43,113,128,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 静岡県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,167,-1,-1,-1,-1,109,271,-1,0,181,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 愛知県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,272,43,181,0,82,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 三重県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,113,-1,82,0,95,107,-1,-1,91,91,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 滋賀県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,176,-1,-1,128,-1,-1,95,0,14,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 京都府,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,188,-1,-1,-1,-1,-1,107,14,0,49,75,48,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 大阪府,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,49,0,45,33,80,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 兵庫県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,75,45,0,-1,-1,180,-1,139,-1,-1,115,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 奈良県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,-1,48,33,-1,0,98,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 和歌山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,91,-1,-1,-1,-1,98,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 鳥取県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,180,-1,-1,0,128,167,296,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # 島根県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,80,-1,128,0,-1,212,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 岡山県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,139,-1,-1,167,-1,0,165,-1,-1,70,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 広島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,296,212,165,0,131,-1,-1,190,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 山口県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,131,0,250,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 徳島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,-1,-1,-1,-1,-1,-1,250,0,73,191,161,-1,-1,-1,-1,-1,-1,-1,-1 # # 香川県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,70,-1,-1,73,0,156,-1,-1,-1,-1,-1,-1,-1,-1,-1 # # 愛媛県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,190,-1,191,156,0,156,-1,-1,-1,-1,-1,-1,-1,-1 # # 高知県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,161,-1,156,0,-1,-1,-1,-1,-1,-1,-1,-1 # # 福岡県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,165,-1,-1,-1,-1,0,61,-1,117,159,-1,-1,-1 # # 佐賀県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,61,0,109,-1,-1,-1,-1,-1 # # 長崎県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,109,0,-1,-1,-1,-1,-1 # # 熊本県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,117,-1,-1,0,218,192,187,-1 # # 大分県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,159,-1,-1,218,0,181,-1,-1 # # 宮崎県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,192,181,0,158,-1 # # 鹿児島県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,187,-1,158,0,733 # # 沖縄県,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,733,0 # '47都道府県のうち出発地と目的地の入力して最短経路を求めて距離と順路を表示する(ただし経路は7以下とする)' :- 'Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 県と県の間を半角 開ける'(_都道府県名ならび), '47都道府県のうち出発地と目的地の入力する'(_都道府県名ならび,_出発地,_目的地), 最短経路(_出発地,_目的地,_距離,_順路), 距離と経路の表示(_出発地,_目的地,_距離,_順路). '47都道府県のうち出発地と目的地の入力する'(_都道府県名ならび,_出発地,_目的地) :- 出発地を入力する(_都道府県名ならび,_出発地), 目的地を入力する(_都道府県名ならび,_目的地). 出発地を入力する(_都道府県名ならび,_出発地) :- write('出発地の都道府県名番号を入力してください : '), get_line(Line), 出発地を入力診断(Line,_都道府県名ならび,_出発地),!. 出発地を入力する(_都道府県名ならび,_出発地) :- 出発地を入力する(_都道府県名ならび,_出発地). 出発地を入力診断(Line,_都道府県名ならび,_出発地) :- atom_to_term(Line,_出発地番号,_), integer(_出発地番号), _出発地番号 > 1, _出発地番号 =< 47, list_nth(_出発地番号,_都道府県名ならび,_出発地),!. 出発地を入力診断(Line,_都道府県名ならび,_出発地) :- write_formatted('入力された %t から適切な出発地を得ることができません。再入力をお願いします。\n',[Line]), fail. 目的地を入力する(_都道府県名ならび,_目的地) :- write('目的地の都道府県名番号を入力してください : '), get_line(Line), 目的地を入力診断(Line,_都道府県名ならび,_目的地), 目的地を入力する(_都道府県名ならび,_目的地) :- 目的地を入力する(_都道府県名ならび,_目的地). 目的地を入力診断(Line,_都道府県名ならび,_目的地) :- atom_to_term(Line,_目的地番号,_), integer(_目的地番号), _目的地番号 > 1, _目的地番号 =< 47,!. 目的地を入力診断(Line,_,_目的地) :- write_formatted('入力された %t から適切な目的地を得ることができません。再入力をお願いします。\n',[Line]), fail. 距離と経路の表示(_出発地,_目的地,_距離,_順路) :- write_formatted('距離は %t,経路は %t',[_距離,_出発地]), append(_,[[A,B]|R],_順路), write_formatted(' -> %t ',[B]), R = [], write('\n'),!. 'Map.datを読み取って画面に一覧表を表示「1」と「.」は半角 県と県の間を半角 開ける'(_都道府県名ならび) :- get_split_lines('Map.dat',[','],LL), 第要素は都道府県名、残りは経路情報(LL,_都道府県名ならび,_経路情報ならび), append(L0,[[_県名|_隣接情報ならび]|R2],_経路情報ならび), 隣接情報の登録(_県名,_都道府県名ならび,_隣接情報ならび), length([_|L0],_都道府県番号), write('%2d.%t ',[_都道府県番号,_県名]), R2 = [], write('\n'). 第一要素は都道府県名、残りは経路情報(LL,_都道府県名ならび,_経路情報ならび) :- LL = [_都道府県名ならび|_経路情報ならび],!. 隣接情報の登録(_都道府県名,_都道府県名ならび,L1) :- abolish(隣接県距離/3), append(L0,[_距離|R],L1), \+(_距離 = (-1)), \+(_距離 = 0), length([_|L0],Nth), list_nth(Nth,_都道府県名ならび,_都道府県名2), assertz(隣接県距離(_都道府県名,_件名2,_距離)), fail. 隣接情報の登録(_,_,_). 最短経路(_出発地,_目的地,_距離,_順路) :- findall([_順路,_距離],( 到達(_出発地,_目的地,_距離,[],_順路)), _順路・距離ならび), findmin(_距離,append(_,[[_,_距離]|_],_順路・距離ならび),_最短距離), append(_,[[_順路,_最短距離]|_],_順路距離ならび). 到達(_都道府県名1,_都道府県名2,_距離,_順路1,_順路) :- 隣接県距離(_都道府県名1,_都道府県名2,_距離), append(_順路1,[[_都道府県名1,_都道府県名2]],_順路),!. 到達(_都道府県名1,_都道府県名2,_距離,_順路1,_順路) :- length(_順路1,_経路数), _経路数 < 7, 隣接県距離(_都道府県名1,_都道府県名3,_距離1), この経路は選択されたことがない(_都道府県名1,_都道府県名2), append(_順路1,[[_都道府県名1,_都道府県名3]],_順路2), 到達(_都道府県名1,_都道府県名2,_距離2,_順路2,_順路), _距離 is _距離1 + _距離2. この経路は選択されたことがない(_都道府県名1,_都道府県名2) :- \+(append(_,[[_都道府県名1,_都道府県名3]|_],_順路1)), \+(append(_,[[_都道府県名3,_都道府県名1]|_],_順路1)),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/846 # # ・DBMS名とバージョン #  Microsoft Access2000 # # ・テーブルデータ # 【ITEM_COUNT】 # item_id | year | month | count # --------------------------- # 00001  | 2010 |   1 |  150 # 00001  | 2010 |   1 |  400 # 00001  | 2010 |   2 |   20 #   (中略) # 00001  | 2010 |  11 |  120 # 00001  | 2010 |  11 |   50 # 00001  | 2010 |  11 |  200 # 00001  | 2010 |  12 |   30 # 00001  | 2011 |   1 |  500 # 00001  | 2011 |   1 |  100 # 00002  | 2010 |   1 |   10 # 00002  | 2010 |   2 |   30 # 00002  | 2010 |   2 |  100 #   (後略) # ※同じid, year, monthのデータが複数存在します。 # # # ・欲しい結果 # item_id | 1月 | 2月 | … | 11月 | 12月 | 13月 # -------------------------------------------- # 00001  | 550 |  20 | … | 370 |  30 | 610 # 00002  |  10 | 130 | … | (後略) # # ※2010/1〜2011/1の13ヶ月間を1月〜13月として(2011/1を13月として)それぞれ集計を求めたい # # # ・説明 # 現状は、 # ------------------------------------ # SELECT #  year, item_id # FROM #  ITEM_COUNT # WHERE #  year=2010 # GROUP BY #  item_id, year # PIVOT #  Format(month,"#0月") In ("1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"); # ------------------------------------ # 上のクエリを「集計1」、WHERE句を"year=2011"に変更したものを「集計2」とし、 # 次のクエリで結果を求めています。 # ------------------------------------ # SELECT #  集計1.item_id, 集計1.[1月], 集計1.[2月], … , 集計1.[12月],集計2.[1月] AS 13月 # FROM #  集計1 LEFT JOIN 集計2 ON 集計1.[item_id] = 集計2.[item_id] # ------------------------------------ # # しかしこれだと2011/1にのみデータがあるitem_idが集計から外れてしまいます。 # これを回避するにはどのように直したら良いでしょうか。 # # 年度を俣いで月合計を表示する :- findsetof([_item_id],( 'ITEM_COUNT'(_item_id,_year,_month,_count)), L1), findall([_item_id,_合計回数ならび],( append(_,[_item_id|_],L1), '2010年集計'(_2010年counts), '2011年集計'(_2011年counts), append(_2010年counts,_2011年counts,_合計回数ならび)), _集計ならび), 見出し表示, append(_,[[_itemp_id,_合計回数ならび]|R],_集計ならび), write_formatted(' %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d\n',_合計回数ならび), R = []. 見出し表示 :- append(_,[_月|R],['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月']), write_formatted(' %3s |',[_月]), R = [], write(' 13月\n'),!. '2010年集計'(_item_id,2010,_month,_合計回数) :- for(1,_month,12), findsum(_count,'ITEM_COUNT'(_item_id,2000,_month,_count),_合計回数). '2011年集計'(_item_id,2011,_month,_合計回数) :- findsum(_count,'ITEM_COUNT'(_item_id,2011,1,_count),_合計回数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/694 # # [1] 授業単元: プログラミング自由課題 # [2] 問題文(含コード&リンク): ファイルの出力のソート化 # # ファイルの入出力で、ファイルオープンした後に昇順のソートがしたいのですがよくわかりません。 # スケジュール管理表のような感じのプログラムを作りたいので、配列を日程と内容の2つに分けました。 # 「日程」はint型の配列を使用し、1月20日ならば0120のように入力します。「内容」の配列はchar型を使用しました。 # txtは「0120(日程) 2ch書き込み(内容)」のようにし、ここからファイルをオープン後txtに入力してある # データを日程の昇順でソートし、出力したいのですがよくわかりません・・・。 # ファイルをオープンした後に日程の配列を読み込み、それをソート後、日程と内容の配列を関連づければいいのでしょうか? # 'ファイルオープンした後に昇順のソートがしたい'(_txtファイル,_整列されたtxtファイル) :- open(_txtファイル,read,Instream), 日程部分と内容を別に切り出す(Instream,1,_日程ならび,_内容ならび), close(Instream), 日程ならびを整列する(_日程ならび,_整列された日程ならび), open(_整列されたtxtファイル,write,Output), 整列された日程の順序番号を鍵として内容を結合しながら昇順に書き出す(Outstream,_整列された日程部分ならび,_内容ならび), close(Output). 日程部分と内容を別に切り出す。日程には順序番号を付加する(Instram,_,[],[]) :- at_end_of_stream(Instream),!. 日程部分と内容を別に切り出す。日程には順序番号を付加する(Instream,N2,[[_日程,N]|R1],[_内容|R2]) :- get_line(Instream,Line), sub_atom(Line,0,4,RLen,_日程), sub_atom(Line,4,RLen,_,_内容), N2 is N + 1, 日程部分と内容を別に切り出す。日程には順序番号を付加する(Instream,N2,R1,R2). 日程を昇順に整列する([_分割点要素|_整列対象ならび],_整列されたならび) :- 整列の為の分割(_整列対象ならび,_分割点要素,_等しいかより少ない要素ならぴ,_より大きい要素ならび), 日程を昇順に整列する(_等しいかより少ない要素ならぴ,_整列されたならびの一), 日程を昇順に整列する(_より大きい要素ならび,_整列されたならびの二), append(_整列されたならぴの一,[_分割点要素|_整列されたならびの二],_整列されたならび). 日程を昇順に整列する([],[]). 整列の為の分割([],_,[],[]) :- !. 整列の為の分割([_要素|R],_分割点要素,[_要素|R1],R2) :- _要素 @=< _分割点要素, 整列の為の分割(R,_分割点要素,R1,R2),!. 整列の為の分割([_要素|R],_分割点要素,R1,[_要素|R2]) :- _要素 @> _分割点要素, 整列の為の分割(R,_分割点要素,R1,R2),!. 整列された日程の順序番号を鍵として内容を結合しながら昇順に書き出す(Outstream,[],_内容ならび) :- !. 整列された日程の順序番号を鍵として内容を結合しながら昇順に書き出す(Outstream,[[_日程,N]|R],_内容ならび) :- list_nth(N,_内容ならび,_内容), concat_atom([_日程,_内容],Line), write_formatted(Outstream,'%t\n',[Line]), 整列された日程の順序番号を鍵として内容を結合しながら昇順に書き出す(Outstream,R,_内容ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/636 # # 1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/ywata-lab.yz.yamagata-u.ac.jp/PDF/pro2-1-19.pdf # # 課題9: # コンピュータ(com)とあなた(you)がジャンケンをするプ # ログラムにおいて,以下の2つユーザ関数に作成して, # 実行できるようにせよ # 1.コンピュータ(com)の「手」を出力する # int Rival(void) # 2.勝敗を判定し,出力する # void Judge(int you, int com) 私とコンピュータがジャンケンをする(_勝負) :- 私の「手」を出力する(_私の拳), 'コンピュータ(com)の「手」を出力する'(_コンピュータの拳), '勝敗を判定し,出力する'(_私の拳,_コンピュータ拳,_勝負), \+(_勝負 = あいこ). 私とコンピュータがジャンケンをする(_勝負) :- 私とコンピュータがジャンケンをする(_勝負). 私の「手」を出力する(_私の拳) :- write('サイショはグー ジャンケンポン : '), get_line(_私の拳), write_formatted('私: %t 対 ',[_私の拳]). 'コンピュータ(com)の「手」を出力する'(_コンピュータの拳) :- 乱数によってコンピュータの「手」を決める(_コンピュータの拳), 「手」を出力する(_コンピュータの拳). '勝敗を判定し,出力する'(_私の拳,_コンピュータ拳,_勝負) :- 勝敗を判定し(_拳,_拳,_勝負), 出力する(_勝負). 勝敗を判定し(_拳,_拳,あいこ) :- !. 勝敗を判定し(グー,チョキ,私の勝ち) :- !. 勝敗を判定し(チョキ,パー,私の勝ち) :- !. 勝敗を判定し(パー,グー,私の勝ち) :- !. 勝敗を判定し(_,_,コンピュータの勝ち). 出力する(_勝負) :- write_formatted('%t です\n',[_勝負]). 乱数によってコンピュータの「手」を決める(_拳) :- Nth is (random mod 3) + 1, list_nth(Nth,[グー,チョキ,パー],_拳). 「手」を出力する(_コンピュータの拳) :- write_formatted('コンピュータ: %t\n',[_コンピュータの拳]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/532 # # 2] 問題文(含コード&リンク):「お菓子などのおまけを全種集めるためには平均して何個お菓子を購入すればよいか」を調べるプログラムを作りなさい。また処理概要の説明をしなさい。 # # たとえば、全部で10種類おまけがあったとして、すでに所持2種類ならば、非所持は8種類。 # ⇒1から8の乱数を発生させて1から8が全部集まったら、集まるまでに何度乱数発生させたかを記憶。 # ←これを1万回ほど繰り返して、平均して何度購入すればよいかを求める。 # という流れで作ろうと思うのですが、この例で1から8まで集まったことをどうやって確認するのかわからず、 # お手上げ状態です。どなたかお力添えいただければ幸いです。 おまけが出る確率(1,0.08). おまけが出る確率(2,0.08). おまけが出る確率(3,0.3). おまけが出る確率(4,1.0). おまけが出る確率(5,0.5). おまけが出る確率(6,0.2). おまけが出る確率(7,0.1). おまけが出る確率(8,0.1). おまけが出る確率(9,0.3). おまけが出る確率(10,0.15). おまけ乱数表の生成(LL) :- findall(L,( for(1,_菓子番号,10), おまけが出る確率(_菓子番号,_確率), N is truncate(100 * _確率), length(Ln,N), 'N個分の乱数を確保'(N,[],L)), LL). 'N個分の乱数を確保'(N,L,L) :- length(L,N),!. 'N個分の乱数を確保'(N,L1,L) :- X is random mod 100, \+(append(_,[X|_],L1)), 'N個分の乱数を確保'(N,[X|L1],L),!. 'N個分の乱数を確保'(N,L1,L) :- 'N個分の乱数を確保'(N,L1,L),!. 'お菓子などのおまけを全種集めるためには平均して何個お菓子を購入すればよいか」を調べる'(_すべての菓子のおまけが得られる平均回数) :- おまけ乱数表の生成(LL), findavg(Count,( for(1,_,1000), すべての菓子のおまけが得られるまで(LL,[],0,Count)), _すべての菓子のおまけが得られる平均回数). すべての菓子のおまけが得られるまで(LL,L1,Count,Count) :- length(L1,10),!. すべての菓子のおまけが得られるまで(LL,L1,Count1,Count) :- R is random mod 100, findall(N,( for(1,N,10), \+(append(_,[N|_],L1)), list_nth(N,LL,L), append(_,[R|_],L)), L2), append(L1,L2,L3), Count2 is Count1 + 1, すべての菓子のおまけが得られるまで(LL,L3,Count2,Count). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1292333005/726 # # 基本的な質問ですが # switch(a){ #  case 0: b=0; break; #  case 1: b=0; break; #  case 2: b=5; break; # ・・・ # } # return b; # ↓ # var b[3]={ 0, 0, 5 ・・・}; # return b[a]; # # 上2つは返す値でいえば同じだと思います # 速度とかメモリ関連では違うと思いますけど・・・ # 下のも同じようにまたは別の形で簡潔にできる方法はありませんか? # 言語はそこそこメジャーなものならなんでもいいです # # if(a < 0){ #  b=0; # }else if(a < 1){ #  b=0; # }else if(a < 2){ #  b=5; # ・・・ # } # ↓ # ・・・ # 至らない点あればすみません # return(_a,_,0) :- _a < 0,!. return(_a,L,N) :- _b is truncate(_a + 2), list_nth(_b,L,N). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/239 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 縦は無数、横が10列で数字が書き込まれているecxelファイルを読み込む(ファイル名は何でもいいです) # 読み込む時は今後の処理を考えてなるべく配列で # その後各列を縦に参照していき、正の値が出たときは別の同じ型の配列の同じ位置に代入していく # 負の値が出たときに、そのセルの列の前5個、後ろ5個を参照し以下の処理を行う # 前にも後ろにも正の値が検出された場合 → 参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する # 前あるいは後ろの片方にしか正の値が検出されなかった場合 → 一番近い値をそのまま別の配列に格納する # 前にも後ろにも正の値が無い場合 → そのままの負の値で別の配列に格納する # # 最後に値の変更を終えた別の配列をそのままresult.csvとして出力する # # # 'ファイルからcsvファイルを読み取りルールにしたがってすべてのセルを書き換え、result.csvファイルに出力する'(_ファイル,LL) :- '縦は無数、横が10列で数字が書き込まれているecxelファイルを読み込む'(_ファイル,LL1), 転置(LL1,LL2), ルールにしたがってすべてのセルを書き換える(LL2,LL3), 転置(LL3,LL), 'result.csvファイルとして出力する'(LL). '縦は無数、横が10列で数字が書き込まれているecxelファイルを読み込む'(_ファイル,LL) :- get_split_lines(_ファイル,[' '],LL). ルールにしたがってすべてのセルを書き換える(L,[]) :- !. ルールにしたがってすべてのセルを書き換える([L1|R1],[L2|R2]) :- length(L1,Len), ルールにしたがってすべての行を書き換える(1,Len,L1,[_セル2|R2]) :- ルールにしたがってすべてのセルを書き換える(R1,R2). ルールにしたがってすべての行を書き換える(M,Len,[]) :- M > Len,!. ルールにしたがってすべての行を書き換える(M1,Len,L,[_セル1|R2]) :- list_nth(M1,L,_セル1), _セル1 >= 0, M2 is M1 + 1, ルールにしたがってすべての行を書き換える(M2,Len,L,R2),!. ルールにしたがってすべての行を書き換える(M1,Len,L,[_参照しているセルに一番近い値|R2]) :- そのセルの列の前5個、後ろ5個を参照し(L,M1,Len,_前5個ならび,_そのセル,_後ろ5個ならび), 前あるいは後ろの片方にしか正の値が検出されなかった場合(L,_前5個ならび,_そのセル,_後ろ5個ならび), '参照しているセルに一番近い値をそのまま別の配列に格納する'(_そのセルの位置,_前5個ならび,_そのセル,_後ろ5個ならび,_参照しているセルに一番近い値), M2 is M1 + 1, ルールにしたがってすべての行を書き換える(M2,Len,L,R2),!. ルールにしたがってすべての行を書き換える(M1,Len,L,[_2つの平均値|R2]) :- そのセルの列の前5個、後ろ5個を参照し(L,M1,Len,_前5個ならび,_そのセル,_後ろ5個ならび), 前にも後ろにも正の値が検出された場合(_前5個ならび,_そのセル,_後ろ5個ならび), '参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する'(_前5個ならび,_そのセル,_後ろ5個ならび,_2つの平均値), M2 is M1 + 1, ルールにしたがってすべての行を書き換える(M2,Len,L,R2),!. ルールにしたがってすべての行を書き換える(M1,Len,L,[_そのセル|R2]) :- そのセルの列の前5個、後ろ5個を参照し(L,M1,Len,_前5個ならび,_そのセル,_後ろ5個ならび), 前にも後ろにも正の値が無い場合(_前5個ならび,_そのセル,_後ろ5個ならび), M2 is M1 + 1, ルールにしたがってすべての行を書き換える(M2,Len,L,R2),!. 前あるいは後ろの片方にしか正の値が検出されなかった場合(_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセル < 0, append(_,[N1|_],_前5個ならび), N1 > 0, \+((append(_,[N2|_],_後ろ5個ならび),N2 > 0)),!. 前あるいは後ろの片方にしか正の値が検出されなかった場合(_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセル < 0, \+((append(_,[N1|_],_前5個ならび),N1 > 0)), append(_,[N2|_],_後ろ5個ならび), N2 > 0,!. 前にも後ろにも正の値が検出された場合(_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセル < 0, append(_,[N1|_],_前5個ならび), N1 > 0, append(_,[N2|_],_後ろ5個ならび), N2 > 0,!. 前にも後ろにも正の値が無い場合(_前5個ならび,_そのセル,_後ろ5個ならび) :- \+((append(_,[N1|_],_前5個ならび),N1 > 0)), \+((append(_,[N2|_],_後ろ5個ならび),N2 > 0)),!. そのセルの列の前5個、後ろ5個を参照し(L,_そのセルの位置,Len,_前5個ならび,_そのセル,_後ろ5個ならび) :- Len < _そのセルの位置 + 5, _そのセルの位置 >= 6, len0 is _そのセルの位置 - 6, length(L0,Len0), length(_前5個ならび,5), append(_前5個ならび,[_そのセル|_後ろ5個ならび],L1), append(L0,L1,L),!. そのセルの列の前5個、後ろ5個を参照し(L,_そのセルの位置,Len,_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセルの位置 < 6, Len >= _そのセルの位置 + 5, _前5個ならびの長さ is _そのセルの位置 - 1, length(_前5個ならび,_前5個ならびの長さ), length(_後ろ5個ならび,5), append(_前5個ならび,[_そのセル|_後ろ5個ならび],L1), append(L1,L2,L),!. そのセルの列の前5個、後ろ5個を参照し(L,_そのセルの位置,Len,_前5個ならび,_そのセル,_後ろ5個ならび) :- _そのセルの位置 >= 6, Len >= _そのセルの位置 + 5, Len0 is _そのセルの位置 - 6, length(L0,Len0), length(_前5個ならび,5), append(_前5個ならび,[_そのセル|_後ろ5個ならび],L1), append(L0,L1,_,L),!. '参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する'([],_そのセル,_後ろ5個ならび,_値) :- findmin([M,N],( append(_,[N|_],_後5個ならび), M is abs(N - _そのセル)), [_差,_値]),!. '参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する'(_前5個ならび,_そのセル,[],_値) :- findmin([M,N],( append(_,[N|_],_前5個ならび), M is abs(N - _そのセル)), [_差,_値]), '参照しているセルに一番近い前と後ろの値の2つの平均値を取得し別の配列に格納する'(_前5個ならび,_そのセル,_後ろ5個ならび,_2つの平均値) :- findmin([M,N],( append(_,[N|_],_前5個ならび), M is abs(N - _そのセル)), [_差1,_値1]), findmin([M,N],( append(_,[N|_],_後5個ならび), M is abs(N - _そのセル)), [_差2,_値2]), _2つの平均値 is (_値1 + _値2) / 2. '参照しているセルに一番近い値をそのまま別の配列に格納する'(_前5個ならび,_そのセル,_後ろ5個ならび,_参照しているセルに一番近い値) :- append(_前5個ならび,_後ろ5個ならび,L), findmin([M,N],( append(_,[N|_],L), M is abs(N - _そのセル)), [_差2,_参照しているセルに一番近い値]),!. 'result.csvファイルとして出力する'(LL) :- open('result.csv',write,Outstream), 'result.csvファイルとして出力する'(Outstream,LL), close(Outstream). 'result.csvファイルとして出力する'(_,[]) :- !. 'result.csvファイルとして出力する'(Outstream,[L|R]) :- concat_atom(L,' ',S), write_formatted(Outstream,'%t\n',[S]), 'result.csvファイルとして出力する'(Outstream,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/258 # # すいません不備があったのでもう一度書き込みします。 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): http://ime.nu/www.dotup.org/uploda/www.dotup.org1355480.txt.html # # 縦30横30のます目があり、オフのます目の周囲に3つのオンのます目があれば、次の回ではオンになる # オンのます目の周りに2つ、3つのます目があれば、次の回でもオンになる # これら以外での場合では次の回ではオフになる # ますの上端下端、右端左端は接続されている # これを50回繰り返したときのますの状態 オン=1 オフ=0で表現 # 初期の状態は外部からあらかじめファイルを呼び出すものとする '縦30横30のます目があり、オフのます目の周囲に3つのオンのます目があれば、次の回ではオンになる。オンのます目の周りに2つ、3つのます目があれば、次の回でもオンになる。これら以外での場合では次の回ではオフになるますの上端下端、右端左端は接続されている。これを50回繰り返したときのますの状態を オン=1 オフ=0で表現。初期の状態は外部からあらかじめファイルを呼び出すものとする' :- '初期の状態は外部からあらかじめファイルを呼び出すものとする'(_外部ファイル,LL), length(Ln,50), 全体のます目を書き換える(Ln,LL1,LL2). '初期の状態は外部からあらかじめファイルを呼び出すものとする'(_外部ファイル,LL) :- see(_外部ファイル), read(LL), seen,!. 全体のます目を書き換える([],LL,LL) :- !. 全体のます目を書き換える([_|Ln],LL1,LL) :- 全体のます目を書き換える(LL1,LL2), 全体のます目を書き換える(Ln,LL2,LL). 全体のます目を書き換える(LL1,LL2) :- findall(L,( append(L0,[L1|_],LL1), length(L0,Len0), _行 is Len0 + 1, findall(K,( append(L01,[K1|_],L1), length(L01,Len01), _列 is Len01 + 1, ます目変換(_行,_列,K1,K)), L)), LL2). ます目変換(_行,_列,1,1) :- 隣接(LL,_行,_列,_隣1,_隣2,_隣3,_隣4), S is _隣+_隣2+_隣3+_隣4, S >= 2,S =< 3,!. ます目変換(_行,_列,0,1) :- 隣接(LL,_行,_列,_隣1,_隣2,_隣3,_隣4), 3 is _隣+_隣2+_隣3+_隣4,!. ます目変換(_行,_列,_,0). 隣接(LL,_行,_列,_隣1,_隣2,_隣3,_隣4) :- 行隣(LL,_行,_列,_隣1,_隣2), 列隣(LL,_行,_列,_隣3,_隣4),!. 行隣(LL,_行,1,_隣1,_隣2) :- list_nth(_行,LL,L1), list_nth(30,L1,_隣1), list_nth(2,L1,_隣2). 行隣(LL,_行,30,_隣1,_隣2) :- list_nth(_行,LL,L1), list_nth(29,L1,_隣1), list_nth(1,L1,_隣2). 行隣(LL,_行,_列,_隣1,_隣2) :- list_nth(_行,LL,L1), _列_1 is _列 - 1, list_nth(_列_1,L1,_隣1), _列_2 is _列 + 1, list_nth(_列_2,L1,_隣2),!. 列隣(LL,_行,1,_隣1,_隣2) :- list_nth(30,LL,L1), list_nth(_列,L1,_隣1), list_nth(2,LL,L2), list_nth(_列,L2,_隣2),!. 列隣(LL,_行,30,_隣1,_隣2) :- list_nth(29,LL,L1), list_nth(_列,L1,_隣1), list_nth(1,LL,L2), list_nth(_列,L2,_隣2),!. 列隣(LL,_行,_列,_隣1,_隣2) :- _行1 is _行 - 1, list_nth(_行1,LL,L1), list_nth(_列,L1,_隣1), _行2 is _行 + 1, list_nth(_行2,LL,L2), list_nth(_列,L2,_隣2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/230 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # y.txtというアルファベットしか含まれていない単純なテキストファイルを用意します。 # それをC言語にて読み込んでランレングス圧縮します。 # そしてそれを圧縮したz.txtを新たに作り出します。 # 作成した後、z.txtをもとのy.txtに戻す(復号化)プログラムを作成せよ。 # 'y.txtというアルファベットしか含まれていない単純なテキストファイルを用意します' :- length(L,1000), 'y.txtというアルファベットしか含まれていない単純なテキストファイルを用意します'(L), put_chars('y.txt',L). 'y.txtというアルファベットしか含まれていない単純なテキストファイルを用意します'(L) :- アルファベットしか含まれていない文字列(L1), append(L1,R,L), 'y.txtというアルファベットしか含まれていない単純なテキストファイルを用意します'(R),!. 'y.txtというアルファベットしか含まれていない単純なテキストファイルを用意します'([]) :- !. 'y.txtというアルファベットしか含まれていない単純なテキストファイルを用意します'(L) :- アルファベットしか含まれていない文字列(L1), ならびに書き込む(L1,L), append(L1,R,L), 'y.txtというアルファベットしか含まれていない単純なテキストファイルを用意します'(R),!. ならびに書き込む(L1,L,R) :- append(L1,R,L),!. ならびに書き込む(L,L,[]). アルファベットしか含まれていない連続文字ならび(L) :- Char is (random mod 26) + 65, 連続出現(_連続数), length(_連続文字ならび,_連続数), all(_連続文字ならび,_乱順に選択された), アルファベットしか含まれていない文字列(L2), append(L1,L2,L). 連続出現(_連続数) :- Nth is (random mod 16) + 1, list_nth(Nth,[1,1,1,1,1,1,2,2,2,2,3,3,4,4,4,8],_連続数). それ読み込んでランレングス圧縮します([A|R],L) :- append(L0,[B|R2],[A|R]), \+(A = B), all(L0,A), length(L0,Len), それ読み込んでランレングス圧縮します([B|R2],L2), append(L0,L2,L). それ読み込んでランレングス圧縮します(_,[]) :- !. 'そしてそれを圧縮したz.txtを新たに作り出します'(L) :- put_chars('z.txt',L). '作成した後、z.txtをもとのy.txtに戻す(復号化)' :- get_chars('z.txt',L1), ランレングス復号(L1,L2), put_chars('y.txt',L2). ランレングス復号([],[]) :- !. ランレングス復号([Char,N|R1],L) :- length(L0,N), all(L0,Char), ランレングス復号(R1,L1), appned(L0,L1,L). % 以下のサイトは 和暦西暦変換(_和暦,_西暦) :- integer(_西暦), findmax([_最終年,_元年,_年間],( 年間(_年間,_元年,_最終年), _最終年 =< _西暦), [_最終年,_元年,_年間]), _年 is _西暦 - _元年 + 1, 和暦年表示(_年間,_年,_和暦),!. 和暦西暦変換(_和暦,_西暦) :- atom(_和暦), 年間(_年間,_元年,_最終年), sub_atom(_和暦,0,Len,R1,_年間), sub_atom(_和暦,Len,_,0,_和暦年), 和暦の年抽出(_和暦年,_年間,_年), _西暦 is _元年 + _年 - 1,!. 年間(慶応,1865,1868). 年間(明治,1868,1912). 年間(大正,1912,1926). 年間(昭和,1926,1989). 年間(平成,1989,2011). 和暦年表示(_年間,_年,_和暦年) :- _年 =< 10, list_nth(_年,[元,二,三,四,五,六,七,八,九,十],A), concat_atom([_年間,A,年],_和暦年),!. 和暦年表示(_年間,_年,_和暦年) :- _年 >= 11, Div is _年 // 10, Mod is (_年 mod 10) + 1, list_nth(Div,['',二,三,四,五,六,七,八,九],A), list_nth(Mod,['',一,二,三,四,五,六,七,八,九],B), concat_atom([_年間,A,十,B,年],_和暦年),!. 和暦の年抽出(_和暦年,_年間,_年) :- sub_atom(_和暦年,_,_,_,_年間,S2,年,L1,L2,L3), 年間(_年間,_元年,_最終年), 漢数字アラビア数字対応(L2,_年). 漢数字アラビア数字対応('',0). 漢数字アラビア数字対応(元,1). 漢数字アラビア数字対応(一,1). 漢数字アラビア数字対応(二,2). 漢数字アラビア数字対応(三,3). 漢数字アラビア数字対応(四,4). 漢数字アラビア数字対応(五,5). 漢数字アラビア数字対応(六,6). 漢数字アラビア数字対応(七,7). 漢数字アラビア数字対応(八,8). 漢数字アラビア数字対応(九,9). 和数字アラビア数字対応([A,十,B],N) :- 和数字アラビア数字対応(A,N1), 和数字アラビア数字対応(B,N2), N is N1 * 10 + N2,!. 和数字アラビア数字対応([A,十],N) :- 和数字アラビア数字対応(A,N1), N is N1 * 10,!. 和数字アラビア数字対応([十,B],N) :- 和数字アラビア数字対応(B,N2), N is 10 + N2,!. 和数字アラビア数字対応([十],10) :- !. 和数字アラビア数字対応([A],N) :- 和数字アラビア数字対応(A,N). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/29 # # 【質問テンプレ】 # [1] 授業単元: 情報数学2 # [2] 問題文(含コード&リンク): #   3行5列の15人の学生の身長が記録されたheight.csvがあります。 #   それぞれの学生に対しランダムで0.1刻みで0.1から0.5までの値を付加します。 #   このポイントを基礎ポイントといいます。 #   \1行目の学生5人を取り出しそれぞれの学生に対し、 #   *ランダムで0.1刻みで0.1から0.5までの値を基礎ポイントに対し付加します。 #   5人の学生の中で与えられたポイントの合計が最も少ない学生を回の代表値とします。* #   基礎ポイントに対しランダム値を付加し回の代表値を選出する作業(*〜*)を、 #   同じ1行目の5人の学生に対し5回行います。 #   5回分の代表値の中で最も多い値を行の代表値とします。\ #   1行分の行の代表者の選出(\〜\)を3行分繰り返します。 #   全てのステップを行い結果をresult.csvとして出力します。 # # http://hibari.2ch.net/test/read.cgi/tech/1294061094/30 #   result.csvの形式は、 #   3行71列の表になります。 #   1〜5列目まではheight.csvと同じ出力です。 #   6〜10列目まではそれぞれの学生にどんな基礎ポイントが付加されたかを示し、 #   11〜15列目は1回目のランダム付加でどのような値が付加されたかを示し、 #   16〜20列目は基礎ポイントと付加ポイントの合計を示し、 #   21列目は1回目の回の代表値を示し、 #   22列目は回の代表者の身長を示します。 #   23〜34列目は2回目、 #   35〜46列目は3回目、 #   47〜58列目は4回目、 #   59〜70列目は5回目を示します。 #   71列目は行の代表者の身長を示します。 # 元のheight.csvの3行5列の並び順と、 #   それ以降の処理での3行5列の部分の値の位置は対応するようにお願いします。 #   長くなって申し訳ありません。 #   よろしくお願いいたします。 # '1行分の行の代表者の選出を3行分繰り返します。' :- '3行5列の15人の学生の身長が記録されたheight.csvがあります。'(LL), 基礎ボイント(_基礎ポイント), tell('height.csv'), '1行分の行の代表者の選出を3行分繰り返します。'(1,LL,_基礎ポイント), told. '1行分の行の代表者の選出を3行分繰り返します。'(_N行目,_,_) :- _N行目 > 3,!. '1行分の行の代表者の選出を3行分繰り返します。'(_N行目,LL,_基礎ポイント) :- '同じN行目の5人の学生に対し5回行います。'(_N行目,LL,_基礎ポイント,_付加された基礎ポイント,_代表の身長). _次の行 is _N行目 + 1, '1行分の行の代表者の選出を3行分繰り返します。'(_次の行,LL,_付加された基礎ポイント). '3行5列の15人の学生の身長が記録されたheight.csvがあります。'(LL) :- get_aplit_lines('height.csv',[' ',','],LL). 基礎ポイント(_基礎ポイント) :- length(_基礎ポイント,3), findall(L,( length(L,5), append(_,[L|_],_基礎ポイント)), _基礎ポイント), 'それぞれの学生に対しランダムで0.1刻みで0.1から0.5までの値を付加します。'(_基礎ポイント). 'それぞれの学生に対しランダムで0.1刻みで0.1から0.5までの値を付加します。'([]) :- !. 'それぞれの学生に対しランダムで0.1刻みで0.1から0.5までの値を付加します。'([L|R]) :- findall(_付加する数,( append(_,[_付加する数|_],L), _付加する数 is ((random mod 5) + 1) / 10)), L), 'それぞれの学生に対しランダムで0.1刻みで0.1から0.5までの値を付加します。'(R). '同じN行目の5人の学生に対し5回行います。'(_N行目,LL,_基礎ポイント,_付加された基礎ポイント,_代表の身長) :- list_nth(_N行目,LL,L), write_formatted('%t,%t,%t,%t,%t,',L), list_nth(_N行目,_基礎ポイント,_N行目の基礎ポイント), write_formatted('%t,%t,%t,%t,%t,',[_N行目の基礎ボイント]), length(Ln,5), '同じN行目の5人の学生に対し5回行います。'(Ln,_N行目,_基礎ポイント,_付加された基礎ポイント,_代表値ならび), 行代表者の身長は(_N行目,LL,_代表値ならび,_代表の身長), write_formatted('%t\n',[_代表の身長]),!. 行代表者の身長は(_N行目,LL,_代表値ならび,_代表の身長). min(_代表値ならび,[_行の代表値,_n人目]), list_nth(_N行目,LL,L), list_nth(_n人目,L,_代表の身長),!. '同じN行目の5人の学生に対し5回行います。'([],_,_基礎ポイント,_基礎ポイント,[]) :- !. '同じN行目の5人の学生に対し5回行います。'([_|Ln],_N行目,_基礎ポイント,_付加された基礎ポイント,[[_代表値,_n人目]|R3]) :- 'N行目の学生5人を取り出しそれぞれの学生に対し、ランダムで0.1刻みで0.1から0.5までの値を基礎ポイントに対し付加します。'(_N行目,_基礎ポイント,_付加された基礎ポイント2,_付加されたポインならび), '5人の学生の中で与えられたポイントの合計が最も少ない学生を回の代表値とします。'(_5人の与えられたポイントの合計ならび,_代表値,_n人目), 代表者の身長(LL,_N行目,_n人目,_代表者の身長), 一回分の表示(_N行目,_付加された基礎ポイント2,_付加されたポイントならび,_代表値,_代表者の身長), '同じN行目の5人の学生に対し5回行います。'(Ln,_N行目,_付加された基礎ポイント2,_付加された基礎ポイント,R3). 代表者の身長(LL,_N行目,_n人目,_代表者の身長) :- list_nth(_N行目,LL,L), list_nth(_n人目,L,_代表者の身長),!. 一回分の表示(_付加された基礎ポイント2,_付加されたポイントならび,_代表値,_代表者の身長) :- list_nth(_N行目,_付加されたポイント2,L), write_formatted('%t,%t,%t,%t,%t,',L), write_formatted('%t,%t,%t,%t,%t,',_付加されたポイントならび), write_formatted('%t,'[_代表値,_代表者の身長]),!. 'N行目の学生5人を取り出しそれぞれの学生に対し、ランダムで0.1刻みで0.1から0.5までの値を基礎ポイントに対し付加します。'(_,_,[],[],[]) :- !. 'N行目の学生5人を取り出しそれぞれの学生に対し、ランダムで0.1刻みで0.1から0.5までの値を基礎ポイントに対し付加します。'(_N行目,_N行目,[_N行目の学生の基礎ポイント|R1],[_付加された基礎ポイント|R2],[_付加する数ならび|R3]) :- findall(_付加する数,( _付加する数 is ((random mod 5) + 1) / 10)), _付加する数ならび), findall(_付加された数,( append(L01,[_学生の基礎ポイント|_],_N行目の学生の基礎ポイント), append(L02,[_付加する数|_],_付加する数ならび), length(L01,Len), length(L02,Len), _付加された数 is _付加する数 + _学生の基礎ポイント), _付加された基礎ポイント), N2 is _N行目 + 1, 'N行目の学生5人を取り出しそれぞれの学生に対し、ランダムで0.1刻みで0.1から0.5までの値を基礎ポイントに対し付加します。'(N2,_N行目,R1,R2,R3). 'N行目の学生5人を取り出しそれぞれの学生に対し、ランダムで0.1刻みで0.1から0.5までの値を基礎ポイントに対し付加します。'(N,_N行目,[L|R1],[L|R2],R3) :- N2 is N1 + 1, 'N行目の学生5人を取り出しそれぞれの学生に対し、ランダムで0.1刻みで0.1から0.5までの値を基礎ポイントに対し付加します。'(N2,_N行目,R1,R2,R3). /* '5人の学生の中で与えられたポイントの合計が最も少ない学生を回の代表値とします。'(_5人の与えられたポイントの合計ならび,_代表値,_n人目) :- min(_5人の与えられたポイントの合計ならび,_代表値), list_nth(_n人目,_5人の与えられたポイントの合計ならび,_代表値),!. '基礎ポイントに対しランダム値を付加し回の代表値を選出する作業'(_基礎ポイント1,_基礎ポイント2,_代表値) :- '1行目の学生5人を取り出しそれぞれの学生に対し、ランダムで0.1刻みで0.1から0.5までの値を基礎ポイントに対し付加します。'(_基礎ポイント1,_基礎ポイント2), '5人の学生の中で与えられたポイントの合計が最も少ない学生を回の代表値とします。'(_基礎ポイント2,_代表値). */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/918 # # [1] 授業単元:プログラミング # [2] 問題文: #   5*5の' 'と'#'の2文字から構成される二次元配列のtxtファイルを読み込み、 #    # '5*5の'' ''と''#''の2文字から構成される二次元配列のtxtファイルを読み込み、''#''を1,'' ''を0と表示させる'(_ファイル名) :- '5*5の" "と"#"の2文字から構成される二次元配列のtxtファイルを読み込み'(_ファイル名,LL), '"#"を1," "を0と表示させる'(LL). '''#''を1,'' ''を0と表示させる'(LL) :- append(_,[L|R],LL), append(_,[A|R1],L), '#か空白か'(N,A), write_formatted('%t ',[N]), R1 = [], write('\n'), R = [],!. '5*5の'' ''と''#''の2文字から構成される二次元配列のtxtファイルを読み込み'(_ファイル名,LL) :- open(_ファイ名,read,Instream), read(Instream,LL), close(Instream),!. '二次元配列textファイルの生成'(_ファイル名) :- lenth(LL,5), findall(L,( length(L,5), append(_,[A|R],L), Mod is random mod 2, '#か空白か'(Mod,A)), LL), open(_ファイル,write,Outstream), write_formatted(Outstream,'%q.\n',[LL]), close(Outstream),!. '#か空白か'(1,'#'). '#か空白か'(0,' '). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289816228/237 # # プログラム初心者です。 # 寺の門徒のデータベースを作って管理したいと考えています。 # # データの項目としては # 故人のデータ:法名、俗名、命日(年月日)、年齢、続柄、世帯主 # 世帯主のデータ:氏名、住所、電話番号 # お布施のデータ:世帯主、金額、年月日、種類(月参り、会費、法事・・・) # (どのようにまとめたらいいかはまだ考え中です) # # やりたいことは、 # 1.2011年の年回忌(1,3,7,13,17、・・・)のデータを抽出して世帯主宛に案内の文面を作る # 2.故人のデータ(命日)から中陰表(七日毎のお参りの日程表)を作る # 3.会計 # # 故人のデータや世帯主のデータはExcelで入力済ですが、 # そこから簡単に(数クリックで)1.2のようなことができないかと考えています。 # どのようなプログラムを使えばよいのでしょうか? # 寺名(大徳寺芳春院). '2014年の年回忌(1,3,7,13,17、・・・)のデータを抽出して世帯主宛に案内の文面を作る' :- '2014年の年回忌データの抽出'([1,3,7,13,17,23,27,33,50],_2014年の年回忌データならび), 回忌案内の作成(_2014年の年回忌データならび). '2014年の年回忌データの抽出'([],[]) :- !. '2014年の年回忌データの抽出'([_回忌|R1],[[_回忌,_年回忌データ]|R2]) :- '2014年の年回忌と命日の年変換'(_回忌,_命日の年), findall([_法名,_俗名,_命日,_年齢,_続柄,_世帯主,_住所,_電話番号],( 故人情報(_法名,_俗名,_命日,_年齢,_続柄,_世帯主,_住所,_電話番号)), _年回忌データ), '2014年の年回忌データの抽出'(R1,R2). '2014年の年回忌と命日の年変換'(1,2013) :- !. '2014年の年回忌と命日の年変換'(_回忌,_年) :- _年 is 2014 - _回忌 + 1,!. 故人情報(_法名,_俗名,_命日,_年齢,_続柄,_世帯主,_住所,_電話番号) :- 故人のデータ(_法名,_俗名,_命日,_年齢,_続柄,_世帯主), sub_atom(_命日,0,4,_,_命日の年), _世帯主=_氏名, 世帯主のデータ(_氏名,_住所,_電話番号). 回忌案内の作成([]) :- !. 回忌案内の作成([[_回忌|_回忌データならび]|R]) :- 回忌を指定して回忌案内の作成(_回忌,_回忌データならび), 回忌案内の作成(R). 回忌を指定して回忌案内の作成(_回忌,[_回忌データ|R]) :- 世帯主宛に案内の文面を作る(_回忌,_回忌データ), 回忌を指定して回忌案内の作成(_回忌,R). 世帯主宛に案内の文面を作る(1,[_法名,_俗名,_命日,_年齢,_続柄,_世帯主,_住所,_電話番号]) :- 寺名(_寺名), writef('一周忌法要のご案内\n%t様御中\n今年は故%t様(法名%t)の一周忌のご法要の年となりました。\n%tでは檀家の皆様が故人を偲び\n仏様と故人、そして皆様のめぐりあいの場として\n一周忌法要の準備を整えております。\nここにご案内申しあげます。\n',[_世帯主,_俗名,_法名,_寺名]),!. 世帯主宛に案内の文面を作る(_回忌,[_法名,_俗名,_命日,_年齢,_続柄,_世帯主,_住所,_電話番号]) :- 寺名(_寺名), 回忌の数字変換(_回忌,_回忌漢字表現), writef('%t回忌法要のご案内\n%t様御中\n今年は縁深き故%t様(法名%t)の%t回忌のご法要の年となりました。\n%tでは檀家の皆様が故人を偲び\n仏様と故人、そして皆様のめぐりあいの場として\n%t回忌法要の準備を整えております。\nここにご案内申しあげます。\n',[_回忌漢字表現,_世帯主,_俗名,_法名,_回忌漢字表現,_寺名,_回忌漢字表現]). 回忌の数字変換([1,3,7,13,17,23,27,33,50],[一,三,七,十三,十七,二十三,二十七,三十三,五十]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 故人のデータ(死死死死生生生生居士,尾崎隆大,'20111009',38,長男,尾崎作蔵). 世帯主のデータ(尾崎作蔵,'京都市右京区花園天授ケ岡888','075-444-9999'). /* '中陰表(七日毎のお参りの日程表)を作る'(_中陰逮夜,_故人の命日,_中陰逮夜日) :- 中陰逮夜(_中陰逮夜), 中陰逮夜(_中陰逮夜,_故人の命日,_中陰逮夜日). 中陰逮夜(初七日,_命日,_初七日) :- '5日後'(_命日,_初七日). 中陰逮夜(_初月忌,_命日,_中陰) :- '翌月の同日'(_命日,_中陰). 中陰逮夜(_満中陰,_命日,_中陰) :- 中陰逮夜(百箇日,_命日,_中陰) :- 中陰逮夜(_中陰,_命日,_中陰) :- sub_atom(_中陰,2,1,_,日), sub_atom(_中陰,0,2,_,_数字漢字表現), list_nth(Nth,[二十七,三十七,四十七,五十七,六十七],_数字漢字表現), list_nth(Nth,[27,37,47,57,67], N_1 is N - 1, 'n日後'(N_1,_命日,_中陰). 中陰逮夜(初七日). 中陰逮夜(二七日). 中陰逮夜(三七日). 中陰逮夜(四七日). 中陰逮夜(初月忌). 中陰逮夜(五七日). 中陰逮夜(六七日). 中陰逮夜(満中陰). 中陰逮夜(百箇日). */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/724 # # 2回以上続く改行だけ検索したいのですが、どうやっても1回のみの改行も検索してしまいます。 # \r\nを2回ってだけではだめなようで、解決策はありますか? # # '2回以上続く改行だけ検索したい'(_文字列,_検索語より前の文字列,_検索語,_検索語より後の文字列) :- atom_chars(_文字列,Chars), append(L0,['\n'|R],Chars), append(L1,R1,R), \+(R1=['\n'|_]), all(L1,'\n'), concat_atom(L0,_検索語より前の文字列), concat_atom(L1,_検索語), concat_atom(R1,_検索語より後の文字列). '2回以上続く改行だけ検索したい'(_文字列,_検索語より前の文字列,_検索語,_検索語より後の文字列) :- atom_chars(_文字列,Chars), append(L0,['\n'|R],Chars), append(L1,R1,R), \+(R1=['\n'|_]), all(L1,'\n'), concat_atom(L0,_), concat_atom(L1,_), concat_atom(R1,_検索語より後の文字列_1), '2回以上続く改行だけ検索したい'(_検索語より後の文字列_1,_検索語より前の文字列,_検索語,_検索語より後の文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2回以上続く改行だけ検索したい'(Lines,L0,[A|L1],R) :- append(L00,L1,R,Lines), all(L1,''), \+(R=[''|_]), append(L0,[A],L00). '2回以上続く改行だけ検索したい'(Lines,L0,L1,L2) :- append(L00_1,L1_1,R_1,Lines), all(L1_1,''), \+(R_1=[''|_]), append(L0_1,[Line],L00_1), '2回以上続く改行だけ検索したい'(R,L0,L1,L2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2回以上続く改行だけ検索したい'(Chars,L0,['\n','\n'],R) :- append(L0,L1,L2,Chars), \+(last(L0,'\n')), \+(list_nth(1,L2,'\n')). '2回以上続く改行だけ検索したい'(Chars,L0,L1,L2) :- append(L00,L11,L22,Chars), all(L11,'\n'), \+(last(L00,'\n')), \+(list_nth(1,L22,'\n')), '2回以上続く改行だけ検索したい'(L22,L0,L1,L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/753 # # ../test/read.cgi/db/1274791771/4のような状況で、 # よくある質問1 # # (問) # ID | DATE     | DATA # --+----------+----- # 1 | 2007-11-11 | aaa # 2 | 2007-11-11 | bbb # 1 | 2007-11-10 | ccc # 3 | 2007-11-12 | ddd # 3 | 2007-11-11 | eee # 4 | 2007-11-10 | fff # 1 | 2007-11-12 | ggg # # # 各IDごとにランダムで2件抽出して、そのDATEを # 現在の日時に更新するにはどうすればよいでしょうか? # 各IDごとにランダムで2件抽出して、そのDATEを現在の日時に更新する :- findsetof(_ID,'TableName'(_ID,_DATE,_DATA),_IDならび), append(_,[_ID|R],_IDならび), findall([_ID,_DATE,_DATA],( 'TableName'(_ID,_DATE,_DATA)), L1), length(L1,_要素数), ランダムに2件抽出して(_要素数,L1,L2), 現在の日時に更新する(L2), R = []. ランダムに2件抽出して(0,[],[]) :- !. ランダムに2件抽出して(1,LL,LL) :- !. ランダムに2件抽出して(_要素数,L1,[_1,_2]) :- Nth1 is (random mod _要素数) + 1, list_nth(Nth1,L1,_1), repeat, Nth2 is (random mod _要素数) + 1, \+(Nth1 = Nth2), list_nth(Nth2,L1,_2),!. 現在の日時に更新する([[_ID,_DATE,_DATA]|R1]) :- 現在の日時(_現在の日時), findall([_ID,_DATE2,_DATA2], retract('TableName'(_ID,_DATE2,_DATA2)), L1), 現在の日時に更新する(_現在の日時,[[_ID,_DATE,_DATA]|R1],L1). 現在の日時に更新する(_現在の日時,[],[]) :- !. 現在の日時に更新する(_現在の日時,[],L) :- append(_,[[_ID,_DATE,_DATA]|R],L), assertz('TableName'(_ID,_DATE,_DATA)), R = [],!. 現在の日時に更新する(_現在の日時,[[_ID,_DATE,_DATA]|R1],[[_ID,_DATE,_DATA]|R2]) :- assertz('TableName'(_ID,_現在の日時,_DATA)), 現在の日時に更新する(_現在の日時,R1,R2),!. 現在の日時に更新する(_現在の日時,[[_ID,_DATE,_DATA]|R1],[[_ID,_DATE2,_DATA1]|R2]) :- assertz('TableName'(_ID,_DATE2,_DATA2)), 現在の日時に更新する(_現在の日時,[[_ID,_DATE,_DATA]|R1],R2),!. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/471 # # 【質問テンプレ】 # ・DBMS名とバージョン: SQLite 3 # ・テーブルデータ:長いため下記に記載 # ・欲しい結果:RSSリーダ(brief)のデータ(*.sqlite)から特定の記事データを削除したいです。 # ・説明:長いため下記に記載 # # ●テーブルデータ # ======================================================================================================================= # ■entries #  | id | feedID | primaryHash | secondaryHash | providerID | entryURL | date | read | updated | starred | deleted | bookmarkID | # ----------------------------------------------------------------------------------------------------------------------- # ■entries_text #  | title | content | authors | tags | # ----------------------------------------------------------------------------------------------------------------------- # ■entries_text_content #  | docid | c0title | c1content | c2authors | c3tags | # ----------------------------------------------------------------------------------------------------------------------- # ■sqlite_sequence #  | name | seq | # ======================================================================================================================= # # 1.【entries】テーブルの[deleted]フィールドが「 2 」の場合に、そのレコードを削除。 # # 2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した #   [id]フィールドと同じ値のレコードも削除。 # # 3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と #   同じレコード番号のレコードを削除。 ※idフィールドがない為 # # 4.その後、下記のフィールドの値を、1・2・3〜とリナンバリングしたい。 #   【entries】テーブルの[id]フィールド #   【entries_text_content】テーブルの[docid]フィールド # # 5.そして、1.2.3.の三つのテーブルのレコード数がどれも同じ数だけあるか確認。 # # 6.最後に、【sqlite_sequence】テーブルの[seq]フィールドに5.で確認したレコード数を #   設定したい。 # # お手数ですが、以上よろしくお願いします。 # # '1.【entries】テーブルの[deleted]フィールドが「 2 」の場合に、そのレコードを削除' :- findsetof(_id,( entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)), _deleted = '2'), L1), retract_all(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,'2',_bookmarkID)), findsetof(_docid,( member(_id,L1), entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags)), _docid = _id), L2), '2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した[id]フィールドと同じ値のレコードも削除。'(L2), '3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(L1),!. '2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した[id]フィールドと同じ値のレコードも削除。'(L2) :- member(_docid,L2), retract_all(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags)),!. '3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(L1) :- append(_,[Nth|R],L1), 節の定義位置指定による節の削除(L2,Nth), R = [],!. '3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(_). 節の定義位置指定による節の削除(L2,Nth) :- findall((Head :- Body),( clause(entries_text(_title,_content,_authors,_tags),Head,Body)), L2), list_nth(Nth,L2,P), retract(P),!. '4.その後、下記のフィールドの値を、1・2・3〜とリナンバリングしたい。 【entries】テーブルの[id]フィールド 【entries_text_content】テーブルの[docid]フィールド' :- findall(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID),( retract(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID))), L1), append(L01,[entries(_,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)|R1],L1), length([_|L0],Nth1), assertz(entries(Nth1,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)), R1 = [], findall(entries_text_contents(_,_c0title,_c1content,_c2authors,_c3tags),( retract(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags))), L2), append(L02,[entries_text_contents(_,_c0title,_c1content,_c2authors,_c3tags)|R2],L2), length([_|L02],Nth2), assertz(entries_text_contents(Nth2,_c0title,_c1content,_c2authors,_c3tags)), R2 = [],!. '5.そして、1.2.3.の三つのテーブルのレコード数がどれも同じ数だけあるか確認。'(Count) :- count(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID),Count), count(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags),Count), count(entries_text(_title,_content,_authors,_tags),Count). '6.最後に、【sqlite_sequence】テーブルの[seq]フィールドに5.で確認したレコード数を設定したい。'(Count) :- retract(sqlite_sequence(_name,_seq)), assertz(sqlite_sequence(_name,Count),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/524 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 問題2 8個の整数を格納する配列 cc を宣言し、宣言時に{ 1, 2, 3, 4, 5, 6, 7, 8 } で初期化しなさい。 # # また、これを同じサイズの配列 dd にfor 文を使って逆順にコピーしなさい。 # 最後に、ccとdd の内容を for 文を使って表示しなさい。 # <実行例> # cc[0] = 1 dd[0] = 8 # cc[1] = 2 dd[1] = 7 '8個の整数を格納する配列 cc を宣言し、宣言時に{ 1, 2, 3, 4, 5, 6, 7, 8 } で初期化しなさい。' :- assertz(cc([1,2,3,4,5,6,7,8])). 'これを同じサイズの配列 dd にfor 文を使って逆順にコピーしなさい。' :- length(_dd,8), cc(_cc), findall(_要素,( for(8,N,1), list_nth(N,_cc,_要素)), _dd), assertz(dd(_dd)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/696 # # 初歩的な質問ですみません。どうしても動かないので腹が立って質問します。 # 取引先テーブルから会社名の最後に株式会社とつく会社を抜き出すときはこれでいいんですよね。どうしても動きません。 # 使ってるソフトはhsqldbです # # SELECT 会社名 # FROM 取引先テーブル # WHERE 会社名 LIKE '%株式会社' # # 取引先テーブルから会社名の最後に株式会社とつく会社を抜き出す(_会社名) :- findall(_,テーブル定義(取引先テーブル,_,_),L), テーブル定義(取引先テーブル,Nth,会社名), P =.. [取引先テーブル|L], call(P), list_nth(Nth,L,_会社名), sub_atom(_会社名,_,4,0,'株式会社'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/604 # # 【 課題 】label5 に,もう一つのlabel を追加し,新しいラベルに # 正解数(累積で計算),および正解率(累積で計算) # をするように改造してみよう. # 【 形態 】1. Javaアプリケーション # 【 GUI  】1. AWTのみ # 【 期限 】明日午前中 # 【 Ver  】java version "1.5.0_09" # 【 補足 】正解数と正解率のlabelは作ってあります。 # ソースです # http://ime.nu/www.dotup.org/uploda/www.dotup.org1278921.zip.html # # eclipseを使って作っているのですが、 # わからないので急ですがよろしくお願いします。 # 問(1,'17+25=?',[37,43,47],3). 問(2,日本の都道府県の数は?,[37,43,47],3). 問(3,日本一大きな湖があるのは?,[千葉,滋賀,佐賀],2). すべての問題に解答して問題数、正解数、正解率を得る(_問題数,_正解数,_正解率) :- findcount(問(_,_,_),_問題数), findcount(( for(1,_問題番号,_問題数), 問題に答える(_問題番号,_問題文,_選択文ならび,_正解,_解答), 解答診断(_選択文ならび,_正解,_解答,正解)), _正解数), _正解率 is _正解数 / _問題率 * 100,!. 問題に答える(_問題番号,_問題文,_選択文ならび,_正解,_解答) :- 問(_問題番号,_問題文,_選択文ならび,_正解), write_formatted('問題 %t \n'), 解答番号を選択する(_選択文ならび,_解答). 解答番号を選択する(_選択文ならび,_解答) :- 選択文表示([_],_選択文ならび), write('答えは? '), get_Line(Line), 解答番号を選択診断(Line,_解答),!. 解答番号を選択する(_選択文ならび,_解答) :- 解答番号を選択する(_選択文ならび,_解答). 解答番号を選択診断(Line,_解答) :- atom_to_term(Line,_解答,_), integer(_解答),!, 解答番号の範囲診断(Line,_解答). 解答番号を選択診断(Line,_解答) :- write_formatted('入力された %t は整数ではありません。再入力をお願いします。\n',[Line]), fail. 解答番号の範囲診断(_解答) :- _解答 >= 1, _解答 =< 3,!. 解答番号の範囲診断(_解答) :- write_formatted('入力された解答%tは選択番号にありません。再入力が必要です。\n',[_解答]), fail. 選択文表示(Ln,[]) :- !. 選択文表示(Ln,[_文|R]) :- length(Ln,N), write_formatted('%t .. %t\n',[N,_文]), 選択文表示([_|Ln],R). 解答診断(_選択文ならび,_正解,_正解,正解) :- write('正解です!!!\n'),!. 解答診断(_選択文ならび,_正解,_解答,不正解) :- \+(_正解=_解答), list_nth(_正解,_選択文ならび,_正解文), write_formatted('不正解です!!! 正解は %t..%t でした。\n',[_正解,_正解文]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/480 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): 配列の中の値をランダムで選択し、表示。また、ランダムでも、大きな値の方が選択されやすくして表示。配列の値={2,2,4,5,5,8,9,10,2,3} # ならびの値をランダムに選択し、表示(_ならび) :- length(_ならび,_長さ), R is random // _長さ + 1, list_nth(R,_ならび,A), write_formatted('%t\n',[A]). ならびの値をランダムに選択し、表示(_ならび) :- ならびの値をランダムに選択し、表示(_ならび). ならびの値を大きい値ほど選択されやすくしてランダムに選択し、表示(_ならび) :- length(_ならび,_長さ), R1 is random // _長さ + 1, list_nth(R1,_ならび,A), 'Aと等しいか大きい値がでるまで'(_ならび,_長さ,A,B), write_formatted('%t\n',[B]). ならびの値を大きい値ほど選択されやすくしてランダムに選択し、表示(_ならび) :- ならびの値を大きい値ほど選択されやすくしてランダムに選択し、表示(_ならび). 'Aと等しいか大きい値がでるまで'(_ならび,_長さ,A,B) :- R is random // _長さ + 1, list_nth(R,_ならび,B), B >= A,!. 'Aと等しいか大きい値がでるまで'(_ならび,_長さ,A,B) :- 'Aと等しいか大きい値がでるまで'(_ならび,_長さ,A,B). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/391 # # 関数A内で変数Bが一定以上の数値であるかどうかを判断(変数にはfor文で次々と値が代入されていく)し、以上なら1、以下なら0が結果として帰ってくるようにした後 # main関数内で何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込むプログラムを組んでもらえませんか? # # 何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込む(_csvファイル,_開始点,_終了点,_B,_閾値) :- tell(_csvファイル), 何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込む(_開始点,_終了点,_B,_閾値), 何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込む(_,_,_,_,_) :- told. 何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込む(_開始点,_終了点,_B,_閾値) :- var(_終了点), length(_B,_終了点), forもどきA(_開始点,N,_終了点,_B,_閾値,_A), write_formatted('%t,%t\n',[N,_A]), N = _終了点. 何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込む(_開始点,_終了点,_B,_閾値) :- \+(var(_終了点)), forもどきA(_開始点,N,_終了点,_B,_閾値,_A), write_formatted('%t,%t\n',[N,_A]), N = _終了点. forもどきA(Start,N,Max,_B,_閾値,_A) :- for(Start,N,Max), list_nth(N,_B,M), forもどきA診断(M,_閾値,_A). forもどきA診断(M,_閾値,1) :- M >= _閾値. forもどきA診断(M,_閾値,0) :- M < _閾値. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/3 # # [1] 授業単元:C言語入門 # # [2] 問題文):最大24個の整数が格納できる配列を用意する。 # この配列の先頭から10個分には1を代入し, # つづく6個分には0を入れ,最後の8個分には-1を入れよ。 # # '最大24個の整数が格納できる配列を用意する。この配列の先頭から10個分には1を代入し,つづく6個分には0を入れ,最後の8個分には-1を入れよ。'(L) :- 最大24個の整数が格納できる配列を用意する(L), この配列の先頭から10個分には1を代入し(L,R1), つづく6個分には0を入れ(R1,R2), '最後の8個分には-1を入れよ'(R2). 最大24個の整数が格納できる配列を用意する(L) :- length(L,24). この配列の先頭から10個分には1を代入し(L,R) :- length(L1,10), all(L1,1), append(L1,R,L). つづく6個分には0を入れ(L,R) :- length(L1,6), all(L1,0), append(L1,R,L). '最後の8個分には-1を入れよ'(L) :- length(L,8), all(L,-1). ?- ti. no. ?- keizo104 :: pwd(X). ?- w3db(keizo104,7083,true). yes. ?- !'ls -l *.html | grep "2010-10-31"'. -rw-r--r-- 1 root root 745 2010-10-31 17:15 c141_966.html -rw-r--r-- 1 root root 1057 2010-10-31 20:54 c141_971.html -rw-r--r-- 1 root root 592 2010-10-31 22:42 c141_983.html yes. ?- cat c141_966.html. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/966 # # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): # http://ime.nu/img69.imageshack.us/img69/1731/65183447.jpg # (b)、(d)の回答をよろしくお願いします。 # # 1 dを入力し、(n+1)^2 - n^2 =< d なる最小のnを出力するプログラムを #  while 文を使って作りたい。nは整数、 dは実数とせよ。以下の問に答えよ。 # # (a) このプログラムに必要な変数を述べよ。 # (b) (n + 1)^2 - n^2 =< d を判定するC言語の条件式を書け。 # (c) 処理の手順を番号付き箇条書、または、フローチャートで示せ。 # (d) プログラムを書け。 yes. ?- cat c141_971.html. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/971 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # # *記号を使ってでsin曲線を描け。 # '*記号を使ってsin曲線を描け。' :- '*記号を使ってでsin曲線を描け。'(1,LL), 転置(LL,LL2), append(_,[L|R],LL2), concat_atom(L,A), write_formatted('%t\n',[A]), R = []. '*記号を使ってsin曲線'(X,[]) :- X > 629,!. '*記号を使ってsin曲線'(X,[L|R]) :- length(L0,101), Y is truncate((100 * sin((X-1) * pi / 100))+101), list_nth(Y,L0,'*'), reverse(L0,L1), 全ての変数を空白に(L0), X2 is X + 1, '*記号を使ってsin曲線'(X2,R). 全ての変数を空白に([]) :- !. 全ての変数を空白に([V|R]) :- var(V), V = ' ', 全ての変数を空白に(R),!. 全ての変数を空白に([_|R]) :- 全ての変数を空白に(R),!. ?- nojiri('c141_971.html'). yes. ?- ti. ?- !'ls -l *.html | grep "2010-10-30"'. -rw-r--r-- 1 root root 3258 2010-10-30 03:06 c141_863.html -rw-r--r-- 1 root root 2471 2010-10-30 17:27 c141_863_1.html -rw-r--r-- 1 root root 3771 2010-10-30 09:07 c141_863_2.html -rw-r--r-- 1 root root 561 2010-10-30 23:28 c141_948.html yes. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/948 # # [1] 授業単元:プログラムとアルゴリズム # [2] 問題文(含コード&リンク):整数配列aとその長さnを渡して、配列のそれぞれの要素を10倍して戻す関数Funcを作成し、必要な追加を行って動作を確認しなさい。 # 下敷きとするソースコードは以下のURL(jpgで見にくくてすみません)でお願いします。 # http://ime.nu/pc.gban.jp/?p=24057.jpg # 'リストa、長さnを渡して、n要素だけ10倍して戻す'(_a,_n,X) :- length(L,_n), append(L,R,_a), '10倍して戻す'(L,L10), append(L10,R,X). '10倍して戻す'(L,L10) :- findall(N2,( append(_,[N|_],L), N2 is N * 10), L10). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'リストa、長さnを渡して、n要素だけ10倍して戻す'(_a,_n) :- length(L,_n), '10倍して戻す'(L,_a,X), '10倍して戻す'([],X,X) :- !. '10倍して戻す'([_|R1],[N|R2],[N2|R3]) :- N2 is N * 10, '10倍して戻す'(R1,R2,R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'リストa、要素位置m、長さnを渡して、最初からm要素目からn要素だけ10倍して戻す'(_a,_m,X) :- length(L,_n), _m_1 is _m - 1, length(L1,_m_1), append(L1,R,_a), '10倍して戻す'(L,R,L2), append(L1,L2,X). '10倍して戻す'([],X,X) :- !. '10倍して戻す'([_|R1],[N|R2],[N2|R3]) :- N2 is N * 10, '10倍して戻す'(R1,R2,R3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/971 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # # *記号を使ってでsin曲線を描け。 # '*記号を使ってsin曲線を描け。' :- '*記号を使ってでsin曲線を描け。'(1,LL), 転置(LL,LL2), append(_,[L|R],LL2), concat_atom(L,A), write_formatted('%t\n',[A]), R = []. '*記号を使ってsin曲線'(X,[]) :- X > 629,!. '*記号を使ってsin曲線'(X,[L|R]) :- length(L0,101), Y is truncate((100 * sin((X-1) * pi / 100))+101), list_nth(Y,L0,'*'), reverse(L0,L1), 全ての変数を空白に(L0), X2 is X + 1, '*記号を使ってsin曲線'(X2,R). 全ての変数を空白に([]) :- !. 全ての変数を空白に([V|R]) :- var(V), V = ' ', 全ての変数を空白に(R),!. 全ての変数を空白に([_|R]) :- 全ての変数を空白に(R),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1272006124/140 # # <問題> # A,B,Cの3人が100m競争をします。D,Eの2人が予想をしました。 # D : 「きっと1等はCで2等はBだ」 # E : 「ぼくは1等はAだと思う」 #  発表された順位を見て,2人はどちらも「まったくはずれた。」と # いいました。発表された順位はどうでしたか。 # # 中学受験用全解シリーズ 「受験全解・算数」日能研発行 の p424 から採りました。 # # 'A,B,Cの3人が100m競争をします。D,Eの2人が予想をしました。 D : 「きっと1等はCで2等はBだ」。 E : 「ぼくは1等はAだと思う」。 発表された順位を見て,2人はどちらも「まったくはずれた。」といいました。発表された順位はどうでしたか。' :- 発表された順位(L), write_formatted('発表された順位は 1等%t, 2等 %t, 3等 %t, です。\n',L). 発表された順位(L) :- 順列(['A','B','C'],3,L), '2人はどちらも「まったくはずれた。」'(L). '2人はどちらも「まったくはずれた。」'(L) :- \+('Dの予想'(L)), \+('Eの予想'(L)). 'Dの予想'(L) :- きっと1等はCで2等はBだ(L). きっと1等はCで2等はBだ(L) :- list_nth(1,L,'C'), list_nth(2,L,'B'). 'Eの予想'(L) :- ぼくは1等はAだと思う(L). ぼくは1等はAだと思う(L) :- list_nth(1,L,'A'). ぼくは1等はAだと思う(L) :- list_nth(Nth1,L,'A'), list_nth(Nth2,L,'B'), Nth1 < Nth2. ぼくは1等はAだと思う(L) :- list_nth(Nth1,L,'A'), list_nth(Nth3,L,'C'), Nth1 < Nth3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 順列(Y,0,_,[]). 順列(Y,N,EL,[A|X]) :- \+(member(A,EL)), del(Z = Y - A), M is N - 1, 順列(Z,M,EL,X). 順列(Y,N,EL,[_|X]) :- member(A,EL), 順列(Z,M,EL,X). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- del(Z = Y - A), M is N - 1, 順列(Z,M,X). del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). del(X = [A|X] - A). del([B|Y] = [B|X] - A) :- del(Y = X - A). member(A,[A|_]). member(A,[_|R]) :- member(A,R). % 以下のサイトは 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R3]) :- N > 1, M is N - 1, 組合せ(R1,M,R3). 組合せ([_|R1],N,L) :- N > 1, 組合せ(R1,N,L). 単位節組合せ(_述語名/_アリティ,_選択項位置リスト,_組合せ数,X) :- length(_引数ならび,_アリティ), P =.. [_述語名|_引数ならび], findall(U,( call(P), 項の選択(_選択項位置リスト,_引数ならび,U)), L2), 組合せ(L2,_組合せ数,X). 項の選択([],_引数ならび,[]). 項の選択([_nth1|R1],_引数ならび,[X|R3]). nth1(_nth1,_引数ならび,X), 項の選択(R1,_引数ならび,R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R2]) :- 'Nを1減らして残り要素の組合せ'(R1,N,R2). 組合せ([_|R1],N,R2) :- 'Nはそのままで残り要素の組合せ'(R1,N,R2). 'Nを1減らして残り要素の組合せ'(R1,N,R2) :- N > 1, succ(N_1,N), 組合せ(R1,N_1,R2). 'Nはそのままで残り要素の組合せ'(R1,N,R2) :- N > 1, 組合せ(R1,N,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/455 # # [1]授業単元 情報処理 # [2]問題文 大きさを入力して、半角文字*を使い、Xを描く。大きさは # Xの縦と横の半角文字数である。 # [3]環境 # [3-1]os: windows7 # [3-2]コンパイラ名とバージョン:visualstdio2008 # [3-3]C言語 # [4]期限 2010/10/22 # [5]繰り返し文までしか習っていません。 # if文とfor文で書くこととのことです。おねがいいたします。さっぱりわかりません。 # '大きさを入力して、半角文字*を使い、Xを描く。大きさはXの縦と横の半角文字数である。' :- '3以上の奇数を得る'(_大きさ), for(1,N,_大きさ), 一行描く(N,_大きさ), N = _大きさ. '3以上の奇数を得る'(_大きさ) :- write('大きさを3以上の奇数で入力してください : '), get_line(Line), 診断(Line,_大きさ),!. '3以上の奇数を得る'(_大きさ) :- '3以上の奇数を得る'(_大きさ). 診断(Line,_大きさ) :- atom_to_term(Line,_大きさ,_), integer(_大きさ), 大きさ>=3, 奇数(_大きさ),!. 診断(Line,_大きさ) :- write_formatted('入力された %t からは3以上の奇数は得られませんでした。再入力をお願いします。\n'), fail. 一行描く(N,_大きさ) :- 一行分の枠を作る(_大きさ,L), M is _大きさ - N + 1, list_nth(N,L,'*'), list_nth(M,L,'*'), 変数をスペースで埋める(L), concat_atom(L,S), write_formatted('%t\n',[S]),!. 一行分の枠を作る(_大きさ,L) :- length(L,_大きさ). 変数をスペースで埋める([]) :- !. 変数をスペースで埋める([V|R]) :- var(V), V = ' ', 変数をスペースで埋める(R),!. 変数をスペースで埋める([A|R]) :- \+(var(V)), 変数をスペースで埋める(R),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/412 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク):空欄を埋てください。 # 問題はユーザーから入力された100個の点の座標について、最も近い二点間距離を表示するプログラムを作る。 # # #include<stdio.h> # #include<math.h> # #define NUM 100 # typedef struct { double x, y; } COODINATE; # double dist(COODINATE, COODINATE); # void main(void) # { int i, j; # COODINATE p[NUM]; # double min; # for (i = 0; i < NUM; i++) # scanf("%lf %lf",&p[i].x, &p[i].y); # # 空欄 # # printf("Shotest distance = %lf\n", min); # } # double dist(COODINATE p0, COODINATE p1) # {return(sqrt((p0.x - p1.x) * (p0.x - p1.x) + # (p0.y - p1.y) * (p0.y - p1.y))); # } # #  [3.1] OS: windows コンパイラ名とバージョン: bcc32 言語: C # [4] 期限:今週中 # # お願いします。 # # ユーザーから入力された100個の点の座標について、最も近い二点間距離を表示する :- '100個の点をランダムに生成する'([],_100個の点の座標ならび), ユーザーから入力された100個の点の座標について、最も近い二点間距離を表示する(_100個の点の座標ならび). ユーザーから入力された100個の点の座標について、最も近い二点間距離を表示する(_100個の点の座標ならび) :- findall(N,for(1,N,100),L1), findmin(_距離,( 組み合わせ(L1,2,[Nth1,Nth2]), list_nth(Nth1,_100個の点の座標ならび,[X1,Y1]), list_nth(Nth2,_100個の点の座標ならび,[X2,Y2]), _距離 is sqrt((X2-X1)^2+(Y2-Y1)^2)), _最も近い二点間距離), write_formatted('最も近い二点間距離は %t です\n',[_最も近い二点間距離]). '100個の点をランダムに生成する'(L,L) :- length(L,100),!. '100個の点をランダムに生成する'(L1,L) :- X is random mod 300, Y is random mod 300, \+(append(_,[[X,Y]|_],L1)), '100個の点をランダムに生成する'([[X,Y]|L1],L),!. '100個の点をランダムに生成する'(L1,L) :- '100個の点をランダムに生成する'(L1,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1274998754/650 # # すみません、プログラミング初心者で行き詰まってしまい質問をさせて頂きます。 # # 4×4の行列を考え、int y[i][j]とそれに対応する文字Xijを考えます。(例えばy[2][3]にはx23という文字が対応) # 今、y[i][j]には0または1の数字が割り当てられています。(つまり0、1の4×4行列が予め与えられている状況) # このうち、1の数字が割り当てられているyに対応するxの和だけを表示するようなプログラミングを作成したいのです。 # 例)y[1][3]=1,y[1][4]=1,y[2][4]=1,y[3][1]=0,y[3][2]=0の場合、 # x13+x14+x24 # # 手元の参考書やネット検索など、いろいろ試みたのですが、どうしても解決できず、質問させていただきました。 # 分かりにくい説明、長文失礼致しました。何卒よろしくお願いします。 # '1の数字が割り当てられているyに対応するxの和だけを表示する'(_行列,_1の数字の割り当てられているxの和) :- length(_行列,Len1), _行列=[L0|_], length(L0,Len2), findsum(X,( for(1,M,Len1), for(1,N,Len2), list_nth(M,_行列,L), list_nth(N,L,1), X is 16 * M + N), _1の数字の割り当てられているxの和). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/277 # # [1] 授業単元: プログラム # [2] 問題文(含コード&リンク):テキストからデータを読み込んでユークリッド距離を求めるプログラムをお願いします。また、データを増やす事と最大距離と最小距離を求めてください。三次元なので、n=3とします。 # 'テキストからデータを読み込んでユークリッド距離を求めるプログラムをお願いします。また、データを増やす事と最大距離と最小距離を求めてください。三次元なので、n=3とします。'(_二点と距離ならび,_最大距離,_最小距離) :- データの読み込み(L), 組み合わせ位置番号ならびの生成(L,_位置番号ならび), findall([(x1,x2,x3),(y1,y2,y3),_距離],( 組み合わせ(_位置番号ならび,2,[Nth1,Nth2]), list_nth(Nth1,L,[X1,X2,X3]), list_nth(Nth2,L,[Y1,Y2,Y3]), _距離 is sqrt((X1-Y1)^2 + (X2-Y2)^2 + (X3-Y3)^2))), _二点と距離ならび), 最大値・最小値の取得(_二点と距離ならび,_最大値,_最小値). データの読み込み(L) :- write('データ(x1,x2,x3を)カンマ区切りで入力してください。(終了は空行で) : '), get_line(Line), データの読み込み(Line,L). データの読み込み('',[]) :- !. データの読み込み(Line,[[X1,X2,X3]|R]) :- split(Line,[',',' '],[X1,X2,X3]), get_line(Line2), データの読み込み(Line2,R). 組み合わせ位置番号ならびの生成(L,_位置番号ならび) :- length(L,Length), findall(N,for(1,N,Length),_位置番号ならび). 最大値・最小値の取得(_二点と距離ならび,_最大値,_最小値) :- 距離を分離(_二点と距離ならび,_距離ならび), max(_距離ならび,_最大距離), min(_距離ならび,_最小距離). 距離を分離([],[]) :- !. 距離を分離([[_,_,_距離]|R1],[_距離|R2]) :- 距離を分離(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/490 # # SQLite3を使用しています。 # select distinct(hoge) # でhogeのユニークな値一覧が取得できますが、 # この結果の数を得る方法はないでしょうか? # # よろしくお願いします。 # # hogeのユニークな値のカウント(_テーブル,_解の数) :- hogeのユニークな値一覧を取得する(_テーブル,_値一覧), length(_値一覧,_解の数). hogeのユニークな値一覧を取得する(_テーブル,_値一覧) :- atom(_テーブル), テーブル構造(_テーブル/N,Nth,hoge), length(L,N), P =.. [_テーブル|L]), finsetof(X,( call(P), list_nth(Nth,L,X)), _値一覧),!. hogeのユニークな値一覧を取得する(_テーブル/N,_値一覧) :- テーブル構造(_テーブル/N,Nth,hoge), length(L,N), P =.. [_テーブル|L]), finsetof(X,( call(P), list_nth(Nth,L,X)), _値一覧),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1272006124/113 # # リストのある要素を検索して、そのm要素前の値を取り出しなさい。 # リストのある要素を検索して、そのm要素前の値を取り出す(_対象リスト,_検索要素,_m要素前,_値) :-     append(L0,[_検索要素|_],_対象リスト), length(L2,_m要素前), L2 = [_値|_], append(_,L2,L0). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% リストのある要素を検索して、そのm要素前の値を取り出す(_対象リスト,_検索要素,_m要素前,_値) :-     append(L0,[_検索要素|_],_対象リスト),     last_nth(_m要素前,L0,_値). % *** user: last_nth / 3 *** last_nth(Nth,L,X) :- last_n(Nth,L,L2), L2 = [X|_],!. % *** user: last_n / 3 *** last_n(N,L,LX) :- integer(N), length(LX,N), append(L0,LX,L). last_n(N,L,LX) :- var(N), append(L0,LX,L), length(LX,N). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1272006124/113 # # リストのある要素を検索して、そのn要素後の値を取り出しなさい。 # リストのある要素を検索して、そのn要素後の値を取り出す(_対象リスト,_検索要素,_n要素後,_値) :-     append(_,[_検索要素|R],_対象リスト),     list_nth(_n要素後,R,_値). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/534 # # [1] 授業単元: 基礎プログラミング # [2] 問題文(含コード&リンク): 1×8の配列のうち、3番目だけに1を入れて、その他を0にするプログラムを作る。 # '1×8の配列のうち、3番目だけに1を入れて、その他を0にする'(_配列) :- lenth(_配列,8), list_nth(3,_配列,[1]), ならび全ての変数と特定値を単一化(_配列,[0]). ならびの全ての変数と特定値を単一化([],_) :- !. ならびの全ての変数と特定値を単一化([_値|R],_値) :- ならびの全ての変数と特定値を単一化(R,_値),!. ならびの全ての変数と特定値を単一化([A|R],_値) :- ならびの全ての変数と特定値を単一化(R,_値),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/463 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # (問題1)合計演算する関数Goukeiを作成せよ。ただし、引数として、配列とその個数および演算結果をとるものとする。 # (問題2)Goukeiを用いて平均値を求める関数Heikinを作成せよ。ただし、引数として配列とその個数および演算結果をとるものとする。 # (問題3)関数Heikinを用いて、main関数を作成せよ。ただし、身長のデータ数Nは、キーボードより入力されるとし、配列を動的に確保せよ。また、身長データは、キーボードより入力されるものとする。 # % リスト処理とせず、配列を L として抽象化してみた。 'Goukei'(L,Length,_合計) :- 'Goukei'(L,1,Length,0,_合計). 'Goukei'(L,N,Length,_合計,_合計) :- N > Length,!. 'Goukei'(L,N1,Length,_合計1,_合計) :- 要素番号から要素を決定する(N1,L,_値), _合計2 is _合計1 + _値, 'Goukei'(L,N,Length,_合計2,_合計). 'Heikin'(L,Length,_平均) :- 'Goukei'(L,1,Length,0,_合計), _平均 is _合計 / Length. main :- n人分の身長データを得る(L,_n人分), 機能選択(L,_n人分). n人分の身長データを得る(L,_n人分) :- 最初に人数を入力する(_n人分), length(L,_n人分), n人分身長を入力する(L,1,_n人分). 最初に人数を入力する(_n人分) :- get_integer(_n人分),!. n人分身長を入力する(L,1,_n人分) :- N > _n人分,!. n人分身長を入力する(L,N1,_n人分) :- get_integer(_身長), list_nth(N1,L,_身長), N2 is N1 + 1, n人分身長を入力する(L,N2,_n人分). 機能選択(L,_n人分) :- write('機能番号を選択してください : '\n1: 合計\n2: 平均\n'), get_integer(N), 機能選択診断(N,L,_n人分). 機能選択(L,_n人分) :- write_formatted('選択した機能番号は1または2ではありません\n'), 機能選択(L,_n人分). 機能選択診断(1,L,_n人分) :- 'Goukei'(L,_n人分,_合計), write_formatted('入力されたデータの合計は %t です\n',[_合計]),!. 機能選択診断(2,L,_n人分) :- 'Heikin'(L,_n人分,_平均), write_formatted('入力されたデータの平均は %t です\n',[_平均]),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 要素番号から要素を決定する(_要素番号,L,_要素) :- list_nth(_要素番号,L,_要素). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/477 # # [1] 授業単元: プログラム # [2] 問題文(含コード&リンク): an=a[n-1]+a[n-2]で、nを与えた時a[n]を求める。Σ[n-2,i=1]aiとanの比較をせよ。Σ[n-1,i=1]ai^2とa[n-1]*anの比較をせよ # 'a[n]=a[n-1]+a[n-2]で、nを与えた時a[n]を求める'(_n,L,X) :- list_nth(_n,L,N,L0,Y,L1), last_n(2,L0,[N1,N2]), X is N1 + N2. 'Σ[n-2,i=1]aiとanの比較'(_n,L,X,S) :- 'a[n]=a[n-1]+a[n-2]で、nを与えた時a[n]を求める'(_n,L,X), N1 is N - 2, findsum(Y,(for(1,_i,N1),list_nth(_i,L,Y)),S1), S is truncate(S1). 'Σ[n-1,i=1]ai^2とa[n-1]*anの比較'(_n,L,X,Y) :- N1 is _n - 1, findsum(Y2,(for(1,_i,N1),list_nth(_i,L,Y),Y2 is Y ^ 2),S1), X is truncate(S1), list_nth(_n,L0,[Z|_],L), last(L0,A), Y is truncate(Z * A). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1280653311/72 # # C言語の問題なのですが # # 4ケタの番号,名前,名前(フリガナ),都道府県,住所,電話番号 # # といった300人分の名簿データみたいなcsvファイルがあり # それをで4ケタの番号どうりに単純ソートで昇順に表示して # 番号を入力すると2分探索で探索を開始し # 正しい番号を入力すると電話番号を、不正な番号を入力すると # エラー表示が出るプログラムを作成したいのですがわからず困ってます # どなたかよろしくお願いします # (malloc関数は使わずにとの事です) # # '4ケタの番号,名前,名前(フリガナ),都道府県,住所,電話番号といった300人分のcsvファイルがあり、番号を入力すると2分探索で探索を開始し正しい番号を入力すると電話番号を不正な番号を入力するとエラー表示する'(_csvファイル) :- write('検索する4ケタの番号を入力してください : '), get_integer(N), get_split_lines(_csvファイル,[','],L1), '4ケタの番号どうりに単純ソートで昇順にならべる'(L1,L2), lenth(L2,Len), M is Len // 2, list_nth(M,L2,L), 2分探索で探索(1,M,Len,L2,N,L,X), write_formatted('%t,%t,%t,%t,%t,%t\n',X). '4ケタの番号,名前,名前(フリガナ),都道府県,住所,電話番号といった300人分のcsvファイルがあり、それを4ケタの番号どうりに単純ソートで昇順に表示'(_csvファイル) :- get_split_lines(_csvファイル,L1), '4ケタの番号どうりに単純ソートで昇順にならべる'(L1,L2), '4ケタの番号どうりに表示'(L2). '4ケタの番号どうりに単純ソートで昇順にならべる'(L1,L2) :- sort(L1,L2),!. '4ケタの番号どうりに表示'([]) :- !. '4ケタの番号どうりに表示'([L|R]) :- concat_atom(L,',',A), write_formatted('%t\n',[A]), '4ケタの番号どうりに表示'(R). 2分探索で探索(_,_,_,_,N,[N|R],[N|R]) :- !. 2分探索で探索(S,M,E,L2,N,[N1|R1],X) :- N1 < N, M2 is (S+M) // 2, list_nth(M2,L2,L1), 2分探索で探索(S,M2,M,L2,N,L1,X),!. 2分探索で探索(S,M,E,L2,N,[N1|R1],X) :- N1 > N, M2 is (M+E) // 2, list_nth(M2,L2,L1), 2分探索で探索(M,M2,E,L2,N,L1,X),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/184 # # [1]C言語(初心者コース) # [2] キーボードから5つの整数を読み込み、その任意の2つの異なる数の # 組み合わせについて和と差と積と商と剰余を出力するプログラム # [3] OS:Windows Vista コンパイラ:Visual Studio.NET 言語:C # [4] 5/1迄 # [5] fgets,scanf,printf sprintf strlen strcpy strcat関数は使っても良い。 # それ以外は極力使用しないこと # scanfで取得した整数が入力された整数を表す文字列と矛盾が無いことを # チェックすること。 # 整数計算の際に桁溢れが発生していないかチェックすること。 # (特に除数が0であるかのチェック。剰余は除数の絶対値より小さい # 0以上の整数とする。) # main関数以外にユーザー関数を定義しないこと(main関数だけで # 構成)が制約条件だそうです。 # # よろしくお願いします # 'キーボードから5つの整数を読み込み、その任意の2つの異なる数の組み合わせについて和と差と積と商と剰余を出力する' :- 'キーボードから5つの整数を読み込み、'(L), その任意の2つの異なる数の組み合わせについて和と差と積と商と剰余を出力する(L). その任意の2つの異なる数の組み合わせについて和と差と積と商と剰余を出力する(L) :- 組み合わせ([1,2,3,4,5],2,[M,N]), list_nth(M,L,A), list_nth(N,L,B), B > 0, _和 is A + B, _差 is A - B, error_protect(_積 is A * B,fail), _商 is A // B, _剰余 is A mod B, write_formatted('%t,%t 和は%t,差は%t,積は%t,商は%t,剰余は%t\n',[A,B,_和,_差,_積,_商,_剰余]), fail. その任意の2つの異なる数の組み合わせについて和と差と積と商と剰余を出力する(_). 'キーボードから5つの整数を読み込み、'(L) :- 'キーボードから5つの整数を読み込み、'(1,L). 'キーボードから5つの整数を読み込み、'(5,[]) :- !. 'キーボードから5つの整数を読み込み、'(M,[N|R]) :- write('整数を入力してください : '), get_integer(N), 入力診断(N), M2 is M + 1, 'キーボードから5つの整数を読み込み、'(M2,R). 入力診断(N) :- integer(N). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/594 # #(問) # ID | DATE     | DATA # --+----------+----- # 1 | 2007-11-11 | aaa # 2 | 2007-11-11 | bbb # 1 | 2007-11-10 | ccc # 3 | 2007-11-12 | ddd # 3 | 2007-11-11 | eee # 4 | 2007-11-10 | fff # 1 | 2007-11-12 | ggg # # このようなテーブルから、各idに対して最新の5件だけ抽出しなさい 各idに対して最新の5件だけ抽出する(_ID,_DATE,_DATA) :- findsetof(_ID,テーブル(_ID_1,_DATE_1,_DATA_1),L1), member(_ID,L1), findall([_DATE,_ID,_DATE,_DATA],テーブル(_ID1,_DATE,_DATA),L2), 最新の5件を抽出(L3,Len,_ID,_DATE,_DATA). 最新の5件を抽出(L1,_ID,_DATE,_DATA) :- sort(L1,L2), reverse(L2,L3), length(L3,Len), '5件を抽出'(L3,Len,_ID,_DATE,_DATA). '5件を抽出'(L,Len,_ID,_DATE,_DATA) :- Len =< 5, member([_,_ID,_DATE,_DATA],L). '5件を抽出'(L,Len,_ID,_DATE,_DATA) :- Len > 5, for(1,N,5), list_nth(N,L,[_,_ID,_DATE,_DATA]), N =< 5. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258320456/104 # # 以下の5行の文字列のいずれかをランダムに返すプログラムを書きなさい # あいうえお # かきくけこ # さしすせそ # たちつてと # なにぬねの # '5行の文字列のいずれかをランダムに返す'(_5行の文字列,_文字列) :- list(_5行の文字列), N is (random mod 5) + 1, list_nth(N,_5行の文字列,_文字列),!. '5行の文字列のいずれかをランダムに返す'(_5行の文字列,_文字列) :- atom(_5行の文字列), split(_5行の文字列,['\n'],L), '5行の文字列のいずれかをランダムに返す'(L,_文字列),!. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 137代目 #936 # お手上げです。頑張ったのですが、できませんでした。 # 申し訳ないですけどお願いします。 # # 問題 # # 複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力するプログラムを作成せよ. # # 【実行例】 # # 何個の文字列を入力しますか?:4 # 入力文字列[1]:Computer # 入力文字列[2]:Science # 入力文字列[3]:Tarou # 入力文字列[4]:Tanaka # # 繋ぎ合わせる順番: # 2 # 4 # 3 # 1 # # 結果:ScienceTanakaTarouComputer # '複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する' :- '複数の文字列を読み込み,'(_複数の,_入力文字列ならび), 'さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する'(_複数の,_入力文字列ならび). '複数の文字列を読み込み,'(_複数の,_入力文字列ならび) :- 複数の(_複数の), findall(_行,( 文字列を読み込み(_複数の,_行)),_入力文字列ならび). 複数の(_複数の) :- 整数を得る('何個の文字列を入力しますか?: ',true,_複数の), writef('文字列を%w行連続して入力してください\n',[_複数の]). 文字列を読み込み(_複数の,_行) :- between(1,_複数の,_), 行入力(_行). 'さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する'(_複数の,_入力文字列ならび) :- 'さらに,それらの文字列を繋ぎ合わせる順番を入力し'(_複数の,_取り出し順ならび), 結果を出力する(_入力文字列ならび,_取り出し順ならび). 'さらに,それらの文字列を繋ぎ合わせる順番を入力し'(_複数の,_取り出し順ならび) :- write('入力した文字列を繋ぎ合わせる順番を入力してください\n'), それらの文字列を繋ぎ合わせる順番を入力し(_複数の,_取り出し順ならび). それらの文字列を繋ぎ合わせる順番を入力し(_複数の,_取り出し順ならび) :- findall(_番目,( 順番を入力し(_複数の,_番目)),_取り出し順ならび). 順番を入力し(_複数の,_番目) :- between(1,_複数の,_), 整数を得る(_番目). 整数を得る(_番目) :- 整数を得る('',true,_番目). 結果を出力する(_入力文字列ならび,_取り出し順ならび) :- 結果を(_入力文字列ならび,_取り出し順ならび,_指定した順番の文字列ならび), 出力する(_指定した順番の文字列ならび). 結果を(_入力文字列ならび,_取り出し順ならび,_指定した順番の文字列ならび) :- findall(_文字列,( 指定順に取り出す(_入力文字列ならび,_取り出し順ならび,_文字列)),_指定した順番の文字列ならび). 指定順に取り出す(_入力文字列ならび,_取り出し順ならび,_文字列) :- member(_番目,_取り出し順ならび), nth1(_番目,_入力文字列ならび,_文字列). 出力する(_指定した順番の文字列ならび) :- 文字列を指定した順番に繋ぎ合わせて(_指定した順番の文字列ならび,_表示文字列), writef('繋ぎ合わせた文字列は: %w\n',[_表示文字列]). 文字列を指定した順番に繋ぎ合わせて(_指定した順番の文字列ならび,_表示文字列) :- atomic_list_concat(_指定した順番の文字列ならび,_表示文字列). 整数を得る(_催促文,_条件,_整数) :- 以下の入力に失敗した場合は再入力する, '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 以下の入力に失敗した場合は再入力する :- repeat. '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- call(_条件). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/630 # # [1] 授業単元:Cプログラミング # [2] 問題文(含コード&リンク): # # 概要:数値を1つ(2〜9の数字)入力し、その個数分の"*"を1辺とする # 完成図(*=★、空白=☆): # # 3を入力した場合 # ★★★ # ☆☆★ # ★★★ # # 9を入力した場合 # ★★★★★★★★★ # ☆☆☆☆☆☆☆☆★ # ★★★★★★★☆★ # ★☆☆☆☆☆★☆★ # ★☆★★★☆★☆★ # ★☆★☆☆☆★☆★ # ★☆★★★★★☆★ # ★☆☆☆☆☆☆☆★ # ★★★★★★★★★ '数値を1つ(2〜9の数字)入力し、その個数分の"*"を1辺とする'(_数値,LL) :- findall(L1,(for(1,_,_数値),length(L1,_数値)),LL), とぐろを巻く(1,1,_列数1,,LL). とぐろを巻く(_行,_列,_行5,_列5,LL) :- 右に進む(_行,_列,_行2,_列2,LL), 置換(LL,LL1), 進む(_列2,_行2,_列3,_行3,LL2), 左に進む(_行3,_列3,_行4,_列4,LL3), 上に進む(_行4,_列4,_行5,_列5,LL4). 進む(_行,_列,_行2,_列2,LL), nth1(_行,LL,L), 右に進む(L). length([_|L0],_列), append(L0,[★,B|R,L), var(A), var(B), _列数1 is _列数 + 1, 進む(_列1,_列数1,L). 進む(L,_列1,_列2) :- _列2 is _列1 + 1, length(L0,_列1), append(L0,[A|R],L),!. 進むの一(A,R),!. 進むの一(A,[B|R]) :- \+(var(B)),!,fail. 進むの一(A,[B|R]) :- var(B), A = ★,!. 進むの一(A,[]) :- \+(var(A)), A = ★,!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/595 # # [1] 授業単元:プログラミング演習 # Q1. 問題文:4つの整数を入力し、それらを要素とする行列を求め、その値を以下のような # 形式で表示するプログラムを作成せよ。 # # 例 100 20 30 40と入力すれば #   | 100 20 | =3400 # | 30 40 | と表示される # # Q.2ディスカウントストアでどの商品でも5個以上買えば1割引、10個以上で2割引、20個以上で # 4割引となっていた。キーボードから買う商品の単価と個数を入力し、合計金額を計算するプログラミングを # 作成せよ。 # '4つの整数を入力し、それらを要素とする行列を求め、行列とその値を表示する' :- get_split_line([' ',','],[A,B,C,D]), 正方行列の行列式の値([[A,B],[C,D]],_値), write_formatted('  |%3d %3d| = %t\n',[A,B,_値]), write_formatted('  |%3d %3d|\n',[C,D]). 正方行列の行列式の値(_正方行列,_行列式の値) :- ガウス行列に変形(_正方行列,X,Y), '行列式|C|の値'(X,Z1), ならびの積(Y,Z2), _行列式の値 is Z1 // Z2. ならびの積([A],A) :- !. ならびの積([A|R],X) :- ならびの積(R,Y), X is A * Y. '行列式|C|の値'(_行列,_値) :- length(_行列,Len), findall(U,(for(1,N,Len),list_nth(N,_行列,_行),list_nth(N,_行,U)),L), ならびの積(L,_値). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/421 # # [1] 授業単元: プログラム言語 # [2] 問題文(含コード&リンク): # 10 人の成績を入力し,その順位を成績と共に表示したい。以下の考え方に基づいた # プログラムを作成せよ。 # 1 ? # 2次元配列s[10][2] を用意する。 # 2 ? # i=0〜9 のfor 文を用いてs[i][0] に成績を入力する。 # 3 ? # s[0][0] とs[j][0],j=0〜9 を比較し,s[0][0] より大きい数値の個数n を数え #  る。その個数+1 が成績順位になるので,s[0][1] にn+1 を代入する。 # 4 ? # 同様の操作をs[i][0],i=0〜9 に対して行なえば,その成績順位がs[i][1] とし #  て求められるので,あとは成績と共に表示すればよい。 # # '10 人の成績を入力し,その順位を成績と共に表示する' :- '要素数10の変数ならびを二本用意する'(L1,L2), 'L1に成績を入力する'(L1), 'L1の先頭から順位を対応するL2の位置にセット'(1,10,L1,L2), 二本のならびを順に表示(L1,L2). '要素数10の変数ならびを二本用意する'(L1,L2) :- length(L1,10),length(L2,10). 'L1に成績を入力する'(L1) :- for(1,N,10),get_integer(_点数),list_nth(N,L1,_点数),N=10,!. 'L1の先頭から順位を対応するL2の位置にセット'(N,M,L1,L2) :- N > M,!. 'L1の先頭から順位を対応するL2の位置にセット'(N,M,L1,L2) :- list_nth(N,L1,_点数),list_nth(N,L2,_順位), count((member(_点数1,L1),_点数1 > _点数),_成績上位者数),_順位 is _成績上位者数 + 1, N2 is N + 1, 'L1の先頭から順位を対応するL2の位置にセット'(N2,M,L1,L2). 二本のならびを順に表示(L1,L2) :- for(1,N,10), list_nth(N,L1,A),list_nth(N,L2,B), write_formatted('%t,%t位\n',[A,B]), N=10. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/335 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):ファイルに保存された会員情報を指定された項目をキーとしてソートするプログラムを作成する. # 出力形式は,入力データと同じ,つまり1行に1人分のデータを格納し,各項目間はカンマで区切るものとする. # また,ソート済みのデータはファイルではなく標準出力に出力するものとする. # 整数型のデータについては数値として,文字列型のデータについては大文字/小文字を区別せずにソートをすること. # ソートアルゴリズムはこれまでの演習で使用したもの,していないものに関わらず,何を用いてもよい. # # また,会員数は最大で20,000人と仮定してもよい. # # 会員情報の入ったファイルのファイル名,キーとなる項目,正順か逆順かの指定はプログラム実行時の引数として与える.第一引数が会員情報の入ったファイル名,第二引数が項目番号(表1参照),第三引数がソート方法(0なら昇順,1なら降順)とする. # # 表1: データ型 項目名 項目番号 型 # 会員ID 1 整数(int) # 姓 2 文字列(最大で50文字) # 名 3 文字列(最大で50文字) # 年齢 4 整数(int) # 州 5 文字列(最大で50文字) # 郡 6 文字列(最大で50文字) # # # オンメモリ整列限界数(1000). ファイルに保存された会員情報を指定された項目をキーとしてソートする(_対象ファイル,_鍵項目番号,_ソート方法) :- オンメモリ整列限界数(_オンメモリ整列限界数), open(_対象ファイル,read,Input), ふたつの仮ファイルの取得と交互からくり生成, 入力出力ファイルを交互しながらの繰り返し(_,_仮出力ファイル,InputT,OutputT), 対象ファイルから読み込む(Input,_オンメモリ整列限界数,_鍵項目番号,LL,_診断), 昇降順・指定整列(LL,_ソート方法,_整列されたLL), 鍵項目番号とソート方法をしてファイルマージ(_整列されたLL,_ソート方法,InputT,OutputT), \+(_診断=1000),close(Input), 仮出力ファイルの内容を整理しながら標準出力に表示する(_仮出力ファイル). 入力出力ファイルを交互しながらの繰り返し(_仮ファイルA,_仮ファイルB,InputT,OutputT) :- 仮ファイルからくり(_仮ファイルA,_仮ファイルB), open(_仮ファイルA,read,InputT), open(_仮ファイルB,write,OutputT). 仮ファイルからくり(X) :- 仮ファイルからくり(X). ふたつの仮ファイルの取得と交互からくり生成 :- tmpnam(_仮ファイル1),open(_仮ファイル1,write,Output1),close(Output1), tmpnam(_仮ファイル2),opene(_仮ファイル2,write,Output2),close(Output2), asserta(仮ファイルからくり(_仮ファイル2,_仮ファイル1)), asserta(仮ファイルからくり(_仮ファイル1,_仮ファイル2)). 対象ファイルから読み込む(Input,_オンメモリ整列限界数,_鍵項目番号,LL,_診断) :- 対象ファイルから読み込む(Input,0,_オンメモリ整列限界数,_鍵項目番号,LL,_診断),!. 対象ファイルから読み込む(Input,_オンメモリ整列限界数,_オンメモリ整列限界数,_,[],_オンメモリ整列限界数) :- !. 対象ファイルから読み込む(Input,N,_オンメモリ整列限界数,_鍵項目番号,[[_鍵_1,_会員ID,_姓_1,_名_1,_年齢,_州_1,_郡_1]|R],_診断) :- get_line(Input,Line), N2 is N + 1, split([','],Line,[_会員ID,_姓,_名,_年齢,_州,_郡]), to_upper([_姓,_名,_州,_郡],[_姓_1,_名_1,_州_1,_郡_1]), list_nth(_鍵項目番号,[_会員ID,_姓_1,_名_1,_年齢,_州_1,_郡_1],_鍵), 文字項目なら大文字に変換(_鍵,_鍵項目番号,_鍵_1), 対象ファイルから読み込む(Input,N,_オンメモリ整列限界数,_鍵項目番号,R,_診断). 文字項目なら大文字に変換(_鍵,_鍵項目番号,_鍵_1) :- member(_鍵項目番号,[2,3,5,6]), to_upper(_鍵,_鍵_1),!. 文字項目なら大文字に変換(_鍵,_,_鍵). 昇降順・指定整列(LL,1,_整列されたLL) :- sort(LL,_整列されたLL). 昇降順・指定整列(LL,2,_整列されたLL) :- rsort(LL,_整列されたLL). 鍵項目番号とソート方法をしてファイルマージ([],end_of_file,_,InputT,OutputT) :- !. 鍵項目番号とソート方法をしてファイルマージ([L1|R1],end_of_file,_,InputT,OutputT) :- write_formatted(OutputT,'%t,%t,%t,%t,%t,%t,%t\n',L1), 鍵項目番号とソート方法をしてファイルマージ(R1,end_of_file,_,InputT,OutputT),!. 鍵項目番号とソート方法をしてファイルマージ([],[_鍵2|L2],_,InputT,OutputT) :- write_formatted(OutputT,'%t,%t,%t,%t,%t,%t,%t\n',[_鍵2|L2]), eofまでコピーする(InputT,OutputT), close(InputT), close(OutputT),!. 鍵項目番号とソート方法をしてファイルマージ([[_鍵1|L1]]|R1],[_鍵2|L2],1,InputT,OutputT) :- _鍵1 @=< _鍵2, write_formatted(OutputT,'%t\n',[_鍵1|L1]), 鍵項目番号とソート方法をしてファイルマージ(R1,[_鍵2|L2],_ソート方法,InputT,OutputT). 鍵項目番号とソート方法をしてファイルマージ([[_鍵1|L1]|R1],[_鍵2|L2],1,InputT,OutputT) :- _鍵1 @> _鍵2, write_formatted(OutputT,'%t\n',[_鍵2|L2]), get_line(InputT,Line), atom_to_term(Line,(_鍵3,_会員ID3,_姓3,_名3,_年齢3,_州3,_郡3),_), 鍵項目番号とソート方法をしてファイルマージ(R1,[_鍵3,_会員ID3,_姓3,_名3,_年齢3,_州3,_郡3],_ソート方法,InputT,OutputT). 鍵項目番号とソート方法をしてファイルマージ([[_鍵1|L1]|R1],[_鍵2|L2],2,InputT,OutputT) :- _鍵1 @>= _鍵2, write_formatted(OutputT,'%t\n',[_鍵1|L1]), 鍵項目番号とソート方法をしてファイルマージ(R1,[_鍵2|L2],_ソート方法,InputT,OutputT). 鍵項目番号とソート方法をしてファイルマージ([[_鍵1|L1]|R1],[_鍵2|L2],2,InputT,OutputT) :- _鍵1 @< _鍵2, write_formatted(OutputT,'%t\n',[_鍵2|L2]), get_line(InputT,Line), atom_to_term(Line,(_鍵3,_会員ID3,_姓3,_名3,_年齢3,_州3,_郡3),_), 鍵項目番号とソート方法をしてファイルマージ(R1,[_鍵3,_会員ID3,_姓3,_名3,_年齢3,_州3,_郡3],_ソート方法,InputT,OutputT). eofまでコピーする(InputT,OutputT) :- repeat, get_line(Line), ( Line=end_of_file;write_formatted('%t\n',[Line]),fail),!. 仮出力ファイルの内容を整理しながら標準出力に表示する(_仮出力ファイル) :- open(_仮出力ファイル,read,Input), repeat, get_line(Line), ( Line=end_of_file; split([','],Line,[_|L]), write_formatted('%t,%t,%t,%t,%t,%t\n',L), fail ). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/316 # # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10760.txt # # (1)複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力するプログラムを作成せよ. # # 【実行例】 # # 何個の文字列を入力しますか?:3 # 入力文字列[1]:B # 入力文字列[2]:A # 入力文字列[3]:C # # 繋ぎ合わせる順番を入力してください。 # 2 # 1 # 3 # # 結果 -> ABC # # (2)入力した文字配列中に,abcという並びがいくつあるか調べるプログラムを作成せよ. # # 【実行例】 # # 1abfaabcabc # gatagataabc # (ここで ^D を押す) # #ABC is 3 # 複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する :- 催促付き整数入力('文字列の個数を予約してください : ',N), findall(S,( for(1,_,N),write_formatted('入力文字列[%t] : ',[M]), get_line(S)), L1), write('繋ぎ合わせる順番を入力してください。\n'), findall(N2,(for(1,_,N),get_integer(N2)),L2), 文字列のならびの並べ替え(L1,L2,L), concat_atom(L,_繋ぎ合わされた文字列), write_formatted('%t\n',[_繋ぎ合わされた文字列]). 文字列のならびの並べ替え(L1,[],[]) :- !. 文字列のならびの並べ替え(L1,[N|R2],[L2|R3]) :- list_nth(N,L1,L2), 文字列のならびの並べ替え(L1,R2,R3). '入力した文字配列中に,abcという並びがいくつあるか調べる' :- get_chars(Chars), count(append(_,[a,b,c|_],Chars),Count), write_formatted('#abc = %t\n'[Count]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1266565626/627 # # ずぶの素人なのですのでお手柔らかにお願いします # # 今2つのテキストファイルがあって、内容はおおよそ下のようです # # --------------テキストA------------------- # fcart1 -0.0000000000E+00 -0.0000000000E+00 1.0770536961E-04 # -0.0000000000E+00 -0.0000000000E+00 6.6543134784E-04 # -0.0000000000E+00 -0.0000000000E+00 -7.7313671745E-04 # getden1 0 # ------------------------------------------ # # --------------テキストB-------------------- # xred 0.0 0.0 0.047843858990 # 0.0 0.0 0.000434433306 # 1/3 2/3 -0.011730466739 # #Definition of the planewave basis set # ------------------------------------------ # テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足したいのですが # どのようにしたらいいでしょうか # ご教授お願いします # テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(_テキストA,_テキストB) :-     get_lines(_テキストA,LinesA),     get_lines(_テキストB,LinesB),     テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(LinesA,LinesB,LinesC),     put_lines(_テキストB,LineC). テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(LinesA,LinesB,LinesC) :-     テキストの一番右の列の数値を切り取る(LinesA,LA),     テキストの一番右の列の数値を切り取る(LinesB,LB),     加算([LA,LB],LC),         テキストBの最終数値要素を置換(LB,LC,LineC). テキスト一番右の列の数値を切り取る([],[]) :- !. テキスト一番右の列の数値を切り取る([Line|R1],[V|R2]) :-     split(Line,[ ],L),     数値要素が3個以上(L),     last(L,V),     テキストAの一番右の列の数値を切り取る(R1,R2). テキストBの最終数値要素を置換([],_,[]) :- !. テキストBの最終数値要素を置換([Line|R1],[V|R2],[LineC|R3]) :-     sPLIT(Line,[ ],L1),     数値要素が3個以上(L1),         length(L1,Len),     findmax(Nth,(            for(1,Nth,Len),            list_nth(Nth,L1,V1),number(V1)),         LastNth),     要素番号によるならびの置換(LastNth,V,L1,L3),     concat_atom(L3,LineC),     テキストBの最終数値要素を置換(R1,R2,R3),!. テキストBの最終数値要素を置換([Line|R1],L2,[Line|R3]) :-     テキストBの最終数値要素を置換(R1,L2,R3),!. 数値要素が3個以上(L1) :-     count((member(A,L1),number(A)),Count),     Count >= 3,!. % *** user: sPLIT / 3 *** sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,Y), findall(U,(member(U,Y) , not U = ''),L), L = X,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % *** user: 'SPLIT' / 3 *** 'SPLIT'(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Z), Z = X,!. % *** user: split_00 / 3 *** split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび),atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). % *** user: split_0 / 3 *** split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X) . % *** user: split_1 / 3 *** split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. % *** user: split_2 / 5 *** split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. % *** user: split / 3 *** split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,(member(U,Y) , not U = ''),L), L = X,!. % *** user: sPlit / 3 *** sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(member(U,_区切り符号ならび))), Z), Z = X,!. % *** user: put_lines / 2 *** put_lines(_,[]) :- !. put_lines(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), open(File_1,write,Output), put_lines(Output,L), close(Output),!. put_lines(Output,[Line|R]) :- is_stream(_,Output,_), write(Output,Line), write(Output,'\n'), put_lines(Output,R),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/955 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 以下のプログラムで、pointを昇順に並び替えるプログラムを作る。ソートの部分のみを書き換え、プログラムを作りなさい。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10713.txt # # struct data { # int car_num; # char name[MAX_LEN]; # char cons[MAX_LEN]; # char nationality[MAX_LEN]; # int birth; # double point; # }; % % ここでは単位節で定義された述語データベースの整列について考えよう。 % f1(1,'Jenson Button','McLaren','British',1980,106). f1(2,'Lewis Hamilton','McLaren','British',1985,109). f1(3,'Michael Schumacher','Mercedes GP','German',1969,34). f1(4,'Nico Rosberg','Mercedes GP','German',1985,74). f1(5,'Sebastian Vettel','Red Bull','German',1987,90). f1(6,'Mark Webber','Red Bull','Australian',1976,103). f1(7,'Felipe Massa','Ferrari','Brazilian',1981,67). f1(8,'Fernando Alonso','Ferrari','Spanish',1981,94). f1(9,'Rubens Barrichello','Williams','Brazilian',1972,7). f1(10,'Nico Hulkenberg','Williams','German',1987,1). f1(11,'Robert Kubica','Renault','Polish',1984,73). f1(12,'Vitaly Petrov','Renault','Russian',1984,6). f1(14,'Adrian Sutil','Force India','German',1983,23). f1(15,'Vitantonio Liuzzi','Force India','Italian',1981,12). f1(16,'Sebastien Buemi','Toro Rosso','Swiss',1988,5). f1(17,'Jaime Alguersuari','Toro Rosso','Spanish',1990,3). f1(18,'Jarno Trulli','Lotus','Italian',1974,0). f1(19,'Heikki Kovalainen','Lotus','Finnish',1981,0). f1(20,'Karun Chandhok','HRT','Indian',1984,0). f1(21,'Bruno Senna','HRT','Brazilian',1983,0). f1(22,'Pedro de la Rosa','BMW Sauber','Spanish',1971,0). f1(23,'Kamui Kobayashi','BMW Sauber','Japanese',1986,1). f1(24,'Timo Glock','Virgin','German',1982,0). f1(25,'Lucas di Grassi','Virgin','Brazilian',1984,0). pointを昇順に並び替える(L) :- clause_sort([1],f1/6,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% pointを昇順に並び替える(L) :- データ構造(f1,_データ構造ならび), list_nth(N,_データ構造ならび,[point|_]), length(_データ構造ならび,Len), length(L0,Len), P =.. [f1|L0], findall(L0,P,L1), findall([_point|L2],( member(L2,L1), list_nth(N,L2,_point)), L3), sort(L3,L4), findall(L5,member([_|L5],L4),L). データ構造ならび(f1,[[car_num],[name],[cons],[nationality],[birth],[point]]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% pointを昇順に並び替える(X) :- データ構造(f1,_データ構造ならび), list_nth(M,_データ構造ならび,[point|_]), length(_データ構造ならび,Len), clause_sort([M],f1/Len,X), %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clause_sort(_順ならび,_関数 / _引数,X) :- functor(_頭部,_関数,_引数), findall(U,(clause(_頭部,_本体) , clause_sort_1(_順ならび,_頭部,_本体,U)),L), sort(L,L2), clause_sort_2(L2,X),!. clause_sort_1([],_頭部,_本体,[(_頭部 :- _本体)]) :- !. clause_sort_1([_鍵位置|R1],_頭部,_本体,[A|R2]) :- arg(_鍵位置,_頭部,A), clause_sort_1(R1,_頭部,_本体,R2). clause_sort_2([],[]) :- !. clause_sort_2([L|R1],[_頭部|R2]) :- last(L,(_頭部 :- true)), clause_sort_2(R1,R2), !. clause_sort_2([L|R1],[Q|R2]) :- last(L,Q), clause_sort_2(R1,R2),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/420 # # [1] 授業単元:プログラミング実践 # [2] 問題文 # アフィン変換のプログラムを作成し、下の図の真ん中を座標の中心にして90°回転した結果を出力せよ。 # (図)affin.txt # 00000 # 00000 # 11111 # 00000 # 00000 # # アフィン変換により原点を中心に90度回転(X1,X2,Y1,Y2,_行列1,_アフィン変換された行列) :- length(_行列1,Len1), nth1(1,_行列1,_行), length(_行,Len2), findall([XX2,YY2,V],アフィン変換により原点を中心に90度回転(X1,X2,Y1,Y2,_行列1,XX2,YY2,V),L1), アフィン変換_2(1,Len1,1,Len2,L1,_アフィン変換された行列). アフィン変換により原点を中心に90度回転(X1,X2,Y1,Y2,_行列1,XX2,YY2,V) :- between(X1,X2,X), between(Y1,Y2,Y), 行列の掛算([[0,1,0],[-1,0,0]],[[X],[Y],[1]],[[X3],[Y3]]), XX is X + 3, YY is Y + 3, XX2 is X3 + 3, YY2 is Y3 + 3, nth1(YY,_行列1,_行1), nth1(XX,_行1,V). アフィン変換_2(M,Len1,_,_,_,[]) :- M > Len1,!. アフィン変換_2(M,Len1,N,Len2,L,[[]|R2]) :- N > Len2, M2 is M + 1, アフィン変換_2(M2,Len1,N,1,L,R2),!. アフィン変換_2(M,Len1,N,Len2,L,[[V|R1]|R2]) :- N =< Len2, member([M,N,V],L), N2 is N + 1, アフィン変換_2(M,Len1,N2,Len2,L,[R1|R2]),!. アフィン変換_2(M,Len1,N,Len2,L,[[0|R1]|R2]) :- N =< Len2, \+(member([M,N,V],L)), N2 is N + 1, アフィン変換_2(M,Len1,N2,Len2,L,[R1|R2]),!. 行列の掛算(L1,L2,X) :- 転置(L2,L4), 行列の掛算_1(L1,L4,X). 行列の掛算_1([],_,[]) :- !. 行列の掛算_1([A|R1],L,[S1|R3]) :- 行列の掛算_2(A,L,S1), 行列の掛算_1(R1,L,R3). 行列の掛算_2(_,[],[]) :- !. 行列の掛算_2(A,[B|R2],[C|R3]) :- 行列の掛算_3(A,B,C), 行列の掛算_2(A,R2,R3). 行列の掛算_3([],[],0) :- !. 行列の掛算_3([A|R1],[B|R2],S) :- 分数を含む掛算(A,B,S1), 行列の掛算_3(R1,R2,S2), 分数を含む加算(S1,S2,S),!. 分数を含む掛算(A1 / A2,B1 / B2,C) :- S1 is A1 * B1, S2 is A2 * B2, 約分(S1 / S2,C),!. 分数を含む掛算(A1 / A2,B,C) :- S1 is A1 * B, 約分(S1 / A2,C),!. 分数を含む掛算(A,B1 / B2,C) :- S1 is B1 * A, 約分(S1 / B2,C),!. 分数を含む掛算(A,B,C) :- C is A * B. 分数を含む加算(A,B,C) :- number(A), number(B), C is A + B,!. 分数を含む加算(A1 / B1,A2 / B2,C) :- A3 is A1 * B2 + A2 * B1, B3 is B1 * B2, 約分(A3 / B3,C),!. 分数を含む加算(A1 / B1,V,C) :- number(V), A2 is V * B1, C3 is A1 + A2, 約分(C3 / B1,C),!. 分数を含む加算(V,A2 / B2,C) :- number(V), A1 is V * B2, C3 is A1 + A2, 約分(C3 / B2,C),!. 約分(B / A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子_1,_分母_1,_分子 / _分母) :- 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母),!. 約分の二(_分子,_分母,_分子 / _分母). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4) . 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). ?- アフィン変換により原点を中心に90度回転(-2,2,-2,2,[[0,0,0,0,0],[0,0,0,0,0],[1,1,1,1,1],[0,0,0,0,0],[0,0,0,0,0]],L). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/863 # # [1]授業単元:プログラミング演習 # [2]問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10697.txt # [3] # [3.1]OS:windows7 pro 64bit # [3.2] 環境:visualstudio 2010 express c++、ver10,0です # [3.3] 言語はCです # [4]18日が期限です # [5]その他制限:実行例が見やすいように一の位を揃えてください # 自分は三教科の点数を表示するところまではなんとか書けましたが、一の位が揃えられてないです。 # できれば自分のソースに付け足す形でお願いできればうれしいです # # 自分は多元的配列まで習いました # # よろしくお願いします。 # # # [2]問題文:10人の三教科(国語・数学・英語)の点数を二次配列に格納し終えたのち、 # 実行例のように"n人目 国語の点数 数学の点数 英語の点数"を表示するプログラムを書け #  点数は1~100の乱数によって与えること。 # また、二次的配列に格納された3教科の点数を各人ごとに合計し、合計点として1次元配列に格納する。 #  格納し終えたのち、1次的配列の先頭から合計点を表示する。 #  一次元配列に格納された合計点を降順にソートし、一次元配列の先頭から合計点を表示する。 #  ソートの方法として、バブルソースを使用する # # # <<実行例>> (seed=97の場合) # 国語 数学 英語 # 1人目: 75 55 84 # 2人目: 3 58 90 # 3人目: 100 60 61 # 4人目: 19 39 67 # 5人目: 90 99 15 # 6人目: 5 58 59 # 7人目: 20 15 47 # 8人目: 46 12 94 # 9人目: 22 93 27 # 10人目: 90 90 35 # # # 合計点(ソート前): 214 151 221 125 204 122 82 152 142 215 # 合計点(ソート後): 221 215 214 204 152 151 142 125 122 82 '10人の三教科(国語・数学・英語)の点数を二次配列に格納し終えたのち、実行例のように"n人目 国語の点数 数学の点数 英語の点数"を表示する' '10人の三教科(国語・数学・英語)の点数を二次配列に格納し'(_10人の三教科の点数を二次配列), 終えたのち, '実行例のように"n人目 国語の点数 数学の点数 英語の点数"を表示する'(_10人の三教科の点数を二次配列),!. '10人の三教科(国語・数学・英語)の点数を二次配列に格納し'(_10人の三教科の点数を二次配列) :- findall([_国語の点数,_数学の点数,_英語の点数],( 10人の, '点数は1~100の乱数によって与えること'(_国語の点数,_数学の点数,_英語の点数)), _10人の三教科の点数を二次配列). 10人の :- for(1,N,10). 10人の(N) :- for(1,N,10). 終えたのち. '点数は1~100の乱数によって与えること'(_国語の点数,_数学の点数,_英語の点数) :- 'n個の範囲(1~100)の正規分布ならびを得る'(3,[_国語の点数,_数学の点数,_英語の点数]). 'n個の範囲(1~100)の正規分布ならびを得る'(_n個,_正規分布ならび) :- findall(Y2,( for(1,_,_n個), U is (random mod 100000) / 100000, R is ( 2 * pi * (random mod 100000)) / 100000, S is (-2) * log(1-U), X is sqrt(S) * cos(R), Y is sqrt(S) * sin(R), Y2 is truncate(100 * (Y + pi) / (2 * pi)) + 1), _正規分布ならび),!. '実行例のように"n人目 国語の点数 数学の点数 英語の点数"を表示する'(_n人目,_10人の三教科の点数を二次配列) :- write(' 国語 数学 英語\n'), 10人の(_n人目), list_nth(_n人目,_10人の三教科の点数を二次配列,[_国語の点数,_数学の点数,_英語の点数]), write_formatted('%2d人目 %3d %3d %3d\n',[_n人目,_国語の点数,_数学の点数,_英語の点数]), _n人目 = 10,!. '10人の三教科(国語・数学・英語)の点数を二次配列に格納し終えたのち、実行例のように"n人目 国語の点数 数学の点数 英語の点数"を表示する' '10人の三教科(国語・数学・英語)の点数を二次配列に格納し'(_10人の三教科の点数を二次配列), 終えたのち, また、二次的配列に格納された3教科の点数を各人ごとに合計し、合計点として1次元配列に格納する(_10人の三教科の点数を二次配列,_合計点ならび), 一次元配列に格納された合計点を降順にソートし、一次元配列の先頭から合計点を表示する(_合計点ならび). また、二次的配列に格納された3教科の点数を各人ごとに合計し、合計点として1次元配列に格納する([],[]) :- !. また、二次的配列に格納された3教科の点数を各人ごとに合計し、合計点として1次元配列に格納する([[A,B,C]|R1],[S|R2]) :- S is A + B + C, また、二次的配列に格納された3教科の点数を各人ごとに合計し、合計点として1次元配列に格納する(R1,R2). 一次元配列に格納された合計点を降順にソートし、一次元配列の先頭から合計点を表示する(_合計点ならび) :- 降順バブルソート(_合計点ならび,_降順合計点ならび), 先頭から合計点を表示する(1,_降順合計点ならび). 先頭から合計点を表示する(_,[]) :- !. 先頭から合計点を表示する(N,[S|R]) :- write_formatted('%2d人目: %t点\n',[N,S]), N2 is N + 1, 先頭から合計点を表示する(N2,R). 降順バブルソート(L1,L2) :- 降順バブルソート(L1,[],L2). 降順バブルソート([],L,L) :- !. 降順バブルソート([A|R1],L1,L) :- 降順バブルソート(A,R1,R2,L1,L2),降順バブルソート(R2,L2,L). 降順バブルソート(A,[],[],L1,[A|L1]) :- !. 降順バブルソート(A,[B|R1],[A|R2],L1,L2) :- A @>= B,降順バブルソート(B,R1,R2,L1,L2). 降順バブルソート(A,[B|R1],[B|R2],L1,L2) :- A @< B,降順バブルソート(A,R1,R2,L1,L2),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/844 # # [1] 授業単元:プログラミング応用 # [2] 問題文(含コード&リンク):西暦を年号に変換するプログラムを作成する。 # ただし、入力できるのは、1868年以降からであり、2008年以降も平成とする。 # 明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。 # 下記を参考にプログラムを作成しなさい。 # int gannen[]={1989, 1926, 1912, 1868}; # char nengou[][8]={"heisei", "syouwa", "taisyou", "meiji"}; # 西暦を和暦に変換する(_西暦,_和暦) :- findall([_年号,_元年の西暦],西暦和暦元年対応(_元年の西暦,_年号),L), 西暦を和暦に変換する(_西暦,L,_和暦). 西暦を和暦に変換する(_西暦,[[_年号,A]],_和暦) :- _西暦 >= A, _年 is _西暦 - A + 1, 西暦年和暦年変換(_年,_和暦年), concat_atom([_年号,_和暦年,年],_和暦),!. 西暦を和暦に変換する(_西暦,[[_年号,A],[_,B]|_],_和暦) :- _西暦 >= A,_西暦 < B, _年 is _西暦 - A + 1, 西暦年和暦年変換(_年,_和暦年), concat_atom([_年号,_和暦年,年],_和暦),!. 西暦を和暦に変換する(_西暦,[A|R],_和暦) :- _西暦 > A, 西暦を和暦に変換する(_西暦,R,_和暦). 西暦年和暦年変換(1,元年) :- !. 西暦年和暦年変換(_西暦年,_和暦年) :- 数字和数字変換(_西暦年,['',十],_反転した和暦年文字ならび), reverse(_反転した和暦年文字ならび,_和暦年文字ならび), concat_atom(_和暦年文字ならび,_和暦年). 数字和数字変換(0,_,L,L) :- !. 数字和数字変換(N,[_|R1],L2,L) :- 0 is N mod 10, N1 is N // 10, 数字和数字変換(N1,R1,L2,L),!. 数字和数字変換(N,[十|R1],L2,L) :-) :- 1 is N mod 10, N1 is N // 10, 数字和数字変換(N1,R1,[十|L2],L). 数字和数字変換(N,[A|R1],L2,L) :- M is N mod 10, list_nth(M,[一,二,三,四,五,六,七,八,九],_和数字), N1 is N // 10, 数字和数字変換(N1,R1,[A,M|L2],L). 西暦和暦元年対応(1868,明治). 西暦和暦元年対応(1912,大正). 西暦和暦元年対応(1926,昭和). 西暦和暦元年対応(1989,平成). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/695 # # [1] 授業単元:プログラム実習 # [2] 問題文(含コード&リンク):2次元配列を使って2点を結ぶ線分を引くプログラムを書く # '2次元配列を使って2点を結ぶ線分を引く'(M1,M2,X1,X2,Y1,Y2,LL) :- '2次元配列を生成'(M1,M2,LL), A is (X2-X1) / (Y2-Y1), B is Y1 - A * X1, for(X1,X,X2), Y is truncate(A * X + B), Xp is X + 1,Yp is Y + 1, '2次元配列を要素位置指定により置換'(Yp,Xp,LL,'*'), X = X2. '2次元配列を生成'(M1,M2,LL) :- findall(L,(for(1,M,M1),list_lenth(L,M2),all(L,' ')),LL),!. '2次元配列を要素位置指定により置換'(M,N,A,LL1,LL2) :- list_nth(M,LL,L), 要素番号によるならびの置換(N,A,L,L1), 要素番号によるならびの置換(M,L1,LL,LL2). 要素番号によるならびの置換(E,E,U,[A|R],[U|R]) :- !. 要素番号によるならびの置換(S1,E,U,[A|R],[A|R1]) :- S2 is S1 + 1,要素番号によるならびの置換(S2,E,U,R,R1). 要素番号によるならびの置換(Pos,U,L1,L2) :- 要素番号によるならびの置換(1,Pos,U,L1,L2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/210 # # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10290.txt # # 名前と点数のデータを持っているリスト構造をソートさせたいのです。 # # (名前) (点数) # 骨川スネ夫 50 # 野比のび太 0 # 出木杉英才 100 # 剛田たけし 20 # 源静香    80 # # のようなデータを予め持っているとして、名前でソートしたい時はあいうえお順に、 # 点数でソートしたい時は0から順に並び替え、画面に出力させたいのですが、 # そもそもあいうえお順でソートさせる方法が分からず、 # 名前と点数を同時に動かす方法も思いつかず、提出期限間近になってしまいました。 # どうかお願いします。 # # //漢字でソートは無理だから漢字名とは別に表示させずにひらがなで名前のデータを入れておくのでしょうか? 漢字整列(_漢字ならび,_整列された漢字ならび) :- かな読みに変換しながらデータ番号を付加(1,_漢字ならび,L2), sort(L2,L3), 付加されたデータ番号により整列された漢字ならびを得る(L3,_漢字ならび,_整列された漢字ならび). かな読みに変換しながらデータ番号を付加(_,[],[]) :- !. かな読みに変換しながらデータ番号を付加(N,[[_漢字文字列,_点数]|R1],[[_かなに変換された文字列,_点数,N]|R2]) :- atom_chars(_漢字文字列,Chars), かな読み変換(Chars,_かなならび), N2 is N + 1, かな読みに変換しながらデータ番号を付加(N2,R1,R2).). かな変換([],[]) :- !. かな変換(L1,L2) :- かな読み(L1,R1,L2,R2), かな変換(R1,R2). 付加されたデータ番号により整列された漢字ならびを得る([],_,[]) :- !. 付加されたデータ番号により整列された漢字ならびを得る([[_,_,N]|R1],_漢字ならび,[L|R2]) :- list_nth(N,_漢字ならび,L), 付加されたデータ番号により整列された漢字ならびを得る(R1,_漢字ならび,R2). かな読み([骨,川|R1],R1,[ほ,ね,か,わ|R2],R2). かな読み([ス,ネ,夫|R],R1,[す,ね,お|R2],R2). かな読み([野,比|R1],R1,[の,び|R2],R2). かな読み([の,び,太|R1],R1,[の,び,た|R2],R2). かな読み([出,木,杉|R1],R1,[で,き,す,ぎ|R2],R2). かな読み([英,才|R1],R1,[ひ,で,た,け|R2],R2). かな読み([剛,田|R1],R1,[ご,う,だ|R2],R2). かな読み([た,け,し|R1],R1,[た,け,し|R2],R2). かな読み([源|R1],R1,[み,な,も,と|R],R2). かな読み([静,香|R1],R1,[し,ず,か|R2],R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/634 # # [1] 授業単元:プログラム演習 # [2] 問題文(含コード&リンク): # 任意の要素数のint型の配列を作成し、その配列の中にキーボードから数値を入力する関数 make_ary、総和を求める関数 sum_ary、配列からある要素を探す関数 search_ary、配列を表示する関数 printf_ary を実装しなさい。 # その際、要素数もキーボードから入力するように設計し、配列はちょうどその要素分だけを作成するようにしなさい。 # 各関数では添字演算子([])を用いずに、ポインタ操作で実装しなさい。 # 返り値と引数をどのようにしたら良いか考えて実装すること。 # 以下のmain関数を参考にする。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10672.txt # また、実行例は以下のようにすること。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10670.txt # % Prolog に配列は存在しないから、この種の問題は解けない。ここでは配列をできる % リストに置き換えて、できる限り仕様に近く作ってみよう。 % 配列として与えられた課題をリストに置き換える時の参考にしてください。 '任意の要素数のint型の配列を作成し、その配列の中にキーボードから数値を入力する関数 make_ary'(_ならび) :- make_ary(_ならび). make_ary(L) :- 催促付き整数入力('要素数を決めてください:',N), length(L,N), for(1,M,N), M1 is M - 1, write_formatted('ary[%t]を入力してください :',[M1]), get_integer(J), list_nth(M,L,J), M = N. '配列の総和を求める関数 sum_ary'(L) :- sum_ary(L,_総和), write_formatted('配列の総和は %t です。\n',[_総和]). sum_ary([],0) :- !. sum_ary([N|R],X) :- sum_ary(R,Y),X is N + Y. 'キーボードから数値を入力して配列からある要素を探す関数 search_ary'(L) :- search_ary(L,M), write_formatted('%t は配列の%t番目にあります。\n',[N,M]). search_ary(L,M) :- 催促付き整数入力('検索する数値を入力してください:',N), list_nth(M,L,N). 配列の表示(L) :- print_ary(L). print_ary(L) :- print_ary(0,L). print_ary(_,[]) :- !. print_ary(M,[N|R]) :- write_formatted('ary[%t]:%t\n',[M,N]), M2 is M + 1, print_ary(M2,R). 配列処理操作 :- '任意の要素数のint型の配列を作成し、その配列の中にキーボードから数値を入力する関数 make_ary'(_ならび), 配列操作(_ならび),!. 配列処理操作(L) :- write('**** 配列処理操作一覧 ****\n 1:総和計算\n 2:検索\n 3:配列の表示\n\n 9:End\n'), 催促付き整数入力('Select a number ? ',N), 機能選択(N,L),!. 配列処理操作(L) :- 配列処理操作(L). 機能選択(1,L) :- '配列の総和を求める関数 sum_ary'(L), fail. 機能選択(2,L) :- 'キーボードから数値を入力して配列からある要素を探す関数 search_ary'(L), fail. 機能選択(3,L) :- 配列の表示(L),fail. 機能選択(9,L) :- !. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 136代目 #602 # 【質問テンプレ】 # [1] 授業単元:画像処理 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10665.txt # # <問題文> # 画像ファイルを読み込み、その画像の濃度ヒストグラムを作成しなさい。 # すべての画像サイズは256*256となっている。 # ヒストグラムは階調値0-255を32段階でカウントする。 # また、頻度の表示は100個ごとに表示する。 '画像ファイルを読み込み、その画像の濃度ヒストグラムを作成する' :- '画像ファイルを読み込み'(_画像ファイル,_,_データ部値ならび), 'ヒストグラムの作成'(_データ部値ならび,LL), 'ヒストグラムの表示'(LL). '画像ファイルを読み込み'(_画像ファイル,_,_データ部値ならび) :- 'すべての画像サイズは256*256となっている'(_データ部サイズ), open(_画像ファイル,read,Input), 画像ファイルヘッダの読み込み(_画像ファイル,Input,_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ), close(Input), 画像ファイルデータ部の読み込み(_画像ファイル,_画像ファイルヘッダバイトサイズ,_データ部サイズ,_データ部値ならび),!. 画像ファイルデータ部の読み込み(_画像ファイル,_画像ファイルヘッダバイトサイズ,_データ部サイズ,_データ部値ならび) :- open(_画像ファイル,read,Input2,[type(binary)]), between(1,_画像ファイルヘッダバイトサイズ,N), get_byte(Input2,_), N = _画像ファイルヘッダバイトサイズ, findall(X,( between(1,_データ部サイズ,N), get_byte(Input2,X)) _データ部値ならび), close(Input2). 'すべての画像サイズは256*256となっている'(_データ部サイズ) :- _データ部サイズ is 256 * 256 * 3. 'ヒストグラムの作成'(_データ部値ならび,L1,LL) :- 'ヒストグラムは階調値0-255を32段階でカウントする'(L1,L2), '頻度の表示は100個ごとに'(L2,LL). 'ヒストグラムは階調値0-255を32段階でカウントする'([],[]) :- !. 'ヒストグラムは階調値0-255を32段階でカウントする'([R,G,B|R1],[_階調|R2]) :- _階調 is ((R + G + B) // 3) // 8, 'ヒストグラムは階調値0-255を32段階でカウントする'(R1,R2). '頻度の表示は100個ごとに'(L2,LL) :- findall(L_2,( between(0,31,N), count((member(M,L2),M >= N,M =< N + 31),Count_1), Count is Count_1 // 100, length(L_2,Count)), LL). 'ヒストグラムの表示'(_,[]) :- !. 'ヒストグラムの表示'(N,[L|R]) :- all(L,'*'), atomic_list_concat(L,_星表示), _範囲下限 is N * 32, _範囲上限 is _範囲下限 + 31, writef('%w~%w: %w\n',[_範囲下限,_範囲上限,_星表示]), N2 is N + 1, 'ヒストグラムの表示'(N2,R). 画像ファイルヘッダの読み込み(_画像ファイル,Input,_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ) :- findall(Line,( nth1(N,_,_), get_line(Input,Line), ( Line = '\n',!,fail; true )), _画像ファイルヘッダ), 画像ファイルヘッダサイズを得る(_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ),!. 画像ファイルヘッダサイズを得る([],1) :- !. 画像ファイルヘッダサイズを得る([Line|R],Size) :- 行のバイトサイズ(Line,_行のバイトサイズ), 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 1. 行のバイトサイズ([],1) :- !. 行のバイトサイズ([A|R],Size) :- char_code(A,Code), Code > 255, 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 2,!. 行のバイトサイズ([A|R],Size) :- char_code(A,Code), Code < 256, 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 1,!. all([],_). all([V|R],V) :- all(R,V). get_line(Input,Line) :- read_line_to_codes(Input,Codes), atom_codes(Line,Codes). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 136代目 #602 # 【質問テンプレ】 # [1] 授業単元:画像処理 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10665.txt # # <問題文> # 画像ファイルを読み込み、その画像の濃度ヒストグラムを作成しなさい。 # すべての画像サイズは256*256となっている。 # ヒストグラムは階調値0-255を32段階でカウントする。 # また、頻度の表示は100個ごとに表示する。 '画像ファイルを読み込み、その画像の濃度ヒストグラムを作成する' :- '画像ファイルを読み込み'(_画像ファイル,_,_データ部値ならび), 'ヒストグラムの作成'(_データ部値ならび,LL), 'ヒストグラムの表示'(LL). '画像ファイルを読み込み'(_画像ファイル,_,_データ部値ならび) :- 'すべての画像サイズは256*256となっている'(_データ部サイズ), open(_画像ファイル,read,Input), 画像ファイルヘッダの読み込み(_画像ファイル,Input,_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ), close(Input), 画像ファイルデータ部の読み込み(_画像ファイル,_画像ファイルヘッダバイトサイズ,_データ部サイズ,_データ部値ならび),!. 画像ファイルデータ部の読み込み(_画像ファイル,_画像ファイルヘッダバイトサイズ,_データ部サイズ,_データ部値ならび) :- open(_画像ファイル,read,Input2,[type(binary)]), between(1,_画像ファイルヘッダバイトサイズ,N), get_byte(Input2,_), N = _画像ファイルヘッダバイトサイズ, findall(X,( between(1,_データ部サイズ,N), get_byte(Input2,X)) _データ部値ならび), close(Input2). 'すべての画像サイズは256*256となっている'(_データ部サイズ) :- _データ部サイズ is 256 * 256 * 3. 'ヒストグラムの作成'(_データ部値ならび,L1,LL) :- 'ヒストグラムは階調値0-255を32段階でカウントする'(L1,L2), '頻度の表示は100個ごとに'(L2,LL). 'ヒストグラムは階調値0-255を32段階でカウントする'([],[]) :- !. 'ヒストグラムは階調値0-255を32段階でカウントする'([R,G,B|R1],[_階調|R2]) :- _階調 is ((R + G + B) // 3) // 8, 'ヒストグラムは階調値0-255を32段階でカウントする'(R1,R2). '頻度の表示は100個ごとに'(L2,LL) :- findall(L_2,( between(0,31,N), count((member(M,L2),M >= N,M =< N + 31),Count_1), Count is Count_1 // 100, length(L_2,Count)), LL). 'ヒストグラムの表示'(_,[]) :- !. 'ヒストグラムの表示'(N,[L|R]) :- all(L,'*'), atomic_list_concat(L,_星表示), _範囲下限 is N * 32, _範囲上限 is _範囲下限 + 31, writef('%w~%w: %w\n',[_範囲下限,_範囲上限,_星表示]), N2 is N + 1, 'ヒストグラムの表示'(N2,R). 画像ファイルヘッダの読み込み(_画像ファイル,Input,_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ) :- findall(Line,( nth1(N,_,_), get_line(Input,Line), ( Line = '\n',!,fail; true )), _画像ファイルヘッダ), 画像ファイルヘッダサイズを得る(_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ),!. 画像ファイルヘッダサイズを得る([],1) :- !. 画像ファイルヘッダサイズを得る([Line|R],Size) :- 行のバイトサイズ(Line,_行のバイトサイズ), 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 1. 行のバイトサイズ([],1) :- !. 行のバイトサイズ([A|R],Size) :- char_code(A,Code), Code > 255, 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 2,!. 行のバイトサイズ([A|R],Size) :- char_code(A,Code), Code < 256, 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 1,!. all([],_). all([V|R],V) :- all(R,V). get_line(Input,Line) :- read_line_to_codes(Input,Codes), atom_codes(Line,Codes). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/524 # # [1] 授業単元:データ構造 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10662.txt # バケツソート(_整列されたならび) :- abolish('$temp'/2), findall(S,(for(1,_,2000),ランダムな文字列の発生(S)),L), バケツソート(L,_整列されたならび),!. バケツソート(L,_整列されたならび) :- バケツに吐き出す(L), findall(X,(鍵候補値を昇順に発生させる(S),バケツから拾い上げる(S,X)),_整列されたならび). 数値文字候補ならび(['0','1','2','3','4','5','6','7','8','9']). 鍵候補値を昇順に発生させる(S) :- 数値文字候補ならび(L), member(A,L),member(B,L),member(C,L),member(D,L),member(E,L), concat_atom([A,B,C,D,E],S). ランダムな文字列の発生(S) :- 数値文字候補ならび(L), findall(A,(for(1,_,5),M is (random mod 10) + 1,list_nth(M,L,A)),L2), concat_atom(L2,S),!. バケツに吐き出す([]) :- !. バケツに吐き出す([S|R]) :- retract('$temp'(S,L)), assertz('$temp'(S,[_|L])), バケツに吐き出す(R),!. バケツに吐き出す([N|R]) :- assertz('$temp'(S,[_])), バケツに吐き出す(R),!. バケツから拾い上げる(S,X) :- '$temp'(S,L1), all(L1,S), member(X,L1). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1274791771/96 # # 教えてください # table aから(dept,place)でのくくりでcount の次のレスに示すようにtop3を抽出したいです # # table a # dept|place|ext|count # aaaa|aaaaa|jar|10 # aaaa|aaaaa|com|4 # aaaa|aaaaa|scr|20 # aaaa|aaaaa|exe|80 # aaaa|aaaaa|bat|2 # aaaa|bbbbb|ace|10 # aaaa|bbbbb|arj|4 # aaaa|bbbbb|zip|20 # aaaa|bbbbb|rar|80 # aaaa|bbbbb|lzh|2 # bbbb|aaaaa|mdb|10 # bbbb|aaaaa|xls|4 # bbbb|aaaaa|ppt|20 # bbbb|aaaaa|doc|80 # bbbb|aaaaa|txt|2 # bbbb|bbbbb|gif|10 # bbbb|bbbbb|png|4 # bbbb|bbbbb|jpg|20 # bbbb|bbbbb|bmp|80 # bbbb|bbbbb|tif|2 # ↓ # aaaa|aaaaa|exe|80 # aaaa|aaaaa|scr|20 # aaaa|aaaaa|jar|10 # aaaa|bbbbb|rar|80 # aaaa|bbbbb|zip|20 # aaaa|bbbbb|ace|10 # bbbb|aaaaa|doc|80 # bbbb|aaaaa|ppt|20 # bbbb|aaaaa|mdb|10 # bbbb|bbbbb|bmp|80 # bbbb|bbbbb|jpg|20 # bbbb|bbbbb|gif|10 # 'table aからdept,placeのくくりでcountのtop3を抽出' :-     findsetof([_dept,_place],a(_dept,_place,_exit,_count)),     findall(X,findrsort([_count],a(_dept,_place,_ext,_count),X),L),     for(1,N,3),     list_nth(N,L,X),     write_formatted('%t|%t|%t|%t\n',X),     N = 3,     fail. 'table aからdept,placeのくくりでcountのtop3を抽出'. % findrsort/3,findsetof/2 は http://nojiriko.asia/prolog/findsort.html 参照 % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/284 # # [1] 授業単元:プログラム演習A # [2] 問題文:全30件の成績(0〜100点)をキーボードから # 読み込み、0〜9点, 10〜19点,・・・, 90〜99点, 100点 の # 11通りの区間にそれぞれ何人が入るかを調べなさい。 # ただし、各区間に入る人数を溜めておく入れ物として # 配列を利用すること。更に調べた人数に従って、各区間を # ヒストグラムで表しなさい。 # # 0点:*** # 10点:***** # 20点:**** # ・ # ・ # 100点:* # # '全30件の成績(0〜100点)をキーボードから読み込み、0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか調べヒストグラムで表わす' :- '全30件の成績(0〜100点)をキーボードから読み込み、0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'(X), ヒストグラムで表わす(X). '全30件の成績(0〜100点)をキーボードから読み込み、0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'(X) :- '全30件の成績(0〜100点)をキーボードから読み込み、'(L), '0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'(L,[[],[],[],[],[],[],[],[],[],[],[]],X),!. '全30件の成績(0〜100点)をキーボードから読み込み、'(L) :- findall(_点数,(for(1,N,30),write_formatted('第%t件目を入力してください : ',[N]),get_integer(_点数)),L). '0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'([],L,L) :- !. '0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'([_点数|R],L1,L) :- _要素位置 is _点数 // 10 + 1, '区間のならびに*を追加'(_要素位置,L1,L2), '0〜9点, 10〜19点,・・・, 90〜99点, 100点の11通りの区間にそれぞれ何人が入るか'(R,L2,L). '区間のならびに*を追加'(_要素位置,L1,L2) :- list_nth(_要素位置,L1,L), 要素番号によるならびの置換(_要素位置,[*|L],L1,L2). ヒストグラムで表わす(X) :- append(L0,[L|R],X), length(L0,N), N2 is N * 10, concat_atom(L,S), write_formatted('%t点 : %t\n',[N2,S]), R = [],!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/43 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10627.txt # 問題:2人のプレーヤーが1台のパソコンの前に座って、五目並べをするプログラムを # 次のステップ([1]〜[4])に従って作成しなさい。 # # [step1]'十','−’,'|’などの文字を使って五目並べをするための10行10列の格子枠をキャラク #    タモードで表示する。関数化(関数名waku)しておく。(注意:この格子枠を表示するのが #    難しければ、列を表す最上端の数字1〜1Oと、各行の左端に行を現す数字1〜10を表示 #    すること) # 1 2 ・・・・・10 # +−−−+−−−+・・・ # 1 | # + # 2 | # ・ #  ・ # 10 # [step2]メイン関数で”Aさん次の手を入力しなさい”とモニタに表示し、次の手を3_4↓のよ #   うに入力する。入力データを引数で関数wakuに渡し、関数側で格子枠の3行目4列目に’A’ #   を埋め込み,[step 1 ]で作成した格子枠とともに表示する。 #                3   4 # ・    ・   ・  #           ・  +−−−+−−−+ #           3 | | B | #             +−−−+−−−+ # # # [step3]AさんとBさんが交互に次の手を入力しながら、Aさんの手は'A'を、Bさんの手は'B'を #  枠内に埋め込み格子枠とともに表示する。この時、既に打たれた枠に入力した場合は再度入力 #  を促すようにする。 # [step4]更に、AさんとBさんが次の手を打つ毎に、そのデータを5個並んだか調べる関数(関数 #  名narabi)に渡し、縦、横、斜め方向に5個並んでいるか調べ、結果をメイン関数に返す。 5 #  個並んでいたらメイン関数側で”Aさんの勝ぢまたぱBさんの勝ぢと表示する。並んで #  いなければゲームを続ける。 # # 質問1 # :このプログラムは人間同士がディスプレイを単なる碁盤として使用し、五目並べを行う # プログラムである。このプログラムを修正して人間とコンピュータが対戦するようにするに # はどのような改良を加えなければならないか、考えて答えなさい。 初期盤面[ [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ']]. 五目並べ :- 初期盤面(_盤面), 五目並べ(A,_盤面). 五目並べ(A,_盤面) :- 次の手を入力する(A,_盤面,_行,_列,_更新された盤面), 五目並べ表示(_更新された盤面), 五目並べ評価(A,_行,_列,_更新された盤面). 五目並べ(B,_盤面) :- 次の手を入力する(B,_盤面,_行,_列,_更新された盤面), 五目並べ表示(_更新された盤面), 五目並べ評価(B,_行,_列,_更新された盤面). 五目並べ評価(_棋士,_盤面) :- 五目並べ完成(_棋士,_行,_列,_盤面), write_formatted('%tさんの勝ちです!\n',[_棋士]),!. 五目並べ評価(A,_,_,_盤面) :- 五目並べ(B,_盤面),!. 五目並べ評価(B,_,_,_盤面) :- 五目並べ(A,_盤面),!. 五目並べ完成(_棋士,_行,_列,_盤面) :- 五目並んだ状態とは(_棋士,_五目並んだ状態), 五目並んでいる(_五目並んだ状態,_行,_列,_盤面),!. 五目並んでいる(_五目並んだ状態,_行,_列,_盤面) :- 五目(_行,_列,L), findall(X,(member((A,B),L),I is A,J is B,list_nth(I,_盤面,L1),list_nth(J,L1,X)),_五目並んだ状態),!. 五目(_行,_列,[(_行,_列),(_行-1,_列+1),(_行-2,_列+2),(_行-3,_列+3),(_行-4,_列+4)]). 五目(_行,_列,[(_行+1,_列-1),(_行,_列),(_行-1,_列+1),(_行-2,_列+2),(_行-3,_列+3)]). 五目(_行,_列,[(_行+2,_列-2),(_行+1,_列-1),(_行,_列),(_行-1,_列+1),(_行-2,_列+2)]). 五目(_行,_列,[(_行+3,_列-3),(_行+2,_列-2),(_行+1,_列-1),(_行,_列),(_行-1,_列+1)]). 五目(_行,_列,[(_行+4,_列-4),(_行+3,_列-3),(_行+2,_列-2),(_行+1,_列-1),(_行,_列)]). % 五目(_行,_列,[(_行,_列),(_行+1,_列+1),(_行+2,_列+2),(_行+3,_列+3),(_行+4,_列+4)]). 五目(_行,_列,[(_行-1,_列-1),(_行,_列),(_行+1,_列+1),(_行+2,_列+2),(_行+3,_列+3)]). 五目(_行,_列,[(_行-2,_列-2),(_行-1,_列-1),(_行,_列),(_行+1,_列+1),(_行+2,_列+2)]). 五目(_行,_列,[(_行-3,_列-3),(_行-2,_列-2),(_行-1,_列-1),(_行,_列),(_行+1,_列+1)]). 五目(_行,_列,[(_行-4,_列-4),(_行-3,_列-3),(_行-2,_列-2),(_行-1,_列-1),(_行,_列)]). % 五目(_行,_列,[(_行,_列),(_行+1,_列),(_行+2,_列),(_行+3,_列),(_行+4,_列)]). 五目(_行,_列,[(_行-1,_列),(_行,_列),(_行+1,_列),(_行+2,_列),(_行+3,_列)]). 五目(_行,_列,[(_行-2,_列),(_行-1,_列),(_行,_列),(_行+1,_列),(_行+2,_列)]). 五目(_行,_列,[(_行-3,_列),(_行-2,_列),(_行-1,_列),(_行,_列),(_行+1,_列)]). 五目(_行,_列,[(_行-4,_列),(_行-3,_列),(_行-2,_列),(_行-1,_列),(_行,_列)]). % 五目(_行,_列,[(_行,_列),(_行,_列+1),(_行,_列+2),(_行,_列+3),(_行,_列+4)]). 五目(_行,_列,[(_行,_列-1),(_行,_列),(_行,_列+1),(_行,_列+2),(_行,_列+3)]). 五目(_行,_列,[(_行,_列-2),(_行,_列-1),(_行,_列),(_行,_列+1),(_行,_列+2)]). 五目(_行,_列,[(_行,_列-3),(_行,_列-2),(_行,_列-1),(_行,_列),(_行,_列+1)]). 五目(_行,_列,[(_行,_列-4),(_行,_列-3),(_行,_列-2),(_行,_列-1),(_行,_列)]). 五目並んだ状態とは(_棋士,[_棋士,_棋士,_棋士,_棋士,_棋士]). 次の手を入力する(_棋士,_盤面,_行,_列,_更新された盤面) :- write_formatted('%tさん次の手を入力しなさい : ',[_棋士]), get_split_line([' '],[_行,_列]), 盤面更新(_棋士,_行,_列,_盤面,_更新された盤面),!. 次の手を入力する(_棋士,_盤面,_行,_列,_更新された盤面) :- write('その手は既に石があり打てませんもう一度入力してください\n'), 次の手を入力する(_棋士,_盤面,_行,_列,_更新された盤面). 盤面更新(_棋士,_行,_列,_盤面,_更新された盤面) :- list_nth(_行,_盤面,L), 要素番号によるならびの置換(_列,_棋士,L,L1), 要素番号によるならびの置換(_行,L1,_盤面,_更新された盤面),!. 五目並べ盤面表示(_盤面) :- 五目並べ横罫, 五目並べ表示(1,_盤面),!. 五目並べ横罫 :- write('  +−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+\n'). 五目並べ表示(_,[]) :- !. 五目並べ表示(N,[_行|R]) :- 半角全角数字変換(N,NS), write_formatted('%t',[NS]), 五目並べ行表示(_行), 五目並べ横罫, N2 is N + 1, 五目並べ表示(N2,R). 五目並べ行表示([]) :- write('|\n'),!. 五目並べ行表示([A|R]) :- write('| %t ',[A]),五目並べ行表示(R). 半角全角数字変換(1,' 1'). 半角全角数字変換(2,' 2'). 半角全角数字変換(3,' 3'). 半角全角数字変換(4,' 4'). 半角全角数字変換(5,' 5'). 半角全角数字変換(6,' 6'). 半角全角数字変換(7,' 7'). 半角全角数字変換(8,' 8'). 半角全角数字変換(9,' 9'). 半角全角数字変換(10,'10'). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/5 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 以下の実行結果になるようおねがいします # # 文字列を入力してください # adlkjgeiakdalf # # 確認したい文字を入力してください # a # # 文字(a)の数は3文字です # 入力された文字列の中にある文字が何個含まれるか :- 文字列を入力してください(_文字列), 確認したい文字を入力してください(_文字), count(sub_atom(_文字列,_,1,_,_文字),_何個), 整数を全角文字表現に変換する(_何個,_何個の全角文字表現), write_formatted('文字(%t)の数は%t文字です\n',[_何個,_回数の全角文字表現]). 文字列を入力してください(_文字列) :- write('文字列を入力してください\n'), get_line(_文字列). 確認したい文字を入力してください(_文字) :- write('確認したい文字を入力してください\n'), get_line(_文字列), sub_atom(_文字列,0,1,_,_文字),!. 整数を全角文字表現に変換する(_整数,_整数の全角文字表現) :- number_chars(_整数,Chars), findall(_全角文字,( member(A,Chars), list_nth(N,['1','2','3','4','5','6','7','8','9','0'],A), list_nth(N,['1','2','3','4','5','6','7','8','9','0'],_全角文字)), L), concat_atom(L,_整数の全角表現). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/976 # # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10619.txt # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10620.txt # # 「三目並べのプログラムを作る」 # 2人のプレーヤーが1台のパソコンの前に座り、交互に(○、×)を置いてい<。 # 次にどこに置<かは3×3の配列内の行と列を表す数字(座標)を順に入力して # 行<。○と×を置くたびに、3個並んだかを調べる。そして、縦、横、斜め方向 # のいずれかに先に3個並んだ方が勝ちとして、結果を表示する。このような要求 # を満たすような、2人で3目並べをするプログラムを作りなさい。 三目ならべ :- 三目ならべ(○,[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']]). 三目ならべ(_手番,LL) :- 勝ちパターン(LL), write_formatted('%tの勝ちです\n',[_手番]),!. 三目ならべ(_手番,LL) :- flat(LL,L), \+(member(' ',L)), write('引き分けです\n'),!. 三目ならべ(○,LL) :- 次の着手(×,_行,_列), list_nth(_行,LL,L2), list_nth(_列,L1,' '), ならびの位置指定置換(_列,×,L1,L2). ならびの位置指定置換(_行,L2,LL,LL2), 三目ならべ(×,LL2). 三目ならべ(×,LL) :- 次の着手(○,_行,_列), list_nth(_行,LL,L1), list_nth(_列,L1,' '), ならびの位置指定置換(_列,○,L1,L2), ならびの位置指定置換(_行,L2,LL,LL2), 三目ならべ(○,LL2). 次の着手(_手番,_行,_列) :- repeat, write_formatted('%tの手番です。行,列を入力してください : ',[_手番]), get_line(Line), split(Line,[' ',','],[_行,_列]),!. 勝ちパターン([[○,○,○],_,_]). 勝ちパターン([_,[○,○,○],_]). 勝ちパターン([_,_,[○,○,○]). 勝ちパターン([[○,_,_],[○,_,_],[○,_,_]]). 勝ちパターン([[_,○,_],[_,○,_],[_,○,_]]). 勝ちパターン([[_,_,○],[_,_,○],[_,_,○]]). 勝ちパターン([[○,_,_],[_,○,_],[_,_,○]]). 勝ちパターン([[_,_,○],[_,○,_],[○,_,_]]). 勝ちパターン([[×,×,×],_,_]). 勝ちパターン([_,[×,×,×],_]). 勝ちパターン([_,_,[×,×,×]). 勝ちパターン([[×,_,_],[×,_,_],[×,_,_]]). 勝ちパターン([[_,×,_],[_,×,_],[_,×,_]]). 勝ちパターン([[_,_,×],[_,_,×],[_,_,×]]). 勝ちパターン([[×,_,_],[_,×,_],[_,_,×]]). 勝ちパターン([[_,_,×],[_,×,_],[×,_,_]]). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/944 # # num0からnum50までの連番でフィールドがあるのですが、 # この中で、レコードの値が0より大きいものをSELECTするにはどうしたらいいでしょうか? # ワイルドカード的な書き方はないのでしょうか? 'num0からnum50までの連番でフィールドの中で0より大きいものを選択'(L) :- フィールド名の連番を作る(_フィールド名ならび), 選択項を変数引数で構成し(_選択項,_引数ならび), call(P), findall([_フィールド名,_値], フィールドの中で0より大きいもの(_フィールド名ならび,_引数ならび,_フィールド名,_値), L). フィールドの中で0より大きいもの(_フィールド名ならび,L2,_フィールド名,_値) :- for(1,M,51), list_nth(M,L2,_値), _値 > 0, list_nth(M,_フィールド名ならび,_フィールド名). フィールド名の連番を作る(_フィールド名ならび) :- findall(S,(for(0,N,50),concat_atom([num,N],S)),_フィールド名ならび). 選択項を変数引数で構成し(_選択項,_変数ならび) :- length(_変数ならび,51), _選択項 =.. [テーブル|_変数ならび]. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1273368706/94 # # 9×9の2次元配列を3×3の小さなブロック9個で区切り左上から # 0,1,2, # 3,4,5, # 6,7,8,と番号をつけるとします。 # 各番号のブロックにある数字を足し、1次元の配列にブロック内の数の合計を保存したいです。 # 以下のプログラムを書いた場合、1次元の配列の添え字を工夫すると簡単にプログラミングできる # と聞いたのですが、どうしても思いつきません。アドバイスお願いします。 # # (i=0;i<10;i++) # (j=0;j<10;j++) # total[ここの添え字を工夫]=data[i][j]; # # totalを2次元配列にする方法は思いつくのですが、1次元に保存する方法がどうしてもわかりません。 # よろしくお願いします。 各ブロックの合計数を保存する(_9マス,_保存する合計値ならび) :- findall(S,( '9×9の2次元配列を3×3の小さなブロック9個で区切り左上から\n0,1,2,\n3,4,5,\n6,7,8,と番号をつけるとします。'(N,_9マス,_3マス), flat(_3マス,L1), 加算(L1,Sum), S is truncate(Sum)), _保存する合計値ならび). '9×9の2次元配列を3×3の小さなブロック9個で区切り左上から\n0,1,2,\n3,4,5,\n6,7,8,と番号をつけるとします。'(N,_9マス,_3マス) :- for(0,N,8), U is (N // 3) * 3, U1 is U + 1, U2 is U1 + 2, V is (N mod 3) * 3, V1 is V + 1, V2 is V1 + 2, findall(L1, ( for(U1,M,U2),list_nth(M,_9マス,L), findall(A,(for(V1,M2,V2),list_nth(M2,L,A)),L1)), _3マス). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/426 # # [1] 授業単元:プログラム # [2] 問題文(含コード&リンク):sample.txtを読み込み、データを身長の小さい人から順番に並び変えてans.txtに出力せよ。 # # sample.txtの中身はこんな感じです。 # 12 ヤマダタロウ 56.7 165.1 # 43 タナカハナコ 44.3 156.8 # 54 スズキイチロウ 70.3 179.2 # 左から番号、名前、体重、身長です # 'sample.txtを読み込み、データを身長の小さい人から順番に並び変えてans.txtに出力せよ' :-    get_split_lines('sample.txt',[' '],Ls),    findall([_身長|L1],(member(L1,Ls),list_nth(4,L1,_身長)),Ls2),    sort(Ls2,Ls3),    findall(L2,member([_|L2],Ls3),_整列されたLs),    put_lines('ans.txt',_整列されたLs). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 鍵項目位置(身長,[_,_,_,_身長],[_身長]). % 鍵項目位置(体重,[_,_,_体重,_],[_体重]). % 鍵項目位置(身長・体重,[_,_,_体重,_身長],[_身長,_体重]). '鍵項目順に整列(昇順)の一般解'(Ls,_鍵名,_整列されたLs) :- findall(L2,(member(L1,Ls),先頭に鍵項目を付加する(_鍵名,L1,L2)),Ls2), sort(Ls2,Ls3), findall(L4,(member(L3,Ls3),先頭の鍵項目を除去する(_鍵名,L3,L4)),_整列されたLs). 先頭に鍵項目を付加する(_鍵名,L1,L2) :- 鍵項目位置(_鍵名,L1,L0), append(L0,L1,L2). 先頭の鍵項目を除去する(_鍵名,L1,L2) :- 鍵項目位置(_鍵名,L2,L0), append(L0,L2,L1). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/243 # # [1] 授業単元: 3DGAME # [2] 問題文:下記 # 学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力しファイルに出力する。(カンマ区切り) # 入力したファイルを読み取り、メニューを作成し次の処理を行えるようにする。 # ・ 学生番号で昇順、降順に並べ替えてファイルに出力する。 # ・ 氏名で昇順、降順に並び替えてファイルに出力する。 # ・ 点数で昇順、降順に並び替えてファイルに出力する。 # ・ 各項目について修正を行えるようにする。 # ・ 点数の平均を画面に出力する。 # ・ クラス別に学生番号で昇順、降順を指定してファイルに出力する。 # # 【画面例】 # <メニュー> # 1 学生番号で並び替え 2.氏名で並び替え # 3.点数で並び替え 4.修正 # 5.平均の出力 6.クラス別で出力 # ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー # メニュー番号=>  # 【データ】 # 学生番号 8桁   # 氏名  12桁  # カナ  12桁 # 点数   3桁(小数点第1まで)  # クラス  3桁 # 12000001, 田中太郎, タナカタロウ, 40.5, 003 '学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力しファイルに出力する。(カンマ区切り)'(_出力ファイル) :- open(_出力ファイル,append,Output), '学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力し'(_学生番号,_氏名,_カナ,_点数,_クラス), write_formatted(Output,'%t,%t,%t,%t\n',[_学生番号,_氏名,_カナ,_点数,_クラス]), close(Output),!. '学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力し'(_学生番号,_氏名,_カナ,_点数,_クラス):- write('ガイドに従って入力し改行してください\n学生番号 : '),get_line(_学生番号), write('氏名 : '),get_line(_氏名), write('カナ : '),get_line(_カナ), write('点数(少数第一位まで) : '),get_line(_点数文字列), atom_to_term(_点数文字列,_点数,_), write('クラス(3桁) : '),get_line(クラス),!. メニューに示された機能を選択して実行するパターン(_ファイル名) :- get_split_lines(_ファイル名,[','],L), メニューに示された機能を実行する(_ファイル名,L). メニューに示された機能を実行する(_ファイル名,L) :- メニュー画面, write('メニュー番号=> '), get_integer(N), 機能選択(_ファイル名,N,L,_診断), 診断(_診断),!. メニューに示された機能を実行する(_ファイル名,L) :- メニューに示された機能を実行する(_ファイル名,L). 機能選択(0,_,_,終了) :- !. 機能選択(1,_ファイル名,L,_診断) :- 学生番号で並び替え(_ファイル名,L,_診断). 機能選択(2,_ファイル名,L,_診断) :- 氏名で並び替え(_ファイル名,L,_診断). 機能選択(3,_ファイル名,L,_診断) :- 点数で並び替え(_ファイル名,L,_診断). 機能選択(4,_ファイル名,L,_診断) :- 修正(_ファイル名,L,_診断). 機能選択(5,_,L,_診断) :- 平均の出力(L,_診断), 機能選択(6,_,L,_診断) :- クラス別で出力(L,_診断). 診断(終了) :- !. メニュー画面 :- write('0 終了 \n'), write('1 学生番号で並び替え 2.氏名で並び替え \n'), write('3.点数で並び替え 4.修正 \n'), write('5.平均の出力 6.クラス別で出力 \n'), write('ーーーーーーーーーーーーーーーー\n'). 学生番号で並び替え(_ファイル名,L,_診断) :- 並べ替え(_ファイル名,1,L,_診断). 点数で並び替え(_ファイル名,L,_診断) :- 並べ替え(_ファイル名,4,L,_診断). 修正(_ファイル名,L,正常終了) :- write('[_学生番号,_氏名,_カナ,_点数,_クラス] の形式で入力して対象レコードを指定してください : '), get_line(Line), atom_to_term(Line,[_学生番号,_氏名,_カナ,_点数,_クラス],_), 修正(_ファイル名,[_学生番号,_氏名,_カナ,_点数,_クラス],L,L2,_), open(_ファイル名,write,Output), カンマならび出力(Output,L2), close(Output),!. 修正(_,L,L,打ち切り) :- !. 修正(_,[],[],_診断) :- !. 修正([_学生番号,_氏名,_カナ,_点数,_クラス],[[_学生番号,_氏名,_カナ,_点数,_クラス]|R1],[L|R2],_診断) :- write('[_学生番号,_氏名,_カナ,_点数,_クラス] の形式で正確に入力して修正してください : '), get_line(Line), atom_to_term(Line,L,_), 打ち切り診断(L,_診断), 修正([_学生番号,_氏名,_カナ,_点数,_クラス],R1,R2,_診断),!. 修正([_学生番号,_氏名,_カナ,_点数,_クラス],[L|R1],[L|R2]_診断) :- 修正([_学生番号,_氏名,_カナ,_点数,_クラス],R1,R2,_診断). 打ち切り診断([_|_],_診断) :- !. 打ち切り診断(Atom,打ち切り) :- atomic(Atom). 平均の出力(L,正常終了) :- findavg(_点数,(memer(L0,L),list_nth(4,L0,_点数)),_平均点), write_formatted('平均点は %t です\n',[_平均点]). クラス別で出力(L,正常終了) :- write('クラスを指定してください : ', get_line(_クラス), findall(L0,(member(L0,L),list_nth(5,L0,_クラス)),L2), カンマならび出力(L2). 並べ替え(_ファイル名,N,L,正常終了). findall([A|L1],(member(L1,L),list_nth(N,L1,A)),L2), sort(L2,L3), open(_ファイル名,write,Output), カンマならび出力(Output,L2), close(Output),!. カンマならび出力(Output,[]) :- !. カンマならび出力(Output,[[_|L1]|R]) :- concat_atom(L1,',',S), write_formatted(Output,'%t\n',[S]), カンマならび出力(Output,R). カンマならび出力([]) :- !. カンマならび出力([[_|L1]|R]) :- concat_atom(L1,',',S), write_formatted('%t\n',[S]), カンマならび出力(R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/381 # # [1] 授業単元: 情報工学:数理I # [2] 問題文(含コード&リンク): ガウス行列を既約ガウス行列に変形する関数を定義せよ % *** user: '既約ガウス行列に変形' / 5 *** '既約ガウス行列に変形'(N,0,_,_行列,_行列) :- !. '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列1,_行列). '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), /* '行基本変形3の適用'(A,B,M,N,_行列1,_行列2), */ '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列2,_行列). % *** user: '既約ガウス行列に変形' / 3 *** '既約ガウス行列に変形'(1,_既約ガウス行列,_既約ガウス行列) :- !. '既約ガウス行列に変形'(N,_ガウス行列,_既約ガウス行列) :- list_nth(N,_ガウス行列,L0), '最初に現れる0ではない要素・位置'(1,L0,_列,Y), M is N - 1, list_nth(M,_ガウス行列,L), '既約ガウス行列に変形'(_列,M,Y,_ガウス行列,G1), N2 is N - 1, '既約ガウス行列に変形'(N2,G1,_既約ガウス行列),!. % *** user: '既約ガウス行列に変形' / 2 *** '既約ガウス行列に変形'(_ガウス行列,_既約ガウス行列) :- length(_ガウス行列,Len), '既約ガウス行列に変形'(Len,_ガウス行列,G1), '既約ガウス行列に変形の二'(1,Len,G1,_既約ガウス行列). 既約ガウス行列に変形の二(N,Len,_既約ガウス行列,_既約ガウス行列) :- N > Len,!. 既約ガウス行列に変形の二(N,Len,G,_既約ガウス行列) :- list_nth(N,G,_行), list_nth(N,_行,A), 行基本変形(1 / A # N,G,G1), N2 is N + 1, 既約ガウス行列に変形の二(N2,Len,G1,_既約ガウス行列). % *** user: 行基本変形3の適用 / 7 *** 行基本変形3の適用(A,B,M,N,_行列1,_行列2,N2) :- B >= 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M-N1#N,_行列1,_行列2),!. 行基本変形3の適用(A,B,M,N,_行列1,_行列2,N2) :- B < 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M+N1#N,_行列1,_行列2),!. % *** user: 行基本変形3の適用 / 6 *** 行基本変形3の適用(A,B,M,N,_行列1,_行列2) :- B >= 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M-N1#N,_行列1,_行列2),!. 行基本変形3の適用(A,B,M,N,_行列1,_行列2) :- B < 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M+N1#N,_行列1,_行列2),!. % *** user: '行基本変形' / 5 *** '行基本変形'(*,_乗数,_行目,_行列,X) :- '行基本変形'(*,_乗数,1,_行目,_行列,X) . % *** user: '行基本変形' / 3 *** '行基本変形'(_行列式,_行列,X) :- atom(_行列式), \+(_行列式 = []), & '行列式変換' # [2|pro], '行列式述語変換'(_行列式,P), '行基本変形'(P,_行列,X),!. '行基本変形'([],_行列,[]) :-!. '行基本変形'([N|R1],_行列,[L|R2]) :- !, list_nth(N,_行列,L), '行基本変形'(R1,_行列,R2),!. '行基本変形'(# _行目1 # _行目2,_行列,X) :- list_nth(_行目1,_行列,_行1), list_nth(_行目2,_行列,_行2), 'ならびの位置指定置換'(_行目2,_行1,_行列,_行列1), 'ならびの位置指定置換'(_行目1,_行2,_行列1,X),!. '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 >= 0, !, _乗数3 is -1 * _乗数2, '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X),!. '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 < 0, _乗数3 is _乗数1 * (-1), !, '行基本変形'(_乗数3 # _行目1 + _乗数2 # _行目2,_行列,X),!. '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 >= 0, _乗数3 is _乗数1 * (-1), !, '行基本変形'(_乗数3 # _行目1 + _乗数2 # _行目2,_行列,X),!. '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 < 0, !, _乗数3 is -1 * _乗数2, '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X),!. '行基本変形'(_乗数1 # _行目1 + _乗数2 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行1) , U is A * _乗数1),_乗算された行1), findall(W,(member(B,_行2) , W is B * _乗数2),_乗算された行2), '型推論加算'([_乗算された行1,_乗算された行2],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. '行基本変形'(# _行目1 + _乗数 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数),_乗算された行), '型推論加算'([_乗算された行,_行1],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. '行基本変形'(# _行目1 - _乗数 # _行目2,_行列,X) :- !, _乗数2 is -1 * _乗数, '行基本変形'(# _行目1 + _乗数2 * _行目2,_行列,X),!. '行基本変形'(# _行目1 + _乗数 / _除数 * _行目2,_行列,X) :- integer(_除数), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 // _除数),_除算された行), '型推論加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. '行基本変形'(# _行目1 + _乗数 / _除数 # _行目2,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 / _除数),_除算された行), '型推論加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. '行基本変形'(# _行目1 - _乗数 / _除数 # _行目2,_行列,X) :- !, _除数2 is -1 * _除数, '行基本変形'(# _行目1 + _乗数 / _除数2 * _行目2,_行列,X),!. '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- integer(_除数), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 // _除数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 / _除数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. '行基本変形'(_乗数 # _行目,_行列,X) :- !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. % *** user: 行基本変形 / 5 *** 行基本変形(*,_乗数,_行目,_行列,X) :- 行基本変形(*,_乗数,1,_行目,_行列,X). % *** user: 行基本変形 / 6 *** 行基本変形(*,_乗数,_行目,_行目,[_行1|R1],[_行2|R1]) :- findall(X,(member(A,_行1) , X is A * _乗数),_行2) . 行基本変形(*,_乗数,M,_行目,[_行|R1],[_行|R2]) :- M2 is M + 1, 行基本変形(*,_乗数,M2,_行目,R1,R2). % *** user: 正方行列の行列式の値 / 2 *** 正方行列の行列式の値(_正方行列,_行列式の値) :- ガウス行列に変形(_正方行列,X,Y), '行列式|C|の値'(X,Z1), ならびの積(Y,Z2), _行列式の値 is Z1 // Z2. % *** user: ならびの積 / 2 *** ならびの積([A],A) :- !. ならびの積([A|R],X) :- ならびの積(R,Y), X is A * Y. % *** user: '行列式|C|の値' / 2 *** '行列式|C|の値'(_行列,_値) :- length(_行列,Len), findall(U,(for(1,N,Len) , list_nth(N,_行列,_行) , list_nth(N,_行,U)),L), ならびの積(L,_値). 要素がゼロ以外に出会うまで([A|R],[],[A|R]) :- \+((A = 0;A=0.0)),!. 要素がゼロ以外に出会うまで([0|R],[0|R1],R2) :- 要素がゼロ以外に出会うまで(R,R1,R2). 要素がゼロ以外に出会うまで([0.0|R],[0.0|R1],R2) :- 要素がゼロ以外に出会うまで(R,R1,R2). 最初に現れる0ではない要素・位置(Nth,[X|_],Nth,X) :- \+((X = 0;X=0.0)),!. 最初に現れる0ではない要素・位置(Mth,[0|R],Nth,X) :- Mth_2 is Mth + 1, 最初に現れる0ではない要素・位置(Mth_2,R,Nth,X) . 最初に現れる0ではない要素・位置(Mth,[0.0|R],Nth,X) :- Mth_2 is Mth + 1, 最初に現れる0ではない要素・位置(Mth_2,R,Nth,X) . % *** user: ならびの位置指定置換 / 4 *** ならびの位置指定置換(1,A,[_|R],[A|R]) :- !. ならびの位置指定置換(N,A,[B|R1],[B|R2]) :- N1 is N - 1, ならびの位置指定置換(N1,A,R1,R2) . 最小公倍数(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),!. 最小公倍数_2([],_) :- !. 最小公倍数_2([N * A|R],Y) :- N is Y // A, 最小公倍数_2(R,Y),!. 最小公倍数_2([A|R],Y) :- integer(A), 最小公倍数_2(R,Y),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). % 以下のサイトは % *** user: '行基本変形' / 5 *** '行基本変形'(*,_乗数,_行目,_行列,X) :- '行基本変形'(*,_乗数,1,_行目,_行列,X) . % *** user: '行基本変形' / 3 *** '行基本変形'(_行列式,_行列,X) :- atom(_行列式), \+(_行列式 = []), & '行列式変換' # [2|pro], '行列式述語変換'(_行列式,P), '行基本変形'(P,_行列,X), ! . '行基本変形'([],_行列,[]) :- ! . '行基本変形'([N|R1],_行列,[L|R2]) :- !, list_nth(N,_行列,L), '行基本変形'(R1,_行列,R2), ! . '行基本変形'(# _行目1 # _行目2,_行列,X) :- list_nth(_行目1,_行列,_行1), list_nth(_行目2,_行列,_行2), 'ならびの位置指定置換'(_行目2,_行1,_行列,_行列1), 'ならびの位置指定置換'(_行目1,_行2,_行列1,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 >= 0, !, _乗数3 is -1 * _乗数2, '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 < 0, _乗数3 is _乗数1 * (-1), !, '行基本変形'(_乗数3 # _行目1 + _乗数2 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 >= 0, _乗数3 is _乗数1 * (-1), !, '行基本変形'(_乗数3 # _行目1 + _乗数2 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 < 0, !, _乗数3 is -1 * _乗数2, '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 + _乗数2 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行1) , U is A * _乗数1),_乗算された行1), findall(W,(member(B,_行2) , W is B * _乗数2),_乗算された行2), '型推論加算'([_乗算された行1,_乗算された行2],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数),_乗算された行), '型推論加算'([_乗算された行,_行1],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 - _乗数 # _行目2,_行列,X) :- !, _乗数2 is -1 * _乗数, '行基本変形'(# _行目1 + _乗数2 * _行目2,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 / _除数 * _行目2,_行列,X) :- integer(_除数), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 // _除数),_除算された行), '型推論加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 / _除数 # _行目2,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 / _除数),_除算された行), '型推論加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 - _乗数 / _除数 # _行目2,_行列,X) :- !, _除数2 is -1 * _除数, '行基本変形'(# _行目1 + _乗数 / _除数2 * _行目2,_行列,X), ! . '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- integer(_除数), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 // _除数),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 / _除数),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . '行基本変形'(_乗数 # _行目,_行列,X) :- !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . 行基本変形3(_行目1,*,_乗数,_行目2,_行列,X) :- list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行1),U is A * _乗数),_乗算された行), list_nth(_行目2,_行列,_行2), 加算([_乗算された行,_行2],_加算された行), replace_nth(1,_行目2,_加算された行,_行列,X),!. % *** user: '既約ガウス行列' / 1 *** '既約ガウス行列'(_行列) :- '既約ガウス行列の一'([],_行列), '行列の転置'(_行列,_転置された行列), '既約ガウス行列検査'(_転置された行列). % *** user: '既約ガウス行列' / 2 *** '既約ガウス行列'(_,[]) :- ! . '既約ガウス行列'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,[1|_]), '既約ガウス行列'([0|P1],R) . 既約ガウス行列の一([_行]) :- 零以外の最初の要素が1(_行),!. 既約ガウス行列の一([_行|R]) :- 零以外の最初の要素が1(_行), 既約ガウス行列の一(R). % *** user: '既約ガウス行列の一' / 2 *** '既約ガウス行列の一'(_,[]) :- ! . '既約ガウス行列の一'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,[1|_]), '既約ガウス行列の一'([0|P1],R) . 単位行列(_単位行列,N) :- findall(L,(length(L,N),append(L1,[1|R],L),all(L1,0),all(R,0)),_単位行列),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/162 # # [1] 授業単元:数値計算 # [2] 問題文(含コード&リンク):の連立1次方程式の解をガウスの消去法用いて解くプログラムを作成しなさい。 #    (この行列を使用してください # {{10,-9,0,0,0,0,0,0}, # {-9,17,-8,0,0,0,0,0}, # {0,-8,17,-9,0,0,0,0}, # {0,0-9,13,-4,0,0,0}, # {0,0,0,-4,12,-8,0,0}, # {0,0,0,0,-8,10,-2,0}, # {0,0,0,0,0,-2,2,7}} % 以下の定義では必ずしもこの問題に必要としない行列処理の述語定義も含んで % います。 問題の行列([[10,-9,0,0,0,0,0,0], [-9,17,-8,0,0,0,0,0], [0,-8,17,-9,0,0,0,0], [0,0-9,13,-4,0,0,0], [0,0,0,-4,12,-8,0,0], [0,0,0,0,-8,10,-2,0], [0,0,0,0,0,-2,2,7]]). t310(_解ならび) :- 問題の行列(_問題の行列), 既約ガウス行列に変形(_問題の行列,_既約ガウス行列), findall(X,(member(L,_既約ガウス行列),last(L,X)),_解ならび). ガウス行列(_,[]) :- !. ガウス行列(L,[_行|R]) :- append(L,_,_行), 要素がゼロ以外に出会うまで(_行,P1,_), ガウス行列([0|P1],R). ガウス行列(_,[]) :- !. ガウス行列(L,[_行|R]) :- append(L,_,_行), 要素がゼロ以外に出会うまで(_行,P1,_), ガウス行列([0|P1],R). ガウス行列(_行列) :- ガウス行列([],_行列). % *** user: 'ガウス行列に変形' / 7 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列,[]) :- M > Len,!. 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X,UL),!. 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), B = 0, M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X,UL),!. 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[(-1)|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X,R),!. 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N1|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 >= 0,!, '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R),!. 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N3|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 < 0,!, N3 is N1 * (-1), '行基本変形'(N3 # M + N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R),!. % *** user: 'ガウス行列に変形' / 6 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列) :- M > Len,!. 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X),!. 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), B = 0, M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X),!. 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X),!. 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X),!. % *** user: ガウス行列に変形 / 5 *** ガウス行列に変形(N,Len,X,X,[]) :- N >= Len,!. ガウス行列に変形(N,Len,_行列1,X,UL) :- list_nth(N,_行列1,_行), list_nth(N,_行,A), M is N + 1, ガウス行列に変形(N,M,Len,A,_行列1,_行列2,UL1), N2 is N + 1, ガウス行列に変形(N2,Len,_行列2,X,UL2), append(UL1,UL2,UL). % *** user: ガウス行列に変形 / 4 *** ガウス行列に変形(N,Len,X,X) :- N >= Len,!. ガウス行列に変形(N,Len,_行列1,X) :- list_nth(N,_行列1,_行), list_nth(N,_行,A), M is N + 1, ガウス行列に変形(N,M,Len,A,_行列1,_行列2), N2 is N + 1, ガウス行列に変形(N2,Len,_行列2,X). % *** user: ガウス行列に変形 / 3 *** ガウス行列に変形(_行列,_ガウス行列,UL) :- length(_行列,Len), ガウス行列に変形(1,Len,_行列,_ガウス行列,UL). % *** user: ガウス行列に変形 / 2 *** ガウス行列に変形(_行列,_ガウス行列) :- length(_行列,Len), ガウス行列に変形(1,Len,_行列,_ガウス行列). 既約ガウス行列に変形(_ガウス行列,_既約ガウス行列) :- length(_ガウス行列,Len), 既約ガウス行列に変形(Len,_ガウス行列,G1), 既約ガウス行列に変形の二(1,Len,G1,_既約ガウス行列). % *** user: '既約ガウス行列に変形' / 5 *** '既約ガウス行列に変形'(N,0,_,_行列,_行列) :- !. '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列1,_行列). '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), /* '行基本変形3の適用'(A,B,M,N,_行列1,_行列2), */ '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列2,_行列). % *** user: '既約ガウス行列に変形' / 3 *** '既約ガウス行列に変形'(1,_既約ガウス行列,_既約ガウス行列) :- !. '既約ガウス行列に変形'(N,_ガウス行列,_既約ガウス行列) :- list_nth(N,_ガウス行列,L0), '最初に現れる0ではない要素・位置'(1,L0,_列,Y), M is N - 1, list_nth(M,_ガウス行列,L), '既約ガウス行列に変形'(_列,M,N,Y,_ガウス行列,G1), N2 is N - 1, '既約ガウス行列に変形'(N2,G1,_既約ガウス行列),!. % *** user: '既約ガウス行列に変形' / 2 *** 既約ガウス行列に変形(_行列,_既約ガウス行列) :- \+(ガウス行列(_行列)), ガウス行列に変形(_行列,_ガウス行列), 既約ガウス行列に変形(_ガウス行列,_既約ガウス行列),!. 既約ガウス行列に変形(_ガウス行列,_既約ガウス行列) :- length(_ガウス行列,Len), 既約ガウス行列に変形(Len,_ガウス行列,G1), 既約ガウス行列に変形の二(1,Len,G1,_既約ガウス行列). % *** user: '既約ガウス行列に変形の二' / 4 *** 既約ガウス行列に変形の二(N,Len,_既約ガウス行列,_既約ガウス行列) :- N > Len,!. 既約ガウス行列に変形の二(N,Len,G,_既約ガウス行列) :- list_nth(N,G,_行), list_nth(N,_行,A), 行基本変形(1 / A # N,G,G1), N2 is N + 1, 既約ガウス行列に変形の二(N2,Len,G1,_既約ガウス行列). % *** user: 行基本変形3の適用 / 7 *** 行基本変形3の適用(A,B,M,N,_行列1,_行列2,N2) :- B >= 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M-N1#N,_行列1,_行列2),!. 行基本変形3の適用(A,B,M,N,_行列1,_行列2,N2) :- B < 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M+N1#N,_行列1,_行列2),!. % *** user: 行基本変形3の適用 / 6 *** 行基本変形3の適用(A,B,M,N,_行列1,_行列2) :- B >= 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M-N1#N,_行列1,_行列2),!. 行基本変形3の適用(A,B,M,N,_行列1,_行列2) :- B < 0, A2 is abs(A), B2 is abs(B), 最小公倍数(N1 * A2,N2 * B2,_), 行基本変形(N2#M+N1#N,_行列1,_行列2),!. % *** user: 行基本変形 / 3 *** 行基本変形(_行列式,_行列,X) :- atom(_行列式), \+(_行列式 = []), & 行列式変換#2.pro, 行列式述語変換(_行列式,P), 行基本変形(P,_行列,X),!. 行基本変形([],_行列,[]) :- !. 行基本変形([N|R1],_行列,[L|R2]) :- !, list_nth(N,_行列,L), 行基本変形(R1,_行列,R2),!. '行基本変形'(# _行目1 # _行目2,_行列,X) :- list_nth(_行目1,_行列,_行1), list_nth(_行目2,_行列,_行2), ならびの位置指定置換(_行目2,_行1,_行列,_行列1), ならびの位置指定置換(_行目1,_行2,_行列1,X),!. 行基本変形(_乗数1 # _行目1 + _乗数2 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行1) , U is A * _乗数1),_乗算された行1), findall(W,(member(B,_行2) , W is B * _乗数2),_乗算された行2), 型推論加算([_乗算された行1,_乗算された行2],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. 行基本変形(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- !, _乗数3 is -1 * _乗数2, 行基本変形(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X),!. 行基本変形( # _行目1 + _乗数 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数),_乗算された行), 型推論加算([_乗算された行,_行1],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. 行基本変形( # _行目1 - _乗数 # _行目2,_行列,X) :- !, _乗数2 is -1 * _乗数, 行基本変形( # _行目1 + _乗数2 * _行目2,_行列,X),!. 行基本変形( # _行目1 + _乗数 / _除数 * _行目2,_行列,X) :- integer(_除数), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 // _除数),_除算された行), 型推論加算([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. 行基本変形( # _行目1 + _乗数 / _除数 # _行目2,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , U is A * _乗数 / _除数),_除算された行), 型推論加算([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X),!. 行基本変形( # _行目1 - _乗数 / _除数 # _行目2,_行列,X) :- !, _除数2 is -1 * _除数, 行基本変形( # _行目1 + _乗数 / _除数2 * _行目2,_行列,X),!. 行基本変形(_乗数 / _除数 # _行目,_行列,X) :- integer(_除数), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 // _除数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. 行基本変形(_乗数 / _除数 # _行目,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数 / _除数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. 行基本変形(_乗数 # _行目,_行列,X) :- !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , X is A * _乗数),_行2), replace_nth(1,_行目,_行2,_行列,X),!. % *** user: 行基本変形 / 5 *** 行基本変形(*,_乗数,_行目,_行列,X) :- 行基本変形(*,_乗数,1,_行目,_行列,X). % *** user: 行基本変形 / 6 *** 行基本変形(*,_乗数,_行目,_行目,[_行1|R1],[_行2|R1]) :- findall(X,(member(A,_行1) , X is A * _乗数),_行2) . 行基本変形(*,_乗数,M,_行目,[_行|R1],[_行|R2]) :- M2 is M + 1, 行基本変形(*,_乗数,M2,_行目,R1,R2). % *** user: 正方行列の行列式の値 / 2 *** 正方行列の行列式の値(_正方行列,_行列式の値) :- ガウス行列に変形(_正方行列,X,Y), '行列式|C|の値'(X,Z1), ならびの積(Y,Z2), _行列式の値 is Z1 // Z2. % *** user: ならびの積 / 2 *** ならびの積([A],A) :- !. ならびの積([A|R],X) :- ならびの積(R,Y), X is A * Y. % *** user: '行列式|C|の値' / 2 *** '行列式|C|の値'(_行列,_値) :- length(_行列,Len), findall(U,(for(1,N,Len) , list_nth(N,_行列,_行) , list_nth(N,_行,U)),L), ならびの積(L,_値). 要素がゼロ以外に出会うまで([A|R],[],[A|R]) :- \+((A = 0;A=0.0)),!. 要素がゼロ以外に出会うまで([0|R],[0|R1],R2) :- 要素がゼロ以外に出会うまで(R,R1,R2). 要素がゼロ以外に出会うまで([0.0|R],[0.0|R1],R2) :- 要素がゼロ以外に出会うまで(R,R1,R2). 最初に現れる0ではない要素・位置(Nth,[X|_],Nth,X) :- \+((X = 0;X=0.0)),!. 最初に現れる0ではない要素・位置(Mth,[0|R],Nth,X) :- Mth_2 is Mth + 1, 最初に現れる0ではない要素・位置(Mth_2,R,Nth,X). 最初に現れる0ではない要素・位置(Mth,[0.0|R],Nth,X) :- Mth_2 is Mth + 1, 最初に現れる0ではない要素・位置(Mth_2,R,Nth,X). % *** user: ならびの位置指定置換 / 4 *** ならびの位置指定置換(1,A,[_|R],[A|R]) :- !. ならびの位置指定置換(N,A,[B|R1],[B|R2]) :- N1 is N - 1, ならびの位置指定置換(N1,A,R1,R2) . 最小公倍数(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),!. 最小公倍数_2([],_) :- !. 最小公倍数_2([N * A|R],Y) :- N is Y // A, 最小公倍数_2(R,Y),!. 最小公倍数_2([A|R],Y) :- integer(A), 最小公倍数_2(R,Y),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/907 # # [1] 授業単元:http://pc12.2ch.net/test/read.cgi/tech/1267799238/ # [2] 問題文(含コード&リンク): # 保存済みのメモ帳に書いてある10個の数字からランダムに5個読み取るプログラム。 #  [3.1] OS:わかりません #  [3.2] コンパイラ名とバージョン: わかりません #  [3.3] 言語:C++ # [4] 期限:201x年 # [5] その他の制限:fopen、fscanf、for、ifまで習いました。 % Prolog 「10個の」をどう反映させればよいか解らない・・・ 保存済みのメモ帳に書いてある10個の数字からランダムに5個読み取る(_保存済みのメモ帳,L) :- get_chars(_保存済みのメモ帳,Chars), findall(N,(for(1,M,5),数字にヒットするまでランダムにならびを探す(Chars,N)),L). 数字にヒットするまでランダムにならびを探す(L,N) :- length(L,Len),Len > 0, repeat, M is (random mod Len) + 1, list_nth(M,L,A), member(A,['0','1','2','3','4','5','6','7','8','9']),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/683 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): http://ime.nu/ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10530.zip # ポーカープログラム # # 1,二つのクラス(Card,Deck)が与えられていて、 # game1.hとgame1.cppのプラグラムを書け。 # このプログラムはデッキから5枚配る事を1回とし、 # その中に何回ペアまたはフラッシュ(同じ手札に同じマークが5枚揃う事)が # あるかの10000回の統計であり、以下を表示させること # # 何回の統計か # そのうち何個の手札がペアを持つか # そのうち何個の手札がフラッシュを持つか # ペアは全体の何%か # フラッシュは全体の何%か # # 無作為化する為に以下を必ず含める事 # stand(unsigned)time(NULL); # # #2,新しいクラスhand(hand.hとhand.cpp)と、これを実行させる為の # game2.hとgame2.cppを書け。 # これはカードの配布、ペア・フラッシュの確認、そしてデッキにカードを戻す為の # プログラムである。 # ペアまたはフラッシュの出現度数(_回数,_ペアの度数,_フラッシュの度数) :- findsum([M1,M2],(for(1,N,_回数),トランプの準備([A,B,C,D,E|R]),役([A,B,C,D,E],M1,M2)),[_ペアの度数,_フラッシュの度数]). 役(L,1,0) :- sort(L,L1),ペア(L1),!. 役([A|R],0,1) :- sub_atom(A,1,1,_,_種類),フラッシュ(_種類,R),!. ペア([A,B]) :- sub_atom(A,0,1,_,C),sub_atom(B,0,1,_,C),!. ペア([A,B,C|R]) :- sub_atom(A,0,1,_,E),sub_atom(B,0,1,_,E),sub_atom(C,0,1,_,E),ペア(R),!. ペア([A,B,C|R]) :- sub_atom(A,0,1,_,E),sub_atom(B,0,1,_,E),\+(sub_atom(C,0,1,_,E)),!. ペア([A|R]) :- ペア(R). フラッシュ(_,[]) :- !. フラッシュ(A,[B|R]) :- sub_atom(B,1,1,_,A),フラッシュ(A,R). トランプの準備(X) :- findall(U,(for(1,N,52),一枚のカードを作る(N,U)),_整列したカード), トランプを切るようにならびを切る(41,53,_整列したカード,X),!. 一枚のカードを作る(N,U) :- M is N mod 13, M2 is (N - 1) // 13, 数字カード・絵カード(M,U1), カードの種類(M2,U2), concat_atom([U1,U2],U),!. 数字カード・絵カード(1,'A') :- !. 数字カード・絵カード(10,'T') :- !. 数字カード・絵カード(11,'J') :- !. 数字カード・絵カード(12,'Q') :- !. 数字カード・絵カード(0,'K') :- !. 数字カード・絵カード(N,N). カードの種類(0,s) :- !. カードの種類(1,h) :- !. カードの種類(2,d) :- !. カードの種類(3,c) :- !. トランプを切るようにならびを切る(0,_要素数,L,L) :- !. トランプを切るようにならびを切る(N,_要素数,L,X) :- M1 is (random mod _要素数) + 1, M2 is (random mod _要素数) + 1, \+(M1=M2), swap_nth(M1,M2,L,L1), N2 is N - 1, トランプを切るようにならびを切る(N2,_要素数,L1,X),!. トランプを切るようにならびを切る(N,_要素数,L,X) :- トランプを切るようにならびを切る(N,_要素数,L,X),!. swap_nth(M,N,L1,L2) :- list_nth(M,L1,A), list_nth(N,L1,B), swap(A,B,L1,L2),!. swap(A,B,L,LX) :- append(L1,[A|L2],[B|L3],L), append(L1,[B|L2],[A|L3],LX),!. swap(A,B,L,LX) :- append(L1,[B|L2],[A|L3],L), append(L1,[A|L2],[B|L3],LX),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/307 # # [1] Cプログラミング入門: # [2] http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10460.txt # 'ソート方法 A を用いて配列 COM,MAN の要素をそれぞれ小さい順に並べる'(L1,L2) :- ソート方法A(L1,L2). ソート方法A(L1,L2) :- '作業用のならびとして、要素が100 個の変数であるならびWorkを用意する'(Work), 'ソートしたいならびLの要素を順番に読んで、Work[ その値 ] を1に単一化する'(L1,Work), '全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'(0,L1,L2). '作業用のならびとして、要素が100 個の変数であるならびWorkを用意する'(Work) :- length(Work,100). 'ソートしたいならびLの要素を順番に読んで、Work[ その値 ] を1に単一化する'([],Work) :- !. 'ソートしたいならびLの要素を順番に読んで、Work[ その値 ] を1に単一化する'([N|R1],Work) :- M is N + 1, list_nth(M,Work,1), 'ソートしたいならびLの要素を順番に読んで、Work[ その値 ] を1に単一化する'(R1,Work),!. '全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'(_,[],[]) :- !. '全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'(N,[A|R1],[N|R2]) :- \+(var(A)), N2 is N + 1, '全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'(N2,R1,R2),!. '全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'(N,[V|R1],L2) :- var(V), N2 is N + 1, '全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'(N2,R1,L2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/200 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # A組、B組、C組にそれぞれn人の生徒がいて、 # A組の生徒が一列に並んでいる。 # このとき、B組の生徒をA組の生徒の隣に並ばせたいが # なるべく隣同士で身長に差がないようにしたい。 # どうやって計算すればいいでしょう? # 加えて、C組の生徒もB組の隣に並ばせたい場合はどうすれば? # (身長の配列) double height_a[n], height_b[n], height_c[n]; なるべく隣同士で身長に差のない並び方(La,Lb,N,LbX) :- findmin([S,L],ならび候補(La,Lb,N,L,S),Min), Min = [_,LbX],!. ならび候補(La,Lb,N,L,S) :- 順列(Lb,N,L), findsum(U,(for(1,M,N),list_nth(M,La,A),list_nth(M,L,B),U is (B-A) ^ 2),S). % 以下のサイトは 'LU分解'([],[]) :- !. 'LU分解'([[P|R1]|R2],X) :- 'LU分解の二'(R1,P,L1), 'LU分解の三'(R2,L2,L3), 'LU分解'(L3,R), 'LU分解の結合'(P,L1,L2,R,X). 'LU分解の二'(N,N,_,_,_,[]) :- !. 'LU分解の二'(J,N,K,P,L1,[W|R]) :- list_nth(K,L1,L), list_nth(J,L,V), W is V / P, J2 is J + 1, 'LU分解の二'(J2,N,K,P,L1,R). 'LU分解の三'(N,N,_,_,_,[],[]) :- !. 'LU分解の三'(I,N,K,L11,L12,[A|R1],[L2|R2]) :- list_nth(I,L1,L), list_nth(K,L,Q), J is K + 1, 'LU分解の四'(J,N,K,Q,L11,L12,[A|L2]), I2 is I + 1, 'LU分解の三'(I2,N,K,L11,L12,R1,R2). 'LU分解の四'(N,N,_,_,_,_,[]) :- !. 'LU分解の四'(J,N,K,Q,L1,L12,[W|R]) :- list_nth(I,L1,L), list_nth(J,L,Q1), list_nth(J,L12,Q2), W is Q1 - Q2 * Q, J2 is J + 1, 'LU分解の四'(J2,N,K,Q,L11,L12,R). % 以下のサイトは ガウス行列(_,[]) :- !. ガウス行列(L,[_行|R]) :- append(L,_,_行), 要素がゼロ以外に出会うまで(_行,P1,_), ガウス行列([0|P1],R). ガウス行列(_,[]) :- ! . ガウス行列(L,[_行|R]) :- append(L,_,_行), 要素がゼロ以外に出会うまで(_行,P1,_), ガウス行列([0|P1],R) . ガウス行列(_行列) :- ガウス行列([],_行列) . % *** user: 'ガウス行列に変形' / 7 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列,[]) :- M > Len, ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X,UL), ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), B = 0, M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X,UL), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[(-1)|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X,R), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N1|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 >= 0,!, '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N3|R]) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 < 0,!, N3 is N1 * (-1), '行基本変形'(N3 # M + N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R), ! . % *** user: 'ガウス行列に変形' / 6 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列) :- M > Len, ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X), ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), B = 0, M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- list_nth(M,_行列1,_行1), list_nth(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X), ! . % *** user: ガウス行列に変形 / 5 *** ガウス行列に変形(N,Len,X,X,[]) :- N >= Len, !. ガウス行列に変形(N,Len,_行列1,X,UL) :- list_nth(N,_行列1,_行), list_