このディレクトリの索引

% 以下のサイトは # 出典 :: C/C++の宿題片付けます 132代目 #72 # [1]授業単元:プログラミング演習 # [2] 1から100000までの数を列挙する。 # nまで書き終わった時点でそれぞれの数字dがtimes[d] (0<=d<=9)回使われていたとする。 # times[d]が小さい順にdを並べて順列を作る。(同じ回数の場合dが大きいほうが後)この順列が最初からそれまでに累積何回変わったか # nが1000の倍数毎に表にして出力(100000まで) # 回数と順位を要素とする構造体配列を使うこと # 整数の文字表現が増えると累計順位が変化する(_n個まで,_順位交代回数) :- 整数の文字表現が増えると累計順位が変化する(1,100000,[[0,'0'],[1,'1'],[0,'2'],[0,'3'],[0,'4'],[0,'5'],[0,'6'],[0,'7'],[0,'8'],[0,'9']],['0','2','3','4','5','6','7','8','9','1'],0,_n個まで,_順位交代回数). 整数の文字表現が増えると累計順位が変化する(Max,Max,_,_,_順位交代回数,Max,_順位交代回数) :- !. 整数の文字表現が増えると累計順位が変化する(N,Max,_,_,_順位交代回数,N,_順位交代回数) :- 0 is N mod 1000. 整数の文字表現が増えると累計順位が変化する(N,Max,LL1,_順位ならび_1,_順位交代回数_1,_n個まで,_順位交代回数) :- 整数の文字表現が増えると累計順位が変化して行く(N,Max,LL1,_順位ならび_1,_順位交代回数_1,_n個まで,_順位交代回数). 整数の文字表現が増えると累計順位が変化して行く(N,Max,LL1,_順位ならび_1,_順位交代回数_1,_n個まで,_順位交代回数) :- 整数の文字表現が増えると(N,N_2,_次の数字ならび), 最新の順位ならび(_次の数字ならび,LL1,LL2,_順位ならび_2), 累計順位が変化して行く(N_2,Max,LL2,_順位ならび_1,_順位ならび_2,_順位交代回数_1,_n個まで,_順位交代回数). 整数の文字表現が増えると(N,N_2,_次の数字ならび) :- succ(N,N_2), number_chars(N_2,_次の数字ならび). 最新の順位ならび(_次の数字ならび,LL1,LL2,_順位ならび_2) :- 'select/4を使った標本値の出現度数加算(但し、[_度数,_標本値]の順に管理される)'(_次の数字ならび,LL1,LL2), 順位ならび(LL2,_順位ならび_2). 'select/4を使った標本値の出現度数加算(但し、[_度数,_標本値]の順に管理される)'([],LL,LL). 'select/4を使った標本値の出現度数加算(但し、[_度数,_標本値]の順に管理される)'(_標本値ならび,LL1,LL) :- 'select/4で鍵管理して標本値の出現度数を加算して行く(但し、[_度数,_標本値]の順に管理される)'(_標本値ならび,LL1,LL). 'select/4で鍵管理して標本値の出現度数を加算して行く(但し、[_度数,_標本値]の順に管理される)'([_標本値|R],LL1,LL) :- 'select/4で鍵管理して標本値の出現度数を加算(但し、[_度数,_標本値]の順に管理される)'(_標本値,LL1,LL2), 'select/4を使った標本値の出現度数加算(但し、[_度数,_標本値]の順に管理される)'(R,LL2,LL). 'select/4で鍵管理して標本値の出現度数を加算(但し、[_度数,_標本値]の順に管理される)'(_標本値,LL1,LL2) :- select([_度数_1,_標本値],LL1,[_度数_2,_標本値],LL2), succ(_度数_1,_度数_2). 順位ならび(_度数標本値ならび,_順位ならび) :- '度数・標本値順に整列する'(_度数標本値ならび,_整列した度数標本値ならび), 整列された度数標本値ならびから標本値の順位を取り出す(_整列した度数標本値ならび,_順位ならび). '度数・標本値順に整列する'(_度数標本値ならび,_整列した度数標本ならび) :- sort(_度数標本値ならび,_整列した度数標本ならび). 整列された度数標本値ならびから標本値の順位を取り出す(_整列した度数標本値ならび,_順位ならび) :- findall(_標本値,member([_,_標本値],_整列した度数標本値ならび),_順位ならび). 累計順位が変化して行く(N_2,Max,LL2,_順位ならび_1,_順位ならび_2,_順位交代回数_1,_n個まで,_順位交代回数) :- 順位に変化があった場合だけ順位交代回数を更新する(_順位ならび_1,_順位ならび_2,_順位交代回数_1,_順位交代回数_2), 整数の文字表現が増えると累計順位が変化する(N_2,Max,LL2,_順位ならび_2,_順位交代回数_2,_n個まで,_順位交代回数). 順位に変化があった場合だけ順位交代回数を更新する(_順位ならび_1,_順位ならび_2,_順位交代回数_1,_順位交代回数_2) :- '順位に変化があった場合、交代回数が更新される'(_順位ならび_1,_順位ならび_2,_順位交代回数_1,_順位交代回数_2),!. 順位に変化があった場合だけ順位交代回数を更新する(_,_,_順位交代回数,_順位交代回数). '順位に変化があった場合、交代回数が更新される'(_順位ならび_1,_順位ならび_2,_順位交代回数_1,_順位交代回数_2) :- '順位に変化があった場合、'(_順位ならび_1,_順位ならび_2), 交代回数が変化する(_順位交代回数_1,_順位交代回数_2). '順位に変化があった場合、'(_順位ならび_1,_順位ならび_2) :- \+(sort(_順位ならび_1,_順位ならび_2)). 交代回数が変化する(_順位交代回数_1,_順位交代回数_2) :- succ(_順位交代回数_1,_順位交代回数_2). % 以下のサイトは # 出題場所 :: 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,_1からnのn個の連続した整数,_2個をとりのぞいたのこりの数), 'のこりの数からとりのぞいた2個の数を求める。'(_1からnのn個の連続した整数,_2個をとりのぞいたのこりの数,[_とりのぞいた数_1,_とりのぞいた数_2]). '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_1からnの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個をとりのぞいたのこりの数) :- _シャッフルした1からnのn個の連続した整数=[_,_|_2個をとりのぞいたのこりの数]. 'のこりの数からとりのぞいた2個の数を求める。'(_1からnのn個の連続した整数,_2個をとりのぞいたのこりの数,X) :- sort(_2個をとりのぞいたのこりの数,_整列した2個をとりのぞいたのこりの数), 欠番を2個求める(_1からnのn個の連続した整数,_整列した2個をとりのぞいたのこりの数,[],X). 欠番を2個求める(_,_,[X1,X2],[X1,X2]) :- !. 欠番を2個求める(L1,L2,Y,X) :- 欠番を2個見つけるまで探索する(L1,L2,Y,X). 欠番を2個見つけるまで探索する([A|R1],[A|R2],Y,X) :- 欠番を2個求める(R1,R2,Y,X). 欠番を2個見つけるまで探索する([A|R1],[B|R2],Y,X) :- A\==B, 欠番を2個求める(R1,[B|R2],[A|Y],X). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 134代目 #554 # [1] 授業単元:プログラミング 1 # [2] 問題文(含コード&リンク): # /************************* # ある二つの文字列str1,str2 の編集距離はつぎの3つの操作を行うことによりstr1 をstr2 に変換するのに要する操作の最低回数である # ・ 1文字挿入する # ・ 1文字削除する # ・ 1文字を他の1文字に置き換える # たとえば str1="sport" はstr2="sort" に, 文字 'p' を削除することによりstr2 に変換できるため編集距離は 1 である # # str_n を文字列str の頭からn 番目までの部分列としm(i,j)をstr i とstr j の編集距離を表すものとする.m(i,j)とm(i+1,j),m(i,j+1),m(i+1,j+1)の間に成り立つ再帰式を記述しなさい # # この再帰式に基づき効率良く編集距離を計算するプログラムを2次元配列を利用して作成しなさい.ただし,関数m(i,j)はint型の編集距離を返り値とする. # ******************************/ # 編集距離(_str1,_str2,_編集距離) :- 文字列をならびに変換して編集距離を計算する(_str1,_str2,_編集距離),!. 文字列をならびに変換して編集距離を計算する(_str1,_str2,_編集距離) :- 文字列をならびに変換して(_str1,_str2,L1,L2), 編集距離を計算する(L1,L2,0,_編集距離). 文字列をならびに変換して(_str1,_str2,L1,L2) :- atom_chars(_str1,L1), atom_chars(_str2,L2). 編集距離を計算する(L1,L2,M1,_編集距離) :- 一致する部分がない時はその部分の距離計算を加算して停止する(L1,L2,M1,_編集距離). 編集距離を計算する(L1,L2,M1,_編集距離) :- 一致する部分までの距離を加算して行く(L1,L2,M1,_編集距離). 一致する部分がない時はその部分の距離計算を加算して停止する(L1,L2,M1,_編集距離) :- 一致する部分がない時は(L1,L2), その部分の距離計算を加算して(L1,L2,M1,_編集距離). その部分の距離計算を加算して(L1,L2,M1,_編集距離) :- 距離計算(L1,L2,M1,_編集距離). 一致する部分がない時は(L1,L2) :- \+(一致する部分(L1,L2)). 一致する部分(L1,L2) :- append(_,[X|_],L1), append(_,[X|_],L2). 一致する部分までの距離を加算して行く(L1,L2,M1,_編集距離) :- 一致部分までの編集距離(L1,L2,M1,R1,R2,_一致部分までの編集距離), 編集距離を計算する(R1,R2,_一致部分までの編集距離,_編集距離). 一致部分までの編集距離(L1,L2,M1,R1,R2,_一致部分までの編集距離) :- 一致部分までの(L1,L2,L0_1,L0_2,R1,R2), 距離計算(L0_1,L0_2,M1,_一致部分までの編集距離). 一致部分までの(L1,L2,L0_1,L0_2,R1,R2) :- append(L0_1,[X|R1],L1), append(L0_2,[X|R2],L2). 距離計算(L1,L2,M1,M2) :- 'L1,L2の長さを取り'(L1,L2,Len1,Len2), 距離に加算する(Len1,Len2,M1,M2). 'L1,L2の長さを取り'(L1,L2,Len1,Len2) :- length(L1,Len1), length(L2,Len2). 距離に加算する(Len1,Len2,M1,M2) :- 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離より短い時は、Len2を加算する'(Len1,Len2,M1,M2). 距離に加算する(Len1,Len2,M1,M2) :- 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離と等しいか長い時は、Len1を加算する'(Len1,Len2,M1,M2). 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離より短い時は、Len2を加算する'(Len1,Len2,M1,M2) :- Len1 =< Len2, M2 is M1 + Len2. 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離と等しいか長い時は、Len1を加算する'(Len1,Len2,M1,M2) :- Len1 > Len2, M2 is M1 + Len1. % 以下のサイトは 差分整列(_ならび, _整列したならび) :- 差分整列(_ならび, _整列したならび, []). 差分整列([], _ならび, _ならび). 差分整列([_軸要素|_軸要素以外の要素], _整列したもの, _差分) :- '[_軸要素|_軸要素以外の要素]を整列したものは _整列したもの から _差分 の差分である'(_軸要素,_軸要素以外の要素,_整列したもの,_差分). '[_軸要素|_軸要素以外の要素]を整列したものは _整列したもの から _差分 の差分である'(_軸要素,_軸要素以外の要素,_全体の整列,_差分) :- 軸要素を軸に小と等しいか大に分類する(_軸要素以外の要素, _軸要素, _より小, _より大), '_より小 を整列したものは全体を整列したものから _軸要素 を先頭に加えた _より大 を整列したものの差分である'(_より小,_全体の整列,[_軸要素|_より大の整列]), '_より大 を整列したものは _より大 を整列したものから _差分 の差分である'(_より大, _より大の整列, _差分). '_より小 を整列したものは全体を整列したものから _軸要素 を先頭に加えた _より大 を整列したものの差分である'(_より小,_全体の整列,[_軸要素|_より大の整列]) :- 差分整列(_より小,_全体の整列,[_軸要素|_より大の整列]). '_より大 を整列したものは _より大 を整列したものから _差分 の差分である'(_より大, _より大の整列, _差分) :- 差分整列(_より大,_より大の整列, _差分). 軸要素を軸に小と等しいか大に分類する([],_,[],[]). 軸要素を軸に小と等しいか大に分類する([_要素|_残り分類対象],_軸要素,_より小,_より大) :- 軸要素を軸に小と等しいか大に分類して行く(_要素,_残り分類対象,_軸要素,_より小,_より大). 軸要素を軸に小と等しいか大に分類して行く(_要素,_残り分類対象,_軸要素,_より小,_より大) :- 小と等しいか大に分類する(_要素,_軸要素,_より小_2,_より大_2,_より小,_より大), 軸要素を軸に小と等しいか大に分類する(_残り分類対象,_軸要素,_より小_2,_より大_2). 小と等しいか大に分類する(_要素,_軸要素,_より小,_より大,[_要素|_より小],_より大) :- _要素 @< _軸要素. 小と等しいか大に分類する(_要素,_軸要素,_より小,_より大,_より小,[_要素|_より大]) :- _要素 @>= _軸要素. % 以下のサイトは # 出典 :: 現在はリンクが切れています (レス番号110) # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 述語 成績表は学籍番号と成績を引数として持つ。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,述語の学籍番号が小さいデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび), 上位11名を選別して表示する(_降順に整列した成績鍵ならび). 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ 成績表(_学籍番号,_成績),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 上位11名を選別して表示する(_降順に整列した成績鍵ならび) :- once(上位11名を選別する(_降順に整列した成績鍵ならび,_上位11名)), 上位11名を表示する(_上位11名). 上位11名を選別する(_降順に整列した成績鍵ならび,_上位11名ならび) :- findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を取り出す。ただし同点の場合は学籍番号の小さい順に取り出す。'(_降順に整列した成績鍵ならび,_学籍番号,_成績),_上位11名ならび). '降順に整列した成績鍵から_学籍番号_成績を取り出す。ただし同点の場合は学籍番号の小さい順に取り出す。'(_降順に整列した成績鍵ならび,_学籍番号,_成績) :- '降順に整列した成績鍵から'(_降順整列した成績鍵ならび,_成績), '_学籍番号_成績を取り出す。ただし同点の場合は学籍番号の小さい順に取り出す。'(_成績,_学籍番号). '降順に整列した成績鍵から'(_降順整列した成績鍵ならび,_成績) :- member(_成績,_降順に整列した成績鍵ならび). '_学籍番号_成績を取り出す。ただし同点の場合は学籍番号の小さい順に取り出す。'(_成績,_学籍番号) :- setof(_学籍番号_1,[_学籍番号_1,_成績] ^ 成績表(_学籍番号_1,_成績),L), member(_学籍番号,L). 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 述語 成績表は学籍番号と成績を引数として持つ。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,述語の学籍番号が小さいデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび), 学籍番号を鍵に昇順に整列した成績ならび(_学籍番号を鍵に昇順に整列した成績ならび), 上位11名を選別して表示する(_降順に整列した成績鍵ならび,_学籍番号を鍵に昇順に整列した成績ならび). 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ 成績表(_学籍番号,_成績),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 学籍番号を鍵に昇順に整列した成績ならび(_学籍番号を鍵に昇順に整列した成績ならび) :- setof([_学籍番号,_成績],[_学籍番号,_成績] ^ 成績(_学籍番号,_成績),_学籍番号を鍵に昇順に整列した成績ならび). 上位11名を選別して表示する(_降順に整列した成績鍵ならび,_学籍番号を鍵に昇順に整列した成績ならび) :- once(上位11名を選別する(_降順に整列した成績鍵ならび,_学籍番号を鍵に昇順に整列した成績ならび,_上位11名)), 上位11名を表示する(_上位11名). 上位11名を選別する(_降順に整列した成績鍵ならび,_学籍番号を鍵に昇順に整列した成績ならび,_上位11名ならび) :- findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を取り出す'(_降順に整列した成績鍵ならび,_学籍番号を鍵に昇順に整列した成績ならび,_学籍番号,_成績),_上位11名ならび). '降順に整列した成績鍵から_学籍番号_成績を取り出す'(_降順に整列した成績鍵ならび,_学籍番号を鍵に昇順に整列した成績ならび,_学籍番号,_成績) :- member(_成績,_降順に整列した成績鍵ならび), member([_学籍番号,_成績],_学籍番号を鍵に昇順に整列した成績ならび). 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 述語 成績表は学籍番号と成績を引数として持つ。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,述語の定義位置が上位のデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび), 上位11名を選別して表示する(_降順に整列した成績鍵ならび). 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ 成績表(_学籍番号,_成績),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 上位11名を選別して表示する(_降順に整列した成績鍵ならび) :- once(上位11名を選別する(_降順に整列した成績鍵ならび,_上位11名)), 上位11名を表示する(_上位11名). 上位11名を選別する(_降順に整列した成績鍵ならび,_上位11名ならび) :- findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を取り出す'(_降順に整列した成績鍵ならび,_学籍番号,_成績),_上位11名ならび). '降順に整列した成績鍵から_学籍番号_成績を取り出す'(_降順に整列した成績鍵ならび,_学籍番号,_成績) :- member(_成績,_降順に整列した成績鍵ならび), 成績表(_学籍番号,_成績). 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび), 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび), 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), once(成績データを得る(_成績ならび)). 成績データを得る(_成績ならび) :- findnsols(100,[_学籍番号,_成績],( 連続した行入力(_行), (行入力終了条件(_行),!,fail;split(_行,[' '],[_学籍番号,_成績]))),_成績ならび). 連続した行入力(_行) :- repeat, get_line(_行). 行入力終了条件('0 0'). 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ member([_学籍番号,_成績],_成績ならび),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび) :- once(上位11名を選別する(_成績ならび,_降順に整列した成績鍵ならび,_上位11名)), 上位11名を表示する(_上位11名). 上位11名を選別する(_成績ならび,_降順に整列した成績鍵ならび,_上位11名ならび) :- findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_成績ならび,_降順に整列した成績鍵ならび,_学籍番号,_成績),_上位11名ならび). '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_成績ならび,_降順に整列した成績鍵ならび,_学籍番号,_成績) :- member(_成績,_降順に整列した成績鍵ならび), member([_学籍番号,_成績],_成績ならび). 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび), 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび), 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), get_line(_行), length(Ln,100), 成績データを得る(Ln,_行,_整列鍵ならび,_成績ならび). 成績データを得る(_,'0 0',[]) :- !. 成績データを得る([],_,[]). 成績データを得る([_|Ln],_行,[[_学籍番号,_成績]|R]) :- split(_行,[' '],[_学籍番号,_成績]), get_line(_行_2), 成績データを得る(Ln,_行_2,R). 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ member([_学籍番号,_成績],_成績ならび),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび) :- 上位11名を選別する(_上位11名), 上位11名を表示する(_上位11名). 上位11名を選別する(_降順に整列した成績鍵ならび,_成績ならび,_上位11名ならび) :- once(findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_降順に整列した成績鍵ならび,_成績ならび,_学籍番号,_成績),_上位11名ならび)). '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_降順に整列した成績鍵ならび,_成績ならび,_学籍番号,_成績) :- member(_成績,_降順に整列した成績鍵ならび), member([_学籍番号,_成績],_成績ならび). 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出典:: 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://toro.2ch.net/test/read.cgi/tech/1390525149/170 # お題:分母が自然数m以下の既約分数で0より大きく1より小さいものを小さい順にならべる。 # m=3 -> 1/3,1/2,2/3 # m=5 -> 1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4/5 # # '分母が自然数m以下の既約分数で0より大きく1より小さいものを小さい順にならべる。'(_m,_整列した分数ならび) :- findall(_分子 rdiv _分母,分母ごとの既約分数(_m,_分母,_分子),_分数ならび), sort(_分数ならび,_整列した分数ならび). 分母ごとの既約分数(_m,_分母,_分子) :- between(2,_m,_分母), 分子候補を篩に掛ける(2,_分母,_篩に掛けられた分子ならび), member(_分子,_篩に掛けられた分子ならび). 分子候補を篩に掛ける(M,_分母,_篩に掛けられた分子ならび) :- 分子候補を生成(_分母,_数ならび), 分子候補を篩に掛ける(M,_分母,_数ならび,_篩に掛けられた分子ならび). 分子候補を生成(_分母,_数ならび) :- succ(_分母_1,_分母), findall(N,between(1,_分母_1,N),_数ならび). 分子候補を篩に掛ける(_分母,_分母,_篩に掛けられた分子ならび,_篩に掛けられた分子ならび) :- !. 分子候補を篩に掛ける(M,_分母,_数ならび_1,_篩に掛けられた分子ならび) :- 'Mが2から分母になるまで分子候補を篩に掛ける'(M,_分母,_数ならび_1,_篩に掛けられた分子ならび). 'Mが2から分母になるまで分子候補を篩に掛ける'(M,_分母,_数ならび_1,_篩に掛けられた分子ならび) :- 'Mの篩'(M,_分母,_数ならび_1,_数ならび_2), succ(M,M_2), 分子候補を篩に掛ける(M_2,_分母,_数ならび_2,_篩に掛けられた分子ならび). 'Mの篩'(M,_分母,_数ならび_1,_数ならび_2) :- findall(_分子候補,分子候補(M,_分母,_数ならび_1,_分子候補),_数ならび_2). 分子候補(M,_分母,_数ならび_1,_分子候補) :- member(_分子候補,_数ならび_1), 約分できない(M,_分母,_分子候補). 約分できない(M,_分母,_分子候補) :- \+(約分できる(M,_分母,_分子候補)). 約分できる(M,_分母,_分子候補) :- 0 is _分母 mod M, 0 is _分子候補 mod M. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/935 # [1] 授業単元: C言語 # [2] 問題文(含コード&amp;リンク):レポート形式なのですが比較回数を数えるプログラムのソースコードを御教示ください。 #  問:以下の挿入ソートのプログラムを参考に(次番に記載)着目する各x[i]の大小比較の回数を求めよ。 #    参考として、各データの比較回数は最大(i-1)回、最小1回、平均(i/2)回となる。 #    また、それぞれのデータの並びを変えて比較回数とデータの並びの関係を考えよ。 # 挿入整列時の比較回数(L1,L2,_単一化回数,_比較回数) :- 挿入整列時の比較回数(L1,[],9,0,L2,_単一化回数,_比較回数). 挿入整列時の比較回数([],L2,_単一化回数_1,_比較回数,L2,_単一化回数,_比較回数) :- '挿入終了、単一化回数のみ1加算'(_単一化回数_1,_単一化回数). 挿入整列時の比較回数([A|R],L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数):- '対象ならびから一要素ずつ取り出し挿入する'([A|R],L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数). '挿入終了、単一化回数のみ1加算'(_単一化回数_1,_単一化回数) :- _単一化回数 is _単一化回数_1 + 1. '対象ならびから一要素ずつ取り出し挿入する'([A|R],L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数) :- 比較回数を計測しながらの挿入(A,L1,_単一化回数_1,_比較回数_1,L3,_単一化回数_2,_比較回数_2), _単一化回数_3 is _単一化回数_2 + 1 * 8, 挿入整列時の比較回数(R,L3,_単一化回数_3,_比較回数_2,L2,_単一化回数,_比較回数). 比較回数を計測しながらの挿入(A,[],_単一化回数_1,_比較回数,[A],_単一化回数,_比較回数) :- _単一化回数 is _単一化回数_1 + 1 * 8. 比較回数を計測しながらの挿入(A,[B|R],_単一化回数_1,_比較回数_1,[A,B|R],_単一化回数_2,_比較回数_2) :- '挿入可能の場合は単一化回数は第一節を含めて2加算、比較回数は1加算'(A,B,_単一化回数_1,_比較回数_1,_単一化回数_2,_比較回数_2),!. 比較回数を計測しながらの挿入(A,L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数) :- _単一化回数_2 is _単一化回数_1 + 2 * 8, 'まだ挿入できない場合は、単一化回数は上二節を含めて3加算、比較回数は1加算して挿入位置を継続して捜す'(A,L1,_単一化回数_2,_比較回数_1,L2,_単一化回数,_比較回数). '挿入可能の場合は単一化回数は第一節を含めて2加算、比較回数は1加算'(A,B,_単一化回数_1,_比較回数_1,_単一化回数_2,_比較回数_2) :- A @=< B, _単一化回数_2 is _単一化回数_1 + 2 * 8, _比較回数_2 is _比較回数_1 + 1,!. 'まだ挿入できない場合は、単一化回数は上二節を含めて3加算、比較回数は1加算して挿入位置を継続して捜す'(A,[B|R1],_単一化回数_1,_比較回数_1,[B|R2],_単一化回数,_比較回数) :- _単一化回数_2 is _単一化回数_1 + 3 * 8, _比較回数_2 is _比較回数_1 + 1, 比較回数を計測しながらの挿入(A,R1,_単一化回数_2,_比較回数_2,R2,_単一化回数,_比較回数). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/935 # [1] 授業単元: C言語 # [2] 問題文(含コード&amp;リンク):レポート形式なのですが比較回数を数えるプログラムのソースコードを御教示ください。 #  問:以下の挿入ソートのプログラムを参考に(次番に記載)着目する各x[i]の大小比較の回数を求めよ。 #    参考として、各データの比較回数は最大(i-1)回、最小1回、平均(i/2)回となる。 #    また、それぞれのデータの並びを変えて比較回数とデータの並びの関係を考えよ。 # 挿入整列時の比較回数(L1,L2,_単一化回数,_比較回数) :- 挿入整列時の比較回数(L1,[],1,0,L2,_単一化回数,_比較回数). 挿入整列時の比較回数([],L2,_単一化回数_1,_比較回数,L2,_単一化回数,_比較回数) :- '挿入終了、単一化回数のみ1加算'(_単一化回数_1,_単一化回数). 挿入整列時の比較回数([A|R],L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数):- '対象ならびから一要素ずつ取り出し挿入する'([A|R],L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数). '挿入終了、単一化回数のみ1加算'(_単一化回数_1,_単一化回数) :- _単一化回数 is _単一化回数_1 + 1. '対象ならびから一要素ずつ取り出し挿入する'([A|R],L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数) :- 比較回数を計測しながらの挿入(A,L1,_単一化回数_1,_比較回数_1,L3,_単一化回数_2,_比較回数_2), _単一化回数_3 is _単一化回数_2 + 1, 挿入整列時の比較回数(R,L3,_単一化回数_3,_比較回数_2,L2,_単一化回数,_比較回数). 比較回数を計測しながらの挿入(A,[],_単一化回数_1,_比較回数,[A],_単一化回数,_比較回数) :- _単一化回数 is _単一化回数_1 + 1. 比較回数を計測しながらの挿入(A,[B|R],_単一化回数_1,_比較回数_1,[A,B|R],_単一化回数_2,_比較回数_2) :- '挿入可能の場合は単一化回数は第一節を含めて2加算、比較回数は1加算'(A,B,_単一化回数_1,_比較回数_1,_単一化回数_2,_比較回数_2),!. 比較回数を計測しながらの挿入(A,L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数) :- _単一化回数_2 is _単一化回数_1 + 2, 'まだ挿入できない場合は、単一化回数は上二節を含めて3加算、比較回数は1加算して挿入位置を継続して捜す'(A,L1,_単一化回数_2,_比較回数_1,L2,_単一化回数,_比較回数). '挿入可能の場合は単一化回数は第一節を含めて2加算、比較回数は1加算'(A,B,_単一化回数_1,_比較回数_1,_単一化回数_2,_比較回数_2) :- A @=< B, _単一化回数_2 is _単一化回数_1 + 2, _比較回数_2 is _比較回数_1 + 1,!. 'まだ挿入できない場合は、単一化回数は上二節を含めて3加算、比較回数は1加算して挿入位置を継続して捜す'(A,[B|R1],_単一化回数_1,_比較回数_1,[B|R2],_単一化回数,_比較回数) :- _単一化回数_2 is _単一化回数_1 + 3, _比較回数_2 is _比較回数_1 + 1, 比較回数を計測しながらの挿入(A,R1,_単一化回数_2,_比較回数_2,R2,_単一化回数,_比較回数). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/935 # [1] 授業単元: C言語 # [2] 問題文(含コード&amp;リンク):レポート形式なのですが比較回数を数えるプログラムのソースコードを御教示ください。 #  問:以下の挿入ソートのプログラムを参考に(次番に記載)着目する各x[i]の大小比較の回数を求めよ。 #    参考として、各データの比較回数は最大(i-1)回、最小1回、平均(i/2)回となる。 #    また、それぞれのデータの並びを変えて比較回数とデータの並びの関係を考えよ。 # 挿入整列時の比較回数(L1,L2,_単一化回数,_比較回数) :- 挿入整列時の比較回数(L1,[],1,0,L2,_単一化回数,_比較回数). 挿入整列時の比較回数([],L2,_単一化回数_1,_比較回数,L2,_単一化回数,_比較回数) :- _単一化回数 is _単一化回数_1 + 1. 挿入整列時の比較回数([A|R],L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数):- 比較回数を計測しながらの挿入(A,L1,_単一化回数_1,_比較回数_1,L3,_単一化回数_2,_比較回数_2), _単一化回数_3 is _単一化回数_2 + 2, 挿入整列時の比較回数(R,L3,_単一化回数_3,_比較回数_2,L2,_単一化回数,_比較回数). 比較回数を計測しながらの挿入(A,[],_単一化回数_1,_比較回数,[A],_単一化回数,_比較回数) :- _単一化回数 is _単一化回数_1 + 1. 比較回数を計測しながらの挿入(A,[B|R],_単一化回数_1,_比較回数_1,[A,B|R],_単一化回数_2,_比較回数_2) :- A @=< B, _単一化回数_2 is _単一化回数_1 + 2, _比較回数_2 is _比較回数_1 + 1,!. 比較回数を計測しながらの挿入(A,[B|R1],_単一化回数_1,_比較回数_1,[B|R2],_単一化回数,_比較回数) :- _単一化回数_2 is _単一化回数_1 + 3, _比較回数_2 is _比較回数_1 + 1, 比較回数を計測しながらの挿入(A,R1,_単一化回数_2,_比較回数_2,R2,_単一化回数,_比較回数). % 以下のサイトは # # 出典::SQL質疑応答スレ 11問目 #535 # # 関連性がないけど取得したデータ型が同じ2つのSELECT文を結合させるにはどうしたらいいでしょうか? # # SELECT 1 # SELECT int_column AS A, timestamp_column AS B FROM table1 # # A     B # 10 2011-07-11 # # SELECT 2 # SELECT int_column AS A timestamp_column AS B FROM table2 # # A     B # 5  2011-07-10 # 10 2011-07-13 # # これをA-Bの順番にソートして # # A     B # 5  2011-07-10 # 10  2011-07-11 # 10  2011-07-13 # # こんな感じの1つのテーブルにしたいのですが、よろしくお願いします。 # # :- dynamic(table3/2). '関連性がないけど取得したデータ型が同じ2つのSELECT文を結合する これをA-Bの順番にソートして1つのテーブルにしたい'(_順番にソートして結合された表) :- '関連性がないけど取得したデータ型が同じ2つのSELECT文を結合する'(_結合された表), 'これをA-Bの順番にソートして1つのテーブルにしたい'(_順番にソートして結合された表). '関連性がないけど取得したデータ型が同じ2つのSELECT文を結合する'(LL3) :- 同じ形式の照会で得られた(LL1,LL2), '2つを結合する'(LL1,LL2,LL3). 同じ形式の照会で得られた(LL1,LL2) :- 'table1をならびに取得する'(LL1), 'table2をならびに取得する'(LL2). 'table1をならびに取得する'(LL1) :- findall([_table1_A,_table1_B],table1(_table1_A,_table1_B),LL1). 'table2をならびに取得する'(LL2) :- findall([_table2_A,_table2_B],table2(_table2_A,_table2_B),LL2). '2つを結合する'(LL1,LL2,LL3) :- append(LL1,LL2,LL3). 'これをA-Bの順番にソートして1つのテーブルにしたい'(_結合された表,_順番にソートして結合された表) :- sort(_結合された表,_順番にソートして結合された表), '1つのテーブルにしたい'(_順番にソートして結合された表). '1つのテーブルにしたい'(_順番にソートして結合された表) :- forall( member([_table3_A,_table3_B],_順番にソートして結合された表), assertz(table3(_table3_A,_table3_B))). % 以下のサイトは 切ったトランプを用意する(_切ったトランプ) :- '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). % 以下のサイトは 差分整列(_ならび, _整列したならび) :- 差分整列(_ならび, _整列したならび, []). 差分整列([], _ならび, _ならび). 差分整列([_軸要素|_軸要素以外の要素], _整列したもの, _差分) :- '[_軸要素|_軸要素以外の要素]を整列したものは _整列したもの から _差分 の差分である'(_軸要素,_軸要素以外の要素,_整列したもの,_差分). '[_軸要素|_軸要素以外の要素]を整列したものは _整列したもの から _差分 の差分である'(_軸要素,_軸要素以外の要素,_全体の整列,_差分) :- 軸要素を軸に小と等しいか大に分類する(_軸要素以外の要素, _軸要素, _より小, _より大), '_より小 を整列したものは全体を整列したものから _軸要素 を先頭に加えた _より大 を整列したものの差分である'(_より小,_全体の整列,[_軸要素|_より大の整列]), '_より大 を整列したものは _より大 を整列したものから _差分 の差分である'(_より大, _より大の整列, _差分). '_より小 を整列したものは全体を整列したものから _軸要素 を先頭に加えた _より大 を整列したものの差分である'(_より小,_全体の整列,[_軸要素|_より大の整列]) :- 差分整列(_より小,_全体の整列,[_軸要素|_より大の整列]). '_より大 を整列したものは _より大 を整列したものから _差分 の差分である'(_より大, _より大の整列, _差分) :- 差分整列(_より大,_より大の整列, _差分). 軸要素を軸に小と等しいか大に分類する([],_,[],[]). 軸要素を軸に小と等しいか大に分類する([_要素|_残り分類対象],_軸要素,_より小,_より大) :- 軸要素を軸に小と等しいか大に分類して行く(_要素,_残り分類対象,_軸要素,_より小,_より大). 軸要素を軸に小と等しいか大に分類して行く(_要素,_残り分類対象,_軸要素,_より小,_より大) :- 小と等しいか大に分類する(_要素,_軸要素,_より小_2,_より大_2,_より小,_より大), 軸要素を軸に小と等しいか大に分類する(_残り分類対象,_軸要素,_より小_2,_より大_2). 小と等しいか大に分類する(_要素,_軸要素,_より小,_より大,[_要素|_より小],_より大) :- _要素 @< _軸要素. 小と等しいか大に分類する(_要素,_軸要素,_より小,_より大,_より小,[_要素|_より大]) :- _要素 @>= _軸要素. % 以下のサイトは 整列(L1,L2) :- 差分整列(L1,L2-[]). 差分整列([],L-L). 差分整列(L1,L2-L3) :- 'L1を整列したものはL2とL3の差分リストになっている'(L1,L2-L3). 'L1を整列したものはL2とL3の差分リストになっている'(L1,L2-L3) :- 'L1を、_軸要素、_より小、_より大であるか等しい、に分割する'(L1,_軸要素,_より小,_より大であるか等しい), 差分整列(_より小,L2-[_軸要素|L4]), 差分整列(_より大であるか等しい,L4-L3). 'L1を、_軸要素、_より小、_より大であるか等しい、に分割する'(L1,_軸要素,_より小,_より大であるか等しい) :- 軸要素の選定(L1,_軸要素,R), 軸要素で分割(R,_軸要素,_より小,_より大であるか等しい). 軸要素の選定([_軸要素|R],_軸要素,R). 軸要素で分割([],_,[],[]). 軸要素で分割(L,_軸要素,_より小,_より大であるか等しい) :- '軸要素より小さいか、あるいは、より大であるか等しいに分割して行く'(L,_軸要素,_より小,_より大であるか等しい). '軸要素より小さいか、あるいは、より大であるか等しいに分割して行く'([A|R],_軸要素,[A|_より小],_より大であるか等しい) :- A @< _軸要素, 軸要素で分割(R,_軸要素,_より小,_より大であるか等しい). '軸要素より小さいか、あるいは、より大であるか等しいに分割して行く'([A|R],_軸要素,_より小,[A|_より大であるか等しい]) :- A @>= _軸要素, 軸要素で分割(R,_軸要素,_より小,_より大であるか等しい). % 以下のサイトは # 出典 :: SQL質疑応答スレ 12問目 #365 # ・DB名:Firebird1.03 # ・テーブル #  ■メイン #   受注番号 受注日 注文社 #   11    2011/12/20 A社 #   12    2011/12/21 B社 #  ■サブ #   連番 受注番号 商品コード 数 #   50  11    A10    100 #   51  11    C30    20 #   52  12    A10    10 #  ■商品 #   商品コード 商品名 カテゴリ 納品番号(商品ごとで重複していません) #   A10     コート 洋服   100 #   C30     帯   和服   504 # # メインの受注番号とサブの受注番号、サブの商品コードと商品の商品コードで # リンクしています。 # # 欲しい結果 # 受注日の期間(いつからいつまで)と、商品のカテゴリと納品番号で、 # 受注の全内容(商品)が知りたいです。 # 受注日:2011/12/01から12/31まで # カテゴリ:洋服 納品番号:100で検索をして # # 受注番号 受注日 注文者 商品コード 商品名 数量 # 11    2011/12/20 A社 A10    コート 100 # 11    2011/12/20 A社 C30    帯   20----★ # 12    2011/12/21 B社 A10    コート 10 # ★受注の全内容が知りたいので、該当する受注番号のサブはすべて表示 # したい。メインの内容は重複表示となります。 # # 丸投げですみませんが、どなたかSQL文をお願いできませんでしょうか。 # テーブルが3つになるとどうしてよいものかわからないです。 # よろしくお願いします。 # # # '受注日の期間(いつからいつまで)と、商品の商品カテゴリと納品番号で、受注の全内容(商品)が知りたい'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号) :- '受注番号候補を得て、それを鍵に、データベースから選択する'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号,LL1), 受注番号順に表示する(LL1). '受注番号候補を得て、それを鍵に、データベースから選択する'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号,LL1) :- 受注番号候補を得る(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号,_受注番号ならび), 'それを鍵に、データベースから選択する'(_受注番号ならび,LL1). 受注番号候補を得る(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号,_受注番号ならび) :- setof(_受注番号, [_受注番号,_受注日,_注文社,_受注日,_受注日下限,_受注日上限,_連番,_受注番号,_商品コード,_数量,_商品名,_商品カテゴリ,_納品番号] ^ ( '受注日範囲のメインの受注番号からサブ・商品を結合可能な受注番号'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号)),_受注番号ならび). '受注日範囲のメインの受注番号からサブ・商品を結合可能な受注番号'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号) :- 受注日範囲のメインの受注番号から(_受注日下限,_受注日上限,_受注番号,_受注日,_注文社), 'サブ・商品を結合可能な受注番号'(_受注番号,_受注日,_注文社,_連番,_受注番号,_商品コード,_数量,_商品名,_商品カテゴリ,_納品番号). 受注日範囲のメインの受注番号から(_受注日下限,_受注日上限,_受注番号,_受注日,_注文社) :- メイン(_受注番号,_受注日,_注文社), _受注日 @>= _受注日下限, _受注日 @=< _受注日上限. 'サブ・商品を結合可能な受注番号'(_受注番号,_受注日,_注文社,_連番,_受注番号,_商品コード,_数量,_商品名,_商品カテゴリ,_納品番号) :- サブ(_連番,_受注番号,_商品コード,_数量), 商品(_商品コード,_商品名,_商品カテゴリ,_納品番号). 'それを鍵に、データベースから選択する'(_受注番号ならび,LL1) :- findall([_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量],( append(_,[_受注番号|_],_受注番号ならび), 受注番号を鍵にデータベースからの選択(_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量)),LL1). 受注番号を鍵にデータベースを結合(_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量) :- メイン(_受注番号,_受注日,_注文社), サブ(_連番,_受注番号,_商品コード,_数量), 商品(_商品コード,_商品名,_商品カテゴリ,_納品番号). 受注番号順に表示する(LL1) :- 整列(LL1,LL2), 表示する(LL2). 表示する(LL) :- 見出しを表示する, forall(append(_,[[_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量]|_],LL), writef('%10l %8l %8c %8c %8c %14l %8r\n',[_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量])). 見出しを表示する :- write('受注番号 受注日 注文者 商品コード 商品名 数量\n'). % 以下のサイトは mergesort([],[]) :- !. mergesort([A],[A]) :- !. mergesort(L, L3) :- ならびを二分する(L, L1, L2), mergesort(L1, L1_2), mergesort(L2, L2_2), merge(L1_2,L2_2,L3). merge([],L,L) :- !. merge(L,[],L) :- !. merge([A|R1],[B|R2],[A|R3]) :- A @=< B, merge(R1,[B|R2],R3). merge([A|R1],[B|R2],[B|R3]) :- A @> B, merge([A|R1],R2,R3). ならびを二分する([],[],[]) :- !. ならびを二分する(_ならび,_前半ならび,_後半ならび) :- 二分されたならびの要素数(_ならび,_二分されたならびの要素数), 二分されたならびを得る(_二分されたならびの要素数,_前半ならび,_後半ならび), append(_前半ならび,_後半ならび,_ならび),!. 二分されたならびの要素数(_ならび,_二分されたならびの要素数) :- length(_ならび,_ならびの長さ), _二分されたならびの要素数 is _ならびの長さ // 2. 二分されたならびを得る(_二分されたならびの要素数,_前半ならび,_後半ならび) :- length(_前半ならび,_二分されたならびの要素数), length(_後半ならび_1,_二分されたならびの要素数), append(_後半ならび_1,_,_後半ならび). % 以下のサイトは # 出典 :: CodeIQ q1347 # # 3人の几帳面な男たちがいました。 # ジェシー「みかんをたくさん頂いたんだ。みんなで分けようYO!」 # ダニエル「イイネ!…ええと、みかんは全部で30個あるみたいだから、ひとり10個ずつならきちんと分けられるNE!」 # ジョゼフ「それだけじゃダメだYO!みかんは一つひとつ大きさが違うんだから、その辺も考えてきっちり分けNIGHT!」 # # # 【問題】 # # 30個のみかんがあります。3人で10個ずつ分けようと思いますが、不公平にならないよう、みかんの重さの合計が均一になるように分けてください。たとえば、次のような重さのみかん6個 # 101g # 103g # 110g # 105g # 114g # 112g # # を、3人で2つずつ分ける場合、重さの合計が等しくなるように分けると # (101g, 114g) # (103g, 112g) # (105g, 110g) # # のように、合計が215グラムになるように分けることができます。 # # みかんの重さのデータを標準入力から読み込み、それを重さの合計・個数ともに3等分するプログラムを書いてください。 # # # 【入力】 # # 入力はテキストファイルで用意されています。これを標準入力から読み込んでください。 # 入力ファイルの1行目には、みかんの個数Nが与えられます。 # 2行目以降のN行分が、みかんの重さ(正の整数)です。 # # # 【出力】 # # 標準出力に、3等分したみかんのグループを出力してください。 # 1行につき1グループ、計3行を出力します。それ以外は出力しないでください。 # 分け方が複数ある場合、その中の1種類だけを出力してください。 # # # 【入出力例】 # # - sample1.in.txt # 6 # 101 # 103 # 110 # 105 # 114 # 112 # # - sample1.out.txt # (101, 114) # (103, 112) # (105, 110) # # # # - sample2.in.txt # 12 # 147 # 105 # 99 # 116 # 105 # 119 # 93 # 132 # 123 # 95 # 101 # 82 # # - sample2.out.txt # (82, 105, 105, 147) # (93, 95, 119, 132) # (99, 101, 116, 123) '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル) :- '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計), 配分した候補を得て(_みかんの重さならび,_一人あたりの重さ合計,_重複を許す配分した候補), 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補). '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計) :- 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび), sum_list(_みかんの重さならび,_みかんの重さの合計), _一人あたりの重さ合計 is _みかんの重さの合計 // 3. 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび) :- see(_入力ファイル), 先頭行から行数を得る(_みかんの個数), 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび), seen. 先頭行から行数を得る(_行数) :- 整数入力(_行数). 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび) :- findall(_みかんの重さ,( between(1,_みかんの個数,_), 整数入力(_みかんの重さ)),_みかんの重さならび). 配分した候補を得て(_みかんの重さならび,_合計目標,_重複を許す配分した候補) :- findall(LL,同量に配分する(_みかんの重さならび,_合計目標,[],LL),_重複を許す配分した候補). 同量に配分する([],_,LL,LL). 同量に配分する(_みかんの重さならび,_合計目標,LL1,LL) :- 組み合計を得る(_みかんの重さならび,_合計目標,[],L,_残りみかんの重さならび), forall(member(L1,LL1),L1 @>= L), 同量に配分する(_残りみかんの重さならび,_合計目標,[L|LL1],LL). 組み合計を得る(_残りみかんの重さならび,_合計目標,L,L,_残りみかんの重さならび) :- sum_list(L,_合計目標). 組み合計を得る(_みかんの重さならび_1,_合計目標,L1,L,_残りみかんの重さならび) :- select(_一個,_みかんの重さならび_1,_残りみかんの重さならび_2), forall(member(A,L1),A @>= _一個), 組み合計を得る(_残りみかんの重さならび_2,_合計目標,[_一個|L1],L,_残りみかんの重さならび). 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補) :- 重複なく昇順に整列する(_重複を許す配分した候補,_候補リスト), 一行ずつ出力する(_出力ファイル,_候補リスト). 重複なく昇順に整列する(L1,L2) :- 重複なく昇順に整列する(L1,[],L2). 重複なく昇順に整列する([],L,L). 重複なく昇順に整列する([_軸要素|L1],L2,L3) :- 重複のない昇順分割(_軸要素,L1,LS,LB), 重複なく昇順に整列する(LS,[_軸要素|L3_2],L3), 重複なく昇順に整列する(LB,L2,L3_2). 重複のない昇順分割(_,[],[],[]). 重複のない昇順分割(_軸要素,[A|R1],[A|R2],R3) :- A @< _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[A|R1],R2,[A|R3]) :- A @> _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[_軸要素|R1],R2,R3) :- 重複のない昇順分割(_軸要素,R1,R2,R3). 一行ずつ出力する(_出力ファイル,_候補リスト) :- tell(_出力ファイル), forall(member(_三人分のみかんの重さならび,_候補リスト),配分候補ならびを三行で出力する(_三人分のみかんの重さならび)), told. 配分候補ならびを三行で出力する(_三人分のみかんの重さならび) :- forall(member(_みかんの重さならび,_三人分のみかんの重さならび),( 表示パターンのつくり(_みかんの重さならび,_表示パターン), writef(_表示パターン,_みかんの重さならび))). 表示パターンのつくり(_みかんの重さならび,_表示パターン) :- length(_みかんの重さならび,_要素数), findall('%t',between(1,_要素数,_),_表示パターンならび), atomic_list_concat(_表示パターンならび,',',_表示パターン_1), atomic_list_concat(['(',_表示パターン_1,')\n'],_表示パターン). 整数入力(_整数) :- 行入力(_行), read_term_from_atom(_行,_整数,[]). 行入力(_行) :- get_char(_文字), 行の文字ならび(_文字,_行の文字ならび), atom_chars(_行,_行の文字ならび). 行の文字ならび(end_of_file,[]) :- !. 行の文字ならび('\n',[]) :- !. 行の文字ならび(_文字,[_文字|R]) :- get_char(_次の文字), 行の文字ならび(_次の文字,R). ユーザパラメータならび(_ユーザパラメータならび) :- current_prolog_flag(argv,_ユーザパラメータならび). program :- ユーザパラメータならび([_入力ファイル,_出力ファイル]), '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル). :- program,halt. % 以下のサイトは 250 ToastXToast 要約  何種類かのパンがあり,種類ごとにちょうどよい焼き時間が決まっている.その焼き時間より短ければ生焼けで,長ければ焦げてしまう.またどの種類のパンかは見た目にはわからない.生焼けのパンと焦げたパンがいくつか与えられていて.それぞれのパンの焼いた時間がわかっている.また,それぞれの種類で生焼けのパンと焦げたパンが少なくとも1枚ずつある事もわかっている.パンの種類として考えられるもののうち最小値を求めよ.  生焼けのパンの数と焦げたパンの数は1以上50以下,それぞれのパンの焼いた時間は1以上1000000以下.同じ時間だけ焼いたパンは2枚以上存在しない事は保証されている. 方針 生焼けのパンを○,焦げたパンを●で表し,焼き時間を横軸で表すと,一般的な状況では ○○ー○○○○○○ーーーー○○ーー○ー○○○ーー ーー●ーーーーーー●●●●ーー●●ー●ーーー●● の用になっている.この場合, ○○ー○○○○○○ーーーー○○ーー○ー○○○ーー ーーーーーーーーーーーーーーーーーーーーーー●● と ○○ーーーーーーーーーーーーーーーーーーーーーー ーー●ーーーーーー●●●●ーー●●ー●ーーーーー とわけることができ,答えは2種類とわかる.あとはこの状況にならないのはいつかを考えればよい. コード例 #include #include #include #include #include using namespace std; class ToastXToast { public: int bake(vector under, vector over) { sort(under.begin(), under.end()); sort(over.begin(), over.end()); if(over[0] <= under[0] ) return -1; if(under[under.size()-1] >= over[over.size()-1]) return -1; if(over[0] > under[under.size()-1]) return 1; else return 2; } }; 500 KingdomXCitiesandVillage 要約  座標平面上の格子点に町がいくつかと村がいくつか配置されている.次のアルゴリズムで,すべての村をいずれかの町と道路でつなぐ. はじめ,すべての村は町につながっていない 町につながっていない村をランダムに一つ選ぶ (それを sv(selected village) とする) 町 or「既に町につながっている村」のなかで sv に(ユークリッド距離で)最も近いものを選び,その2つを道路でつなぐ.最も近いものが複数ある場合はランダムに選ぶ. sv を「既に町につながっている村」に昇格させる. これをすべての村がつながるまで繰り返す.  道路の総距離の期待値を答えよ.町と村の数はそれぞれ1以上50以下,それぞれの町,村の座標は0以上1000000以下.同じ箇所に複数の町や村はない事は保証されている. 方針  まず期待値の加法性から,各々の村から延ばす道路の距離の期待値を合計すればよいので,一つの村に注目する(以降その村をvとし,その村から最も近い町をcとする).v とつながる可能性のある村は,v との距離が vc 間より短いもののみである.まずそれだけを取り出し v との距離が短い順に v[1], v[2], ・・・, v[k] とする.v と c がつながるのは,v が v[1], v[2], ・・・v[k] のいずれよりも先に選ばれたときなので,その確率は 1/(k+1).v と v[j] がつながるのは「 v[j]が vより先に選ばれ,かつvが v[1], v[2], ・・・, v[j-1]より先に選ばれる」ときである(前者が満たされないとv[j]は村とつながっていないのでそもそも候補に入らず,また後者が満たされないとvはv[1]・・・v[j-1]のいずれかとつながってしまう).v[j+1]・・・v[k]には制限がないので考慮しなくても良い.j+1個の球を横一列に並べる事を考えると,条件を満たすのは最左にv[j], その隣に v ,残りj-1個にv[1]・・・v[j-1]を自由に並べかえるものなので,その場合の数は(j - 1)!,全事象は(j + 1)! なので,求める確率は(j-1)! / (j+1)! = 1/ ( j * (j + 1) ) . #include #include #include #include #include #include using namespace std; typedef long long ll; ll dist2(int ax, int ay, int bx, int by){ return (ll)(ax - bx) * (ax - bx) + (ll)(ay - by) * (ay - by) ; } class KingdomXCitiesandVillages { public: double determineLength(vector cx, vector cy, vector vx, vector vy) { int n = cx.size(); int m = vx.size(); double ans = 0; for(int i = 0;i kouho; for(int j = 0;j% 以下のサイトは merge_sort(L1,L2) :- merge_sort_0(L1,L1_1), merge_sort_1(L1_1,L2). merge_sort_0([],[]). merge_sort_0([A],[[A]]). merge_sort_0([A,B|R1],[[A,B]|R2]) :- A @< B, merge_sort_0(R1,R2). merge_sort_0([A,B|R1],[[B,A]|R2]) :- A @>= B, merge_sort_0(R1,R2). merge_sort_1([L],L) :- !. merge_sort_1(L1,L2) :- merge_sort_2(L1,L1_2), merge_sort_1(L1_2,L2). merge_sort_2([],[]). merge_sort_2([L1],[L1]). merge_sort_2([L1,L2|R1],[L|R2]) :- merge(L1,L2,L), merge_sort_2(R1,R2). merge([],X,X) :- !. merge(X,[],X) :- !. merge([A|R1],[B|R2],[A|R3]) :- A @< B, merge(R1,[B|R2],R3). merge([A|R1],[B|R2],[B|R3]) :- A @>= B, merge([A|R1],R2,R3). % 以下のサイトは # 出典:: 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). % 以下のサイトは 既に昇順整列した二つのリストの併合(L1,L2,L3) :- '第一引数、第二引数のどちらかが[]の場合停止できる'(L1,L2,L3). 既に昇順整列した二つのリストの併合(L1,L2,L3) :- '第一引数、第二引数どちらも[]ではない場合、併合を続ける'(L1,L2,L3). '第一引数、第二引数のどちらかが[]の場合停止できる'([],L,L). '第一引数、第二引数のどちらかが[]の場合停止できる'(L,[],L). '第一引数、第二引数どちらも[]ではない場合、併合を続ける'([A|R1],[B|R2],L3) :- 'AがBより小さい場合はAを選択して併合を続ける'([A|R1],[B|R2],L3). '第一引数、第二引数どちらも[]ではない場合、併合を続ける'([A|R1],[B|R2],L3) :- 'AがBに等しいか大きい場合はBを選択して併合を続ける'([A|R1],[B|R2],L3). 'AがBより小さい場合はAを選択して併合を続ける'([A|R1],[B|R2],[A|R3]) :- A @< B, 既に昇順整列した二つのリストの併合(R1,[B|R2],R3). 'AがBに等しいか大きい場合はBを選択して併合を続ける'([A|R1],[B|R2],[B|R3]) :- A @>= B, 既に昇順整列した二つのリストの併合([A|R1],R2,R3). % 以下のサイトは % % 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). % % 以下のサイトは # # qsort # 昇順整列([],[]). 昇順整列(_要素ならび,_昇順に整列した要素ならび) :- 軸要素(_要素ならび,_軸要素,_軸要素を除いた要素ならび), '軸要素より小さい要素ならびを昇順に整列したものと,軸要素に等しいか大きい要素ならびを昇順に整列したものを軸要素を挟んで結合する'(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した要素ならび). 軸要素(_要素ならび,_軸要素,_軸要素を除いた要素ならび) :- select(_軸要素,_要素ならび,_軸要素を除いた要素ならび),!. '軸要素より小さい要素ならびを昇順に整列したものと,軸要素に等しいか大きい要素ならびを昇順に整列したものを軸要素を挟んで結合する'(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した要素ならび) :- 軸要素より小さい要素ならびを昇順に整列したものと(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した軸要素より小さい要素ならび), 軸要素に等しいか大きい要素ならびを昇順に整列したものを(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した軸要素に等しいか大きい要素ならび), 軸要素を挟んで結合する(_昇順に整列した軸要素より小さい要素ならび,_軸要素,_昇順に整列した軸要素に等しいか大きい要素ならび,_昇順に整列した要素ならび). 軸要素より小さい要素ならびを昇順に整列したものと(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した軸要素より小さい要素ならび) :- findall(_軸要素より小さい要素,( member(_軸要素より小さい要素,_軸要素を除いた要素ならび), _軸要素より小さい要素 @< _軸要素),_軸要素より小さい要素ならび), 昇順整列(_軸要素より小さい要素ならび,_昇順に整列した軸要素より小さい要素ならび). 軸要素に等しいか大きい要素ならびを昇順に整列したものを(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した軸要素に等しいか大きい要素ならび) :- findall(_軸要素に等しいか大きい要素,( member(_軸要素に等しいか大きい要素,_軸要素を除いた要素ならび), _軸要素に等しいか大きい要素 @>= _軸要素),_軸要素に等しいか大きい要素ならび), 昇順整列(_軸要素に等しいか大きい要素ならび,_昇順に整列した軸要素に等しいか大きい要素ならび). 軸要素を挟んで結合する(_昇順に整列した軸要素より小さい要素ならび,_軸要素,_昇順に整列した軸要素に等しいか大きい要素ならび,_昇順に整列した要素ならび) :- append(_昇順に整列した軸要素より小さい要素ならび,[_軸要素|_昇順に整列した軸要素に等しいか大きい要素ならび],_昇順に整列した要素ならび). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/db/1402919549/310 # SQLServer2012です # 日々の売上の合計が一定額を越えた日を知るにはどうすればいいでしょうか? # # 10/1 |\100 # 10/2 |\200 # 10/3 |\300 # 10/4 |\200 # 10/5 |\400 # 10/6 |\100 # # 上記で\1000を越えた日=10/5と出したいです # 売上(10/1,100). 売上(10/2,200). 売上(10/3,300). 売上(10/4,200). 売上(10/5,400). 売上(10/6,100). '日々の売上の合計が一定額を越えた日を知る'(_一定額,_日々の売上の合計が一定額を越えた日) :- 整列した_日付_売上ならび(_整列した_日付_売上ならび), 日々の売上の合計が(_整列した_日付_売上ならび,_日々の売上の合計,_日々の売上の合計が一定額を越えた日), 一定額を越えた(_一定額,_日々の売上の合計),!. 整列した_日付_売上ならび(_整列した_日付_売上ならび) :- findall([_日付,_売上],売上(_日付,_売上),_日付_売上ならび), sort(_日付_売上ならび,_整列した_日付_売上ならび). 日々の売上の合計が(_整列した_日付_売上ならび,_日々の売上の合計,_一定額を越えた日) :- append(LL1,_,_整列した_日付_売上ならび), findsum(_売上,member([_,_売上],LL1),_日々の売上の合計), last(LL1,[_一定額を越えた日,_]). 一定額を越えた(_一定額,_日々の売上の合計) :- _日々の売上の合計 > _一定額. findsum(A,P,Sum) :- findall(A,P,L), sum_list(L,Sum). % 以下のサイトは 昇順鍵整列(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). % 以下のサイトは # 出題場所 :: 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([_短い方から二番目に短い文字列,_短い方から二番目に短い文字数],_連続した文字列と文字数ならび). % 以下のサイトは # 問題文 # 高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k−1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 # # 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べたいと思いました。 # # 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # N # A1 # A2 # : # AN # 1 行目には、硬貨の種類数 N(1≦N≦50) が、1 行で与えられる。 # 2 行目から N 行では、高橋君が各硬貨を何枚持っているかが与えられる。 このうち i(1≦i≦N) 行目では、 i 番目の硬貨を、高橋君が何枚持っているかを表す整数 Ai(0≦Ai≦50000)が与えられる。 # 出力 # 高橋君が払える金額の種類数を、 1000000007 で割った余りを 1 行で出力せよ。出力の末尾は改行をいれること。 # # 入力例1 # 2 # 2 # 1 # 出力例1 # 5 # 払える金額は、1 円, 2 円, 10 円, 11 円, 12 円の 5 通りとなります。 # # 0 円は含まないことに注意してください。 # # 入力例2 # 2 # 32 # 3 # 出力例2 # 62 # 1 円から 62 円の 62 通りの金額を支払うことが出来ます。 # # 入力例3 # 4 # 12 # 3 # 7 # 34 # 出力例3 # 12039 # 入力例4 # 10 # 1234 # 2 # 857 # 3858 # 1 # 5000 # 32 # 4 # 1 # 857 # 出力例4 # 969347336 # 1000000007 で割った余りを出力してください。 # '高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k‐1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べた いと思いました。 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるた め、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。' :- 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび), 硬貨の合計金額種類(_枚数ならび,_何通り), '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り). 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび) :- 標準入力から整数を得る(_何種類), findall(_整数,( between(1,_何種類,_), 標準入力から整数を得る(_整数)), _枚数ならび). 硬貨の合計金額種類(_枚数ならび,_何通り) :- findall(_合計金額,合計金額(0,_枚数ならび,0,_合計金額),L1), sort(L1,L2), length(L2,_何通り). 合計金額(N,[],_合計金額,_合計金額). 合計金額(N,[_枚数|R],_合計金額_1,_合計金額) :- '1から枚数分を増やして合計金額を非決定性に計算していく'(N,_枚数,_ご金額金額_1,_合計金額_2), succ(N,N_2), 合計金額(N_2,R,_合計金額_2,_合計金額). '1から枚数分を増やして合計金額を非決定的に計算していく'(N,_枚数,_合計金額_1,_合計金額_2) :- between(1,_枚数,M), _合計金額_2 is _合計金額_1 + 10 ^ N * M. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類),!. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- writef('%t種類\n',[_種類]). '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- _種類 >= 1000000007, _種類を1000000007で割った余り is _種類 mod 1000000007, writef('%t種類\n',[_種類を1000000007で割った余り]). 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 問題文 # (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, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- 標準入力から二つの文字列を得る(A,B), '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B). '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- 文字列と仲良し文字列(A,B), write('YES\n'),!. '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- write('NO\n'). 文字列と仲良し文字列(_文字列,_仲良し文字列) :- 二つの文字列をならびに変換する(_文字列,_仲良し文字列,L1,L2), '二つのならびの差分(L3,L4)と同一部分(L5)'(L1,L2,L3,L4,L5), 三組のスワップが存在する(L3,L4,L5,Len). 二つの文字列をならびに変換する(_文字列,_仲良し文字列,L1,L2) :- atom_chars(_文字列,L1), atom_chars(_仲良し文字列,L2). '二つのならびの差分(L3,L4)と同一部分(L5)'([],[],[],[],[]). '二つのならびの差分(L3,L4)と同一部分(L5)'([A|R1],[A|R2],R3,R4,[A|R5]) :- '二つのならびの差分(L3,L4)と同一部分(L5)'(R1,R2,R3,R4),!. '二つのならびの差分(L3,L4)と同一部分(L5)'([A|R1],[B|R2],[A|R3],[B|R4],R5) :- '二つのならびの差分(L3,L4)と同一部分(L5)'(R1,R2,R3,R4,R5). 三組のスワップが存在する(L3,L4,L5,Len) :- 二つのならびは同一要素からなる(L3,L4,Len), 整列(L5,L6), 同一文字のペアの可能性を含めて三組のスワップが存在するかどうかの検査(Len,L6). 二つのならびは同一要素からなる(L3,L4,Len) :- length(L3,Len), length(L4,Len). 同一の要素からなる(L3,L4). 同一の要素からなる([],[]). 同一の要素からなる([A|R1],L2) :- select(A,L2,R2), 同一の要素からなる(R1,R2). 同一文字のペアの可能性を含めて三組のスワップが存在するかどうかの検査(Len,L6) :- 同一文字ペアを数える(L6,_同一文字ペア数), 同一文字同士のスワップ検査(Len,_同一文字ペア数). 同一文字ペアの数を数える([],[]). 同一文字ペアの数を数える([A,A|R],[_|R2]) :- 同一文字ペアの数を数える(R1,R2),!. 同一文字ペアの数を数える([_|R1],R2) :- 同一文字ペアの数を数える(R1,R2). 同一文字同士のスワップ検査(3,_) :- !. 同一文字同士のスワップ検査(2,[_|_]) :- !. 同一文字同士のスワップ検査(1,[_,_|_]) :- !. 同一文字同士のスワップ検査(0,[_,_,_|_]). 整列([],[]). 整列([_軸要素|_残りならび],_整列したならび) :- 軸要素との大小で分割してそれぞれ整列する(_軸要素,_残りならび,_整列したL1,_整列したL2), append(_整列したL1,[_軸要素|_整列したL2],_整列したならび). 軸要素との大小で分割してそれぞれ整列する(_軸要素,_残りならび,_整列したL1,_整列したL2) :- 分割(_軸要素,_残りならび,L1,L2), 整列(L1,_整列したL1), 整列(L2,_整列したL2). 分割(_軸要素,[],[],[]). 分割(_軸要素,[A|R1],[A|R2],R3) :- 軸要素より大きい時は(_軸要素,A,R1,R2,R3). 分割(_軸要素,[A|R1],[A|R2],R3) :- 軸要素と等しいか小さい時は(_軸要素,A,R1,R2,R3). 軸要素より大きい時は(_軸要素,A,R1,R2,R3) :- _軸要素 @< A, 分割(_軸要素,R1,R2,R3). 軸要素と等しいか小さい時は(_軸要素,A,R1,R2,R3) :- _軸要素 @>= A, 分割(_軸要素,R1,R2,R3). 標準入力から二つの文字列を得る(A,B) :- 標準入力から文字列を得る(A), 標準入力から文字列を得る(B). 標準入力から文字列を得る(_文字列) :- findall(_文字,( 一文字を得る(_文字), (終了文字(_文字),!,fail;true)),_文字ならび), atom_chars(_文字列,_文字ならび). 一文字を得る(_文字) :- get_char(_文字). 一文字を得る(_文字) :- 一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0.0,200.0,_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), read_term_from_atom(_身長文字列,_身長,[]), read_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重) :- 収束条件を満たす(_体重_下,_体重_上,_体重),!. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下_1,_体重_上_1,_身長,_BMI,_体重) :- '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重). 収束条件を満たす(_体重_下,_体重_上,_体重) :- (_体重_上 - _体重_下) < 0.1, _体重 is (_体重_上 + _体重_下) / 2. '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上) :- '新しい体重とその時のBMIを計算する'(_体重_下_1,_体重_上_1,_身長,_BMI_2,_体重_2), '次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_体重_2,_BMI,_BMI_2,_体重_下,_体重_上). '新しい体重とその時のBMIを計算する'(_体重_下,_体重_上,_身長,_BMI_2,_体重_2) :- _体重_2 is (_体重_下 + _体重_上) / 2, _BMI_2 is _体重_2 / ((_身長 / 100) ^ 2). '次の体重の計算区間を得る'(_体重_下,_,_体重_2,_BMI,_BMI_2,_体重_下,_体重_2) :- _BMI_2 =< _BMI,!. '次の体重の計算区間を得る'(_体重_下,_体重_上,_体重_2,_BMI,_BMI_2,_体重_2,_体重_上). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % これはsplitをわかりやすいように簡略化した定義です。 % より完全なsplit/3の定義はこちらをご覧ください % split(_文,_区切り語ならび,_区切られた語ならび) :- 区切り語ならびの変形(_区切り語ならび,SeparatersL), atom_chars(_文,_文字ならび), split_list_1(_文字ならび,SeparatersL,_区切られた語ならび). sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. 'SPLIT'(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Z), Z = X,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% split_list([],SeparatersL,[]). split_list(L1,SeparatersL,[L2|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), split_list(R2,SeparatersL,R). split_list(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list(R2,SeparatersL,X). split_list_1([],SeparatersL,[]). split_list_1(L1,SeparatersL,[A|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), atom_chars(A,L2), split_list_1(R2,SeparatersL,R). split_list_1(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list_1(R2,SeparatersL,X). split_list_2([],_,[],[]). split_list_2(L1,SeparatersL,[],R) :- member(L2,SeparatersL), append(L2,R,L1). split_list_2([A|R1],SeparatersL,[A|R2],R) :- \+((member(L2,SeparatersL),append(L2,_,[A|R1]))), split_list_2(R1,SeparatersL,R2,R). 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび), atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). 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),!. 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),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,NL), catch(atom_chars(C,NL),_,fail),!. split_5(B,C) :- concat_atom(B,C),!. split_32(['"','"'|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_32([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"','"'|R],R2,_区切り符号,_区切り符号ならび,['"'|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42([],[],'',_,[]) :- !. numeric_list([],[]) :- !. numeric_list([A|R],[B|R1]) :- digit(A), char_code(A,B), numeric_list(R,R1),!. numeric_list(['.'|R],[46|R1]) :- numeric_list(R,R1),!. numeric_list([-|R],[45|R1]) :- numeric_list(R,R1),!. number(A,B) :- number_codes(A,B). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/737 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 以下のプログラムを作成しなさい. # ソートされた2つの数字列を入力 # *0より大きい整数 # *1行に5つの数字(固定) # それらを合わせて、ソートし、 # 大きい数から3つを表示すること # 実行例) # 11 21 23 33 35 入力1 # 24 25 27 32 85 入力2 # 85 35 33 出力 # 5 14 33 302 990 入力1 # 25 31 200 210 500 入力2 # 990 500 302 出力 # 21 43 99 100 902 入力1 # 10 20 30 275 320 入力2 # 902 320 275 出力 # 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定) それらを合わせて、ソートし、 大きい数から3つを表示すること' :- 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1,_数字ならび_2), 'それらを合わせて、ソートし、'(_数字ならび_1,_数字ならび_2,_整列した数字ならび), '大きい数から3つを表示すること'(_整列した数字ならび). 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1,_数字ならび_2) :- 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1), 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_2). 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'([_1,_2,_3,_4,_5]) :- '数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび), ソートされた数字列(_数字ならび),!. 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび) :- 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび). '数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび) :- write('5個の数字をカンマ区切りで入力して下さい : '), get_split_line([',',' '],[_1,_2,_3,_4,_5]). ソートされた数字列([_1,_2,_3,_4,_5]) :- sort([_1,_2,_3,_4,_5],[_1,_2,_3,_4,_5]), forall(member(A,[_1,_2,_3,_4,_5]),number(A)). 'それらを合わせて、ソートし、'(_数字ならび_1,_数字ならび_2,_整列した数字ならび) :- append(_数字ならび_1,_数字ならび_2,_数字ならび), sort(_数字ならび,_整列した数字ならび). '大きい数から3つを表示すること'(_整列した数字ならび) :- append(_,[_3,_2,_1],_整列した数字ならび), writef('%3r%3r%3r\n',[_1,_2,_3]). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/737 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 以下のプログラムを作成しなさい. # ソートされた2つの数字列を入力 # *0より大きい整数 # *1行に5つの数字(固定) # それらを合わせて、ソートし、 # 大きい数から3つを表示すること # 実行例) # 11 21 23 33 35 入力1 # 24 25 27 32 85 入力2 # 85 35 33 出力 # 5 14 33 302 990 入力1 # 25 31 200 210 500 入力2 # 990 500 302 出力 # 21 43 99 100 902 入力1 # 10 20 30 275 320 入力2 # 902 320 275 出力 # 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定) それらを合わせて、ソートし、 大きい数から3つを表示すること' :- 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1,_数字ならび_2), 'それらを合わせて、ソートし、'(_数字ならび_1,_数字ならび_2,_整列した数字ならび), '大きい数から3つを表示すること'(_整列した数字ならび). 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1,_数字ならび_2) :- 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1), 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_2). 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'([_1,_2,_3,_4,_5]) :- '数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび), ソートされた数字列(_数字ならび),!. 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび) :- 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび). '数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび) :- write('5個の数字をカンマ区切りで入力して下さい : '), get_split_line([',',' '],[_1,_2,_3,_4,_5]). ソートされた数字列([_1,_2,_3,_4,_5]) :- sort([_1,_2,_3,_4,_5],[_1,_2,_3,_4,_5]), forall(member(A,[_1,_2,_3,_4,_5]),number(A)). 'それらを合わせて、ソートし、'(_数字ならび_1,_数字ならび_2,_整列した数字ならび) :- append(_数字ならび_1,_数字ならび_2,_数字ならび), sort(_数字ならび,_整列した数字ならび). '大きい数から3つを表示すること'(_整列した数字ならび) :- append(_,[_3,_2,_1],_整列した数字ならび), writef('%3r%3r%3r\n',[_1,_2,_3]). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #466 # お題 # 昇順の数列A[a0,a1,..,an]とAの要素amを一つ指定する # Aの要素からなる数列Bを与えて[am,am+1,..,an,a0,a1,..,am-1]の順番で整列させよう # 例 # 入: A = [2,3,5,7,9], a = 2, B = [9,2,5] # 出: [2,5,9] # 入: A = [2,3,5,7,9], a = 9, B = [9,2,5] # 出: [9,2,5] # 入: A = [2,3,5,7,9], a = 5, B = [9,2,5] # 出: [5,9,2] # 入: A = [2,3,5,7,9], a = 3, B = [9,2,5,5,2] # 出: [5,5,9,2,2] '昇順の数列A[a0,a1,..,an]とAの要素amを一つ指定する Aの要素からなる数列Bを与えて[am,am+1,..,an,a0,a1,..,am-1]の順番で整列させよう'(A,_am,B,_整列したならび) :- '[am,am+1,..,an,a0,a1,..,am-1]の順番で'(A,_am,_順番ならび), 整列させよう(B,_順番ならび,_整列したならび). '[am,am+1,..,an,a0,a1,..,am-1]の順番で'(A,_am,_順番ならび) :- append(L1,[_am|L2],A), append([_am|L2],L1,_順番ならび),!. 整列させよう(B,_順番ならび,_整列したならび) :- findall(_a,( append(L0,[_a|_],_順番ならび), \+(member(_a,L0)), member(_a,B)), _整列したならび). % 以下のサイトは # 出典 :: 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). % 以下のサイトは # 質問です。 # 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) :- '要するに第一キーは降順、第二キーは昇順で整列する。'(L1,_第一番目の日付ならび), 情報を取り出す(_第一番目の日付ならび,L1,_DATE,_CODE,_VALUE). '要するに第一キーは降順、第二キーは昇順で整列する。'(L1,_第一番目の日付ならび) :- 第一キー順序(_逆順コードならび), setof(_第一番目の日付, [_CODE,_第一番目の日付] ^ ( 'CODEを取り出す'(_逆順コードならび,_CODE), 第二キー順序(_CODE,_,_第一番目の日付)),_第一番目の日付ならび). 第一キー順序(_逆順コードならび) :- setof(_CODE,[_DATE,_CODE,_VALUE] ^ 元テーブル(_DATE,_CODE,_VALUE),L1), reverse(L1,_逆順コードならび). 逆順に整列して取り出す(_逆順コードならび,_CODE) :- member(_CODE,_逆順コードならび). 第二キー順序(_CODE,[_第一番目の日付|R],_第一番目の日付) :- setof(_DATE,[_DATE,_CODE,_VALUE] ^ 元テーブル(_DATE,_CODE,_VALUE),[_第一番目の日付|R]). 情報を取り出す(_第一番目の日付ならび,_逆順コードならび,_DATE,_CODE,_VALUE) :- member(_DATE_1,_第一番目の日付ならび), 'CODEを決める'(_逆順コードならび,_DATE_1,_CODE), 元テーブル(_DATE,_CODE,_VALUE). 'CODEを決める'(_逆順コードならび,_DATE_1,_CODE) :- member(_CODE,_逆順コードならび), setof(_DATE,[_DATE,_VALUE] ^ 元テーブル(_DATE,_CODE,_VALUE),[_DATE_1|_]). % 以下のサイトは # お題:二次元配列を各行、各列ともに昇順になるように並べ替える。 # 例 # 1 5 3 4 # 0 4 1 0 # 7 2 3 1 #  ↓ # 0 0 1 4 # 1 2 3 5 # 1 3 4 7 '二次元配列を各行、各列ともに昇順になるように並べ替える。'(_二次元ならび,_各行各列ともに昇順ならび) :- flatten(_二次元ならび,L1), 要素に重複を許す昇順整列(L1,[L|R2]), length(L,Len), 二次元ならびと同型に構成する([L|R2],Len,_各行各列ともに昇順ならび). 二次元ならびと同型に構成する([],_,[]). 二次元ならびと同型に構成する(L1,Len,[L3|R3]) :- length(L3,Len), append(L3,R1,L1), 二次元ならびと同型に構成する(R1,Len,R3). 要素に重複を許す昇順整列([],[]). 要素に重複を許す昇順整列([_軸要素|R],L) :- '軸要素で分割する(要素の重複を許す)'(_軸要素,R,L1,L2), 整列(L1,L1_2), 整列(L2,L2_2), append(L1_2,[_軸要素|L2_2],L). '軸要素で分割する(要素の重複を許す)'(_,[],[],[]). '軸要素で分割する(要素の重複を許す)'(_軸要素,[A|R],[A|R1],L2) :- _軸要素 @>= A, '軸要素で分割する(要素の重複を許す)'(_軸要素,R,R1,L2). '軸要素で分割する(要素の重複を許す)'(_軸要素,[A|R],L1,[A|R2]) :- _軸要素 @< A, '軸要素で分割する(要素の重複を許す)'(_軸要素,R,L1,R2). % 以下のサイトは # # 成績 [氏名,成績1,成績2, ... 成績n] の合計点順の # 順位を振る非決定性述語 # 成績の合計順に順位付けする(_成績ならび,_順位,_組) :- 成績の合計順に(_成績ならび,_成績の合計順に降順整列したならび), 順位付けする(_成績の合計順に降順整列したならび,_順位,_組). 成績の合計順に(_成績ならび,_成績の合計順に降順整列したならび) :- 整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび), 降順整列(_合計点を先頭に付加された成績ならび,_成績の合計順に降順整列した合計点を先頭に付加された成績ならび), 先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび). 整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび) :- findall([_合計点,_氏名|L],( member([_氏名|L],_成績ならび), sum_list(L,_合計点)),_合計点を先頭に付加された成績ならび). 先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび) :- findall(L,( member([_|L],_成績の合計順に降順整列した合計点を先頭に付加された成績ならび)),_成績の合計順に降順整列したならび). 降順整列([],[]). 降順整列([_軸要素|R],L) :- 軸要素との大小で二列を作りそれぞれ降順整列したものを結合する(_軸要素,R,L). 軸要素との大小で二列を作りそれぞれ降順整列したものを結合する(_軸要素,R,L) :- 降順整列の分割(_軸要素,R,L1,L2), それぞれ降順整列したものを結合する(_軸要素,L1,L2,L). 降順整列の分割(_,[],[],[]). 降順整列の分割(_軸要素,L,L1,L2) :- '軸要素との大小でL1,L2に割り振る'(_軸要素,L,L1,L2). '軸要素との大小でL1,L2に割り振る'(_軸要素,L,L1,L2) :- 'L1に要素を付加してさらに分割を続ける'(_軸要素,L,L1,L2). '軸要素との大小でL1,L2に割り振る'(_軸要素,L,L1,L2) :- 'L2に要素を付加してさらに分割を続ける'(_軸要素,L,L1,L2). 'L1に要素を付加してさらに分割を続ける'(_軸要素,[_要素|R],[_要素|L1],L2) :- _要素 @>= _軸要素, 降順整列の分割(_軸要素,R,L1,L2). 'L2に要素を付加してさらに分割を続ける'(_軸要素,[_要素|R],L1,[_要素|L2]) :- _要素 @< _軸要素, 降順整列の分割(_軸要素,R,L1,L2). それぞれ降順整列したものを結合する(_軸要素,L1,L2,L) :- 降順整列(L1,L1_2), 降順整列(L2,L2_2), append(L1_2,[_軸要素|L2_2],L). 順位付けする(_整列した組みならび,_順位,_組) :- 順位付けする(_整列した組みならび,[],[],_順位,_組). 順位付けする([_組|_],Ln,_,_順位,_組) :- length([_|Ln],_順位). 順位付けする(L,Ln,Ln_2,_順位,_組) :- 同順位になる場合を考慮しながら順位付けをしていく(L,Ln,Ln_2,_順位,_組). 同順位になる場合を考慮しながら順位付けをしていく(L,Ln,Ln_2,_順位,_組) :- 順位調整(L,Ln,Ln_2,_新しいL,_新しいLn,_新しいLn_2), 順位付けする(_新しいL,_新しいLn,_新しいLn_2,_順位,_組). 順位調整(L,_順位,_位置順位,_新しいL,_新しい順位,_新しい位置順位) :- '合計点が同点の場合は同順位。_位置順位のみ更新する'(L,_順位,_位置順位,_新しいL,_新しい順位,_新しい位置順位),!. 順位調整(L,_順位,_位置順位,_新しいL,_新しい順位,_新しい位置順位) :- '合計点が同点でない場合は、順位とはすなわち_位置順位である'(L,_順位,_位置順位,_新しいL,_新しい順位,_新しい位置順位). '合計点が同点の場合は同順位。_位置順位のみ更新する'([_組_1,_組_2|R],_順位,_位置順位,[_組_2|R],_順位,[_|_位置順位]) :- 第二項以降の合計点が同じ(_組_1,_組_2). '合計点が同点でない場合は、順位とはすなわち_位置順位である'([_|R],_,_位置順位,R,[_|_位置順位],[_|_位置順位]). 第二項以降の合計点が同じ([_|R1],[_|R2]) :- sum_list(R1,S), sum_list(R2,S). % 以下のサイトは # # 成績 [氏名,成績1,成績2, ... 成績n]の成績の合計点順の # 順位を振る非決定性述語 # 順位付け(_整列した組みならび,_順位,_組) :- 順位付け(_整列した組みならび,[],[],_順位,_組). 順位付け([_組|_],Ln,_,_順位,_組) :- length([_|Ln],_順位). 順位付け([_組_1,_組_2|R],Ln,Ln_2,_順位,_組) :- 第二項以降の合計点が同じ(_組_1,_組_2),!, 順位付け([_組_2|R],Ln,[_|Ln_2],_順位,_組). 順位付け([_|R],_,Ln_2,_順位,_組) :- 順位付け(R,[_|Ln_2],[_|Ln_2],_順位,_組). 第二項以降の合計点が同じ([_|R1],[_|R2]) :- sum_list(R1,S), sum_list(R2,S). 成績の合計順に降順整列(_成績ならび,_成績の合計順に降順整列したならび) :- 整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび), 降順整列(_合計点を先頭に付加された成績ならび,_成績の合計順に降順整列した合計点を先頭に付加された成績ならび), 先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび). 整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび) :- findall([_合計点,_氏名|成績ならび],( member([_氏名|_成績ならび],_成績ならび), sum_list(_成績ならび,_合計点)), _合計点を先頭に付加された成績ならび). 先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび) :- findall(L,( member([_|L],_成績の合計順に降順整列した合計点を先頭に付加された成績ならび)), _成績の合計順に降順整列したならび). 降順整列([],[]). 降順整列([_軸要素|R],L) :- 降順整列の分割(_軸要素,R,L1,L2), 降順整列(L1,L1_2), 降順整列(L2,L2_2), append(L1_2,[_軸要素|L2_2],L). 降順整列の分割(_,[],[],[]). 降順整列の分割(_軸要素,[_要素|R],[_要素|L1],L2) :- _要素 @>= _軸要素, 降順整列の分割(_軸要素,R,L1,L2). 降順整列の分割(_軸要素,[_要素|R],L1,[_要素|L2]) :- _要素 @< _軸要素, 降順整列の分割(_軸要素,R,L1,L2). % 以下のサイトは # # 既に整列されている成績 [氏名,成績1,成績2, ... 成績n]の成績の合計点順の # 順位を振る非決定性述語 # 順位付け(_整列した組ならび,_順位,_組) :- 順位付け(_整列した組ならび,[],[],_順位,_組). 順位付け([_組|_],Ln,_,_順位,_組) :- length([_|Ln],_順位). 順位付け([_組_1,_組_2|R],Ln,Ln_2,_順位,_組) :- 第二項以降の合計点が同じ(_組_1,_組_2),!, 順位付け([_組_2|R],Ln,[_|Ln_2],_順位,_組). 順位付け([_|R],_,Ln_2,_順位,_組) :- 順位付け(R,[_|Ln_2],[_|Ln_2],_順位,_組). 第二項以降の合計点が同じ([_|R1],[_|R2]) :- sum_list(R1,S), sum_list(R2,S). % 以下のサイトは % % 非決定性の 降順に順位付け/3 % 降順に順位付け(_先頭に整列対象要素のある要素ならび,_順位,_要素) :- 降順整列(_先頭に整列対象要素のある要素ならび,_降順に整列したならび), append(L1,L2,L3,_降順に整列したならび), 'L2は同一の整列対象要素の最大集合'(L1,L2,L3), 順位と要素(L1,L2,_順位,_要素). 'L2は同一の整列対象要素の最大集合'(L1,L2,L3) :- 先頭の整列対象要素は全て同一(L2,_整列対象要素), 前後には整列対象要素はない(_整列対象要素,L1,L3),!. 前後には整列対象要素はない(_整列対象要素,L1,L3) :- \+(append(_,[[_整列対象要素|_]],L1)), \+(L3 = [[_整列対象要素|_]|_]). 順位と要素(L1,L2,_順位,_要素) :- length([_|L1],_順位), member(_要素,L2). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). 先頭の整列対象要素は全て同一([],_). 先頭の整列対象要素は全て同一([[_要素|_]|R],_要素) :- 先頭の整列対象要素は全て同一(R,_要素). 降順整列([],[]). 降順整列([_軸要素|R],L) :- 降順整列の分割(_軸要素,R,L1,L2), 降順整列(L1,L1_2), 降順整列(L2,L2_2), append(L1_2,[_軸要素|L2_2],L). 降順整列の分割(_,[],[],[]). 降順整列の分割(_軸要素,[_要素|R],[_要素|L1],L2) :- A @>= _軸要素, 降順整列の分割(_軸要素,R,L1,L2). 降順整列の分割(_軸要素,[_要素|R],L1,[_要素|L2]) :- A @< _軸要素, 降順整列の分割(_軸要素,R,L1,L2). % 以下のサイトは # 【問題】 # ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。 # 【例】 # 1 3 4 7 11 6 8 9 7 10 13 14 # # これを昇順に並び替えると # 1 3 4 6 7 7 8 9 10 11 13 14 # # となります。つまり、最初の整数列の、4番目から10番目を並び替えれば良いことになります。このとき、 # 4..10 # # と出力してください。もし、ソートする必要がなければ、 # 0 # # と出力してください。 # # 【解答方法】 # まずはsort.zipをダウンロードしてください。 # 中には6つのファイルが含まれています。 # # answer.txt # 解答用テキストファイルです。 # # input_case_1.txt # input_case_2.txt # input_case_3.txt # input_case_4.txt # input_case_5.txt # 整数列が含まれたデータファイルです。これらを入力として得られた結果を解答していただきます。 # データファイルの整数列は、改行区切りになっています。 # # answer.txtに必要事項を記入し、テキストファイルのままアップロードしてください。 # ※answer.txt以外のファイルをzipに固めてアップロードした場合は評価対象外となります。 # :- op(600,xfx,'::'). 'ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。'(_整数列,_開始位置 :: _終了位置) :- 範囲の開始位置(_整数列,_開始位置), 範囲の終了位置(_整数列,_終了位置),!. 'ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。'(_,0). 範囲の開始位置(L,_開始位置) :- append(L1,[A|L2],L), 'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2),!, length([_|L1],_開始位置). 範囲の終了位置(L,_終了位置) :- reverse(L,LR), append(L1,[A|L2],LR), 'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2),!, length([A|L2],_終了位置). 'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2) :- member(B,L1), B > A. 'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2) :- member(B,L2), B < A. 'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2) :- member(B,L1), B < A. 'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2) :- member(B,L2), B > A. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/577 # こんなSQLがあります。 # # select id, name, utime # from something # order by utime desc; # # このとき、idが、ある指定された値までは読み飛ばし、それ以降のレコードを取得するにはどうしたらいいですか。 # ポイントは、 # * id順とutime順とで順番が異なること # * ソートキーは utime だが、読み飛ばす条件は id を使っていること # # whileループなら簡単な処理ですが、SQLだとどうするのでしょうか。 # # (使用DB: PostgreSQL 9.3) # 'こんなSQLがあります。 select id, name, utime from something order by utime desc; idが、ある指定された値までは読み飛ばし、それ以降のレコードを取得する'(_指定された値,_id,_name,_utime) :- 'idが、ある指定された値までは読み飛ばし、'(_指定された値,_それ以降), それ以降のレコードを取得する(_それ以降,_id,_name,_utime). 'idが、ある指定された値までは読み飛ばし、'(_指定された値,_それ以降) :- findall([_utime,_id,_name],something(_id,_name,_utime),LL1), 降順整列(LL1,LL2), append(_,[[_,_指定された値,_]|_それ以降],LL2),!. それ以降のレコードを取得する(_それ以降,_id,_name,_utime) :- member([_utime,_id,_name],_それ以降). 降順整列([],[]). 降順整列([_軸要素|_残りならび],_降順に整列したならび) :- 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,_残りならび,_軸要素より大きい要素ならび,_軸要素に等しいか小さい要素ならび), それぞれのならびを降順に整列する(_軸要素より大きい要素ならび,_軸要素に等しいか小さい要素ならび,_降順整列ならび_1,_降順整列ならび_2), append(_降順整列ならび_1,[_軸要素|_降順整列ならび_2],_降順に整列したならび). 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,[],[],[]) :- !. 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,[A|R1],[A|R2],R3) :- A @> _軸要素, 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,R1,R2,R3). 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,[A|R1],R2,[A|R3]) :- A @=< _軸要素, 軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,R1,R2,R3). それぞれのならびを降順に整列する(_軸要素より大きい要素ならび,_軸要素に等しいか小さい要素ならび,_降順整列ならび_1,_降順整列ならび_2) :- 降順整列(_軸要素より大きい要素ならび,_降順整列ならび_1), 降順整列(_軸要素に等しいか小さい要素ならび,_降順整列ならび_2),!. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/170 # お題:分母が自然数m以下の既約分数で0より大きく1より小さいものを小さい順にならべる。 # m=3 -> 1/3,1/2,2/3 # m=5 -> 1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4/5 # # '分母が自然数m以下の既約分数で0より大きく1より小さいものを小さい順にならべる。'(_m,_整列した分数ならび) :- findall(_分子 rdiv _分母,分母ごとの既約分数(_m,_分母,_分子),_分数ならび), sort(_分数ならび,_整列した分数ならび). 分母ごとの既約分数(_m,_分母,_分子) :- between(2,_m,_分母), 分子候補を篩に掛ける(2,_分母,_篩に掛けられた分子ならび), member(_分子,_篩に掛けられた分子ならび). 分子候補を篩に掛ける(M,_分母,_篩に掛けられた分子ならび) :- 分子候補を生成(_分母,_数ならび), 分子候補を篩に掛ける(M,_分母,_数ならび,_篩に掛けられた分子ならび). 分子候補を生成(_分母,_数ならび) :- succ(_分母_1,_分母), findall(N,between(1,_分母_1,N),_数ならび). 分子候補を篩に掛ける(_分母,_分母,_篩に掛けられた分子ならび,_篩に掛けられた分子ならび) :- !. 分子候補を篩に掛ける(M,_分母,_数ならび_1,_篩に掛けられた分子ならび) :- 'Mが2から分母になるまで分子候補を篩に掛ける'(M,_分母,_数ならび_1,_篩に掛けられた分子ならび). 'Mが2から分母になるまで分子候補を篩に掛ける'(M,_分母,_数ならび_1,_篩に掛けられた分子ならび) :- 'Mの篩'(M,_分母,_数ならび_1,_数ならび_2), succ(M,M_2), 分子候補を篩に掛ける(M_2,_分母,_数ならび_2,_篩に掛けられた分子ならび). 'Mの篩'(M,_分母,_数ならび_1,_数ならび_2) :- findall(_分子候補,分子候補(M,_分母,_数ならび_1,_分子候補),_数ならび_2). 分子候補(M,_分母,_数ならび_1,_分子候補) :- member(_分子候補,_数ならび_1), 約分できない(M,_分母,_分子候補). 約分できない(M,_分母,_分子候補) :- \+(約分できる(M,_分母,_分子候補)). 約分できる(M,_分母,_分子候補) :- 0 is _分母 mod M, 0 is _分子候補 mod M. % 以下のサイトは # 出題場所 :: 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/1381909900/940 # [1] 授業単元:アルゴリズム概論 # ヒープソートについての課題です # # [2] 問題文 # 以下のプログラムは、整列する配列の添え字の下限が1であることを仮定している. # この過程を除いたプログラムを書け. # すなわち、整列する範囲の下限、上限ともに可変とした場合のヒープソートの手続きを書け。 # ソースコード: http://ime.nu/ideone.com/HOlaTT # 引数に整列した木を形成する(_整列対象となるならび,_整列木) :- _整列対象となるならび = [_最初の要素|R], 引数に整列した木を形成する(R,(_最初の要素,_,_),_整列木). 引数に整列した木を形成する([],_木,_木) :- !. 引数に整列した木を形成する([A|R],_木_1,_木) :- 木に挿入する(A,_木_1,_木_2), 引数に整列した木を形成する(R,_木_2,_木). 木に挿入する(A,_枝,(A,_,_)) :- var(_枝),!. 木に挿入する(A,(_葉,_左枝,_右枝_1),(_葉,_左枝,_右枝_2)) :- A @>= _葉, 木に挿入する(A,_右枝_1,_右枝_2). 木に挿入する(A,(_葉,_左枝_1,_右枝),(_葉,_左枝_2,_右枝)) :- A @< _葉, 木に挿入する(A,_左枝_1,_左枝_2). 整列した木から整列順に要素を取り出す((_葉,_左枝,_右枝),_要素) :- \+(var(_左枝)), 整列した木から整列順に要素を取り出す(_左枝,_要素). 整列した木から整列順に要素を取り出す((_葉,_,_),_葉). 整列した木から整列順に要素を取り出す((_葉,_左枝,_右枝),_要素) :- \+(var(_右枝)), 整列した木から整列順に要素を取り出す(_右枝,_要素). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/541 # 質問です教えてください # # データベース = access # テーブル名 = T_DATA # # SQLで取得したい結果は、KEYごとに日数を取得したいのですが # 重複する日数はカウントから除外したいです。 # どんなSQLを書けばいいですか? # # ・キーは、日数=5日 # ・キーは、日数=1日 # # ---------------------------------- # キー, 開始日, 終了日 # ---------------------------------- # 1, 2014/01/01, 2014/01/01 |→ 日数=1日 # 1, 2014/01/02, 2014/01/02 |→ 日数=1日 # 1, 2014/01/02, 2014/01/02 |→ 日数=0日(重複) # 1, 2014/01/03, 2014/01/03 |→ 日数=1日 # 1, 2014/01/04, 2014/01/05 |→ 日数=2日、合計=5日 # --- # 2, 2014/01/01, 2014/01/01 |→ 日数=1日 # 2, 2014/01/01, 2014/01/01 |→ 日数=0日(重複)、合計=1日 # # ↓これだと重複がカウントされてしまいます。 # SELECT # キー # ,SUM(DATEDIFF('d', 開始日, 終了日)+1) AS 日数 # FROM # T_DATA # GROUP BY # キー # 'データベース = access テーブル名 = T_DATA SQLで取得したい結果は、KEYごとに日数を取得したいのですが 重複する日数はカウントから除外したいです。'(_キーごとの日数) :- setof(_キー,[_キー,_開始日,_終了日] ^ 'T_DATA'(_キー,_開始日,_終了日),_キーならび), findall([_キー,_日数],( member(_キー,_キーならび), キーの日数を得る(_キー,_日数)), _キーごとの日数). キーの日数を得る(_キー,_日数) :- findall(_日,( 'T_DATA'(_キー,_開始日,_終了日), 整数構造に変換(_開始日,_終了日,_開始日整数構造,_終了日整数構造), 範囲の日を引出す(_開始日整数構造,_終了日整数構造,_日)), L1), 重複日を取り除いた日数(L1,_日数). 整数構造に変換(_開始日,_終了日,_開始日整数構造,_終了日整数構造) :- read_term_from_atom(_開始日,_開始日整数構造), read_term_from_atom(_終了日,_終了日整数構造). 範囲の日を引出す(_終了日,_終了日,_終了日) :- !. 範囲の日を引出す(_日,_終了日,_日). 範囲の日を引出す(_日_1,_終了日,_日) :- 翌日(_日_1,_翌日), 範囲の日を引出す(_翌日,_終了日,_日). 翌日(_年/12/_31,_翌年/1/1) :- _翌年 is _年 + 1,!. 翌日(_年/_月/_日,_年/_翌月/1) :- 月末日(_年/_月/_日), _翌月 is _月 + 1,!. 翌日(_年/_月/_日,_年/_月/_翌日の日) :- _翌日の日 is _日 + 1,!. 月末日(_年/2/29) :- うるう年(_年),!. 月末日(_年/2/28) :- \+(うるう年(_年)),!. 月末日(_年/_月/30) :- member(_月,[4,6,9,11]),!. 月末日(_年/_月/31) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 重複日を取り除いた日数(L1,_日数) :- sort(L1,L2), length(L2,_日数). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/935 # [1] 授業単元: C言語 # [2] 問題文(含コード&amp;リンク):レポート形式なのですが比較回数を数えるプログラムのソースコードを御教示ください。 #  問:以下の挿入ソートのプログラムを参考に(次番に記載)着目する各x[i]の大小比較の回数を求めよ。 #    参考として、各データの比較回数は最大(i-1)回、最小1回、平均(i/2)回となる。 #    また、それぞれのデータの並びを変えて比較回数とデータの並びの関係を考えよ。 # 挿入整列時の比較回数(L1,L2,_比較回数) :- 挿入整列時の比較回数(L1,[],0,L2,_比較回数). 挿入整列時の比較回数([],L2,_比較回数,L2,_比較回数). 挿入整列時の比較回数([A|R],L1,_比較回数_1,L2,_比較回数):- 比較回数を計測しながらの挿入(A,L1,_比較回数_1,L3,_比較回数_2), 挿入整列時の比較回数(R,L3,_比較回数_2,L2,_比較回数). 比較回数を計測しながらの挿入(A,[],_比較回数,[A],_比較回数). 比較回数を計測しながらの挿入(A,[B|R],_比較回数_1,[A,B|R],_比較回数_2) :- A @=< B, _比較回数_2 is _比較回数_1 + 1,!. 比較回数を計測しながらの挿入(A,[B|R1],_比較回数_1,[B|R2],_比較回数) :- _比較回数_2 is _比較回数_1 + 1, 比較回数を計測しながらの挿入(A,R1,_比較回数_2,R2,_比較回数). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/896 # お題:単語データファイル「words.txt」から英単語リストを読み取り、アルファベットでしりとりを行い、 # 一番長いしりとりの単語列を出力せよ。同じ単語は二度使わない。 # # '一番長いしりとりの単語列を出力せよ。同じ単語は二度使わない。'(_単語列,_一番長いしりとりの単語列) :- '同じ単語は二度使わない。'(_単語列,_整列した重複のない単語列), forall(一番長いしりとり単語列を(_整列した重複のない単語列,_一番長いしりとりの単語列),'出力せよ。'(_一番長いしりとりの単語列)). 一番長いしりとり単語列を(_整列した重複のない単語列,_一番長いしりとりの単語列) :- しりとり単語列を(_整列した重複のない単語列,_長さを鍵に持つしりとり単語列), 一番長い(_長さを鍵に持つしりとり単語列,_一番長いしりとりの単語列). しりとり単語列を(_整列した重複のない単語列,_長さを鍵に持つしりとり単語列) :- findall([_長さ,_しりとりの単語列],しりとりの単語列(_整列した重複のない単語列,_しりとりの単語列,_長さ),_長さを鍵に持つしりとり単語列). '同じ単語は二度使わない。'(_単語列,_整列した重複のない単語列) :- sort(_単語列,_整列した重複のない単語列). しりとりの単語列(_単語列,_しりとりの単語列,_長さ) :- select(_単語,_単語列,_残り単語列), しりとり(_単語,_残り単語列,[_単語],_しりとりの単語列), length(_しりとりの単語列,_長さ). しりとり(_単語,_単語列,L1,_しりとりの単語列) :- 単語列の中から単語の末尾文字と同じ先頭文字を持つ単語を捜す(_単語,_単語列,_次の単語候補,_残り単語列), しりとり(_次の単語候補,_残り単語列,[_次の単語候補|L1],_しりとりの単語列). しりとり(_,_,_しりとりの単語列,_しりとりの単語列). 単語列の中から単語の末尾文字と同じ先頭文字を持つ単語を捜す(_単語,_単語列,_単語_2,_残り単語列) :- sub_atom(_単語,_,1,0,_文字), select(_単語_2,_単語列,_残り単語列), sub_atom(_単語_2,0,1,_,_文字). 一番長い(LL,_一番長いしりとりの単語列) :- 最大値を捜す(_長さ,member([_長さ,_],LL),_一番長い), member([_一番長い,_一番長いしりとりの単語列],LL). 最大値を捜す(A,B,C) :- findall(A,B,L), 最大値(L,C). 最大値(L,C) :- select(C,L,R), forall(member(A,R),A @=< C),!. '出力せよ。'(_一番長い逆順のしりとりの単語列) :- reverse(_一番長い逆順のしりとりの単語列,_一番長いしりとりの単語列), atomic_list_concat(_一番長いしりとりの単語列,' ',_一番長いしりとりの単語列表現), writef('%t\n',[_一番長いしりとりの単語列表現]). % 以下のサイトは # 出題場所 :: 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). % 以下のサイトは 語候補(2,_,_,尾崎,尾崎). 語候補(3,_前文字列,_後文字列,太加夫,隆大) :- sub_atom(_前文字列,_,_,_,尾崎). 語候補(3,_前文字列,_後文字列,太加夫,太加夫) :- \+(sub_atom(_前文字列,_,_,_,尾崎)). 文字列から最長一致法を用いて語候補を検索する(_文字列,_前文字列,_適合文字列,_後文字列) :- 候補文字列長さならび(_候補文字列長さならび), 文字列から最長一致法を用いて語候補を検索する(_文字列,_候補文字列長さならび,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_文字列,_候補文字列長さならび,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_開始位置,_長さ,_残り長さ,_適合文字列_1), member(_長さ,_候補文字列長さならび), 文字列の長さと候補文字列を得る(_文字列,_候補文字列長さならび,_長さ,_適合文字列_1,_適合文字列_1_2), 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1), 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_文字列長により降順整列した語候補ならび,_前文字列_1,_適合文字列_1_2,_後文字列_1,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- 文字列から最長一致法を用いて語候補を検索する(_後文字列_1,_候補文字列長さならび,_前文字列_2,_適合文字列,_後文字列), atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). 候補文字列長さならび(_候補文字列長さならび) :- findall(_長さ,( setof(_長さ,語候補(_長さ,_,_,_,_),[_長さ])), _候補文字列長さならび_1), reverse(_候補文字列長さならび_1,_候補文字列長さならび),!. '文字列の長さと前文字列・適合文字列・後文字列を得る'(_文字列,_開始位置,_長さ,_残り長さ,_語候補,_前文字列_1,_適合文字列_1,_後文字列_1) :- 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1), 語候補(_長さ,_前文字列,_後文字列,_語候補,_適合文字列_1). 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1) :- sub_atom(_文字列,0,_開始位置,_,_前文字列_1), sub_atom(_文字列,_,_残り長さ,0,_後文字列_1). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/435 # ある表の並び順をユーザーが任意に指定できるフィールド sort_key があります。 # 例) # id,sort_key # 1, 3 # 2, 4 # 3, 2 # 4, 5 # 5, 1 # … # この表の任意の行をアプリ側でユーザーが sort_key を変更したあと、 # 全行の sort_key を振り直すにはどうしたらいいでしょうか? # # :- dynamic(テーブル/2). '表の任意の行をアプリ側でユーザーが sort_key を変更したあと、全行の sort_key を振り直す'(_id,_変更するsort_key) :- sort_keyを後方順位に移動(_id,_変更するsort_key,_sort_key_2), sort_key順序をひとつずらす(後方移動,_sort_key_2,_変更するsort_key). '表の任意の行をアプリ側でユーザーが sort_key を変更したあと、全行の sort_key を振り直す'(_id,_変更するsort_key) :- sort_keyを前方順位に移動(_id,_変更するsort_key,_sort_key_2), sort_key順序をひとつずらす(前方移動,_sort_key_1,_変更するsort_key). sort_keyを後方順位に移動(_id,_変更するsort_key,_sort_key_2) :- テーブル(_id,_sort_key), _sort_key =< _変更するsort_key, テーブルの書き換え(_id,_sort_key,_変更するsort_key), _sort_key_2 is _sort_key + 1. sort_keyを前方順位に移動(_id,_変更するsort_key,_sort_key_2) :- テーブル(_id,_sort_key), _sort_key >= _変更するsort_key, テーブルの書き換え(_id,_sort_key,_変更するsort_key), _sort_key_1 is _sort_key - 1. sort_key順序を後方にひとつずらす(_sort_key,_変更するsort_key) :- _sort_key > _変更するsort_key,!. sort_key順序を後方にひとつずらす(_sort_key,_変更するsort_key) :- '変更対象節の書き換え(後方移動)'(_sort_key), _sort_key_2 is _sort_key + 1, sort_key順序を後方にひとつずらす(_sort_key_2,_変更するsort_key). sort_key順序を前方にひとつずらす(_sort_key,_変更するsort_key) :- _sort_key < _変更するsort_key,!. sort_key順序を前方にひとつずらす(_sort_key,_変更するsort_key) :- '変更対象節の書き換え(前方移動)'(_sort_key), _sort_key_1 is _sort_key - 1, sort_key順序を前方にひとつずらす(_sort_key_1,_変更するsort_key). '変更対象節の書き換え(後方移動)'(_sort_key) :- _sort_key_1 is _sort_key - 1, テーブルの書き換え(_id,_sort_key,_id_sort_key_1). '変更対象節の書き換え(前方移動)'(_sort_key) :- _sort_key_2 is _sort_key + 1, テーブルの書き換え(_id,_sort_key,_id_sort_key_2). テーブルの書き換え(_id,_sort_key,_id_sort_key_1) :- retract(テーブル(_id,_sort_key)), assertz(テーブル(_id,_sort_key_1)). % 以下のサイトは # 出題場所:: http://toro.2ch.net/test/read.cgi/tech/1357191974/435 # お題:1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は # 元のデータの順に)表示する。 '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)表示する。' :- '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(1,[],_整列した_開始位置_数値定数ならび), 表示する(_整列した_開始位置_数値定数ならび). '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_数値,L,L) :- _数値 > 100,!. '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_数値,L1,L) :- 出現順に挿入整列する(_数値,L1,L2), _数値_2 is _数値 + 1, '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_数値_2,L2,L). 出現順に挿入整列する(_数値,L1,L2) :- atom_number(_数値定数,_数値), チャンパーノウン定数に出現(_数値定数,_開始位置), 挿入整列する(_開始位置,_数値,L1,L2). チャンパーノウン定数に出現(_数値定数,_開始位置) :- チャンパーノウン定数の生成(1,'0.1',_チャンパーノウン定数), sub_atom(_チャンパーノウン定数,_開始位置,_,_,_数値定数),!. チャンパーノウン定数の生成(_数値,_チャンパーノウン定数,_チャンパーノウン定数). チャンパーノウン定数の生成(_数値_1,_チャンパーノウン定数_1,_チャンパーノウン定数) :- _数値_2 is _数値_1 + 1, atom_number(_数値定数,_数値_2), atom_concat(_チャンパーノウン定数_1,_数値定数,_チャンパーノウン定数_2), チャンパーノウン定数の生成(_数値_2,_チャンパーノウン定数_2,_チャンパーノウン定数). 挿入整列する(_開始位置,_数値,[],[[_開始位置,_数値]]). 挿入整列する(_開始位置,_数値,[[_開始位置_1,_数値_1]|R],[[_開始位置,_数値],[_開始位置_1,_数値_1]|R]) :- _開始位置 =< _開始位置_1,!. 挿入整列する(_開始位置,_数値,[[_開始位置_1,_数値_1]|R1],[[_開始位置_1,_数値_1]|R2]) :- 挿入整列する(_開始位置,_数値,R1,R2). 表示する(_整列した_開始位置_数値ならび) :- forall(member([_,_数値],_整列した_開始位置_数値ならび),writef('%t\n',[_数値])). % 以下のサイトは # 出題場所:: http://toro.2ch.net/test/read.cgi/tech/1357191974/435 # お題:1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は # 元のデータの順に)表示する。 '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)表示する。' :- '1から100までのチャンパーノウン定数'(_チャンパーノウン定数), '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_チャンパーノウン定数,_整列した_開始位置_数値定数ならび), 表示する(_整列した_開始位置_数値定数ならび). '1から100までのチャンパーノウン定数'(_チャンパーノウン定数) :- findall(_数値定数,( between(1,100,_数値), atom_number(_数値定数,_数値)), _数値定数ならび), atomic_list_concat(['0.'|_数値定数ならび],_チャンパーノウン定数). '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_チャンパーノウン定数,_整列した_開始位置_数値ならび) :- findall([_開始位置,_数値],( between(1,100,_数値), atom_number(_数値定数,_数値), sub_atom(_チャンパーノウン定数,_開始位置,_,_,_数値定数)), _開始位置_数値ならび), sort(_開始位置_数値ならび,_整列した_開始位置_数値ならび). 表示する(_整列した_開始位置_数値ならび) :- forall(member(_数値,_整列した_開始位置_数値ならび),writef('%t\n',[_数値])). % 以下のサイトは # 出題場所:: http://toro.2ch.net/test/read.cgi/tech/1357191974/435 # お題:1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は # 元のデータの順に)表示する。 '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)表示する。' :- '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_整列した_開始位置_数値定数ならび), 表示する(_整列した_開始位置_数値定数ならび). '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_整列した_開始位置_数値ならび) :- findall([_開始位置,_数値],( between(1,100,_数値), atom_number(_数値定数,_数値), チャンパーノウン定数に出現(_数値定数,_開始位置)), _開始位置_数値ならび), sort(_開始位置_数値ならび,_整列した_開始位置_数値ならび). チャンパーノウン定数に出現(_数値定数,_開始位置) :- チャンパーノウン定数の生成(1,'0.1',_チャンパーノウン定数), sub_atom(_チャンパーノウン定数,_開始位置,_,_,_数値定数),!. チャンパーノウン定数の生成(_数値,_チャンパーノウン定数,_チャンパーノウン定数). チャンパーノウン定数の生成(_数値_1,_チャンパーノウン定数_1,_チャンパーノウン定数) :- _数値_2 is _数値_1 + 1, atom_number(_数値定数,_数値_2), atom_concat(_チャンパーノウン定数_1,_数値定数,_チャンパーノウン定数_2), チャンパーノウン定数の生成(_数値_2,_チャンパーノウン定数_2,_チャンパーノウン定数). 表示する(_整列した_開始位置_数値ならび) :- forall(member([_,_数値],_整列した_開始位置_数値ならび),writef('%t\n',[_数値])). % 以下のサイトは # 出典:: 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(_小さいものから順に整列した_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび), % 以下のサイトは # 以下の2次元配列「Shopping」のデータを用い、 # 以下のように、各商品の単価、個数、小計を表示し、 # 最後に合計を表示させる。 # var shopping = [ [500, 9], [5000, 8], [50, 1], [10000, 2] ]; # # 単価:500 個数:9 小計:4500 # 単価:5000 個数:8 小計:40000 # 単価:50 個数:1 小計:50 # 単価:10000 個数:2 小計:20000 # 合計:64550 # # できる人は、下図のように小計の降順表示させよ # # 単価:5000 個数:8 小計:40000 # 単価:10000 個数:2 小計:20000 # 単価:500 個数:9 小計:4500 # 単価:50 個数:1 小計:50 # 合計:64550 # '「Shopping」のデータを用い、 # var shopping = [ [500, 9], [5000, 8], [50, 1], [10000, 2] ]; 以下のように、各商品の単価、個数、小計を表示し、最後に合計を表示させる。 # 単価:5000 個数:8 小計:40000 # 単価:10000 個数:2 小計:20000 # 単価:500 個数:9 小計:4500 # 単価:50 個数:1 小計:50 # 合計:64550' :- '「Shopping」のデータを用い、'(_Shopping), '各商品の単価、個数、小計を表示し、'(_Shopping,_小計_単価_数量_ならび), '最後に合計を表示させる。'(_小計_単価_数量_ならび). '「Shopping」のデータを用い、'(_Shopping) :- 'Shopping'(_Shopping). 'Shopping'([ [500, 9], [5000, 8], [50, 1], [10000, 2] ]). '各商品の単価、個数、小計を表示し、'(_Shopping,_小計_単価_数量_ならび) :- '各商品の単価、個数、小計を'(_Shopping,_小計_単価_数量_ならび), '表示し、'(_小計_単価_数量_ならび). '各商品の単価、個数、小計を'(_Shopping,_小計_単価_数量_ならび) :- findall([_小計,_単価,_数量],( member([_単価,_数量],_Shopping), _小計 is _単価 * _数量), _小計_単価_数量_ならび). '表示し、'(_小計_単価_数量_ならび) :- 降順整列(_小計_単価_数量_ならび,_降順の_小計_単価_数量_ならび), forall(member([_小計,_単価,_数量],_降順の_小計_単価_数量_ならび), writef('単価:%t 数量:%t 小計:%t\n',[_単価,_数量,_小計])). 降順整列(L1,L2) :- sort(L1,L3), reverse(L3,L2). '最後に合計を表示させる。'(_小計_単価_数量_ならび) :- findsum(_小計,member([_小計,_,_],_小計_単価_数量_ならび),_合計). writef('合計:%t\n',[_合計]). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum_list(_値ならび,_合計値),!. % 以下のサイトは # Prolog問題: http://nojiriko.asia/prolog/olympic.html # をCopy&Pasteしてあなたの環境に 夏季オリンピック/2 と 冬季オリンピック/2 を # 定義した上で、述語 オリンピック/3 を夏季、冬季オリンピック混在して、 # 開催年の古い順に節定義せよ。 '夏季オリンピック/2 と 冬季オリンピック/2 を定義した上で、述語 オリンピック/3 を夏季、冬季オリンピック混在して、開催年の古い順に節定義せよ。' :- '述語 オリンピック/3 を夏季、冬季オリンピック混在して、'(LL1), 開催年の古い順に節定義せよ(LL1). '述語 オリンピック/3 を夏季、冬季オリンピック混在して、'(LL1) :- findall([_年,_冬季または夏季,_都市],( 夏季オリンピック(_年,_都市), _冬季または夏季=夏季; 冬季オリンピック(_年,_都市), _冬季または夏季=冬季), LL1). 開催年の古い順に節定義せよ(LL1) :- sort(LL1,LL2), forall(member([_年,_冬季または夏季,_都市],LL2),assertz(オリンピック(_冬季または夏季,_年,_都市))). 夏季オリンピック(1896,アテネ). 夏季オリンピック(1900,パリ). 夏季オリンピック(1904,セントルイス). 夏季オリンピック(1906,アテネ). 夏季オリンピック(1908,ロンドン). 夏季オリンピック(1912,ストックホルム). 夏季オリンピック(1920,アントワープ). 夏季オリンピック(1924,パリ). 夏季オリンピック(1928,アムステルダム). 夏季オリンピック(1932,ロサンジェルス). 夏季オリンピック(1936,ベルリン). 夏季オリンピック(1948,ロンドン). 夏季オリンピック(1952,ヘルシンキ). 夏季オリンピック(1956,メルボルン). 夏季オリンピック(1960,ローマ). 夏季オリンピック(1964,東京). 夏季オリンピック(1968,メキシコシチー). 夏季オリンピック(1972,ミュンヘン). 夏季オリンピック(1976,モントリオール). 夏季オリンピック(1980,モスクワ). 夏季オリンピック(1984,ロサンジェルス). 夏季オリンピック(1988,ソウル). 夏季オリンピック(1992,バルセロナ). 夏季オリンピック(1996,アトランタ). 夏季オリンピック(2000,シドニー). 夏季オリンピック(2004,アテネ). 夏季オリンピック(2008,北京). 夏季オリンピック(2012,ロンドン). 冬季オリンピック(1924,シャモニー). 冬季オリンピック(1928,サンモリッツ). 冬季オリンピック(1932,レークプラシッド). 冬季オリンピック(1936,ガルミッシュパルテンキルヒェン). 冬季オリンピック(1948,サンモリッツ). 冬季オリンピック(1952,オスロ). 冬季オリンピック(1956,コルティナダンペッツォ). 冬季オリンピック(1960,スコーバレー). 冬季オリンピック(1964,インスブルック). 冬季オリンピック(1968,グルノーブル). 冬季オリンピック(1972,札幌). 冬季オリンピック(1976,インスブルック). 冬季オリンピック(1980,レークプラシッド). 冬季オリンピック(1984,サラエボ). 冬季オリンピック(1988,カルガリー). 冬季オリンピック(1992,アルベールビル). 冬季オリンピック(1994,リレハンメル). 冬季オリンピック(1998,長野). 冬季オリンピック(2002,ソルトレイクシティ). 冬季オリンピック(2006,トリノ). 冬季オリンピック(2010,バンクーバー). % 以下のサイトは # Prolog問題: http://nojiriko.asia/prolog/olympic.html # をCopy&Pasteしてあなたの環境に 夏季オリンピック/2 と 冬季オリンピック/2 を # 定義した上で、述語 オリンピック/2 を夏季、冬季オリンピック混在して、 # 開催年の古い順に節定義せよ。 '夏季オリンピック/2 と 冬季オリンピック/2 を 定義した上で、述語 オリンピック/2 を夏季、冬季オリンピック混在して、 開催年の古い順に節定義せよ。' :- '述語 オリンピック/2 を夏季、冬季オリンピック混在して、'(LL1), 開催年の古い順に節定義せよ(LL1). '述語 オリンピック/2 を夏季、冬季オリンピック混在して、'(LL1) :- findall([_年,_都市],( 夏季オリンピック(_年,_都市); 冬季オリンピック(_年,_都市)), LL1). 開催年の古い順に節定義せよ(LL1) :- sort(LL1,LL2), forall((member([_年,_都市],LL2),assertz(オリンピック(_年,_都市))). 夏季オリンピック(1896,アテネ). 夏季オリンピック(1900,パリ). 夏季オリンピック(1904,セントルイス). 夏季オリンピック(1906,アテネ). 夏季オリンピック(1908,ロンドン). 夏季オリンピック(1912,ストックホルム). 夏季オリンピック(1920,アントワープ). 夏季オリンピック(1924,パリ). 夏季オリンピック(1928,アムステルダム). 夏季オリンピック(1932,ロサンジェルス). 夏季オリンピック(1936,ベルリン). 夏季オリンピック(1948,ロンドン). 夏季オリンピック(1952,ヘルシンキ). 夏季オリンピック(1956,メルボルン). 夏季オリンピック(1960,ローマ). 夏季オリンピック(1964,東京). 夏季オリンピック(1968,メキシコシチー). 夏季オリンピック(1972,ミュンヘン). 夏季オリンピック(1976,モントリオール). 夏季オリンピック(1980,モスクワ). 夏季オリンピック(1984,ロサンジェルス). 夏季オリンピック(1988,ソウル). 夏季オリンピック(1992,バルセロナ). 夏季オリンピック(1996,アトランタ). 夏季オリンピック(2000,シドニー). 夏季オリンピック(2004,アテネ). 夏季オリンピック(2008,北京). 夏季オリンピック(2012,ロンドン). 冬季オリンピック(1924,シャモニー). 冬季オリンピック(1928,サンモリッツ). 冬季オリンピック(1932,レークプラシッド). 冬季オリンピック(1936,ガルミッシュパルテンキルヒェン). 冬季オリンピック(1948,サンモリッツ). 冬季オリンピック(1952,オスロ). 冬季オリンピック(1956,コルティナダンペッツォ). 冬季オリンピック(1960,スコーバレー). 冬季オリンピック(1964,インスブルック). 冬季オリンピック(1968,グルノーブル). 冬季オリンピック(1972,札幌). 冬季オリンピック(1976,インスブルック). 冬季オリンピック(1980,レークプラシッド). 冬季オリンピック(1984,サラエボ). 冬季オリンピック(1988,カルガリー). 冬季オリンピック(1992,アルベールビル). 冬季オリンピック(1994,リレハンメル). 冬季オリンピック(1998,長野). 冬季オリンピック(2002,ソルトレイクシティ). 冬季オリンピック(2006,トリノ). 冬季オリンピック(2010,バンクーバー). % 以下のサイトは # # お題:テキストファイルを読み込み、その中で最もよく使われている単語ベスト3を表示するプログラム # 'テキストファイルを読み込み、その中で最もよく使われている単語ベスト3を表示する'(_テキストファイル) :- テキストファイルを読み込み(_テキストファイル,_文), 'その中で最もよく使われている単語ベスト3を表示する'(_文). テキストファイルを読み込み(_テキストファイル,_文) :- get_lines(_テキストファイル,_行ならび), atomic_list_concat(_行ならび,_文). 'その中で最もよく使われている単語ベスト3を表示する'(_文) :- 形態素解析(文,_文,_形態素ならび), 最もよく使われている単語ベスト3を(_形態素ならび,_最もよく使われている単語ベスト3), 表示する(_最もよく使われている単語ベスト3). その中で最もよく使われている単語ベスト3を(_形態素ならび,[_単語1,_単語2,_単語3]) :- setof(A,member(A,_形態素ならび),_単語ならぴ), findall([_度数,_単語],( member(_単語,_単語ならび), count(_単語,_形態素ならび,_度数)), LL), sort(LL,_整列したLL), append(_,[[_,_単語3],[_,_単語2],[_,_単語1]],_整列したLL). 表示する([_単語1,_単語2,_単語3]) :- writef('%t %t %t\n',[_単語1,_単語2,_単語3]). count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum_list(_値ならび,_合計値),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 形態素解析サーバー(mecab). 形態素解析([],[]) :-!. 形態素解析([['EOS'|_]|_],[]) :-!. 形態素解析([[A|_],[@,B|_]|R],[R1_1|R3]) :- 形態素解析_2(R,R1,R2), 形態素解析_2_重複削除([A,B|R1],[],R1_1), 形態素解析(R2,R3),!. 形態素解析([[A|_]|R],[B|R2]) :- 形態素解析サーバー(mecab), make_list(A,['\t'],AL), AL = [B|_], 形態素解析(R,R2),!. 形態素解析([[A|_]|R],[A|R2]) :- 形態素解析サーバー(juman), 形態素解析(R,R2),!. 形態素解析_2([],[],[]) :- !. 形態素解析_2([[A|R1]|R],[],[[A|R1]|R]) :- \+(A = (@)),!. 形態素解析_2([[@,A|_]|R],[A|R2],R3) :- 形態素解析_2(R,R2,R3),!. 形態素解析_2_重複削除([],L1,L) :- reverse(L1,L),!. 形態素解析_2_重複削除([A|R],Y,X) :- member(A,Y), 形態素解析_2_重複削除(R,Y,X),!. 形態素解析_2_重複削除([A|R],Y,X) :- \+(member(A,Y)), 形態素解析_2_重複削除(R,[A|Y],X). 形態素解析(ファイル,_テキストファイル,L) :- 形態素解析サーバー(_形態素解析サーバー), concat(['cat ',_テキストファイル,' | ',_形態素解析サーバー],S), sh(S,L1), 形態素解析(L1,L2), 形態素解析_3(L2,L). 形態素解析(文,S,L) :- tmpnam(_仮のファイル), tell(_仮のファイル), wr('%t',[S]), told, 形態素解析(ファイル,_仮のファイル,L) . 形態素解析_3([],[]). 形態素解析_3([A|R],[A|R2]) :- \+(list(A)), 形態素解析_3(R,R2) . 形態素解析_3([A|R],[B|R2]) :- list(A), member(B,A), 形態素解析_3(R,R2). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y) , split(V,[' ',','],U)), X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). tmpnam(TMPNAM) :- 乱数からTMPNAMを得る(TMPNAM),!. tmpnam(TMPNAM) :- tmpnam(TMPNAM). 乱数からTMPNAMを得る(TMPNAM) :- アルファベットに変換([_1,_2,_3,_4,_5,_6]), atomic_list_concat(['/tmp/file'|[_1,_2,_3,_4,_5,_6]],TMPNAM), \+(exists_file(TMPNAM)). アルファベットに変換([]). アルファベットに変換([A|R]) :- C is random(62), アルファベットに変換の二(C,A), アルファベットに変換(R). アルファベットに変換の二(N,A) :- '基数62のコード・アルファベットコード変換表'(S,E,B), between(S,E,N), C is N - S + B, char_code(A,C). '基数62のコード・アルファベットコード変換表'(0,9,48). '基数62のコード・アルファベットコード変換表'(10,35,65). '基数62のコード・アルファベットコード変換表'(36,60,97). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1377511459/294 # # 縦横6マスのボックスがあります。 # 全てのマスを○×で埋めます。 # ○と×はそれぞれ連続2個まで繋がっててOK。 # 縦横の各列は○と×の数は同じにならなければいけない。 # ○と×の並び方が他の列と重複するのはNG。(縦と横を比較して同じなのはOK。縦と縦、横と横が同じ並びって言うのがNG) # これはどうやって解けばいいのか教えてください。 # # '縦横6マスのボックスがあります。 全てのマスを○×で埋めます。 ○と×はそれぞれ連続2個まで繋がっててOK。 縦横の各列は○と×の数は同じにならなければいけない。 ○と×の並び方が他の列と重複するのはNG。(縦と横を比較して同じなのはOK。縦と縦、横と横が同じ並びって言うのがNG) これはどうやって解けばいいのか教えてください。'(LL) :- 行候補ならびを得る(_行候補ならび), 面を規定する(LL), 転置(LL,_転置されたLL), 面候補を得る(_行候補ならび,LL), 転置診断(_転置されたLL,_行候補ならび). 行候補ならびを得る(_行候補ならび) :- findall(L,( 順列([○,○,○,×,×,×],6,L), \+(append(_,[A,A,A|_],L))), _重複があり得る行候補ならび), sort(_重複があり得る行候補ならび,_行候補ならび). 面を規定する(LL) :- length(LL,6), findall(L,( member(L,LL), length(L,6)), LL). 面候補を得る(_行候補ならび,[L1,L2,L3,L4,L5,L6]) :- member(L1,_行候補ならび), member(L2,_行候補ならび), member(L3,_行候補ならび), member(L4,_行候補ならび), member(L5,_行候補ならび), member(L6,_行候補ならび), sort([L1,L2,L3,L4,L5,L6],[_,_,_,_,_,_]). 転置診断(_転置されたLL,_行候補ならび) :- sort(_転置されたLL,[_,_,_,_,_,_]), findall(_,( member(L,_転置されたLL), member(L,_行候補ならび), \+(append(_,[A,A,A|_],L))), [_,_,_,_,_,_]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- del(A,Y,Z), M is N - 1, 順列(Z,M,X). del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1376111807/98 # # '10円と100円と1000円の買い物をした時に払う # 金額のリストを考えてみました # # map(sum)[[x,y,z]|x<-[0,10],y<-[0,100],z<-[0,1000]] # # これを任意の組に拡張するには # どういう方法があるでしょうか? # '10円と100円と1000円の買い物をした時に払う 金額のリストを考えてみました map(sum)[[x,y,z]|x<-[0,10],y<-[0,100],z<-[0,1000]] これを任意の組に拡張するには どういう方法があるでしょうか?'(_買い物をした時に支払う金額ならび,_金額組合せ) :- 買い物をした時に払う金額(_買い物をした時に支払う金額ならび,_重複を許す金額ならび), sort(_重複を許す金額ならび,_金額組合せ). 買い物をした時に払う金額(_買い物をした時に支払う金額ならび,_金額ならび) :- length(_買い物をした時に支払う金額ならび,_ならびの長さ), findall(_金額,( between(1,_ならびの長さ,N), 組合せ(_買い物をした時に支払う金額ならび,N,L), sum(L,_金額)), _金額ならび). % 以下のサイトは 全順列(L,LL) :- length(L,Len), ダミー要素を付加する(Len,L,L_2), findall(L_4,( 順列(L_2,3,L_3), findall(A,(member(A,L_3),\+(var(A))),L_4)), LL_1), sort(LL_1,LL). 全組合せ(L,LL) :- length(L,Len), ダミー要素を付加する(Len,L,L_2), findall(L_4,( 組合せ(L_2,3,L_3), findall(A,(member(A,L_3),\+(var(A))),L_4)), LL_1), sort(LL_1,LL). ダミー要素を付加する(Len,L_1,L_2) :- length(L_v,Len), append(L_1,L_v,L_2),!. % 以下のサイトは '多点交叉'(_親1,_親2,_交叉点の個数,_1点交叉後の親1,_1点交叉後の親2) :- '1点交叉の素直な拡張である多点交叉は,親1,親2の文字列上で交叉点"|"をランダムに複数個選び,交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する'(_親1,_親2,_交叉点の個数,_1点交叉後の親1,_1点交叉後の親2). '1点交叉の素直な拡張である多点交叉は,親1,親2の文字列上で交叉点"|"をランダムに複数個選び,交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する'(_親1,_親2,_交叉点の個数,_1点交叉後の親1,_1点交叉後の親2) :- '交叉点をランダムに複数個選び、'(_親1,_親2,_交叉点の個数,_交叉点ならび), '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する'(_親1,_親2,_交叉点ならび,_1点交叉後の親1,_1点交叉後の親2). '交叉点をランダムに複数個選び、'(_親1,_親2,_交叉点の個数,_交叉点ならび) :- length(_親1,_長さ1), length(_親2,_長さ2), '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点の個数,_交叉点ならび). '交叉点をランダムに複数個選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点の個数,_交叉点ならび) :- _長さ1 =< _長さ2, '交差点をランダムに複数個選び、'(_長さ1,_交叉点の個数,_交叉点ならび),!. '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点の個数,_交叉点) :- '交差点をランダムに複数個選び、'(_長さ2,_交叉点の個数,_交叉点ならび),!. '交差点をランダムに複数個選び、'(_長さ1,_交叉点の個数,_交叉点ならび) :- '交差点をランダムに複数個選び、'(_長さ1,_交叉点の個数,[],_交叉点ならび). '交差点をランダムに複数個選び、'(_,0,_交叉点ならび,_交叉点ならび) :- !. '交差点をランダムに複数個選び、'(_長さ1,N,L1,_交叉点ならび) :- R is random(_長さ1), 整列を保ちつつ挿入する(R,L1,L2), N_1 is N - 1, '交差点をランダムに複数個選び、'(_長さ1,N_1,L2,_交叉点ならび),!. '交差点をランダムに複数個選び、'(_長さ1,N,L1,_交叉点ならび) :- '交差点をランダムに複数個選び、'(_長さ1,N,L1,_交叉点ならび). 整列を保ちつつ挿入する(M,[],[M]). 整列を保ちつつ挿入する(M,[N|R],[M,N|R]) :- M < N,!. 整列を保ちつつ挿入する(M,[N|R1],[N|R2]) :- M > N, 整列を保ちつつ挿入する(M,R1,R2),!. '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2をならびとして生成する'(_親1,_親2,_交叉点ならび,_1点交叉後の親1,_1点交叉後の親2) :- '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,_交叉点ならび,_1点交叉後の親1の部分文字列ならび,_1点交叉後の親2の部分文字列ならび), atomic_list_concat(_1点交叉後の親1の部分文字列ならび,_1点交叉後の親1). atomic_list_concat(_1点交叉後の親2の部分文字列ならび,_1点交叉後の親2). '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,[],[],[]). '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,[_交叉点],[_親1部分文字列],[_親2部分文字列]) :- sub_atom(_親1,_交叉点,_,0,_親1部分文字列), sub_atom(_親2,_交叉点,_,0,_親2部分文字列). '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,[_交叉点1,_交叉点2|R1],[_親1部分文字列_1,_親2部分文字列_2|R2],[_親2部分文字列_1,_親1部分文字列_2|R3]) :- sub_atom(_親1,0,_交叉点1,_,_親1部分文字列_1), sub_atom(_親2,0,_交叉点2,_,_親2部分文字列_1), _交叉2の長さ is _交叉点2 - _交叉点1, sub_atom(_親1,_交叉点1,_交叉2の長さ,_,_親1部分文字列_2), sub_atom(_親2,_交叉点1,_交叉2の長さ,_,_親2部分文字列_2), '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,R1,R2,R3). % 以下のサイトは # # お題:100以下の自然数でふたつの素数の積で表せる数を昇順にすべて表示せよ。 # '100以下の自然数でふたつの素数の積で表せる数を昇順にすべて表示せよ。' :- '100までの素数をエラトステネスの篩で求める'(_100までの素数ならび), '100以下の自然数でふたつの素数の積で表せる数を'(_100までの素数ならび,_ふたつの素数の積で表せる数ならび), '昇順にすべて表示せよ。'(_ふたつの素数の積で表せる数ならび). '100以下の自然数でふたつの素数の積で表せる数を'(_100までの素数ならび,_ふたつの素数の積で表せる数ならび) :- findall(_100までの自然数,( '100以下の自然数で'(_100以下の自然数), ふたつの素数の積で表せる数(_100までの自然数,_100までの素数ならび)), _ふたつの素数の積で表せる数ならび). '100以下の自然数で'(_100以下の自然数) :- between(1,100,_100以下の自然数). ふたつの素数の積で表せる数(_100以下の自然数,_100までの素数ならび) :- 組合せ(_100までの素数ならび,2,[_素数_1,_素数_2]), _100以下の自然数 is _素数_1 * _素数_2,!. '昇順にすべて表示せよ。'(_ふたつの素数の積で表せる数ならび) :- sort(_ふたつの素数の積で表せる数ならび,_整列したふたつの素数の積で表せる数ならび), atomic_list_concat(_整列したふたつの素数の積で表せる数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '100までの素数をエラトステネスの篩で求める'(_100までの素数ならび) :- findall(N,between(2,100,N),L), エラトステネスの篩(L,_100までの素数ならび). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). 組合せ(X,1,[A]) :- member(A,X). 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). % 以下のサイトは # # お題:20桁の10進数が与えられたとき、任意の10個の数字を消してできる # 10桁の最大の数を求めよ # '20桁の10進数が与えられたとき、任意の10個の数字を消してできる10桁の最大の数を求めよ'(_20桁の10進数,_任意の数字ならび,_10桁の最大の数) :- '任意の10個数字を消す'(_20桁の10進数,_任意の数字ならび,_10桁の昇順ならび), '10桁の昇順ならびから最大数を得る'(_10桁の昇順ならび,_10桁の最大の数). '任意の10個数字を消す'(_20桁の10進数,_任意の数字ならび,_10桁の昇順ならび) :- number_chars(_20桁の10進数,_20桁の数字ならび), 整列(_20桁の数字ならび,_整列した20桁の数字ならび), 整列(_任意の数字ならび,_整列した任意の数字ならび), 小さい順に削る(_整列した任意の数字ならび,_整列した20桁の数字ならび,Chars3). 小さい順に削る([],Chars2,Chars2). 小さい順に削る([N|R1],[N|R2],R3) :- 小さい順に削る(R1,R2,R3). 小さい順に削る([N|R1],[M|R2],R3) :- \+(M = N), 小さい順に削る([N|R1],R2,R3). '10桁の昇順ならびから最大数を得る'(_10桁の昇順ならび,_10桁の最大の数) :- 降順ならびに変換して数値に戻す(_10桁の昇順ならび,_10桁の最大の数). 降順ならびに変換して数値に戻す(_10桁の昇順ならび,_10桁の最の数) :- reverse(_10桁の昇順ならび,_10桁の降順ならび), number_chars(_10桁の最大の数,_10桁の降順ならび). % 以下のサイトは 隣接(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))). % 以下のサイトは # 宿題じゃないんだけど、 # input.txtの中身が # 北アイルランド # あいうえお # aaa # だったとして # → # aaa # あいうえお # 北アイルランド # とエクセルの昇順と同じように並べ替えて # output.txtとして保存するプログラムを作成する # # C言語でお願いします。 'input.txtの中身が 北アイルランド あいうえお aaa だったとして → aaa あいうえお 北アイルランド とエクセルの昇順と同じように並べ替えて output.txtとして保存するプログラム' :- 'input.txtの中身が'(_行ならび), エクセルの昇順と同じように並べ替えて(_行ならび,_整列済み行ならび), 'output.txtとして保存する'(_整列済み行ならび). 'input.txtの中身が'(_行ならび) :- get_lines('input.txt',_行ならび). エクセルの昇順と同じように並べ替えて(_行ならび,_整列済み行ならび) :- 整列(_行ならび,_整列済み行ならび). 'output.txtとして保存する'(_整列済み行ならび) :- open('output.txt',write,Outstream), 'output.txtとして保存する'(Outstream,_整列済み行ならび), close(Outstream). 'output.txtとして保存する'(_,[]). 'output.txtとして保存する'(Outstream,[_行|_残り行ならび]) :- writef(Outstream,'%t\n',[_行]), 'output.txtとして保存する'(Outstream,_残り行ならび). get_lines( 整列([],[]). 整列([_軸要素|_残りならび],_整列したならび) :- 分類(_軸要素,_残りならび,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび), 整列(_軸要素に等しいか小さい要素ならび,_整列した軸要素に等しいか小さい要素ならび), 整列(_軸要素より大きい要素ならび,_整列した軸要素より大きい要素ならび), append(_整列した軸要素に等しいか小さい要素ならび,[_軸要素|_整列した軸要素に等しいか小さい要素ならび],_整列したならび). 分類(_,[],[],[]). 分類(_軸要素,[_要素|_残り要素ならび],[_要素|_軸要素に等しいか小さい要素ならび],_軸要素より大きい要素ならび) :- _要素 @=< _軸要素, 分類(_軸要素,_残り要素ならび,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび). 分類(_軸要素,[_要素|_残り要素ならび],_軸要素に等しいか小さい要素ならび,[_要素|_軸要素より大きい要素ならび]) :- _要素 @> _軸要素, 分類(_軸要素,_残り要素ならび,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/425 # # 要素に重複のないリスト(リストがない場合は配列)がある。 # このリストの部分リストを先頭要素と末尾要素を指定することによって、 # 切り出し、この部分リストだけを昇順に整列する。 # 元のリストを破壊することなしに、切り出されたリストの前部のリストを前に、 # 同じくならびの残り部分を後に結合した新たなならびを作るプログラムを示せ。 '要素に重複のないならび(ならびがない場合は配列)がある。 このならびの部分ならびを先頭要素と末尾要素を指定することによって、 切り出し、この部分ならびだけを昇順に整列する。 元のならびを破壊することなしに、切り出されたならびの前部のならびを前に、 同じくならびの残り部分を後に結合した新たなならびを作る'(_ならび,_切り出し先頭要素,_切り出し末尾要素,_新たなならび) :- 'このならびの部分ならびを先頭要素と末尾要素を指定することによって、切り出し、この部分ならびだけを昇順に整列する。'(_ならび,_切り出し先頭要素,_切り出し末尾要素,_前ならび,_切り出され整列したならび,_後ならび), 元のならびを破壊することなしに、切り出されたならびの前部のならびを前に、同じくならびの残り部分を後に結合した新たなならびを作る'(_前ならび,_切り出され整列したならび,_後ならび,_新たなならび). 'このならびの部分ならびを先頭要素と末尾要素を指定することによって、切り出し、この部分ならびだけを昇順に整列する。'(_ならび,_切り出し先頭要素,_切り出し末尾要素,_前ならび,_切り出され整列したならび,_後ならび) :- append(_前ならび,[_切り出し先頭要素|_残りならびの一],_ならび), append(L0,[_切り出し末尾要素|_後ならび],_残りならびの一), sort([_部分ならびの先頭要素,_部分ならびの末尾要素|L0],_切り出され整列したならび). '元のならびを破壊することなしに、切り出されたならびの前部のならびを前に、同じくならびの残り部分を後に結合した新たなならびを作る'(_前ならび,_切り出され整列したならび,_後ならび,_新たなならび) :- append(_前ならび,_切り出され整列したならび,L), append(L,_後ならび,_新たなならび). % 以下のサイトは # # 働き蟻の8割はまともだが2割は馬鹿、しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという # 結論:駆除しても無駄 # # '働き蟻の8割はまともだが2割は馬鹿、しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという'(_働き蟻,_駆除対象の馬鹿,_まともな働き蟻) :- '働き蟻の8割はまともだが2割は馬鹿'(_働き蟻,_駆除対象の馬鹿_1,_まともな働き蟻_1), 'しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという'(_駆除対象の馬鹿_1,_まともな働き蟻_1,_駆除対象の馬鹿,_まともな働き蟻). 'しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという'(_駆除対象の馬鹿,_まともな働き蟻,_駆除対象の馬鹿,_まともな働き蟻). 'しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという'(_,_まともな働き蟻,_駆除対象の馬鹿,_まともな働き蟻) :- '2割が新しく馬鹿になる'(_まともな働き蟻,_2割が新しく馬鹿になった働き蟻), '働き蟻の8割はまともだが2割は馬鹿、しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという'(_2割が新しく馬鹿になった働き蟻,_駆除対象の馬鹿,_まともな働き蟻). '働き蟻の8割はまともだが2割は馬鹿'(_働き蟻,_駆除対象の馬鹿,_まともな働き蟻) :- 働き蜂の個体数(_働き蜂,_働き蜂の個体数), 馬鹿順に整列する(_働き蟻,_馬鹿順に整列した働き蟻), 働き蟻の8割はまともだが(_馬鹿順に整列した働き蟻,_働き蟻の個体数,_まともな働き蟻), '2割は馬鹿'(_馬鹿順に整列した働き蟻,_働き蟻の個体数,_駆除対象の馬鹿). 働き蟻の8割はまともだが(_馬鹿順に整列した働き蟻,_働き蟻の個体数,_まともな働き蟻) :- _働き蟻の8割の個体数 is truncate(_働き蟻の個体数 * 0.8 + 0.49), length(_まともな働き蟻,_働き蟻の8割の個体数), append(_,_まともな働き蟻,_馬鹿順に整列した働き蟻). '2割は馬鹿'(_馬鹿順に整列した働き蟻,_働き蟻の個体数,_駆除対象の馬鹿) :- _働き蟻の2割の個体数 is truncate(_働き蟻の個体数 * 0.2 + 0.51), length(_駆除対象の馬鹿,_働き蟻の2割の個体数), append(_駆除対象の馬鹿,_,_馬鹿順に整列した働き蟻). 働き蟻の個体数(_働き蟻,_働き蟻の個体数) :- length(_働き蟻,_働き蟻の個体数). 馬鹿順に整列する(_働き蟻,_働き蟻) :- 馬鹿とまともな働き蟻とは実は差がない. 馬鹿とまともな働き蟻とは実は差がない. '2割が新しく馬鹿になる'(_まともな働き蟻,_2割が新しく馬鹿になった働き蟻) :- _まともな働き蟻 = _2割が新しく馬鹿になった働き蟻. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/705 # # SQL SERVER 2010ですが # TOP 2を求めて残りをその他として合計表示したいです。 # よろしくお願いします。 # # 元のデータ # 列1 # A # A # A # B # B # C # D # # 求めたい結果 # A 3 # B 2 # その他 2 # # 'TOP 2を求めて残りをその他として合計表示したい'(_A,_B,_その他) :- setof(_列1,[_列1] ^ テーブル(_列1),_一意の列1ならび), 'TOP 2を求めて'(_一意の列1ならび,_A,_B,R), '残りをその他として合計表示したい'(R,_その他). 'TOP 2を求めて'(_一意の列1ならび,_A,_B,R) :- findall([_度数,_列1],( member(_列1,_一意の列1ならび), count(テーブル(_列1),_度数)), LL), sort(LL1,LL2), append(R,[_B,_A],LL2). '残りをその他として合計表示したい'(R,_その他) :- findsum(_度数,member([_度数,_],R),_その他). % 以下のサイトは # # 1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。 # '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(_1,_2,_3,_4,_5,_6,_7,_8) :- '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'([],[_1,_2,_3,_4,_5,_6,_7,_8]). '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'([_1,_2,_3,_4,_5,_6,_7,_8|_],[_8,_7,_6,_5,_4,_3,_2,_1]) :- 整列([_1,_2,_3,_4,_5,_6,_7,_8],[_,_,_,M,N,_,_,_]), 44 is M + N. '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(L1,L) :- N is random(99) + 1, '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'([N|L1],L). 整列([],[]). 整列([_軸要素|R1],L) :- 分割(_軸要素,R1,L1,L2), 整列(L1,L3), 整列(L2,L4), append(L3,[_軸要素|L4],L). 分割(_,[],[],[]). 分割(_軸要素,[A|R1],[A|R2],R3) :- A @=< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[A|R1],R2,[A|R3]) :- A @> _軸要素, 分割(_軸要素,R1,R2,R3). % 以下のサイトは # # 1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。 # '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。'(L) :- '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'([],L). '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(L1,L) :- 乱数を発生させる(_乱数), 乱数を挿入して整列させる(_乱数,L1,L2), '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるの二'(L2,LL). '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるの二'(L1,L) :- 中央値が存在する(L1,L). '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となるの二'(L1,L) :- '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(L1,L). 中央値が存在する(L1,L) :- append(L0,[[_1,_2,_3,_4,_5,_6,_7,_8]|R],L1), 44 is _4 + _5, 中央値が存在する(L1,L0,[_1,_2,_3,_4,_5,_6,_7,_8],R,L). 中央値が存在する(L1,_,L,_,L). 中央値が存在する(L1,L0,_,R,L) :- append(L0,R,L2), '1から99までを値域とする8つの整数を乱数を使って順に発生させて中央値が22となる'(L2,L). 乱数を発生させる(_乱数) :- _乱数 is random(99) + 1. 乱数を挿入して整列させる(_乱数,[],[_乱数]) :- !. 乱数を挿入して整列させる(_乱数,[N|R],[_乱数,N|R]) :- _乱数 =< N,!. 乱数を挿入して整列させる(_乱数,[N|R1],[N|R2]) :- _乱数 > N, 乱数を挿入して整列させる(_乱数,R1,R2). % 以下のサイトは # このディレクトリの索引 # JavaScriptでこのような二次元配列があります # [ # ["d", true], # ["a", false], # ["e", true], # ["c", false], # ["b", true], # ]; # # この配列を以下のようにソートする方法を教えてください # b # d # e # a # c 'このような二次元配列があります [ ["d", true], ["a", false], ["e", true], ["c", false], ["b", true], ]; この配列を以下のようにソートする方法を教えてください b d e a c'(LL1,A) :- '第二引数true,false,第一引数辞書順で整列する'(LL1,LL2), member([A,_],LL2). '第二引数true,false,第一引数辞書順の順で整列する'([],[]). '第二引数true,false,第一引数辞書順の順で整列する'([[A,B]|R1],LL) :- 分割([A,B],R1,LL1,LL2), '第二引数true,false,第一引数辞書順の順で整列する'(LL1,LL3), '第二引数true,false,第一引数辞書順の順で整列する'(LL2,LL4), append(LL1,[[A,B]|LL4],LL). 分割(_,[],[],[]). 分割([A,B],[[C,D]|R2],L1,L2) :- '第二引数はtrue,false順に分割する'([A,B],[C,D],L1,L2,L12,L22), 分割([A,B],R2,L12,L22). '第二引数はtrue,false順に分割する'([A,true],[C,true],[C|R1],R2,R1,R2) :- A >=@ C,!. '第二引数はtrue,false順に分割する'([A,true],[C,true],R1,[C|R2],R1,R2) :- A @=< C,!. '第二引数はtrue,false順に分割する'([A,false],[C,false],[C|R1],R2,R1,R2) :- A >=@ C,!. '第二引数はtrue,false順に分割する'([A,false],[C,false],R1,[C|R2],R1,R2) :- A @=< C,!. '第二引数はtrue,false順に分割する'([A,false],[C,true],[C|R1],R2,R1,R2) :- !. '第二引数はtrue,false順に分割する'([A,true],[C,false],R1,[C|R2],R1,R2) :- !. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/425 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # クイックソート、バブルソート、選択ソートの三種のソート関数 # それぞれ、void qusort(int[]), busort(int[]) sesort(int[]),を作れ。 #   並び順は、降順。ソートした結果は引数配列と同じ配列に返してやる。 # 選択ソート([A],[A]) :- !. 選択ソート(L1,[_最小値|R2]) :- 最小値の抜き取り(L1,_最小値,R1), 選択ソート(R1,R2). 最小値の抜き取り(L1,_最小値,R1) :- append(L0,[_最小値|R2],L1), \+((member(D,R2),D < _最小値)), append(L0,R2,R1),!. % 以下のサイトは # 出典:: 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',_合計点ならび). % 以下のサイトは # 出典:: 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/33 # # [1] 授業単元: リスト処理 # [2] 問題文(含コード&) http://codepad.org/3DdhcBUM # # /* # # seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 # また、整列する際に要素どうしを比較した回数も表示しなさい。 # # 【実行例】 # # 番号 氏名      得点 # 1021 Machida Masato 100 # 1017 Nonaka Fujio 98 # 1011 Suzuki kenichi 93 # 1019 Fujimoto Kaoru 92 # 1006 kato Ichiro 91 # ・ ・     ・ # ・ ・     ・ # ・ ・     ・ # 1020 Hoshi Izumi 32 # 整列の為の比較回数=132回 # # ※長いので実行結果は途中省略しています。 # ※比較回数はコードによって異なる場合があります。 # # */ 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 また、整列する際に要素どうしを比較した回数も表示しなさい。' :- 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび), リスト処理による挿入法で得点の降順に整列して(_生徒ならび,[],_整列済み生徒ならび,0,_比較回数), 表示しなさい(_整列済み生徒ならび,_比較回数). 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび) :- get_split_lines('seito.dat',[' '],_生徒ならび). リスト処理による挿入法で得点の降順に整列して([[_学籍番号,_姓,_名,_得点]|R1],L1,_整列済み生徒ならび,_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,L1,L2,_比較回数_1,_比較回数_2), リスト処理による挿入法で得点の降順に整列して(R1,L2,_整列済み生徒ならび,_比較回数_2,_比較回数),!. リスト処理による挿入法で得点の降順に整列して([],_整列済み生徒ならび,_整列済み生徒ならび,_比較回数,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],[[_学籍番号,_名,_名,_得点],[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],_比較回数_1,_比較回数) :- 比較回数 is _比較回数_1 + 1, _得点 >= _得点_1,!. 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R1],[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R2],_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,R1,R2,_比較回数_1,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[],[[_学籍番号,_名,_名,_得点]],_比較回数,_比較回数) :- !. 表示しなさい(_整列済み生徒ならび,_比較回数) :- 見出しの表示, append(_,[[_学籍番号,_姓,_名,_得点]|R],_整列済み生徒ならび), 整形して表示する(_学籍番号,_姓,_名,_得点), R = [], writef('整列の為の比較回数=%t回\n',[_比較回数]). 見出しの表示 :- write('番号 氏名      得点\n'). 整形して表示する(_学籍番号,_姓,_名,_得点) :- 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列), 得点を頭部空白3桁に(_得点,_得点文字列), atomic_list_concat([_学籍番号,_姓文字列,_名文字列,_得点文字列],' ',_表示文字列), writef('%t\n',[_表示文字列]). 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列) :- '8桁に'(_姓,_姓文字列), '8桁に'(_名,_名文字列). '8桁に'(_項,_8桁文字列) :- atom_chars(_項,Chars_1), length(L,8), append(L1,L2,L), all(L2,' '), atom_chars(_8桁文字列,L). 得点を頭部空白3桁に(_得点,_得点文字列) :- number_chars(_得点,Chars), length(L,3), append(L0,Chars,L), all(L0,' '), atom_chars(_得点文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,( member(A,Lines1), split(A,Sep,Line)), Lines). get_lines(Instream,end_of_file,_,_,[]) :-!. get_lines(Instream,S,[],_終了検索対象ならび,[S]) :- member(A,_終了検索対象ならび), 検索(S,A),!. get_lines(Instream,S,[],[],[S|R]) :- get_line(Instream,S2), get_lines(Instream,S2,[],[],R),!. get_lines(Instream,S,[],_終了検索対象ならび,[S|R]) :- member(A,_終了検索対象ならび), \+(検索(S,A)), get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), member(B,_終了検索対象ならび), 検索(S,B),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S|R]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), !, get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,_,_開始検索対象ならび,_終了検索対象ならび,X) :- get_line(Instream,S2), get_lines(Instream,S2,_開始検索対象ならび,_終了検索対象ならび,X),!. get_lines(_ファイル,_スタート行,_最終行,X) :- integer(_スタート行), integer(_最終行), 行位置指定選択(_ファイル,_スタート行,_最終行,X). get_lines(_ファイル,_開始検索対象ならび,_終了検索対象ならび,X) :- \+(integer(_開始検索対象ならび)), \+(integer(_終了検索対象ならび)), open(_ファイル,read,Instream), get_line(Instream,S), get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,X), close(Instream),!. get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat, get_line(user_input,Line), (Line = end_of_file , (!) , fail ; true)), Lines). get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_chars(Instream,end_of_file,[]) :- !. get_chars(Instream,_,[]) :- at_end_of_stream(Instream),!. get_chars(Instream,X,[X|R]) :- get_char(Instream,Y), get_chars(Instream,Y,R) . get_chars(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), exists_file(File_1), open(File_1,read,Instream), get_char(Instream,X), get_chars(Instream,X,L), close(Instream),!. get_chars(Instream,L) :- is_stream(_,Instream,_), get_char(Instream,X), get_chars(Instream,X,L),!. get_chars(L) :- findall(U,( repeat, get_char(U), (U = end_of_file , (!) , fail ; true)), L). get_line(X) :- get_line(user_input,X). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,_,[]) :- at_end_of_stream(Instream),!. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). chars_lines([],[],[]) :- !. chars_lines(['\r'],[],[]) :- !. chars_lines(['\r',A|R],[],[A|R]) :- \+(A = '\n'),!. chars_lines(['\r','\n'|R],[],R) :- !. chars_lines(['\n'|R],[],R) :- !. chars_lines([A|R1],[A|R2],Z) :- chars_lines(R1,R2,Z). chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R), atomic_list_concat(U,A), chars_lines(R,R2). split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y) , \+(member(U,_区切り符号ならび))), Z), Z = X,!. split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび) , atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). 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),!. 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),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), C number Nl,!. split_5(B,C) :- atomic_list_concat(B,C),!. all([],_). all([V|R],V) :- all(R,V). 検索(_文字列,_副文字列) :- atom_length(_文字列,_文字列の文字数), atom_length(_副文字列,_副文字列の文字数), Max is _文字列の文字数 - _副文字列の文字数, between(0,Max,N), sub_atom(_文字列,N,_副文字列の文字数,_副文字列),!. 行位置指定選択(_ファイル,_選択先頭行,_選択最終行,X) :- wc(_ファイル,[[_行,_,_,_]]), _行数_1 is _行 - _選択先頭行 + 1, _行数_2 is _選択最終行 - _選択先頭行, atomic_list_concat(['tail -',_行数_1,' ',_ファイル,' | head -',_行数_2],S), shs(S,X). wc(F,X) :- exists_file(F1), atomic_list_concat(['wc ',F1],S), sh(S,X),!. wc(F,X) :- atomic_list_concat([F,' | wc'],S), sh(S,X),!. sh(Command,X) :- shs(Command,Y), findall(U,(member(V,Y) , make_list(V,[' ',','],U)),X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,_,[]) :- at_end_of_stream(Instream),!. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元:リスト構造 # [2] 問題文(含コード&amp;リンク): # http://ime.nu/iup.2ch-library.com/i/i0825590-1357830189.gif # # 以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作 成せよ. # リストは1つとし,初期値は「15 4 32 1」である. # ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. # ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. # ・データのソート(降順)を行う関数を作成する. # ・リストの平均値を計算し出力する関数を作成する。 # # ------表示例------ # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : # ------------------ # # ------実行例------- # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 1 # 追加するデータを入力してください : 10 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 4 # リストの平均値 : 12.4 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 3 # リスト : 32 15 10 4 1 # :- dynamic(リスト/1). '以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作成せよ. リストは1つとし,初期値は「15 4 32 1」である. ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. ・データのソート(降順)を行う関数を作成する. ・リストの平均値を計算し出力する関数を作成する。 ------表示例------ 1. データの追加 2. データの削除 3. データのソート(降順) 4. リストの平均値 5. 終了 何を実行しますか : ' :- 'リストは1つとし,初期値は「15 4 32 1」である', メニューを表示, 各項目の機能を実現して結果を表示する. 'リストは1つとし,初期値は「15 4 32 1」である' :- assertz(リスト([15,4,32,1])). メニューを表示 :- write('1. データの追加\n2. データの削除\n3. データのソート(降順)\n4. リストの平均値\n5. 終了\n何を実行しますか : '). メニューを表示 :- メニューを表示. 各項目の機能を実現して結果を表示する :- 機能番号を選択する(_機能番号), 機能を実現して結果を表示する(_機能番号), _機能番号 = 5,!. 機能番号を選択する(_機能番号) :- get_line(Line), '診断:: メニューの選択'(Line,_機能番号),!. 機能番号を選択する(_機能番号) :- 機能番号を選択する(_機能番号). '診断:: メニューの選択'(Line,_機能番号) :- atom_number(Line,_機能番号), integer(_機能番号), between(1,5,_機能番号),!. '診断:: メニューの選択'(Line,_機能番号) :- writef('選択された %t からは適切な機能番号が得られません。再入力をお願いします。\n',[Line]), fail. 機能を実現して結果を表示する(5) :- !. 機能を実現して結果を表示する(1) :- データの追加. 機能を実現して結果を表示する(2) :- データの削除. 機能を実現して結果を表示する(3) :- 'データのソート(降順)'. 機能を実現して結果を表示する(4) :- リストの平均値. データの追加 :- write('追加するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), append(L1,[_データ],L2), assertz(リスト(L2)). データの削除 :- write('削除するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), ならびから削除(_データ,L1,L2), assertz(リスト(L2)). 'データのソート(降順)' :- リスト(L1), 降順整列(L1,L2), atomic_list_concat(L2,' ',S), writef('リスト : %t\n',[S]). リストの平均値 :- リスト(L1), findavg(_データ,( member(_データ,L1)), _平均値), atomic_list_concat(L1,_リスト表示), writef('平均値 : %t\nリスト : %t\n',[_平均値,_リスト表示]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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,_,[e,n,d,'_',o,f,'_',f,i,l,e]) :- at_end_of_stream(Stream),!. 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). ならびから削除(_,[],[]) :- !. ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび) :- ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!. ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび]) :- ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!. 降順整列([],[]). 降順整列([_軸要素|R1],_降順に整列されたならび) :- 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび), 降順整列(_軸要素に等しいか大きいならび,_整列した軸要素に等しいか大きいならび), 降順整列(_軸要素より小さいならび,_整列した軸要素より小さいならび), append(_整列した軸要素に等しいか大きいならび,[_軸要素|_整列した軸要素より小さいならび],_降順に整列したならび). 降順分割(_,[],[],[]). 降順分割(_軸要素,[_要素|R],[_要素|_軸要素に等しいか大きいならび],_軸要素より小さいならび) :- _要素 @>= _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). 降順分割(_軸要素,[_要素|R],_軸要素に等しいか大きいならび,[_要素|_軸要素より小さいならび]) :- _要素 @< _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). findavg(_集約項,_項,_相加平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _相加平均 is _合計値 / _ならびの長さ,!. sum([],0). sum([N|R],S) :- sum(R,S_1), S is N + S_1. % 以下のサイトは # 出典:: 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/625 # # [1] 授業単元:自己参照構造体 # [2] 問題文(含コード&リンク): # 以下のクラス・氏名・順位が定義された自己参照構造体をクラス毎に順位の昇順にソートしなさい。 # 3-1 A君 3位 # 3-1 B君 2位 # 3-1 C君 4位 # 3-1 D君 1位 # 3-2 P君 2位 # 3-2 Q君 3位 # 3-2 R君 1位 # 3-3 X君 1位 # 3-3 Y君 2位 # **************** # 結果 # 3-1 D 1 # 3-1 B 2 # 3-1 A 3 # 3-1 C 4 # 3-2 R 1 # 3-2 P 2 # 3-2 Q 3 # :- dynamic('クラス・氏名・順位'/3). 'クラス・氏名・順位'(3-1,'A',3). 'クラス・氏名・順位'(3-1,'B',2). 'クラス・氏名・順位'(3-1,'C',4). 'クラス・氏名・順位'(3-1,'D',1). 'クラス・氏名・順位'(3-2,'P',2). 'クラス・氏名・順位'(3-2,'Q',3). 'クラス・氏名・順位'(3-2,'R',1). 'クラス・氏名・順位'(3-3,'X',1). 'クラス・氏名・順位'(3-3,'Y',2). 'クラス・氏名・順位が定義された述語をクラス毎に順位の昇順にソートして定義し直す' :- クラス毎に順位の昇順にソートして(_クラス毎に昇順にソートされたならび), 定義し直す(_クラス毎に昇順にソートされたならび). 'クラス・氏名・順位が定義された述語をクラス毎に順位の昇順にソートして'(_クラス毎に昇順にソートされたならび) :- findall([_クラス,_順位,_氏名],retract('クラス・氏名・順位'(_クラス,_氏名,_順位)),_クラス_氏名_順位ならび), 整列(_クラス_氏名_順位ならび,_クラス毎に昇順にソートされたならび). 定義し直す(_クラス毎に昇順にソートされたならび) :- append(_,[[_クラス,_順位,_氏名]|R],_クラス毎に昇順にソートされたならび), assertz('クラス・氏名・順位'(_クラス,_氏名,_順位)), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/625 # # [1] 授業単元:自己参照構造体 # [2] 問題文(含コード&リンク): # 以下のクラス・氏名・順位が定義された自己参照構造体をクラス毎に順位の昇順にソートしなさい。 # 3-1 A君 3位 # 3-1 B君 2位 # 3-1 C君 4位 # 3-1 D君 1位 # 3-2 P君 2位 # 3-2 Q君 3位 # 3-2 R君 1位 # 3-3 X君 1位 # 3-3 Y君 2位 # **************** # 結果 # 3-1 D 1 # 3-1 B 2 # 3-1 A 3 # 3-1 C 4 # 3-2 R 1 # 3-2 P 2 # 3-2 Q 3 # :- dynamic('クラス・氏名・順位'/3). 'クラス・氏名・順位'(3-1,'A',3). 'クラス・氏名・順位'(3-1,'B',2). 'クラス・氏名・順位'(3-1,'C',4). 'クラス・氏名・順位'(3-1,'D',1). 'クラス・氏名・順位'(3-2,'P',2). 'クラス・氏名・順位'(3-2,'Q',3). 'クラス・氏名・順位'(3-2,'R',1). 'クラス・氏名・順位'(3-3,'X',1). 'クラス・氏名・順位'(3-3,'Y',2). 'クラス・氏名・順位が定義された述語をクラス毎に順位の昇順にソートしなさい。 ' :- findall([_クラス,_順位,_氏名],( retract('クラス・氏名・順位'(_クラス,_氏名,_順位))), LL1), 整列(LL1,LL2), append(_,[[_クラス,_順位,_氏名]|R],LL2), assertz('クラス・氏名・順位'(_クラス,_氏名,_順位))), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/551 # # こんにちは。 # 早速ですがtxtファイルに書いてある下記の数値を取り込んで平均点の大きい順に # 上から並び替え、別のtxtファイルに出力するプログラムを作りたいのですが # どうすればいいんでしょうか。 # # ご回答お願いします。 # # 14 # 1001 90 80 70 67 # 1002 60 50 40 60 # 1003 55 30 56 65 # 1004 88 70 77 20 # 1005 60 30 90 30 # 1006 100 0 100 100 # 1007 23 33 21 50 # 1008 65 66 46 98 # 1009 58 87 88 64 # 1010 30 55 63 32 # 1011 65 54 70 77 # 1013 98 89 79 90 # 1014 100 60 95 68 # 1016 30 22 56 30 # # 'txtファイルに書いてある下記の数値を取り込んで平均点の大きい順に上から並び替え、別のtxtファイルに出力する'(_txtファイル,_別のtxtファイル) :- 'txtファイルに書いてある下記の数値を取り込んで'(_txtファイル,LL1), 平均点の大きい順に上から並び替え(LL1,LL2), 別のtxtファイルに出力する(LL2,_別のtxtファイル). 'txtファイルに書いてある下記の数値を取り込んで'(_txtファイル,LL1) :- get_split_lines(_txtファイル,[' '],[_|LL1]). 平均点の大きい順に上から並び替え(LL1,LL2) :- 平均点の(LL1,LL3), 大きい順に上からならび替え(LL3,LL2). 平均点の([],[]). 平均点の([[A|L1]|R1],[[_平均点,A|L1]|R2]) :- 相加平均(L1,_平均点), 平均点の(R1,R2). 大きい順に上からならび替え(LL3,LL2) :- 整列(LL3,LL4), reverse(LL4,LL2). 別のtxtファイルに出力する(_別のtxtファイル,LL2) :- length(LL2,Len), open(_別のtxtファイル,write,Outstream), 出力する(Outstream,[[Len]|LL2]), close(Outstream). 出力する(Outstream,[]). 出力する(Outstream,[[_|L]|R]) :- atomic_list_concat(L,' ',S), writef(Outstream,'%t\n',[S]), 出力する(Outstream,R). % 以下のサイトは # 出典:: 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). % 以下のサイトは # # ならびの中央値 # 中央値(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). % 以下のサイトは # # ならびの中央値 # 中央値(_ならび,_中央値) :- 整列(_ならび,_整列済みならび), length(L0,_同じ要素数), length(R,_同じ要素数), 中央値(_整列済みならび,L0,R,_中央値),!. 中央値(_整列済みならび,L0,R,_中央値) :- append(L0,[_中央値_1,_中央値_2|R],_整列済みならび), _中央値 is (_中央値_1 + _中央値_2) / 2. 中央値(_整列済みならび,L0,R,_中央値) :- append(L0,[_中央値|R],_整列済みならび). 整列([],[]). 整列([_軸要素|R],L2) :- 分割(_軸要素,R,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび), 整列(_軸要素に等しいか小さい要素ならび,_整列した軸要素に等しいか小さい要素ならび), 整列(_軸要素より大きい要素ならび,_整列した軸要素より大きい要素ならび), append(_整列した軸要素に等しいか小さい要素ならび,[_軸要素|_整列した軸要素より大きい要素ならび],L2). 分割(_,[],[],[]). 分割(_軸要素,[_値|R1],[_値|R2],R3) :- _値 @=< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[_値|R1],R2,[_値|R3]) :- _値 @> _軸要素, 分割(_軸要素,R1,R2,R3). % 以下のサイトは # 出典:: 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/837 # # 単元 C言語配列 # 問題1 Float型配列にマクロで指定した個数の乱数(randを使う)を格納して # その平均値と最大値を出力するプログラムを作成せよ。 # # 問題2 上記の問題で結果を小さい順で表記せよ。 # 環境 Linux gcc C言語 # 期限 今週日曜日まで # よろしくお願いします # # 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納して、小さい順で表記せよ。'(_指定した個数) :- 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納して'(_指定した個数,_ならび), 整列(_ならび,_整列したならび), writef('%t\n',[_整列したならび]). 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納して'(_指定した個数,_ならび) :- findall(_浮動小数点数,( between(1,_指定した個数,_), _浮動小数点数 is (-1 ^ (random(2)+1)) * random(10000) / (random(10000) + 1)), _ならび). 整列([],[]). 整列([A|R],L) :- 分割(A,R,L1,L2), 整列(L1,L1_2), 整列(L2,L2_2), append(L1_2,[A|L2_2],L). 分割(_,[],[],[]). 分割(A,[B|R1],[B|R2],R3) :- B @=< A, 分割(A,R1,R2,R3). 分割(A,[B|R1],R2,[B|R3]) :- A @< B, 分割(A,R1,R2,R3). % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/95 # # [1] 授業単元:C言語 配列 # [2] 問題文(含コード&リンク):入力された10個の整数データをバブルソートで昇順に整列せよ # 入力された10個の整数データをバブルソートで昇順に整列する(_昇順に整列されたデータ) :- 入力された10個の整数データを(_10個の整数データ), バブルソートで昇順に整列する(_10個の整数データ,_昇順に整列されたデータ). '入力された10個の整数データを'(_10個の整数データ) :- length(_10個の整数データ,10), findall(_整数データ,( member(_整数データ,_10個の整数データ), 整数を得る(整数データ,_整数データ)), _10個の整数データ). バブルソートで昇順に整列する(_10個の整数データ,_昇順に整列されたデータ) :- バブルソート(_10個の整数データ,_昇順に整列されたデータ). バブルソート(L1,L2) :- 軽い泡はちょっと浮き上がる(L1,L3), 泡が浮き上がったら最初からやり直す(L3,L2). バブルソート(L,L) :- 浮き上がる泡がなくなったらバブルソート終了. 軽い泡はちょっと浮き上がる(L1,L3) :- append(L0,[_重い泡,_軽い泡|R],L1), _重い泡 @> _軽い泡, append(L0,[_軽い泡,_重い泡|R],L3). 泡が浮き上がったら最初からやり直す(L3,L2) :- バブルソート(L3,L2). 浮き上がる泡がなくなったらバブルソート終了. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/900 # # [1]C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/Gpxv1fSh # # /* # 問題1. 整数データの配列に対してソートをかける関数を挿入ソートにより作成し、正し # く動くことを確認せよ。 # 問題2. 問題1 を変更して、ソートの際に行われる比較、代入の回数も求める様にせよ。 # 問題3. 0 以上1 より小さい一様乱数を返す関数double urandom() を作成し、確認せよ。 # 問題4. 0 からn-1 の値を返す関数nrandom(int n) を作成し、確認せよ。 # 問題5. 乱数関数を用いて整数データをn個作成する関数make_data(unsigned int s, int n) # を作成せよ(ここでs はseed)。作成するデータは、n-1 以下とし、それを配列 # data[SIZE] に格納する。 # 問題6. 問題2 を変更して、問題5 で作られたデータを用いてソートを行うプログラムを # 作成せよ。n = 10、100、1000 で実行して比較しなさい。(seed の設定は同じものを # 用いて比較する)。 # */ '整数データの配列に対してソートをかける関数を挿入ソートにより作成し、正しく動くことを確認する'(_整数データならび,_整列された整数データならび) :- '整数データの配列に対してソートをかける関数を挿入ソートにより作成し'(_整数データならび,_整列された整数データならび), 正しく動くことを確認する(_整数データならび,_整列された整数データならび). '整数データの配列に対してソートをかける関数を挿入ソートにより作成し'(_整数データならび,_整列された整数データならび) :- '整数データの配列に対してソートをかける関数を挿入ソートにより作成し'(_整数データならび,[],_整列された整数データならび). '整数データの配列に対してソートをかける関数を挿入ソートにより作成し'([],L,L). '整数データの配列に対してソートをかける関数を挿入ソートにより作成し'([A|R],L1,_整列された整数データならび) :- 挿入(A,L1,L2), '整数データの配列に対してソートをかける関数を挿入ソートにより作成し'(R,L2,_整列された整数データならび). 挿入(A,[],[A]). 挿入(A,[B|R],[A,B|R]) :- A @=< B,!. 挿入(A,[B|R1],[B|R2]) :- A @> B, 挿入(A,R1,R2). 正しく動くことを確認する(_整数データならび,_整列された整数データならび) :- 整列された整数データならびが昇順であるか確かめる(_整列された整数データならび). 整列された整数データならびが昇順であるか確かめる([]). 整列された整数データならびが昇順であるか確かめる([_]). 整列された整数データならびが昇順であるか確かめる([A,B|R]) :- A @=< B, 整列された整数データならびが昇順であるか確かめる([B|R]). % 以下のサイトは # 出典:: 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/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から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示する' :- '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび), '小さい順にこれら数値を表示する'(_自然数ならび). '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび) :- findall(N,( between(1,10000,_), N is random(10000) + 10000), _自然数ならび). 小さい順にこれら数値を表示する(_自然数ならび) :- 小さい順に数値を(_自然数ならび,_小さい順に整列した自然数ならび), 表示する(_小さい順に整列した自然数ならび) 小さい順に数値を([],[]). 小さい順に数値を([_軸要素|_残りならび],_小さい順に整列した自然数ならび) :- 分割(_軸要素,_残りならび,_軸要素と等しいか小さい自然数ならび,_軸要素より大きい自然数ならび), 小さい順に数値を(_軸要素と等しいか小さい自然数ならび,_小さい順に整列した軸要素と等しいか小さい自然数ならび), 小さい順に数値を(_軸要素より大きい自然数ならび,_小さい順に整列した軸要素より大きい自然数ならび), 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]) :- writef('%t %t %t %t %t %t %t %t %t %t\n',[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), 表示する(R). % 以下のサイトは # 出典:: 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から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示する' :- '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび), '小さい順にこれら数値を表示する'(_自然数ならび). '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび) :- findall(N,( between(1,10000,_), N is random(10000) + 10000), _自然数ならび). 小さい順にこれら数値を表示する(_自然数ならび) :- 小さい順に数値を(_自然数ならび,_小さい順に整列した自然数ならび), 表示する(_小さい順に整列した自然数ならび) 小さい順に数値を([],[]). 小さい順に数値を([_軸要素|_残りならび],_小さい順に整列した自然数ならび) :- 分割(_軸要素,_残りならび,_軸要素と等しいか小さい自然数ならび,_軸要素より大きい自然数ならび), 小さい順に数値を(_軸要素と等しいか小さい自然数ならび,_小さい順に整列した軸要素と等しいか小さい自然数ならび), 小さい順に数値を(_軸要素より大きい自然数ならび,_小さい順に整列した軸要素より大きい自然数ならび), 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]) :- writef('%t %t %t %t %t %t %t %t %t %t\n',[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), 表示する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/592 # # [1] 授業単元:データ構造入門 # [2] 問題文(含コード&リンク):問題文が長いためこちらに記載しました http://ime.nu/ideone.com/R8gaZ # # 【問題3】 # バブルソートを用いて、整数のデータ列を昇順に整列するプログラムを作成せよ。 # データ数をキーボード入力し、続いてその個数の整列していないデータを配列に格納し、 # データとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。 # 次にデータ列のソートを行い、結果の整列したデータ列をディスプレイ表示するとともに、 # 別のファイルへ出力する。なお、データ数は最大50として50をマクロ定義せよ。疑似乱数で # データを作成するために、【問題2】で作成した関数random_dataを使用すること。また、ソートには # 次の関数を作成して使うこと。 # ・void bubble(int data[],int num) # この関数はnum個の値が格納された配列data[]を、バブルソートアルゴリズムで昇順に並べ替える関数である。 'バブルソートを用いて、整数のデータ列を昇順に整列するプログラムを作成せよ。データ数をキーボード入力し、続いてその個数の整列していないデータを配列に格納しデータとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。 次にデータ列のソートを行い、結果の整列したデータ列をディスプレイ表示するとともに、別のファイルへ出力する。 なお、データ数は最大50として50をマクロ定義せよ。'(_出力ファイル名,_別の出力ファイル名) :- 'データ数は最大50としてデータ数をキーボード入力し、続いてその個数の整列していないデータを配列に格納しデータとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。 '(_出力ファイル名,_データ数,_データならび), 'データ列をバブルソートを用いて昇順に整列し、結果の整列したデータ列をディスプレイ表示するとともに、別のファイルへ出力する。'(_別の出力ファイル名,_データ数,_データならび,_整列したデータ列). 'データ数をキーボード入力し、続いてその個数の整列していないデータを配列に格納しデータとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。'(_出力ファイル名,_データ数,_データならび) :- 'データ数は最大50としてデータ数をキーボード入力し'(_データ数), 'その個数の整列していないデータを配列に格納し'(_データ数,_データならび), 'データとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。'(_出力ファイル名,_データ数,_データならび). 'データ数は最大50としてデータ数をキーボード入力し'(_データ数) :- 整数を得る(最大50のデータ数,between(1,50,_データ数),_データ数). 'その個数の整列していないデータを配列に格納し'(_データ数,_データならび) :- length(_データならび,_データ数), findall(N,( member(N,_データならび), N is random(_データ数) + 1), _データならび). 'データとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。'(_出力ファイル名,_データ数,_データならび) :- open(_述力ファイル名,write,Oustream), 'データと添え字番号を'(_データならび,_添え字番号,_データ), 'ディスプレイに一覧表示するとともにファイルへも出力する。'(Outstream,_添え字番号,_データ), close(Outstream). 'ディスプレイに一覧表示するとともにファイルへも出力する。'(Outstream,_添え字番号,_データ) :- writef('%t: %t\n',[_添え字番号,_値]), writef(Outstream,'%t: %t\n',[_添え字番号,_データ]), _添え字番号 = _データ数. 'データ列をバブルソートを用いて昇順に整列し、結果の整列したデータ列をディスプレイ表示するとともに、別のファイルへ出力する。'(_別の出力ファイル名,_データ数,_データならび,_昇順に整列したならび) :- 'データ列をバブルソートを用いて昇順に整列し'(_データならび,_昇順に整列したデータならび), '結果の整列したデータ列をディスプレイ表示するとともに、別のファイルへ出力する。'(_別の出力ファイル名,_昇順に整列したデータならび). 'データ列をバブルソートを用いて昇順に整列し'(_データならび,_昇順に整列したデータならび) :- バブルソート(_データならび,_昇順に整列したデータならび). '結果の整列したデータ列をディスプレイ表示するとともに、別のファイルへ出力する。'(_別の出力ファイル名,_昇順に整列したデータならび) :- open(_別のファイル名,write,Outstream), append(L0,[_データ|R],_昇順に整列したデータならび), writef('%t\n',[_データ]), writef(Outstream,'%t\n',[_データ]), R = [], close(Outstream). % 以下のサイトは # 出典:: 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. '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し'(_目的データ,_データならび). % 以下のサイトは # # taroはコーヒーのどの種類が好きですか? # 好きなコーヒー(taro,コロンビアスプレモ). 好きなコーヒー(hanako,グァテマラマラゴギーベ). 好きなコーヒー(taro,コスタリカ). 好きなコーヒー(hanako,コスタリカ). 'taroはコーヒーのどの種類が好きですか?'(_コーヒーの種類のリスト,_taroの好きなコーヒーの種類) :- \+(var(_コーヒーの種類のリスト)), member(_taroの好きなコーヒーの種類,_コーヒーの種類のリスト), 好きなコーヒー(taro,_taroの好きなコーヒーの種類). 'taroはコーヒーのどの種類が好きですか?'(_コーヒーの種類のリスト,_taroの好きなコーヒーの種類) :- var(_コーヒーの種類のリスト), コーヒーの種類のリストを得る(_コーヒーの種類のリスト), 好きなコーヒー(taro,_taroの好きなコーヒーの種類). コーヒーの種類のリストを得る(_コーヒーの種類のリスト) :- findall(_コーヒーの種類,( 好きなコーヒー(_,_コーヒーの種類)), _重複を許すコーヒーの種類のリスト), sort(_重複を許すコーヒーの種類のリスト,_コーヒーの種類のリスト). % 以下のサイトは # 出典:: 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/1276873238/829 # # 問題 # 数独の解答が9行9列の文字列で与えられたとき正しいかどうか判定せよ。 # # '数独の解答が9行9列の文字列で与えられたとき正しいかどうか'(_文字列) :- '数独の解答が9行9列の文字列で与えられたとき'(_文字列,L), 数独の回答が正しい(L). '数独の解答が9行9列の文字列で与えられたとき'(_9行9列の文字列,L) :- atom_chars(_9行9列の文字列,Chars), 改行を取り除きながら数字列を数値ならびに変換(Chars,L). 改行を取り除きながら数字列を数値ならびに変換([],[]). 改行を取り除きながら数字列を数値ならびに変換(['\n'|R1],R2) :- 改行を取り除きながら数字列を数値ならびに変換(R1,R2). 改行を取り除きながら数字列を数値ならびに変換([A|R1],[N|R2]) :- atom_number(A,N), 改行を取り除きながら数字列を数値ならびに変換(R1,R2). 数独の回答が正しい([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68,_69,_70,_71,_72,_73,_74,_75,_76,_77,_78,_79,_80,_81]) :- 数独診断([[_1,_2,_3,_4,_5,_6,_7,_8,_9], [_10,_11,_12,_13,_14,_15,_16,_17,_18], [_19,_20,_21,_22,_23,_24,_25,_26,_27], [_28,_29,_30,_31,_32,_33,_34,_35,_36], [_37,_38,_39,_40,_41,_42,_43,_44,_45], [_46,_47,_48,_49,_50,_51,_52,_53,_54], [_55,_56,_57,_58,_59,_60,_61,_62,_63], [_64,_65,_66,_67,_68,_69,_70,_71,_72], [_73,_74,_75,_76,_77,_78,_79,_80,_81], [_1,_10,_19,_28,_37,_46,_55,_64,_73], [_2,_11,_20,_29,_38,_47,_56,_65,_74], [_3,_12,_21,_30,_39,_48,_57,_66,_75], [_4,_13,_22,_31,_40,_49,_58,_67,_76], [_5,_14,_23,_32,_41,_50,_59,_68,_77], [_6,_15,_24,_33,_42,_51,_60,_69,_78], [_7,_16,_25,_34,_43,_52,_61,_70,_79], [_8,_17,_26,_35,_44,_53,_62,_71,_80], [_9,_18,_27,_36,_45,_54,_63,_72,_81], [_1,_2,_3,_10,_11,_12,_19,_20,_21], [_4,_5,_6,_13,_14,_15,_22,_23,_24], [_7,_8,_9,_16,_17,_18,_25,_26,_27], [_28,_29,_30,_37,_38,_39,_46,_47,_48], [_31,_32,_33,_40,_41,_42,_49,_50,_51], [_34,_35,_36,_43,_44,_45,_52,_53,_54], [_55,_56,_57,_64,_65,_66,_73,_74,_75], [_58,_59,_60,_67,_68,_69,_76,_77,_78], [_61,_62,_63,_70,_71,_72,_79,_80,_81]]). 数独診断([]) :- !. 数独診断([L|R]) :- sort(L,L1), length(L1,9), 数独診断(R). 数独([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68,_69,_70,_71,_72,_73,_74,_75,_76,_77,_78,_79,_80,_81]) :- 数独生成([[_1,_2,_3,_4,_5,_6,_7,_8,_9], [_10,_11,_12,_13,_14,_15,_16,_17,_18], [_19,_20,_21,_22,_23,_24,_25,_26,_27], [_28,_29,_30,_31,_32,_33,_34,_35,_36], [_37,_38,_39,_40,_41,_42,_43,_44,_45], [_46,_47,_48,_49,_50,_51,_52,_53,_54], [_55,_56,_57,_58,_59,_60,_61,_62,_63], [_64,_65,_66,_67,_68,_69,_70,_71,_72], [_73,_74,_75,_76,_77,_78,_79,_80,_81], [_1,_10,_19,_28,_37,_46,_55,_64,_73], [_2,_11,_20,_29,_38,_47,_56,_65,_74], [_3,_12,_21,_30,_39,_48,_57,_66,_75], [_4,_13,_22,_31,_40,_49,_58,_67,_76], [_5,_14,_23,_32,_41,_50,_59,_68,_77], [_6,_15,_24,_33,_42,_51,_60,_69,_78], [_7,_16,_25,_34,_43,_52,_61,_70,_79], [_8,_17,_26,_35,_44,_53,_62,_71,_80], [_9,_18,_27,_36,_45,_54,_63,_72,_81], [_1,_2,_3,_10,_11,_12,_19,_20,_21], [_4,_5,_6,_13,_14,_15,_22,_23,_24], [_7,_8,_9,_16,_17,_18,_25,_26,_27], [_28,_29,_30,_37,_38,_39,_46,_47,_48], [_31,_32,_33,_40,_41,_42,_49,_50,_51], [_34,_35,_36,_43,_44,_45,_52,_53,_54], [_55,_56,_57,_64,_65,_66,_73,_74,_75], [_58,_59,_60,_67,_68,_69,_76,_77,_78], [_61,_62,_63,_70,_71,_72,_79,_80,_81]]). 数独生成([]) :- !. 数独生成([L|R]) :- 変数に数値を埋める(L), 数独生成(R). 変数に数値を埋める(L) :- 既に使われている数値は候補から外す(L,[1,2,3,4,5,6,7,8,9],_数字候補), 変数に数値を埋める(_数字候補,L). 既に使われている数値は候補から外す([],L,L). 既に使われている数値は候補から外す([V|R1],L1,L) :- var(V), 既に使われている数値は候補から外す(R1,L1,L). 既に使われている数値は候補から外す([N|R1],L1,L) :- integer(N), select(N,L1,L2), 既に使われている数値は候補から外す(R1,L2,L). 変数に数値を埋める([],[]). 変数に数値を埋める(_数字候補,[N|R]) :- integer(N), 変数に数値を埋める(_数字候補,R). 変数に数値を埋める(_数字候補,[V|R]) :- var(V), select(V,_数字候補,_残り数字候補), 変数に数値を埋める(_残り数字候補,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/829 # # 問題 # 数独の解答が9行9列の文字列で与えられたとき正しいかどうか判定せよ。 # # '数独の解答が9行9列の文字列で与えられたとき正しいかどうか'(_文字列) :- '数独の解答が9行9列の文字列で与えられたとき'(_文字列,LL), 数独の回答が正しい(LL). '数独の解答が9行9列の文字列で与えられたとき'(_9行9列の文字列,LL) :- split(9行9列の文字列,['\n'],_行ならび), '9行9列の行ならびを行列に変換'(_行ならび,LL). '9行9列の行ならびを行列に変換'([],[]). '9行9列の行ならびを行列に変換'([_行|R1],[L|R2]) :- findall(N,( sub_atom(_行,_,1,_,A), atom_number(A,N)), L), '9行9列の行ならびを行列に変換'(R1,R2). 数独の回答が正しい(LL) :- '行・列要素の数独の解答は正しい'(LL), 矩形要素の数独の解答も正しい(LL). '行・列要素の数独の解答は正しい'(LL) :- 行要素の数独診断(LL), 転置(LL,LL2), 行要素の数独診断(LL2). 行要素の数独診断([]). 行要素の数独診断([L1|R]) :- 一意の数が9個(L1), 行要素の数独診断(R). 矩形要素の数独の解答も正しい([]). 矩形要素の数独の解答も正しい([L1,L2,L3|R1],L) :- 転置([L1,L2,L3],LL1), 矩形要素診断(LL1), 矩形要素の数独の解答も正しい(R1,R2). 矩形要素診断([]). 矩形要素診断([L1,L2,L3|R]) :- append(L1,L2,L3,L), 一意の数が9個(L), 矩形要素診断(R). 一意の数が9個(L1) :- sort(L1,L2), length(L2,9). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/243 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文(含コード&リンク): # ・問 マルチキークイックソートを非再帰で実装せよ。 # マルチキークイックソートは文字列を辞書順にソートする手法である。 # 例えば、文字列appleを5回巡回し、5つの文字列を生成する。 # この5つの文字列を辞書順にソートすると、以下のようになる。 # # 巡回     ソート後 # apple apple # pplea  eappl # pleap  → leapp # leapp pleap # eappl pplea # # 実際には文字列appleを2倍にし巡回文字列を得る。 # 例 : appleapple # この文字列に対して非再帰のマルチキークイックソートを適用せよ。 # マルチキークイックソートは文字列を辞書順にソートする(_文字列,_辞書順に整列した文字列) :- マルチキークイックソートの整列対象文字列の生成(_文字列,_整列対象文字列ならび), 辞書順整列(_整列対象文字列ならび,_辞書順に整列した文字列). マルチキークイックソートの整列対象文字列の生成(_文字列,_整列対象文字列ならび) :- atom_chars(_文字列,_文字ならび), atom_length(_文字列,_n), findall(_回転した文字列,( between(1,_n,N), ならびの回転(左方向,N,L,_回転した文字ならび), atom_chars(_回転した文字列,_回転した文字ならび)), _整列対象文字列ならび). 辞書順整列([],[]). 辞書順整列([_軸要素文字列|_残り文字列],_辞書順に整列した文字列) :- 辞書順分割(_軸要素文字列,_残り文字列,_より小さい文字列,_等しいかより大きい文字列), 辞書順整列(_より小さい文字列,_整列したより小さい文字列), 辞書順整列(_等しいかより大きい文字列,_整列した等しいかより大きい文字列), append(_整列したより小さい文字列,[_軸要素文字列|_整列した等しいかより大きい文字列],_辞書順に整列した文字列). 辞書順分割(_軸要素文字列,[],[],[]). 辞書順分割(_軸要素文字列,[_文字列|R1],L1,L2) :- atom_chars(_軸文字列,_文字ならび_1), atom_chars(_文字列,_文字列ならび_2), 辞書順分割(_文字ならび_1,_文字ならび_2,L1,L2,R1,R2), 辞書順分割(_軸要素文字列,R1,R1,R2). 辞書順分割(_文字ならび_1,_文字ならび_2,L1,R2,R1,R2) :- 辞書順文字列の比較(_軸要素文字ならび_1,_文字ならび,_文字ならび,_), atom_chars(_文字列,_文字ならび), L1 = [_文字列|R1],!. 辞書順分割(_文字ならび_1,_文字ならび_2,R1,L2,R1,R2) :- 辞書順文字列の比較(_軸要素文字ならび_1,_文字ならび,_,_文字ならび), atom_chars(_文字列,_文字ならび), L2 = [_文字列|R2],!. 辞書順文字列の比較([],[],[],[]) :- !. 辞書順文字列の比較(L,[],[],L) :- !. 辞書順文字列の比較([],L,[],L) :- !. 辞書順文字列の比較([_文字|R1],[_文字|R2],[_文字|R3],[_文字|R4]) :- 辞書順文字列の比較(R1,R2,R3,R4),!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_1|R1],[_文字_2|R2]) :- 英大文字(_文字_1), 英小文字(_文字_2), to_upper(_文字_2,_文字_1),!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_2|R2],[_文字_1|R1]) :- 英小文字(_文字_1), 英大文字(_文字_2), to_upper(_文字_1,_文字_2),!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_1|R1],[_文字_2|R2]) :- _文字_1 @< _文字_2,!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_2|R2],[_文字_1|R1]) :- _文字_1 @>= _文字_2,!. 英小文字(_英小文字) :- _英小文字 @>= 'a', _英小文字 @=< 'z'. 英大文字(_英大文字) :- _英大文字 @>= 'A', _英大文字 @=< 'Z'. % 以下のサイトは 相対番号を付加して降順に整列する(_対象ならび,_降順に整列したならび) :- 相対番号を付加する(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/71 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/ideone.com/TO8Kg 問題です。 # http://ime.nu/ideone.com/ZvUuR 課題を提出したら関数の定義 #              をしろといわれました。 # http://ime.nu/ideone.com/Nd5ir 自分なりにやったのですが #              ここからができませんでしたので #              よろしくお願いします。 # # 生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙するプログラムkadai12.c を書きなさい。ただしファイル名は画面から入力されるものとする(scanf()を使う)。 # ただし、wh-list.datに列挙される人数はプログラム開発時点では全く分からないものとする。 # # ヒント: # ○何をしなければならないかを大まかに書き下してみよう。 #  1. ファイルのオープン(これに先立ってファイル名を取得する必要がある) #  2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう) #  3.データの読み込み #  4.BMIの算出 #  5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい) #  6. 画面表示 # # ○BMIとは? # BMIは次のようにして計算されるものとする。 # BMI値=体重(キログラム)/(身長(メートル))^2 # '^2'は二乗を意味する。 # このBMI値が25を越えると、肥満とみなされる。 # # ○ファイルポインターがファイルの中間もしくは終わりをさしている時、これをファイルの先頭に戻す関数があります。 '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。ただしファイル名は画面から入力されるものとする。' :- '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んで'(LL), 'BMI値を計算し'(LL,LL1), 'BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。'(LL1). '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んで'(LL) :- write('データファイル名を入力してください : '), get_line(_データファイル名), get_split_lines(_データファイル名,[' ',','],LL). 'BMI値を計算し'(LL1,LL2) :- findall([_BMI値,_氏名],( member([_氏名,_身長,_体重],LL1), 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値)), LL2). /* 'BMI値を計算し'([],[]). 'BMI値を計算し'([[_氏名,_身長,_体重]|R1],[[_BMI値,_氏名]|R2]) :- 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値), 'BMI値を計算し'(R1,R2). */ 'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値) :- _BMI値 is _体重 / _身長 ^ 2. 'BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。'(LL1) :- 'BMI値が大きいもの順に'(LL1,LL3), その人のBMI値および肥満か否かを列挙する(LL3). 'BMI値が大きいもの順に'(LL1,LL3) :- sort(LL1,LL2), reverse(LL2,LL3). その人のBMI値および肥満か否かを列挙する(LL3) :- append(_,[[_BMI値,_氏名]|R],LL3), 'このBMI値が25を越えると、肥満とみなされる。'(_BMI値,_肥満判定), writef('%t は %t。\n',[_氏名,_肥満判定]), R = []. 'このBMI値が25を越えると、肥満とみなされる。'(_BMI値,肥満です) :- _BMI値 > 25.0,!. 'このBMI値が25を越えると、肥満とみなされる。'(_,肥満ではない). % 以下のサイトは # 出典:: 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),_名前順に整列した住所録). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/924 # # [1] 授業単元:C言語 # [2] 問題文: # 学生の英語、国語、数学の合計の得点データを処理するために、次のようなデータ型と名前のメンバを持つSCORE型構造体を考える。 # 学籍番号:整数型 number # 氏名:文字型 name[20] # 英語得点:整数型 eigo # 国語得点:整数型 kokugo # 数学得点:整数型 sugaku # 合計得点:整数型 goukei # SCORE型の2つの構造体変数x1,x2を宣言せよ。 # そしてキーボードから番号、氏名、各教科の得点を入力すると英語、国語、数学の3教科の合計点が計算され、合計点の高い方の学生の氏名と合計点が出力されるプログラムを作成せよ。 # <データ例> # 変数 番号 氏名 英語得点 国語得点 数学得点 # x1  1  nakashima 75  80    75 # x2  2  takada  77   82    70 # <出力列> # nakashima 230 # 'キーボードから番号、氏名、各教科の得点を入力すると英語、国語、数学の3教科の合計点が計算され、合計点の高い方の学生の氏名と合計点が出力される' :- 'キーボードから番号、氏名、各教科の得点を入力すると', '英語、国語、数学の3教科の合計点が計算され'(_合計点_番号ならび), '合計点の高い方の学生の氏名と合計点が出力される'(_合計点_番号ならび). 'キーボードから番号、氏名、各教科の得点を入力すると' :- 一人分の成績を定義する, 'キーボードから番号、氏名、各教科の得点を入力すると'. 'キーボードから番号、氏名、各教科の得点を入力すると'. 一人分の成績を定義する :- 番号を得る(_番号), 氏名を得る(_氏名), 各教科の得点を得る(_英語得点,_国語得点,_数学得点), 成績を定義する(_番号,_氏名,_英語得点,_国語得点,_数学得点). 番号を得る(_番号) :- 整数を得る(番号,_番号),!, \+(_番号==0). 氏名を得る(_氏名) :- write('氏名を入力してください : '), get_line(_氏名). 各教科の得点を得る(_英語得点,_国語得点,_数学得点) :- 整数を得る(英語得点,_英語得点), 整数を得る(国語得点,_国語得点), 整数を得る(数学得点,_数学得点). 成績を定義する(_番号,_氏名,_英語得点,_国語得点,_数学得点) :- 変数xxを得る(_XX), 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点). 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点) :- assertz(成績(_XX,番号,_番号)), assertz(成績(_XX,氏名,_氏名)), assertz(成績(_XX,英語成績,_英語成績)), assertz(成績(_XX,国語成績,_国語成績)), assertz(成績(_XX,数学成績,_数学成績)),!. 変数xxを得る(_XX) :- N is random(99999999) + 1, 整数から文字列(8,N,A), atomic_list_concat([x,A],_XX), \+(成績(_XX,番号,_)),!. 変数xxを得る(_XX) :- 変数xxを得る(_XX). '英語、国語、数学の3教科の合計点が計算され'(_合計点_変数番号ならび) :- setof(_XX,[_XX,_番号] ^ ( 成績(_XX,番号,_番号)),_XXならび), findall([_合計点,_XX],( member(_XX,_XXならび), 合計点を計算する(_XX,_合計点)),_合計点_変数番号ならび). 合計点を計算する(_XX,_合計点) :- 成績(_XX,英語成績,_英語成績), 成績(_XX,国語成績,_国語成績), 成績(_XX,数学成績,_数学成績), _合計点 is _英語成績 + _国語成績 + _数学成績. '合計点の高い方の学生の氏名と合計点が出力される'(_合計点_番号ならび) :- sort(_合計点_番号ならび,_整列された合計点_番号ならび), reverse(_整列された合計点_番号ならび,_降順に整列された合計点_番号ならび), _整列された合計点_番号ならび = [[_合計点,_XX]|_], 成績(_XX,氏名,_氏名), writef('合計点が高い方は %t で合計点 %t 点です。\n',[_氏名,_合計点]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/927 # # ・バージョン # MySQL5.5 # # ・テーブルデータ # time (TIME), num1 (INT), num2 (INT) # # 00:00:00, 1, 0 # 00:00:10, 2, 0 # 00:00:20, 3, 2 # 00:00:30, 4, 3 # 00:00:40, 5, 3 # # ・欲しい結果 # 00:00:20, 3, 2 # 00:00:30, 4, 3 # 00:00:40, 5, 3 # # ・説明 # time(時刻)が新しい(最近の)方から3行ぬきだし、 # timeが昇順になるように並べます。 # SELECT文でうまいことできないでしょうか。 # よろしくお願いします。 # # 'time(時刻)が新しい(最近の)方から3行ぬきだし、timeが昇順になるように並べます。'(_time,_num1,_num2) :- findall([_time,_num1,_num2],( テーブルデータ(_time,_num1,_num2)), _テーブルデータ), 整列(_テーブルデータ,_整列したテーブルデータ), append(_,[L_1,L_2,L_3],_整列したテーブルデータ), member([_time,_num1,_num2],[L_1,L_2,L_3]). % 以下のサイトは # 出典:: 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/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(_大文字を小文字に変換した文字列,[' '],_単語ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/820 # # 【質問テンプレ】 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):その他の制限:自分の番号と身長と体重を入力し (体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満) # で区別し これを終了するまで繰り返す 番号0と打ったら入力を終了し、それぞれ1種類ずつのBMIが一番大きい人の番号体重身長BMIを表示する # # '各々自分の番号と身長と体重を入力し、(体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満)で区別し これを終了するまで繰り返す 番号0と打ったら入力を終了し、それぞれ1種類ずつのBMIが一番大きい人の番号体重身長BMIを表示する' :- '各々自分の番号を入力'(_番号), '身長と体重を入力し、(体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満)で区別することを番号0と入力されるまで繰り返す'(_番号), 'それぞれ1種類ずつのBMIが一番大きい人の番号体重身長BMIを表示する'. '各々自分の番号を入力'(_番号) :- 整数を得る(自分の番号,_番号). '身長と体重を入力し、(体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満)で区別することを番号0と入力されるまで繰り返す'('0') :- !. '身長と体重を入力し、(体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満)で区別することを番号0と入力されるまで繰り返す'(_番号) :- 身長と体重を入力し(_身長,_体重), '身長・体重・BMIを登録する'(_番号,_身長,_体重,_BMI), '各々自分の番号を入力'(_次の番号), '身長と体重を入力し、(体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満)で区別することを番号0と入力されるまで繰り返す'(_次の番号). 身長と体重を入力し(_身長,_体重) :- 身長を入力(身長,(_身長 > 0.0,_身長 =< 2.3),_身長), 体重を入力(体重,(_体重 > 0.0,_体重 =< 300.0),_体重). 身長を入力(_身長) :- 数を得る(身長,(_身長 > 0.0,_身長 =< 2.3),_身長). 体重を入力(_体重) :- 数を得る(体重,(_体重 > 0.0,_体重 =< 300.0),_体重). '身長・体重・BMIを登録する'(_番号,_身長,_体重) :- _BMI is _体重/(_身長*_身長), assertz(身長(_番号,_身長)), assertz(体重(_番号,_体重)), assertz(BMI(_番号,BMI)). 'それぞれ1種類ずつのBMIが一番大きい人の番号体重身長BMIを表示する' :- append(_,[_BMI種類|R],[軽体重,普通体重,前肥満,肥満]), 'BMI種類の表示'(_BMI種類), R = []. 'BMI種類の表示'(_BMI種類) :- findall([_BMI,_番号,_身長,_体重],( 'BMI種類に適合する番号'(_BMI種類,_番号,_身長,_体重,_BMI)), LL1), 降順整列(LL1,[[_BMI,_番号,_身長,_体重]|_]), writef('%tの人でBMIがもっとも大きい人 : 番号: %t, 身長: %t, 体重: %t, BMI: %t ',[_BMI種類,_番号,_身長,_体重,_BMI]). 'BMI種類に適合する番号'(_BMI種類,_番号,_身長,_体重,_BMI) :- 'BMI'(_番号,_BMI), 'BMI診断'(_BMI,_BMI種類), 身長(_番号,_身長), 体重(_番号,_体重). 'BMI診断'(_BMI,軽体重) :- _BMI < 18.5. 'BMI診断'(_BMI,普通体重) :- _BMI >= 18.5, _BMI < 25. 'BMI診断'(_BMI,前肥満) :- _BMI >= 25.0, 'BMI診断'(_BMI,肥満) :- _BMI >= 30.0. 降順整列(L1,L3) :- sort(L1,L2), reverse(L2,L3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/918 # # ・DBMS名とバージョン # MySQL5 # ・テーブルデータ # name (verchar) # # abc040 # abc100 # abc90 # abc20 # abc1000 # # ・欲しい結果 # nameはユニーク # abcは固定、そのあとに数値文字列 # ソートして、数値文字列の大きい順に抽出したい # # abc1000 # abc100 # abc90 # abc040 # abc20 # # ・説明 # '欲しい結果 nameはユニーク abcは固定、そのあとに数値文字列 ソートして、数値文字列の大きい順に抽出したい'(_name) :- findall([N,_name], テーブルデータ(_name), sPLIT(_name,[abc],[_,N])), L), 降順にソートする(L1,L3), member([_,_name],L3). 降順にソートする(L1,L3) :- sort(L1,L2), reverse(L2,L3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/737 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/hx5VH # # 試験の各科目の点数を、受験者ごとに「出席番号 体育 美術 英語 数学 社会」の順番でテキストファイルに記録する。なお、出席番号は数字4桁、科目の点数は100点を満点とする。 # #  例: #    0001 55 66 66 77 77 # 0002 44 55 33 44 33 # 0003 33 43 53 53 53 # . # . # # 1,出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をファイルに記録するプログラムの作成。 # なお出力ファイル名はコマンドライン引数で与えることとし、出席番号に数字以外の文字が入力された場合にデータの入力を終了せよ。 # # 2,作成したファイルを読み込み、受験者ごとの合計点、順位を求め「出席番号 合計点 順位」 # の順にファイルに出力するプログラムを作成せよ。出力は成績順に並び替えなくとも良い。ただし、 # 入力ファイル名と出力ファイル名はコマンドライン引数で与えるものとする。 # # ファイル処理について習いました。stdin やFILE構造体、書式付き入出力、 # ブロック単位の入出力(size_t fwrite(const void *ptr, size_t size,size_t nmemb,FILE *stream) ) # などを習いました '作成したファイルを読み込み、受験者ごとの合計点、順位を求め「出席番号 合計点 順位」の順にファイルに出力する'(_入力ファイル,_出力ファイル) :- '作成したファイルを読み込み'(LL), '受験者ごとの合計点、順位を求め'(LL,LL3), '「出席番号 合計点 順位」の順にファイルに出力する'(_出力ファイル,LL3),!. '作成したファイルを読み込み'(LL) :- get_split_lines(_入力ファイル,[' '],LL). '受験者ごとの合計点、順位を求め'(LL,LL3) :- findall([_合計点,_出席番号],( 受験者ごとの(LL,_出席番号,_体育,_美術,_英語,_数学,_社会), 合計点(_体育,_美術,_英語,_数学,_社会,_合計点)), LL1), 順位を求め(LL1,LL3). 受験者ごとの(LL,_出席番号,_体育,_美術,_英語,_数学,_社会) :- member([_出席番号,_体育,_美術,_英語,_数学,_社会],LL). 合計点(_体育,_美術,_英語,_数学,_社会,_合計点) :- _合計点 is _体育 + _美術 + _英語 + _数学 + _社会. 順位を求め(LL1,LL3) :- 合計点の大きい順に(LL1,LL2), 順位を張る(1,LL2,LL3). 合計点の大きい順に(LL1,LL2) :- sort(LL1,LL3), reverse(LL3,LL2). 順位を張る([],[]). 順位を張る(_順位,[[_合計点,_出席番号_1],[_合計点,_出席番号_2]|R1],[[_出席番号_1,_合計点,_順位]|R2]) :- 順位を張る(_順位,[[_合計点,_出席番号_2]|R1],R2),!. 順位を張る(_順位,[[_合計点,_出席番号]|R1],[[_出席番号,_合計点,_順位]|R2]) :- _順位_2 is _順位 + 1, 順位を張る(_順位_2,R1,R2). '「出席番号 合計点 順位」の順にファイルに出力する'(_出力ファイル,LL) :- open(_出力ファイル,write,Outstream), append(_,[[_出席番号,_合計点,_順位]|R],LL), writef(Outstream,'%t %t %t\n',[_出席番号,_合計点,_順位]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/413 # # [1] 授業単元: C言語 # [2] 問題文:http://ime.nu/codepad.org/je2akZ6u # #include # # int main(){ # int num[100]; # int data, i, j; # FILE* FP; # # //データの個数を入力 # printf("データの個数を入力してください。"); # scanf("%d", &data); # # //読み込み # FP = fopen("readFile.txt","r"); # # for(i=0; i&nplt;dat&npgta; i++){ # fscanf(FP,"%d", &num[i]); # } # fclose(FP); # # //書き込み # FP = fopen("writeFile.txt","w"); # for(i=0; i&nplt;data; i++){ # fprintf(FP,"%d ", num[i]); # } # fclose(FP); # return(0); # } # writeFile.txtの表示を # 11 22 33 44 55 # 66 77 88 99 00 # にするにはどうすればいい? # 'データの個数を入力し、readFile.txtを読み、昇順にデータを並べ替えて、writeFile.txtに一行5データずつ出力する' :- 'まずデータの個数を入力し'(_データの個数), 'readFile.txtを読み'(_データの個数,_データならび), '昇順にデータを並べ替えて'(_データならび,_昇順に整列したデータならび), 'ファイルwriteFile.txtに5データ毎に改行して書き込む'(_昇順に整列したデータならび). 'まずデータの個数を入力し'(_学生の人数) :- 整数を得る(データの個数,_データの個数). 'readFile.txtを読み'(_データの個数,_データならび) :- get_split_lines('readFile.txt',[' '],LL), 平坦化(LL,_データならび_1), データの個数分を切り取る(_データの個数,_データならび_1,_データならび). データの個数分を切り取る(_データの個数,_データならび_1,_データならび) :- length(_データならび_1,_要素数), _要素数 >= _データの個数, length(_データならび,_データの個数), append(_データならび,_,_データならび_1),!. データの個数分を切り取る(_,_データならび,_データならび). '昇順にデータを並べ替えて'(_データならび,_昇順に整列したデータならび) :- 整列(_データならび,_昇順に整列したデータならび). 整列([],[]). 整列([_軸要素|_着目した科目の成績ならび],_昇順に整列した着目した科目の成績ならび) :- 分割(_軸要素,_着目した科目の成績ならび,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび), 整列(_軸要素より小さい成績ならび,_整列した軸要素より小さい成績ならび), 整列(_軸要素より大きい成績ならび,_整列した軸要素より大きい成績ならび), append(_整列した軸要素より小さい成績ならび,[_軸要素|_整列した軸要素より大きい成績ならび],_昇順に整列した着目した科目の成績ならび). 分割(_,[],[],[]). 分割(_軸要素,[[_成績,_No]|R1],[[_成績,_No]|_軸要素より小さい成績ならび],_軸要素と等しいか大きい成績ならび) :- _成績 @<_軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 分割(_軸要素,[[_成績,_No]|R1],_軸要素より小さい成績ならび,[[_成績,_No]|_軸要素と等しいか大きい成績ならび]) :- _成績 @>= _軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 'ファイルwriteFile.txtに5データ毎に改行して書き込む'(_整列した得点ならび) :- '得点ならびを頭部零文字列ならびに変換'(_整列した得点ならび,_頭部零文字列ならび), open('writeFile.txt',write,Outstream), 'Outstreamに書き込む'(Outstream,_頭部零文字列ならび), close(Outstream). '5データ毎にOutstreamに書き込む'(_,[]) :- !. '5データ毎にOutstreamに書き込む'(Outstream,_頭部零文字列ならび) :- '5データ毎に'(_得点ならび,A,B,C,D,E,_残りならび), writef(Outstream,'%t %t %t %t %t\n',[A,B,C,D,E]), '5データ毎にOutstreamに書き込む'(Outstream,_残りならび). '5データ毎に'([A,B,C,D,E|_残りならび],A,B,C,D,E,_残りならび) :- !. '5データ毎に'(_得点ならび,A,B,C,D,E,[]) :- append(_得点ならび,L1,[A,B,C,D,E]), all(L1,'00'). '得点ならびを頭部零文字列ならびに変換'([],[]) :- !. '得点ならびを頭部零文字列ならびに変換'([N|R1],[A|R2]) :- 頭部零文字列(2,N,A), '得点ならびを頭部零文字列ならびに変換'(R1,R2). 頭部零文字列(_N桁,_整数,_頭部零文字列) :- length(L,_N桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,'0'), atomic_list_concat(L,_頭部零文字列),!. 頭部零文字列(_N桁,_整数,_頭部零文字列) :- number_chars(_整数,Chars), atomic_list_concat(Chars,_頭部零文字列). % 平坦化/2 % ここでは使っていない'N個組'/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/399 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # まず学生の人数(100人以下)を入力し、成績結果のファイルseiseki.txtを読み、 # それから国語または数学、英語の点数のどれかに注目した小から大への順番に従ってデータを並べ替えて、 # write.txtに出力するプログラムを作成しなさい。 # 例 # seiseki.txt # No. 国語 数学 英語 # 1  90 80 70 # 2   85 75 65 # 3   80 70 60 # 4   75 65 55 # 5   70 60 50 # # 学生の人数を入力してください。6 # 科目番号を入力してください。 # 1:国語、2:数学、3:英語 # 2 # # write.txt # 5 70 60 50 # 4 75 65 55 # 3 80 70 60 # 2 85 75 65 # 1 90 80 70 # 'まず学生の人数(100人以下)を入力し、成績結果のファイルseiseki.txtを読み、それから国語または数学、英語の点数のどれかに注目した小から大への順番に従ってデータを並べ替えて、write.txtに出力する' :- 'まず学生の人数(100人以下)を入力し'(_学生の人数), '成績結果のファイルseiseki.txtを読み'(_学生の人数,_成績ならび), 'それから国語または数学、英語の点数のどれかに注目'(_注目した科目,_成績ならび,_着目した科目の成績ならび), '小から大への順番に従ってデータを並べ替えて'(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび), 'write.txtに出力する'(_昇順に整列した着目した科目の成績ならび,_成績ならび). 'まず学生の人数(100人以下)を入力し'(_学生の人数) :- 整数を得る(学生の人数,_学生の人数 =< 100,_学生の人数). '成績結果のファイルseiseki.txtを読み'(_学生の人数,_成績ならび) :- get_split_lines('seiseki.txt',[' '],LL), 平坦化(LL,_成績ならび_1), 学生の人数分を切り取る(_学生の人数,_成績ならび_1,_成績ならび). 学生の人数分を切り取る(_学生の人数,_成績ならび_1,_成績ならび) :- length(_成績ならび_1,_要素数), _要素数 >= _学生の人数, length(_成績ならび,_学生の人数), append(_成績ならび,_,_成績ならび_1),!. 学生の人数分を切り取る(_学生の人数,_成績ならび,_成績ならび). 'それから国語または数学、英語の点数のどれかに注目'(_注目した科目,_成績ならび,_注目した科目の成績ならび) :- 注目した科目を選択する(_注目した科目), findall([_注目した科目の成績,_No],( member([_No,_国語,_数学,_英語],_成績ならび), 注目した科目成績を選択する(_注目した科目,[_国語,_数学,_英語],_注目した科目の成績)), _注目した科目の成績ならび). 注目した科目を選択する(_注目した科目) :- write('国語、数学、英語のうち、注目した科目を入力してください : '), get_line(Line), '診断: 注目した科目を選択する'(Line,_注目した科目),!. 注目した科目を選択する(_注目した科目) :- 注目した科目を選択する(_注目した科目). '診断: 注目した科目を選択する'(_注目した科目,_注目した科目) :- member(_注目した科目,[国語,数学,英語]),!. '診断: 注目した科目を選択する'(Line,_注目した科目) :- write('入力された %t は国語、数学、英語のいずれでもありません。再入力をお願いします。\n',[Line]), fail. 注目した科目成績を選択する(国語,[_国語,_数学,_英語],_国語). 注目した科目成績を選択する(数学,[_国語,_数学,_英語],_数学). 注目した科目成績を選択する(英語,[_国語,_数学,_英語],_英語). '小から大への順番に従ってデータを並べ替えて'(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび) :- 整列(_着目した科目の成績ならび,_昇順に整列した着目した科目の成績ならび). 整列([],[]). 整列([_軸要素|_着目した科目の成績ならび],_昇順に整列した着目した科目の成績ならび) :- 分割(_軸要素,_着目した科目の成績ならび,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび), 整列(_軸要素より小さい成績ならび,_整列した軸要素より小さい成績ならび), 整列(_軸要素より大きい成績ならび,_整列した軸要素より大きい成績ならび), append(_整列した軸要素より小さい成績ならび,[_軸要素|_整列した軸要素より大きい成績ならび],_昇順に整列した着目した科目の成績ならび). 分割(_,[],[],[]). 分割(_軸要素,[[_成績,_No]|R1],[[_成績,_No]|_軸要素より小さい成績ならび],_軸要素と等しいか大きい成績ならび) :- _成績 @<_軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 分割(_軸要素,[[_成績,_No]|R1],_軸要素より小さい成績ならび,[[_成績,_No]|_軸要素と等しいか大きい成績ならび]) :- _成績 @>= _軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 'write.txtに出力する'(_昇順に整列した着目した科目の成績ならび,_成績ならび) :- open('write.txt',write,Outstream), 'Outstreamへ出力'(Outstream,_昇順に整列した着目した科目の成績ならび,_成績ならび), close(Outstream). 'Outstreamへ出力'(Outstream,_昇順に整列した着目した科目の成績ならび,_成績ならび) :- append(_,[[_成績,_No]|R],_昇順に整列した着目した科目の成績ならび), member([_No,_国語,_数学,_英語],_成績ならび), writef(Outstream,'%t %t %t %t\n',[_No,_国語,_数学,_英語]), R = []. % 平坦化/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/375 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # ファイル double.txt に複数個の実数が記されている。 # この実数の個数を入力し、それからファイル double.txt に記されている実数を読み込み、 # それらを小さい物から大きい物の順番に並び替えて、ファイル sort.txt に書き出すプログラムを作成しなさい。 # ただしファイル double.txt に記されている実数の個数は50個以下とする # 'ファイル double.txt に複数個の実数が記されている。この実数の個数を入力し、それからファイル double.txt に記されている実数を読み込み、それらを小さい物から大きい物の順番に並び替えて、ファイル sort.txt に書き出す' :- 実数の個数を入力する(_実数の個数), get_split_lines('double.txt',[' ','\n',','],L1), それらを小さい物から大きい物の順番に並び替えて(L1,L2), 'ファイル sort.txt に書き出す'(_実数の個数,L2). 実数の個数を入力する(_実数の個数) :- 整数を得る(実数の個数,_実数の個数). それらを小さい物から大きい物の順番に並び替えて([],[]). それらを小さい物から大きい物の順番に並び替えて([_軸要素|R1],L2) :- 分割(_軸要素,R1,_軸要素より小さい要素ならび,_軸要素と等しいか大きい要素ならび), それらを小さい物から大きい物の順番に並び替えて(_軸要素より小さい要素ならび,_整列した軸要素より小さい要素ならび), それらを小さい物から大きい物の順番に並び替えて(_軸要素と等しいか大きい要素ならび,_整列した軸要素と等しいか大きい要素ならび), append(_整列した軸要素より小さい要素ならび,[_軸要素|_整列した軸要素と等しいか大きい要素ならび],L2). 分割(_,[],[],[]). 分割(_軸要素,[_要素|R1],[_要素|R2],R3) :- _要素 @< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[_要素|R1],R2,[_要素|R3]) :- _要素 @>= _軸要素, 分割(_軸要素,R1,R2,R3). 'ファイル sort.txt に書き出す'(_実数の個数,L) :- length(L0,_実数の個数), append(L0,_,L). open('sort.txt',write,Outstream), 'Outstreamに書き出す'(Outstream,L0), close(Outstream). 'Outstreamに書き出す'(_,[]). 'Outstreamに書き出す'(Outstream,[_要素|R]) :- writef(Outstream,'%t\n',[_要素]), 'Outstreamに書き出す'(Outstream,R). % 整数を得る/2 % get_split_lines/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/186 # # [1] 授業単元:数値解析 # [2] 問題文(含コード&リンク): # ある実験を行って,2 つの量(x; y) に関するデータが500 組得られたとする # この実験データとそれに対する近似直線および近似直線の傾きと切片の値を求める # プログラムを完成させよ # 'ある実験を行って,2 つの量(x; y) に関するデータが500 組得られたとする。この実験データとそれに対する近似直線および近似直線の傾きと切片の値を求める'(_傾き,_切片) :- 'ある実験を行って,2 つの量(x; y) に関するデータが500 組得られた'(_データ組ならび), 'この実験データとそれに対する近似直線および近似直線の傾きと切片の値を求める'(_データ組ならび,_傾き,_切片). 'この実験データとそれに対する近似直線および近似直線の傾きと切片の値を求める'(_データ組ならび,_a,_b) :- 整列(_データ組ならび,_整列したデータ組ならび), length(_整列したデータ組ならび,_n), xy系列に分割(_整列したデータ組ならび,Lx,Ly), 一次方程式への近似(_n,Lx,Ly,_a,_b). 一次方程式への近似(_n,Lx,Ly,_a,_b) :- sigma_xy(Lx,Ly,Sxy), sigma_x(Lx,Sx), sigma_y(Ly,Sy), sigma_x2(Lx,Sx2), _a is (_n * Sxy - Sx * Sy) / (_n * Sx2 - Sx * Sx), _b is (_n * Sx2 * Sy - Sxy * Sx) / (_n * Sx2 - Sx * Sx). sigma_x2(Lx,S) :- findsum(_x,( member(_x,Lx), _x_2 is _x * _x), S). sigma_x1(Lx,S) :- findsum(_x,( member(_x,Lx)), S). sigma_y1(Ly,S) :- findsum(_x,( member(_y,Ly)), S). sigma_xy([],[],0). sigma_xy([_x|R1],[_y|R2],S) :- sigma_xy(R1,R2,S1), S is _x * _y + S1. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #164 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # n人の点数を読み込み、その中央値を求めたい。 # そこで、次の関数を 作成しなさい。 # *標準入力から読み込んだ点数を配列に代入する関数。 # ただし、呼び出し時には人数は与えられず、負の点数が入力されたら、 # その直前までの点数を返すものとする。また、人数を関数の返却値で返す。 # 例.85, 58, 90, 65, 45, -1 のときは、5名の点数を配列に入れ、 # 関数自身は人数の5を返却する。 # *配列の中身を昇順に並べ替える関数。ここで、配列のi番目とj番目の要 # 素の値を入れ替えるには、次のように行う。 # int temp = ary[i]; # ary[i] = ary[j]; # ary[j] = temp; # * 配列から中央値を返却する関数。 # 中央値は、データ数が奇数個のときは、 1番目から数えて(n+1)/2番目の # データであり、偶数個のときは、n/2番目とn/2+1番目のデータの平均値でる。 # 例.50, 70, 90のときは、中央値は70であり、50, 70, 80, 90のときは、 中 # 央値は75である。 # 適切な実行例を作成し、上記の関数が正しく動作することを示しなさい。 # 'n人の点数を読み込み、その中央値を求めたい。そこで、次の関数を作成しなさい。 *標準入力から読み込んだ点数を配列に代入する関数。ただし、呼び出し時には人数は与えられず、負の点数が入力されたら、その直前までの点数を返すものとまた、人数を関数の返却値で返す。'(_人数,_中央値) :- 整数を得る(人数,_人数), '人数分の点数を入力する。ただし、負の点数が入力されたら、その直前の点数を返す'(_人数,_点数ならび), 中央値(_点数ならび,_中央値). '人数分の点数を入力する。ただし、負の点数が入力されたら、その直前の点数を返す'(_人数,_点数ならび) :- findall(_人数,_点数,( 整数を得る(点数,_点数), ( _点数 < 0,!,fail;true)),_点数ならび),!. 中央値(_標本ならび,_中央値) :- 整列して中央値を得る(_標本ならび,_中央値). 整列して中央値を得る(_標本ならび,_中央値) :- 重複要素を残す整列(_標本ならび,_整列した標本ならび), 中央値を得る(_整列した標本ならび,_中央値). 中央値を得る(_整列した標本ならび,_中央値) :- length(_整列した標本ならび,_要素数), _要素数の半分 is _要素数 // 2, 中央値を得る(_整列した標本ならび,_要素数,_要素数の半分,_中央値). 中央値を得る(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- '標本数が奇数の時は中央順位、偶数の時は中央二値の平均値'(_整列した標本ならび,_要素数,_要素数の半分,_中央値). '標本数が奇数の時は中央順位、偶数の時は中央二値の平均値'(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- 標本数が奇数の時は中央順位(_整列した標本ならび,_要素数,_要素数の半分,_中央値). '標本数が偶数の時は中央順位、偶数の時は中央二値の平均値'(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- 標本数が偶数の時は中央二値の平均値(_整列した標本ならび,_要素数,_要素数の半分,_中央値). 標本数が奇数の時は中央順位(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- 奇数(_要素数), 中央順位(_中央値). 中央順位(_整列した標本ならび,_要素数の半分,_中央値) :- length(L1,_要素数の半分), length(L2,_要素数の半分), append(L1,[_中央値|L2],_整列した標本ならび). 標本数が偶数の時は中央二値の平均値(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- 偶数(_要素数), 中央二値(_整列した標本ならび,_要素数の半分,_中央値_1,_中央_2), _中央値 is (_中央値_1 + _中央値_2) / 2. 中央二値(_整列した標本ならび,_要素数の半分,_中央値_1,_中央_2) :- length([_|L1],_要素数の半分), length([_|L2],_要素数の半分), append(L1,[_中央値1,_中央値2|L2],_整列した標本ならび). 奇数(_奇数) :- 1 is _奇数 mod 2. 偶数(_偶数) :- 0 is _偶数 mod 2. 重複要素を残す整列([],[]) :- !. 整列(_対象ならび,_整列したならび) :- _対象ならび = [_軸要素|_残り対象ならび], 重複要素を残す整列(_軸要素,_残り対象ならび,_整列したならび). 重複要素を残す整列(_軸要素,_軸要素を除いた対象ならび,_整列したならび) :- 分割(_軸要素,_軸要素を除いた対象ならび,_軸要素に等しいかより小さい要素のならび,_軸要素より大きい要素のならび), 重複要素を残す整列(_軸要素に等しいかより小さい要素のならび,_整列した軸要素に等しいかより小さい要素のならび), 重複要素を残す整列(_軸要素より大きい要素のならび,_整列した軸要素より大きい要素のならび), append(_軸要素に等しいかより小さい要素のならび,[_軸要素|_整列した軸要素より大きい要素のならび],_整列したならび). 分割(_軸要素,[],[],[]). 分割(_軸要素,[_要素|_残り対象ならび],[_要素|_軸要素に等しいかより小さい要素のならび],_軸要素より大きい要素のならび) :- _要素 @=< _軸要素, 分割(_軸要素,_残り対象ならび,_軸要素に等しいかより小さい要素のならび,_軸要素より大きい要素のならび). 分割(_軸要素,[_要素|_残り対象ならび],_軸要素に等しいかより小さい要素のならび,[_要素|_軸要素より大きい要素のならび]) :- _要素 @> _軸要素, 分割(_軸要素,_残り対象ならび,_軸要素に等しいかより小さい要素のならび,_軸要素より大きい要素のならび). 整数を得る(_催促文字列,_整数) :- 行入力して整数に変換する(_催促文字列,_整数),!. 整数を得る(_催促文字列,_整数) :- 整数を得る(_催促文字列,_整数). 行入力して整数に変換する(_催促文字列,_整数) :- 行入力(_催促文字,_行), 整数検査(_行,_整数). 行入力(_催促文字,_行) :- writef('%w ',[_催促文字]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). 整数検査(_行,_整数) :- read_term_from_atom(_行,_整数,[]), integer(_整数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/134 # # 内容: # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/t5qL2 # # 名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し, # BMI指数の小さい順に並べた線形リストを作成した上で, # BMI指数の小さい順にBMI指数,身長,体重,名前を出力するプログラムを作成せよ。 # ただし,入力件数は不定とし,名前の1文字目に'0'を入れることでデータ入力を終了するものとする。 # # BMI指数は以下の式で算出できる。 # BMI = 体重[kg]/(身長[m])^2 '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,BMI指数の小さい順に並べた線形リストを作成した上で,BMI指数の小さい順にBMI指数,身長,体重,名前を出力する。ただし,入力件数は不定とし,名前の1文字目に"0"を入れることでデータ入力を終了するものとする' :- '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト), 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(_BMI指数の小さい順並べた線形リスト). '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト) :- findall([_BMI指数,_名前,_身長,_体重],( 名前を得る(_名前), ( sub_atom(_名前,0,1,_,'0'),!,fail; '身長[cm],体重[kg]を入力'(_身長,_体重), 'BMI指数を算出する'(_身長,_体重,_BMI指数))), _BMI指数を鍵とした線形リスト). 名前を得る(_名前) :- write('名前(半角英字によるローマ字表記)を入力してください : '), get_line(_名前), 半角英字によるローマ字表記(_名前). 名前を得る(_名前) :- 名前を得る(_名前). '身長[cm],体重[kg]を入力'(_身長,_体重) :- 数を得る('身長[cm]',_身長), 数を得る('体重[kg]',_体重),!. 'BMI指数を算出する'(_身長,_体重,_BMI指数) :- _BMI指数 is _体重 / (_身長 ^ 2). 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト) :- sort(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([]). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([[_BMI指数,_氏名,_身長,_体重]|R]) :- writef('%t,%t,%t,%t\n',[_BMI指数,_身長,_体重,_名前]), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(R). 半角英字によるローマ字表記(_名前) :- findall(_文字,( sub_atom(_名前,_,1,_,_文字), 空白または半角英字の文字(_文字)), _空白または半角英字であった文字ならび), atomic_list_concat(_空白または半角英字であった文字ならび,_名前). 空白または半角英字の文字(' '). 空白または半角英字の文字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. 空白または半角英字の文字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. % 数を得る/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/134 # # 内容: # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/t5qL2 # # 名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し, # BMI指数の小さい順に並べた線形リストを作成した上で, # BMI指数の小さい順にBMI指数,身長,体重,名前を出力するプログラムを作成せよ。 # ただし,入力件数は不定とし,名前の1文字目に'0'を入れることでデータ入力を終了するものとする。 # # BMI指数は以下の式で算出できる。 # BMI = 体重[kg]/(身長[m])^2 '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,BMI指数の小さい順に並べた線形リストを作成した上で,BMI指数の小さい順にBMI指数,身長,体重,名前を出力する。ただし,入力件数は不定とし,名前の1文字目に"0"を入れることでデータ入力を終了するものとする' :- '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト), 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(_BMI指数の小さい順並べた線形リスト). '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト) :- findall([_BMI指数,_名前,_身長,_体重],( 名前を得る(_名前), ( sub_atom(_名前,0,1,_,'0'),!,fail; '身長[cm],体重[kg]を入力'(_身長,_体重), 'BMI指数を算出する'(_身長,_体重,_BMI指数))), _BMI指数を鍵とした線形リスト). 名前を得る(_名前) :- write('名前(半角英字によるローマ字表記)を入力してください : '), get_line(_名前), 半角英字によるローマ字表記(_名前). 名前を得る(_名前) :- 名前を得る(_名前). '身長[cm],体重[kg]を入力'(_身長,_体重) :- 数を得る('身長[cm]',_身長), 数を得る('体重[kg]',_体重),!. 'BMI指数を算出する'(_身長,_体重,_BMI指数) :- _BMI指数 is _体重 / (_身長 ^ 2). 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト) :- sort(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([]). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([[_BMI指数,_氏名,_身長,_体重]|R]) :- writef('%t,%t,%t,%t\n',[_BMI指数,_身長,_体重,_名前]), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(R). 半角英字によるローマ字表記(_名前) :- findall(_文字,( sub_atom(_名前,_,1,_,_文字), 空白または半角英字の文字(_文字)), _空白または半角英字であった文字ならび), atomic_list_concat(_空白または半角英字であった文字ならび,_名前). 空白または半角英字の文字(' '). 空白または半角英字の文字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. 空白または半角英字の文字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. % 数を得る/2 % 以下のサイトは # @TakaoOzaki 分数の問題と言っていたのはこれです。\ # “@utatakiyoshi: 友達がSkypeで # 「0~9を1回ずつ使い,?????/?????=1/9となるように?を埋めよ」って # 算数パズルを出してきたからC++でサクッと書いてドヤ顔してやった” # '0~9を1回ずつ使い,?????/?????=1/9となるように?を埋めよ'(X/Y) :- 検査用の型を用意する(Lx,Lz), 分子検査の開始点と終了点を得る(_開始点,_終了点), between(_開始点,_終了点,X), 重複しない数(X,Lx,[],L1), Y is X * 9, 重複しない数(Y,Lz,L1,L2). 検査用の型を用意する(Lx,Lz) :- length(Lx,5), length(Lz,10). 分子検査の開始点と終了点を得る(_開始点,_終了点) :- _開始点 is 10000 // 9, _終了点 is 99999 // 9. 重複しない数(X,Lx,L1,L2) :- number_chars(X,L), append(L1,L,L2), sort(L2,Lx). % 以下のサイトは # @TakaoOzaki 分数の問題と言っていたのはこれです。\ # “@utatakiyoshi: 友達がSkypeで # 「0~9を1回ずつ使い,?????/?????=1/9となるように?を埋めよ」って # 算数パズルを出してきたからC++でサクッと書いてドヤ顔してやった” # '0~9を1回ずつ使い,?????/?????=1/9となるように?を埋めよ'(X/Y) :- 検査用の型を用意する(Lx,Lz), between(1,11111,X), 重複しない数(X,Lx,[],L1), Y is X * 9, 重複しない数(Y,Lz,L1,L2). 検査用の型を用意する(Lx,Lz) :- length(Lx,5), length(Lz,10). 重複しない数(X,Lx,L1,L2) :- number_chars(X,L), append(L1,L,L2), sort(L2,Lx). % 以下のサイトは # # abcd というPrologのお題が、最終的にa,b,c,dという述語に分割可能だとする。 # その時に、abcd:-abc,d. と abcd:-a,bc,d.とabcd:-ab,cd.とabcd:-a,bcd.と # abcd:-ab,c,d.とabcd:-a,b,cd.とabcd:-a,b,c,d.のどれを選ぶか?何に導かれて選ぶのか? # # 実際の仕様文が「リストに入力して変換した上で整列して出力する」であるとして、 # # 考えてみよう。各パターンの先頭にトップレベルの分割を示す。 % % 共通のデータベース リストに入力して(_リスト) :- read(_リスト). 変換した上で([],[]). 変換した上で([A|R1],[B|R2]) :- B is A + 10000, 変換した上で(R1,R2). 整列して(_リスト,_整列したリスト) :- sort(_リスト,_整列したリスト). 出力する(_変換した上で整列したリスト) :- writef('%t\n',[_変換した上で整列したリスト]). a. b. c. d. %% 分割パターン(1-1) %% リストに入力して変換した上で整列して出力する :- リストに入力して変換した上で整列して(_変換した上で整列したリスト), 出力する(_変換した上で整列したリスト). リストに入力して変換した上で整列して(_変換した上で整列したリスト) :- リストに入力して変換した上(_変換したリスト), 整列して(_変換したリスト,_変換した上で整列したリスト). リストに入力して変換した上(_変換したリスト) :- リストに入力して(_リスト), 変換した上で(_リスト,_変換したリスト). abcd :- abc, d. abc :- ab, c. ab :- a, b. %% 分割パターン(1-2) %% リストに入力して変換した上で整列して出力する :- リストに入力して変換した上で整列して(_変換した上で整列したリスト), 出力する(_変換した上で整列したリスト). リストに入力して変換した上で整列して(_変換した上で整列したリスト) :- リストに入力して(_リスト), 変換した上で整列して(_リスト,_変換した上で整列したリスト). リストに入力して変換した上(_変換したリスト) :- 変換した上で(_リスト,_変換したリスト), 整列して(_変換したリスト,_変換した上で整列したリスト). abcd :- abc, d. abc :- a, bc. bc :- b, c. %% 分割パターン(1-3) %% リストに入力して変換した上で整列して出力する :- リストに入力して変換した上で整列して(_変換した上で整列したリスト), 出力する(_変換した上で整列したリスト). リストに入力して変換した上で整列して(_変換した上で整列したリスト) :- リストに入力して(_リスト), 変換した上で(_リスト,_変換したリスト), 整列して(_変換したリスト,_変換した上で整列したリスト). abcd :- abc, d. abc :- a, b, c. %% 分割パターン(2-1) %% リストに入力して変換した上で整列して出力する :- リストに入力して(_リスト), 変換した上で整列して(_リスト,_変換した上で整列したリスト), 出力する(_変換した上で整列したリスト). 変換した上で整列して(_リスト,_変換した上で整列したリスト) :- 変換した上で(_リスト,_変換したリスト), 整列して(_変換したリスト,_変換した上で整列したリスト). abcd :- a, bc, d. bc :- b, c. %% 分割パターン(3-1) %% リストに入力して変換した上で整列して出力する :- リストに入力して変換した上で(_変換したリスト), 整列して出力する(_変換したリスト). リストに入力して変換した上で(_変換したリスト) :- リストに入力して(_リスト), 変換した上で(_リスト,_変換したリスト). 整列して出力する(_変換したリスト) :- 整列して(_変換したリスト,_変換した上で整列したリスト), 出力する(_変換した上で整列したリスト). abcd :- ab, bc. ab :- a, b. cd :- c, d. %% 分割パターン(4-1) %% リストに入力して変換した上で整列して出力する :- リストに入力して(_リスト), 変換した上で整列して出力する(_リスト). 変換した上で整列して出力する(_リスト,_変換した上で整列したリスト) :- 変換した上で整列して(_リスト,_変換した上で整列したリスト), 出力する(_変換した上で整列したリスト). 変換した上で整列して(_リスト,_変換した上で整列したリスト) :- 変換した上で(_リスト,_変換したリスト), 整列して(_変換したリスト,_変換した上で整列したリスト). abcd :- a, bcd. bcd :- bc, d. bc :- b, c. %% 分割パターン(4-2) %% リストに入力して変換した上で整列して出力する :- リストに入力して(_リスト), 変換した上で整列して出力する(_リスト). 変換した上で整列して出力する(_リスト) :- 変換した上で(_リスト,_変換したリスト), 整列して出力する(_変換したリスト). 整列して出力する(_変換したリスト) :- 整列して(_変換したリスト,_変換した上で整列したリスト), 出力する(_変換した上で整列したリスト). abcd :- a, bcd. bcd :- b, cd. cd :- c, d, %% 分割パターン(4-3) %% リストに入力して変換した上で整列して出力する :- リストに入力して(_リスト), 変換した上で整列して出力する(_リスト). 変換した上で整列して出力する(_リスト) :- 変換した上で(_リスト,_変換したリスト), 整列して(_変換したリスト,_変換した上で整列したリスト), 出力する(_変換したリスト). abcd :- a, bcd. bcd :- b, c, d. %% 分割パターン(5-1) %% リストに入力して変換した上で整列して出力する :- リストに入力して(_リスト), 変換した上で(_リスト,_変換したリスト), 整列して出力する(_変換したリスト). 整列して出力する(_変換したリスト) :- 整列して(_変換したリスト,_変換した上で整列したリスト), 出力する(_変換した上で整列したリスト). abcd :- a, b, cd. cd :- c, d. %% 分割パターン(6-1) %% リストに入力して変換した上で整列して出力する :- リストに入力して変換した上で(_変換したリスト), 整列して(_変換したリスト,_変換した上で整列したリスト), 出力する(_変換した上で整列したリスト). リストに入力して変換した上で(_変換したリスト) :- リストに入力して(_リスト), 変換した上で(_リスト,_変換したリスト). abcd :- ab, c, d. ab :- a, b. %% 分割パターン(7-1) %% リストに入力して変換した上で整列して出力する :- リストに入力して(_リスト), 変換した上で(_リスト,_変換したリスト), 整列して(_変換したリスト,_変換した上で整列したリスト), 出力する(_変換した上で整列したリスト). abcd :- a, b, c, d. % 以下のサイトは # # abcd というPrologのお題が、最終的にa,b,c,dという述語に分割可能だとする。 # その時に、abcd:-abc,d. と abcd:-a,bc,d.とabcd:-ab,cd.とabcd:-a,bcd.と # abcd:-ab,c,d.とabcd:-a,b,cd.とabcd:-a,b,c,d.のどれを選ぶか?何に導かれて選ぶのか? # # 実際の仕様文が「リストに入力して変換した上で整列して出力する」であるとして、 # # 考えてみよう。各パターンの先頭にトップレベルの分割を示す。 # % 詳細化版 % % 共通のデータベース a. b. c. d. %% 分割パターン(1-1) %% リストに入力して変換した上で整列して出力する :- リストに入力して変換した上で整列して(_変換した上で整列したリスト), 出力する(_変換した上で整列したリスト). abcd :- abc, d. abc :- ab, c. ab :- a, b. %% 分割パターン(1-2) %% abcd :- abc, d. abc :- a, bc. bc :- b, c. %% 分割パターン(1-3) %% abcd :- abc, d. abc :- a, b, c. %% 分割パターン(2-1) %% リストに入力して変換した上で整列して出力する :- リストに入力して(_リスト), 変換した上で整列して(_リスト,_変換した上で整列したリスト), 出力する(_変換した上で整列したリスト). abcd :- a, bc, d. bc :- b, c. %% 分割パターン(3-1) %% リストに入力して変換した上で整列して出力する :- リストに入力して変換した上で(_変換したリスト), 整列して出力する(_変換したリスト). abcd :- ab, bc. ab :- a, b. cd :- c, d. %% 分割パターン(4-1) %% リストに入力して変換した上で整列して出力する :- リストに入力して(_リスト), 変換した上で整列して出力する(_リスト). abcd :- a, bcd. bcd :- bc, d. bc :- b, c. %% 分割パターン(4-2) %% abcd :- a, bcd. bcd :- b, cd. cd :- c, d, %% 分割パターン(4-3) %% abcd :- a, bcd. bcd :- b, c, d. %% 分割パターン(5-1) %% リストに入力して変換した上で整列して出力する :- リストに入力して(_リスト), 変換した上で(_リスト,_変換したリスト), 整列して出力する(_変換したリスト). abcd :- a, b, cd. cd :- c, d. %% 分割パターン(6-1) %% リストに入力して変換した上で整列して出力する :- リストに入力して変換した上で(_変換したリスト), 整列して(_リスト,_変換した上で整列したリスト), 出力する(_変換した上で整列したリスト). abcd :- ab, c, d. ab :- a, b. %% 分割パターン(7-1) %% リストに入力して変換した上で整列して出力する :- リストに入力して(_リスト), 変換した上で(_リスト,_変換したリスト), 整列して(_変換したリスト,_変換した上で整列したリスト), 出力する(_変換した上で整列したリスト). abcd :- a, b, c, d. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/677 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/SZCwaCYd # で入力した整数のうち2つ以上同じ値があった場合、 # 「同じ値です」と表示するには、どんなif文書けばいい? # # #include # int main(){ # int a, b, c, t; # scanf("%d", &a); # scanf("%d", &b); # if(a > b){ # t = a; # a = b; # b = t; # } # scanf("%d", &c); # if(b > c){ # if(a > c){ # temp = a; # a = c; # c = t; # } # t = b; # b = c; # c = t; # } # printf("%d %d %d\n", a, b, c); # return 0; # } # '3つのデータを整列しながら入力する'(_a,_b,_c) :- 'scanf("%d", &a);scanf("%d", &b);'(_a,_b), 'if(a > b){t = a;a = b;b = t;}'(_a,_b,A1,B1), 'scanf("%d", &c);'([_a,_b],_c), 'if(b > c){if(a > c){t = a;a = c;c = t;}t = b;b = c;c = t;}'(A1,B1,_c,A,B,C), 'printf("%d %d %d\n", a, b, c);'(A,B,C). 'scanf("%d", &a);scanf("%d", &b);'(_a,_b) :- 'scanf("%d", &a);'(_a), 'scanf("%d", &b);'([_a],_b). 'scanf("%d", &a);'(_a) :- get_line(Line), '診断: scanf("%d", &a);'(Line,_a),!. 'scanf("%d", &a);'(_a) :- 'scanf("%d", &a);'(_a). '診断: scanf("%d", &a);'(Line,_a) :- atom_to_term(Line,_a,_), 整数診断(Line,_a),!. 'scanf("%d", &b);'(_a,_b) :- get_line(Line), '診断: scanf("%d", &b);'(Line,_a,_b),!. 'scanf("%d", &b);'(_a,_b) :- 'scanf("%d", &b);'(_a,_b). '診断: scanf("%d", &b);'(Line,_a,_b) :- atom_to_term(Line,_b,_), 整数診断(Line,_b), 重複診断([_a],_b),!. 'if(a > b){t = a;a = b;b = t;}'(_a,_b,_b,_a) :- _a > _b,!. 'if(a > b){t = a;a = b;b = t;}'(_a,_b,_a,_b). 'scanf("%d", &c);'(L,_c) :- get_line(Line), '診断: scanf("%d", &c);'(Line,L,_c),!. 'scanf("%d", &c);'(L,_c) :- 'scanf("%d", &c);'(L,_c). '診断: scanf("%d", &c);'(Line,L,_c) :- atom_to_term(Line,_c,_), 整数診断(Line,_c), 要素重複診断(L,_c),!. 整数診断(Line,_c) :- integer(_c),!. 整数診断(Line,_c) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 要素重複診断(L,_c) :- \+(member(_c,L)),!. 要素重複診断(L,_c) :- writef('要素が重複しています。再入力をお願いします。\n'). 'if(b > c){if(a > c){t = a;a = c;c = t;}t = b;b = c;c = t;}'(_a,_b,_c,A,C,B) :- _b > _c, 'if(a > c){t = a;a = c;c = t;}'(_a,_c,A,C1), 't = b;b = c;c = t;'(_b,C1,C,B),!. 'if(b > c){if(a > c){t = a;a = c;c = t;}t = b;b = c;c = t;}'(_a,_b,_c,_a,_b,_c). 'if(a > c){t = a;a = c;c = t;}'(_a,_c,_c,_a) :- _a > _c,!. 'if(a > c){t = a;a = c;c = t;}'(_a,_c,_a,_c). 't = b;b = c;c = t;'(_b,C1,C1,_b). 'printf("%d %d %d\n", a, b, c);'(_a,_b,_c) :- writef('%t %t %t\n',[_a,_b,_c]). % 以下のサイトは # [1] 授業単元:プログラム設計 # [2] 問題文:以下の条件で売り上げ集計プログラムを作りなさい。 #  ・クラスを用いる(困難なら構造体で可) #  ・店舗毎に名前・売り上げを入力し、平均、標準偏差を計算 #  ・売り上げ毎に店舗を並び替える #  ・店舗数は任意。 #  ・並び替えは簡単でよい。店舗数が少ない場合、単純に比較するだけでよい。 # [3] コンパイラ名とバージョン: Microsoft Visual C++ # [4] 言語:C # [5] その他の制限: 特にありません。 '店舗(店舗数は任意)毎に名前・売り上げを入力し、平均、標準偏差を計算する'(_平均,_標準偏差) :- abolish(売り上げ/2), '店舗(店舗数は任意)毎に名前・売り上げを入力し', '平均、標準偏差を計算する'(_平均,_標準偏差), 売り上げ毎に店舗を並び替える. '店舗(店舗数は任意)毎に名前・売り上げを入力し' :- 店舗数は任意(_店舗数), length(Ln,_店舗数), '店舗(店舗数は任意)毎に名前・売り上げを入力し'(Ln,_店舗数). '店舗(店舗数は任意)毎に名前・売り上げを入力し'(Ln,_店舗数) :- append(L0,[_|R],Ln), '店舗名・売り上げを入力'(L0,_店舗数,_店舗名,_売り上げ), assertz(売り上げ(_店舗名,_売り上げ)), R = []. '店舗名・売り上げを入力'(L0,_店舗数,_店舗名,_売り上げ) :- length([_|L0],_何番目), writef('%t/%t番目の 店舗名,売り上げをカンマ区切りで入力してください : ',[_何番目,_店舗数]), readln([_店舗名,_売り上げ]). 店舗数は任意(_店舗数) :- write('店舗数を入力してください : '), get_integer(_店舗数). '平均、標準偏差を計算する'(_平均,_標準偏差) :- findall(_売り上げ,( 売り上げ(_,_売り上げ)), L), 相加平均(L,_平均), 標準偏差(L,_標準偏差). 売り上げ毎に店舗を並び替える :- 売り上げ毎に(_降順売り上げならび), 店舗を並び替える(_降順売り上げならび). 売り上げ毎に(_降順売り上げならび) :- findall([_売り上げ,_店舗名],( 売り上げ(_店舗名,_売り上げ)), _売り上げならび), sort(_売り上げならび,_昇順売り上げならび), reverse(_昇順売り上げならび,_降順売り上げならび). 店舗を並び替える(_降順売り上げならび) :- abolish(売り上げ/2), append(_,[[_売り上げ,_店舗名]|R],_降順売り上げならび), assertz(売り上げ(_店舗名,_売り上げ)), R = []. % 以下のサイトは # [1] 授業単元:プログラム設計 # [2] 問題文:以下の条件で売り上げ集計プログラムを作りなさい。 #  ・クラスを用いる(困難なら構造体で可) #  ・店舗毎に名前・売り上げを入力し、平均、標準偏差を計算 #  ・売り上げ毎に店舗を並び替える #  ・店舗数は任意。 #  ・並び替えは簡単でよい。店舗数が少ない場合、単純に比較するだけでよい。 # [3] コンパイラ名とバージョン: Microsoft Visual C++ # [4] 言語:C # [5] その他の制限: 特にありません。 '店舗(店舗数は任意)毎に名前・売り上げを入力し、平均、標準偏差を計算する'(_平均,_標準偏差) :- abolish(売り上げ/2), '店舗(店舗数は任意)毎に名前・売り上げを入力し', '平均、標準偏差を計算する'(_平均,_標準偏差). '店舗(店舗数は任意)毎に名前・売り上げを入力し' :- 店舗数は任意(_店舗数), '店舗(店舗数は任意)毎に名前・売り上げを入力し'(1,_店舗数). '店舗(店舗数は任意)毎に名前・売り上げを入力し'(N,_店舗数) :- N > _店舗数,!. '店舗(店舗数は任意)毎に名前・売り上げを入力し'(N,_店舗数) :- writef('%t番目の 店舗名,売り上げをカンマ区切りで入力してください : ',[N]), readln([_店舗名,_売り上げ]), assertz(売り上げ(_店舗名,_売り上げ)), N_2 is N + 1, '店舗(店舗数は任意)毎に名前・売り上げを入力し'(N_2,_店舗数). 店舗数は任意(_店舗数) :- write('店舗数を入力してください : '), get_integer(_店舗数). '平均、標準偏差を計算する'(_平均,_標準偏差) :- findall(_売り上げ,( 売り上げ(_,_売り上げ)), L), 相加平均(L,_平均), 標準偏差(L,_標準偏差). 売り上げ毎に店舗を並び替える :- 売り上げ毎に(_降順売り上げならび), 店舗を並び替える(_降順売り上げならび). 売り上げ毎に(_降順売り上げならび) :- findall([_売り上げ,_店舗名],( 売り上げ(_店舗名,_売り上げ)), _売り上げならび), sort(_売り上げならび,_昇順売り上げならび), reverse(_昇順売り上げならび,_降順売り上げならび). 店舗を並び替える(_降順売り上げならび) :- abolish(売り上げ/2), append(_,[[_売り上げ,_店舗名]|R],_降順売り上げならび), assertz(売り上げ(_店舗名,_売り上げ)), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/456 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # 100点満点の試験を10人分整数型配列data[10]に入力すると、得点の高い順に出力されるプログラムを作成。 # '100点満点の試験の点数を10人分入力し、得点の高い順に出力する' :- '100点満点の試験の点数を10人分入力し'(_10人分の点数ならび), 得点の高い順に出力する(_10人分の点数ならび). '100点満点の試験の点数を10人分入力し'(_10人分の点数ならび) :- '10人分'(_10人分の点数ならび), findall(_点数,( append(L1,[_点数|_],_10人分の点数ならび), '100点満点の試験の点数を入力'(L1,_点数)), _10人分の点数ならび). '10人分'(_10人分の点数ならび) :- length(_10人分の点数ならび,10). '100点満点の試験の点数を入力'(Ln,_点数) :- length([_|Ln],_何人目),- writef('%t人目の点数を入力してください : ',[_何人目]), get_line(Line), '100点満点の試験の点数を入力診断'(Line,_点数),!. '100点満点の試験の点数を入力'(Ln,_点数) :- '100点満点の試験の点数を入力'(Ln,_点数). '100点満点の試験の点数を入力診断'(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), '100点満点の'(_点数),!. '100点満点の試験の点数を入力診断'(Line,_点数) :- writef('入力された %t からは適切な試験の点数が得られません。\n再入力をお願いします。\n',[Line]), fail. '100点満点の'(_点数) :- _点数 >= 0, _点数 =< 100,!. 得点の高い順に出力する(_点数ならび) :- 得点の高い順に(_点に数ならび,_大きい順に整列された点数ならび), 出力する(_大きい順整列された点数ならび). 出力する([_点数]) :- writef('%t\n',[_点数]),!. 出力する([_点数|R]) :- writef('%t ',[_点数]), 出力する(R). 得点の高い順に([],[]). 得点の高い順に(L1,L2) :- L1 = [_軸要素|R1], 得点の高い順に(_軸要素,R1,L2). 得点の高い順に(_軸要素,L1,L2) :- 得点の高い順に分割(_軸要素,L1,_軸要素に等しいかより大きいならび,_軸要素より小さいならび), 得点の高い順に(_軸要素に等しいかより大きいならび,_整列された軸要素に等しいかより大きいならび), 得点の高い順に(_軸要素より小さいならび,_整列された軸要素より小さいならび), append(_整列された軸要素に等しいかより大きいならび,[_軸要素|_整列された軸要素より小さいならび). 得点の高い順に分割(_軸要素,[],[],[]). 得点の高い順に分割(_軸要素,[A|R1],[A|R2],R3) :- A @>= _軸要素, 得点の高い順に分割(_軸要素,R1,R2,R3). 得点の高い順に分割(_軸要素,[A|R1],R2,[A|R3]) :- A @< _軸要素, 得点の高い順に分割(_軸要素,R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/456 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # 100点満点の試験を10人分整数型配列data[10]に入力すると、得点の高い順に出力されるプログラムを作成。 # '100点満点の試験の点数を10人分入力し、得点の高い順に出力する' :- '100点満点の試験の点数を10人分入力し'(_10人分の点数ならび), 得点の高い順に出力する(_10人分の点数ならび). '100点満点の試験の点数を10人分入力し'(_10人分の点数ならび) :- '10人分'(_10人分の点数ならび), findall(_点数,( append(L1,[_点数|_],_10人分の点数ならび), '100点満点の試験の点数を入力'(L1,_点数)), _10人分の点数ならび). '10人分'(_10人分の点数ならび) :- length(_10人分の点数ならび,10). '100点満点の試験の点数を入力'(Ln,_点数) :- length([_|Ln],_何人目),- writef('%t人目の点数を入力してください : ',[_何人目]), get_line(Line), '100点満点の試験の点数を入力診断'(Line,_点数),!. '100点満点の試験の点数を入力'(Ln,_点数) :- '100点満点の試験の点数を入力'(Ln,_点数). '100点満点の試験の点数を入力診断'(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), '100点満点の'(_点数),!. '100点満点の試験の点数を入力診断'(Line,_点数) :- writef('入力された %t からは適切な試験の点数が得られません。\n再入力をお願いします。\n',[Line]), fail. '100点満点の'(_点数) :- _点数 >= 0, _点数 =< 100,!. 得点の高い順に出力する(_点数ならび) :- 降順整列(_点数ならび,_大きい順に整列された点数ならび), 出力する(_大きい順に整列された点数ならび). 出力する([_点数]) :- writef('%t\n',[_点数]),!. 出力する([_点数|R]) :- writef('%t ',[_点数]), 出力する(R). 降順整列([],[]). 降順整列(L1,L2) :- L1 = [_軸要素|R1], 降順整列(_軸要素,R1,L2). 降順整列(_軸要素,L1,L2) :- 降順分割(_軸要素,L1,_軸要素に等しいかより大きいならび,_軸要素より小さいならび), 降順整列(_軸要素に等しいかより大きいならび,_整列された軸要素に等しいかより大きいならび), 降順整列(_軸要素より小さいならび,_整列された軸要素より小さいならび), append(_整列された軸要素に等しいかより大きいならび,[_軸要素|_整列された軸要素より小さいならび). 降順分割(_軸要素,[],[],[]). 降順分割(_軸要素,[A|R1],[A|R2],R3) :- A @>= _軸要素, 降順分割(_軸要素,R1,R2,R3). 降順分割(_軸要素,[A|R1],R2,[A|R3]) :- A @< _軸要素, 降順分割(_軸要素,R1,R2,R3). % 以下のサイトは # # @haroperiさんの20120420のツイートより # # 双方向性のあるQuicksortが書けないので寝るです。だめだもうだめだ。 *喪中* # 双方向性のあるQuicksort([],[]). 双方向性のあるQuicksort(L1,L2) :- 最初にL1とL2の要素数を揃える(L1,L2),!, append(L0,[A|R0],L1), ( \+(var(A)), ! ; true ), append(L0,R0,L11), append(L5,[A|L6],L2), 整列のための分割(A,L11,L3,L4), 双方向性のあるQuicksort(L3,L5), 双方向性のあるQuicksort(L4,L6). 整列のための分割(A,[],[],[]). 整列のための分割(A,[B|R1],[B|R2],L) :- B @< A, 整列のための分割(A,R1,R2,L). 整列のための分割(A,[B|R1],L,[B|R2]) :- B @>= A, 整列のための分割(A,R1,L,R2). 最初にL1とL2の要素数を揃える(L1,L2) :- length(L2,Len), length(L1,Len). % 以下のサイトは # # @haroperiさんの20120420のツイートより # # 双方向性のあるQuicksortが書けないので寝るです。だめだもうだめだ。 *喪中* # 双方向性のあるQuicksort([],[]). 双方向性のあるQuicksort(L1,L2) :- 最初にL1とL2の要素数を揃える(L1,L2),!, append(L0,[A|R0],L1), append(L0,R0,L11), append(L5,[A|L6],L2), 整列のための分割(A,L11,L3,L4), 双方向性のあるQuicksort(L3,L5), 双方向性のあるQuicksort(L4,L6). 整列のための分割(A,[],[],[]). 整列のための分割(A,[B|R1],[B|R2],L) :- B @< A, 整列のための分割(A,R1,R2,L). 整列のための分割(A,[B|R1],L,[B|R2]) :- B @>= A, 整列のための分割(A,R1,L,R2). 最初にL1とL2の要素数を揃える(L1,L2) :- length(L2,Len), length(L1,Len). % % 現在のエラーは % 普通のソートの時、複数解(同一解)出力されてしまう。 % これを直すのは難しいだろう。 % % 以下のサイトは # # @haroperiさんの20120420のツイートより # # 双方向性のあるQuicksortが書けないので寝るです。だめだもうだめだ。 *喪中* # 双方向性のあるQuicksort(L1,L2) :- 最初にL1とL2の要素数を揃える(L1,L2),!, 双方向クイックソート(L1,L2). 双方向クイックソート([],[]). 双方向クイックソート([A|R1],L2) :- 双方向クイックソート(A,R1,L2). 双方向クイックソート(A,L1,L2) :- append(L5,[A|L6],L2), 双方向性のあるQuicksort(L3,L5), 双方向性のあるQuicksort(L4,L6), 整列のための分割(A,L1,L3,L4). 整列のための分割(A,[],[],[]). 整列のための分割(A,[B|R1],[B|R2],L) :- B @< A, 整列のための分割(A,R1,R2,L). 整列のための分割(A,[B|R1],L,[B|R2]) :- B @>= A, 整列のための分割(A,R1,L,R2). 最初にL1とL2の要素数を揃える(L1,L2) :- length(L1,Len), length(L2,Len),!. % % 最初に要素数を揃えてしまうため、重複解を許さない(集合)仕様ではうまく行かない % % 双方向クイックソート/3の中で 双方向性のあるQuicksort/3 を呼ぶ。 % 私はここで 双方向クィックソート/3 を呼んでしまったので最初失敗した。 % % 以下のサイトは # # @haroperiさんの20120420のツイートより # # 双方向性のあるQuicksortが書けないので寝るです。だめだもうだめだ。 *喪中* # 双方向性の昇順整列(L1,L2) :- length(L1,Len), length(L2,Len), length(Ln,Len),!, 順列(L2,Ln,L1), 昇順(L2). 順列(Y,[],[]). 順列(Y,[_|Ln],[A|X]) :- del(A,Y,Z), 順列(Z,Ln,X). del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). 昇順([_]). 昇順([A,B|R]) :- A @=< B, 昇順([B|R]). % 以下のサイトは # # @haroperiさんの20120420のツイートより # # 双方向性のあるQuicksortが書けないので寝るです。だめだもうだめだ。 *喪中* # 双方向性のあるQuicksort(L1,L2) :- 最初にL1とL2の要素数を揃える(L1,L2),!, 双方向クイックソート(L1,L2). 双方向クイックソート([],[]). 双方向クイックソート([A|R1],L2) :- 双方向クイックソート(A,R1,L2). 双方向クイックソート(A,L1,L2) :- append(L5,[A|L6],L2), 双方向性のあるQuicksort(L3,L5), 双方向性のあるQuicksort(L4,L6), 整列のための分割(A,L1,L3,L4). 整列のための分割(A,[],[],[]). 整列のための分割(A,[B|R1],[B|R2],L) :- B @< A, 整列のための分割(A,R1,R2,L). 整列のための分割(A,[B|R1],L,[B|R2]) :- B @>= A, 整列のための分割(A,R1,L,R2). 最初にL1とL2の要素数を揃える(L1,L2) :- length(L1,Len), length(L2,Len),!. % % 最初に要素数を揃えてしまうため、重複解を許さない(集合)仕様ではうまく行かない % % 双方向クイックソート/3の中で 双方向性のあるQuicksort/3 を呼ぶ。 % 私はここで 双方向クィックソート/3 を呼んでしまったので最初失敗した。 % % 以下のサイトは # # 売上('20120416',トマト,3000). # 売上('20120417',ナス,1000). # 売上('20120416',トマト,1500). # 売上('20120417',ナス,2200). # # の時に、日付ごとの合計売上が欲しい。 # # ?- 集約加算(_集約値,[_日付,_集約値],[_日付],[_金額],売上(_日付,_品目,_金額),_解). # # _解 = [['20120416',4500],['20120417',3200]] # 集約加算(_集約解変数指定,_選択項,_鍵項,_集約項,P,_解) :- findsetof(_鍵項,P,L1), findkeysort(_選択項,_鍵項,( member(_鍵項,L1), findsum(_集約項,P,_集約解変数指定)), _解_1), 集約加算の解を平坦化する(_解_1,_解). 集約加算の解を平坦化する(_解_1,_解) :- findall(L3,( member(L2,_解_1), 平坦化(L2,L3)), _解) . %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). findkeysort(Select,Keys,P,List) :- append(Keys,Select,Keys2), findall(Keys2,P,List1), sort(List1,List2), findall(Select,member(Keys2,List2),List). 平坦化(_深いならび,_平坦化されたならび) :- 差分ならびによる平坦化(_深いならび,_平坦化されたならび - []) . 差分ならびによる平坦化([_項|_残りならび],_差分ならび頭部 - _差分ならび尾部) :- 差分ならびによる平坦化(_項,_差分ならび頭部 - _不完全な差分ならび), 差分ならびによる平坦化(_残りならび,_不完全な差分ならび - _差分ならび尾部) . 差分ならびによる平坦化([],_差分ならび頭部 - _差分ならび尾部) :- _差分ならび頭部 = _差分ならび尾部 . 差分ならびによる平坦化(_項,[_項|_差分ならび尾部] - _差分ならび尾部) :- \+(list(_項)),!. % 以下のサイトは # 出典 :: データ構造とアルゴリズム総合 #40 # まず雀頭1と順子4つになっているか確認 # その後19字牌がないがチェック ない場合成立 # 二杯口は順子をグループ化してふたつどういつかチェックすればいいんでね # 平和だけどタンヤオって時点で役牌じゃない&二杯口も前提条件だから # 両方が成立したとき自動的に成立 # # タンピンリャンペーコーを判定する専用ならこういうやり方でいいんでね # タンピンリャンペーコー(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), タンピンリャンペーコー生成(L2), 整列(L2,L1). タンピンリャンペーコー生成([A,B,C,A,B,C,D,E,F,D,E,F,G,G]) :- '一・九を除く順子'(萬子,A,B,C), '一・九を除く順子'(筒子,D,E,F), 積集合([A,B,C],[D,E,F],[]). 雀頭(_子,G,G), \+(member(G,[A,B,C,D,E,F])). タンピンリャンペーコー生成([A,B,C,A,B,C,D,E,F,D,E,F,G,G]) :- '一・九を除く順子'(索子,A,B,C), '一・九を除く順子'(筒子,D,E,F), 積集合([A,B,C],[D,E,F],[]). 雀頭(_子,G,G), \+(member(G,[A,B,C,D,E,F])). タンピンリャンペーコー生成([A,B,C,A,B,C,D,E,F,D,E,F,G,G]) :- '一・九を除く順子'(萬子,A,B,C), '一・九を除く順子'(索子,D,E,F), 積集合([A,B,C],[D,E,F],[]). 雀頭(_子,G,G), \+(member(G,[A,B,C,D,E,F])). 雀頭(萬子,A,A) :- '一・九を除く字牌'(萬子,_萬子ならび), append(_,[A|_],_筒子ならび). 雀頭(索子,A,A) :- '一・九を除く字牌'(萬子,_索子ならび), append(_,[A|_],_索子ならび). 雀頭(筒子,A,A) :- '一・九を除く字牌'(筒子,_筒子ならび), append(_,[A|_],_筒子ならび). '一・九を除く順子'(萬子,A,B,C) :- '一・九を除く字牌'(萬子,_萬子ならび), append(_,[A,B,C|_],_筒子ならび). '一・九を除く順子'(索子,A,B,C) :- '一・九を除く字牌'(索子,_索子ならび), append(_,[A,B,C|_],_索子ならび). '一・九を除く順子'(筒子,A,B,C) :- '一・九を除く字牌'(筒子,_筒子ならび), append(_,[A,B,C|_],_筒子ならび). '一・九を除く字牌'(萬子,[二萬,三萬,四萬,五萬,六萬,七萬,八萬]). '一・九を除く字牌'(筒子,[二筒,三筒,四筒,五筒,六筒,七筒,八筒]). '一・九を除く字牌'(索子,[二索,三索,四索,五索,六索,七索,八索]). 整列([],[]). 整列([A|R],L) :- 分割(A,R,L1,L2), 整列(L1,L11), 整列(L2,L22), append(L11,[A|L22],L). 分割(A,[],[],[]). 分割(A,[B|R1],[B|R2],R3) :- A @>= B, 分割(A,R1,R2,R3). 分割(A,[B|R1],R2,[B|R3]) :- A @< B, 分割(A,R1,R2,R3). 積集合([],_,[]) :- !. 積集合([X|_集合1],_集合2,[X|_積集合]) :- member(X,_集合2), 積集合(_集合1,_集合2,_積集合),!. 積集合([X|_集合1],_集合2,_積集合) :- \+(member(X,_集合2)),!, 積集合(_集合1,_集合2,_積集合). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/647 # # #インデントが崩れる場合は http://ime.nu/pastebin.com/26BkXDHs をみてください。 # # -- # -- 商品テーブルと、 # -- # create table items ( # id serial primary key, # name varchar(255) not null, # price integer not null -- 単価 # ); # # -- # -- 販売テーブルがあるとする。 # -- # create table sales ( # id serial primary key, # item_id integer not null references items(id), # count integer not null default 1, -- 個数 # total integer not null, -- 単価 * 個数 # created_at timestamp not null default current_datetime # ) # # -- # -- 日付を指定して、その日の商品別販売金額合計を大きい順に表示したい。 # -- どういうSQLを書けばいいの? # -- こんなかんじで書けたらいいんだけど。 # -- # select items.id, items.name # from items, # (select item_id, sum(total) as sum_total # from sales # where date(created_at) = '2012-04-01' # group by item_id) as totals # where items.id = totals.item_id # order by totals.sum_total desc; # # '日付を指定して、その日の商品別販売金額合計を大きい順に表示したい' :- '日付を指定して、'(_日付), その日の商品別販売金額合計を(_日付,L1), 大きい順に表示する(L1). '日付を指定して、'(_日付) :- write('日付を8桁の整数で入力して下さい : '), get_line(Line), '日付を指定して、の診断'(Line,_日付),!. '日付を指定して、'(_日付) :- '日付を指定して、'(_日付). '日付を指定して、の診断'(Line,_日付) :- atom_to_term(Line,_8桁の整数,_), '8桁の整数'(_8桁の整数), '8桁の整数から日付を得る'(_8桁の整数,_日付),!. '日付を指定して、の診断'(Line,_日付) :- writef('入力された %t からは日付が得られませんでした。再入力をお願いします\n',[Line]), fail. '8桁の整数'(_8桁の整数) :- integer(_8桁の整数), _8桁の整数 >= 10000000, _8桁の整数 =< 99999999. '8桁の整数から日付を得る'(_8桁の整数,_日付) :- swritef(_日付文字列,'%t',[_8桁の整数]), sub_atom(_日付文字列,0,4,_,_年), sub_atom(_日付文字列,4,2,_,_月), sub_atom(_日付文字列,6,2,_,_日), atomic_list_concat([_年,'-',_月,'-',_日],_日付),!. その日の商品別販売金額合計を(_日付,L1) :- findsetof(_id,( sales(_id,_item_id,_count,_total,_日付)), L), findall([_total,_id],( append(_,[_id|R],L), 商品の販売合計(_日付,_id,_合計金額)), L1). 商品の販売合計(_日付,_id,_合計金額) :- findsum(_total,( sales(_id,_item_id,_count,_total,_日付)), _合計金額). 大きい順に表示する(L1) :- 大きい順に(L1,L2), 表示する(L2). 大きい順に(L1,L2) :- sort(L1,L3), reverse(L3,L2). 表示する(_日付,[]). 表示する(_日付,[[_合計金額,_id]|R]) :- items(_id,_name,_price), writef('%t %t %20l %10r\n',[_日付,_id,_name,_合計金額]), 表示する(_日付,R). % 以下のサイトは # 出典:: 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/603 # # MySQL # # テーブルデータにNo int(255)があります。 # # 現在Noには10000件のデータがあり追加や削除を繰り返しているので # 既にNo連続した数字にはなっていません。 # # 今回、取得したいのはNoが5000以上でNo小さい方から30件取得して # Noが大きい順に並べ替えて取得したいです。 # # この場合のSQLはどう書けばいいでしょうか? # # 'Noが5000以上でNoの小さい方から30件取得してNoが大きい順に並べ替えて取得したいです。'(_No) :- 'Noが5000以上で'(_5000以上のNoならび), 'Noの小さい方から30件取得してNoが大きい順に並べ替えて'(_5000以上のNoならび,_小さい方から30件取得して大きい順に並べ替えたNoならび), member(_No,_小さい方から30件取得して大きい順に並べ替えたNoならび). 'Noが5000以上で'(_5000以上のNoならび) :- findall(_No,( テーブルデータ(_No), _No >= 5000), _5000以上のNoならび). 'Noの小さい方から30件取得してNoが大きい順に並べ替えて'(_5000以上のNoならび,_小さい方から30件取得して大きい順に並べ替えたNoならび) :- sort(_5000以上のNoならび,L2), length(L30,30), append(L30,_,L2), reverse(L30,_小さい方から30件取得して大きい順に並べ替えたNoならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/591 # # ・RDBMS # MySQL 5.1.6 # # ・テーブルデータ # aji_table //調味料テーブル # rank int(3) //表示順位 NULL許可 # name varchar(16) //調味料の品名 # price int(5) //調味料の値段 # # ・インサートされているデータ # NULL|さとう  |100 # 0   |しお   |200 # 3   |こしょう |300 # NULL|みそ   |400 # NULL|みりん  |500 # # ・欲しい結果 # 0   |しお   |200 # NULL|さとう  |100 # NULL|みそ   |400 # 3   |こしょう |300 # NULL|みりん  |500 # # # ・説明 # お世話になります。 # 上記にある調味料値段データベースにおいて # 表示順をソートする際に # ・順位に数字が入っているものは、一覧表示を行う際にその数字に応じた順位に出す。 # ・それ以外は、値段昇順で出力する。 # # というSELECT文が組めないものかと思っております。 # # 単純に値段順で表示したいんですけど、いくつかの商品は # 表示結果におけるその順番の位置を固定したい!という内容でして # 順位のフィールドをおいてなんとか解決しようとしているのですがうまく組めません。 # # 対応策を是非、ご教授頂ければと思います。 # # なお、そんなテーブルの組み方はダメだ、そういうときはこう組め!等もありましたら # ご教授お願いいたします。 # # # よろしくお願いいたします。 # # '順位に数字が入っているものは、一覧表示を行う際にその数字に応じた順位に、それ以外は、値段昇順で出力する。 単純に値段順で表示したいんですけど、いくつかの商品は表示結果におけるその順番の位置を固定したい'(_表示行) :- '順位に数字が入っているものは、一覧表示を行う際にその数字に応じた順位に'(_表示位置固定ならび), 'それ以外は、値段昇順で'(_表示位置自由ならび), 二つのならびを併合する(0,_表示位置固定ならび,_表示位置自由ならび,_表示ならび), member(_表示行,_表示ならび). '順位に数字が入っているものは、一覧表示を行う際にその数字に応じた順位に'(_表示位置固定ならび) :- findall([_表示位置,_調味料の値段,_調味料の品名],( 調味料テーブル(_表示位置,_調味料の品名,_調味料の値段), _表示位置>=0), _表示位置固定ならび). 'それ以外は、値段昇順で'(_表示位置自由ならび) :- findall([_調味料の値段,_調味料の品名,_表示位置],( 調味料テーブル(_表示位置,_調味料の品名,_調味料の値段), \+(_表示位置>=0)), _鍵順に並べ直した表示位置自由ならび), sort(_鍵順に並べ直した表示位置自由ならび,_整列した表示位置自由ならび), フィールド順を元に戻す(_整列した表示位置自由ならび,_表示位置自由ならび). 二つのならびを併合する(_,L1,[],L1). 二つのならびを併合する(_,[],L2,L2). 二つのならびを併合する(N,[[N,_調味料の品名,_調味料の値段]|R1],L2,[[N,_調味料の品名,_調味料の値段]|R3]) :- N_2 is N + 1, 二つのならびを併合する(N_2,R1,L2,R3),!. 二つのならびを併合する(N,L1,[[_表示位置,_調味料の品名,_調味料の値段]|R2],[[_表示位置,_調味料の品名,_調味料の値段]|R3]) :- N_2 is N + 1, 二つのならびを併合する(N_2,R1,L2,R3). フィールド順を元に戻す([],[]). フィールド順を元に戻す([[_調味料の値段,_調味料の品名,_表示位置]|R1],[[_表示位置,_調味料の品名,_調味料の値段]|R2]) :- フィールド順を元に戻す(R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/734 # # [1]C言語(やさしいC 輪講) # [2]問題文: # 次のコードは、コンソールから入力された異なる5個の1から20までの数を大きい順に並べ替えて出力するプログラムです。 # ([1])〜([11])内を埋めてコードを完成させなさい。 # #include <stdio.h> # #include <stdlib.h> # static int readNumber(char *msg,int min,int max,int m1,int m2,int m3,int m4){ # char console[256],([1]);([2]) result; # for(;;){ # printf("%s",msg); # t=fgets( ([3]),stdin); # if(t==NULL)([5]); # result=atoi(([3])); # if(result<([6]))([5]);if(result>([7]))([5]); # if(m1==result){ # printf("その数は使われています\n"); # ([5]); # } # ([8]) # return result; # } # } # int main(void){ # int m; # m=readNumber("1個目:1以上20以下の整数を入力してください:",([9]),([10]),0,0,0,0); # ([11]) # return 0; # } # [3] Windows Vistaですがコンパイラとかよくわかりません。 # [4] 4月の最初のゼミまで(3年次・4年次と連続履修です) # [5]ローカル変数はステートメントが始まる前にすべて宣言しなければならないと注意を受けました。よろしくお願いします。 # # 'コンソールから入力された異なる5個の1から20までの数を大きい順に並べ替えて出力する' :- 'コンソールから入力された異なる5個の1から20までの数を'([],_異なる5個の1から20までの数), 大きい順に並べ替えて出力する(_異なる5個の1から20までの数). 'コンソールから入力された異なる5個の1から20までの数を'(L,[]) :- length(L,5),!. 'コンソールから入力された異なる5個の1から20までの数を'(L,[_1から20までの数|R]) :- 'コンソールから入力された異なる1から20までの数'(L,_1から20までの数), 'コンソールから入力された異なる5個の1から20までの数を'([_1から20までの数|L],R). 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数) :- write('異なる1から20までの数を入力して下さい : '), コンソールから入力された(Line), '異なる1から20までの数'(Line,L,_異なる5個の1から20までの数),!. 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数) :- 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数). コンソールから入力された(Line) :- get_line(Line). '異なる1から20までの数'(Line,L,_異なる5個の1から20までの数) :- atom_to_term(Line,_数,_), '異なる'(_数,L), '1から20までの数'(Line,_数),!. '異なる'(_数,L) :- \+(member(_数,L)),!. '異なる'(_数,L) :- writef('入力された数%tは既に入力済みです。再入力をお願いします。\n',[_数]), fail. '1から20までの数'(Line,_数) :- 数(_数), '1から20までの'(_数),!. '1から20までの'(_数) :- _数 >= 1, _数 =< 20,!. '1から20までの'(_数) :- writef('入力された数%tは1から20の範囲にありません。再入力をお願いします。\n',[_数]), fail. 数(_,_数) :- number(_数),!. 数(Line,_数以外の項) :- writef('入力された %t からは数が得られません。再入力をお願いします\n',[Line]), fail. 大きい順に並べ替えて出力する(_異なる5個の1から20までの数) :- 大きい順に並べ替えて(_異なる5個の1から20までの数,_大きい順に整列したならび), 出力する(_大きい順に整列したならび). 大きい順に並べ替えて(L1,L2) :- 大きい順に並べ替えて(L1,[],L2). 大きい順に並べ替えて([],L,L). 大きい順に並べ替えて([A|R],L1,L) :- 大きい順の挿入(A,L1,L2), 大きい順に並べ替えて(R,L2,L). 大きい順の挿入(A,[],[A]). 大きい順の挿入(A,[B|R1],[A,B|R1]) :- A >= B,!. 大きい順の挿入(A,[B|R1],[B|R2]) :- 大きい順の挿入(A,R1,R2). 出力する(_大きい順に整列したならび) :- swritef(_表示する数列,'%t,%t,%t,%t,%t\n',_大きい順に整列したならび), writef('%t\n',[_表示する数列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/734 # # [1]C言語(やさしいC 輪講) # [2]問題文: # 次のコードは、コンソールから入力された異なる5個の1から20までの数を大きい順に並べ替えて出力するプログラムです。 # ([1])〜([11])内を埋めてコードを完成させなさい。 # #include <stdio.h> # #include <stdlib.h> # static int readNumber(char *msg,int min,int max,int m1,int m2,int m3,int m4){ # char console[256],([1]);([2]) result; # for(;;){ # printf("%s",msg); # t=fgets( ([3]),stdin); # if(t==NULL)([5]); # result=atoi(([3])); # if(result<([6]))([5]);if(result>([7]))([5]); # if(m1==result){ # printf("その数は使われています\n"); # ([5]); # } # ([8]) # return result; # } # } # int main(void){ # int m; # m=readNumber("1個目:1以上20以下の整数を入力してください:",([9]),([10]),0,0,0,0); # ([11]) # return 0; # } # [3] Windows Vistaですがコンパイラとかよくわかりません。 # [4] 4月の最初のゼミまで(3年次・4年次と連続履修です) # [5]ローカル変数はステートメントが始まる前にすべて宣言しなければならないと注意を受けました。よろしくお願いします。 # # 'コンソールから入力された異なる5個の1から20までの数を大きい順に並べ替えて出力する' :- 'コンソールから入力された異なる5個の1から20までの数を'([],_異なる5個の1から20までの数), 大きい順に並べ替えて出力する(_異なる5個の1から20までの数). 'コンソールから入力された異なる5個の1から20までの数を'(L,[]) :- length(L,5),!. 'コンソールから入力された異なる5個の1から20までの数を'(L,[_1から20までの数|R]) :- 'コンソールから入力された異なる1から20までの数'(L,_1から20までの数), 'コンソールから入力された異なる5個の1から20までの数を'([_1から20までの数|L],R). 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数) :- write('異なる1から20までの数を入力して下さい : '), コンソールから入力された(Line), '異なる1から20までの数'(Line,L,_異なる5個の1から20までの数),!. 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数) :- 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数). コンソールから入力された(Line) :- get_line(Line). '異なる1から20までの数'(Line,L,_異なる5個の1から20までの数) :- atom_to_term(Line,_数,_), 異なる(_数,L), '1から20までの数'(Line,_数),!. 異なる(_数,L) :- \+(member(_数,L)),!. 異なる(_数,L) :- writef('入力された数%tは既に入力済みです。再入力をお願いします。\n',[_数]), fail. '1から20までの数'(Line,_数) :- 数(_数), '1から20までの'(_数),!. '1から20までの'(_数) :- _数 >= 1, _数 =< 20,!. '1から20までの'(_数) :- writef('入力された数%tは1から20の範囲にありません。再入力をお願いします。\n',[_数]), fail. 数(_,_数) :- number(_数),!. 数(Line,_数以外の項) :- writef('入力された %t からは数が得られません。再入力をお願いします\n',[Line]), fail. 大きい順に並べ替えて出力する(_異なる5個の1から20までの数) :- 大きい順に並べ替えて(_異なる5個の1から20までの数,_大きい順に整列したならび), 出力する(_大きい順に整列したならび). 大きい順に並べ替えて(_異なる5個の1から20までの数,_大きい順に整列したならび) :- sort(_異なる5個の1から20までの数,_整列したならび), reverse(_整列したならび,_大きい順に整列したならび). 出力する(_大きい順に整列したならび) :- swritef(_表示する数列,'%t,%t,%t,%t,%t\n',_大きい順に整列したならび), writef('%t\n',[_表示する数列]). /* 大きい順に並べ替えて(L1,L2) :- 大きい順に並べ替えて(L1,[],L2). 大きい順に並べ替えて([],L,L). 大きい順に並べ替えて([A|R],L1,L) :- 大きい順の挿入(A,L1,L2), 大きい順に並べ替えて(R,L2,L). 大きい順の挿入(A,[],[A]). 大きい順の挿入(A,[B|R1],[A,B|R1]) :- A >= B,!. 大きい順の挿入(A,[B|R1],[B|R2]) :- 大きい順の挿入(A,R1,R2). */ % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/610 # # [1] 授業単元:Cプログラミング演習 # [2] 問題文(含コード&リンク): 最長しりとり問題を整数計画法を用い、しりとりの数が最長となるパターンを導出するプログラムを作成せよ.ただし構造体とポインタを使用すること. # 'しりとりの数が最長となるパターンを導出する'(_しりとりの数が最長となるパターン) :- しりとり節を定義, findmax([_長さ,_節番号ならび],( しりとり(_長さ,_節番号ならび)), [_長さ,_節番号ならび]), 節番号ならびを語彙ならびに変換(_節番号ならび,_しりとりの数が最長となるパターン). しりとり(_長さ,_節番号ならび) :- しりとり節(_,_節番号,_先頭文字,_末尾文字), しりとり(_先頭文字,[],_節番号ならび), length(L,_長さ). しりとり(_先頭文字,L2,_節番号ならび) :- しりとり節(_,_節番号,_先頭文字,_末尾文字), \+(member(_節番号,L2)), しりとり(_末尾文字,[_節番号|L2],_節番号ならび). しりとり(_,L2,L) :- reverse(L2,L). 節番号ならびを語彙ならびに変換([],[]). 節番号ならびを語彙ならびに変換([_節番号|R1],[_語彙|R2]) :- しりとり節(_語彙,_節番号,_,_), 節番号ならびを語彙ならびに変換(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% しりとり節を定義 :- findall(_語彙,( 語彙(_語彙)), _語彙ならび), sort(_語彙ならび,_整列した語彙ならび), しりとり節を定義(0,_整列した語彙ならび). しりとり節を定義(_,[]). しりとり節を定義(N,[_語彙|R]) :- 節を定義(N,_語彙), N_2 is N + 1, しりとり節を定義(N_2,R). 節を定義(N,_語彙) :- sub_atom(_語彙,0,1,_,_先頭文字), sub_atom(_語彙,_,1,0,_末尾文字), assertz(しりとり節(_語彙,N,_先頭文字,_末尾文字)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/569 # # code | val # ------------ # A | 11 # A | 23 # A | 34 # A | 42 # B | 321 # B | 112 # B | 23 # B | 245 # というようなテーブルがあり、ここから # 同じcodeを持つ行が4行以上ある場合、val順で小さい方から3行残してのこりを削除 # したいのですが、SQL一発でできますか?DBMSはMySQLです。 # # ↓ほしい結果 # code | val # ------------ # A | 11 # A | 23 # A | 34 # B | 112 # B | 23 # B | 245 # # '同じcodeを持つ行が4行以上ある場合、val順で小さい方から3行残してのこりを削除したい' :- findsetof(_code,( table(_code,_)), _code候補ならび), append(_,[_code|R],_code候補ならび), 'code毎にvalの小さい順4位以下の組を'(_code,_4位以下の組ならび), '削除する'(_4位以下の組ならび), R = []. 'code毎にvalの小さい順4位以下の組を'(_code,_4位以下の組ならび) :- findall([_val,_code],( table(_code,_val)), L1), sort(L1,L2), 'valの小さい順4位以下の組'(L2,_4位以下の組ならび). 'valの小さい順4位以下の組'([_,_,_|R],R) :- !. 'valの小さい順4位以下の組'(_,[]). 削除する([]). 削除する([[A,B]|R]) :- retract(table(B,A)), 削除する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/569 # # code | val # ------------ # A | 11 # A | 23 # A | 34 # A | 42 # B | 321 # B | 112 # B | 23 # B | 245 # というようなテーブルがあり、ここから # 同じcodeを持つ行が4行以上ある場合、val順で小さい方から3行残してのこりを削除 # したいのですが、SQL一発でできますか?DBMSはMySQLです。 # # ↓ほしい結果 # code | val # ------------ # A | 11 # A | 23 # A | 34 # B | 112 # B | 23 # B | 245 # # '同じcodeを持つ行が4行以上ある場合、val順で小さい方から3行残してのこりを削除したい' :- findsetof(_code,( table(_code,_)), _code候補ならび), append(_,[_code|R],_code候補ならび), 'code毎にvalの小さい順最大3件'(_code,L), '最大3件を書き戻す'(L), R = []. 'code毎にvalの小さい順最大3件'(_code,L) :- findall([_val,_code],( retract(table(_code,_val))), L1), sort(L1,L2), 'valの小さい順最大3件'(L1,L). 'valの小さい順最大3件'([],[]). 'valの小さい順最大3件'([[A1,B1],[A2,B2],[A3,B3]|_],[[B1,A1],[B2,A2],[B3,A3]]) :- !. 'valの小さい順最大3件'([[A,B]|R1],[[B,A]|R2]) :- 'valの小さい順最大3件'(R1,R2). '最大3件を書き戻す'([]). '最大3件を書き戻す'([[A,B]|R]) :- assertz(table(A,B)), '最大3件を書き戻す'(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/908 # # 【 課題 】ttp://www.dotup.org/uploda/www.dotup.org2712711.txt.html # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】3/8 0:00 # 【 Ver  】java version "1.7.0_02-ea" # 【 補足 】3/8が提出期限なので、それまでにどうかお願いいたします。 # # # 専門学校での課題です。 # 課題1については自力でできたのですが、ところどころわからないので、課題1から3をお願いします # # 課題2. # クラスHumanを作りなさい。フィールドは名前、身長、体重の3つとする。 そして、身長と体重が整数でも少数点でも設定できるようにメソッドを作ること。また、初期化時も整数でも少数点でも設定できるようにすること。さらにそのフィールドの値を表示するメソッドも持つこと(表示は小数点表示で統一してよい) # そして、そのクラスHumanをテストするクラスHumanTestを作り、実際にインスタンスを2つ作って、値を設定し、その値を表示するmainメソッドを作りなさい。 # プロジェクト名は「kadai2」、クラス名は「HumanTest」とする。 # データベース構造('Human',1,名前). データベース構造('Human',2,身長). データベース構造('Human',3,体重). フィールドの値を表示する(_関係名) :- フィールド名ならびを得る(_関係名,_フィールド名ならび), 'Human'(_名前,_身長,_体重), 併合する(_フィールド名ならび,[_名前,_身長,_体重],L), writef('Human:: %t=%t, %t=%t, %t=%t\n',L), fail. フィールドの値を表示する(_). '節を定義する'(_関係名) :- フィールド値の入力(_関係名,_フィールド名_フィールド値ならび), フィールド値の切り出し(_フィールド名_フィールド値ならび,_フィールド値ならび), P =.. [_関係名|_フィールド値ならび], assertz(P). フィールド値の切り出し([],[]). フィールド値の切り出し([[_,_フィールド値]|R1],[_フィールド値|R2]) :- フィールド値の切り出し(R1,R2). フィールド名ならびを得る(_関係名,_フィールド名ならび) :- findall([Nth,_フィールド名],( データベース構造(_関係名,Nth,_フィールド名)), L1), sort(L1,L2), フィールド名の切り出し(L2,_フィールド名ならび). フィールド名の切り出し([],[]). フィールド名の切り出し([[_,_フィールド名]|R1],[_フィールド名|R2]) :- フィールド名の切り出し(R1,R2). フィールド値の入力(_関係名,L,_フィールド名_フィールド値ならび) :- findall([_フィールド名,_フィールド値],( member([_,_フィールド名],L), フィールド値の入力(_関係名,_フィールド名,_フィールド値)), _フィールド名_フィールド値ならび). フィールド値の入力(名前,_名前) :- get_line(_名前). フィールド値の入力(身長,_身長) :- get_line(Line), 身長入力検査(Line,_身長),!. フィールド値の入力(体重,_体重) :- get_line(Line), 体重入力検査(Line,_体重),!. フィールド値の入力(_フィールド名,_値) :- フィールド値の入力(_フィールド名,_値). 身長入力検査(Line,_身長) :- atom_to_term(Line,_身長), number(_身長), _身長 > 0,!. 身長入力検査(Line,_身長) :- writef('入力された %t は身長を表しません。再入力をお願いします。\n',[Line]), fail. 体重入力検査(Line,_体重) :- atom_to_term(Line,_体重), number(_体重), _体重 > 0,!. 体重入力検査(Line,_体重) :- writef('入力された %t は体重を表しません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/478 # # [1] 授業単元: プログラミング実習 # [2] 問題文: 構造体の型の成績をqsortを用いて # 点数を高いものから順に並び替えよ # 動作例: # student[1]:76 # student[2]:65 # student[3]:82 #   ・ #   ・ # ------------------------ # 成績順にソートしました。 # ------------------------ # student[3]:82 # student[1]:76 # student[2]:65 #   ・ #   ・ #   ・ # # '成績をqsortを用いて点数を高いものから順に並び替えよ' :- 成績の入力(L1), qsort(L1,L2), 点数の高いものから順に表示(L2,L1). qsort([_軸要素|R1],L2) :- 分割(_軸要素,R1,_軸要素より大きい要素ならび,_軸要素より小さい要素ならび), qsort(_軸要素より大きい要素ならび,_整列した軸要素より大きい要素ならび), qsort(_軸要素より小さい要素ならび,_整列した軸要素より小さい要素ならび), append(_整列した軸要素より大きい要素ならび,[_軸要素|_整列した軸要素より小さい要素ならび],L2). 成績の入力(L1) :- findall(_成績,( append(L0,_,_), length([_|L0],Nth), writef('student[%t]:',[Nth]), get_line(Line), ( Line='',!,fail; 入力を成績に変換(Line,_成績))), L1). 分割([],[],[])., 分割(_軸要素,[A|R1],[A|_軸要素より大きい要素ならび],_軸要素より小さい要素ならび) :- A @> _軸要素, 分割(_軸要素,R1,_軸要素より大きい要素ならび,_軸要素より小さい要素ならび),!. 分割(_軸要素,[A|R1],_軸要素より大きい要素ならび,[A|_軸要素より小さい要素ならび]) :- A @< _軸要素, 分割(_軸要素,R1,_軸要素より大きい要素ならび,_軸要素より小さい要素ならび),!. 入力を成績に変換(Line,_成績) :- atom_to_term(Line,_成績,_), integer(_成績), _成績 >= 0, _成績 =< 100. 点数の高いものから順に表示(L2,L1) :- append(_,[_点数|R],L2), append(L0,[_点数|_],L1), length([_|L0],Nth), writef('student[%t]:%t\n',[Nth,_点数]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/45 # # [1] 授業単元: 情報処理 # [2] 問題文(含コード&リンク): # # (2) 3つのint型整数 n1, n2, n3を昇順( n1 < n2< n3 )に並べ替える関数 void sort3(int *n1, int *n2, int *n3)を作成せよ。  # この関数を用いて、main内で宣言された3つのint型整数 a1, a2, a3 の値を並べ替え 、その結果を表示するプログラムを作成せよ。 a1, a2, a3の初期値は、 a1=3, a2=1, a3=0とする。 # '3つのint型整数 n1, n2, n3を昇順( n1 < n2< n3 )に並べ替える'(_n1,_n2,_n3,X,Y,Z) :- sort3(_n1,_n2,_n3,X,Y,Z). sort3(X,Y,Z,X,Y,Z) :- X =< Y, Y =< Z,!. sort3(X_1,Y_1,Z_1,X,Y,Z) :- X_1 > Y_1, sort3(Y_1,X_1,Z_1,X,Y,Z),!. sort3(X_1,Y_1,Z_1,X,Y,Z) :- X_1 > Z_1, sort3(Z_1,Y_1,X_1,X,Y,Z),!. sort3(X_1,Y_1,Z_1,X,Y,Z) :- Y_1 > Z_1, sort3(X_1,Z_1,Y_1,X,Y,Z). % 以下のサイトは # 出典::スレ立てるまでもない質問はここで 117匹目 #333 # # Prologに於ける文字置換のパターンを示す # # 置換対象文字列に出会う度に非決定性で置換される事を基本として # 併せて、置換回数が最大になるような置換述語を定義する # # 文字列を検索して、適合パターンを置換していく # 1) 文字列の先頭から検索パターンに適合する文字列の前の文字列 # 2) 検索パターンに適合した文字列 # 3) 検索パターンに適合した文字列より後の文字列 # # 2) 検索パターンに適合した文字列を置換文字列に置き換える # 置換文字列定義(def,'DEF'). '置換回数が最大になるような文字列置換'(_文字列,_置換された文字列) :- 全ての置換回数を計測した置換された文字列ならび(_文字列,LL), 置換回数が最大になるような置換された文字列(LL,_置換された文字列). 全ての置換回数を計測した置換された文字列ならび(_文字列,LL) :- findall([_置換された回数,_置換された文字列],( '置換パターン'(_文字列,_置換された回数,_置換された文字列)),LL). 置換回数が最大になるような置換された文字列(LL,_置換された文字列) :- 置換回数が最大に(LL,_最大数), なるように置換された文字列(LL,_最大数,_置換された文字列). 置換回数が最大に(LL,_最大数) :- findmax(N,member([N,_],LL),_最大数). なるように置換された文字列(LL,_最大数,_置換された文字列) :- member([_最大数,_置換された文字列],LL). '置換パターン'(_文字列,_置換された回数,_置換された文字列) :- '置換回数付き置換パターン'(_文字列,0,_置換された回数,_置換された文字列). '置換回数付き置換パターン'(_文字列,_置換された回数_1,_置換された回数,_置換された文字列) :- 置換対象文字列を得る(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1), succ(_置換された回数_1,_置換された回数_2), '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数_2,_置換された回数,_置換された文字列). 置換対象文字列を得る(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1) :- sub_atom(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1), 置換文字列定義(_適合文字列_1,_置換する文字列). '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数,_置換された回数,_置換された文字列) :- atomic_list_concat([_前文字列_1,_置換する文字列,_後文字列_1],_置換された文字列). '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数_1,_置換された回数,_置換された文字列) :- '置換回数付き置換パターン'(_後文字列_1,_置換された回数_1,_置換された回数,_置換された文字列_2), atomic_list_concat([_前文字列_1,_置換する文字列,_置換された文字列_2],_置換された文字列). findmax(_射影項,_目標,_最大数) :- findall(_射影項,_目標,_解ならび), 最大値を取り出す(_解ならび,_最大数). 最大値を取り出す(_解ならび,_最大数) :- sort(_解ならび,_整列した解ならび), last(_整列した解ならび,_最大数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/146 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/gcasKWhG # ハッシュ表を用いて単語とその出現回数を登録し、 # さらに単語の出現回数順にソートするソート関数を作成せよ。 # [3.1] OS:Mac # [3.2] コンパイラ名とバージョン:gcc # [3.3] 言語:C # [4] 期限:2月11日まで # # 基本的な骨格は出来ましたが、ソートの関数が作れませんでした。 # よろしくお願いします。 # # Macのターミナルを利用してテキストファイルを読み込み、単語(基本的に英単語)を登録します。 # # :- dynamic(ハッシュ表/2). 'ハッシュ表を用いて単語とその出現回数を登録し、さらに単語の出現回数順にソートする'(_テキストファイル) :- abolish(ハッシュ表/2), get_split_lines(_テキストファイル,[' ','\n',',','.',':',';'],LL), 平坦化(LL,_語彙ならび), 'ハッシュ表を用いて単語とその出現回数を登録し'(_語彙ならび), 'さらに単語の出現回数順にソートする'(_出現回数順にソートした単語ならび). 'ハッシュ表を用いて単語とその出現回数を登録し'([]). 'ハッシュ表を用いて単語とその出現回数を登録し'([_語彙|R]) :- retract(ハッシュ表(_語彙,_回数)), _更新された回数 is _回数 + 1, asserta(ハッシュ表(_語彙,_更新された回数)), 'ハッシュ表を用いて単語とその出現回数を登録し'(R),!. 'ハッシュ表を用いて単語とその出現回数を登録し'([_語彙|R]) :- asserta(ハッシュ表,_語彙,1), 'ハッシュ表を用いて単語とその出現回数を登録し'(R),!. 'さらに単語の出現回数順にソートする'(_出現回数順にソートした単語ならび) :- findall([_回数,_語彙],( ハッシュ表(_語彙,_回数)), L1), 降順整列(L1,L2), findall(_語彙,( member([_,_語彙],L2)), _出現回数順にソートした単語ならび). 降順整列([],[]). 降順整列([_軸要素|R1],L2) :- 降順分割(_軸要素,R1,_より大きい要素ならび,_等しいかより小さい要素ならび), 降順整列(_より大きい要素ならび,_整列したより大きい要素ならび), 降順整列(_等しいかより小さい要素ならび,_整列した等しいかより小さい要素ならび), append(_整列したより大きい要素ならび,[_軸要素|_整列した等しいかより小さい要素ならび],L2). 降順分割(_,[],[],[]). 降順分割(_軸要素,[_要素|R1],[_要素|R2],R3) :- _要素 @> _軸要素, 降順分割(_軸要素,R1,R2,R3). 降順分割(_軸要素,[_要素|R1],R2,[_要素|R3]) :- _要素 @=< _軸要素, 降順分割(_軸要素,R1,R2,R3). % 以下のサイトは # 出典:: 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/tech/1325685876/782 # # [1] 授業単元:プログラミング # [2] 問題文: # 5つの優先度付きデータを作成する。優先度が最も高いものを1つ削除して新しい優先度付きデータを1つ挿入し優先度順に並べ替えて表示することを指定回数繰り返すプログラムを作成しなさい。 # なお優先度はランダムに発生させた数字の高いものから優先度が高いものとする。 # 例: # {データ番号,優先度(ランダム)}={1,1.4},{2,4.3},{3,2.1},{4,1.1},{5,9.7}だとすると # 優先度の高い5を削除して、新たに{6,7.8(ランダム)}を挿入したとすると6→2→3→1→4と表示されるようにする。 # '5つの優先度付きデータを作成する。優先度が最も高いものを1つ削除して新しい優先度付きデータを1つ挿入し優先度順に並べ替えて表示することを指定回数繰り返す'(_指定回数,LL1,LL) :- '5つの優先度付きデータを作成する。優先度が最も高いものを1つ削除して新しい優先度付きデータを1つ挿入し優先度順に並べ替えて表示することを指定回数繰り返す'(1,_指定回数,LL1,LL). '5つの優先度付きデータを作成する。優先度が最も高いものを1つ削除して新しい優先度付きデータを1つ挿入し優先度順に並べ替えて表示することを指定回数繰り返す'(N,_指定回数,LL,LL) :- N > _指定回数,!. '5つの優先度付きデータを作成する。優先度が最も高いものを1つ削除して新しい優先度付きデータを1つ挿入し優先度順に並べ替えて表示することを指定回数繰り返す'(N,_指定回数,LL1,LL) :- 最も優先順位の高いデータを取り除く(LL1,L0,R), 新たなデータを追加する(N,L0,R,LL2), 大きい順に表示する(LL2), N2 is N + 1, コントロールブロック(N2,_指定回数,LL2,LL). 最も優先順位の高いデータを取り除く(LL1,L0,R) :- append(L0,[[N,_優先順位_1]|R],LL1), \+((append(L1,[[N_2,_優先順位_2]|R2],R),_優先順位_2 > _優先順位_1)),!. 新たなデータを追加する(N,L0,R,LL2) :- M is N + 5, _優先度 is random(100\\\) / 10, append(L0,[[M,_優先度]|R],LL2). 優先順位の大きい順にデータ番号を表示する(LL) :- findall([_優先順位,_データ番号],( member([_データ番号,_優先順位],LL)), LL1), sort(LL1,LL2), reverse(LL2,[[_,N1],[_,N2],[_,N3],[_,N4],[_,N5]]), writef('%t->%t->%t->%t->%t\n',[N1,N2,N3,N4,N5]). % 以下のサイトは # 出典:: 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/1325685876/650 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 出席番号、算数、国語、社会の点数(適当で)からできている成績データを # 読み込み、各生徒の3科目の平均点と最高点を算出して、それを各生徒の # データとして加え、3科目の平均点の順番にソートするプログラムを # 選択ソートでかきなさい。 # '出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み、各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え、3科目の平均点の順番にソートする'(_成績データファイル,_3科目の平均点の順ならび) :- '出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み'(LL), '各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え'(LL,LL2), '3科目の平均点の順番にソートする'(LL2,_3科目の平均点の順ならび). '出席番号、算数、国語、社会の点数(適当で)からできている成績データを読み込み'(LL) :- get_split_lines(_成績データファイル,[','],LL). '各生徒の3科目の平均点と最高点を算出して、それを各生徒のデータとして加え'(LL,LL2) :- findall(L2,( member([_出席番号|L],LL), 平均(L,_平均点), 最大値(L,_最高点), append([_出席番号|L],[_平均点,_最高点],L2)), LL2). '3科目の平均点の順番にソートする'(LL2,_3科目の平均点の順ならび) :- '3科目の平均点を鍵として行頭に付加する'(LL2,LL3), 逆順整列(LL3,LL4), '付加した整列鍵を削除する'(LL4,_3科目の平均点の順ならび). '3科目の平均点を鍵として行頭に付加する'(LL2,LL3) :- findall([_平均点|L],( member(L,LL2), append(_,[_平均点,_],L)), LL3). '付加した整列鍵を削除する'(LL4,_3科目の平均点の順ならび) :- findall(L,( member([_|L],LL4)), _3科目の平均点の順ならび). 逆順整列(L1,L2) :- sort(L1,L3), reverse(L3,L2). 平均(L,_平均) :- length(L,Len), sum(L,_合計), _平均 is _合計 / Len. 最大値([A|R],_最大値) :- append(_,[B|R2],R), B @> A, 最大値([B|R2],_最大値),!. 最大値([_最大値|_],_最大値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/588 # # [1] プログラミング # [2] 営業キロを入力したら料金を表示するプログラムを作りなさい。なお、営業キロは小数点以下はすべて切り上げで計算されます。 #   営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。 # [3] Linux C言語 # [4] 期限:2012年1月25日 # [5] 構造体の使用は無し、運賃と距離は配列を使用する。 # # 一応途中まで作ってみましたが、dis[0]のときfare[0]の値は出ますがそれ以外が出ません。。。助けてください。 # # #include<stdio.h> # int main(void){ # int fare[100]; # int dis[100]; # int j; # float n; # # fare[0]=140; fare[1]=180; fare[2]=190; # fare[3]=230; fare[4]=320; fare[5]=400; # fare[6]=480; fare[7]=570; fare[8]=650; # fare[9]=710; fare[10]=820; fare[11]=950; # fare[12]=1110; fare[13]=1280; fare[14]=1450; # fare[15]=1620; fare[16]=1890; fare[17]=2210; # fare[18]=2520; fare[19]=2940; fare[20]=3260; # fare[21]=3570; fare[22]=3890; fare[23]=4310; # fare[24]=4620; fare[25]=4940; fare[26]=5250; # fare[27]=5460; fare[28]=5780; fare[29]=6090; # fare[30]=6300; fare[31]=6620; fare[32]=6830; # fare[33]=7140; fare[34]=7350; fare[35]=7670; # fare[36]=7980; fare[37]=8190; fare[38]=8510; # fare[39]=8720; fare[40]=9030; fare[41]=9350; # fare[42]=9560; fare[43]=9870; fare[44]=10190; # fare[45]=10500; fare[46]=10820; fare[47]=11030; # fare[48]=11340; fare[49]=11600; fare[50]=11970; # fare[51]=12290; fare[52]=12600; fare[53]=12810; # fare[54]=13130; fare[55]=13440; fare[56]=13760; # fare[57]=14070; fare[58]=14390; fare[59]=14600; # fare[60]=14910; # # dis[0]=3; dis[1]=6; dis[2]=10; # dis[3]=15; dis[4]=20; dis[5]=25; # dis[6]=30; dis[7]=35; dis[8]=40; # dis[9]=45; dis[10]=50; dis[11]=60; # dis[12]=70; dis[13]=80; dis[14]=90; # dis[15]=100; dis[16]=120; dis[17]=140; # dis[18]=160; dis[19]=180; dis[20]=200; # dis[21]=220; dis[22]=240; dis[24]=260; # dis[24]=280; dis[25]=300; dis[26]=320; # dis[27]=340; dis[28]=360; dis[29]=380; # dis[30]=400; dis[31]=420; dis[32]=440; # dis[33]=460; dis[34]=480; dis[35]=500; # dis[36]=520; dis[37]=540; dis[38]=560; # dis[39]=580; dis[40]=600; dis[41]=640; # dis[42]=680; dis[43]=720; dis[44]=760; # dis[45]=800; dis[46]=840; dis[47]=880; # dis[48]=920; dis[49]=960; dis[50]=1000; # dis[51]=1040; dis[52]=1080; dis[53]=1120; # dis[54]=1160; dis[55]=1200; dis[56]=1240; # dis[57]=1280; dis[58]=1320; dis[59]=1360; # dis[60]=1400; # 営業キロならび([3,6,10,15,20,25,30,35,40,45,50,60,70,80,90,100,120,140,160,180,200,220,240,260,280,300,320,340,360,380,400,420,440,460,480,500,520,540,560,580,600,640,680,720,760,800,840,880,920,960,1000,1040,1080,1120,1160,1200,1240,1280,1320,1360,1400]). 料金ならび([140,180,190,230,320,400,480,570,650,710,820,950,1110,1280,1450,1620,1890,2210,2520,2940,3260,3570,3890,4310,4620,4940,5250,5460,5780,6090,6300,6620,6830,7140,7350,7670,7980,8190,8510,8720,9030,9350,9560,9870,10190,10500,10820,11030,11340,11600,11970,12290,12600,12810,13130,13440,13760,14070,14390,14600]). '営業キロを入力したら料金を表示するプログラムを作りなさい。 なお、営業キロは小数点以下はすべて切り上げで計算されます。営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。' :- 営業キロならびは昇順である(_営業キロならび), 料金ならびは昇順である(_料金ならび), 営業キロはキーボードからの入力とし(_営業キロ), 料金を表示する(_営業キロ,_営業キロならび,_料金ならび). 営業キロはキーボードからの入力とし(_営業キロ) :- write('営業キロを入力して下さい : '), get_line(Line), 営業キロ入力診断(Line,_営業キロ),!. 営業キロはキーボードからの入力とし(_営業キロ) :- 営業キロはキーボードからの入力とし(_営業キロ). 営業キロ入力診断(Line,_営業キロ) :- atom_to_term(Line,_営業キロ), integer(_営業キロ), _営業キロ > 0,!. 営業キロ入力診断(Line,_営業キロ) :- writef('入力された %t から適切な営業キロが得られませんでした。再入力をお願いしす。\n',[Line]), fail. 料金を表示する(_入力営業キロ,_営業キロならび,_料金ならび) :- 料金を計算する(_入力営業キロ,_営業キロならび,_料金ならび,_料金), writef('%t 円です。\n',[_料金]). 料金を計算する(_入力営業キロ,_営業キロならび,_料金ならび,14910) :- _入力営業キロ >= 1400,!. 料金を計算する(_入力営業キロ,[_営業キロ|_],[_料金|_],_料金) :- _営業キロ > _入力営業キロ,!. 料金を計算する(_入力営業キロ,[_|R1],[_|R2],_料金) :- 料金を計算する(_入力営業キロ,R1,R2,_料金). 営業キロならびは昇順である(_営業キロならび) :- 営業キロならび(_営業キロならび_1), 営業キロならびは昇順である(_営業キロならび_1,_営業キロならび). 営業キロならびは昇順である(_営業キロならび,_営業キロならび) :- 昇順検査(_営業キロならび),!. 営業キロならびは昇順である(_営業キロならび_1,_営業キロならび) :- 整列(_営業キロならび_1,_営業キロならび). 料金ならびは昇順である(_料金ならび) :- 料金ならびは昇順である(_料金ならび_1), 料金ならびは昇順である(_料金ならび_1,_料金ならび). 料金ならびは昇順である(_料金ならび,_料金ならび) :- 昇順検査(_料金ならび),!. 料金ならびは昇順である(_料金ならび_1,_料金ならび) :- 整列(_料金ならび_1,_料金ならび),!. 昇順検査([_]) :- !. 昇順検査([A,B|R]) :- B @>= A, 昇順検査([B|R]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/588 # # [1] プログラミング # [2] 営業キロを入力したら料金を表示するプログラムを作りなさい。なお、営業キロは小数点以下はすべて切り上げで計算されます。 #   営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。 # [3] Linux C言語 # [4] 期限:2012年1月25日 # [5] 構造体の使用は無し、運賃と距離は配列を使用する。 # # 一応途中まで作ってみましたが、dis[0]のときfare[0]の値は出ますがそれ以外が出ません。。。助けてください。 # # #include<stdio.h> # int main(void){ # int fare[100]; # int dis[100]; # int j; # float n; # # fare[0]=140; fare[1]=180; fare[2]=190; # fare[3]=230; fare[4]=320; fare[5]=400; # fare[6]=480; fare[7]=570; fare[8]=650; # fare[9]=710; fare[10]=820; fare[11]=950; # fare[12]=1110; fare[13]=1280; fare[14]=1450; # fare[15]=1620; fare[16]=1890; fare[17]=2210; # fare[18]=2520; fare[19]=2940; fare[20]=3260; # fare[21]=3570; fare[22]=3890; fare[23]=4310; # fare[24]=4620; fare[25]=4940; fare[26]=5250; # fare[27]=5460; fare[28]=5780; fare[29]=6090; # fare[30]=6300; fare[31]=6620; fare[32]=6830; # fare[33]=7140; fare[34]=7350; fare[35]=7670; # fare[36]=7980; fare[37]=8190; fare[38]=8510; # fare[39]=8720; fare[40]=9030; fare[41]=9350; # fare[42]=9560; fare[43]=9870; fare[44]=10190; # fare[45]=10500; fare[46]=10820; fare[47]=11030; # fare[48]=11340; fare[49]=11600; fare[50]=11970; # fare[51]=12290; fare[52]=12600; fare[53]=12810; # fare[54]=13130; fare[55]=13440; fare[56]=13760; # fare[57]=14070; fare[58]=14390; fare[59]=14600; # fare[60]=14910; # # dis[0]=3; dis[1]=6; dis[2]=10; # dis[3]=15; dis[4]=20; dis[5]=25; # dis[6]=30; dis[7]=35; dis[8]=40; # dis[9]=45; dis[10]=50; dis[11]=60; # dis[12]=70; dis[13]=80; dis[14]=90; # dis[15]=100; dis[16]=120; dis[17]=140; # dis[18]=160; dis[19]=180; dis[20]=200; # dis[21]=220; dis[22]=240; dis[24]=260; # dis[24]=280; dis[25]=300; dis[26]=320; # dis[27]=340; dis[28]=360; dis[29]=380; # dis[30]=400; dis[31]=420; dis[32]=440; # dis[33]=460; dis[34]=480; dis[35]=500; # dis[36]=520; dis[37]=540; dis[38]=560; # dis[39]=580; dis[40]=600; dis[41]=640; # dis[42]=680; dis[43]=720; dis[44]=760; # dis[45]=800; dis[46]=840; dis[47]=880; # dis[48]=920; dis[49]=960; dis[50]=1000; # dis[51]=1040; dis[52]=1080; dis[53]=1120; # dis[54]=1160; dis[55]=1200; dis[56]=1240; # dis[57]=1280; dis[58]=1320; dis[59]=1360; # dis[60]=1400; # 料金表([[3,140],[6,180],[10,190],[15,230],[20,320],[25,400],[30,480],[35,570],[40,650],[45,710],[50,820],[60,950],[70,1110],[80,1280],[90,1450],[100,1620],[120,1890],[140,2210],[160,2520],[180,2940],[200,3260],[220,3570],[240,3890],[260,4310],[280,4620],[300,4940],[320,5250],[340,5460],[360,5780],[380,6090],[400,6300],[420,6620],[440,6830],[460,7140],[480,7350],[500,7670],[520,7980],[540,8190],[560,8510],[580,8720],[600,9030],[640,9350],[680,9560],[720,9870],[760,10190],[800,10500],[840,10820],[880,11030],[920,11340],[960,11600],[1000,11970],[1040,12290],[1080,12600],[1120,12810],[1160,13130],[1200,13440],[1240,13760],[1280,14070],[1320,14390],[1360,14600]]). '営業キロを入力したら料金を表示するプログラムを作りなさい。 なお、営業キロは小数点以下はすべて切り上げで計算されます。営業キロはキーボードからの入力とし、正しい結果が表示されれば繰り返し終了、エラーの場合再入力する。' :- 料金表は昇順にならんでいる(_料金表), 営業キロはキーボードからの入力とし(_営業キロ), 料金を表示する'(_営業キロ,_料金表). 料金表は昇順にならんでいる(_料金表) :- 料金表(_料金表), 昇順検査(_料金表),!. 料金表は昇順にならんでいる(_料金表) :- 料金表(_料金表_1), 整列(_料金表_1,_料金表). 営業キロはキーボードからの入力とし(_営業キロ) :- write('営業キロを入力して下さい : '), get_line(Line), 営業キロ入力診断(Line,_営業キロ),!. 営業キロはキーボードからの入力とし(_営業キロ) :- '営業キロはキーボードからの入力とし'(_営業キロ). 営業キロ入力診断(Line,_営業キロ) :- atom_to_term(Line,_営業キロ), integer(_営業キロ), _営業キロ > 0,!. 営業キロ入力診断(Line,_営業キロ) :- writef('入力された %t から適切な営業キロが得られませんでした。再入力をお願いしす。\n',[Line]), fail. 料金を表示する(_営業キロ,_料金表) :- 料金を計算する(_入力営業キロ,_料金表,_料金), writef('%t 円です。\n',[_料金]). 料金を計算する(_入力営業キロ,_,14910) :- _入力営業キロ >= 1400,!. 料金を計算する(_入力営業キロ,[[_営業キロ,_料金]|_],_料金) :- _営業キロ > _入力営業キロ,!. 料金を計算する(_入力営業キロ,[_|R],_料金) :- 料金を計算する(_入力営業キロ,R,_料金). 昇順検査([_]) :- !. 昇順検査([A,B|R]) :- B @>= A, 昇順検査([B|R]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/526 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):このスレの../test/read.cgi/tech/1325685876/464と同じ質問ですhttp://ime.nu/2ch.ac.la/read.php/tech/1201083176/ # # 「8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い、 # それらのデータをクイックソートし身長の低い順に氏名、学籍番号、身長を # 画面に出力するプログラムを作成せよ」という問題がでました。 '8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い、それらのデータをクイックソートし身長の低い順に氏名、学籍番号、身長を画面に出力するプログラムを作成せよ' :- '8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い'(_入力されたならび), '整列の鍵項目(身長)を先頭に付加する'(_入力されたならび,_鍵の付加されたならび), 整列(_鍵の付加されたならび,_整列されたならび), '身長の低い順に氏名、学籍番号、身長を画面に出力する'(_整列されたならび). '8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い'(_入力されたならび) :- length(_入力されたならび,8), findall([_氏名,_学籍番号,_身長],( append(_,[L|_],_入力されたならび), '氏名・学籍番号・身長を得る'(_氏名,_学籍番号,_身長)), _入力されたならび). '氏名・学籍番号・身長を得る'(_氏名,_学籍番号,_身長) :- 催促付き入力('氏名を入力してください : ',_氏名), 催促付き入力('学籍番号を入力してください : ',_学籍番号), 催促付き入力('身長を入力してください : ',_身長文字列), atom_to_term(_身長文字列,_身長,_). '整列の鍵項目(身長)を先頭に付加する'(_入力されたならび,_鍵の付加されたならび) :- findall([_身長,_氏名,_学籍番号,_身長],( member([_氏名,_学籍番号,_身長],_入力されたならび)), _鍵の付加されたならび). 整列([],[]). 整列([_軸要素|R1],_整列されたならび) :- 分割(_軸要素,R1,_軸要素より小さい要素ならび,_軸要素と等しいか大きい要素ならび), 整列(_軸要素より小さい要素ならび,_整列した軸要素より小さい要素ならび), 整列(_軸要素と等しいか大きい要素ならび,_整列した軸要素と等しいか大きい要素ならび), append(_整列した軸要素より小さい要素ならび,[_軸要素|_整列した軸要素と等しいか大きい要素ならび],_整列されたならび). 分割(_,[],[],[]). 分割(_軸要素,[A|R1],[A|R2],R3) :- A @< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[A|R1],R2,[A|R3]) :- A @>= _軸要素, 分割(_軸要素,R1,R2,R3). '身長の低い順に氏名、学籍番号、身長を画面に出力する'(_整列されたならび) :- append(_,[[_身長,_氏名,_学籍番号,_身長]|R],_整列されたならび), writef('%t, %t, %t\n',[_氏名,_学籍番号,_身長]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/732 # # 【 課題 】超初心者なので理解できない点がありましたらすみません。 # 以下のイベント処理を行うアプレット作成をしたいと思っています。 # (インターフェースは無題.jpgを参照) # # 1、アプレットを起動すると「単語<tab>数字列」の組み合わせが # 格納されているテキストindex.txtを読み込み # 数字列の長さが最長〜9位までの単語(二字熟語〜四字熟語に限定する) # をコンポーネントのボタンのラベルに格納していき表示させる。 # (どのボタンのラベルに単語を格納するかは自由) #                                                                                             # 2、ボタンを押すとラベル(単語)に # 対応した数列をindex.txtから検索して見つけ # その数列をテキストファイルに出力する。  #                                                                                                             # 【 形態 】Applet # 【 GUI  】AWTのみ # 【 期限 】1月22日 # 【 Ver  】java version "1.7.0_02" # 【 補足 】なし # 無題.jpg(現在のアプレット) # http://ime.nu/www.dotup.org/uploda/www.dotup.org2542721.jpg.html # index.txt(「単語<tab>数字列」の組み合わせが入っているテキストファイル) # http://ime.nu/www.dotup.org/uploda/www.dotup.org2542722.txt.html # NounFreq.java(現在のアプレットを表示させているソースコード) # http://ime.nu/www.dotup.org/uploda/www.dotup.org2542718.java.html # よろしくお願いします。 # # # # '「単語<tab>数字列」の組み合わせが格納されているテキストindex.txtを読み込み数字列の長さが最長〜9位までの単語(二字熟語〜四字熟語に限定する)を表示する' :- '「単語<tab>数字列」の組み合わせが格納されているテキストindex.txtを読み込み'(LL), '数字列の長さが最長〜9位までの単語(二字熟語〜四字熟語に限定する)を'(_単語ならび), 表示する(_単語ならび). '「単語<tab>数字列」の組み合わせが格納されているテキストindex.txtを読み込み'(LL) :- get_split_lines('index.txt',[','],LL). '最長〜9位までの単語(二字熟語〜四字熟語に限定する)を'(LL,_単語ならび) :- 要素数で逆順に整列して(LL,LL4), '最長〜9位までの'(LL4,_単語ならび), 単語を表示する(_単語ならび). 要素数で逆順に整列して(LL,LL4) :- findall([_要素数,_単語],( member([_単語|R],LL), length(R,_要素数)), LL2), sort(LL2,LL3), reverse(LL3,LL4). '最長〜9位までの'(LL4,_単語ならび) :- length(L0,9), append(L0,_,LL4). '単語を表示する'(_単語ならび) :- append(_,[[_,_単語]|R],_単語ならび), writef('%t\n',[_単語]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/516 # # [1] 授業単元:キーボード入力 # [2] 問題文(含コード&リンク): # 打ち込む文章を表示して,それをユーザがそっくりに打ち込ませ # その正確さを判定するプログラムを作成せよ. # '打ち込む文章を表示して,それをユーザにそっくりに打ち込ませその正確さを判定する' :- 打ち込む文章を表示して(_打ち込む文章ファイル,_打ち込む文章), それをユーザにそっくりに打ち込ませ(_ユーザの打ち込んだ文章), その正確さを判定する(_打ち込む文章,_ユーザの打ち込んだ文章,_減点数,_正確さの判定), 判定を表示する(_減点数,_正確さの判定). 打ち込む文章を表示して(_打ち込む文章ファイル,_打ち込む文章) :- get_lines(_打ち込む文章ファイル,Lines), append(_,[_打ち込む文章|_],Lines), writef('%t\n',[_打ち込む文章]). それをユーザにそっくりに打ち込ませ(_ユーザの打ち込んだ文章) :- get_line(_ユーザの打ち込んだ文章). その正確さを判定する(_打ち込む文章,_ユーザの打ち込んだ文章,_減点数,_正確さの判定). atom_chars(_打ち込む文章,_打ち込む文章の文字ならび), atom_chars(_ユーザの打ち込んだ文章,_ユーザの打ち込んだ文章の文字ならび), 語彙判定(_打ち込む文章,_ユーザの打ち込んだ文章,_同一語彙数判定), 誤字脱字等判定(_打ち込む文章の文字ならび,_ユーザの打ち込んだ文章の文字ならび,_誤字脱字度数判定), 総合判定(_同一語彙数判定,_誤字脱字度数判定,_減点数,_正確さの判定). 同一語彙数判定(_打ち込む文章,_ユーザの打ち込んだ文章,_同一語彙数判定) :- 形態素解析(_打ち込む文章,_形態素解析_1), 形態素解析(_ユーザの打ち込んだ文章,_形態素解析_2), 語彙の出現数の差異(_形態素解析_1,_形態素解析_2,_語彙の出現数差異度数), _同一語彙数判定 is (-1) * 2 * _語彙の出現数差異度数. 語彙の出現数の差異(_形態素解析_1,_形態素解析_2,_語彙の出現数の差異度数) :- setof(_形態素,member(_形態素,_形態素解析_1),_整列した形態素), findall(_出現数差異,( member(_形態素,_整列した形態素), count(member(_形態素,_形態素解析_1),_度数_1), count(member(_形態素,_形態素解析_2),_度数_2), _出現数差異 is abs(_度数_1 - _度数_2)), _語彙の出現数の差異ならび), sum(_語彙の出現数の差異ならび,_語彙の出現数の差異度数). 誤字脱字等判定(_打ち込む文章の文字ならび,_ユーザの打ち込んだ文章の文字ならび,_誤字脱字度数判定) :- 誤字脱字度数(_打ち込む文章の文字ならび,_ユーザの打ち込んだ文章の文字ならび,_誤字脱字数ならび), findall(_文字数,( member([_,_文字数],_誤字脱字数ならび)), _誤字脱字文字数ならび), sum(_誤字脱字文字数ならび,_誤字脱字度数), _誤字脱字数判定 is (-1) * _誤字脱字度数. 誤字脱字度数([],[],[]). 誤字脱字度数([A,B|R1],[B|R2],[[脱字,1]|R3]) :- \+(A == B), 誤字脱字度数(R1,R2,R3). 誤字脱字度数([B|R1],[A,B|R2],[[誤字挿入,1]|R3]) :- \+(A == B), 誤字脱字度数(R1,R2,R3). 誤字脱字度数([A,B|R1],[C,B|R2],[[誤字,1]|R3]) :- \+(A == C), 誤字脱字度数(R1,R2,R3). 誤字脱字度数([A|R1],[A|R2],R3) :- 誤字脱字度数(R1,R2,R3). 総合判定(_同一語彙数判定,_誤字脱字度数判定,_減点数,_正確さの判定) :- _減点数 is _同一語彙数判定 + _誤字脱字度数判定, 分類判定(_減点数,_正確さの判定). 分類判定(0,'1級'). 分類判定(_減点数,'2級') :- _減点数 < 0, _減点数 >= (-3). 分類判定(_減点数,'3級') :- _減点数 < (-3), _減点数 >= (-7). 分類判定(_減点数,'4級') :- _減点数 < (-7), _減点数 >= (-12). 分類判定(_減点数,'5級') :- _減点数 < (-12). 判定を表示する(_減点数,_正確さの判定) :- writef('入力された文章の正確さ判定は誤り減点数 %t で %t です。\n',[_減点数,_正確さの判定]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/729 # # 【 課題 】<プログラムの仕様> # ・N人の、M科目の成績が書かれたCSVファイルを読み込む # ・平均点、最高点、最低点、度数分布を各科目毎に出力する # ・各科目、総合点のランキングリストを出力する # ・成績の処理結果をテキストファイルに出力する # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】4. 制限なし # 【 期限 】1/26(木) 20:00 # 【 Ver  】java version "1.7.0" # 【 補足 】http://ime.nu/www1.axfc.net/uploader/Sc/so/311237.zip #       上記のリンクが、課題のCSVファイルと、 #       参考資料としてあげられていたCSVファイルの読み込み・書き込みを行うプログラムです。 #       CSVファイルは編集してはならないとのことです。 #       CSVファイルは、左から順番に、 #       「国語」「数学」「英語」「社会」「理科」「美術」「工芸」「書道」「音楽」「体育」の科目で、 #       上から順番に「生徒1」「生徒2」・・・「生徒100」となっております。 #       よろしくお願いいたします。 # '・N人の、M科目の成績が書かれたCSVファイルを読み込む ・平均点、最高点、最低点、度数分布を各科目毎に出力する ・各科目、総合点のランキングリストを出力する ・成績の処理結果をテキストファイルに出力する'(_CSVファイル,_書き込みテキストファイル) :- get_split_lines(_CSVファイル,[','],LL), 転置(LL,_転置LL), '平均点、最高点、最低点、度数分布を各科目毎に集約する'([国語,数学,英語,社会,理科,美術,工芸,書道,音楽,体育],_転置LL,_集約リスト), 総合点のランキングリスト(LL,_総合点のランキングリスト), 出力する(_書き込みテキストファイル,_集約リスト,_総合点のランキングリスト). '平均点、最高点、最低点、度数分布を各科目毎に集約する'([],[],[]). '平均点、最高点、最低点、度数分布を各科目毎に集約する'([_科目|R1],[_列|R2],[[_科目,_平均点,_最高点,_最低点,_度数分布,_ランキングリスト]|R3]) :- 最高点(_列,_最高点), 最低点(_列,_最低点), 平均点(_列,_平均点), 度数分布(_列,_度数分布), 科目毎のランキングリスト(_列,_ランキングリスト), '平均点、最高点、最低点、度数分布を各科目毎に集約する'(R1,R2,R3). 総合点のランキングリスト(LL,_ランキングリスト) :- 総合点集約(1,LL,LL1), sort(LL1,LL2), reverse(LL3,_ランキングリスト). 総合点集約(_,[],[]). 総合点集約(N,[_行|R1],[[_合計点,N]|R2]) :- sum(_行,_合計点), N2 is N + 1, 集合点集約(N2,R1,R2). 度数分布(_列,_度数分布) :- findall(_度数,( member([_点数下限,_点数上限],[[0,19],[20,39],[40,59],[60,79],[80,100]]), count(( member(_点数,_列), _点数 >= _点数下限, _点数 =< _点数上限), _度数分布). 科目毎のランキングリスト(_列,_ランキングリスト), 整列用ランキングリスト(1,_列,_整列用ランキングリスト), sort(_整列用ランキングリスト,_整列済みランキングリスト), reverse(_整列済みランキングリスト,_ランキングリスト). 整列用ランキングリスト(_,[],[]). 整列用ランキングリスト(N,[_得点|R1],[[_得点,N]|R2]) :- N2 is N + 1, 整列用ランキングリスト(N2,R1,R2). 出力する(_書き込みテキストファイル,_集約リスト,_総合点のランキングリスト) :- open(_書き込みテキストファイル,write,Outstream), 科目別項目の書き込み(Outstream,_集約リスト), 総合点のランキングの書き込み(Outstream,_総合点ランキングリスト), close(Outstream). 科目別項目の書き込み(Outstream,_集約リスト) :- append(_,[[_科目,_平均点,_最高点,_最低点,_度数分布,_ランキングリスト]|R],_集約リスト), writef(Outstream,'科目 %t\n',[_科目]), writef(Outstream,'平均点 %4r\n最高点 %4r\n最低点 %4r\n',[_平均点,_最高点,_最低点]), writef(Outstream,'0~19点 %4r\n20~39点 %4r\n40~59点 %4r\n60~79点 %4r\n80~100点 %4r\n',_度数分布), write('%tランキングリスト\n',[_科目]), ランキングリストの書き込み(Outstream,_ランキングリスト), R = []. ランキングリストの書き込み(Outstream,_ランキングリスト) :- ランキングリストの書き込み(Outstream,1,1,_ランキングリスト). ランキングリストの書き込み(Outstream,_,_,[]) :- !. ランキングリストの書き込み(Outstream,_順位,_順位_1,[[_得点,_生徒番号_1],[_得点,_生徒番号_2]|R]) :- writef(Outstream,'%4r 生徒%2l %4r\n',[_順位,_生徒番号_1,_得点]), _順位_2 is _順位_1 + 1, ランキングリストの書き込み(Outstream,_順位,_順位_2,[[_得点,_生徒番号_2]|R]). ランキングリストの書き込み(Outstream,_順位,_順位_1,[[_得点,_生徒番号]|R]) :- write(Outstream,N1,N2,'科目毎ランキング\n'), writef(Outstream,'%4r 生徒%2l %4r\n',[_順位,_生徒番号,_得点]), _順位_2 is _順位_1 + 1, ランキングリストの書き込み(Outstream,_順位_2,_順位_2,R). 総合点のランキングの書き込み(Outstream,_総合点ランキングリスト) :- write('総合点ランキング\n'), ランキングリストの書き込み(Outstream,_総合点ランキングリスト). % 以下のサイトは バイナリファイル (標準入力) に一致しました % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/727 # # 【 課題 】 名前、生年月日、電話番号、メールアドレスと入った一文が複数あるファイルがある。 # このファイルを読み込み生年月日順にソートして表示せよ。 # ただし生年月日は和暦に変換して表示する。 # 【 形態 】1. Javaアプリケーション(main()で開始 # 【 GUI  】4. 制限なし # 【 期限 】1月23日 《必須》 # 【 Ver  】java version "1.6.0_21" # 【 用語 】数学用語、専門用語の意味、説明を書きます。 《あれば必須》 # 【 補足 】ファイルは各自で用意します。 # 例 田中一郎、1887/05/08、123-456-789、tanaka_ichiro@aa.jp # よろしくお願いします。 # # ' 名前、生年月日、電話番号、メールアドレスと入った一文が複数あるファイルがある。このファイルを読み込み生年月日順にソートして表示せよ。ただし生年月日は和暦に変換して表示する。'(_ファイル) :- get_split_lines(_ファイル,['、'],LL), 整列鍵を先頭に付加する(LL,LL1), 整列(LL1,LL2), 西暦和暦変換をしながら表示する(LL2). 整列鍵を先頭に付加する(LL,LL1) :- findall([_生年月日,_名前,_生年月日,_電話番号,_メールアドレス],LL), member([_名前,_生年月日,_電話番号,_メールアドレス],LL)), LL1). 西暦和暦変換をしながら表示する(LL) :- append(_,[[_,_生年月日,_名前,_生年月日,_電話番号,_メールアドレス]|R],LL), 西暦を和暦に変換する(_生年月日,_和暦表示生年月日), concat_atom([_生年月日,_名前,_生年月日,_電話番号,_メールアドレス],'、',_表示行), writef('%t\n',[_表示行]), R = []. 西暦を和暦に変換する(_生年月日,_和暦表示生年月日) :- split(_生年月日,[/],[_年,_月,_日]), 西暦年を和暦年に変換する(_年,_和暦年表示), concat_atom([_和暦年表示,_月,月,_日,_日],_和暦表示生年月日). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1867, _年 < 1912, _和暦年 is 1867 + _年, concat_atom([明治,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1911, _年 < 1926, _和暦年 is 1911 + _年, concat_atom([大正,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1925, _年 < 1989, _和暦年 is 1926 + _年, concat_atom([昭和,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1988, _和暦年 is 1988 + _年, concat_atom([平成,_和暦年,年],_和暦年表示). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/195 # # [1] 授業単元:C言語入門 # [2] 問題文: # http://ime.nu/codepad.org/xmcn6oBoに # select_sortを # void ins_sort(int a[],int n){ # int i,j,k; # for(i=1; i<n; i++){ # x=a[i]; # for(j=i-1; j>=0 && a[j]>x; j--;) # a[j+1]=a[j]; # a[j+1]=x; # } # } # に書き換え、小さい物から大きい物の順番に並び替えるようにするにはどうすれば良いのですか? # 挿入整列(_乱順ならび,_整列ならび) :- 挿入整列(_乱順ならび,[],_整列ならび). 挿入整列([],_整列ならび,_整列ならび). 挿入整列([A|R1],L1,_整列ならび) :- 挿入(A,L1,L2), 挿入整列(R1,L2,_整列ならび). 挿入(A,[],[A]). 挿入(A,[B|R],[A,B|R]) :- A @=< B,!. 挿入(A,[B|R1],[B|R2]) :- A @> B, 挿入(A,R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/87 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&リンク): # 次のように1行に氏名、科目ごとの成績が記録されたファイル # (ファイル名:result.dat)があるとする。 # Name English Science Math Sociology # Ichiro 100 30 40 90 # Jiro 100 80 70 100 # Saburo 80 90 100 60 # Shiro 95 90 95 80 # Goro 73 85 90 98 # このファイルを読み込んで各生徒の平均点を求め、平均点の高い順に行を並べ替えて表示するプログラムを作成せよ。 # (表示には平均点を含む) # '1行に氏名、科目ごとの成績が記録されたファイル(ファイル名:result.dat)があるとする。このファイルを読み込んで各生徒の平均点を求め、平均点の高い順に行を並べ替えて表示する' :- get_lines('result.dat',[_第一行|LL]), findall([_平均点,_氏名],( member(Line,LL), split(Line,[' '],[_|_得点ならび]), avg(_得点ならび,_平均点)), _平均点ならび), 平均点の高い順に行をならび替えて表示する(_第一行,LL,_平均点ならび). 平均点の高い順に行をならび替えて表示する(_第一行,LL,_平均点ならび) :- 平均点の高い順に(_平均点ならび,_平均点の高い順の氏名ならび), 行をならび替えて(_第一行,LL,_平均点の高い順の氏名ならび,_表示行ならび), 表示する(_表示行ならび). 平均点の高い順に(_平均点ならび,LL,_行のならび) :- sort(_平均点ならび,_整列した平均点), reverse(_整列した平均点,_平均点の高い順にならび替えた行), findall(_氏名,( member([_,_氏名],_平均点の高い順にならび替えた行)), _平均点の高い順の氏名ならび). 行をならび替えて(_第一行,LL,_平均点の高い順の氏名ならび,[_第一行|_表示行ならび]) :- findall([_氏名,Line],( member(Line,LL), split(Line,[' '],[_氏名|_])), LL1), findall(L,( member(_氏名,_平均点の高い順の氏名ならび), member([_氏名,Line],LL1)), _表示行ならび). 表示する(_表示行ならび) :- append(_,[_表示行|R],_表示行ならび), writef('%t\n',[_表示行]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/22 # # 表現がよくないと思ったので、修正します。 # # [1] 授業単元:自己参照構造体 双方向チェーンの並び替え # [2] 問題文(含コード&リンク): # 以下のクラス・氏名・順位が定義された自己参照構造体チェーンをクラス毎に順位の昇順にソートしてポインタをなさい。 # 3-1 A君 3位 # 3-1 B君 2位 # 3-1 C君 4位 # 3-1 D君 1位 # 3-2 P君 2位 # 3-2 Q君 3位 # 3-2 R君 1位 # 3-3 X君 1位 # 3-3 Y君 2位 # **************** # 結果 # 3-1 D 1 # 3-1 B 2 # 3-1 A 3 # 3-1 C 4 # 3-2 R 1 # 3-2 P 2 # 3-2 Q 3 # 'クラス・氏名・順位が定義された自己参照構造体チェーンをクラス毎に順位の昇順にソートする'(LL1,LL2) :- !. クラスの整列選別(LL1,_整列したクラスならび), 'クラス毎に順位の昇順にソートする'(_整列したクラスならび,LL1,LL1_2), 要素順を元に戻しながらクラスを解く(LL1_2,LL2). クラスの整列選別([],L,L) :- !. クラスの整列選別([[_クラス,_,_]|R1],L1,L) :- 挿入(_クラス,L1,L2), クラスの整列選別(R1,L2,L). 挿入(_クラス,[],[_クラス]) :- !. 挿入(_クラス,[_クラス|R],[_クラス|R]) :- !. 挿入(_クラス,[_クラス_1|R],[_クラス,_クラス_1|R]) :- _クラス @< _クラス_1,!. 挿入(_クラス,[_クラス_1|R1],[_クラス_1|R2]) :- _クラス @> _クラス_1, 挿入(_クラス,R1,R2),!. 'クラス毎に順位の昇順にソートする'(_整列したクラスならび,LL1,LL2) :- findall(LL,( member(_クラス,_整列したクラスならび), クラスを選別し順位の昇順にソートする(_クラス,LL1,LL)), LL2). クラスを順位の昇順にソートする(_クラス,LL1,LL2) :- findall([_順位,_クラス,_氏名],( member([_クラス,_氏名,_順位],LL1)), LL), 整列(LL,LL2). 整列([_軸要素|R1],LL2) :- 整列(_軸要素,R1,LL2). 整列(_,[],[]). 整列(_軸要素,LL1,LL2) :- 分割(_軸要素,LL1,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび), 整列(_軸要素より小さい要素ならび,_整列した軸要素より小さい要素ならび), 整列(_軸要素に等しいか大きい要素ならび,_整列した軸要素に等しいか大きい要素ならび), append(_整列した軸要素より小さい要素ならび,[_軸要素|_整列した軸要素に等しいか大きい要素ならび],LL2). 分割([],[],[]) :- !. 分割(_軸要素,[L|R1],[L|_軸要素より小さい要素ならび],_軸要素に等しいか大きい要素ならび) :- _軸要素 @> L, 分割(_軸要素,R1,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび),!. 分割(_軸要素,[L|R1],_軸要素より小さい要素ならび,[L|_軸要素に等しいか大きい要素ならび]) :- _軸要素 @=< L, 分割(_軸要素,R1,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび),!. 要素順を元に戻しながらクラスを解く(LL,L) :- 要素順を元に戻しながら平坦化する(LL,[],L). 要素順を元に戻しながらクラスを解く([],L,L) :- !. 要素順を元に戻しながらクラスを解く([L|R],X,Y) :- list(L), 要素順を元に戻しながら追加する(L,X,Z), 要素順を元に戻しながらクラスを解く(R,Z,Y). 要素順を元に戻しながら追加する([],L,L). 要素順を元に戻しながら追加する([[_順位,_名前,_クラス]|R],L1,[[_クラス,_名前,_順位]|R3]) :- 要素順を元に戻しながら追加する(R,L1,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/653 # # 【 課題 】ttp://edu.net.c.dendai.ac.jp/ad1/2011/kadai.html # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】1/10 20:00まで # 【 Ver  】java version "1.6.0_21" # 【 補足 】前にも書かれてますが、課題2-4だけでいいのでお願いします。 # # :- abolish(木/3). 根([],[],[]). '順序木を利用し、キーの値で値を整列するデータ構造を作成する'([]) :- !. '順序木を利用し、キーの値で値を整列するデータ構造を作成する'([N|R]) :- retract(根(_,_,[])), assertz(根([],[],N)), '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(R),!. '順序木を利用し、キーの値で値を整列するデータ構造を作成する'([N|R]) :- 根(_左,[],_根), N @> _根, retract(根(_左,[],_根)), assertz(根(_左,N,_根)), assertz(木([],[],N)), '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(R),!. '順序木を利用し、キーの値で値を整列するデータ構造を作成する'([N|R]) :- 根(_左,_右,_根), N @> _根, '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(_右,N), '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(R),!. '順序木を利用し、キーの値で値を整列するデータ構造を作成する'([N|R]) :- 根([],_右,_根), N @< _根, retract(根([],_右,_根)), assertz(根(N,_右,_根)), '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(_左,N), '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(R),!. '順序木を利用し、キーの値で値を整列するデータ構造を作成する'([N|R]) :- 根(_左,_右,_根), N @< _根, '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(_左,N), '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(R). '順序木を利用し、キーの値で値を整列するデータ構造を作成する'([N|R]) :- 根(_,_,N), '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(R). '順序木を利用し、キーの値で値を整列するデータ構造を作成する'([],N) :- assertz(木([],[],N)),!. '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(M,N) :- N @> M, retract(木(_左,[],M)), assertz(木(_左,N,M)), '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(_右,N),!. '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(M,N) :- N @> M, 木(_左,_右,M), '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(_右,N),!. '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(M,N) :- N @< M, retract(木([],_右,M)), assertz(木(N,_右,M)), '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(_左,N),!. '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(M,N) :- N @< M, 木(_左,_右,M), '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(_左,N),!. '順序木を利用し、キーの値で値を整列するデータ構造を作成する'(M,M). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/365 # # ・DB名:Firebird1.03 # ・テーブル #  ■メイン #   受注番号 受注日 注文社 #   11    2011/12/20 A社 #   12    2011/12/21 B社 #  ■サブ #   連番 受注番号 商品コード 数 #   50  11    A10    100 #   51  11    C30    20 #   52  12    A10    10 #  ■商品 #   商品コード 商品名 カテゴリ 納品番号(商品ごとで重複していません) #   A10     コート 洋服   100 #   C30     帯   和服   504 # # メインの受注番号とサブの受注番号、サブの商品コードと商品の商品コードで # リンクしています。 # # 欲しい結果 # 受注日の期間(いつからいつまで)と、商品のカテゴリと納品番号で、 # 受注の全内容(商品)が知りたいです。 # 受注日:2011/12/01から12/31まで # カテゴリ:洋服 納品番号:100で検索をして # # 受注番号 受注日 注文者 商品コード 商品名 数量 # 11    2011/12/20 A社 A10    コート 100 # 11    2011/12/20 A社 C30    帯   20----★ # 12    2011/12/21 B社 A10    コート 10 # ★受注の全内容が知りたいので、該当する受注番号のサブはすべて表示 # したい。メインの内容は重複表示となります。 # # 丸投げですみませんが、どなたかSQL文をお願いできませんでしょうか。 # テーブルが3つになるとどうしてよいものかわからないです。 # よろしくお願いします。 # # # '受注日の期間(いつからいつまで)と、商品のカテゴリと納品番号で、受注の全内容(商品)が知りたい'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号) :- 受注番号候補を得る(_受注日下限,_受注日上限,_カテゴリ,_納品番号,_受注番号ならび), findall([_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量],( append(_,[_受注番号|_],_受注番号ならび), 受注番号を鍵にデータベースからの選択(_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量)), LL1), 整列(LL1,LL2), 表示する(LL2). 受注番号候補を得る(_受注日下限,_受注日上限,_カテゴリ,_納品番号,_受注番号ならび) :- findsetof(_受注番号,( メイン(_受注番号,_受注日,_注文社), _受注日 @>= _受注日下限, _受注日 @=< _受注日上限, サブ(_連番,_受注番号,_商品コード,_数量), 商品(_商品コード,_商品名,_カテゴリ,_納品番号)), _受注番号ならび). 受注番号を鍵にデータベースを結合(_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量) :- メイン(_受注番号,_受注日,_注文社), サブ(_連番,_受注番号,_商品コード,_数量), 商品(_商品コード,_商品名,_カテゴリ,_納品番号). 表示する(LL) :- write('受注番号 受注日 注文者 商品コード 商品名 数量\n'), append(_,[[_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量]|R],LL), writef('%10l %8l %8c %8c %8c %14l %8r\n',[_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量]), R = []. % 以下のサイトは # 出典::SQL質疑応答スレ 12問目 #353 # MySQL 5.1 # 株価テーブル kabuka # stock_code ←銘柄コード # vol_date ←出来高年月日 # sp # hp # lp # cp # vol # # 銘柄マスタ stock_info # stoc_code ←銘柄コード # shkbn ←商品区分(0,1,2,3,4) # stk_name ← 銘柄名 # delete_flg 削除区分 # 〜その他いろいろな項目 # # 銘柄マスタの商品区分0及び1は除外して銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日の一覧を出したい # # select a.stock_code,stk_name,shkbn,min(vol_date),max(vol_date) # from kabuka a # inner join stock_info b # on a.stock_code = b.stock_code # where # a.stock_code in # (select b.stock_code from stock_info # where delete_flg=0 and shkbn not in(0,4)) # group by a.stock_code # order by shkbn,a.stock_code; # # で、上記のSQLを書いてみたんですが、shkbnが0及び4のもでてしまいます # 出さないようにするにはどうすればいいのでしょうか? # # 銘柄マスタの商品区分0及び1は除外して銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日の一覧を出したい :- 一覧を出したい(銘柄マスタの商品区分0及び1は除外して(_銘柄,_銘柄名), 銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日を表示する(_銘柄,_銘柄名)). 一覧を出したい(_表示対象,_表示する) :- forall(_表示対象,_表示する). 銘柄マスタの商品区分0及び1は除外して(_銘柄,_銘柄名) :- setof([_stoc_code,_stk_name],( [_stoc_code,_shkbn,_stk_name,_delete_flg] ^ stock_info(_stoc_code,_shkbn,_stk_name,_delete_flg), 商品区分0及び1は除外して(_shkbn)),LL), member([_銘柄,_銘柄名],LL). 商品区分0及び1は除外して(_shkbn) :- _shkbn=\=0, _shkbn=\=1. 銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日を表示する(_stock_code,_銘柄名) :- 銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日を(_stock_code,_最古登録日,_最新登録日), writef('%t,%t,最古登録日=%t,最新登録日=%t\n',[_stoc_code,_銘柄名,_最古登録日,_最新登録日]). 銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と最新登録日を(_stock_code,_最古登録日,_最新登録日) :- '銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と'(_stock_code,_最古登録日), 最新登録日を(_stock_code,_最新登録日). 銘柄名を付けて株価テーブルから銘柄ごとの最古登録日と(_stock_code,_最古登録日) :- findmin(_vol_date,kabuka(_stock_code,_vol_date,_sp,_hp,_lp,_cp,_vol),_最古登録日). 最新登録日を(_stock_code,_最新登録日) :- findmax(_vol_date,kabuka(_stock_code,_vol_date,_sp,_hp,_lp,_cp,_vol),_最新登録日). findmin(A,B,C) :- findall(A,B,L), 昇順整列した最初の要素(L1,C). 昇順整列した最初の要素(L1,C) :- sort(L,[C|_]). findmax(A,B,C) :- findall(A,B,L1), 昇順整列した最終要素(L1,C). 昇順整列した最終要素(L1,C) :- sort(L1,L2), last(L2,C). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/749 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/WOUG0 # # 文字列のソートを行うプログラム # 1) ファイル内の単語をソートする # 2) 半角小文字(aからzまで)だけで良いとする # 3) 1単語あたりの文字数は自由に指定してください # 4) ファイルからの読み込み等と、ソートそのものを別の関数として作成すること # 5) 採用したデータ構造について説明すること # 6) ソートのアルゴリズムについて説明すること ファイル内の単語をソートする(_ファイル) :- ファイルからの読み込み(_ファイル,_単語ならび), クイックソートアルゴリズムを用いてオンメモリで文字列のソートを行う(_単語ならび,_整列した単語ならび), ファイルへ書き戻す(_ファイル). ファイルからの読み込み(_ファイル,_単語ならび) :- open(_ファイル,read,Instream), ストリームからの読み込み(Instream,_単語ならび), close(Instream). ストリームからの読み込み(Instream,[]) :- at_end_of_stream(Instream),!. ストリームからの読み込み(Instream,[_単語|R]) :- get_line(Instream,_単語), ストリームからの読み込み(Instream,R). クイックソートアルゴリズムを用いてオンメモリで文字列のソートを行う(_単語ならび,_整列した単語ならび) :- ソート(_単語ならび,_整列した単語ならび). ソート([],[]). ソート(_ならび,_整列済みならび) :- 軸要素は先頭要素とする, _ならび = [_軸要素|R], 分割する(_軸要素,R,_軸要素より小さいならび,_軸要素と等しいか大きいならび), ソート(_軸要素より小さいならび,_整列した軸要素より小さいならび), ソート(_軸要素と等しいか大きいならび,_整列した軸要素と等しいか大きいならび), append(_整列した軸要素より小さいならび,[_軸要素|_整列した軸要素と等しいか大きいならび],_整列済みならび). 分割する(_軸要素,[],[],[]) :- '対象要素がなくなったら第三引数と第四引数の不確定要素を[]に単一化してならびを終止する'. 分割する(_軸要素,[_対象要素|R1],[_対象要素|R2],R3) :- 対象要素が軸要素より小さい場合は(_対象要素,_軸要素), 第三引数にコピー, 分割する(_軸要素,R1,R2,R3). 分割する(_軸要素,[_対象要素|R1],R2,[_対象要素|R3]) :- 対象要素が軸要素と等しいか大きい場合は(_対象要素,_軸要素), 第四引数にコピー, 分割する(_軸要素,R1,R2,R3). 対象要素が軸要素より小さい場合は(_対象要素,_軸要素) :- A @< _軸要素. 対象要素が軸要素と等しいか大きい場合は(_対象要素,_軸要素) :- A @>= _軸要素. ファイルへ書き戻す(_ファイル,_整列された単語ならび) :- open(_ファイル,write,Outstream), append(_,[_単語|R],_整列された単語ならび), writef(Outstream,'%t\n',[_単語]), R = [], close(Outstream). 軸要素は先頭要素とする. '対象要素がなくなったら第三引数と第四引数の不確定要素を[]に単一化してならびを終止する'. 第三引数にコピー. 第四引数にコピー. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/344 # # MySQL 5.1 使用しています。 # # 出勤カレンダーを作って、工程表を作りたいのですが、出勤日テーブルに # 出勤日テーブルは以下のようにして # # T_出勤日 # # 日にち, 出勤 # ---------------- # 1月5日  ○ # 1月6日  ○ # 1月7日  × # 1月8日  × # 1月9日  ○ # # 「今日」が出勤日(○)として、「今日の前の出勤日からはじめて、 # 今後の出勤日」を抜き出すSQL文はどう書いたらよいのでしょう? # つまり、「今日」が2番目に来るような抜き出し方です。 # 一応、考えたのは # # (SELECT 日にち FROM T_出勤日 WHERE 出勤='○' AND 日にち<DATE() LIMIT 1) # UNION # (SELECT 日にち FROM T_出勤日 WHERE 出勤='○' AND 日にち>=DATE() # ORDER BY 日にち ASC); # # これより簡潔に書けるでしょうか? # '出勤カレンダーを作って、工程表を作りたい。「今日」が出勤日(○)として、「今日の前の出勤日からはじめて、今後の出勤日」を抜き出す'(_今日,[_前回の出勤日,_今日|_今後の出勤日ならび]) :- findall(_日にち,( 'T_出勤'(_日にち,○)), L1), sort(L1,L2), append(_,[_前回の出勤日,_今日|_今後の出勤日ならび],L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/593 # # 【 課題 】ttp://edu.net.c.dendai.ac.jp/ad1/2011/kadai.html # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】1/10 20:00まで # 【 Ver  】java version "1.6.0_21" # 【 補足 】課題2をお願いします # <課題1> # 通貨を使うクラスを考えます。 値を入れると、通貨記号を含めて表示し、 # また円レートを設定すると、等価な円オブジェクトを返します。 # # <課題2> # 順序木を利用し、キーの値で値を整列するデータ構造を作成することを考えます。 # そのためには、java.util.Map を実装し、 java.util.AbstractMap を継承し、 # 最小限のプログラムで動作させます。 まず、文字列をキーとして、整数値を # 整列するような TDUMap3 を目標とします。 完成した後、Generics を利用した # 任意の型のキーと値を使用できる TDUMap を作成します。 '通貨を使うクラスを考えます。 値を入れると、通貨記号を含めて表示し、また円レートを設定すると、等価な円オブジェクトを返します。'(_値,_通貨記号,_円レート,_円) :- '値を入れると'(_値), '通貨記号を含めて表示し'(_値,_通貨記号を含む表示), '円レートを設定すると'(_通貨記号を含む表示,_円レート), '等価な円オブジェクトを返す'(_値,_円レート,_円). '通貨を使うクラスを考えます。 値を入れると、通貨記号を含めて表示し、また円レートを設定すると、等価な円オブジェクトを返します。'(_値,_通貨記号,_円レート,_円) :- '通貨を使うクラスを考えます。 値を入れると、通貨記号を含めて表示し、また円レートを設定すると、等価な円オブジェクトを返します。'(_値,_通貨記号,_円レート,_円). '値を入れると'(_値) :- write('値を入力して下さい : '), get_line(Line), '値入力診断'(Line,_値). '値を入れると'(_値) :- '値を入れると'(_値). '値入力診断'(Line,_値) :- atom_to_term(Line,_値,_), number(_値), _値 >= 0. 通貨記号を含めて表示し(_値) :- 通貨(_通貨記号), concat_atom([_通貨記号,_値],_通貨記号を含む表示), writef('%t : ',[_通貨記号を含む表示]). '円レートを設定すると'(_通貨記号を含む表示,_円レート) :- writef('%t 円レートを入力して下さい : ',[_痛か木子を含む表示]), get_line(Line), '円レート入力診断'(Line,_円レート),!. '円レートを設定すると'(_通貨記号を含む表示,_円レート) :- '円レートを設定すると'(_通貨記号を含む表示,_円レート). '円レート入力診断'(Line,_円レート) :- atom_to_term(Line,_円レート,_), number(_円レート), _円レート >= 0,!. '等価な円オブジェクトを返す'(_値,_円レート,_円) :- _円 is _値 * _円レート. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/378 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):↓ # # 文字列操作のライブラリ関数を使用して、指定したファイルで、 # 最も辞書順(ASCIIコード順)で最初に出てくる単語と、最後に出てくる単語を見つけて表示せよ。また、最も長い単語も表示せよ。 # ・同じ長さの単語が複数ある場合には、最初に見つけたものだけ表示するだけでよい。 # ・ただし,ここでいう単語とは、スペースや改行、タブで区切られる文字の列で必ずしも、英数字とはかぎらない。(このような区切りで、ファイルから文字列を読むために%sを用いる) # ・単語の長さは100文字以内と考えてよい。 # ・標準文字列関数を利用すること。 # # (指定されたファイルとは普通の英文が書かれた.txtファイルです) # 実行例 # $./quiz10-2 # Input file name!:sample.txt # file1 open Error sample.txt # $ # $./quiz10-2 # Input file name!:English.txt # The First word = 's # The Last word = yokozuna # The Longest word = accomplishment. # # '指定したファイルで、最も辞書順(ASCIIコード順)で最初に出てくる単語と、最後に出てくる単語を見つけて表示せよ。また、最も長い単語も表示せよ'(_ファイル) :- get_lines(_ファイル,Lines), concat_atom(Lines,' ',_文字列), split(_文字列,[' ','\t'],L1), sort(L1,L), '最初に出てくる単語と、最後に出てくる単語を見つけて表示せよ。また、最も長い単語も表示せよ'(L). '最初に出てくる単語と、最後に出てくる単語を見つけて表示せよ。また、最も長い単語も表示せよ'(L) :- 最初に出てくる単語(L,_最初に出てくる単語), 最後に出てくる単語(L,_最後に出てくる単語), 最も長い単語も表示せよ'(L,_最も長い単語), 表示する(_最初に出てくる単語,_最後に出てくる単語,_最も長い単語). 最初に出てくる単語([_最初に出てくる単語|_],_最初に出てくる単語). 最後に出てくる単語(L,_最後に出て切る単語) :- append(_,[_最後に出てくる単語],L). 最も長い単語も表示せよ(L,_最も長い単語) :- 最も長い単語も表示せよ(L,0,'',_最も長い単語). 最も長い単語も表示せよ([],_,_最も長い単語,_最も長い単語) :- !. 最も長い単語も表示せよ([_単語|R],_これまでの最長文字数,_これまでの最長文字列,_最も長い単語) :- atom_length(_単語,_文字数), _文字数 > _これまでの最長文字数, 最も長い単語も表示せよ(R,_文字数,_単語,_最も長い単語),!. 最も長い単語も表示せよ([_|R],_これまでの最長文字数,_これまでの最長文字列,_最も長い単語) :- 最も長い単語も表示せよ(R,_これまでの最長文字数,_これまでの最長文字列,_最も長い単語). 表示する(_最初に出てくる単語,_最後に出てくる単語,_最も長い単語) :- writef('最初に出てくる単語 = %t\n最後に出てくる単語 = %t\n_最も長い単語 = %t\n',[_最初に出てくる単語,_最後に出てくる単語,_最も長い単語]). 辞書順序(1,ァ). 辞書順序(2,ア). 辞書順序(3,ぁ). 辞書順序(4,あ). 辞書順序(5,ィ). 辞書順序(6,イ). 辞書順序(7,ぃ). 辞書順序(8,い). 辞書順に整列(_語彙ならび,_辞書順語彙ならび) :- 辞書順序コードならびに変換(_語彙ならび,_辞書順序コードならび), sort(_辞書順序コードならび,_整列済み辞書順序コードならび), 辞書順語彙ならびに変換(_整列済み辞書順序コードならび,_辞書順語彙ならび). 辞書順序コードならびに変換(_語彙ならび,_辞書順序コードならび) :- findall(_辞書順序語彙コード,( member(_語彙,_語彙ならび), % 以下のサイトは # 出典:: 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/166 # # [1] 授業単元:2分探索 # [2] 問題文(含コード&リンク): # 2分探索を呼び出すmain関数を作成し、実際の動作を確認せよ。 # ただし各データの値は構造体配列の初期設定で設定するものとする。 # また、プログラムは以下のように動作するものとする。 # Please input a key: 8 # Found! Key=8, Name=Hanada # Please input a key: 24 # Found! Key=24, Name=Nishida # Please input a key: 6 # Not Found! # Please input a key: # ・ # ・ # # 鍵付き整列済みならびの二分探索(_整列済みならび,_鍵,_取り出しデータ) :- ならびの二分(_整列済みならび,L1,L2), 鍵付き整列済みならびの二分探索(_鍵,L1,L2,_取り出しデータ). 鍵付き整列済みならびの二分探索(_鍵,L1,[(_鍵,_取り出しデータ)|_],_取り出しデータ) :- !. 鍵付き整列済みならびの探索(_鍵,L1,[(A,_)|R],_取り出しデータ) :- _鍵 @> A, 鍵付き整列済みならびの二分探索(R,_鍵,_取り出しデータ). 鍵付き整列済みならびの探索(_鍵,L1,[(A,_)|R],_取り出しデータ) :- _鍵 @< A, 鍵付き整列済みならびの二分探索(L1,_鍵,_取り出しデータ). ならびの二分(L,L1,L2) :- length(L,Len), Len1 is Len // 2, length(L1,Len1), append(L1,L2,L). % 以下のサイトは # 出典:: 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/454 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 線形リスト構造で、整数を1つ入れる度にソートし、出力するプログラムを作成せよ # 配列はitem[11]とnext[11]を用意する。 # '線形リスト構造で、整数を1つ入れる度にソートし、出力する'(_線形リスト,_挿入されたリスト) :- writef('線形リストの初期値 = %t\n',[[]]), '整数を1つ入れる度に'(_整数), '線形リスト構造で、整数を1つ入れる度にソートし、出力する'(_線形リスト,_整数,_挿入されたリスト), 出力する(_挿入されたリスト). '線形リスト構造で、整数を1つ入れる度にソートし、出力する'([],_挿入整数,[_挿入整数]). '線形リスト構造で、整数を1つ入れる度にソートし、出力する'([A|R1],_挿入整数,[_挿入整数|R1]) :- A >= _挿入整数,!. '線形リスト構造で、整数を1つ入れる度にソートし、出力する'([A|R1],_挿入整数,[A|R1]) :- A < _挿入整数, '線形リスト構造で、整数を1つ入れる度にソートし、出力する'([A|R1],_挿入整数,R2). '整数を1つ入れる度に'(_整数) :- write('整数を1つ入れて下さい : '), get_line(Line), 整数入力診断(Line,_整数),!. '整数を1つ入れる度に'(_整数) :- '整数を1つ入れる度に'(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 出力する(_挿入されたリスト) :- writef('整列された線形リスト = %t\n',[[_挿入されたリスト]]). /* '線形リスト構造で、整数を1つ入れる度にソートし'(_線形リスト,_挿入整数,_挿入された線形リスト) :- append(L0,[A|R],_線形リスト), _挿入整数 =< A, append(L0,[_挿入整数,A|R],_挿入された線形リスト),!. '線形リスト構造で、整数を1つ入れる度にソートし'(_線形リスト,_挿入整数,_挿入された線形リスト) :- append(_線形リスト,[_挿入整数],_挿入された線形リスト). */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/799 # # ●正規表現の使用環境 # 秀丸 # # ●検索か置換か? # 置換 # # ●説明 # 文字列の中に同じ文字が2つ以上含まれる行を削除したい # # ●対象データ # aaaaaaaa # abcabcab # abcdefgh # agbchddf # cbfdaehg # dbcahebg # dffbdeha # echfbgad # fbadcaeh # habcdefg # # ●希望する結果 # abcdefgh # cbfdaehg # echfbgad # habcdefg # # # # 見づらいかと思いますが # どうかよろしくお願いします。 # # 文字列の中に同じ文字が2つ以上含まれる行を削除したい([],[]). 文字列の中に同じ文字が2つ以上含まれる行を削除したい([_|R1],R2) :- 同じ文字が2つ以上含まれる行は削除する(_行), 文字列の中に同じ文字が2つ以上含まれる行を削除したい(R1,R2). 文字列の中に同じ文字が2つ以上含まれる行を削除したい([A|R1],[A|R2]) :- 文字列の中に同じ文字が2つ以上含まれる行を削除したい(R1,R2). 同じ文字が2つ以上含まれる行は削除する(_行) :- atom_chars(_行,_文字ならび), 整列(_文字ならび,_整列された文字ならび), 整列した要素に重複がある(_整列された文字ならび). 整列した要素に重複がある([A,A|_]) :- !. 整列した要素に重複がある([_|R]) :- 整列した要素に重複がある(R). % 以下のサイトは # 出典:: 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/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/1312201995/954 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # プログラム例7.2.1を、最小値の要素番号idx(x[idx]が最小値となるようなidx)を求めるように変更した後、 # その最小値x[idx]と先頭要素x[0]の2つの要素を入れ替え、配列の全要素を表示するようにしなさい。 # この実行の結果、x[0]はx[0],x[1],・・・,x[9]の最小値となります。 # プログラム例7.2.1 # ttp://www.dotup.org/uploda/www.dotup.org2207772.txt.html # # include # # int main(void) # { # int n = 10; # int x[10] = {3, 5, 1, 9, 5, 7, 4, 2, 6, 10}; # int max, i; # max = x[0]; # for (i = 1; i < n; i++) # { # if (x[i] > max) max = x[i]; # } # printf("最大値は %d です. \n", max); # return 0; # } # # 設問1-2 # 次にx[1],x[2],・・・,x[9]に対し上記設問1-1と同じ操作を行い、次にx[2],x[3],・・・,x[9]に対し上記設問1-1と同じ操作を行い、 # ・・・,最後にx[8],x[9]に対し上記設問1-1と同じ操作を行うという手順で処理を進めると最終的に配列xを昇順にソーティングできます。 # そのようにプログラムを作成しなさい。 # 設問1-3 # 上記設問1-2をfor文の2重ループで書きなさい。 # 'ならびの最小値要素を求め先頭要素と入れ替える。次に先頭より後のならびに対して同様にこれを繰り返し、最終的にならびを整列させる'([],[]) :- !. 'ならびの最小値要素を求め先頭要素と入れ替えて、次に先頭より後のならびに対して同様にこれを繰り返し、最終的にならびを整列させる'(L1,[A|R]) :- 'ならびの最小値要素を求め先頭要素と入れ替える'(L1,[A|L2]), 'ならびの最小値要素を求め先頭要素と入れ替えて、次に先頭より後のならびに対して同様にこれを繰り返し、最終的にならびを整列させる'(L2,R),!. 'ならびの最小値要素を求め先頭要素と入れ替える'(L1,L2) :- append(L0,[A|R],L1), \+((member(B,L0),B > A)), \+((member(C,R),C > A)), 'L0の先頭要素とAを入れ替える'(L0,A,R,L2),!. 'L0の先頭要素とAを入れ替える'([],A,R,[A|R]) :- !. 'L0の先頭要素とAを入れ替える'([A0|R0],A,R,L2) :- append([A|R0],[A0|R],L2). % 以下のサイトは # 出典:: 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/826 # # [1] 授業単元:クイックソート # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/duPFX # # 問題1. 整数データの配列a[], 全体のサイズn を引数にとり、単純なpivot(=x とする) により # x 以下の左部分とx より大きな右部分に分割して、pivot の値, 左部分、右部分を # 表示する関数を作成して正しく動くことを確認せよ。 # # 問題2. 整数データの配列に対してソートをかける関数を、クイックソートで作成し、正 しく動くことを確認せよ。 # ただし、pivot は単純なものでよい。これをquick と呼ぶ。 # # 問題2. 整数データの配列に対してソートをかける関数を、クイックソートで作成し、正 しく動くことを確認せよ。 # ただし、pivot は単純なものでよい。これをquick と呼ぶ。 # # 問題3. 問題2 を変更して、pivot を両端と中央での値の3個の値の中央値として # クイックソートを作成し、正しく動くことを確認せよ。 # これをquick2 と呼ぶことにする。 # # 問題4. 問題3 を変更して、もし配列のサイズが10 以下であれば挿入ソートを # 行うように再帰呼び出しを変更しなさい。これをquick3 と呼ぶことにする。 # # 問題5.Merge ソート,quick,quick2,quick3 について時間計測をして比較しなさい # quick3([],[]) :- !. quick3(_ならび,_整列したならび) :- \+(append([_,_,_,_,_,_,_,_,_,_],_,_ならび)), 挿入ソート(_ならび,_整列したならび),!. quick3(_ならび,_整列されたならび) :- 軸要素を得る(_ならび,_x), '単純なpivot(=x とする)によりx 以下の左部分とx より大きな右部分に分割して'(_ならび,_x,_左部分,_右部分), quick2(_左部分,_整列された左部分), quick2(_右部分,_整列された右部分), append(_整列された左部分,[_x|_整列された右部分],_整列されたならび). 挿入ソート(_ならび,_整列したならび) :- 挿入ソート(_ならび,[],_整列したならび). 挿入ソート([],L,L) :- !. 挿入ソート(L,[],L) :- !. 挿入ソート([A|R1],[B|R2],L) :- A @=< B, 挿入ソート(R1,[A,B|R2],L),!. 挿入ソート([A|R1],[B|R2],L) :- A @> B, 挿入(A,[B|R2],L2), 挿入ソート(R1,L2,L). 挿入(A,[],[A]) :- !. 挿入(A,[B|R1],[A,B|R1]) :- A @=< B,!. 挿入(A,[B|R1],[B|R2]) :- A @> B, 挿入(A,R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/826 # # [1] 授業単元:クイックソート # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/duPFX # # 問題1. 整数データの配列a[], 全体のサイズn を引数にとり、単純なpivot(=x とする) により # x 以下の左部分とx より大きな右部分に分割して、pivot の値, 左部分、右部分を # 表示する関数を作成して正しく動くことを確認せよ。 # # 問題2. 整数データの配列に対してソートをかける関数を、クイックソートで作成し、正 しく動くことを確認せよ。 # ただし、pivot は単純なものでよい。これをquick と呼ぶ。 # # 問題2. 整数データの配列に対してソートをかける関数を、クイックソートで作成し、正 しく動くことを確認せよ。 # ただし、pivot は単純なものでよい。これをquick と呼ぶ。 # # 問題3. 問題2 を変更して、pivot を両端と中央での値の3個の値の中央値として # クイックソートを作成し、正しく動くことを確認せよ。 # これをquick2 と呼ぶことにする。 # # 問題4. 問題3 を変更して、もし配列のサイズが10 以下であれば挿入ソートを # 行うように再帰呼び出しを変更しなさい。これをquick3 と呼ぶことにする。 # # 問題5.Merge ソート,quick,quick2,quick3 について時間計測をして比較しなさい # 軸要素を得る([A],A) :- !. 軸要素を得る([A,B],A) :- !. 軸要素を得る(_a,_x) :- 要素数が偶数の場合(_a,A,B,C). 中間値(A,B,C,_x),!. 軸要素を得る(_a,_x) :- 要素数が奇数の場合(_a,A,B,C), 中間値(A,B,C,_x),!. 要素数が偶数の場合(_a,_x) :- append([A|R1],[B|R2],_a), length(R1,N), length(R2,N), last(R2,C),!. 要素数が奇数の場合(_a,_x) :- append([A|R1],[B|R2],_a), length([A|R1],N), length(R2,N), last(R2,C),!. quick2([],[]). quick2(_ならび,_整列されたならび) :- 軸要素を得る(_ならび,_x), '単純なpivot(=x とする)によりx 以下の左部分とx より大きな右部分に分割して'(_ならび,_x,_左部分,_右部分), quick2(_左部分,_整列された左部分), quick2(_右部分,_整列された右部分), append(_整列された左部分,[_x|_整列された右部分],_整列されたならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/826 # # [1] 授業単元:クイックソート # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/duPFX # # 問題1. 整数データの配列a[], 全体のサイズn を引数にとり、単純なpivot(=x とする) により # x 以下の左部分とx より大きな右部分に分割して、pivot の値, 左部分、右部分を # 表示する関数を作成して正しく動くことを確認せよ。 # # 問題2. 整数データの配列に対してソートをかける関数を、クイックソートで作成し、正 しく動くことを確認せよ。 # ただし、pivot は単純なものでよい。これをquick と呼ぶ。 # # 問題2. 整数データの配列に対してソートをかける関数を、クイックソートで作成し、正 しく動くことを確認せよ。 # ただし、pivot は単純なものでよい。これをquick と呼ぶ。 # # 問題3. 問題2 を変更して、pivot を両端と中央での値の3個の値の中央値として # クイックソートを作成し、正しく動くことを確認せよ。 # これをquick2 と呼ぶことにする。 # # 問題4. 問題3 を変更して、もし配列のサイズが10 以下であれば挿入ソートを # 行うように再帰呼び出しを変更しなさい。これをquick3 と呼ぶことにする。 # # 問題5.Merge ソート,quick,quick2,quick3 について時間計測をして比較しなさい # quick([],[]). quick(_ならび,_整列されたならび) :- 軸要素を得る(_ならび,_x), '単純なpivot(=x とする)によりx 以下の左部分とx より大きな右部分に分割して'(_ならび,_x,_左部分,_右部分), quick(_左部分,_整列された左部分), quick(_右部分,_整列された右部分), append(_整列された左部分,[_x|_整列された右部分],_整列されたならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/799 # # テキストファイルの中にある複数の英字の文字列をソートして書きこむプログラム教えてください # # MOJI # EIGO # NIPPON # #  ↓ # # EIGO # MOJI # NIPPON # # 'テキストファイルの中にある複数の英字の文字列をソートして書きこむ'(_テキストファイル) :- get_lines(_テキストファイル,Lines), 整列(Lines,整列したLines), put_lines(_テキストファイル,_整列したLines). 整列([],[]). 整列([_軸要素|_残り要素],整列したLines) :- 軸要素で分割する(_軸要素,_残り要素,_軸要素より小さいか等しい要素ならび,_軸要素より大きい要素ならび), 整列(_軸要素より小さいか等しい要素ならび,_整列した軸要素より小さいか等しい要素ならび), 整列(_軸要素より大きい要素ならび,_整列した軸要素より大きい要素ならび), append(_整列した軸要素より小さいか等しい要素ならび,[_軸要素|_整列した軸要素より大きい要素ならび],_整列したLines). 軸要素で分割する([],[],[]). 軸要素で分割する(_軸要素,[A|R],[A|R1],R2) :- A @=< _軸要素, 軸要素で分割する(_軸要素,R,R1,R2). 軸要素で分割する(_軸要素,[A|R],R1,[A|R2]) :- A @> _軸要素, 軸要素で分割する(_軸要素,R,R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/659 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # 以下を参考に再帰的二分探索を作成せよ。 # http://ime.nu/codepad.org/BHEasb4b # お手数ですが、詳細はURLでお願いします。 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # 以下を参考に再帰的二分探索を作成せよ。 # # int binsearch (int x, int v[], int n) # { # int p, q, m; # p = 0; # q = n ? 1; # while (p <= q) { # m = (p + q)/2; # if (x < v[m]) # q = m ? 1; # else if (x > v[m]) # p = m + 1; # else # return m; # } # return ?1; # # ?入力:int x, int v[], int n (binsearchに同じ) # ?出力:配列vにxが存在すれば、その場所(添字)。存在しなければ,‐1 # ? プログラムの構造 # ? ループを使用せず,関数の再帰呼び出しを使うこと # ? 外部変数で値の受け渡しをしないこと # # [3] 環境 #  [3.1] OS:windows 7 #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語:c言語 # [4] 期限:2011/10/15 23:00 # [5] その他の制限:配列は整数で昇順にソートされている前提でした。授業では配列、ポインタは習っています。よろしくお願いします。 # 整列ならびの二分検索(_検索要素,_ならび,_前半ならび,_残りならび) :- ならびを二つ折りにする(_ならび,_前半ならび_1,_後半ならび_1), 整列ならびの二分検索(_検索要素,_前半ならび_1,_後半ならび_1,_前半ならび,_残りならび). 整列ならびの二分検索(_検索要素,_前半ならび,[_検索要素|_残りならび],_前半ならび,_残りならび) :- !. 整列ならびの二分検索(_検索要素,_前半ならび_1,[_要素|_残りならび_1],_前半ならび,_残りならび) :- _検索要素 @< _要素, 整列ならびの二分検索(_検索要素,_前半ならび_1,_前半ならび,_残りならび_2), append(_残りならび_2,_残りならび_1,_残りならび). 整列ならびの二分検索(_検索要素,_前半ならび_1,[_要素|_残りならび_1],_前半ならび,_残りならび) :- _検索要素 @> _要素, 整列ならびの二分検索(_検索要素,_残りならび_1,_前半ならび_2,_残りならび), append(_前半ならび_1,_前半ならび_2,_前半ならび). ならびを二つ折りにする(_ならび,_前半ならび,_後半ならび) :- length(_ならび,M), ならびを二つ折りにする(M,_ならび,_前半ならび,_後半ならび). ならびを二つ折りにする(M,_ならび,_前半ならび,_後半ならび) :- 0 is M mod 2, M1 is M // 2, length(_前半ならび,M1), length(_後半ならび,M1), append(_前半ならび,_後半ならび,_ならび). ならびを二つ折りにする(M,_ならび,_前半ならび,_後半ならび) :- 1 is M mod 2, M1 is M // 2, M2 is M1 + 1, length(_前半ならび,M1), length(_後半ならび,M2), append(_前半ならび,_後半ならび,_ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/573 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 挿入ソートを乱数配列に対して 100 回実行し, 一回のソートにおける 配列要素の値の比較回数とその平均値を表示するプログラムを作成せよ. また, 以下の機能も加えよ; # 1.整数 n, max を scanf で受け取り, 乱数配列の 長さ n と乱数の範囲 ( 1 から max まで )を指定できる. # 2.一回のソートにおける比較回数は見やすいように各行 10 個ずつ表示する. # '挿入ソートを乱数ならびに対して 100 回実行し, 一回のソートにおける ならび要素の値の比較回数とその平均値を表示する' :- ならびの長さを得る(_n), 乱数の最大値を得る(Max), '挿入ソートを乱数ならびに対して 100 回実行し, 一回のソートにおける ならび要素の値の比較回数とその平均値を表示する'(1,_n,Max,_比較回数合計,_比較回数平均値), writef('比較平均回数: %t\n',[_比較回数平均]),!. ならびの長さを得る(_n) :- write('ならびの長さを入力してください : '), get_line(Line), ならびの長さ検査(Line,_n),!. ならびの長さを得る(_n) :- ならびの長さを得る(_n). ならびの長さ検査(Line,_n) :- atom_to_term(Line,_n,_), interger(_n),!. ならびの長さ検査(Line,_n) :- writef('入力された%tから適切な整数が得られません。再入力をお願いします。\n',[Line]), fail. 乱数の最大値を得る(Max) :- write('乱数の最大値を入力してください : '), get_line(Line), 乱数の最大値検査(Line,Max),!. 乱数の最大値を得る(Max) :- 乱数の最大値を得る(Max). 乱数の最大値検査(Line,Max) :- atom_to_term(Line,Max,_), interger(Max),!. 乱数の最大値検査(Line,Max) :- writef('入力された%tから乱数の最大値として適切な整数が得られません。再入力をお願いします。\n',[Line]), fail. '挿入ソートを乱数ならびに対して 100 回実行し, 一回のソートにおける ならび要素の値の比較回数とその平均値を表示する'(N,_n,Max,_比較回数合計,_比較回数平均値) :- N > 100, _比較回数平均値 is _比較回数合計 / 100,!. '挿入ソートを乱数ならびに対して 100 回実行し, 一回のソートにおける ならび要素の値の比較回数とその平均値を表示する'(N,_n,Max,_比較回数合計,_比較回数平均値) :- 乱数ならびを得る(_n,_Max,_乱数ならび), 比較回数を数えながら挿入整列(_乱数ならび,_整列されたならび,0,_比較回数), 比較回数の表示(N,_比較回数), _比較回数のニ is _比較回数合計 + _比較回数, N2 is N + 1, '挿入ソートを乱数ならびに対して 100 回実行し, 一回のソートにおける ならび要素の値の比較回数とその平均値を表示する'(N2,_n,Max,_比較回数合計のニ,_比較回数平均値). 乱数ならびを得る(_n,_Max,_乱数ならび) :- length(_乱数ならび,_n), findall(N,( append(_,[N|_],_乱数ならび), N is random(_Max) + 1), _乱数ならび),!. 比較回数を数えながら挿入整列(L1) :- 比較回数を数えながら挿入整列(L1,[],L2,0,_比較回数), writef('整列されたリストは %t 比較回数は %t です。\n',[L2,_比較回数]). 比較回数を数えながら挿入整列([],L,L,_比較回数,_比較回数). 比較回数を数えながら挿入整列([A|R1],L1,L,_比較回数1,_比較回数) :- 'append挿入'(A,L1,L2,_比較回数2), writef('append挿入: %t,%t,%t,%t\n',[A,L1,L2,_比較回数2]), _比較回数3 is _比較回数1 + _比較回数2, 比較回数を数えながら挿入整列(R1,L2,L,_比較回数3,_比較回数). 比較回数を数えながら挿入整列([A|R1],[],L,_比較回数1,_比較回数) :- _比較回数2 is _比較回数1 + 1, 比較回数を数えながら挿入整列(R1,[A],L,_比較回数2,_比較回数). 'append挿入'(A,L1,L,_比較回数) :- append(L0,[B|R],L1), A < B, append(L0,[A,B|R],L), length(L0,Len), _比較回数 is ((Len * 2) + 1) * 2,!. 'append挿入'(A,L1,L,_比較回数) :- append(L1,[A],L), length(L1,Len), _比較回数 is Len * 2 + 1,!. 比較回数の表示(N,_比較回数) :- 0 is N mod 10, N2 is N + 1, writef('%t:%t\n',[N,_比較回数]),!. 比較回数の表示(N,_比較回数) :- writef('%t:%t ',[N,_比較回数]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/574 # # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): # ファイル名を一つ引数として指定し、その中に含まれている (いわゆる半角の)アルファベットの出現頻度を調べて表示するプログラムを作れ。但し、大文字小文字は同一視するものとする。 # ./countchar aaa.txt # a: 10 # b: 5 # c: 20 # d: 7 # e: 31 # ... # z: 2 # # のような感じ。 # 'ファイル名を一つ引数として指定し、その中に含まれている (いわゆる半角の)アルファベットの出現頻度を調べて表示するプログラムを作れ。但し、大文字小文字は同一視するものとする。'(_ファイル名) :- get_codes(_ファイル名,Codes), 'その中に含まれている (いわゆる半角の)アルファベットの出現頻度を調べて表示する'(Codes). 'その中に含まれている (いわゆる半角の)アルファベットの出現頻度を調べて表示する'(Codes) :- '但し、大文字小文字は同一視するものとする。'(Codes,_変換されたCodes), 出現頻度を調べて表示する(_変換されたCodes). 出現頻度を調べて表示する(_変換されたCodes) :- 出現頻度を調べて(_変換されたCodes,_文字コード,_出現頻度,_残りCodes), 表示する(_文字コード,_出現頻度), _残りCodes = [],!. 出現頻度を調べて(_変換されたCodes,_文字コード,_出現頻度,L2) :- 整列(_変換されたCodes,_整列されたCodes), append(L0,[Code|R1],L2,_整列させたCodes), all(R1,Code), \+(member(Code,L0)), \+(member(Code,L2)), length([Code|R1],_出現頻度). 表示する(_文字コード,_出現頻度) :- char_code(_文字,Code), writef('%t: %t\n',[_文字,_出現頻度]). '但し、大文字小文字は同一視するものとする。'([],[]) :- !. '但し、大文字小文字は同一視するものとする。'([Code|R1],[_変換されたCode|R2]) :- アルファベット大文字コードを小文字コードに変換(Code,_変換されたCode), '但し、大文字小文字は同一視するものとする。'(R1,R2). アルファベット大文字コードを小文字コードに変換(Code1,Code2) :- Code1 >= 65, Code1 =< 90, Code2 is Code1 + 32,!. アルファベット大文字コードを小文字コードに変換(Code,Code). % 以下のサイトは # 出典: C/C++の宿題片付けます 152代目 #555 # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):http://ime.nu/s2.etowns.slyip.net/~c_cpp_homework/cgi-bin/joyful/joyful.cgi # # 昇順(小→大)に並び替えるプログラムを作成しなさい。以下の三つを含めること。 #      1)要素数10個のint型配列を使用すること #      2)ランダムで配列に値を入れること #      3)乱数の範囲は0〜9とすること '昇順(小→大)に並び替えるプログラムを作成しなさい。以下の三つを含めること。      1)要素数10個のint型配列を使用すること      2)ランダムで配列に値を入れること      3)乱数の範囲は0〜9とすること'(_整列した整数ならび) :- '要素数10個のint型配列を使用すること'(L), 'ランダムで配列に値を入れること 乱数の範囲は0〜9とすること'(L), '昇順(小→大)に並び替える'(L,[],_整列した整数ならび). '要素数10個のint型配列を使用すること'(L) :- ここでこのリストの要素が整数であることを予約する方法はない, length(L,10). ここでこのリストの要素が整数であることを予約する方法はない. 'ランダムで配列に値を入れること 乱数の範囲は0〜9とすること'(L) :- findall(_整数,( append(_,[_整数|_],L), _整数 is random(10)), L). '昇順(小→大)に並び替える'([],_整列した整数ならび,_整列した整数ならび). '昇順(小→大)に並び替える'([N|R1],L1,L) :- 挿入する(N,L1,L2), '昇順(小→大)に並び替える'(R,L2,L). 挿入する(N,L1,L2) :- append(L0,[M|R],L1), M >= N, append(L0,[N,M|R],L2),!. 挿入する(N,L1,L2) :- append(L1,[N],L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1086272325/886 # # 木に一本だけ辺をつけ加えて最長となる閉路を探すアルゴリズム # 木に一本だけ辺をつけ加えて最長となる閉路を探す(_根,_辺起点,_辺終点) :- findall([_深さ,_葉に至る経路],( 葉を捜す(_根,_葉に至る経路), length(_葉に至る経路,_深さ)), LL1), sort(LL1,LL2), reverse(LL2,LL3), 一本辺をつけ加えて閉路とする(LL3,_辺起点,_辺終点). 葉を捜す(_根,[_根|R]) :- 木(_根,_葉), 葉を捜す(_葉,R). 葉を捜す(_根,[]). 一本辺をつけ加えて閉路とする([[N,L1],[N,L2]|R],_辺起点,_辺終点) :- findall(_葉,( member([N,L],[[N,L1],[N,L2]|R]), last(L,_葉)), _葉ならび), 組合せ(_葉ならび,2,[_辺起点,_辺終点]). 一本辺をつけ加えて閉路とする([[N1,L1],[N2,L2]|R],_辺起点,_辺終点) :- \+(N1 = N2), last(L1,_辺起点), member([N2,L],[[N2,L2]|R]), last(L,_辺終点). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/839 # # MySQLです。 # テーブルから最初コラムAで並びかえて、その中の上位30個を # コラムBで並び替えた結果がほしい時はどう書けばいいのでしょうか # # SELECT * FROMT T ORDER BY A,B # だと、Aの中の同じ値の物しかBでソートされないみたいです。 # # 'テーブルから最初コラムAで並びかえて、その中の上位30個をコラムBで並び替えた結果がほしい'(_A,_B) :- length(L0,30), findsetof([_A,_B],( 'T'(_A,_B)), L1), sort(L1,L2), append(L0,_,L2), findall([_B,_A],member([_A,_B],L0),L3), sort(L3,L4), member([_B,_A],L4). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/279 # # [1] 授業単元:アルゴリズム講義及び実習I # [2] 問題文(含コード&リンク):分割統治法を用いて、n人の集団の中から、所持金が頭から数えてm番目の人を見つける # 名前、所持金、順番(m)を入力し、所持金がm番目の人の名前を出力する # '分割統治法を用いて、n人の集団の中から、所持金が頭から数えてm番目の人を見つける。名前、所持金、順番(m)を入力し、所持金がm番目の人の名前を出力する。'(_m,_名前) :- 述語として定義された節は整列できないので一旦リストに取る(L), 降順にm番目(L,_m,[_所持金,_名前]). 述語として定義された節は整列できないので一旦リストに取る(L) :- findall([_所持金,_名前],( 所持金(_名前,_所持金)), L). 降順にm番目(L1,_m番目,L) :- 降順にm番目(L1,0,_m番目,L). 降順にm番目([E|R],_m番目_1,_m番目,L) :- 降順にm番目(R,E,[],[],_m番目_1,_m番目,L). 降順にm番目([],E,L1,L2,_m番目_1,_m番目,L) :- length(L1,Len), _m番目 =< _m番目 + Len, 降順にm番目(L1,_m番目_1,_m番目,L); length(L1,Len), _m番目 is _m番目_1 + Len + 1, E = L; _m番目 >= _m番目_1, length(L1,Len1), _m番目2 is _m番目_1 + Len1 + 1, 降順にm番目(L2,_m番目2,_m番目,L). 降順にm番目([A|R1],B,L1,L2,_m番目_1,_m番目,L) :- A @>= B, 降順にm番目(R1,B,[A|L1],L2,_m番目_1,_m番目,L). 降順にm番目([A|R1],B,L1,L2,_m番目_1,_m番目,L) :- A @< B, 降順にm番目(R1,B,L1,[A|L2],_m番目_1,_m番目,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/759 # # mysqlで # SELECT * FROM table ORDER BY RAND() LIMIT 10;でランダムに抽出できることは分かりました。 # # 今度は # 値によってランダムの表示割合を変えたいんですがいい方法は無いでしょうか # 例えば # PC 値段 \90000 # TV 値段 \60000 # プリンタ 値段 \20000 # のうち、ランダムで2つ表示させるとき # 値段の高いものを比較的多めに乗せたいです。この場合だと、PCとTVを優先的に2つに表示させることになります。 # # '値段の高いものを比較的多めに抽出する'(_取得数,X) :- findall([_値段かけるランダム値,_商品名],( table(_商品名,_値段), _ランダム値 is random(6) + 1, _値段かけるランダム値 is _値段 * _ランダム値), L1), 降順に整列(L1,L3), 取得数分を切り取る(L3,L4), 整列キーを削除(L3,L4), append(_,[X|_],L4). 降順に整列(L1,L3) :- sort(L1,L2), reverse(L2,L3). 取得数分を切り取る(_取得数,L1,L) :- length(L,_取得数), append(L,_,L1). 整列キーを削除([],[]). 整列キーを削除([[_|L]|R1],[L|R2]) :- 整列キーを削除(R1,R2). % 以下のサイトは # 出典:: 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/1312201995/9 # # C言語プログラミング # [2] あるlistを読み込みアルファベット順に並び替 え標準出力するプログラムを作成せよ。 # [3.1] Windows vista # [3.2] gcc # [3.3] 言語: C # [4] 期限: 2011年8月2日 # [5] その他の制限: strcpyを使ってはいけないという制限があるんですが # 一度strcpy作ってから変 えてみたんですがいまいち分かりません、 # どうすればいいでしょうか? # http://ime.nu/codepad.org/LbBL9T3T # # 'あるlistを読み込みアルファベット順に並び替え標準出力する' :- あるlist(_list), アルファベット順に並び替え(_list,_整列したlist), 標準出力する(_整列したlist). アルファベット順に並び替え([],[]). アルファベット順に並び替え([_基礎語彙|_list],_整列したlist) :- 辞書順分割(_基礎語彙,_list,_小さいならび,_等しいか大きいならび), アルファベット順に並び替え(_小さいならび,_list_2), アルファベット順に並び替え(_等しいか大きいならび,_list_3), append(_小さいならび,[_基礎語彙|_等しいか大きいならび],_整列したlist). 辞書順分割(_,[],[],[]). 辞書順分割(_基礎語彙,[_語彙|R1],[_語彙|R2],R3) :- 辞書順で比較(_語彙,_基礎語彙,小さい), 辞書順分割(_基礎語彙,R1,R2,R3),!. 辞書順分割(_基礎語彙,[_語彙|R1],R2,[_語彙|R3]) :- 辞書順で比較(_語彙,_基礎語彙,等しいか大きい), 辞書順分割(_基礎語彙,R1,R2,R3),!. 辞書順で比較(_語彙1,_語彙2,_比較) :- atom_codes(_語彙1,Codes1), atom_codes(_語彙2,Codes2), 辞書順コード比較(Codes1,Codes2,_比較). 辞書順コード比較([],[_|_],小さい) :- !. 辞書順コード比較([_|_],[],等しいか大きい) :- !. 辞書順コード比較([A|R1],[B|R2],小さい) :- A >= 65, A =< 90, B >= 97, B =< 122, A =< B - 32,!. 辞書順コード比較([A|R1],[B|R2],等しいか大きい) :- A >= 65, A =< 90, B >= 97, B =< 122, A > B - 32,!. 辞書順コード比較([A|R1],[B|R2],小さい) :- A >= 97, A =< 122, B >= 65, B =< 90, A - 32 < B,!. 辞書順コード比較([A|R1],[B|R2],等しいか大きい) :- A >= 97, A =< 122, B >= 65, B =< 90, A - 32 >= B,!. 辞書順コード比較([A|R1],[A|R2],_比較) :- 辞書順コード比較(R1,R2,_比較). 辞書順コード比較([A|R1],[B|R2],小さい) :- A < B,!. 辞書順コード比較([A|R1],[B|R2],等しいか大きい) :- A >= B,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/797 # # 【質問テンプレ】 # [1] 授業単元: コンピュータ言語 # [2] 問題文(含コード&リンク): # ttp://uproda.2ch-library.com/408813lG9/lib408813.txt # # # # 542 # 903 # 890 # 1960 # 3 # ・ # ・ # ・ # という具合に格納されたテキストファイルがある。 # これを読み込んで数値の小さいものから昇順に並び替えて # ユーザーが好きな名前で保存できるプログラムを作成せよ。 # # この問題について、テキストファイルには何件数値が # 格納されているかはわからない状態であることを # 考慮して作成すること。 # [3] 環境 #  [3.1] OS: Windows 7 PRO #  [3.2] コンパイラ名とバージョン:visual studio #  [3.3] 言語:C言語 # [4] 期限:明日まで # [5] その他の制限: # 授業内で学んだ単純交換ソートを組み込んで作成すること。 # #define swap(type, x, y) do {type t = x; x = y; y = t; } while (0) # # void bubble(int a[], int n) # { # int i, j; # # for (i = 0; i < n - 1; i++) { # for (j = n - 1; j > i; j--) # if (a[j - 1] > a[j]) # swap(int, a[j - 1], a[j]); # } # } # # # プログラムのインタフェースは下記の例に基づいて作成すること # 実行例: # テキストファイル名を入力してください->number.txt # # ファイルの中身は以下の通りです # x[0]:504 # x[1]:4980 # x[2]:735 # x[3]:1234 # x[4]:5 # x[5]:430 #  ・ #  ・ #  ・ # # ファイルの中身を以下のようにソートしました # # x[0]:5 # x[1]:430 # x[2]:504 # x[3]:735 # x[4]:1234 # x[5]:4980 #  ・ #  ・ #  ・ # # ソートしたデータを保存します # ファイル名を入力してください->sort.txt # # sort.txtというファイル名で保存しました。 # '0から5000までの数値がランダムに一行にひとつずつ格納されたテキストファイルがある。これを読み込んで数値の小さいものから昇順に並び替えてユーザーが好きな名前で 保存する'(_テキストファイル) :- '0から5000までの数値が,ランダムに一行にひとつずつ格納されたテキストファイルを作る'(_テキストファイル), 好きな名前で保存(_好きな名前のファイル), get_integers(_テキストファイル,_整数ならび), 整列(_整数ならび,_昇順に整列した整数ならび 保存する(_好きな名前のファイル,_昇順に整列した整数ならび). '0から5000までの数値が,ランダムに一行にひとつずつ格納されたテキストファイルを作る'(_テキストファイル) :- open(_テキストファイル,write,Outstream), _値 is random(5002), '0から5000までの数値が,ランダムに一行にひとつずつ格納されたテキストファイルを作る'(Outsteam,_値), close(Outstream). '0から5000までの数値が,ランダムに一行にひとつずつ格納されたテキストファイルを作る'(Outsteam,5001) :- !. '0から5000までの数値が,ランダムに一行にひとつずつ格納されたテキストファイルを作る'(Outsteam,N) :- writef(Outstream,'%t\n',[N1]), N2 is random(5002), '0から5000までの数値が,ランダムに一行にひとつずつ格納されたテキストファイルを作る'(Outsteam,N2). 好きな名前で保存(_好きな名前のファイル) :- write('保存ファイル名を入力してください : '), get_line(_好きな名前のファイル). get_integers(_入力ファイル,_整数ならび) :- open(_入力ファイル,read,Instream), get_integers(Instream,_整数ならび), close(Instream). get_integers(Instream,[]) :- at_end_of_stream(Instream),!. get_integers(Instream,[_整数|R]) :- get_char(Instream,Char), 数値ならび(Instream,Char,_整数), get_integers(Instream,R),!. get_integers(Instream,_整数ならび) :- get_integers(Instream,_整数ならび). 数値ならび(Instream,'+',_整数) :- 数値ならび(Instream,_数値ならびの一), \+(_数値ならびの一 = []), number_chars(_整数,[+|_数値ならびの一]),!. 数値ならび(Instream,'-',_整数) :- 数値ならび(Instream,_数値ならびの一), \+(_数値ならびの一 = []), number_chars(_整数,[-|_数値ならびの一]),!. 数値ならび(Instream,A,_数値ならび) :- A @>= '0', A @=< '9', 数値ならび(Instream,_数値ならびの一), number_chars(_整数,[A|_数値ならびの一]). 数値ならび(Instream,[]) :- at_end_of_stream(Instream),!. 数値ならび(Instream,[A|R]) :- get_char(A), A @>= '0', A @=< '9', 数値ならび(Instream,R). 数値ならび(Instream,[]) :- !. 文字数値変換('0',0). 文字数値変換('1',1). 文字数値変換('2',2). 文字数値変換('3',3). 文字数値変換('4',4). 文字数値変換('5',5). 文字数値変換('6',6). 文字数値変換('7',7). 文字数値変換('8',8). 文字数値変換('9',9). 整列([],[]) :- !. 整列(L1,L2) :- L1 = [A|L1_1], 分割(A,L1_1,_より小さいならび,_等しいかより大きいならび), 整列(_より小さいならび,L3), 整列(_等しいかより大きいならび,L4), append(L3,[A|L4],L2). 分割(A,[],[],[]) :- !. 分割(A,[B|R],[B|R1],R2) :- A @> B, 分割(A,R,R1,R2),!. 分割(A,[B|R],R1,[B|R2]) :- A =< B, 分割(A,R,R1,R2),!. 保存する(_保存ファイル,L) :- open(_保存ファイル,write,Outstream), append(_,[N|R],L), writef(Outstream,'%t\n',[N]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/570 # # [2] 問題文(含コード&リンク): 以下の性能を持つ名簿プログラムを作成せよ # 氏名、年齢、住所、電話番号、メールアドレス、郵便番号を持つ構造体を使用する # 一覧を表示可能である # 作成したデータはファイルとして保存、読み込みができる # 構造体の追加、削除が可能である # 任意の項目を修正可能である # 任意の項目をキーとして検索、ソート(昇順・降順)が可能である # # % % 目標として名簿述語を呼び出す場合は、failでバックトラックさせる。この場合、 % 最終的に第一節は偽となるので、真で終了させたい場合は第二節が必要。 '名簿一覧表示' 見出し表示, 名簿(氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)), writef('%t,%t,%t,%t,%t,%t\n',[_氏名,_年齢,_住所,_電話番号,_メールアドレス,_郵便番号]), fail. '名簿一覧表示. 見出し表示 :- write('氏名,年齢,住所,電話番号,メールアドレス,郵便番号\n'). '作成したデータをファイルとして保存する'(_ファイル) :- listing(_ファイル),!. 'データをファイルから読みだして定義する'(_ファイル) :- consult(_ファイル). 構造体の追加(_氏名,_年齢,_住所,_電話番号,_メールアドレス,_郵便番号) :- assertz(名簿(氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)),!. 構造体の削除(_氏名,_年齢,_住所,_電話番号,_メールアドレス,_郵便番号) :- retract(名簿(氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)),!. '任意の項目を修正可能である'(_氏名,_年齢,_住所,_電話番号,_メールアドレス,_郵便番号,_修正項目名_修正値ならび) :- retract(名簿(氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)), 任意の項目の修正([氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)],_修正項目ならび,L), P =.. [名簿|L], asserta(P). 任意の項目の修正([],_,[]) :- !. 任意の項目の修正([_項|R1],_修正項目ならび,[_項2|R2]) :- _項 =.. [_関数名,_値1], member(_項2,_修正項目ならび), _項2 =.. [_関数名,_値2], 任意の項目の修正(R1,_修正項目ならび,R2),!. 任意の項目の修正([_項|R1],_修正項目ならび,[_項|R2]) :- 任意の項目の修正(R1,_修正項目ならび,R2),!. '任意の項目をキーとして検索、昇順ソート'(_項目名) :- 述語定義では整列できないからキーを付加しながらならびに変換(_項目名,L1), 昇順整列(L1,L2), 整列したならびを述語として定義し直す(L2). '任意の項目をキーとして検索、降順ソート'(_項目名) :- 述語定義では整列できないからキーを付加しながらならびに変換(_項目名,L1), 降順整列(L1,L2), 整列したならびを述語として定義し直す(L2). 整列したならびを述語として定義し直す(L2) :- abolish(名簿/6), append(_,[[_,氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)]|R],L2), assertz(名簿(氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)), R = [],!. 述語定義では整列できないからキーを付加しながらならびに変換(_項目名,L1) :- findall([_任意項目|L],( 名簿(氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)), _項 =.. [_項目名,_値], member(_項,[氏名(_氏名),年齢(_年齢),住所(_住所),電話番号(_電話番号),メールアドレス(_メールアドレス),郵便番号(_郵便番号)])), L1),!. 昇順整列([],[]) :- !. 昇順整列(L1,L2) :- L1 = [A|R], 昇順整列(A,R,L2). 昇順整列(A,L1,L2) :- 昇順分割(A,L1,_より小さいならび,_より大きいならび), 昇順整列(_より小さいならび,L3), 昇順整列(_より大きいならび,L4), append(L3,[A|L4],L2). 昇順分割(_,[],[],[]) :- !. 昇順分割(A,[B|R1],[B|R2],R3) :- B @=< A, 昇順分割(A,R1,R2,R3). 昇順分割(A,[B|R1],R2,[B|R3]) :- B @> A, 昇順分割(A,R1,R2,R3). 降順整列([],[]) :- !. 降順整列(L1,L2) :- L1 = [A|R], 降順整列(A,R,L2). 降順整列(A,L1,L2) :- 降順分割(A,L1,_より大きいならび,_より小さいならび), 降順整列(_より大きいならび,L3), 降順整列(_より小さいならび,L4), append(L3,[A|L4],L2). 降順分割(_,[],[],[]) :- !. 降順分割(A,[B|R1],[B|R2],R3) :- B @> A, 降順分割(A,R1,R2,R3). 降順分割(A,[B|R1],R2,[B|R3]) :- B @=< A, 降順分割(A,R1,R2,R3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/512 # # [1] 授業単元:ポインタ&配列 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/cr9HeX77 http://ime.nu/codepad.org/KRbWMvrc # [3.1] OS:WindowsXP # [3.2] コンパイラ名とバージョン: Visual Studio 2008 # [3.3] 言語:C # [4] 期限:7/ 27 15:00までです。  # 全く分からなくてほんとに困っています。誰か分かる方宜しくお願いします。 # # テキストがhttp://ime.nu/codepad.org/cr9HeX77で # 問題がhttp://ime.nu/codepad.org/KRbWMvrcです。 # # # テキストをファイルから読み込んで、その行を辞書式順序に並べ替えて # 出力するプログラムを書け. # プログラムは、下記のプログラムを書き直して提示せよ。 # # ヒント:文字列の例題を参考にして,まずテキストを配列に読み込む. # 文字列の配列を渡すとそれをソートする関数を書いて,それを用いればよい. # ファイルから読むためには、入力のリダイレクト(切り替え)を用いる. # そのためには、コマンドプロンプトで # prog< file.txt のように、コマンド名のあとに“<” # とそれに続けてファイル名を与える.英単語のファイルでテストするとよい 'テキストをファイルから読み込んで、その行を辞書式順序に並べ替えて出力する' :- get_split_lines('file.txt',['\n',' ',','],_語彙ならび), 辞書順クイックソート(_語彙ならび,_辞書順に整列した語彙ならび), 出力する(_辞書順に整列した語彙ならび). 辞書順クイックソート([],[]) :- !. 辞書順クイックソート(_ならび1,_ならび2) :- _ならび1 = [A|R], 辞書順クイックソート(A,R,_ならび2). 辞書順クイックソート(A,R,_ならび2) :- 辞書順分割(A,R,L1,R1), 辞書順クイックソート(L1,L2), 辞書順クイックソート(R1,R2), append(L2,[A|R2],_ならび2). 辞書順分割(A,[],[],[]) :- !. 辞書順分割(A,[B|R1],[B|R2],R3) :- 辞書順コード比較(A,B), 辞書順分割(A,R1,2,R3),!. 辞書順分割(A,[B|R1],R2,[B|R3]) :- \+(辞書順コード比較(A,B)), 辞書順分割(A,R1,R2,R3),!. 辞書コード比較(_文字列1,_文字列2) :- atom_to_codes(_文字列1,Codes1), 辞書順用にコード列を変換する(Codes1,_変換されたCodes1), atom_to_codes(_文字列2,Codes2), 辞書順用にコード列を変換する(Codes2,_変換されたCodes2), _変換されたCoode1 @> _変換されたCodes2,!. 辞書順用にコード列を変換する([],[]) :- !. 辞書順用にコード列を変換する([A|R1],[B|R2]) :- A >= 32, A =< 90, B is (A + 32) * 10, 辞書順用にコード列を変換する(R1,R2),!. 辞書順用にコード列を変換する([A|R1],[B|R2]) :- B is A * 10 + 1, 辞書順用にコード列を変換する(R1,R2),!. 辞書順用にコード列を変換する([A|R1],[B|R2]) :- B is A * 10, 辞書順用にコード列を変換する(R1,R2),!. 出力する(_辞書順に整列した語彙ならび) :- open('file.txt',write,Outstream), append(_,[_語彙|R],_辞書順に整列した語彙ならび), writef(Outstream,'%t\n',[_語彙]), R = [], close(Outstream),!. % 以下のサイトは # 出典:: 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/36 # # [1] 授業単元:構造体の配列利用 # [2] 問題文(含コード&リンク): # #include <stdio.h> # /* 配列arrayの要素数 */ # #define ELENUM(array) (sizeof(array) / sizeof((array)[0])) # #define SIZE_DATA (10) /* データ数 */ # # struct Address_data{ # char name[81]; # char phone[20]; # int age; # }; # # int main(void) # { # struct Address_data data[SIZE_DATA], *p = data; # printf("Input end = Ctrl + D\n"); # /* 配列初期化(入力プロンプトより前に置くべき?) */ # for (p = data; p - data < ELENUM(data); p++) { # p->age = -1; # } # /* 入力処理 */ # for (p = data; p - data < ELENUM(data); p++) { # printf("[%d]name phone age = ", p - data); # if (scanf("%s %s %d", p->name, p->phone, &p->age) != 3) { # break; # } # } # putchar('\n'); # /* 表示 */ # for (p = data; p->age >= 0; p++) { # printf("%s\t(%d)\t[%s]\n", p->name, p->age, p->phone); # } # return 0; # } # 表示を行う際に、年齢順に表示するようにしたい。 # 配列の並び替えを行なって表示するようにプログラムを拡張しなさい # データ数(10). 入力処理(L) :- データ数(_データ数), length(L,_データ数), findall([_名前,_年齢,_電話番号],( append(_,[_|_],L), '名前・年齢・電話番号の入力'(_名前,_年齢,_電話番号)), L). '名前・年齢・電話番号の入力'(_名前,_年齢,_電話番号) :- write('名前・年齢・電話番号をカンマ区切りで入力してください '), get_line(Line), split(Line,[',',' '],[_名前,_年齢,_電話番号]). 年齢順にデータを表示(L) :- 年齢をキーとする(L,L2), sort(L2,L3), キーを外す(L3,L4), データを表示(L4). 年齢をキーとする([],[]) :- !. 年齢をキーとする([[_名前,_年齢,_電話番号]|R1],[[_年齢,_名前,_年齢,_電話番号]|R2]) :- 年齢をキーとする(R1,R2). 年齢キーを外す([],[]). 年齢キーを外す([[_|L]|R1],[L|R2]) :- 年齢キーを外す(R1,R2). データを表示(L) :- append(_,[[_名前,_年齢,_電話番号]|R],L), writef('%t,%t,%t\n',[_名前,_年齢,_電話番号]), R = []. sort([],[]) :- !. sort([A|R1],L) :- partition(A,R1,L1,L2), sort(L1,L11), sort(L2,L22), append(L11,[A|L22],L). partition(_,[],[],[]) :- !. partition(A,[B|R1],[B|R2],R3) :- B @< A, partition(A,R1,R2,R3),!. partition(A,[B|R1],R2,[B|R3]) :- B @>= A, partition(A,R1,R2,R3),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/535 # # 関連性がないけど取得したデータ型が同じ2つのSELECT文を結合させるにはどうしたらいいでしょうか? # # SELECT 1 # SELECT int_column AS A, timestamp_column AS B FROM table1 # # A     B # 10 2011-07-11 # # SELECT 2 # SELECT int_column AS A timestamp_column AS B FROM table2 # # A     B # 5  2011-07-10 # 10 2011-07-13 # # これをA-Bの順番にソートして # # A     B # 5  2011-07-10 # 10  2011-07-11 # 10  2011-07-13 # # こんな感じの1つのテーブルにしたいのですが、よろしくお願いします。 # # '関連性がないけど取得したデータ型が同じ2つのSELECT文を結合する'(X) :- findall([_table1_A,_table1_B],table1(_table1_A,_table1_B),LL1), findall([_table2_A,_table2_B],table2(_table2_A,_table2_B),LL2), append(LL1,LL2,LL3), sort(LL3,LL), append(_,[X|R],LL). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/586 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://codepad.org/3dkRTmjJ # # 生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。 # このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人の # BMI値および肥満か否かを列挙するプログラムkadai13-1.cを書きなさい。 # ただし、wh-list.datに列挙される人数はプログラム開発時点では全く分から # ないものとする。 # # ヒント: # ○何をしなければならないかを大まかに書き下してみよう。 #  1. ファイルのオープン(これに先立ってファイル名を取得する必要がある) #  2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう) #  3.データの読み込み #  4.BMIの算出 #  5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい) #  6. 画面表示 # # ○BMIとは? # BMIは次のようにして計算されるものとする。 # BMI値=体重(キログラム)÷(身長(メートル))^2 # '^2'は二乗を意味する。 # このBMI値が25を越えると、肥満とみなされる。 # # ○ファイルポインターがファイルの中間もしくは終わりをさしている時、これをファイルの先頭に戻す関数があります。 # rewind(FILE *stream); # # ○wh-list.dat の中身は以下の通りで、氏名 身長(cm) 体重(kg)が列挙されている。 # yamada 157 62.5 # tanaka 180 45.1 # yoneda 190 50.5 # yamashita 210 80.5 # toyama 140 80 # .... # # ○例えば画面表示は # toyama BMI=40.816326 himan # nagashima BMI=29.551020 himan # yamashita BMI=27.777779 himan # takenaka BMI=27.716263 himan # . # 中略 # . # nakano BMI=23.179012 # yamashita BMI=18.253969 # . # . # # 等と表示されるものとする。 # '生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する' :- user_parameters([_ファイル名]), 'ファイルのオープン(これに先立ってファイル名を取得する必要がある)'(_ファイル名,Instream), データの読み込み(Instream,Lines), 'BMIの算出と判定'(Lines,_BMIと判定ならび), 'BMIの大きい者順に並べ替える'(_BMIと判定ならび,_降順に整列したBMIと判定ならび), 画面表示(_降順に整列したBMIならび),!. 'ファイルのオープン(これに先立ってファイル名を取得する必要がある)'(_ファイル名,Instream) :- open(_ファイル名,read,Instream),!. データの読み込み(Instream,Lines) :- get_lines(Instream,Lines),!. 'BMIの算出と判定'([],[]) :- !. 'BMIの算出と判定'([Line|R1],[[_BMI,_名前,_判定]|R2]) :- split(Line,[' '],[_名前,_身長単位センチメートル,_体重]), _身長単位メートル is _身長単位センチメートル / 100, 'BMI値=体重(キログラム)÷(身長(メートル))^2'(_体重,_身長単位メートル,_BMI値), 'BMI値が25を越えると、肥満とみなされる'(_BMI値,_判定), 'BMIの算出と判定'(R1,R2). 'BMI値=体重(キログラム)÷(身長(メートル))^2'(_体重,_身長,_BMI値) :- _BMI値 is _体重 * _身長 ^ 2. 'BMI値が25を越えると、肥満とみなされる'(_BMI値,肥満) :- _BMI値 > 25,!. 'BMI値が25を越えると、肥満とみなされる'(_BMI値,''). 'BMIの大きい者順に並べ替える'(_BMIならび,_降順に整列したBMIならび) :- バブルソート(_BMIならび,_昇順に整列したBMIならび), reverse(_昇順に整列したBMIならび,_降順に整列したBMIならび). バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一), !, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). 画面表示(_降順に整列したBMIならび) :- append(_,[[_BMI,_名前,_判定]|R],_降順に整列したBMIならび), writef('%t %t %t\n',[_名前,_BMI,_判定]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/549 # # [1] 授業単元:演習 # [2] 問題文(含コード&リンク):http://pastebin.com/index/sg6akdN0 # 標準入力から「id, 名前, 年月日, 住所」のようなコンマ区切形式 (CSV 形式) の名簿データを受け付けて, # 項目を切り出してメモリ中に格納する.また,% で始まる入力行をコマンド入力として解釈し,格納されたデータを表示や整列する # '標準入力から「id, 名前, 年月日, 住所」のようなコンマ区切形式 (CSV 形式) の名簿データを受け付けて,項目を切り出してメモリ中に格納する.また,% で始まる入力行をコマンド入力として解釈し,格納されたデータを表示や整列する' :- get_line(Line), テキストの解析処理(Line,1,[]). テキストの解析処理(end_of_file,N,_オプションモード) :- \+member(整列,_オプションモード)),!. テキストの解析処理(end_of_file,N,_オプションモード) :- member(整列,_オプションモード), 名簿データをならびに変換(LL1), sort(LL1,LL2), 整列した名簿の表示(LL2),!. テキストの解析処理(_行,N,_オプションモード) :- コメント行(_行,_オプションモード,_オプションモードのニ), get_line(_行2), テキストの解析処理(_行2,N,_オプションモードのニ),!. テキストの解析処理(_行,N,_オプションモード) :- 'CSV行'(_行,_オプションモード), get_line(_行2), N2 is N + 1, テキストの解析処理(_行2,N2,_オプションモード). コメント行(_行,_オプションモード,_オプションモードのニ) :- sub_atom(_行,0,1,R,'%'), sub_atom(_行,1,R,0,_残り文字列), split(_残り文字列,[' ',','],L), コメント行解析(L,_オプションモード,_オプションモードのニ). 'CSV行'(_行,N,_オプションモード) :- member(表示,_オプションモード), writef('%t: %t\n',[N,_行]), split(_行,[','],[_id,_名前,_年月日,_住所]), assertz(名簿データ(_id,_名前,_年月日,_住所)), writef('%q\n',[名簿データ(_id,_名前,_年月日,_住所)]),!. 'CSV行'(_行,N,_オプションモード) :- \+(member(表示,_オプションモード)), split(_行,[','],[_id,_名前,_年月日,_住所]), assertz(名簿データ(_id,_名前,_年月日,_住所)),!. コメント行解析([],_オプションモード,_オプションモード) :- !. コメント行解析([非表示|R],_オプションモード,_オプションモードのニ) :- ならびから削除(表示,_オプションモード,_オプションモードの一), コメント行解析(R,_オプションモードの一,_オプションモードのニ),!. コメント行解析([_コマンド|R],_オプションモード,_オプションモードのニ) :- \+(member(_コマンド|_オプションモード)), コメント行解析(R,[_コマンド|_オプションモード],_オプションモードのニ). コメント行解析([_コマンド|R],_オプションモード,_オプションモードのニ) :- member(_コマンド|_オプションモード), コメント行解析(R,_オプションモード,_オプションモードのニ). 名簿データをならびに変換(LL) :- findall([_id,_名前,_年月日,_住所],( 名簿データ(_id,_名前,_年月日,_住所)), LL),!. 整列した名簿の表示(LL) :- append(_,[L|R],LL), writef('%t,%t,%t,%t\n',L), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/347 # # [1] 授業単元:整列処理 # [2] 問題文(含コード&リンク): http://codepad.org/afHWYPLF # 問題が3問あります。長いので問題文もリンク先に書かせていただきました。 # # 【問題3】 # クイックソートプログラムとバブルソートプログラムについて、同一のデータについて実行時間を測定して # 比較し考察せよ。データ数が、5千個、1万個、2万個、4万個、8万個の5つの場合について、それぞれ実行時間を計測する。 # <注意>比較、交換の回数を計数するプログラムは削除する事。 # 実行時間の測定はclock関数を使用すればよい。使用方法は図6に示すとおり。ただし<time.h>をインクルードすること。 # # レポートには以下のものを添付する事。 # (1)クイックソートプログラムと実行時間を測定するプログラムを追加したmain関数のプログラムリスト # (2)バブルソートプログラムと実行時間を測定するプログラムを追加したmain関数のプログラムリスト # (3)両プログラムの実行結果(実行時間) # (4)実行結果に関する考察 # # 図6 # clock関数の使用例 # #include # void main() # { # int i; # int a[]={10,9,8,7,6,5,4,3,2,1}; # time_t start,end; # start=clock(); # quick_sort(a,0,NUM-1); # end=clock(); # printf("計算時間は%.3f秒です\n\n",(float)((end-start)/CLOCKS PER SEC); クイックソートとバブルソートの実行速度比較 :- append(_,[[_試行回数,_データ数]|R],[[5000,30],[10000,30],[20000,30],[40000,30],[80000,30],[500,100],[100,100],[200,100],[400,100],[800,100]]), クイックソートとバブルソートの実行速度比較(_試行回数,_データ数,_実行時間_1,_実行時間_2), writef('データ数=%t,試行回数=%t,クイックソート=%t秒,バブルソート=%t秒\n',[_データ数,_試行回数,_実行時間_1,_実行時間_2]), R = []. クイックソートとバブルソートの実行速度比較(_試行回数,_データ数,_実行時間_1,_実行時間_2) :- length(L,_データ数), findall(N,( append(_,[_|_],L), N is random(100)), _データ), クイックソートの実行速度(_試行回数,_データ,_実行時間_1), バブルの実行速度(_試行回数,_データ,_実行時間_2),!. クイックソートの実行速度(_試行回数,_データ,_実行時間) :- A is cputime, for(1,N,_試行回数), quicksort(_データ,_), N = _試行回数, B is cputime, _実行時間 is B - A,!. バブルの実行速度(_試行回数,_データ,_実行時間) :- A is cputime, for(1,N,_試行回数), バブルソート(_データ,_), N = _試行回数, B is cputime, _実行時間 is B - A,!. quicksort([X|Xs],Ys) :- partition(Xs,X,Littles,Bigs), quicksort(Littles,Ls), quicksort(Bigs,Bs), append(Ls,[X|Bs],Ys). quicksort([],[]). partition([X|Xs],Y,[X|Ls],Bs) :- X @=< Y, partition(Xs,Y,Ls,Bs). partition([X|Xs],Y,Ls,[X|Bs]) :- X @> Y, partition(Xs,Y,Ls,Bs). partition([],Y,[],[]). バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一),!, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/347 # # [1] 授業単元:整列処理 # [2] 問題文(含コード&リンク): http://codepad.org/afHWYPLF # 問題が3問あります。長いので問題文もリンク先に書かせていただきました。 # # # # 【問題2】 # クイックソート法の特性を調べたい。同一の数列について、クイックソートプログラムの実行中に行われる # (1)比較の回数、(2)交換の回数を計数し、次にバブルソートプログラムの実行中に行われる # (1)比較の回数、(2)交換の回数を計数して比較せよ。また、バブルソート法よりクイックソート法の方が # 比較と交換の回数が少ない理由を考察せよ。ただし、数列はrand関数を用いて生成せよ。データの個数が、 # 20個、40個、60個、80個、100個の5つの場合について、比較と交換の回数を計数する。 # #    計数結果の出力形式 #    <クイックソート法> #     データ数:20個 #     比較回数:xxxx回 #     交換回数:xxxx回 # #     データ数:40個 #     比較回数:xxxx回 #     交換回数:xxxx回 #      ・ #      ・ #      ・ #      ・ #    <バブルソート法> #     データ数:20個 #     比較回数:xxxx回 #     交換回数:xxxx回 # #     データ数:40個 #     比較回数:xxxx回 #     交換回数:xxxx回 #      ・ #      ・ #      ・ #      ・ # # レポートには以下のものを添付する事。 # (1)回数を計数するプログラムを加えたバブルソートプログラムと、それを実行するmain関数のプログラムリスト # (2)回数を計数するプログラムを加えたクイックソートプログラムと、それを実行するmain関数のプログラムリスト # (3)出力形式に基づいた両プログラムの計数結果 # (4)バブルソート法よりクイックソート法の比較、交換の回数が少ない理由 # # rand関数の使用例 # #include # #include # int main(void) # { # int i,n,ran,sum; # srand(time(NULL)); # printf("Number of trials:"); # scanf("%d",&n); # sum=0; # for(i=0;i= B, 分割(A,R1,LP_1,LP_2,_比較回数2,_移動回数2), _比較回数1 is _比較回数2 + 1, _移動回数1 is _移動回数2 + 1,!. 分割(A,[B|R1],LP_1,[B|LP_2],_比較回数1,_移動回数1) :- A @< B, 分割(A,R1,LP_1,LP_2,_比較回数2,_移動回数2), _比較回数1 is _比較回数2 + 2, _移動回数1 is _移動回数2 + 1,!. 結合([],Y,Y,1,1) :- !. 結合([U|X],Y,[U|Z],_比較回数,_移動回数1) :- 結合(X,Y,Z,_比較回数,_移動回数2), _移動回数1 is _移動回数2 + 1,!. 'バブルソートの比較・移動回数'(_対象ならび,_整列済みならび,_比較回数,_交換回数) :- 交換(_対象ならび,_対象ならびの一,_比較回数1,_交換回数1),!, バブルソート(_対象ならびの一,_整列済みならび,_比較回数2,_交換回数2), _比較回数 is _比較回数1 + _比較回数2, _交換回数 is _交換回数1 + _交換回数2,!. 'バブルソートの比較・移動回数'(_整列済みならび,_整列済みならび,_比較回数,0) :- length(_整列済みならび,_比較回数),!. 交換([A,B|R],[B,A|R],1,1) :- A @> B,!. 交換([A|R1],[A|R2],_比較回数1,_交換回数) :- 交換(R1,R2,_比較回数2,_交換回数), _比較回数1 is _比較回数2 + 2,!. 交換([],[],_,_) :- !,fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/483 # # 全校学生健康診断表で # 身長の高い人50人を選ぶ場合 # select 学生ID, 学生名, 学生身長 from 健康診断表 order by 学生身長 desc limit 50 # とかでいいと思いますが # その次の50人を選ぶ場合はどうしたらいいのでしょうか? # # 身長の高い人50人づつ選ぶ場合 :- findall([_学生身長,_学生ID,_学生名],( 健康診断表(_学生ID,_学生名,_学生身長)), LL1), sort(LL1,LL2), reverse(LL2,LL3), 身長の高い人50人を選ぶ(LL3). 身長の高い人50人を選ぶ(LL) :- length(LL0,50), append(LL0,LL2,LL), append(_,[[_学生身長,_学生ID,_学生名]|R],LL0), writef('%t,%t,%t\n',[_学生ID,_学生名,_学生身長]), R = []. 身長の高い人50人を選ぶ(LL) :- length(LL0,50), append(LL0,LL2,LL), 身長の高い人50人を選ぶ(LL2). 身長の高い人50人を選ぶ(LL) :- append(_,[[_学生身長,_学生ID,_学生名]|R],LL), writef('%t,%t,%t\n',[_学生ID,_学生名,_学生身長]), R = []. 身長の高い人50人を選ぶ([]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/347 # # [1] 授業単元:整列処理 # [2] 問題文(含コード&リンク): http://codepad.org/afHWYPLF # 問題が3問あります。長いので問題文もリンク先に書かせていただきました。 # # # # 【問題2】 # クイックソート法の特性を調べたい。同一の数列について、クイックソートプログラムの実行中に行われる # (1)比較の回数、(2)交換の回数を計数し、次にバブルソートプログラムの実行中に行われる # (1)比較の回数、(2)交換の回数を計数して比較せよ。また、バブルソート法よりクイックソート法の方が # 比較と交換の回数が少ない理由を考察せよ。ただし、数列はrand関数を用いて生成せよ。データの個数が、 # 20個、40個、60個、80個、100個の5つの場合について、比較と交換の回数を計数する。 # #    計数結果の出力形式 #    <クイックソート法> #     データ数:20個 #     比較回数:xxxx回 #     交換回数:xxxx回 # #     データ数:40個 #     比較回数:xxxx回 #     交換回数:xxxx回 #      ・ #      ・ #      ・ #      ・ #    <バブルソート法> #     データ数:20個 #     比較回数:xxxx回 #     交換回数:xxxx回 # #     データ数:40個 #     比較回数:xxxx回 #     交換回数:xxxx回 #      ・ #      ・ #      ・ #      ・ # # レポートには以下のものを添付する事。 # (1)回数を計数するプログラムを加えたバブルソートプログラムと、それを実行するmain関数のプログラムリスト # (2)回数を計数するプログラムを加えたクイックソートプログラムと、それを実行するmain関数のプログラムリスト # (3)出力形式に基づいた両プログラムの計数結果 # (4)バブルソート法よりクイックソート法の比較、交換の回数が少ない理由 # # rand関数の使用例 # #include # #include # int main(void) # { # int i,n,ran,sum; # srand(time(NULL)); # printf("Number of trials:"); # scanf("%d",&n); # sum=0; # for(i=0;i= B, 分割(A,R1,LP_1,LP_2,_比較回数2,_移動回数2), _比較回数1 is _比較回数2 + 1, _移動回数1 is _移動回数2 + 1,!. 分割(A,[B|R1],LP_1,[B|LP_2],_比較回数1,_移動回数1) :- A @< B, 分割(A,R1,LP_1,LP_2,_比較回数2,_移動回数2), _比較回数1 is _比較回数2 + 2, _移動回数1 is _移動回数2 + 1,!. 結合([],Y,Y,1,1) :- !. 結合([U|X],Y,[U|Z],_比較回数,_移動回数1) :- 結合(X,Y,Z,_比較回数,_移動回数2), _移動回数1 is _移動回数2 + 1,!. 'バブルソートの比較・移動回数'(_対象ならび,_整列済みならび,_比較回数,_交換回数) :- 交換(_対象ならび,_対象ならびの一,_比較回数1,_交換回数1),!, バブルソート(_対象ならびの一,_整列済みならび,_比較回数2,_交換回数2), _比較回数 is _比較回数1 + _比較回数2, _交換回数 is _交換回数1 + _交換回数2,!. 'バブルソートの比較・移動回数'(_整列済みならび,_整列済みならび,_比較回数,0) :- length(_整列済みならび,_比較回数),!. 交換([A,B|R],[B,A|R],1,1) :- A @> B,!. 交換([A|R1],[A|R2],_比較回数1,_交換回数) :- 交換(R1,R2,_比較回数2,_交換回数), _比較回数1 is _比較回数2 + 2,!. 交換([],[],_,_) :- !,fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/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/328 # # [1]授業単元:アルゴリズム概論 # [2]課題:次の関数は引数で与えられた配列を整列するものである。 # コードを補って完成させなさい。 # # void sort(int[] a,int lengh){ # int tmp,i; # ここにコードを追加して完成させる。 # # } # [3] C言語 # [4] 7/31まで # [5] # ・降順(大きいもの順)に整列すること # ・ローカル変数やグローバル変数を追加しないこと # ・lengthが負の値の時はなにもしないこと # ・関数を呼び出さないこと # # よろしくお願いします。(前期単位がかかってます) # # 標準入出力による整列(_length) :- length(L,_lenght), _length > 0, 標準入力からの入力(L), 降順に整列しながら標準出力に出力(L). 標準入力からの入力(L) :- findall(_data,( readln([_data]), append(_,[_|_],L)), L). 降順に整列しながら標準出力に出力([]) :- write('\n'),!. 降順に整列しながら標準出力に出力(L) :- append(L0,[A|R],L), \+((member(B,L0),B @> A)), \+((member(C,R),C @> A)), writef('%t ',[A]), append(L0,R,L2), 降順に整列しながら標準出力に出力(L2). % 以下のサイトは # 出典:: 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://pc12.2ch.net/test/read.cgi/tech/1260532772/487 # [1] 授業単元:計算機入門及び演習 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10311.txt # # 以下の問題を解くプログラムをC言語を用いて作成しなさい. # # AさんとBさんは点数が書かれたカードを何枚か持っている. Aさんのカードと # Bさんのカードを1枚ずつ交換して,Aさんの持つカードの合計点数とBさんの持つ # カード合計点数が等しくなるようにしたい. # このときどのカードとどのカードを交換したらよいか.ただし,カードを # 交換しなくても合計点数が等しい場合でも,必ずカードの交換を行うものとする. # # 入力は,いくつかのデータセットからなる.各データセットは次の形式で与えられる. n m # s1 # s2 # ... # sn # sn+1 # sn+2 # ... # sn+m # 各データセットの最初の行は空白ひとつで区切られたふたつの数 n と m を含み, # n はAさんのカードの枚数,m はBさんのカードの枚数を表す.続く n+m 行には, # 各カードの点数が 1 行にひとつずつ並ぶ. # 最初の n 個の点数 (s1 から sn まで) はAさんのカードの点数,残りの # m 個の点数 (sn+1 から sn+m まで) はBさんのカードの点数を表す. # n および m は 100 以下の正の整数とし,カードの点数は 0 以上 100 以下の # 整数値とする.入力の終わりは,空白ひとつで区切られたふたつの 0 を含む # 1 行で示される. # 各データセットに対し,Aさん,Bさんの交換前のすべてのカードと交換すべき2つの # カードを出力すること.形式は特に問わない(実行例を参考にすること). # なお,合計を等しくするようなカードの交換の方法が複数ある場合は, # 交換するカードの点数の和が最小となるもののみを出力すること. # また,カードの点数の合計を等しくするような交換が存在しない場合はその旨を # 出力すること. # 'AさんとBさんは点数が書かれたカードを何枚か持っている. AさんのカードとBさんのカードを1枚ずつ交換して,Aさんの持つカードの合計点数とBさんの持つカード合計点数が等しくなるようにする'(LA,LB,LX) :- quicksort(LA,LA1), quicksort(LB,LB1), length(LA1,LenA), length(LB1,LenB), append(LA1,LB1,L), findall([L1,L2],( 組合せ(L,LenA,L1), sum(L1,Sum), 'L1分をLから取り除く'(L1,L,L3), 組合せ(L3,LenB,L2),sum(L2,Sum)), LX), 最短手順を探る(LA1,LX,_交換候補). 'L1分をLから取り除く'([],L,L) :- !. 'L1分をLから取り除く'([A|R1],L1,L2) :- 'AをL1から取り除く'(A,L1,L3), 'L1分をLから取り除く'(R1,L3,L2). 'AをL1から取り除く'(A,L1,L2) :- append(L0,[A|R],L1), append(L0,R,L2),!. sum([],0) :- !. sum([A|R],X) :- sum(R,Y), X is A + Y. 最短手順を探る(LA1,LL,_放出,_受け取り) :- findall([_放出,_受取],( append(_,[[L1,_]|_],LL), 交換候補(LA1,L1,_放出,_受取)), LX), findmin(Len,( append(_,[[U1,U2]|_],LX), length(U1,Len)), Min), append(_,[[_放出,_受け取り]|_],LX), length(U1,Min). 交換候補([],L,[],L) :- !. 交換候補(L,[],L,[]) :- !. 交換候補([A|R1],[A|R2],R3,R4) :- 交換候補(R1,R2,R3,R4),!. 交換候補([A|R1],[B|R2],[A|R3],R4) :- A < B, 交換候補(R1,[B|R2],R3,R4),!. 交換候補([A|R1],[B|R2],R3,[B|R4]) :- A > B, 交換候補([A|R1],R2,R3,R4),!. % 以下のサイトは # 問4 # # 以下のプログラムを作成せよ. # # 入力 # 正整数n,ならびにn個の名前と電話番号の組,および文字列. # ただし,いずれの入力文字列も長さ20以下と仮定して良い. # 処理 # 構造体型配列で電話帳を作成し,名前をキーとして, # 文字列がselectionのときは選択ソート,文字列がbubbleのときは # バブルソートをする. # 出力 # 名前をキーとして辞書順にソートされた電話帳.同名の人は,どの順序に # 出力してもよい. # # 実行例 # 人数 > 2 # 0人目:名前 > bbb # 電話番号 > 111 # 1人目:名前 > aaa # 電話番号 > 222 # # 文字列 > selection # # aaa, 222 # bbb, 111 # # 実行例 # 人数 > 5 # 0人目:名前 > Taro # 電話番号 > 090-111-1111 # 1人目:名前 > Hanako # 電話番号 > 090-222-2222 # 2人目:名前 > Ichiro # 電話番号 > 090-333-3333 # 3人目:名前 > Jiro # 電話番号 > 090-444-4444 # 4人目:名前 > Hanayo # 電話番号 > 090-555-5555 # # 文字列 > bubble # # Hanako, 090-222-2222 # Hanayo, 090-555-5555 # Ichiro, 090-333-3333 # Jiro, 090-444-4444 # Taro, 090-111-1111 プログラム :- 入力(_正整数n,_n個の名前ならび,_電話番号の組,_および文字列), 処理(_文字列,_n個の名前と電話番号の組,_名前をキーとして整列されたn個の名前と電話番号の組), 出力(_名前をキーとして整列されたn個の名前と電話番号の組). 入力(_正整数n,_n個の名前ならび,_電話番号の組,_および文字列) :- '正整数n,ならびにn個の名前と電話番号の組,および文字列.ただし,いずれの入力文字列も長さ20以下と仮定して良い.'(_正整数n,_n個の名前ならび,_電話番号の組,_および文字列). '正整数n,ならびにn個の名前と電話番号の組,および文字列.ただし,いずれの入力文字列も長さ20以下と仮定して良い.'(_正整数n,_n個の名前ならび電話番号の組,_および文字列) :- 正整数nの入力(_正整数n), n個の名前と電話番号の組の入力(_正整数n,_n個の名前と電話番号の組), および文字列の入力(_文字列). '正整数nの入力'(_正の整数n) :- write('正の整数を入力してください : '), get_integer(_正の整数n), _正の整数n > 0,!. n個の名前と電話番号の組の入力(_正整数n,_n個の名前と電話番号の組) :- length(_n個の名前と電話番号の組,_正整数n), findall([_名前,_電話番号],( append(L0,[_|_],_n個の名前と電話番号の組), length([_|L0],_人目), writef('%t人目 : ',[_人目]), 名前の入力(_名前), 電話番号の入力(_電話番号)), _n個の名前と電話番号の組). 名前の入力(_名前) :- write('名前を入力してください : '), get_line(_名前). 電話番号の入力(_電話番号) :- write('電話番号を入力してください : '), get_line(_電話番号). および文字列の入力(_文字列) :- write('selection or bubble : '), get_line(_文字列). 処理(_文字列,_n個の名前と電話番号の組,_名前をキーとして整列されたn個の名前と電話番号の組) :- '名前をキーとして,文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをする.'.(_文字列,_n個の名前と電話番号の組,_名前をキーとして整列されたn個の名前と電話番号の組). '名前をキーとして,文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをする.'(selection,_n個の名前と電話番号の組,_名前をキーとして整列されたn個の名前と電話番号の組) :- 選択ソート(_n個の名前と電話番号の組,_名前をキーとして整列されたn個の名前と電話番号の組). '名前をキーとして,文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをする.'(bubble,_n個の名前と電話番号の組,_名前をキーとして整列されたn個の名前と電話番号の組) :- バブルソート(_n個の名前と電話番号の組,_名前をキーとして整列されたn個の名前と電話番号の組). 出力(_名前をキーとして整列されたn個の名前と電話番号の組) :- '名前をキーとして辞書順にソートされた電話帳.同名の人は,どの順序に出力してもよい.'(_名前をキーとして整列されたn個の名前と電話番号の組). '名前をキーとして辞書順にソートされた電話帳.同名の人は,どの順序に出力してもよい.'(_名前をキーとして整列されたn個の名前と電話番号の組) :- append(_,[[_名前,_電話番号]|R],_名前をキーとして整列されたn個の名前と電話番号の組), writef('%t, %t\n',[_名前,_電話番号]), R = []. 選択ソート([A],[A]) :- !. 選択ソート(L1,[N|R2]) :- append(L0,[N|R],L1), \+((member(N1,L0),N1 @> N)), \+((member(N2,R),N2 @> N)), swap(L0,[N|R],R1), 選択ソート(R1,R2). swap([],[N|R],R) :- !. swap(L0,[N|R],R1) :- L0=[S|R0], append(R0,[S|R],R1). バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一),!, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). % 以下のサイトは # 問3 # 正整数n,n個の長さ20以下の文字列,および文字列sを読み込み, # 文字列sがselectionのときは選択ソート,文字列がbubbleのときは # バブルソートをして,文字列型配列を辞書順に出力するプログラムを作成せよ. # 文字列を入れ替えるのに,以下の関数swap()を用いてもよい. # # 実行例 # 整数 > 3 # 0番目の文字列 > b # 1番目の文字列 > c # 2番目の文字列 > a # 文字列 > bubble # a # b # c # # # 実行例 # 整数 > 7 # 0番目の文字列 > Blake # 1番目の文字列 > Leighton # 2番目の文字列 > Taylor # 3番目の文字列 > Jessica # 4番目の文字列 > Penn # 5番目の文字列 > Chace # 6番目の文字列 > Ed # 文字列 > selection # Blake # Chace # Ed # Jessica # Leighton # Penn # Taylor # '正整数n,n個の長さ20以下の文字列,および文字列sを読み込み,文字列sがselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして,文字列型配列を辞書順に出力する' :- '正整数nの読み込み'(_正の整数n), 'n個の長さ20以下の文字列の読み込み'(_正の整数n,_n個の長さ20以下の文字列ならび), 'および文字列sを読み込み'(_文字列s), '文字列sがselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして,文字列型配列を辞書順に出力する'(_文字列s,_n個の長さ20以下の文字列ならび). '正整数nの読み込み'(_正の整数n) :- write('正の整数を入力してください : '), get_integer(_正の整数n), _正の整数n > 0,!. 'n個の長さ20以下の文字列の読み込み'(_正の整数n,_n個の長さ20以下の文字列ならび) :- length(_n個の長さ20以下の文字列ならび,_正の整数n), findall(_文字列,( append(L0,[_|_],_n個の長さ20以下の文字列ならび), get_line(_文字列)), _n個の長さ20以下の文字列ならび). '文字列sがselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして,文字列型配列を辞書順に出力する'(selection,_n個の長さ20以下の文字列ならび) :- 選択ソート(_n個の長さ20以下の文字列ならび,_辞書順に整列されたn個の長さ20以下の文字列ならび), 出力する(_辞書順に整列されたn個の長さ20以下の文字列ならび). 出力する(_辞書順に整列されたn個の長さ20以下の文字列ならび) :- append(_,[_文字列|R],_辞書順に整列されたn個の長さ20以下の文字列ならび), writef('%t\n',[_文字列]), R = []. 辞書順選択ソート([A],[A]) :- !. 辞書順選択ソート(L1,[_文字列|R2]) :- append(L0,[_文字列|R],L1), \+((member(文字列1,L0),辞書コード比較(_文字列,_文字列1))), \+((member(文字列2,R),辞書コード比較(_文字列,_文字列2))), swap(L0,[_文字列|R],R1), 辞書順選択ソート(R1,R2). swap([],[N|R],R) :- !. swap(L0,[N|R],R1) :- L0=[S|R0], append(R0,[S|R],R1). 辞書順バブルソート(_対象ならび,_整列済みならび) :- 辞書順交換(_対象ならび,_対象ならびの一),!, 辞書順バブルソート(_対象ならびの一,_整列済みならび). 辞書順バブルソート(_整列済みならび,_整列済みならび). 辞書順交換([],[]) :- !,fail. 辞書順交換([A,B|R],[B,A|R]) :- 辞書コード比較(A,B),!. 辞書順交換([A|R1],[A|R2]) :- 辞書順交換(R1,R2). 辞書コード比較(_文字列1,_文字列2) :- atom_to_codes(_文字列1,Codes1), 辞書順用にコード列を変換する(Codes1,_変換されたCodes1), atom_to_codes(_文字列2,Codes2), 辞書順用にコード列を変換する(Codes2,_変換されたCodes2), _変換されたCoode1 @> _変換されたCodes2,!. 辞書順用にコード列を変換する([],[]) :- !. 辞書順用にコード列を変換する([A|R1],[B|R2]) :- A >= 32, A =< 90, B is (A + 32) * 10, 辞書順用にコード列を変換する(R1,R2),!. 辞書順用にコード列を変換する([A|R1],[B|R2]) :- B is A * 10 + 1, 辞書順用にコード列を変換する(R1,R2),!. 辞書順用にコード列を変換する([A|R1],[B|R2]) :- B is A * 10, 辞書順用にコード列を変換する(R1,R2),!. % 以下のサイトは # 問2 # 正整数n,n個の実数,および文字列を読み込み,文字列がselectionのときは # 選択ソート,文字列がbubbleのときはバブルソートをして, # 使用したソートアルゴリズムと降順にソートされた実数型配列を # 出力するプログラムを作成せよ.以下のコードを穴埋めして,用いても良い. # # 実行例 # 整数 > 10 # 0番目の実数 > 3.3 # 1番目の実数 > 4.4 # 2番目の実数 > 2.2 # 3番目の実数 > 1.1 # 4番目の実数 > 0.0 # 5番目の実数 > 9.9 # 6番目の実数 > 8.8 # 7番目の実数 > 5.5 # 8番目の実数 > 7.7 # 9番目の実数 > 6.6 # 文字列 > selection # 選択ソート # 9.900000 # 8.800000 # 7.700000 # 6.600000 # 5.500000 # 4.400000 # 3.300000 # 2.200000 # 1.100000 # 0.000000 # # 実行例 # 整数 > 10 # 0番目の実数 > 3.3 # 1番目の実数 > 4.4 # 2番目の実数 > 2.2 # 3番目の実数 > 1.1 # 4番目の実数 > 0.0 # 5番目の実数 > 9.9 # 6番目の実数 > 8.8 # 7番目の実数 > 5.5 # 8番目の実数 > 7.7 # 9番目の実数 > 6.6 # 文字列 > bubble # バブルソート # 9.900000 # 8.800000 # 7.700000 # 6.600000 # 5.500000 # 4.400000 # 3.300000 # 2.200000 # 1.100000 # 0.000000 # '正整数n,n個の実数,および文字列を読み込み,文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして,使用したソートアルゴリズムと降順にソートされた実数型配列を出力する' :- '正整数n,n個の実数,および文字列を読み込み'(_正整数n,_n個の実数ならび,_文字列), '文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして'(_文字列,_n個の実数ならび,_降順に整列されたn個の実数ならび), '使用したソートアルゴリズムと降順にソートされた実数型配列を出力する'(_文字列,_降順に整列されたn個の実数ならび). '正整数n,n個の実数,および文字列を読み込み'(_正整数n,_n個の実数ならび,_文字列) :- '正整数nを読み込み'(_正の整数n), 'n個の実数を読み込み'(_正の整数n,_n個の実数ならび), '文字列を読み込み'(_文字列). '正整数nを読み込み'(_正の整数n) :- write('正の整数を入力してください : '), get_integer(_正の整数n), _正の整数n > 0,!. 'n個の実数を読み込み'(_正の整数n,_n個の実数ならび) :- length(_n個の実数ならび,_正の整数n), findall(_実数,( append(_,[_|_],__n個の実数ならび), 実数を読み込む(_実数)), _n個の実数ならび). 実数を読み込む(_実数) :- write('実数を入力してください : '), get_line(Line), 実数入力診断(Line,_実数),!. 実数を読み込む(_実数) :- 実数を読み込む(_実数). 実数入力診断(Line,_実数) :- atom_to_term(Line,_実数,_), number(_実数),!. 実数入力診断(Line,_実数) :- writef('入力された%tからは実数が得られません。再入力をお願いします。\n',[Line]), fail. '文字列を読み込み'(_文字列) :- get_line(_文字列). '文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして'(selection,_n個の実数ならび,_降順に整列されたn個の実数ならび) :- 降順選択ソート(_n個の実数ならび,_降順整列されたn個の実数ならび),!. '文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして'(bubble,_n個の実数ならび,_降順に整列されたn個の実数ならび) :- 降順バブルソート(_n個の実数ならび,_降順に整列されたn個の実数ならび),!. '使用したソートアルゴリズムと降順にソートされた実数型配列を出力する'(selection,_降順整列されたn個の実数ならび) :- listing(降順選択ソート/2), listing(降順swap/3), 出力する(_降順に整列されたn個の実数ならび). '使用したソートアルゴリズムと降順にソートされた実数型配列を出力する'(bubble,_降順に整列されたn個の実数ならび) :- listing(降順バブルソート/2), listing(降順交換/2), 出力する(_降順に整列されたn個の実数ならび). 出力する(_降順に整列されたn個の実数ならび) :- append(_,[_実数|R],_降順に整列されたn個の実数ならび), writef('%t\n',[_実数]), R = []. 降順選択ソート([],[]) :- !. 降順選択ソート([A],[A]) :- !. 降順選択ソート(L1,[N|R2]) :- append(L0,[N|R],L1), \+((member(N1,L0),N1 @< N)), \+((member(N2,R),N2 @< N)), swap(L0,[N|R],R1), 降順選択ソート(R1,R2). swap([],[N|R],R) :- !. swap(L0,[N|R],R1) :- L0=[S|R0], append(R0,[S|R],R1). 降順バブルソート(_対象ならび,_整列済みならび) :- 降順交換(_対象ならび,_対象ならびの一),!, 降順バブルソート(_対象ならびの一,_整列済みならび). 降順バブルソート(_整列済みならび,_整列済みならび). 降順交換([],[]) :- !,fail. 降順交換([A,B|R],[B,A|R]) :- A @< B,!. 降順交換([A|R1],[A|R2]) :- 交換(R1,R2). % 以下のサイトは # データ列中で一番小さい値を探し、1番目の要素と交換する。 # 次に、2番目以降のデータ列から一番小さい値を探し、2番目の要素と交換する。 # これを、データ列の最後まで繰り返す(厳密には、データ列の最後より1つ手前まで # の繰り返しでよい。一つ前まで交換済みであれば、最後(残り)は必ず最大値に # なるからである)。大小が入れ替わる降順の場合も同様の手法。 # 実装例 [編集] # for(i=0; idata[j])min = j ; # swap(data[i],data[min]) ; # } # 動作例 [編集] # 初期データ: 8 4 3 7 6 5 2 1  # 太字はソート完了した部分 # 1 4 3 7 6 5 2 8 (1回目のループ終了時) # 1 2 3 7 6 5 4 8 (2回目のループ終了時) # 1 2 3 7 6 5 4 8 (3回目のループ終了時) # 1 2 3 4 6 5 7 8 (4回目のループ終了時) # 1 2 3 4 5 6 7 8 (5回目のループ終了時) # この例では、一見して、この時点で既にソート完了したとわかる。 # しかしデータが多数の場合はそうはいかないし、アルゴリズムで # 「一見して」ソート完了か否か判断できない。アルゴリズム通りに最後まで # 処理する必要がある。 # 1 2 3 4 5 6 7 8 (6回目のループ終了時) # 1 2 3 4 5 6 7 8 (7回目のループ終了時) 選択ソート([],[]) :- !. 選択ソート([A],[A]) :- !. 選択ソート(L1,[N|R2]) :- append(L0,[N|R],L1), \+((member(N1,L0),N1 @< N)), \+((member(N2,R),N2 @< N)), swap(L0,[N|R],R1), 選択ソート(R1,R2). swap([],[N|R],R) :- !. swap(L0,[N|R],R1) :- L0=[S|R0], append(R0,[S|R],R1). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/183 # # [2]xy平面上の10 個の点(0〜9 番とする) の(x, y) 座標を入力させ # つぎのようにソートするプログラムを作れ. # 大きさ10の配列x, y を用いて,i番目の点の座標をそれぞれx[i], y[i] に入れる. # # (梅) x座標の値の昇順 # # (原点より近い点から遠い点の順) # 注意:点を入れ替える時には,x 座標だけでなく,y座標も入れ替えること. # '座標点ならびを確保して、座標点を10個入力し、原点から近い順に整列する'(_整列された座標点ならび) :- '座標点ならびを確保して'(_座標点ならび), '座標点を10個入力し'(_座標点ならび), '原点から近い順に整列する'(_座標点ならび,_整列された座標点ならび). '座標点ならびを確保して'(_座標点ならび) :- length(_座標点ならび,10). '座標点を10個入力し'(_座標点ならび) :- findall((X,Y),( append(L0,[(X,Y)|_],_座標点ならび), 座標点の入力(L0,X,Y)), _座標点ならび). 座標点の入力(L0,X,Y) :- length([_|L0],_個目), writef('[%t個目] x,y座標をカンマ区切りで入力してください : ',[_個目]), get_line(Line), 座標点入力診断(Line,X,Y),!. 座標点の入力(L0,X,Y) :- 座標点の入力(L0,X,Y). 座標点入力診断(Line,X,Y) :- split(Line,[',',' '],[X,Y]), number(X), number(Y),!. 座標点入力診断(Line,X,Y) :- writef('入力された%tからは適切な座標点が得られませんでした。再入力をお願いします。\n',[Line]), fail. '原点から近い順に整列する'(_座標点ならび,_整列された座標点ならび) :- 原点からの距離を付加する(_座標点ならび,_原点からの距離を付加された座標点ならび), 整列(_原点からの距離を付加された座標点ならび,_整列した原点からの距離を付加された座標点ならび), 距離を削除する(_整列した原点からの距離を付加された座標点ならび,_整列された座標点ならび). 原点からの距離を付加する([],[]) :- !. 原点からの距離を付加する([(X,Y)|R1],[(D,X,Y)|R2]) :- D is sqrt(X^2+Y^2), 原点からの距離を付加する(R1,R2). 整列(_原点からの距離を付加された座標点ならび,_整列した原点からの距離を付加された座標点ならび) :- sort(_原点からの距離を付加された座標点ならび,_整列した原点からの距離を付加された座標点ならび). 距離を削除する([],[]). 距離を削除する([(_,X,Y)|R1],[(X,Y)|R2]) :- 距離を削除する(R1,R2). % 以下のサイトは # [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/928 # # ../test/read.cgi/tech/1307166756/885に追加で # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # file1を読み込み、特定の文字列string1 を全てstring2 に置き換え、file2に書き込むファイル、ensyu07.cを作成せよ # replase_strings( ”file1”, ”file2”, ”string1”, ”string2” ) ; # # file1を読み込み、行の文字数の大きい順番に並び換え、file2に書き込むファイル、ensyu08.cを作成せよ # text_sort( ”file1”, ”file2” ) ; # # 出来れば../test/read.cgi/tech/1307166756/900や../test/read.cgi/tech/1307166756/907のような形式で書いてもらえると助かります # 'file1を読み込み、特定の文字列string1 を全てstring2 に置き換え、file2に書き込む' :- 'file1を読み込み'(_行ならび), '特定の文字列string1 を全てstring2 に置き換え'(_行ならび,_string1,_string2,_置き換えられた行ならび), file2に書きこむ(_置き換えられた行ならび). file1を読み込み(_行ならび) :- get_lines(file1,_行ならび). '特定の文字列string1 を全てstring2 に置き換え'(_行ならび,_string1,_string2,_置き換えられた行ならび) :- findall(_行1,( append(_,[_行|_],_行ならび), 置換対象文字列は置換する(_行,_string1,_string2,_行1)), _置換された行ならび). 置換対象文字列は置換する(_行,_string1,_string2,_置換された行) :- sub_atom(_行,_,_,_,S1,_string1,S3,_,_,_), 置換対象文字列は置換する(S3,_string1,_string2,_行2), concat_atom([S1,_string2,_行2],_置換された行),!. 置換対象文字列は置換する(_行,_,_,_行). file2に書き込む(_行ならび) :- open(file2,write,Outstream), append(_,[_行|R],_行ならび), writef('%t\n',[_行]), R = [], close(Outstream),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/904 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # strlen()を利用し、ファイルinput.txtには、複数の英単語のみが(改行を挟みながら)記載されている。 # input.txtをEOFまで読み込み、何文字の単語が何個あったのかを表示するプログラムを作成しなさい。このとき、1行には最大80字記載されており、1単語の最大の文字数は15とする。 # 例) # 1文字の単語: 20単語 # 3文字の単語: 10単語 # 8文字の単語: 4単語 # 全34単語 # # 'input.txtをEOFまで読み込み、何文字の単語が何個あったのかを表示する' :- get_chars('input.txt',Chars), 英単語ならびを得る(Chars,LL1), sort(LL1,LL2), 何文字の単語が何個あったのかを表示する(LL2). 英単語ならびを得る(Chars,LL) :- findall([Len,L],( 空白または改行で区切る(Chars,L), length(L,Len)), LL). 空白または改行で区切る(Chars,L0) :- append(L0,[A|R],Chars), 空白または改行(A). 空白または改行で区切る(Chars,L) :- append(L0,[A|R],Chars), 空白または改行(A), 空白または改行で区切る(R,L). 空白または改行で区切る(L,L). 空白または改行(' '). 空白または改行('\n'). 何文字の単語が何個あったのかを表示する(LL) :- 何文字の単語が何個あったのか(LL,LL2), 全単語数を集計する(LL2,_全単語数), 表示する(LL2,_全単語数). 何文字の単語が何個あったのかを表示する(LL,[[_文字数,_個数]|R2]) :- append(L0,[[_文字数,L1]|R1],LL), \+(append(_,[[_文字数,_]|_],L0)), all(L0,[_文字数0,_]), length(L0,_個数), 何文字の単語が何個あったのかを表示する([[_文字数,L1]|R1],R2). 何文字の単語が何個あったのかを表示する([[_文字数,_]|R1],[[_文字数,_個数]]) :- length([[_文字数,_]|R1],_個数). 全単語数を集計する(LL,_全単語数) :- findsum(_単語数,( append(_,[[_,_単語数]|_],LL)), _全単語数の一), _全単語数 is truncate(_全単語数の一). 表示する(LL,_全単語数) :- append(_,[[_文字数,_何個]|R],LL), writef('%t文字の単語: %t単語\n',[_文字数,_何個]), R = [], writef('全%t単語\n',[_全単語数]),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0) :- !. sum([N|R],X) :- sum(R,Y), X is N + Y. % 以下のサイトは # 出典:: 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/tech/1307166756/670 # # 問題 # 入力ファイル中のアルファベット各文字の個数を数えるプログラムを作成せよ。(大文字と小文字は合わせて数える) # スペースや記号、数字などは数えない。 # # そして、結果を文字数の多い順にソートして出力せよ。 # # コンパイラ # gcc # # 期限 # 2011/6/18 # '入力ファイル中のアルファベット各文字の個数を数えるプログラムを作成せよ。(大文字と小文字は合わせて数える)スペースや記号、数字などは数えない。そして、結果を文字数の多い順にソートして出力する'(_入力ファイル) :- get_chars(_入力ファイル,Chars), setof([_大文字/_小文字],( アルファベットを大文字小文字対にする(Chars,_大文字/_小文字)), L1), findall([Count,_大文字/_小文字],( append(_,[_大文字/_小文字|_],L1), 大文字と小文字の数は合わせる(Chars,_大文字,_小文字Count)), L2), 文字数の多い順にソートして出力する(L2). ファイルに現れるアルファベットを大文字小文字対にする(Chars,_大文字/_小文字) :- member(Char,Chars), アルファベット(Char), to_upper(Char,_大文字), to_lower(Char1,_小文字). 大文字と小文字の数は合わせる(Chars,_大文字,_小文字,Count) :- count(member(_大文字,Chars),Count1), count(member(_小文字,Chars),Count2), Count is Count1 + Count2,!. 文字数の多い順にソートして出力せよ(L2) :- sort(L2,L3), reverse(L3,L), append(_,[Count,A/B]|R],L), writef('%t/%t, %t個\n',[A,B,Count]), R = []. アルファベット(A) :- A @>= 'A', A @=< 'Z',!. アルファベット(A) :- A @>= 'a', A @=< 'z',!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/621 # # 3) 配列を利用して、23番目までのフィボナッチ数列を画面に整列させた状態で表示させなさい。 # 1,1,2,3,5,8,13,21,34,… #  [3.1] Windows7 #  [3.3] C言語 # [4] 木曜19時まで # [5] 配列まで # わかる方どうかよろしくお願いします。 # '23番目までのフィボナッチ数列を画面に整列させた状態で表示させる' :- フィボナッチ数列(23,L), concat_atom(L,',',S), writef('%t\n',[S]). フィボナッチ数列(N,L) :- フィボナッチ数列(0,N,[0],L). フィボナッチ数列(Max,Max,L1,L) :- reverse(L1,L),!. フィボナッチ数列(0,Max,L1,L) :- フィボナッチ数列(1,Max,[1|L1],L),!. フィボナッチ数列(1,Max,L1,L) :- フィボナッチ数列(2,Max,[1|L1],L),!. フィボナッチ数列(N,Max,[A,B|R1],L) :- N2 is N + 1, C is A + B, フィボナッチ数列(N2,Max,[C,A,B|R1],L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/621 # # [1] C言語演習 # [2] http://ime.nu/codepad.org/QMwiwwtp を改良して、 #   80〜100:優 70〜 79:良 60〜 69:可 0〜 59:不可 #  の分布グラフを表示するプログラムを作成しなさい。 # 【実行結果】 # 点数を入力してください。 # 1番:17 # 2番:38 # 3番:100 # 4番:95 # 5番:23 # □ 分布グラフ □ #  優:** #  良: #  可: # 不可:*** # ◆´,魏造して、「不可一覧表」も表示できるようにしなさい。 # 【実行結果】 # ,離廛蹈哀薀爐硫爾 # 不可一覧表 # 1番 ( 17点) # 2番 ( 38点) # 5番 ( 23点) # と表示させる。 #  配列を利用して、23番目までのフィボナッチ数列を画面に整列させた状態で表示させなさい。 # 1,1,2,3,5,8,13,21,34,… #  [3.1] Windows7 #  [3.3] C言語 # [4] 木曜19時まで # [5] 配列まで # わかる方どうかよろしくお願いします。 # # '入力する人数を得て、その人数分の点数を入力する。それを80〜100:優 70〜 79:良 60〜 69:可 0〜 59:不可 の分布グラフとして表示しなさい。さらに不可一覧表も表示しなさい' :- 入力する人数を得る(_人数), n人分の点数を得る(_人数,_点数ならび), グラフ分布(_点数ならび,L1,L2,L3,L4), グラフ表示(L1,L2,L3,L4), 不可一覧表表示(_点数ならび). 入力する人数を得る(_人数) :- write('入力する人数を入れてください : '), get_line(Line), 入力する人数診断(Line,_人数),!. 入力する人数を得る(_人数) :- 入力する人数を得る(_人数). 入力する人数診断(Line,_人数) :- atom_to_term(Line,_人数,_), integer(_人数), _人数 > 0,!. 入力する人数診断(Line,_人数) :- writef('入力された %t から人数が得られません。再入力をお願いします。\n',[Line]), fail. n人分の点数を得る(_n人分,_点数ならび) :- length(_点数ならび,_n人分), findall(_点数,( append(_,[_点数|_],_点数ならび), 点数を入力してください(_点数)), _点数ならび). 点数を入力してください(_点数) :- writef('点数を入力してください : '), get_line(Line,_点数,_), 点数入力診断(Line,_点数),!. 点数を入力してください(_点数) :- 点数を入力してください(_点数). 点数入力診断(Line,_点数) :- atom_to_term(Line,_点数,_), integer(_点数), _点数 >= 0, _点数 =< 100,!. 点数入力診断(Line,_点数) :- writef('入力された %t から適切な点数が得られません。再入力をお願いします。\n',[Line]), fail. グラフ分布([],[],[],[],[]). グラフ分布([_点数|R],[*|L1],L2,L3,L4) :- _点数 >= 80,_点数 =< 100, グラフ分布(R,L1,L2,L3,L4). グラフ分布([_点数|R],L1,[*|L2],L3,L4) :- _点数 >= 70,_点数 =< 79, グラフ分布(R,L1,L2,L3,L4). グラフ分布([_点数|R],L1,L2,[*|L3],L4) :- _点数 >= 60,_点数 =< 69, グラフ分布(R,L1,L2,L3,L4). グラフ分布([_点数|R],L1,L2,L3,[*|L4]) :- _点数 >= 0,_点数 =< 59, グラフ分布(R,L1,L2,L3,L4). グラフ表示(L1,L2,L3,L4) :- concat_atom(L1,_優), concat_atom(L2,_良), concat_atom(L3,_可), concat_atom(L4,_不可), writef(' 優: %t\n 良: %t\n 可: %t\n不可: %t\n',[_優,_良,_可,_不可]). 不可一覧表表示(_点数ならび) :- append(L0,[_点数|_],_点数ならび), _点数 < 60, length([_|L0],_n番目), writef('[%t番目] %t点\n',[_n番目,_点数]), fail. 不可一覧表表示(_点数ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/262 # # [1] 授業単元:C言語 # [2] 問題文: # 構造体trinagleを typedef struct{ # double x,y; # } Point; # # typedey struct{ # Point p1,p2,p3; # } Trinagle; # とする。 # 構造体の構成要素は3つの頂点のx座標、y座標をメンバとして持つ構造体Pointである。 # 任意の三角形の面積、その三角形を適当な2×2行列で線形変換した結果の三角形の座 # 標とその面積、任意の二つの三角形が合同かどうかを表示するプログラムを作りなさい。 # 座標の回転 90度 [[0,-1],[1,0]] 180度 [[-1,0],[0,-1]] 270度 [[0,1],[-1,0]] # -90度 [[0,1],[-1,0]] -180度 [[-1,0],[0,-1]] -270度 [[0,1],[-1,0]] 変換正方行列(回転,V,[[A,B],[C,D]]) :- \+(var(V)), R is pi * V / 180, A is cos(R), B is (-1) * sin(R), C is sin(R), D = A. 変換正方行列(回転,90,[[0,-1],[1,0]]). 変換正方行列(回転,180,[[-1,0],[0,-1]]). 変換正方行列(回転,270,[[0,1],[-1,0]]). 変換正方行列(回転,-90,[[0,1],[-1,0]]). 変換正方行列(回転,-180,[[-1,0],[0,-1]]). 変換正方行列(回転,-270,[[0,-1],[1,0]]). 任意の三角形の面積、その三角形を適当な2×2行列で線形変換した結果の三角形の座標とその面積(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3,_面積) :- 三角形の面積(X1,Y1,X2,Y2,X3,Y3,_面積_1), writef('三角形の面積 %t\n',[_面積_1]), 変換正方行列(回転,_度,_変換行列), 行列の積([[Y1,X1],[Y2,X2],[Y3,X3]],_変換行列,[[_y1,_x1],[_y2,_x2],[_y3,_x3]]), 三角形の面積(_x1,_y1,_x2,_y2,_x3,_y3,_面積_2), writef('%t度回転された座標は(%t %t)(%t %t)(%t %t) 面積は %t です\n',[_度,_x1,_y1,_x2,_y2,_x3,_y3,_面積_2]), fail. 任意の三角形の面積、その三角形を適当な2×2行列で線形変換した結果の三角形の座標とその面積'(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3,_面積). 任意の二つの三角形が合同かどうか(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3) :- 任意の二つの三角形が合同かどうか(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3,_合同かどうか), writef('%t\n',[_合同かどうか]). 任意の二つの三角形が合同かどうか(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3,合同) :- A is (X1-X2) * (X1-X2) + (Y1-Y2) * (Y1-Y2), B is (X2-X3) * (X2-X3) + (Y2-Y3) * (Y2-Y3), C is (X3-X1) * (X3-X1) + (Y3-Y1) * (Y3-Y1), _a is (_x1-_x2) * (_x1-_x2) + (_y1-_y2) * (_y1-_y2), _b is (_x2-_x3) * (_x2-_x3) + (_y2-_y3) * (_y2-_y3), _c is (_x3-_x1) * (_x3-_x1) + (_y3-_y1) * (_y3-_y1), sort([A,B,C],X), sort([_a,_b,_c],X),!. 任意の二つの三角形が合同かどうか(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3,合同ではない). 三角形の面積(X1,Y1,X2,Y2,X3,Y3,_三角形の面積) :- 一角を原点へ移動(X1,Y1,X2,Y2,X3,Y3,0,0,_x2,_y2,_x3,_y3), _三角形の面積 is abs(_x2 * _y3 - _y2 * _x3) / 2. 一角を原点へ移動(X1,Y1,X2,Y2,X3,Y3,0,0,_x2,_y2,_x3,_y3) :- _x2 is X2 - X1, _y2 is Y2 - Y1, _x3 is X3 - X1, _y3 is Y3 - X1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/113 # # [1] 授業単元:プログラム # [2] 問題文:得点データをバブルソートを用いて国語の得点の大きい順に並び替えよ # 番号 国語 数学 # 01    78    64 # 02    68    78 # 03    83    55 # 04    91    90 # 得点データ('01',78,64). 得点データ('02',68,78). 得点データ('03',83,55). 得点データ('04',91,90). 得点データをバブルソートを用いて国語の得点の大きい順に並び替えよ :- findall([_国語,_番号,_数学],( 得点データ(_番号,_国語,_数学)), _得点データならび), バブルソート(_得点データならび,_昇順得点データならび), reverse(_昇順得点データならび,_国語の得点の大きい順ならび), 表示(_国語の得点の大きい順ならび). バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一),!, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). 表示(_国語の得点の大きい順ならび) :- writef('番号 国語 数学\n'), append(_,[[_国語,_番号,_数学]|R],_国語の得点の大きい順ならび), writef('%t %t %t\n',[_番号,_国語,_数学]), R = []. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/481 # # [1] 授業単元:ソフトウェア演習C # [2] 問題文: # 文書ないのすべての単語とその単語の頻度をメンバとして持つ構造体を定義し、 # この構造体へのポインタをノードの値として持つ二分木のノードを定義せよ # # 次に、任意のノードはその左の部分木にはそのノードの単語より辞書順で # 小さい単語のみがあり、その右の部分木にはより大きい単語のみがあるように # 保持される。 # 新たに単語がすでに木にあるかどうかを探すには、ルート(根元)から出発して # そのノードに格納されている単語と新しい単語を比較する。 # 二つが一致したら、それで良い。 # 新しい単語が木の単語より小さいときは、探索は左の子供に対して続けられ、 # そうでなければ右の子供が調べられる。 # 求める方向に子供がないときは、新しい単語は木の中にはないと言うことであり、 # また実際にはその子供のないところがそれを置く場所である。 # このプロセスは再帰的である必要があり、単語の挿入を行うadd_word()関数を # 定義せよ。 # この関数は再帰的に呼ばれて、左または右の部分木に振り分けられる。 # 単語は木の中の単語と一致する(その場合カウント(頻度)がインクリメントされる)か、 # あるいはノードを作成し、木に加えなければならないことを示すヌル・ポインタと # 出会う。 # 新たにノードが生成されると、この関数ではそのノードへのポインタが返され、 # 親ノードに埋め込まれる。 # この関数を利用し、以下のテキストをコマンド実行時の引数として与えられた # ファイルを入力して二分探索木を生成し、単語と頻度のリストを表示する # プログラムを作成せよ。 # # 文章: ファイル名:test.txt # University was founded in April 1998 at Iwate, # which is situated in the northeastern part of Japan. # University consists of four faculties Software and Information Science, # Nursing, Social Welfare, # and policy Studies, and additionally other educational supporut centers. 'Idによって管理された二分木に情報と頻度を保持する' :- get_chars('test.txt',Chars), split(Chars,[' ',',','.'],WordList), 木作成(WordList). 'Idによって管理された二分木に保持された情報と頻度を昇順表示' :- 二分木から値と頻度を取り出す(1,_頻度付きの値ならび), append(_[[_語,_頻度]|R],_頻度付きの値ならび), write_formatted('語彙=%t,頻度=%t\n',[_語,_頻度]), R = []. 木作成(_ならび) :- abolish(節/5), 節作成(_ならび,1,1,_). 木作成([],_,_,_). 木作成([_値|R],_節,_開始節番号,_次の節番号) :- 節作成(_値,_節,_開始節番号,_受取節番号), 木作成(R,_節,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- not(節(_節,_,_,_,_)), _左 is _受取節番号+1, _右 is _受取節番号+2, _次の節番号 is _受取節番号+3, assertz(節(_節,_左,_右,_値,1)),!. 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_), 辞書順語彙比較(<,_値,_値2), 節作成(_値,_左,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_), 辞書順語彙比較(>,_値,_値2), 節作成(_値,_右,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_頻度), 辞書順語彙比較(=,_値,_値2), _頻度2 is _頻度 + 1, retract(節(_節,_左,_右,_値2,_頻度)), assertz(節(_節,_左,_右,_値2,_頻度2)). 辞書順語彙比較(Functor,_語彙1,_語彙2) :- atom_codes(_語彙1,Codes1), atom_codes(_語彙2,Codes2), 辞書順codes比較(Fuctor,Code1,Codes2),!. 辞書順codes比較((=),[],[]) :- !. 辞書順codes比較((<),[],L) :- !. 辞書順codes比較((>),L,[]) :- !. 辞書順codes比較((<),[A|R1],[B|R2]) :- A >= 65,A =< 90, B >= 97,B =< 122, B >= A + 32,!. 辞書順codes比較((>),[A|R1],[B|R2]) :- A >= 65,A =< 90, B >= 97,B =< 122, B < A + 32,!. 辞書順codes比較((>),[A|R1],[B|R2]) :- A >= 97,A =< 122, B >= 65,B =< 90, A >= B + 32,!. 辞書順codes比較((<),[A|R1],[B|R2]) :- A >= 97,A =< 122, B >= 65,B =< 90, A < B + 32,!. 辞書順codes比較(<,[B|R1],[A|R2]) :- B =< A,!. 辞書順codes比較(>,[B|R1],[A|R2]) :- B > A,!. 辞書順codes比較(P,[A|R1],[A|R2]) :- 辞書順codes比較(P,R1,R2). 二分木から値と頻度を取り出す(_節,_頻度付きの値ならび) :- findall([_値,頻度],二分木から値と頻度を取り出す(_節,_,_値,_,_頻度),_頻度付きの値ならび). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- 節(_節,_左,_,_値2,_,_頻度2), 二分木から値と頻度を取り出す(_左,_値2,_値,_頻度2,_頻度). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- 節(_節,_,_右,_値2,_頻度2), 二分木から値と頻度を取り出す(_右,_,_値,_,_頻度). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- not(var(_値1)), not(var(_頻度1)), _値1=_値, _頻度1=_頻度. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/838 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # 「整列アルゴリズムの効率性の比較」 # ファイル名:file007.dat //(仮)  # を整列対象データとする。 # 上記のデータを配列に格納し、下記4種の整列アルゴリズムを用いて整列する。 # このとき移動回数および実行時間(clock関数)を記録する。 #    (1) 単純挿入法 #    (2) 単純選択法 #    (3) バブルソート #    (4) クイックソート # # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 単純挿入法([],[]) :- !. 単純挿入法([A|R1],L) :- 単純挿入法(R1,L1), 単純挿入法(A,L1,L). 単純挿入法(A,[],[A]) :- !. 単純挿入法(A,[B|R],[A,B|R]) :- A @=< B,!. 単純挿入法(A,[B|R1],[B|R2]) :- 単純挿入法(A,R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 単純挿入法([A|R],L2) :- 単純挿入法(L1,[],L2). 単純挿入法([],L,L) :- !. 単純挿入法([A|R1],L2,L) :- 単純挿入(A,L2,L3), 単純挿入法(R1,L3,L). 単純挿入(A,L1,L) :- append(L0,[B|R],L1), A @=< B, append(L0,[A,B|R],L),!. 単純挿入(A,L1,L) :- append(L1,[A],L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 単純選択法([],[]) :- !. 単純選択法([A],[A]) :- !. 単純選択法(L1,[A|R]) :- append(L0,[A|R0],L1), append(L0,R0,L2), min(L2,B), B @>= A, 単純選択法(L2,R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一),!, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% クイックソート([],[]). クイックソート([A|R1],L) :- 分割(A,R1,_Aに等しいか小さいならび,_Aより大きいならび), クイックソート(_Aに等しいか小さいならび,L1), クイックソート(_Aより大きいならび,L2), append(L1,[A|L2],L). 分割(_,[],[],[]) :- !. 分割(A,[B|R],[B|_Aに等しいか小さいならび],_Aより大きいならび) :- B @=< A, 分割(A,R,_Aに等しいか小さいならび,_Aより大きいならび). 分割(A,[B|R],_Aに等しいか小さいならび,[B|_Aより大きいならび]) :- B @> A, 分割(A,R,_Aに等しいか小さいならび,_Aより大きいならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/423 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 3つの異なる値の実数を入力させる。それがどんな順番で入力されたとしても、昇順に並び替えて表示するプログラムを作成しなさい # なお、プログラムの末尾には、このプログラムが正しいことを確認するためには、何パターンのデータを試す必要があるかを考え、必要なテストを行った結果を記録しなさい # 3つの異なる値の実数を入力させる。それがどんな順番で入力されたとしても、昇順に並び替えて表示する :- 3つの異なる値の実数を入力させる(V1,V2,V3), '3sort'(V1,V2,V3,_1,_2,_3), writef('%t %t %t\n',[_1,_2,_3]). '3sort'(_1,_2,_3,_1,_2,_3) :- _1 =< _2,_2 =< _3,!. '3sort'(_1,_2,_3,_1,_3,_2) :- _1 =< _3,_3 =< _2,!. '3sort'(_1,_2,_3,_2,_1,_3) :- _2 =< _1,_1 =< _3,!. '3sort'(_1,_2,_3,_2,_3,_1) :- _2 =< _3,_3 =< _1,!. '3sort'(_1,_2,_3,_3,_1,_2) :- _3 =< _1,_1 =< _2,!. '3sort'(_1,_2,_3,_3,_2,_1) :- _3 =< _2,_2 =< _1,!. 3つの異なる値の実数を入力させる(V1,V2,V3) :- 実数を入力する(1,[],V1), 実数を入力する(2,[V1],V2), 実数を入力する(3,[V1,V2],V3),!. 実数を入力する(_N番目,L,V) :- writef('実数を入力してください[%t番目] : ',[_N番目]), get_line(Line), 実数入力検査(Line,L,V),!. 実数を入力する(_N番目,L,V) :- 実数を入力する(_N番目,L,V). 実数入力検査(Line,L,_実数) :- atom_to_term(Line,_実数,_), 実数入力検査のニ(Line,L,_実数),!. 実数入力検査のニ(Line,L,_実数) :- float(_実数), \+(append(_,[_実数|_],L)),!. 実数入力検査のニ(Line,L,_実数) :- \+(float(_実数)),!, writef('入力された %t からは実数値が得られません。\n',[Line]), fail. 実数入力検査のニ(Line,L,_実数) :- float(_実数),!, append(_,[_実数|_],L), writef('実数 %t は既に入力されています\n',[_実数]), fail. テスト :- テストパターン(N,_,[V1,V2,V3],L,[X1,X2,X3]), L = [V1,V2,V3], \+('3sort'(V1,V2,V3,X1,X2,X3)), writef('no%t, Error %t,%t,%t\n',[V1,V2,V3]), fail. テスト. テストパターン(1,(1 < 2,2 < 3),[1.0,2.0,3.0],[A,B,C],[A,B,C]). テストパターン(2,(1 < 3,3 < 2),[1.0,3.0,2.0],[A,C,B],[A,B,C]). テストパターン(3,(2 < 1,1 < 3),[2.0,1.0,3.0],[B,A,C],[A,B,C]). テストパターン(4,(2 < 3,3 < 1),[2.0,3.0,1.0],[B,C,A],[A,B,C]). テストパターン(5,(3 < 1,1 < 2),[3.0,1.0,2.0],[C,A,B],[A,B,C]). テストパターン(6,(3 < 2,2 < 1),[3.0,2.0,1.0],[C,B,A],[A,B,C]). テストバターン(7,(1 = 2,2 < 3),[1.0,1.0,3.0],[A,A,C],[A,A,C]). テストパターン(8,(1 = 3,3 < 2),[1.0,1.0,2.0],[A,A,B],[A,B,A]). テストパターン(9,(2 = 3,3 < 1),[2.0,2.0,1.0],[B,B,A],[A,B,B]. テストパターン(10,(1 < 2,2 = 3),[1.0,2.0,2.0],[A,B,B],[A,B,B]). テストパターン(11,(2 < 1,1 = 3),[2.0,1.0,1.0],[B,A,A],[A,B,B]). テストパターン(12,(3 < 2,2 = 1),[3.0,1.0,1.0],[C,A,A],[A,A,C]). テストパターン(13,(1 = 2,2 = 3),[A,A,A],[A,A,A]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/324 # # NAME FRUIT NUM # # TARO banana 10 # TARO orange 4 # TARO tomato 3 # TARO grape 2 # TARO apple 1 # TARO melon 1 # TARO mango 1 # HANAKO tomato 30 # HANAKO orange 21 # HANAKO apple 2 # HANAKO banana 1 # GEN mango 12 # GEN grape 6 # GEN orange 4 # GEN banana 1 # GEN apple 1 # # # というテーブルで、各人間の持つ果物のうち上位3種類を取得したいのですが、 # どうすればよろしいでしょうか? # # 欲しい結果 # NAME FRUIT NUM # # TARO banana 10 # TARO orange 4 # TARO tomato 3 # HANAKO tomato 30 # HANAKO orange 21 # HANAKO apple 2 # GEN mango 12 # GEN grape 6 # GEN orange 4 # # # SQLserver2008です。よろしくお願いいたします。 # # テーブルで、各人間の持つ果物のうち上位3種類を取得したい :- findsetof(_名前,テーブル(_名前,_果物,_数量),LL1), append(_,[_名前|R],LL1), findall([_名前,_数量,_果物],( テーブル(_名前,_果物,_数量)), LL2), 大きい順に(LL2,LL3), 上位3位(LL3,[_名前,_果物,_数量]), writef('%t %t %t\n',[_名前,_果物,_数量]), R = []. 大きい順に(L1,L2) :- sort(L1,L3), reverse(L3,L2),!. 上位3位(L,[_名前,_果物,_数量]) :- append(L0,[[_名前,_数量,_果物]|_],L), length(L0,Length), Length =< 2. % 以下のサイトは # 出典:: 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/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/tech/1301553333/745 # # [1] 授業単元:プログラム実習 # [2] 問題文(含コード&リンク): # 名前・身長・体重・血液型が記録されたメモ帳(ファイル)がある。 # これを身長順にソートして並べ替えてコマンドプロンプト上に # 表示させるプログラムを作成せよ。 # なお、今回メモ帳はstudentsdata.txtという名前で保存されていることとする。 # # program :- get_lines('studentsdata.txt',Lines), 身長を取り出して鍵とする(Lines,LL1), sort(LL1,LL2), append(_,[[_,Line]|R],LL2), writef('%t\n',[Line]), R = [],!. 身長を取り出して鍵とする([],[]) :- !. 身長を取り出して鍵とする([Line|R1],[[_身長,Line]|R2]) :- split(Line,[' ',','],[_,_身長,_,_]), 身長を取り出して鍵とする(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/470 # # # 入力ファイル(成績ファイル)の仕様 # # ファイル名は、ASCII文字で構成されるものとする。 # ファイル名の最大長は FILENAME_MAX である(第2回の課題0を参照)。 # 1行は、「学生番号」、「氏名」、「成績」の順に記述したもので、 # 各項目の区切り文字は、「タブ('\t')」1個である。 # 学生番号は、英数字からなる6桁の文字列である。 # 氏名の文字列長の最大は20バイトとする。 # 成績は、0〜100までの整数である。 # 入力は、最大500行と仮定してよい。 # # 出力形式 # 入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する。 # 次に、成績の降順にソートして出力する。各項 目間は、「タブ('\t')」1個で区切る。 # 平均点は、小数点以下1桁まで出力する。 # 出力形式は、実行例を参照せよ。 # エラー処理 # 呼出しでファイル名が指定されない場合はエラーとし、「ファイル名を指定してください」と表示し、プログラムを終了する。 # 指定されたファイルのオープンに失敗した場合に、「ファイルを開けませんでした」と表示し、プログラムを終了する。 # 今回のプログラムでは、a. b. 以外のエラー処理はしなくてよい。 # # % cat sample.txt # 03888 八 90 # 03111 一 100 # 03222 二 30 # 03666 六 70 # 03555 五 60 # 03333 三 80 # 03777 七 40 # 03999 九 20 # 03444 四 50 # % ./work31.exe sample.txt # 最高点:100 # 最低点: 20 # 平均点: 60.0 # 100 03111 一 # 90 03888 八 # 80 03333 三 # 70 03666 六 # 60 03555 五 # 50 03444 四 # 40 03777 七 # 30 03222 二 # 20 03999 九 # % # # 言語はCです # よろしくおねがいします # program :- user_parameters([_ファイル名]), '入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する、次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t''[B')」1個で区切る。' (_ファイル名). '入力ファイルを読み込み、最初に、成績の最高点と最低点と平均点を出力する、次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(_ファイル名) :- 入力ファイルを読み込み(_ファイル名,LL), '最初に、成績の最高点と最低点と平均点を出力する'(LL), '次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(LL). 入力ファイルを読み込み(_ファイル名,LL) :- get_lines(_ファイル名,Lines), 三項ならびに変換(Lines,LL). 三項ならびに変換([],[]) :- !. 三項ならびに変換([Line|R1],[[_成績,_学生番号,_氏名]|R2]) :- atom_chars(Line,Chars), append(L0,['\t'|L1],['\t'|L2],Chars), atom_chars(_学生番号,L0), atom_chars(_氏名,L1), atom_chars(_成績文字列,L2), atom_to_term(_成績文字列,_成績,_), 三項ならびに変換(R1,R2). 最初に、成績の最高点と最低点と平均点を出力する(LL) :- findmax(_成績, append(_,[[_成績,_,_]|_],LL), _最高点成績), findmin(_成績, append(_,[[_成績,_,_]|_],LL), _最低点成績), findavg(_成績, append(_,[[_成績,_,_]|_],LL), _平均点), writef('最高点: %t\n',[_最高点成績]), writef('最低点: %t\n',[_最低点成績]), writef('平均点: %t\n',[_平均点]),!. '次に、成績の降順にソートして出力する。各項 目間は、「タブ(''\\t'')」1個で区切る。'(LL) :- sort(LL,LL1), reverse(LL1,LL2), append(_,[L|R],LL2), writef('%t\t%t\t%t\t\n',L), R = [],!. % *** user: append / 4 *** append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). % *** user: findmax / 3 *** findmax(V,P,Max) :- findall(V,P,L), max(L,Max). % *** user: findmin / 3 *** findmin(V,P,Max) :- findall(V,P,L), min(L,Max). % *** user: findavg / 3 *** findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. % *** user: sum / 2 *** sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. % 以下のサイトは # Mを以下の条件を満たす最小の集合とする。 # ・1∈M # ・n∈Mならば2n+1∈M # ・n∈Mならば3n+1∈M # ・n∈Mならば5n+1∈M # Mの要素を小さい順に出力せよ。 'Mを以下の条件を満たす最小の集合とする。 ・1∈M ・n∈Mならば2n+1∈M ・n∈Mならば3n+1∈M ・n∈Mならば5n+1∈M Mの要素を小さい順に出力する'(_nの限界値) :- 'Mの要素を小さい順に出力'(1,_nの限界値,[],M), write_formatted('%t\n',[M]). 'Mの要素を小さい順に出力'(N,_nの限界値,M,M) :- N > _nの限界値,!. 'Mの要素を小さい順に出力'(_n,_nの限界値,M1,[_n|R2]) :- _n_1 is 2 * _n + 1, _n_2 is 3 * _n + 1, _n_3 is 5 * _n + 1, sort([_n_1,_n_2,_n_3|M1],L2), L2 = [Min|R], 'Mの要素を小さい順に出力'(Min,_nの限界値,R,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/895 # # MYSQLで動的ホームページを作っています。 # fileテーブルにそれぞれのページのデータを保存していて # accessテーブルにアクセスログを保存しています。 # # fileテーブルにはAIのページIDカラムがあり # accessテーブルにはアクセスされたページのIDカラムがあります # # ページ一覧ページで各ページのアクセス数を表示したいです。 # SELECT * FROM fileの結果と、SELECT count(*) FROM access WHERE id='アクセスされてページのID'の結果を結合させるSQL文を教えてください。 # # いまはPHPで # $query="SELECT * FROM file ORDER BY id DESC LIMIT"; # $result=mysql_query($query); # # while ($row = mysql_fetch_array($result)) { # $query2="SELECT count(*) AS id FROM access WHERE id = {$row['id']}"; # $result2=mysql_query($query2); # $row2= mysql_fetch_array($result2); # } # # という書き方をしていますが、クエリを一回で済ませたいです。 # よろしくお願いします。 # # ページ一覧ページで各ページのアクセス数を表示する :- findall([_ID,_page],( fileテーブル(_ID,_page)), L1), sort(L1,L2), reverse(L2,L3), write(' ID,ページ名,アクセス数\n'), append(_,[[_ID,_page]|R],L3), count(accessテーブル(_ID,_log),Count), write_formatted(' %t, %t, %t\n',[_ID,_page,Count]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/271 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):バブルソート法を使って、map.datに対して交差点名(アルファベット)を # 入力すると、その交差点から直線距離が近い順に、隣接交差点名とその距離の二乗をディスプレイに表示する # プログラムを書きなさい。 # 1 0.0 0.0 H 2 2 4 0 0 # 2 -0.6 0.15 D 3 1 3 11 0 # 3 -0.83 0.0 K 4 2 4 9 10 # 4 -0.6 -0.38 O 3 1 3 5 0 # 5 -0.38 -0.68 M 3 4 6 7 0 # 6 6.0 -0.3 T 1 5 0 0 0 # 7 -0.18 -1.02 U 2 5 8 0 0 # 8 -0.84 -1.58 N 3 7 9 18 0 # 9 -0.9 -0.98 V 2 3 8 0 0 # 10 -0.98 0.51 R 3 3 11 13 0 # 11 -0.78 0.3 P 3 2 10 12 0 # 12 -1.28 0.68 E 2 11 13 0 0 # 13 -1.32 0.53 I 4 10 12 14 15 # 14 -1.8 0.98 C 2 13 20 0 0 # 15 -1.43 -0.15 J 2 13 16 0 0 # 16 -1.73 -0.26 P 3 15 17 0 0 # 17 -1.8 -1.43 W 3 16 18 19 0 # 18 -1.2 -1.73 S 2 8 17 0 0 # 19 -2.48 -1.2 Z 2 17 20 0 0 # 20 -2.33 -0.51 B 3 14 16 19 0 # 'バブルソート法を使って、map.datに対して交差点名(アルファベット)を入力すると、その交差点から直線距離が近い順に、隣接交差点名とその距離の二乗をディスプレイに表示する' :- get_split_lines('map.dat',[','],LL), 交差点名の入力(_交差点名), append(_,[[N,X,Y,_交差点名,_,_,_,_,_]|_],LL), その交差点から直線距離が近い順に隣接交差点名とその距離の二乗を(_整列した直線距離の二乗ならび・交差点名ならび), 表示する(_整列した直線距離の二乗ならび・交差点名ならび). 交差点名の入力(_交差点名) :- write('交差点名を入力してください : '), get_line(_交差点名),!. その交差点から直線距離が近い順に隣接交差点名とその距離の二乗を(LL,_整列した直線距離の二乗ならび・交差点名ならび) :- findall([_直線距離の二乗,_交差点名1],( append(_,[[N1,X1,Y1,_交差点名1,_隣接点1,_隣接点2,_隣接点3,_隣接点4,_隣接点5]|_],LL), \+(_交差点名=_交差点名), 交差点はNと隣接している(N,_隣接点1,_隣接点2,_隣接点3,_隣接点4,_隣接点5), _直線距離の二乗 is (X1-X) ^ 2 + (Y1-Y) ^ 2), _直線距離の二乗ならび・交差点名ならび), バブルソート(_直線距離の二乗ならび・交差点名ならび,_整列した直線距離の二乗ならび・交差点名ならび),!. 交差点はNと隣接している(N,N,_,_,_,_) :- !. 交差点はNと隣接している(N,_,N,_,_,_) :- !. 交差点はNと隣接している(N,_,_,N,_,_) :- !. 交差点はNと隣接している(N,_,_,_,N,_) :- !. 交差点はNと隣接している(N,_,_,_,_,N) :- !. バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一),!, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). 表示する(_整列した直線距離の二乗ならび・交差点名ならび) :- append(_,[[_直線距離の二乗,]|R],_整列した直線距離の二乗ならび・交差点名ならび), write_formatted('%t,%t\n',[_隣接交差点名,_直線距離の二乗]), R = [],!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/313 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # # 1..キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む関数を作れ。 # ただし、nの値とファイル名は引数として取得するものとする。 # 2..引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と # 氏名のデータを構造体変数に格納し、学生番号順に表示する関数を作れ。 # 3..以上で作成した関数を使用し、プログラムを完成せよ。ただし、nの値と使用するファイルの名前は # プログラムの引数として与えられるものとする。 program :- user_parameters([_n個文字列,_ファイル]), atom_to_term(_n個文字列,_n個,_), キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む(_n個,_ファイル), 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_ファイル,_n個). 'キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む'(_n個,_ファイル) :- length(L,_n個), 学生番号と氏名の組を読み込む(L), open(_ファイル,write,Outstream), append(_,[[_学生番号,_氏名]|R],L), write_foratted(Outstream,'%t,%t\n',[_学生番号,_氏名]), R = [], close(Outstream),!. 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_ファイル,_n個) :- length(L,_n個), get_line(_ファイル,Lines), append(L,_,Lines), sort(L,_整列済みデータ), append(_,[[_学生番号,_氏名]|R],_整列済みデータ), write_formatted('%t,%t\n',[_学生番号,_氏名]), R = [],!. 学生番号と氏名の組を読み込む([]) :- !. 学生番号と氏名の組を読み込む([[_学生番号,_氏名]|R]) :- 学生番号を読み込む(_学生番号), 氏名を読み込む(_氏名), 学生番号と氏名の組を読み込む(R). 学生番号を読み込む(_学生番号) :- write('学生番号を入力してください : '), get_line(_学生番号),!. 学生番号を読み込む(_氏名) :- write('氏名を入力してください : '), get_line(_氏名),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/895 # # MYSQLで動的ホームページを作っています。 # fileテーブルにそれぞれのページのデータを保存していて # accessテーブルにアクセスログを保存しています。 # # fileテーブルにはAIのページIDカラムがあり # accessテーブルにはアクセスされたページのIDカラムがあります # # ページ一覧ページで各ページのアクセス数を表示したいです。 # SELECT * FROM fileの結果と、SELECT count(*) FROM access WHERE id='アクセスされてページのID'の結果を結合させるSQL文を教えてください。 # # いまはPHPで # $query="SELECT * FROM file ORDER BY id DESC LIMIT"; # $result=mysql_query($query); # # while ($row = mysql_fetch_array($result)) { # $query2="SELECT count(*) AS id FROM access WHERE id = {$row['id']}"; # $result2=mysql_query($query2); # $row2= mysql_fetch_array($result2); # } # # という書き方をしていますが、クエリを一回で済ませたいです。 # よろしくお願いします。 # # ページ一覧ページで各ページのアクセス数を表示する :- findall([_ID,_page],( fileテーブル(_ID,_page)), L1), sort(L1,L2), reverse(L2,L3), write(' ID,ページ名,アクセス数\n'), append(_,[[_ID,_page]|R],L3), count(accessテーブル(_ID,_log),Count), write_formatted(' %t, %t, %t\n',[_ID,_page,Count]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/147 # # [1] 授業単元:ポインタ # [2] 問題文(含コード&リンク): # ランダムな数値が格納された配列を昇順にソートし、結果を画面に出力する。(コマンドプロンプト) # 課題ファイルのmain関数・昇順ソート関数・ソート結果表示関数に、仮引数と関数の中身を追加する。基本的に、main関数内は、関数呼び出しのみとする。 # 課題ファイル http://ime.nu/uproda.2ch-library.com/lib339300.txt.shtml # # #include # # void Sort_func( int * ); /* ソート処理関数の定義 */ # void Disp_func( int * ); /* ソート結果表示関数の定義 */ # # # /* # ※ 2つの関数を呼出しソート結果を画面に出力する。 # 関数を完成させよ。 # 定義済の関数宣言・変数の変更(移動)を禁止する。 # */ # # void main() # { # /* # 配列変数 intNumFrom に格納された数値を、 # 昇順となるようにintNumFrom を変更せよ。 # */ # # int intNumFrom[8] = {88,52,6,43,65,38,46,16}; # # # Sort_func( intNumFrom ); /* ソート処理関数呼出し*/ # # Disp_func( &intNumFrom[1] ); /* ソート結果表示関数呼出し */ # # return; # } # # void Sort_func( ###### ) # { # # } # # # void Disp_func( ###### ) # { # # } 'ランダムな数値が格納されたならびを昇順にソートし、結果を画面に出力する。' :- ランダムな数値が格納されたならびを(_ランダムな数値が格納されたならび), 昇順にソートし(_ランダムな数値が格納されたならび,[],_昇順に整列したならび), 画面に出力する(_昇順に整列したならび). ランダムな数値が格納されたならびを(_ランダムな数値が格納されたならび) :- ならびの要素数を入力する(_要素数), length(L,_要素数), findall(_ランダムな数値,( append(_,[_ランダムな数値|_],L), ランダムな数値(_ランダムな数値)), _ランダムな数値が格納されたならび). ランダムな数値(_ランダム数値) :- 1 is random mod 2, _ランダムな数値 is ( random mod 10000 ) / 100),!. ランダムな数値(_ランダム数値) :- _ランダムな数値 is random mod 100,!. ならびの要素数を入力する(_要素数) :- 範囲指定付き整数入力(要素数,'要素数を入力してください : ',1,100,_要素数). 昇順にソートし([],_昇順に整列したならび,_昇順に整列したならび) :- !. 昇順にソートし([_値1|R1],L1,_昇順に整列したならび) :- 昇順に挿入(_値1,L1,L2), 昇順にソートし(R1,L2,_昇順に整列したならび). 昇順に挿入(V,[],[V]) :- !. 昇順に挿入(V,[V1|R1],[V,V1|R1]) :- V =< V1,!. 昇順に挿入(V,[V1|R1],[V1|R2]) :- V > V1, 昇順に挿入(V,R1,R2). 画面に出力する(L) :- append(_,[_数値|R],L), write_formatted('%t ',[_数値]), R = [], nl. 範囲指定付き整数入力(_入力項目名,_催促,_範囲下限,_範囲上限,_値) :- write(_催促), get_line(Line), 範囲指定付き整数入力診断(_入力項目名,Line,_範囲下限,_範囲上限,_値),!. 範囲指定付き整数入力(_入力項目名,_催促,_範囲下限,_範囲上限,_値) :- 範囲指定付き整数入力(_入力項目名,_催促,_範囲下限,_範囲上限,_値). 範囲指定付き整数入力診断(_入力項目名,Line,_範囲下限,_範囲上限,_値) :- atom_to_term(Line,_値,_), integer(_値), _値 >= _範囲下限, _値 =< _範囲上限,!. 範囲指定付き整数入力診断(_入力項目名,Line,_範囲下限,_範囲上限,_値) :- write_formatted('入力された %t からは、%tから%tの範囲の適切な%tを得られませんでした。再入力をお願いします。\n',[Line,_範囲下限,_範囲上限,_入力項目名]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/952 # # [1] 授業単元:Cプログラミング初級 # [2] 問題文(含コード&リンク): # http://ime.nu/detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1035220915 # (バブルソートでやっていただけると助かります) # # (資料) # http://ime.nu/www.geocities.jp/hagure874/kapu.html#1 # http://ime.nu/detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1337454033 # # # 任意の4桁の数字(ぞろ目を除き、0023なども存在する)を入力し、最終的なカプレカ数と # その反復回数を出力するプログラムの作り方を教えてください。 カプレカ数(X) :- findall(Y,( for(1,N,10000), U is random mod 1000, カプレカ数(U,_,Y)), L), all(L,X). カプレカ数(N,_反復回数,_カプレカ数) :- カプレカ数(N,[],[],_反復回数,_カプレカ数). カプレカ数(N,[N|R],Ln,_反復回数,_カプレカ数) :- length(Ln,_反復回数),!. カプレカ数(N,L1,Ln,X) :- N4 is N // 1000, N41 is N mod 1000, N3 is N41 // 100, N31 is N41 mod 100, N2 is N31 // 10, N1 is N31 mod 10, \+([N1,N2,N3,N4]=[A,A,A,A]), カプレカ最小数([N1,N2,N3,N4],_最小数), カプレカ最大数([N1,N2,N3,N4],_最大数), N5 is _最大数 - _最小数, カプレカ数(N5,[N|L1],[_|Ln],X). カプレカ最小数([N1,N2,N3,N4],_最小数) :- パブルソート([N1,N2,N3,N4],[A,B,C,D]), _最小数 is A * 1000 + B * 100 + C * 10 + D,!. カプレカ最大数([N1,N2,N3,N4],_最大数) :- バブルソート([N1,N2,N3,N4],[D,C,B,A]), _最大数 is A * 1000 + B * 100 + C * 10 + D,!. バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一),!, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). % 以下のサイトは # 整列したならびが与えられたとしてその上位N名を入選とする。ただし、入選線上者が # 多数いる場合は、そのすべてを入選者とする '整列したならびが与えられたとしてその上位N名を入選とする。ただし、入選線上者が多数いる場合は、そのすべてを入選者とする'(_整列したならび,_上位N名,_入選ならび) :- 入選同着問題(_整列したならび,_上位N名,_入選ならび). 入選同着問題(_整列したならび,_入選者数,_入選ならび) :- integer(_入選者数), length(Ln,_入選者数), 入選同着問題(_整列したならび,Ln,_入選ならび). 入選同着問題([],_,[]) :- !. 入選同着問題([A,A|R1],[_],[A|L0]) :- append(L0,[B|_],[A|R1]), \+(A=B), all(L0,A),!. 入選同着問題([A,B|R1],[_],[A]) :- \+(A=B),!. 入選同着問題([A|R1],[_|Ln],[A|R3]) :- 入選同着問題(R1,Ln,R3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/815 # # こんなレコードが格納されているとします。 # ID,NO # 100,1 # 102,2 # 101,3 # 200,1 # 201,2 # 202,3 # この場合、IDを100番台、200番台でグルーピングして、各グループ毎にNO順にSELECTで出力しようとした場合、どのような条件にすればよいでしょうか? # IDはこの例では3桁ですが、実際には6桁程あり、出来ればWHERE句で数字を入れて指定するような事はせずに並び替えが出来ると嬉しいです。 # 要は、レコードが増えてグループが増えたりしても、条件を変えずに並び替えが出来るようなものが良いのですが、可能でしょうか? # 宜しくご教示願います。 # # 'IDを100番台、200番台でグルーピングして、各グループ毎にNO順に出力する' :- findsetof(_ID,( テーブル(_ID,_NO), _ID_1 is (_ID // 100) + 1), _IDグループならび), findall(LL1,( append(_,[_ID_1|_],_IDグループならび), findall([_NO,_ID],( テーブル(_ID,_NO), _ID_1 is (_ID // 100) + 1), LL1)), LL2), 各グループ毎にNO順に出力する(LL2). 各グループ毎にNO順に出力する(LL) :- append(_,[L1|R1],LL), 整列(L1,L2), append(_,[[_NO,_ID]|R2],L2), write_formatted('%t,%t\n',[_ID,_NO]), R2 = [], R1 = [],!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/703 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # # 1..キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む関数を作れ。ただし、nの値とファイル名は引数として取得するものとする。 # 2..引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する関数を作れ。 # 3..以上で作成した関数を使用し、プログラムを完成せよ。ただし、nの値と使用するファイルの名前はプログラムの引数として与えられるものとする。 キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む。その後そのファイルから情報を読み込み学生番号順に表示する(_n,_ファイル名) :- キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む(_n,_ファイル名), 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_n,_ファイル名). 'キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む'(_n,_ファイル名) :- write('学生番号と氏名の組みをカンマ区切りで%t行入力してください : '), length(L,_n), findall(_行,( append(_,[_行|_],L)), L), put_lines(_ファイル名,L). 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_n,_ファイル名) :- length(LL1,_n), see(_ファイル名), findall([_学生番号,_氏名],( append(_,[_|_],L1L), get_split_line(Instream,[','],[_学生番号,_氏名])), LL1), close(Instream), sort(LL1,LL2), append(_,[L|R],LL2), write_formatted('%t%t\n',L), R = []. % 以下のサイトは # 出典:: 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/php/1168450843/675 # # 質問です。PHP5.3でpreg_matchを使っているのですが、例えば # 「次章(第20条の3、第1節の3、・・・除き、建築基準法第80条の2にあっては・・・」 # という文章より法律名称や条などをwhileループで拾い上げたいのですが、 # '「次章(第20条の3、第1節の3、・・・除き、建築基準法第80条の2にあっては・・・」という文章より法律名称や条などをwhileループで拾い上げたい'(_文,_法律名称や条のならび) :- 法律名称を拾う(_文,0,_開始位置付き法律名称ならび), 条を拾う(_文,_開始位置付き条ならび), 法律名称と条を出現順にならびとする(_開始位置付き条ならび,_法律名称や条ならび). 法律名称を拾う(_文,_開始位置,[[_開始位置1,S2]|R]) :- sub_atom(_文,_相対開始位置,_長さ,_,S1,S2,S3,L1,L2,L3), sub_atom(S2,_,1,0,法), 法律名称(S2), _開始位置1 is _開始位置 + _相対開始位置, _開始位置2 is _開始位置 + _相対開始位置 + _長さ, 法律名称を拾う(S3,_開始位置2,R),!. 条を拾う(_文,[[_開始位置1,S2]|R]) :- sub_atom(_文,_相対開始位置,_長さ,_,S1,S2,S3,L1,L2,L3), sub_atom(S2,0,1,_,第), sub_atom(S2,_,1,0,条), _開始位置1 is _開始位置 + _相対開始位置, _開始位置2 is _開始位置 + _相対開始位置 + _長さ, 条を拾う(S3,_開始位置2,R). 法律名称と条を出現順にならびとする(_開始位置付き法律名称ならび,_開始位置付き条ならび,_法律名称や条ならび) :- append(_開始位置付き法律名称ならび,_開始位置付き条ならび,L1), sort(L1,L2), findall(_法律名称または条,( append(_,[[_,_法律名称や条]|_],L2)), _法律名称や条ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/626 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # # 問題1メイン関数でキーボードから二つの整数n1とn2を読み込み,それらをexponent関数を呼び出して, # n1のn2乗を計算し,結果をメイン関数で表示するプログラムを書きなさい. # <実行例> # 二つの整数を入力してください. # n1 = 5 # n2 = 2 # 5の2乗は25です. # 問題2 5人の点数を読み込んでいき、その最高点を表示するプログラムを作成しなさい。 # 問題3 円の面積の一覧表を計算するプログラムを作成しなさい。 # <実行結果> # 半径 --- 面積 # 1.0 --- 3.14 # 1.1 --- 3.80 # 1.2 --- 4.52 # 1.3 --- 5.31 # 問題4 球の体積を計算するプログラムを作成しなさい。 # 実行例 # 体積 = 1766.25 '5人の点数を読み込んでいき、その最高点を表示する' :- '5人の点数を読み込んでいき'(_5人の点ならび), 最高点を表示する(_5人の点ならび). '5人の点数を読み込んでいき'(_5人の点ならび) :- length(_5人の点ならび,5), findall(_点数,( append(L0,[_点数|_],_5人の点ならび), 点数を得る(L0,_点数)), _5人の点ならび),!. 点数を得る(L0,_点数) :- length([_|L0],N人目), writef('%t人目の点数を入力してください : ',[N人目]), get_line(Line), 点数の入力診断(Line,_点数),!. 点数を得る(L0,_点数) :- 点数を得る(L0,_点数). 点数の入力診断(Line,_) :- atom_to_term(Line,_点数,_), number(_点数),!. 点数の入力診断(Line,_点数) :- writef('入力された %t からは点数が得られません。再入力をお願いします\n',[Line]), fail. 最高点を表示する(_5人の点ならび) :- 最高点を(_5人の点ならび,_最高点), 表示する(_最高点). 最高点を(_5人の点ならび,_最高点) :- sort(_5人点ならび,_昇順に整列した5人の点ならび), last(_昇順に整列した5人の点ならび,_最高点). 表示する(_最高点) :- writef('最高点は%tです\n',[_最高点]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/777 # # 【質問テンプレ】 # # ・DBMS名とバージョン # Mysql 4.0.27 # # ・テーブルデータ # a_tbl # ID | DATE     | DATA # --+----------+----- # 1 | 20081111 | あああ # 2 | 20071111 | いいい # # b_tbl # ID | DATE     | DATA # --+----------+----- # 1 | 20081110 | えええ # 2 | 20081109 | おおお # # c_tbl # ID | DATE     | DATA # --+----------+----- # 1 | 20081108 | ききき # 2 | 20071109 | くくく # # # ・欲しい結果 # # ID | DATE     | DATA # --+----------+----- # a1 | 20081111 | あああ # b1 | 20081110 | えええ # b2 | 20081109 | おおお # c1 | 20081108 | ききき # # # ・説明 # 上記のような別々の3つのテーブルからDATEの新しい順にソートして、 # かつ各テーブルの行データを出力したいのですが、 # どのようにすればよいでしょうか? # # '別々の3つのテーブルから、かつ各テーブルの行データを出力する' :- findall([_DATE,_TID,_DATA],( a_table(_ID,_DATE,_DATA), concat_atom([a,_ID],_TID)), LL1), findall([_DATE,_TID,_DATA],( b_table(_ID,_DATE,_DATA), concat_atom([b,_ID],_TID)), LL2), findall([_DATE,_TID,_DATA],( a_table(_ID,_DATE,_DATA), concat_atom([a,_ID],_TID)), LL3), 'DATEの新しい順にソートして'(LL1,LL2,LL3,LL), 各テーブルの行データを出力する(LL). 'DATEの新しい順にソートして'(LL1,LL2,LL3,LL) :- sort(LL1,LL12), sort(LL2,LL22), sort(LL3,LL32), merge_sort(LL12,LL22,LL4), merge_sort(LL4,LL32,LL),!. merge_sort([],L,L) :- !. merge_sort(L,[],L) :- !. merge_sort([A|R1],[B|R2],[A|R3]) :- A @>= B, merge_sort(R1,[B|R2],R3),!. merge_sort([A|R1],[B|R2],[B|R3]) :- A @< B, merge_sort([A|R1],R2,R3),!. 各テーブルの行データを出力する(LL) :- append(_,[[_DATE,_TID,_DATA]|R],LL), write_formatted('%t,%t,%t\n',[_TID,_DATE,_DATA]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/287 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1356601.txt # # 問題2 # 配列の各要素(20個)に、3桁の乱数を代入し、この配列データの大きい順に並べ替えよ # このとき、ソートの円形として、第2配列を用意してこれに移し変える処理を考えよ # (第1配列上で大きいデータを順に取り出し、第2配列に移し替える。第1配列データはそのまま残しておく) 'ならびの各要素(20個)に、3桁の乱数を代入し、このデータの大きい順に並べ替えよ'(_降順に整列されたならび) :- 'ならびの各要素(20個)に、3桁の乱数を代入し'(_ならび), このデータの大きい順に並べ替えよ(_ならび,_降順に整列されたならび). 'ならびの各要素(20個)に、3桁の乱数を代入し'(_ならび) :- length(_ならび,20), '3桁の乱数を代入し'(_ならび). '3桁の乱数を代入し'(_ならび) :- findall(_3桁の乱数,( append(_,[_3桁の乱数|_],_ならび), _3桁の乱数 is (random mod 900) + 100), _ならび),!. このデータの大きい順に並べ替えよ([],[]) :- !. このデータの大きい順に並べ替えよ(_ならび,_降順に整列されたならび) :- _ならび = [_最初の要素|_残りの要素], 最初の要素に対し大きい小さいで分割する(_最初の要素,_残りの要素,_最初の要素より小さい要素,_最初の要素に等しいか大きい要素), このデータの大きい順に並べ替えよ(_最初の要素より小さい要素,_降順に整列された最初の要素より小さい要素), このデータの大きい順に並べ替えよ(_最初の要素に等しいか大きい要素,_降順に整列された最初の要素に等しいか大きい要素), append(_降順に整列された最初の要素に等しいか大きい要素,[_最初の要素|_降順に整列された最初の要素より小さい要素],_降順に整列されたならび). 最初の要素に対し大きい小さいで分割する(_,[],[],[]) :- !. 最初の要素に対し大きい小さいで分割する(_最初の要素,[A|R],[A|_最初の要素より小さい要素],_最初の要素に等しいか大きい要素) :- A @< _最初の要素, 最初の要素に対し大きい小さいで分割する(_最初の要素,R,_最初の要素より小さい要素,_最初の要素に等しいか大きい要素),!. 最初の要素に対し大きい小さいで分割する(_最初の要素,[A|R],_最初の要素より小さい要素,[A|_最初の要素に等しいか大きい要素]) :- A @>= _最初の要素, 最初の要素に対し大きい小さいで分割する(_最初の要素,R,_最初の要素より小さい要素,_最初の要素に等しいか大きい要素),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/215 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # (1)商品情報(商品コード、品名,価格,在庫量、入荷日)を、ファイルから線形リストに商品コードの昇順に読み込む。 # (2)線形リストの全データを画面に出力する。 # (3)指定した条件(品名)に合う商品情報を画面に出力する。 # '商品情報(商品コード、品名,価格,在庫量、入荷日)を、ファイルから線形リストに商品コードの昇順に読み込む'(_商品コードの昇順の商品情報ならび) :- open(_ファイル,read,Insteam), findall([_商品コード,_品名,_価格,_在庫量,_入荷日],( repeat, read(Instream,商品情報(_商品コード,_品名,_価格,_在庫量,_入荷日))), L1), close(Instream), sort(L1,_商品コード昇順の商品情報ならび). '線形リストの全データを画面に出力する'(_商品コード昇順の商品情報ならび) :- append(_,[_商品情報|R],_商品コード昇順の商品情報ならび), write_formatted('%q,%q,%q,%q,%q\n',_商品情報), R = []. '指定した条件(品名)に合う商品情報を画面に出力する'(_商品情報ならび,_指定した条件としての品名) :- append(_,[_商品コード,_指定した条件としての品名,_価格,_在庫量,_入荷日]|_],_商品情報ならび), write_formatted('%q,%q,%q,%q,%q\n',[_商品コード,_指定した条件としての品名,_価格,_在庫量,_入荷日]), fail. '指定した条件(品名)に合う商品情報を画面に出力する'(_商品情報ならび,_指定した条件としての品名) :- write('これ以上情報はありません\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/32 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): #   巡回セールスマン問題 #   いくつかの都市と都市間を結ぶ経路があります。全ての都市を一巡するのに最も短い経路を求めるプログラムを作成せよ。 #   TSPのデータファイルはgr17.txtで、数字の部分が都市数です。 #   ファイルの記述の仕方が以下のようになっています。 # #   gr17.txtの例 # #   17   最初の数値は都市数 #   0    第0都市と第0都市との距離が0 #   633 0  第1都市と第0都市との距離が633、第1都市と第1都市との距離が0 #   257 390 0 第2都市と第0、第1、第2都市との距離がそれぞれ257,390,0 #   91 661 228 0 以下同様 #   412 227 169 383 0 # 150 488 112 120 267 0 #      以下略 # #   補足説明として #   ・同じ道を通ってもよい #   ・全ての都市を1回通ればよい(巡回しなくていい) #   ・全探索はなるべく使用しないで深さ優先探索、分子限定法を用いること # # 17 # 0 # 633 0 # 257 390 0 # 91 661 228 0 # 412 227 169 383 0 # 150 488 112 120 267 0 # 80 572 196 77 351 63 0 # 134 530 154 105 309 34 29 0 # 259 555 372 175 338 264 232 249 0 # 505 289 262 476 196 360 444 402 495 0 # 353 282 110 324 61 208 292 250 352 154 0 # 324 638 437 240 421 329 297 314 95 578 435 0 # 70 567 191 27 346 83 47 68 189 439 287 254 0 # 211 466 74 182 243 105 150 108 326 336 184 391 145 0 # 268 420 53 239 199 123 207 165 383 240 140 448 202 57 0 # 246 745 472 237 528 364 332 349 202 685 542 157 289 426 483 0 # 121 518 142 84 297 35 29 36 236 390 238 301 55 96 153 336 0 # # 'いくつかの都市と都市間を結ぶ経路があります。全ての都市を一巡するのに最も短い経路を求めるプログラムを作成せよ。'(_出発都市,_最短経路) :- グラフを読み取る(LL), グラフを作成する(LL,_都市数), findmin([_距離合計,_巡回ならび],( 巡回(_都市数,_出発都市,_巡回ならび,_距離合計)), [_距離合計,_最短経路]). グラフを読み取る(LL) :- get_split_lines('gr17.txt',[' '],LL). グラフを作成する([_都市数|R],_都市数) :- グラフを作成する([],R). グラフを作成する([],_) :- !. グラフを作成する([_|Ln],[L|R]) :- length(Ln,_都市N), 都市間の距離定義([],Ln,L), グラフを作成する(Ln,R). 都市間の距離定義(Ln,Ln,[]) :- !. 都市間の距離定義(Ln,_都市N,[A|R]) :- !. length(Ln,_都市M), assertz(都市間の距離(_都市N,_都市M,A)), assertz(都市間の距離(_都市M,_都市N,A)), 都市間の距離定義([_|Ln],_都市N,R). 巡回(_都市数,_出発都市,_巡回ならび,_距離合計) :- 都市間の距離(_出発都市,_隣接都市,_距離), 巡回(_都市数,_出発都市,_隣接都市,[_出発都市],_巡回ならび,_距離,_距離合計). 巡回(_都市数,_出発都市,_出発都市,_巡回ならび,_巡回ならび,距離合計,_距離合計) :- sort(_巡回ならび,_巡回ならびの二), length(_巡回ならびの二,_都市数),!. 巡回(_都市数,_出発都市,_隣接都市,_巡回ならびの一,_巡回ならび,距離合計の一,_距離合計) :- 都市間の距離(_隣接都市,_隣接都市の二,_距離), \+(append(_,[_隣接都市の二,_隣接都市|_],_巡回ならびの一)), _距離合計の二 is _距離合計の一 + _距離, 巡回(_都市数,_出発都市,_隣接都市の二,[_隣接都市|_巡回ならびの一],_巡回ならび,_距離合計の二,_距離合計). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/884 # # 分からないプログラミング課題があります。 # 問)N個の文字列を入力すると文字列の長さが短い順、同じ長さの時は順不同、に #   並べ替えて表すプログラムを作りなさい。 # # 二次元配列とポインタ配列を使うらしいんですけど、コンパイル時にエラーばかり出てしまいます。 # どなたか分かる方いらっしゃいますか? # 'N個の文字列を入力すると文字列の長さが短い順、同じ長さの時は順不同、に並べ替えて表す' :- 'N個の文字列を入力すると'(_N個の文字列), '文字列の長さが短い順、同じ長さの時は順不同、に並べ替えて'(_N個の文字列,_長さ順に並べ替えた文字列), 表す(_長さ順に並べ替えた文字列). 'N個の文字列を入力すると'(_N個の文字列) :- 'N個の'(_N個), length(_N個の文字列,_N個), 'N個の文字列を入力する'(_N個の文字列). 'N個の'(_N個) :- write('何個の文字列を入力しますか : '), get_line(Line), 'N個の入力診断'(Line,_N個),!. 'N個の'(_N個) :- 'N個の'(_N個). 'N個の入力診断'(Line,_N個) :- atom_to_term(Line,_N個,_), integer(_N個), _N個 > 0,!. 'N個の入力診断'(Line,_N個) :- write_formatted('入力された %t からは正の整数が得られません。再入力をお願いします。\n',[Line]), fail. 'N個の文字列を入力する'([]) :- !. 'N個の文字列を入力する'([_文字列|R]) :- 'N個の文字列を入力する'(R). '文字列の長さが短い順、同じ長さの時は順不同、に並べ替えて'(_N個の文字列,_長さの短い順に並べ替えた文字列ならび) :- findall([_長さ,_文字列],( append(_,[_文字列|_],_N個の文字列), sub_atom(_文字列,0,_長さ,0,_文字列)), _長さを鍵に整列したならび), sort(長さを鍵に整列した,_長さの短い順に並べ替えた文字列ならび). 表す(_長さの短い順に並べ替えた文字列ならび) :- append(_,[[_|_文字列]|R],_長さの短い順に並べ替えた文字列ならび), write_formatted('%t\n',[_文字列]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/712 # # [1] 授業単元:プログラミングとアルゴリズム # [2] 問題文(含コード&リンク):以下の課題をBinary search 関数の再帰呼び出しで実現しなさい。 # 0 から100 までの範囲で整数の乱数を1000 個発生させ、Bubble sort 関数で整列させた後、ターゲット整数を再帰で検索するBinary search 関数を作って下のプログラム(rbinsearch.c) を完成させなさい。 # '0 から100 までの範囲で整数の乱数を1000 個発生させ、Bubble sort 関数で整列させた後、ターゲット整数を再帰で検索する'(_ターゲット整数) :- '0 から100 までの範囲で整数の乱数を1000 個発生させ'(L), 'Binary Search'(_ターゲット整数,L). '0 から100 までの範囲で整数の乱数を1000 個発生させ'(L1) :- findall(N,( for(1,_,1000), N is random mod 1000), L1), バブルソート(L1,L2), 'Binary Search'(_ターゲット整数,L2). 'Binary Search'(_ターゲット整数,L) :- length(L,N), N_1 is N // 2, length(L1,N_1), append(L1,[A|R],L), 'Binary Search'(_ターゲット整数,L1,A,R) :- 'Binary Search'(_ターゲット整数,L1,_ターゲット整数,R) :- !. 'Binary Search'(_ターゲット整数,L1,A,R) :- _ターゲット整数 @< A, 'Binary Search'(_ターゲット整数,L1). 'Binary Search'(_ターゲット整数,L1,A,R) :- _ターゲット整数 @>= A, 'Binary Search'(_ターゲット整数,R). バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一),!, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A,R1],[A|R2]) :- 交換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/654 # # [1] 授業単元: プログラミング言語演習 # [2] 問題文(含コード&リンク): # プログラムにより並べ替えるプログラムを作れ # 直接基数プログラム # int i, j, pass, count[256]; # for(pass = 0; pass < 4; pass++){ # for(j = 0;j < 256;j++) # count[j] = 0; # for(i = 1;i <= n; i++) # count[bits(a[i],pass*8,8)]++; # for(j = 1;j < 256;j++) # count[j] = count[j-1] + count[j]; # for(i = n; i >= 1;i--) # b[count[bits(a[i],pass*8,8)]--] = a[i]; # for(i = 1; i <= n; i++) # a[i] = b[i]; # } # 直接基数ソートとはランダムに出た数字を二進数に直し、順番に並び変える # プログラムです。 直接基数整列とは乱順に出た数字を二進数に直し、順番に並び変える(_要素数,_整列されたならび) :- length(Ln,_要素数), 乱順に出た数字を二進数に直し(Ln,_乱順に出た数字と反転した二進数字のペアならび), 基数整列(_乱順に出た数字と反転した二進数字のペアならび,_整列されたならび). 乱順に出た数字を二進数に直し([],[]) :- !. 乱順に出た数字を二進数に直し([_|Ln],[[_乱順に出た数字,_反転した乱順に出た二進数字]|R]) :- _乱順に出た数字 is random, 二進数(_乱順に出た数字,_乱順に出た二進数字), reverse(_乱順に出た二進数字,_反転した乱順に出た二進数字), 乱順に出た数字を二進数に直し(Ln,R). 基数整列(L1,L2) :- 基数整列(L1,L3,L4), append(L3,L4,L5), 基数整列(L5,L2). 基数整列(L1,L2) :- findall(N,append(_,[[N|_]|_],L1),L2),!. 基数整列([],[],[]) :- !. 基数整列([[N,[0|R1]]|R11],[[N,R1]|R2],R3) :- 基数整列(R11,R2,R3),!. 基数整列([[N,[1|R1]]|R11],R2,[[N,R1]|R2],R3) :- 基数整列(R11,R2,R3),!. 二進数(J,Y,[J|Y]) :- J < 2. 二進数(J,Y,X) :- J >= 2, J2 is J // 2, M is J mod 2, 二進数(J2,[M|Y],X). 二進数(_10進数,L) :- length(L,32), 二進数(_10進数,[],X), append(L1,X,L), L1 all 0. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/514 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルに保存された携帯電話データをコマンド選択により処理する # 携帯電話情報管理プログラムを作成せよ # # 右のテキストファイルを左のように書き換える(昇順ソート) # 2 SC-02B docomo 12 118     1 003SH softbank 12 139 # 3 IS03 au 13 138        → 2 SC-02B docomo 12 118 # 1 003SH softbank 12 139     3 IS03 au 13 138 # # 鍵情報(Line,_鍵) :- split(Line,[' '],[_,_,_,_鍵]). 切り出し指定行数(100). 昇順併合整列(_対象ファイル) :- tmpnam(_併合ファイル1), open(_併合ファイル1,read,Instream1), open(_対象ファイル,read,Instream), 昇順併合整列(Instream,Instream1,_併合ファイル1,_整列済みファイル), 整列済みファイルの表示(_整列済みファイル). 昇順併合整列(Instream,Instream1,_併合ファイル,_併合ファイル) :- at_end_of_stream(Instream), close(Instream), close(Instream1). 昇順併合整列(Instream,Instream1,_,_併合ファイル) :- tmpnam(_併合ファイル1), 先頭から指定行の整列(100,Instream,_整列したならび), open(_併合ファイル,write,Outstream), 昇順併合整列(_整列したならび,Instream1,_Outstream), close(Outstream), close(Instream1), open(_併合ファイル1,read,Instream2), 昇順併合整列(Instream,Instream2,_併合ファイル1,_併合ファイル). 昇順併合整列(_整列したならび,_整列ファイル,_併合ファイル) :- open(_整列ファイル,read,Instream), open(_併合ファイル,write,Outstream), get_line(Instream,Line), 昇順併合整列(Instream,Outstream,_整列したならび,Line), close(Outstream), close(Instream). 先頭から指定行の整列(Instream,_整列したならび) :- 切り出し指定行数(_切り出し指定行数), get_line(Insteam,Line), 先頭から指定行の切り出し(100,Instream,Line,_100行), 鍵指定整列(_切り出し指定行数,_整列したならび),!. 先頭から指定行の切り出し(1,Instream,Line,[Line]) :- !. 先頭から指定行の切り出し(_,Instream,end_of_file,[]) :- !. 先頭から指定行の切り出し(N,Instream,Line,[Line|R]) :- get_line(Instream,Line2), N1 is N - 1, 先頭から指定行の切り出し(N,Instream,Line2,R). 昇順併合整列(Instream,Outstream,[],end_of_file) :- !. 昇順併合整列(Instream,Outstream,[],Line) :- write_formatted(Outstream,'%t\n',[Line]), get_line(Instream,Line2), 昇順併合整列(Instream,Outstream,[],Line2),!. 昇順併合整列(Instream,Outstream,[A|R],Line) :- A @>= Line, get_line(Instream,Line2), 昇順併合整列(Instream,Outstream,[A|R],Line2),!. 昇順併合整列(Instream,Outstream,[A|R],Line) :- A @< Line, write_formatted(Outstream,'%t\n',[A]), 昇順併合整列(Instream,Outstream,R,Line),!. 昇順併合(Instream1,Instream2,Outstream) :- get_line(Instream1,Line1), get_line(Instream2,Line2), 昇順併合(Instream1,Instream2,Outstream,Line1,Line2). 昇順併合(Instream1,Instream2,Outstream,Line1,Line2) :- 鍵情報(Line1,_鍵1), 鍵情報(Line2,_鍵2), _鍵1 @=< _鍵2, write_formatted(Outstream,'%t\n',[Line1]), get_line(Instream1,Line), 昇順併合(Instream1,Instream2,Outstream,Line,Line2). 昇順併合(Instream1,Instream2,Outstream,Line1,Line2) :- write_formatted(Outstream,'%t\n',[Line2]), get_line(Instream2,Line), 昇順併合(Instream1,Instream2,Outstream,Line1,Line). 整列済みファイルの表示(_整列済みファイル) :- open(_整列済みファイル,read,Instream), get_line(Instream,Line), 整列済みファイルの表示(Instream,Line), close(Instream). 整列済みファイルの表示(_,end_of_file) :- !. 整列済みファイルの表示(Instream,Line) :- write_formatted('%t\n',[Line]), get_line(Instream,Line2), 整列済みファイルの表示(Instream,Line2). 鍵指定昇順整列([],[]) :- !. 鍵指定昇順整列([A|R],L) :- 鍵指定昇順分割(A,R,_Aより小さい,_Aと等しいか大きい), 鍵指定昇順整列(_Aより小さい,L1), 鍵指定昇順整列(_Aと等しいか大きい,L2), append(L1,[A|L2],L). 鍵指定昇順分割(A,[],[],[]) :- !. 鍵指定昇順分割(A,[_行|R],_Aより小さい,_Aと等しいか大きい) :- 鍵情報(A,_鍵1), 鍵情報(_行,_鍵2), _鍵1 @> _鍵2, 鍵指定昇順分割(A,R,[_行|_Aより小さい],_Aと等しいか大きい). 鍵指定昇順分割(A,[_行|R],_Aより小さい,_Aと等しいか大きい) :- 鍵情報(A,_鍵1), 鍵情報(_行,_鍵2), _鍵1 @=< _鍵2, 鍵指定昇順分割(A,R,_Aより小さい,[_行|_Aと等しいか大きい]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/711 # # Oracleのソートだと数字→英字になっていまいますが # これをSQLで逆にソートする方法はありますか。 # # '英字-数字順整列'(L1,L2) :- L1 = [A|R], '英字-数字順整列'(A,R,L2). '英字-数字順整列'(_,[],[]) :- !. '英字-数字順整列'(A,R,L2) :- '英字-数字順整列の分割'(A,R_Aに等しいかより小さいならび,_Aより大きいならび), '英字-数字順整列'(_Aより小さいならび,_整列したAより小さいならび), '英字-数字順整列'(_Aより大きいならび,_整列したAより大きいならび), append(_整列したAより小さいならび,[A|_整列したAより大きいならび],L2). '英字-数字順整列の分割'(_文字1,[],[],[]) :- !. '英字-数字順整列の分割'(_文字1,[_文字2|R1],[_文字2|R2],R3) :- 'ソートの大小比較規則の変更'(@>=,_文字1,_文字2), '英字-数字順整列の分割'(_文字1,R1,R2,R3). '英字-数字順整列の分割'(_文字1,[_文字2|R1],R2,[_文字2|R3]) :- 'ソートの大小比較規則の変更'(@<,_文字1,_文字2), '英字-数字順整列の分割'(_文字1,R1,R2,R3). 'ソートの大小比較規則の変更'(@>,_文字1,_文字2) :- 数字(_文字1), 英字(_文字2),!. 'ソートの大小比較規則の変更'(@>,_文字1,_文字2) :- _文字1 @> _文字2,!. 'ソートの大小比較規則の変更'(@>=,_文字1,_文字2) :- 数字(_文字1), 英字(_文字2),!. 'ソートの大小比較規則の変更'(@>=,_文字,_文字) :- !. 'ソートの大小比較規則の変更'(@<,_文字1,_文字2) :- 数字(_文字2), 英字(_文字1),!. 'ソートの大小比較規則の変更'(@<,_文字1,_文字2) :- _文字1 @< _文字2,!. 'ソートの大小比較規則の変更'(@=<,_文字1,_文字2) :- 数字(_文字2), 英字(_文字1),!. 'ソートの大小比較規則の変更'(@=<,_文字,_文字) :- !. 'ソートの大小比較規則の変更'(=,_文字,_文字) :- !. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/347 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # # 東北地方の県のデータを打ち出すプログラムを作成しなさい。ただし、東北地方かどうかの判定をする部分は関数を使うこと。 # # 県データの1行からなる構造体を受取る関数とする。該当すればYを戻り値として返すようにする。) # 判定をする際の県名の比較は、関数側に県名の二次元配列を持ち、標準関数strcmpを使う。string.h のinclude を忘れないように。 # strcmp(文字列1,文字列2) は文字列が一致すれば0を返す。 # # コード例示: http://ime.nu/minus-k.com/nejitsu/loader/up84923.jpg # 県データ: http://ime.nu/minus-k.com/nejitsu/loader/up84924.txt # # Hokkaido 5683 83453 # Aomori 1476 9606 # Iwate 1416 15278 # Miyagi 2365 7285 # Akita 1189 11612 # Yamagata 1244 9323 # Fukushima 2127 13782 # Ibaraki 2985 6096 # Tochigi 2005 6408 # Gumma 2025 6363 # Saitama 6938 3797 # Chiba 5926 5156 # Tokyo 12059 2187 # Kanagawa 8490 2415 # Niigata 2476 12582 # Toyama 1121 4247 # Ishikawa 1181 4185 # Fukui 829 4189 # Yamanashi 888 4465 # Nagano 2214 13585 # Gifu 2108 10598 # Shizuoka 3767 7779 # Aichi 7043 5156 # Mie 1857 5776 # Shiga 1343 4017 # Kyoto 2644 4613 # Osaka 8805 1893 # Hyogo 5551 8392 # Nara 1443 3691 # Wakayama 1070 4726 # Tottori 613 3507 # Shimane 761 6707 # Okayama 1951 7112 # Hiroshima 2879 8477 # Yamaguchi 1528 6110 # Tokushima 824 4145 # Kagawa 1023 1876 # Ehime 1493 5676 # Kochi 814 7105 # Fukuoka 5016 4971 # Saga 877 2439 # Nagasaki 1517 4092 # Kumamoto 1859 7404 # Oita 1221 6338 # Miyazaki 1170 7734 # Kagoshima 1786 9187 # Okinawa 1318 2271 東北地方の県のデータを人口密度の小さい順に打ち出す :- 東北地方の県のデータならび(_東北地方の県のデータならび), sort(_東北地方の県のデータならび,_人口密度を鍵に整列した東北地方の県のデータならび), write('人口密度,県名,面積,人口\n'), append(_,[[[_人口密度,_県名,_面積,_人口]|R],_人口密度を鍵に整列した東北地方の県のデータならび), write_formatted('%t,%t,%t,%t,%t\n',[_人口密度,_件名,_面積,_人口]), R = []. 東北地方の県のデータならび(_東北地方の県のデータならび) :- webサイトから読み出した東北地方の県のデータならび(_県のデータならび), findall([_人口密度,_県名,_面積,_人口],( append(_,[[_県名,_面積,_人口]|_],_県のデータならび), 東北地方(_県名), 人口密度(_面積,_人口,_人口密度)), _東北地方の県のデータならび). webサイトから読み出した東北地方の県のデータならび(_県のデータならび) :- w3c('http://nojiriko.asia/prolog/c144_347_1.html',L), 県のデータ部分のみを切り出す(L,_県のデータ部分ならび), findall(_県のデータ,( append(_,[_行|_],_県のデータ部分ならび), split(_行,[' '],['#'|_県のデータ])), _県のデータならび),!. 県のデータ部分のみを切り出す(L,_県のデータ部分ならび) :- append(_,[_行,_|R],L), \+(sub_atom(_行,0,7,_,'# 県のデータ')), append(_県のデータ部分ならび,[_行2|_],R), \+(sub_atom(_行2,0,1,_,'#')),!. 人口密度(_面積,_人口,_人口密度) :- _人口密度 is floor((_人口 / _面積) * 10 + 5) / 10. 東北地方('Aomori'). 東北地方('Iwate'). 東北地方('Akita'). 東北地方('Miyagi'). 東北地方('Yamagata'). 東方地方('Fukushima'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/347 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # # 東北地方の県のデータを打ち出すプログラムを作成しなさい。ただし、東北地方かどうかの判定をする部分は関数を使うこと。 # 県データの1行からなる構造体を受取る関数とする。該当すればYを戻り値として返すようにする。) # 判定をする際の県名の比較は、関数側に県名の二次元配列を持ち、標準関数strcmpを使う。string.h のinclude を忘れないように。 # strcmp(文字列1,文字列2) は文字列が一致すれば0を返す。 # # コード例示: http://ime.nu/minus-k.com/nejitsu/loader/up84923.jpg #  県データ: http://ime.nu/minus-k.com/nejitsu/loader/up84924.txt # # 東北地方の県のデータを人口密度の小さい順に打ち出す :- 東北地方の県のデータならび(_東北地方の県のデータならび), sort(_東北地方の県のデータならび,_人口密度を鍵に整列した東北地方の県のデータならび), write('人口密度,県名,面積,人口\n'), append(_,[[[_人口密度,_県名,_面積,_人口]|R],_人口密度を鍵に整列した東北地方の県のデータならび), write_formatted('%t,%t,%t,%t,%t\n',[_人口密度,_件名,_面積,_人口]), R = []. 東北地方の県のデータならび(_東北地方の県のデータならび) :- findall([_人口密度,_県名,_面積,_人口],( 県データ(_県名,_面積,_人口), 東北地方(_県名), 人口密度(_面積,_人口,_人口密度)), _東北地方の県のデータならび). 人口密度(_面積,_人口,_人口密度) :- _人口密度 is floor((_人口 / _面積) * 10 + 5) / 10. 東北地方('Aomori'). 東北地方('Iwate'). 東北地方('Akita'). 東北地方('Miyagi'). 東北地方('Yamagata'). 東方地方('Fukushima'). 県データ('Hokkaido',5683,83453). 県データ('Aomori',1476,9606). 県データ('Iwate',1416,15278). 県データ('Miyagi',2365,7285). 県データ('Akita',1189',11612). 県データ('Yamagata',1244,9323). 県データ('Fukushima',2127,13782). 県データ('Ibaraki',2985,6096). 県データ('Tochigi',2005,6408). 県データ('Gumma',2025,6363). 県データ('Saitama',6938,3797). 県データ('Chiba',5926,5156). 県データ('Tokyo',12059',2187). 県データ('Kanagawa',8490,2415). 県データ('Niigata',2476,12582). 県データ('Toyama',1121,4247). 県データ('Ishikawa',1181,4185). 県データ('Fukui',829',4189). 県データ('Yamanashi',888,4465). 県データ('Nagano',2214,13585). 県データ('Gifu',2108,10598). 県データ('Shizuoka',3767,7779). 県データ('Aichi',7043,5156). 県データ('Mie',185,576). 県データ('Shiga',1343,4017). 県データ('Kyoto',2644,4613). 県データ('Osaka',8805,1893). 県データ('Hyogo',5551,8392). 県データ('Nara',1443,3691). 県データ('Wakayama',1070,4726). 県データ('Tottori',613,3507). 県データ('Shimane',761,6707). 県データ('Okayama',1951,7112). 県データ('Hiroshima',2879',8477). 県データ('Yamaguchi',1528,6110). 県データ('Tokushima',824,4145). 県データ('Kagawa',1023,1876). 県データ('Ehime',1493,5676). 県データ('Kochi',814,7105). 県データ('Fukuoka',5016,4971). 県データ('Saga',877,2439). 県データ('Nagasaki',1517,4092). 県データ('Kumamoto',1859,7404). 県データ('Oita',1221,6338). 県データ('Miyazaki',1170,7734). 県データ('Kagoshima',1786,9187). 県データ('Okinawa',1318,2271). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/111 # # [1] 授業単元:アルゴリズム # [2] 問題文 # ・正の値をキーボードから入力。-の値の場合停止。 # ・入力された値をヒープ配列(入力された値の並びをヒープに)に格納。配列の大きさはランダムにしておく。 # そして降順に並びかえて画面に出力 # '正の値をキーボードから入力。-の値の場合停止。入力された値をヒープ配列(入力された値の並びをヒープに)に格納。配列の大きさはランダムにしておく。そして降順に並びかえて画面に出力 ' :- 配列を生成, 値をキーボードから入力(_値), '入力された値をヒープ配列(入力された値の並びをヒープに)に格納。配列の大きさはランダムにしておく。配列の大きさはランダムにしておく。'(_値). 降順に並びかえて画面に出力. '入力された値をヒープ配列(入力された値の並びをヒープに)に格納'(_負の値) :- '-の値の場合停止'(_負の値),!. '入力された値をヒープ配列(入力された値の並びをヒープに)に格納'(_正の値) :- retract(heap(L1)), append(L1,[V|R],L2), var(V), 全要素が変数でない(L1), V = _正の値, assertz(heap(L2)), 値をキーボードから入力(_値の二), '入力された値をヒープ配列(入力された値の並びをヒープに)に格納'(_値の二),!. 配列を生成 :- _要素数 is (random mod 90) + 10, length(L,_要素数), assertz(heap(L)). '-の値の場合停止'(_負の値) :- _負の値 < 0,!. '値をキーボードから入力'(_値) :- write('整数を入力してください : '), get_line(Line), 値をキーボードから入力の診断(Line,_値),!. '値をキーボードから入力'(_値) :- '値をキーボードから入力'(_値). 値をキーボードから入力の診断(Line,_値) :- atom_to_term(Line,_値,_), integer(_値),!. 値をキーボードから入力の診断(Line,_値) :- write_formatted('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '降順に並びかえて画面に出力' :- heap(L1), append(L0,[V|_],L1), var(V), 全要素が変数でない(L0), 降順に並びかえて(L0,L2), 画面に出力(L2). 全要素が変数ではない(L) :- 全要素が変数でない(L). 全要素が変数でない([]) :- !. 全要素が変数でない([A|R]) :- \+(var(A)), 全要素が変数でない(R). 降順に並びかえて(L1,L2) :- sort(L1,L3), reverse(L3,L2). 画面に出力([]) :- nl,!. 画面に出力([A|R]) :- write_formatted('%t '\n',[A]), 画面に出力(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/261 # # [1] 授業単元: プログラミング # [2] 問題文: 4つの整数s,m,l,xlを小さい順に並べ替えるプログラムを作成しなさい。 #       ただし、並び替えをする部分はユーザ定義関数化し、 #       並び替え後の結果をmain関数で出力するようにすること。 # '4つの整数s,m,l,xlを小さい順に並べ替える'(_s,_m,_l,_xl,_整列した名前ならび) :- length(L1,4), '整数・名前ならびを小さい順並べ替える'([[_m,m],[_l,l],[_xl,xl]],[[_s,s],_,_,[_s,s]],_整列した値ペアならび), 名前のみ取り出す(_整列した値ペアならび,_整列した名前ならび). '整数・名前ならびを小さい順並べ替える'([],[Min,C1,C2,Max],[Min,C1,C2,Max]) :- !. C1 @=< C2,!. '整数・名前ならびを小さい順並べ替える'([],[Min,C1,C2,Max],[Min,C2,C1,Max]) :- C1 @>C2,!. '整数・名前ならびを小さい順並べ替える'([A|R1],[Min,C1,C2,Max],L) :- A @< Min, var(C1), '整数・名前ならびを小さい順並べ替える'(R1,[A,Min,C2,Max],L). '整数・名前ならびを小さい順並べ替える'([A|R1],[Min,C1,C2,Max],L) :- A @< Min, var(C2), '整数・名前ならびを小さい順並べ替える'(R1,[A,C1,C2,Max],L). '整数・名前ならびを小さい順並べ替える'([A|R1],[Min,C1,C2,Max],L) :- A @> Max, var(C1), '整数・名前ならびを小さい順並べ替える'(R1,[Min,Max,C2,A],L). '整数・名前ならびを小さい順並べ替える'([A|R1],[Min,C1,C2,Max],L) :- var(C2), '整数・名前ならびを小さい順並べ替える'(R1,[Min,C1,A,Max],L). 名前のみ取り出す([],[]) :- !. 名前のみ取り出す([[_,A]|R1],[A|R2]) :- 名前のみ取り出す(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/83 # # ポーカーゲームを作るプログラムの課題を教えてください。 # [1] プログラムまとめ # [2] 課題1のストレート、フラッシュ、フルハウスをヒントを使って判定する関数を作る。 # ポーカーの役(_手札ならび,フラッシュ) :- フラッシュとは5枚の手札が全部同じマークになること。ただし、番号が連続している場合はストレートフラッシュといって別の役となる(_手札ならび). ポーカーの役(_手札ならび,ストレート) :- ストレートとは5枚の手札が連続した番号になること。ただし、マークが全部同じ場合はストレートフラッシュといって別の役となる(_手札ならび). ポーカーの役(_手札ならび,フルハウス) :- フルハウスとは3枚が同一番号で、別の番号の残り2枚も同一番号であるもの(_手札ならぴ). フラッシュとは5枚の手札が全部同じマークになること。ただし、番号が連続している場合はストレートフラッシュといって別の役となる(_手札ならび) :- 全部同じマーク(_手札ならび), ストレートフラッシュになるものを除外する(_手札ならび). 全部同じマーク(_手札ならび) :- all(_手札ならび,[_,_共通マーク]),!. ストレートフラッシュになるものを除外する(_手札ならび) :- 判断しやすいように番号順に並べ直す(_手札ならび,_番号順に整列した手札ならび), \+(番号が連続している(_番号順に整列した手札ならび)),!. ストレートとは5枚の手札が連続した番号になること。ただし、マークが全部同じ場合はストレートフラッシュといって別の役となる(_手札ならび) :- 判断しやすいように番号順に並べ直す(_手札ならび,_番号順に整列した手札ならび), 番号が連続している(_番号順に整列した手札ならび), \+(全部同じマーク(_手札ならび)). 判断しやすいように番号順に並べ直す(_手札ならび,_番号順に整列した手札ならび) :- sort(_手札ならび,_番号順に整列した手札ならび). 番号が連続している(_番号順に整列した手札ならび) :- 番号が連続していることを再帰的に確かめる(_番号順に整列した手札ならび). 番号が連続していることを再帰的に確かめる([[_カード番号1,_],[_カード番号2,_]|R]) :- _カード番号2 is _カード番号1 + 1, 番号が連続していることを再帰的に確かめる([_カード番号2|R]). 番号が連続していることを再帰的に確かめる([_]). フルハウスとは3枚が同一番号で、別の番号の残り2枚も同一番号であるもの(_手札ならぴ) :- 判断しやすいように番号順に並べ直す(_手札ならび,_番号順に整列した手札ならび), それぞれ同一番号の二枚、三枚組(_番号順に整列した手札ならび). それぞれ同一番号の二枚・三枚組([[_A,_],[_A,_],[_A,_],[_B,_],[_B,_]]) :- \+(A=B),!. それぞれ同一番号の二枚・三枚組([[_A,_],[_A,_],[_B,_],[_B,_],[_B,_]]) :- \+(A=B),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/83 # # ポーカーゲームを作るプログラムの課題を教えてください。 # [1] プログラムまとめ # [2] 課題1のストレート、フラッシュ、フルハウスをヒントを使って判定する関数を作る。 # ポーカーの役(_手札ならび,フラッシュ) :- すべての手札のマークが共通である(_手札ならび), ストレートではない(_手札ならび,ストレート),!. ポーカーの役(_手札ならび,ストレート) :- 並べ直して、番号は連続したカードは5枚あることを確認する(_整列した手札ならび), '同一マークではない'(_整列した手札ならび),!. ポーカーの役(_手札ならび,フルハウス) :- 並べ直して、同一番号の2枚、3枚組になっているか確認する(_手札ならび). すべての手札のマークが共通である(_手札ならび) :- all(_手札ならび,[_,_共通マーク]),!. ストレートではない(_手札ならび) :- \+(ポーカーの役(_手札ならび,ストレート)). 並べ直して(_手札ならび,_整列した手札ならび) :- sort(_手札ならび,_整列した手札ならび). 並べ直して、番号は連続したカードは5枚あることを確認する(_手札ならび) :- 並べ直して(_手札ならび,_整列した手札ならび), _整列した手札ならび = [_最小値|R], _最大値 is _最小値 + 4, findall(_番号,for(_最小値,_番号,_最大値),_整列した手札ならび), 同一マークではない(_整列した手札ならび) :- \+(all(_整列した手札ならび,[_,_共通マーク])),!. 並べ直して、同一番号の2枚、3枚組になっているか確認する(_手札ならび) :- 並べ直して(_手札ならび,_整列した手札ならび), 同一番号の2枚、3枚組になっている(_整列した手札ならび). 同一番号の2枚、3枚組になっている([[A,_],[A,_],[B,_],[B,_],[B,_]]) :- \+(A = B),!. 同一番号の2枚、3枚組になっている([[A,_],[A,_],[A,_],[B,_],[B,_]]) :- \+(A = B),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/83 # # ポーカーゲームを作るプログラムの課題を教えてください。 # [1] プログラムまとめ # [2] 課題1のストレート、フラッシュ、フルハウスをヒントを使って判定する関数を作る。 # # /* ヒント: この関数を使うと、 判定が簡単かも */ # void distrib(struct card h[], int dist[]){ # int i; # for(i = 0; i < 14; i++){ # dist[i] = 0;} # for(i = 0; i < 5; i++){ # dist[h[i].pips]++;}} # # int is_straight(struct card h[]){ # /* 課題1 */ # return 0;} # # int is_flush(struct card h[]){ # /* 課題1 */} # # int is_fullhouse(struct card h[]){ # /* 課題1 */ # return 0;} # # card h[] は手札のカード # h[].pips は手札のカードの番号 # h[].suit は手札のカードのマークのことです ポーカーの役(_手札ならび,フラッシュ) :- all(_手札ならび,[_,_共通マーク]), \+(ポーカーの役(_手札ならび,ストレート)),!. ポーカーの役(_手札ならび,ストレート) :- sort(_手札ならび,L), L = [Min|R], Max is Min + 4, findall(N,for(Min,N,Max),L), \+all(_手札ならび,[_,_共通マーク])),!. ポーカーの役(_手札ならび,フルハウス) :- findsetof(_番号,append(_,[[_番号,_]|_],_手札ならび),[_番号1,_番号2]), count(append(_,[[_番号1,_]|_],_手札ならび),Count1), Count1 >= 2, count(append(_,[[_番号2,_]|_],_手札ならび),Count2), Count2 >= 2,!. ポーカーの役(_手札ならび,フルハウス) :- sort(_手札ならび,L), フルハウス(L). フルハウス([[_A,_],[_A,_],[_B,_],[_B,_],[_B,_]]) :- \+(A = B),!. フルハウス([[_A,_],[_A,_],[_A,_],[_B,_],[_B,_]]) :- \+(A = B),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/825 # # すいませんが823は書き間違えました # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # ・ランダムな整数列を生成し,選択ソートにより並べ替えるプ # ログラムを作れ。 # (randを使用すること) # •またその実行時間を計測せよ # – UNIXのtime コマンドを使用すること # program :- user_parameters([A]), atom_to_term(A,_要素数,_), ランダムな整数列を生成し,選択ソートにより並べ替える(_要素数,_整列された整数列), halt. ランダムな整数列を生成し,選択ソートにより並べ替える(_要素数,_整列された整数列) :- ランダムな整数列を生成し(_要素数,_整数列), 選択ソート(_整数列,_整列された整数列). ランダムな整数列を生成し(_要素数,_整数列) :- length(_整数列,_要素数), ランダムな整数列を生成し(_整数列). ランダムな整数列を生成し([]) :- !. ランダムな整数列を生成し([_ランダムな数|R]) :- _ランダムな数 is random, ランダムな整数列を生成し(R). 選択ソート([],[]) :- !. 選択ソート(L1,L2) :- min(L1,Min), 選択ソート(Min,L1,L2). 選択ソート(_,[A],[A]) :- !. 選択ソート(Min,[Min|R],[Min|L2]) :- min(R,Min2), 選択ソート(Min2,R,L2),!. 選択ソート(Min,L1,[Min|L2]) :- append([A0|R0],[Min|R],L1), append(R0,[A0|R],L3), min(L3,Min2), 選択ソート(Min2,L3,L2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/571 # # SQLite3 です。 # # a-1 b-2 a-2 b-10 a-10 b-9 # が # a-1 a-2 a-10 b-2 b-9 b-10 # になるようにソートする方法はありますか? # ハイフンの後ろは必ず数値なんですが、 # a や b の部分の文字数は不定です。 # # 'a-1 b-2 a-2 b-10 a-10 b-9 が a-1 a-2 a-10 b-2 b-9 b-10 になるようにソートする'(L1,L2) :- findall(_鍵項目,テーブル(_鍵項目),L1), sort(L1,L2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'a-1 b-2 a-2 b-10 a-10 b-9 が a-1 a-2 a-10 b-2 b-9 b-10 になるようにソートする'(L1,L2) :- sort(L1,L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/562 # # 検索したい文字列より検索キーワードが多いけどだいたいあってるからHITさせたいみたいなことは可能ですか? # 例えば「にしむらひろゆき」という文字列にたいしてLIKEで'%ひろゆき%'はHITしますが、 # 「2ちゃんねる元管理人にしむらひろゆきさん」というキーワードで # この「にしむらひろゆき」にSQLだけでHITさせることは可能でしょうか? # # % % 対象文字列の長さが検索文字列と同じであるか、あるいは短い場合。 検索したい文字列より検索キーワードが多いけどだいたいあってるからHITさせる(_検索キーワード,_対象文字列,_検索された文字列より前の文字列,_検索された文字列,_検索された文字列より後の文字列) :- sub_atom(_検索キーワード,_開始点,副文字列長,_残り文字列長,_対象文字列), sub_atom(_対象文字列,0,_開始点,_,_検索された文字列より前の文字列), _残り文字列の開始点 is _開始点 + _副文字列長, sub_atom(_対象文字列,_残り文字列の開始点,_残り文字列長,_,_検索された文字列より後の文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 対象文字列と検索文字列のそれぞれの一部が一致すればよいとする場合。 検索したい文字列より検索キーワードが多いけどだいたいあってるからHITさせる(_検索キーワード,_対象文字列,_検索された文字列より前の文字列,_検索された文字列,_検索された文字列より後の文字列) :- 最長一致副文字列(_検索キーワード,_対象文字列,_開始点,_副文字列長,_残り文字列長,_副文字列), sub_atom(_対象文字列,0,_開始点,_,_検索された文字列より前の文字列), _残り文字列の開始点 is _開始点 + _副文字列長, sub_atom(_対象文字列,_残り文字列の開始点,_残り文字列長,_,_検索された文字列より後の文字列). 最長一致副文字列(_検索キーワード,_対象文字列,_開始点,_副文字列長,_残り文字列長,_副文字列) :- findall([_副文字列長,_残り文字列長,_開始点,_副文字列長,_副文字列],( sub_atom(_対象文字列,_開始点,_副文字列長,_残り文字列長,_副文字列), sub_atom(_検索キーワード,_,_副文字列長,_,_副文字列)), L), sort(L1,L2), reverse(L2,L3), append(_,[[_副文字列長,_残り文字列長,_開始点,_副文字列長,_副文字列]|R],L3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/556 # # sqlite3ですの # # id 1 name 伊藤 age 23 # id 2 name 田中 age 24 # id 3 name 山田 age 33 # id 4 name 桜庭 age 43 # id 5 name 中村 age 23 # を「age」の数値が多い順にソートしたいんですが良い方法ありますか? # あと「伊藤」と「中村」は「age」が一緒なんですけど # その場合はどうなりますか? # '「age」の数値が多い順にソートしたいんですが良い方法ありますか?'(L) :- findall([_age|[_id,_name,_age]],( 年齢(_id,_name,_age)), LL), sort(LL,LL2), reverse(LL2,LL3), append(_,[[_|L]|R],LL3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/510 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):文字列を保持する文字配列を三つ宣言し、 # キーボード入力で文字列を与える その後文字数の少ない順に入れ替え、その結果を表示するプログラムを作成せよ # 実行例 # 入力0 ; aaa # 入力1 ; aaaaa # 入力2 ; aaaaaa # 結果 # 0 ; aa 1; aaaaa 2 ; aaaaaa # '文字列を保持する文字配列を三つ宣言し、キーボード入力で文字列を与える。その後文字数の少ない順に入れ替え、その結果を表示する' :- length(L,3), 'キーボード入力で文字列を与える。'([],L), その後文字数の少ない順に入れ替え(L,_文字数の少ない順の行ならび), その結果を表示する([],_文字数の少ない順の行ならび). 'キーボード入力で文字列を与える。'(_,[]) :- !. 'キーボード入力で文字列を与える。'(LN,[_行|R]) :- length(LN,N), write_formatted('入力%t ; ',[N]), get_line(_行), 'キーボード入力で文字列を与える。'([_|LN],R). その後文字数の少ない順に入れ替え(L,_文字数の少ない順の行ならび) :- findall([_文字数,_行],( append(_,[_行|_],L), sub_atom(_行,0,_文字数,0,_行)), _先頭に文字数を付加した行ならび), sort(_先頭に文字数を付加した行ならび,_先頭の文字数をキーとする昇順の行ならび), findall(_行, append(_,[[_,_行]|_],_先頭の文字数をキーとする昇順の行ならび), _文字数の少ない順の行ならび). その結果を表示する(_,[]) :- write('\n'),!. その結果を表示する(LN,[_行|R]) :- length(LN,N), write_formatted('%t ; %t ',[N,_行]), その結果を表示する([_|LN],R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/498 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 0列目に学籍番号,1-4列目の要素に各テストの点数が格納されている二次元配列がある. # 全科目総点で昇順に並べ替えを行い,結果を表示するプログラムを作成せよ. # int seiseki[5][5]= {{1, 75, 68, 45, 91}, # {2, 87, 5, 100, 61}, # {3, 45, 79, 81, 77}, # {4, 53, 55, 55, 66}, # {5, 82, 32, 85, 74}, # seiseki([[1,75,68,45,91], [2,87,5,100,61], [3,45,79,81,77], [4,53,55,55,66], [5,82,32,85,74]]). '0列目に学籍番号,1-4列目の要素に各テストの点数が格納されている二次元配列がある.全科目総点で昇順に並べ替えを行い,結果を表示するプログラムを作成せよ.' :- seiseki(LL), 全科目総点で昇順に並べ替えを行い(LL,LL3), 結果を表示する(LL3). 全科目総点で昇順に並べ替えを行い(LL,LL3) :- findall([_全科目の総点,_行],( append(_,[_行|_],LL), _行=[_学籍番号|_成績ならび]), sum(_成績ならび,_全科目の総点)), LL2), 昇順に並べ替えを行い(LL2,LL3). 昇順に並べ替えを行い(LL2,LL3) :- sort(LL2,LL3). 結果を表示する(_整列済み成績ならび) :- write('成績順に整列したseiseki(['], append(_,[[_合計|_学籍番号・成績ならび]|R],_整列済み成績ならび), write_formatted(' [%t,%t,%t,%t,%t]',_学籍番号・成績ならび), 改行と終了(R). 改行と終了([]) :- write(']]).\n'),!. 改行と終了(R) :- \+(R=[]), write(']),\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/290 # # [1] 授業単元:C言語基礎実習 # [2] 問題文(含コード&リンク):三つの数値を入力して昇順に並べ替えるプログラムを作成しなさい。 # ただし、並べ替えの処理は関数「void sort(int *n1,int *n2,int *n3)」 # というものを作って処理すること # # 三つの数値を入力して昇順に並べ替える :- 数値入力(N1), 数値入力(N2), 数値入力(N3), sort(N1,N2,N3,L), write_formatted('%t,%t,%t -> %t,%t,%t\n',[N1,N2,N3|L]). sort(N1,N2,N3,[N1,N2,N3]) :- N1 =< N2, N2 =< N3,!. sort(N1,N2,N3,L) :- N2 < N1, sort(N2,N1,N3,L),!. sort(N1,N2,N3,L) :- N3 < N2, sort(N1,N3,N2,L),!. 数値入力(I) :- write('数を入力してください(終了するには0未満の数を入力) : '), get_line(Line), 数値入力診断(Line,I),!. 数値入力(I) :- 数値入力(I). 数値入力診断(Line,I) :- atom_to_term(Line,I,_),number(I),!. 数値入力診断(Line,I) :- write_formatted('入力された %t から適切な数が得られませんでした\n再入力をお願いします\n',[Line]),fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/22 # # 口頭で説明されたものを書くので分かりづらかったらごめんなさい # 【質問テンプレ】 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 5種類の通貨(a,b,c,d,e)が存在する # 最初に幾らかのお金を渡されるそのお金はa,b,c,d,e以外にも # aとしてもbとしても使えるものbとしてもdとしても使えるものなどがある # そのお金を持って商品を買うが商品には特定の通貨しか使えない # ただし、a,bどちらでも払える商品やb,dどちらでも払える商品もある # それらの商品の合計が渡されるのでソレを手持ちのお金で変えるかどうかを答えよ # 合計は配列p[15]として辞書順で与えられる(例えばaで払えるものp[0]bとcで払えるものはp[7]) # ex)p={3,2,0,0,0,0,2,0,0,0,0,0,0,0,0} # だとa=3,ab=2,bc=2なので # 手持ちが{5,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0} # a=5,b=2ならはらえる # 商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか(_商品の合計のならび,_手持ちのお金ならび) :- 利用可能ならびの形式(_利用可能ならびの形式), 数値表現をならび表現に変換(_商品の合計ならび,LA), 数値表現をならび表現に変換(_手持ちのお金ならび,LB), 商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか(_利用可能ならびの形式,LA,LB). 商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか([],[],_). 商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか([_|R1],[[]|R2],K1) :- 商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか(R1,R2,K1). 商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか([[_第一候補,_第二候補]|R1],[_商品の合計|R2],_拠出前の手持ちのお金) :- ならび表現による要素位置指定による、ならびからの値の取得(_第一候補,_拠出前の手持ちのお金,_第一候補の手持ちのお金), ならび表現による要素位置指定による、ならびからの値の取得(_第二候補,_拠出前の手持ちのお金,_第二候補の手持ちのお金), append(_第一候補からの拠出金,_第二候補からの拠出金,_商品の合計), append(_第一候補からの拠出金,_第一候補の残りの手持ちのお金,_第一候補の手持ちのお金), append(_第二候補からの拠出金,_第二候補の残りの手持ちのお金,_第二候補の手持ちのお金), 手持ち金から利用分を差し引く([_],_第一候補,_第一候補の残りの手持ちのお金,_第二候補,_第二候補の残りの手持ちのお金,_拠出前の手持ちのお金,_拠出後の手持ちのお金), 商品の合計が渡されるのでソレを手持ちのお金で変えるかどうか(R1,R2,_拠出後の手持ちのお金). 手持ち金から利用分を差し引く(_,_,_,_,_,[],[]). 手持ち金から利用分を差し引く(L,_,_,L,_第二候補の手持ちのお金,[_|R1],[_第二候補の手持ちのお金|R1]) :- !. 手持ち金から利用分を差し引く(L,L,_第一候補の手持ちのお金,_第二候補,_第二候補の手持ちのお金,[_|R1],[_第一候補の手持ちのお金|R2]) :- 手持ち金から利用分を差し引く([_|L],L,_第一候補の手持ちのお金,_第二候補,_第二候補の手持ちのお金,R1,R2). 手持ち金から利用分を差し引く(L,_第一候補,_第一候補の手持ちのお金,_第二候補,第二候補の手持ちのお金,[U|R1],[U|R2]) :- 手持ち金から利用分を差し引く([_|L],_第一候補,_第一候補の手持ちのお金,_第二候補,第二候補の手持ちのお金,R1,R2). 利用可能ならびの形式(_利用可能ならびの形式) :- findall(U,組み合わせ([1,2,3,4,5,0],2,U),L1), sort(L1,L2), 数値表現をならび表現に変換(L2,_利用可能ならびの形式). 数値表現をならび表現に変換([],[]) :- !. 数値表現をならび表現に変換([L|R1],[L2|R2]) :- list(L), 数値表現をならび表現に変換(L,L2), 数値表現をならび表現に変換(R1,R2),!. 数値表現をならび表現に変換([N|R1],[L2|R2]) :- length(L2,N), 数値表現をならび表現に変換(R1,R2). ならび表現による要素位置指定による、ならびからの値の取得(_ならび表現による要素位置,_ならび,_値) :- append(L0,[_],_ならび表現による要素位置), append(L0,[_値|_],_ならび),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1056938879/131 # # table1 # id 名前 状態_id # ------------------ # 1 キムラ A # 2 田中   B # # # talbe2 # id 状態_id 状態(varchar) # ------------------ # 1 A 0 # 2 A 0 # 3 A 1 # 4 B 0 # 5 B 0 # # 結果 # 名前 状態 # ------------------ # キムラ 1 # 田中 0 # # になるようなSQL文でどう書きまっか?ちなみにORACLE9i。 # 結果(_名前,_状態) :- findsetof(_名前,table1(_,_名前,_),L1), sort(L1,L2), append(_,[_名前|_],L2), table1(_id,_名前,_状態_id) table2(_id,_状態_id,_状態). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/633 # # [1]C言語中級 # [2]指定されたフロー構造に基づき次の仕様のプログラムを作成せよ # 仕様: # ★行とは、先頭か最後の区切り子からその次の区切り子までの区切り子を含まない文字列のこと # ただしその次の区切り子が出現しないまま終端した場合は最後の文字列まで # ★区切り子とは、改行文字(0x0A) 復改文字(0x0D),その組み合わせ(0x0D0x0A,0x0A0x0D)のいずれかと # する(混在することを前提) # ★標準入力から任意の長さの文字列を読み取り各行の空白スペースを除く先頭が0〜9からなる # 文字列(これをキー数列と呼ぶ)でその直後が空白、タブで区切られている場合に限りその行を認識する。 # それ以外の形式の場合は認識せず無視する。キー数列の長さが1024を超える場合も無視対象とする。 # ★認識した行はキー数列を10進数の正整数を表すものとして、その順序(小さい順)に # 整列して出力する # フロー構造 # main関数のみで構成。ライブラリ関数はstdio.hで定義されている関数のみを利用可能とする。 # 当然だが記憶領域はキー数列を記憶する領域の3倍程度しか確保できないことを前提 # [3] FreeBSD上でC言語で記述しgccコンパイラで処理する。 # [4] 10/10迄 # '標準入力から任意の長さの文字列を読み取り各行の空白スペースを除く先頭が0〜9からなる文字列(これをキー数列と呼ぶ)でその直後が空白、タブで区切られている場合に限りその行を認識する。' :- get_chars(Chars), 行と認識(Chars,'',_行ならび), sort(_行ならび,_昇順の行ならび), 文字列部分のみ出力(L2). 行と認識([],_行,[[_10進キー数値,_行]]) :- 行検査(_行,_10進キー数値),!. 行と認識([],_行,[]) :- !. 行と認識(['\r','\n'|R],_行,[[_10進キー数値,_行]|R2]) :- 行検査(_行,_10進キー数値), 行と認識(R,'',R2),!. 行と認識(['\n','\r'|R],_行,[[_10進キー数値,_行]|R2]) :- 行検査(_行,_10進キー数値), 行と認識(R,'',R2),!. 行と認識(['\r'|R],_行,[[_10進キー数値,_行]|R2]) :- 行検査(_行,_10進キー数値), 行と認識(R,'',R2),!. 行と認識(['\n'|R],_行,[[_10進キー数値,_行]|R2]) :- 行検査(_行,_10進キー数値), 行と認識(R,'',R2),!. 行と認識([A|R1],_行1,R2) :- \+(member(A,['\n','r'])), atom_concat(_行1,A,_行2), 行と認識(R1,_行2,R2). 行と認識([A|R1],_行1,R2) :- member(A,['\n','\r']), 行と認識(R1,_行1,R2). 文字列部分のみ出力(L) :- append(_,[[_,_行]|R],L), write_formatted('%t\n',[_行]), R = []. 行検査(_行,N) :- 空白・タブを読み飛ばす(_行,_行1), sub_atom(_行1,Len1,1,Len2,A), Len1 =< 1024, member(A,[' ','\t']), sub_atom(_行1,0,Len1,0,B), 全て数字(0,Len1,B), atom_to_chars(B,Bcodes), encode(Bcodes,N). 空白・タブを読み飛ばす(_行,_行1) :- sub_atom(_行,Len,1,Rlen,A), \+(member(A,[' ','\t'])), Len2 is Len + 1, sub_atom(_行,Len2,Rlen,_行1). 全て数字(Len,Len,_) :- !. 全て数字(M,Len,B) :- sub_atom(B,M,1,_,C), member(C,['0','1','2','3','4','5','6','7','8','9']), M2 is M + 1, 全て数字(M2,Len,B). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/479 # # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): # 適正なおつりを出すプログラムを作成しなさい # 例として次のようにすること # 金額を入力してください。 # 12345 # 一万円:1枚 # 五千円:0枚 #  千円:2枚 # 五百円:0枚 #  百円:3枚 # 五十円:0枚 #  十円:4枚 #  五円:1枚 #  一円:0枚 # % 現在のProlog仕様の弱点のひとつとして、定義述語データベースの素直な更新(節順序を変えずに % 値だけ更新すること)ができないということがある。retractされた節はassertaで先頭に追加するか % assertzで末尾の節として追加する他ない。この課題でも金種金額の大きい順に処理する必要から、 % findall/3で入手したレジの内容のリストを、その都度降順に整列することを余儀なくされている。 % レジ(10000,7). レジ(5000,1). レジ(2000,0). レジ(1000,9). レジ(500,2). レジ(100,20). レジ(50,6). レジ(10,14). レジ(5,1). レジ(1,30). 適正なおつりを出す(_発生したおつり) :- レジの中身をならびに変換(_金種と枚数ならび), 金種問題(_発生したおつり,_金種と枚数ならび,_おつりの金種と枚数ならび), append(_,[[_金種,_枚数]|R],_おつりの金種と枚数ならび), 金種の漢字表示(_金種,_金種の漢字表示), write_formatted('%6s : %t枚\n',[_金種の漢字表示,_枚数]), レジの金種残高の更新(_金種,_枚数), R = []. 金種問題(0,_,[]) :- !. 金種問題(_残高,[],_) :- _残高 > 0, write_formatted('レジの小銭が%t円不足しました\n',[_残高]),!,fail. 金種問題(_残高1,[[_金種,_レジの枚数]|R1],[[_金種,_枚数]|R2]) :- _枚数 is _残高1 // _金種, \+(_枚数=0), \+(_レジの枚数=0), _枚数 =< _レジの枚数, _残高2 is _円 mod _金種, 金種問題(_残高2,R1,R2). 金種問題(_残高1,[[_金種,_レジの枚数]|R1],[[_金種,_レジの枚数]|R2]) :- _枚数 is _残高1 // _金種, \+(_枚数=0), \+(_レジの枚数=0), _枚数 > _レジの枚数, _残高2 is _残高1 - _金種 * _レジの枚数, 金種問題(_残高2,R1,R2). 金種問題(_残高,[_|R1],R2) :- 金種問題(_残高,R1,R2). レジの中身をならびに変換(_降順に整列した金種と枚数ならび) :- findall([_金種,_レジの枚数],レジ(_金種,_レジの枚数),_金種と枚数ならび), 金種を降順に整列(_金種と枚数ならび,_降順に整列した金種と枚数ならび). 金種を降順に整列(_金種と枚数ならび,_降順に整列した金種と枚数ならび) :- sort(_金種と枚数ならび,_昇順に整列した金種と枚数ならび), reverse(_昇順に整列した金種と枚数ならび,_降順に整列した金種と枚数ならび). レジの金種残高の更新(_金種,_おつりに必要となった枚数) :- retract(レジ(_金種,_現在の枚数)), _おつりを支払った後の枚数 is _現在の枚数 - _おつりに必要となった枚数, assertz(レジ(_金種,_おつりを支払った後の枚数)). 金種の漢字表示(10000,一万円). 金種の漢字表示(5000,五千円). 金種の漢字表示(2000,二千円). 金種の漢字表示(1000,千円). 金種の漢字表示(500,五百円). 金種の漢字表示(100,百円). 金種の漢字表示(50,五十円). 金種の漢字表示(10,十円). 金種の漢字表示(5,五円). 金種の漢字表示(1,一円). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/419 # # すいません。早い回答ありがとうございます # # 【質問テンプレ】 # [1] C言語 # [2] 乱数に数字列が列挙しているtxtファイルから読み込んでint配列の形でソート(どのソートでもよい)を行って別のtxtファイルに書き込む # 現状ではソート,ファイル書き込みの内容はできあがっているがファイルから読み込んでint配列の形にする部分で悩んでいる # # '乱数に数字列が列挙しているtxtファイルから読み込んでint配列の形でソート(どのソートでもよい)を行って別のtxtファイルに書き込む'(_txtファイル,_別のtxtファイル) :- get_split_lines(_txtファイル,[' ',','],LL), 'ソート(どのソートでもよい)を行って'(LL,L2), put_lines(_別のtxtファイル,L2). 'ソート(どのソートでもよい)を行って'([],[]) :- !. 'ソート(どのソートでもよい)を行って'([L1|R1],[S|R2]) :- クイックソート(L1,L2), concat_atom(L2,' ',S), 'ソート(どのソートでもよい)を行って'(R1,R2). クイックソート([],[]) :- !. クイックソート([A|R1],L2) :- クイックソート(A,R1,L2). クイックソート(A,L1,L2) :- 整列のための分割(A,L1,L3,L4), クイックソート(L3,L5), クイックソート(L4,L6), append(L5,[A|L6],L2). 整列のための分割(A,[],[],[]) :- !. 整列のための分割(A,[B|R1],[B|R2],L) :- B @< A, 整列のための分割(A,R1,R2,L),!. 整列のための分割(A,[B|R1],L,[B|R2]) :- B @>= A, 整列のための分割(A,R1,L,R2),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1280653311/120 # # [1] 授業単元: # C++プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10909.txt # # 得点と名前を5つ入力すると,得点の高いものから順に出力せよ。名前は最大20文字までとする。 # stringクラスは使用しないこと。 # # # 実行例 # name1?sato # score1?10 # ------------------- # name2?tanaka # score2?40 # ------------------- # name3?suzuki # score3?95 # ------------------- # name4?kimura # score4?60 # ------------------- # name5?mori # score5?50 # ------------------- # # suzuki:95 # # kimura:60 # # mori:50 # # tanaka:40 # # sato:10 # '得点と名前を5つ入力すると,得点の高いものから順に出力せよ。名前は最大20文字までとする。' :- write('空白で区切って得点と名前を5つ(5行)入力してください : '), findall([_得点,_名前],( for(1,_,5), '得点と名前の入力(名前は最大20文字までとする)'(_得点,_名前)), L1), sort(L1,L2), reverse(L2,L3), append(_,[_得点,_名前]|R],L3), write_formatted('%t:%t\n',[_得点,_名前]), R = [],!. '得点と名前の入力(名前は最大20文字までとする)'(_得点,_名前) :- get_split_line([' '],[_得点,_名前]), atom_length(_名前,_長さ), 診断(_得点,_長さ),!. '得点と名前の入力(名前は最大20文字までとする)'(_得点,_名前) :- '得点と名前の入力(名前は最大20文字までとする)'(_得点,_名前). 診断(_得点,_長さ) :- \+(integer(_得点)), write_formatted('得点が%tと入力されました。得点は整数です。再入力をお願いします\n',[_得点]), !,fail. 診断(_得点,_長さ) :- _長さ =< 20,!. 診断(_得点,_長さ) :- write_formatted('名前の長さが%t文字あります。20文字以下になるように再入力をお願いします\n',[_長さ]),!, fail. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/632 # # 【 課題 】 # 氏名(string)、ふりがな(string)、携帯番号(string)、メールアドレス(string) # をフィールドとして持つクラスAddressBookを定義せよ。 # クラス内に、ふりがなで辞書順に並べ替えるためのcompareToを定義せよ。 # 外部に,TelNoSortという、電話番号(文字列)を辞書順に並び変えるためのメソッドを # 作成せよ。 # メイン・プログラムで、AddressBookクラスの配列(ArrayList)を定義し、 # 以下の動作をおこなうプログラムを作れ。 # 3人分のデータをキーボードから入力し、リストに代入する。 # ・配列に代入されたデータをふりがな順に、見やすく出力する。 # ・配列に代入されたデータを電話番号順に、見やすく出力する。 # 入力、出力には、for文を使うこと。 # '3人分のデータをキーボードから入力し、リストに得る。ふりがな順と電話番号順に見やすく出力する' :- '3人分のデータをキーボードから入力し'(1), compareTo(_ふりがな順ならび), write_formatted('整列鍵は%tです\n\n',[ふりがな]), 見やすく出力する(_ふりがな順ならび), 'TelNosort'(_携帯番号順ならび), write_formatted('整列鍵は%tです\n\n',[携帯番号]), 見やすく出力する(_携帯番号順ならび). '3人分のデータをキーボードから入力し'(N) :- N > 3,!. '3人分のデータをキーボードから入力し'(N1) :- write('氏名 ふりがな 携帯番号 メールアドレス を空白で区切って入力しなさい : '), get_line(Line), split([' '],L), '3人分のデータをキーボードから入力診断(Line,L), N2 is N1 + 1, '3人分のデータをキーボードから入力し'(N2),!. '3人分のデータをキーボードから入力し'(N1) :- '3人分のデータをキーボードから入力し'(N1). '3人分のデータをキーボードから入力診断(_,[_氏名,_ふりがな,_携帯番号,_メールアドレス]) :- 氏名入力診断(_氏名), ふりがな入力診断(_ふりがな), 携帯電話入力診断(_携帯電話), メールアドレス入力診断(_メールアドレス), assertz('AddressBook'(_氏名,_ふりがな,_携帯番号,_メールアドレス)),!. '3人分のデータをキーボードから入力診断(Line,_) :- write_formatted('入力された %t は適切なものではありません。再入力をお願いします。\n',[Line]),!, fail. 氏名入力診断(_氏名) :- true. ふりがな入力診断(_ふりがな) :- true. 携帯電話入力診断(_携帯電話) :- true. メールアドレス入力診断(_メールアドレス) :- true. compareTo(_ふりがな順ならび) :- findall([_ふりがな,_氏名,_ふりがな,_携帯番号,_メールアドレス],'AddressBook'(_氏名,_ふりがな,_携帯番号,_メールアドレス),LL1), sort(LL1,LL2), findall(L,append(_,[[_|L]|R],LL2),_ふりがな順ならび). 'TelNoSort'(_携帯番号順ならび) :- findall([_電話番号,_氏名,_ふりがな,_携帯番号,_メールアドレス],'AddressBook'(_氏名,_ふりがな,_携帯番号,_メールアドレス),LL1), sort(LL1,LL2), findall(L,append(_,[[_|L]|R],LL2),_電話番号順ならび). 見やすく出力する([]) :- !. 見やすく出力する([[_氏名,_ふりがな,_携帯番号,_メールアドレス]|R]) :- write_formatted('氏名=%t\nふりがな=%t\n携帯番号=%t\nメールアドレス=%t\n\n',[_氏名,_ふりがな,_携帯番号,_メールアドレス]), 見やすく出力する(R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1280653311/89 # # [1] 授業単元:プログラミング C # [2] 問題文(含コード&リンク):入力した5つのデータを大きい順に並び替えるプログラムを作れ。 # 例↓ # a0=4 # a1=7 # a2=12 # a3=1 # a4=5 # rank1: 12 # rank2: 7 # rank3: 5 # rank4: 4 # rank5: 1 #              次に入力した5つのデータを大きい順に順番をつけるプログラムを作れ。 # 例↓ # a0=4 # a1=7 # a2=12 # a3=1 # a4=5 # a0=4 : rank4 # a1=7 : rank2 # a2=12 : rank1 # a3=1 : rank5 # a4=5 : rank3 # 入力した5つのデータを大きい順に並び替える :- 入力した5つのデータ(1,L1), ランク付けして表示(1,L2). 入力した5つのデータ(N,[]) :- N > 5,!. 入力した5つのデータ(N1,[Line|R]) :- write_formatted('a%t=',[N1]), get_line(Line), N2 is N1 + 1, 入力した5つのデータ(N2,R). 大きい順に並び替える(L1,L2) :- L1 = [A|R], 大きい順に並び替える(A,R,L2). 大きい順に並び替える(A,L1,L2) :- 大きい順整列のための分割(A,L1,L3,L4), 大きい順に並び替える(L3,L5), 大きい順に並び変える(L4,L6), append(L5,[A|L6],L2). 大きい順整列のための分割(_,[],[],[]) :- !. 大きい順整列のための分割(A,[B|R1],[B|R2],L2) :- B @>= A, 大きい順整列のための分割(A,R1,R2,L2),!. 大きい順整列のための分割(A,[B|R1],L2,[B|R2]) :- B @< A, 大きい順整列のための分割(A,R1,L2,R2),!. ランク付けして表示(_,[]) :- !. ランク付けして表示(N,[A|R]) :- write_formatted('rank%t: %t\n',[N,A]), N2 is N + 1, ランク付けして表示(N2,R). % 以下のサイトは # 出典:: 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://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://hibari.2ch.net/test/read.cgi/tech/1284632294/259 # # [1] 授業単元:C言語復習 # [2] 問題文(含コード&リンク): # n個の文字列(アルファベットの文字列)を入力して、頭文 # 字をABC…順に並べ替えて表示するプログラムを作りなさい。 # 例) n=3  # TANALA # EGUCHI # SASAKI # に対して # EGUCHI # SASAKI # TANAKA # 'n個の文字列(アルファベットの文字列)を入力して、頭文字をABC…順に並べ替えて表示する' :- 催促付き整数入力('何行の文字列を入力しますか : ',_何行), findall(_文字列,( for(1,_,_何行), get_line(_文字列)), _文字列ならび), '頭文字をABC…順に並べ替えて表示する'(_文字列ならび,_並び替えられた文字列). '頭文字をABC…順に並べ替えて表示する'(_文字列ならび,_並び替えられた文字列) :- findall([_頭文字,_文字列],( member(_文字列,_文字列ならび), sub_atom(_文字列,0,1,_,_頭文字)), L1), sort(L1,L2), findall(_文字列2,member([_,_文字列2],L2),_並び替えられた文字列). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/887 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # fgets() を使って50文字以下の文字列を入力し,文字列中の各 # 文字の出現回数を数えるプログラムを作成せよ。 # 実行例 # 文字列は? abcdef,abb(ccc110) # a : 2 # b : 3 # c : 4 # d : 1 # e : 1 # f : 1 # , : 1 # ( : 1 # 1 : 2 # 0 : 1 # ) : 1 # '50文字以下の文字列を入力し,文字列中の各文字の出現回数を数える' :- '50文字以下の文字列を入力し'(_50文字以下の文字列), 文字列中の各文字の出現回数を数える(_50文字以下の文字列,_文字ごとの出現回数ならび), 文字ごとの出現回数を表示する(_文字ごとの出現回数ならび). '50文字以下の文字列を入力し'(_50文字以下の文字列) :- get_line(_50文字以下の文字列), length(_50文字以下の文字列,_文字数), _文字数 =< 50. 文字列中の各文字の出現回数を数える(_文字列,_出現回数ならび) :- どんな文字が出現したかならびに数え上げる(_文字列,_重複を許さない文字ならび), 各文字の出現回数を数える(_文字列,_重複を許さない文字ならび,_出現回数ならび). どんな文字が出現したかならびに数え上げる(_文字列,_重複を許さない文字ならび) :- findsetof(_文字,( sub_atom(_文字列,_,1,_,_文字)), _重複を許さない文字ならび). 各文字の出現回数を数える(_文字列,_重複を許さない文字ならび,_出現回数ならび) :- findall([_出現回数,_文字],( append(_,[_文字|_],_重複を許さない文字ならび), count(sub_atom(_文字列,_,1,_,_文字),_出現回数)), _出現回数ならび). 文字ごとの出現回数を表示する(_文字ごとの出現回数ならび) :- append(_,[[_出現回数,_文字]|R],_文字ごとの出現回数ならび), writef('%t : %t\n',[_文字,_出現回数]), R = []. % % 文字列をならび(リスト)に変換しない場合は、非決定性述語sub_atom/5を使う。 % % 出現回数と文字の並びがひっくり返っているのは整列を求められた場合への備えだが、 % 好ましいことではないかも知れない。 % % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1274791771/276 # # MySQL5を使用しています。 # # # 以下のようなテーブルがあります。 # # itemテーブル # item_id name color # 1 商品1 3 # 2 商品2 12 # 3 商品3 7 # # colorテーブル # color_id name # 1 赤 # 2 青 # 4 緑 # 8 黒 # # item.colorの部分は、ビット演算の概念を使って # 3なら赤+青 # 12なら緑+黒 # 7なら赤+青+緑 # の色を持っていることを意味します。 # # これを結合の段階で、以下のように色名を取得することは可能なのでしょうか? # # 1 商品1 赤 # 1 商品1 青 # 2 商品2 緑 # 2 商品2 黒 # 3 商品3 赤 # 3 商品3 青 # 3 商品3 緑 # /* item(1,商品1,3). item(2,商品2,12). item(3,商品3,7). color(1,赤). color(2,青). color(4,緑). color(8,黒). */ 色名を取得する :- item(_item_id,_name,_color), 色の割り当て(_color,_色名), write_formatted('%t %t %t\n',[_item_id,_name,_色名]), fail. 色名を取得する. 色の割り当て(_色番号,_色名) :- findall([_color_id,_name],color(_color_id,_name),L), sort(L,L1), reverse(L1,L2), 色の割り当て(_色番号,L2,_色名). 色の割り当て(N,_,_) :- N =< 0,!,fail. 色の割り当て(N,[[C,_色名]|R1],_色名) :- 1 is N // C. 色の割り当て(N,[[C,_]|R1],_色名) :- 1 is N // C, M is N mod C, 色の割り当て(M,R1,_色名). 色の割り当て(N,[[C,_]|R1],_色名) :- 0 is N // C, M is N mod C, 色の割り当て(M,R1,_色名). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/678 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 以下の機能を持つプログラムを作ること。 # # -1から100の数字の中から素数を抽出する (配列に直接数字を指定することは不 # 可) # -抽出した素数を大きい順(降順)にソートする # -ソートした素数を1行につき5個表示する(6個目以降は次の行に表示する) # # 以下の点に関して工夫をした場合は加点の対象とする # # -素数の計算時間の低減 # -見つけた素数の数のカウント # -ソートのアルゴリズム高速化 # -実行時間の表示 # # 作成したプログラムの特徴を提出時のコメントに記入すること # (素数の見つけ方、ソートの仕方、表示方法での工夫など) # '1から100の数字の中から素数を抽出する (配列に直接数字を指定することは不可)-抽出した素数を大きい順(降順)にソートする-ソートした素数を1行につき5個表示する(6個目以降は次の行に表示する)' :- '1から100の数字の中から素数を抽出する'(L1), '抽出した素数を大きい順(降順)にソートする'(L1,L2), 'ソートした素数を1行につき5個表示する'(L2). '1から100の数字の中から素数を抽出する'(L1) :- findall(M,for(2,M,N),L),'エラトステネスの篩'(L,L1),!. '抽出した素数を大きい順(降順)にソートする'(L1,L2) :- sort(L1,L3),reverse(L3,L2). 'ソートした素数を1行につき5個表示する'(L) :- '5個切り取り表示'(L,R), length(R,Len), Len < 5, '最終行は5個に満たないかもしれない(R),!. '5個切り取り表示'(R,R) :- length(R,Len),Len < 5,!. '5個切り取り表示'(L,R) :- 'N個組'(5,L,X,R), concat_atom(X,' ',S1), write_formatted('%t\n',[S1]). 'N個組'(N,L,X,R) :- length(X,N), append(L0,X,R,L), length(L0,Len1), 0 is Len1 mod N. 最終行は5個に満たないかもしれない(R) :- concat_atom(R,' ',S),write_formatted('%t\n',[S]). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1274791771/276 # # MySQL5を使用しています。 # # # 以下のようなテーブルがあります。 # # itemテーブル # item_id name color # 1 商品1 3 # 2 商品2 12 # 3 商品3 7 # # colorテーブル # color_id name # 1 赤 # 2 青 # 4 緑 # 8 黒 # # item.colorの部分は、ビット演算の概念を使って # 3なら赤+青 # 12なら緑+黒 # 7なら赤+青+緑 # の色を持っていることを意味します。 # # これを結合の段階で、以下のように色名を取得することは可能なのでしょうか? # # 1 商品1 赤 # 1 商品1 青 # 2 商品2 緑 # 2 商品2 黒 # 3 商品3 赤 # 3 商品3 青 # 3 商品3 緑 # /* item(1,商品1,3). item(2,商品2,12). item(3,商品3,7). color(1,赤). color(2,青). color(4,緑). color(8,黒). */ 色名を取得する :- item(_item_id,_name,_color), 色の割り当て(_color,_色名), write_formatted('%t %t %t\n',[_item_id,_name,_色名]), fail. 色名を取得する. 色の割り当て(_色番号,_色名) :- findall([_color_id,_name],color(_color_id,_name),L), sort(L,L1), reverse(L1,L2), 色の割り当て(_色番号,L2,_色名). 色の割り当て(N,_,_) :- N =< 0,!,fail. 色の割り当て(N,[[C,_色名]|R1],_色名) :- 1 is N // C. 色の割り当て(N,[[C,_]|R1],_色名) :- 1 is N // C, M is N mod C, 色の割り当て(M,R1,_色名). 色の割り当て(N,[[C,_]|R1],_色名) :- 0 is N // C, M is N mod C, 色の割り当て(M,R1,_色名). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/602 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10791.txt # 問題文 # # 0から7までの数字が描かれたカードがある。ただし、0だけ2枚で、合計9枚とする。 # この中から4枚を選ぶ組合せを考える。ただし、6と7は同時に選ばない(両方選ばなくてもよい)。 # このような組合せを列挙し、何通りあるかを、C言語のプログラムで求める。何通りあるかは、数学的に解いて確認せよ。 # 例題プログラムEnumFull.c を修正する。 # # 部分問題への分解 0が現れる枚数で場合分けして、それぞれの個数を集計 # 弱化問題への緩和 0および6と7に関する条件を無視して、とりあえず全てを列挙し、題意に合わないものを排除 # 等価問題への還元 2枚の0を、0と8に読み換え、8は単独で選ばないという条件に置換 # 7は外して列挙し、6が現れる場合に、7に読み換えたものも追加 '0から7までの数字が描かれたカードがある。ただし、0だけ2枚で、合計9枚とする。この中から4枚を選ぶ組合せを考える。ただし、6と7は同時に選ばない(両方選ばなくてもよい)。このような組合せを列挙する'(U) :- findall(L,( 組み合わせ([0,0,1,2,3,4,5,6,7],4,L), 許される組み合わせ(L)), X), sort(X,Y), append(_[U|R],Y). 許される組み合わせ(A) :- append(_[6|_],A),append(_,[7|_],A),!,fail. 許される組み合わせ(A) :- append(B,[0|C],A),append(D,[0|E],C),!,fail. 許される組み合わせ(A). '0から7までの数字が描かれたカードがある。ただし、0だけ2枚で、合計9枚とする。この中から4枚を選ぶ組合せを考える。ただし、6と7は同時に選ばない(両方選ばなくてもよい)。このような組合せを列挙し何通りあるか'(_何通り) :- count('0から7までの数字が描かれたカードがある。ただし、0だけ2枚で、合計9枚とする。この中から4枚を選ぶ組合せを考える。ただし、6と7は同時に選ばない(両方選ばなくてもよい)。このような組合せを列挙する'(_),_何通り). % 以下のサイトは # c137 #534 # [1] 授業単元: Visual Studio 入門 # [2] 問題 半乱順列の関数作成 # :- op(300,xf,回). :- op(700,xf,切る). 半乱順列の作成(_置換指定,_対象ならび,_半乱順列ならび) :- 整列(_対象ならび,_整列したならび), 整列したならび乱す(_置換指定,_整列したならび,_半乱順列ならび). 整列したならび乱す(最初と最後の要素を入れ替える,L1,L2) :- '最初と最後の要素を入れ替えて、整列したならびを乱す'(L1,L2). 整列したならびを乱す(N 回 切る,L1,L2) :- 'N回切って、整列したならびを乱す'(N,L1,L2). 整列したならびを乱す([[N1,N2]|R],L1,L2) :- '入れ替え位置指定ならびから、整列したならびを乱す'([[N1,N2]|R],L1,L2). '最初と最後の要素を入れ替えて、整列したならびを乱す'(L1,L2) :- [A|R]=L3, append(L4,[B],R), append([B|L4],[A],L2),!. 'N回切って、整列したならびを乱す'(0,L,L) :- !. 'N回切って、整列したならびを乱す'(N,L1,L2) :- 入れ替え位置を得る(L1,N1,N2), ならびの交換(N1,N2,L1,L3), succ(N1,N), 'N回切って、整列したならびを乱す'(N1,L1,L2). 入れ替え位置を得る(L1,N1,N2) :- length(L1,Len), N1 is random mod Len, N2 is random mod Len. '入れ替え位置指定ならびから、整列したならびを乱す'([],L,L) :- !. '入れ替え位置指定ならびから、整列したならびを乱す'([[N1,N2]|R],L1,L2) :- ならびの交換(N1,N2,L1,L3), '入れ替え位置指定ならびから、整列したならびを乱す'(R,L3,L2). ならびの交換(M,N,_対象ならび,_交換したならび) :- 'M番目の要素と前後'(M,L1,A,R1), 'N番目の要素と前後'(N,L2,B,R2), 要素を入れ替えながらならびの再構成(L1,A,R1,L2,B,R2). 'M番目の要素と前後'(M,L1,A,R1) :- M1 is M - 1, append(L1,[A|R1],_対象ならび), length(L1,M1),!. 'N番目の要素と前後'(N,L2,B,R2) :- N1 is N - 1, append(L2,[B|R2],_対象ならび), length(L2,N1),!. 要素を入れ替えながらならびの再構成(L1,A,R1,L2,B,R2) :- append(L1,[B|R1],L3), append(L4,[_|R3],L3), length(L4,N1), append(L4,[A|R3],_交換したならび),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/877 # # [1] 授業単元:2分探索法 # [2] 問題文: http://nojiriko.asia/jpeg/up10962.jpg にコピーさせていただきました。 # _学籍番号+_氏名+_誕生_月+_誕生_日 :- open('data_b.txt',append,Output), write_formatted(Output,'%t %t %t %t\n',[_学籍番号,_氏名,_誕生_月,_誕生_日]), close(Output). 'data_b.txtを読み込み、4月1日を年初めとして、誕生日の早いもの順にソートし、その結果を「output_b.txt」ファイルに出力する' :- get_split_lines('data_b.txt',[' '],LL), 鍵項目の付加(LL,LL2), 整列(LL2,LL3), 鍵項目を除去しながら出力する(LL3). 鍵項目の付加([],[]) :- !. 鍵項目の付加([[_学籍番号,_氏名,_誕生_月,_誕生_日]|R1],[[_誕生_月_2,_誕生_日,_学籍番号,_氏名,_誕生_月,_誕生_日]|R2]) :- '1-3月を13-15月に修正'(_誕生_月,_誕生月_2), 鍵項目の付加(R1,R2). '1-3月を13-15月に修正'(_誕生_月,_誕生月_2) :- _誕生_月 >= 1,_誕生_月 =< 3,_誕生_月_2 is _誕生_月 + 12,!. '1-3月を13-15月に修正'(_誕生_月,_誕生月). 鍵項目を除去しながら出力する([]) :- !. 鍵項目を除去しながら出力する([[_,_|L]|R]) :- open('out_b.txt',append,Output), write_formatted(Output,'%t %t %t月 %t日\n',L), close(Output), 鍵項目を除去しながら出力する(R). 'output_b.txtを読み込み、ある誕生日を入力したときに、その学生の学籍番号、氏名、誕生月、誕生日を二分探索法により出力する'(_誕生_月,_誕生_日) :- get_split_lines('output_b.txt',[' ',月,日],LL), 二分探索法(LL,_誕生_月,_誕生_日,[_学籍番号,_氏名,_誕生_月,_誕生_日]), write_formatted('%t %t %t %t月%t日\n',[_学籍番号,_誕生_月,_誕生_日]). 二分探索法(LL,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :- '1-3月を13-15月に修正'(_誕生_月,_誕生月_0), length(LL,Len), Len0 is Len // 2, append(L0,[[_学籍番号_1,_氏名_1,_誕生_月_1,_誕生_日_1]|L1],LL), length(L0,Len0), '1-3月を13-15月に修正'(_誕生_月_1,_誕生月_10), 二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]). 二分探索法(L0,L,L1,_誕生_月,_誕生_日,_誕生_月,_誕生_日,L) :- !. 二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :- [_誕生_月_0,_誕生_日] @> [_誕生_月_10,_誕生_日_1], 二分探索法(L0,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]). 二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :- [_誕生_月_0,_誕生_日] @< [_誕生_月_10,_誕生_日_1], 二分探索法(L1,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]). % 以下のサイトは # 出典:: 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://pc11.2ch.net/test/read.cgi/db/1274791771/177 # # 質問させてください。 # # ・DBMS名とバージョン # MySQL 5.0.27-1 # # ・テーブルデータ # DATE    | DATA # ------------+---------- # 2010-06-01 | aaa # 2010-06-02 | bbb # 2010-06-03 | ccc # 2010-06-04 | ddd # 2010-06-05 | eee # 2010-06-06 | fff # 2010-06-07 | ggg # # ・欲しい結果 # 最新3件を昇順で。 # DATE    | DATA # ------------+---------- # 2010-06-05 | eee # 2010-06-06 | fff # 2010-06-07 | ggg # # ・説明 # select DATE, DATA from TABLE order by DATE desc limit 3; # とすれば、最新3件を降順で取得できますが、 # できれば降順でなく昇順で最新3件を取得したいです。 # # 'DATEの最新3件を昇順で取得する'(L) :- findsort([DATE],テーブル(DATE,DATA),L1), length(L,3), append(_,L,L1). findsort(_鍵ならび,P,_解ならび) :- P =.. [F|L1], append(_鍵ならび,L1,L2), findall(L2,P,L3), sort(L3,L4), findall(L1,member(L2,L4),_解ならび). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1267796762/170 # # 【 課題 】入力したテキストに含まれる文字を種類別に使用回数を表示し、降順にソートし出力するプログラムを作れ。 # 【 形態 】Javaアプリケーション(main()で開始) # 【 期限 】6月22日 # 【 Ver  】1.6.0_20 # 【 補足 】../test/read.cgi/tech/1267796762/83と同様の問題ですが漢字や記号など全ての種類によらずに統計したい場合です。よろしくお願いします。 # # '入力したテキストに含まれる文字別に使用回数を表示し、使用回数で降順にソートし出力する' :- get_line(_入力したテキスト), テキストを文字のならびに変換する(_入力したテキスト,_文字ならび), 文字頻度ならびの生成(_文字ならび,[],_文字頻度ならび), 降順整列(_文字頻度ならび,_降順に整列した文字頻度ならび), append(_,[[_頻度,_文字]|R],_降順整列した文字頻度ならび), write_formatted('%t %t回\n',[_文字,_頻度]), R = [],!. テキストを文字のならびに変換する(_入力したテキスト,_文字ならび) :- atom_chars(_入力したテキスト,_文字ならび). 文字頻度ならびの生成([],L,L) :- !. 文字頻度ならびの生成([A|R1],L1,L) :- 文字頻度ならびの生成(A,L1,L2,M), 文字頻度ならびの生成_2(M,A,R1,L2,L),!. 文字頻度ならびの生成_2(1,A,R1,L2,L) :- 文字頻度ならびの生成(R1,L2,L),!. 文字頻度ならびの生成_2(M,A,R1,L2,L) :- 文字頻度ならびの生成(R1,[[M,A]|L2],L),!. 文字頻度ならびの生成(A,[],[[1,A]],1) :- !. 文字頻度ならびの生成(A,[[N,A]|R1],R1,N2) :- N2 is N + 1,!. 文字頻度ならびの生成(A,[L1|R1],[L1|R2],N) :- 文字頻度ならびの生成(A,R1,R2,N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字種(数字,_文字) :- _文字 @>= '0',_文字 @=< '9'. 文字種(英大文字,_文字) :- _文字 @>= 'A',_文字 @=< 'Z'. 文字種(英小文字,_文字) :- _文字 @>= 'a',_文字 @=< 'z'. 文字種(英記号,_文字) :- _文字 @>= ' ',_文字 @=< '}',\+(文字種(英小文字,文字)),\+(文字種(英大文字,_文字)). 文字種(全角漢字,_文字) :- _文字 @>= '亜',_文字 @=< '龠'. 文字種(全角平仮名,_文字) :- _文字 @>= 'ぁ',_文字 @=< 'ん'. 文字種(全角片仮名,_文字) :- _文字 @>= 'ァ',_文字 @=< 'ン'. 文字種(全角数字,_文字) :- _文字 @>= '0',_文字 @=< '9'. 文字種(全角英大文字,_文字) :- _文字 @>= 'A',_文字 @=< 'Z'. 文字種(全角英小文字,_文字) :- _文字 @>= 'a',_文字 @=< 'z'. 文字種(全角記号,_文字) :- char_code(_文字,_文字コード), _文字コード >= 0xa1a1,_文字コード =< 0xa3fe. '入力したテキストに含まれる文字を種類別に使用回数を表示し、降順にソートし出力する' :- get_chars(L1), '入力したテキストに含まれる文字を種類別に使用回数を計測する'(L1,[],L2), rsort(L2,L3), append(_,[[_頻度,_文字種]|R],L3), write_formatted('%t %t回\n',[_文字種,_頻度]), R = []. '入力したテキストに含まれる文字を種類別に使用回数を計測する'([],L,L) :- !. '入力したテキストに含まれる文字を種類別に使用回数を計測する'([_文字|R],L1,L) :- 文字種(_種類,_文字), 種類別に使用回数を更新(_種類,L1,L2), '入力したテキストに含まれる文字を種類別に使用回数をを計測する'(R,L2,L),!. '入力したテキストに含まれる文字を種類別に使用回数を計測する'([_文字|R],L1,L) :- \+(文字種(_種類,_文字)) '入力したテキストに含まれる文字を種類別に使用回数を計測する'(R,L1,L). 種類別に使用回数を更新(_種類,[],[[1,_種類]]) :- !. 種類別に使用回数を更新(_種類,[[_頻度1,_種類]|R],[[_頻度2,_種類]|R]) :- _頻度2 is _頻度1 + 1,!. 種類別に使用回数を更新(_種類,[A|R1],[A|R2]) :- 種類別に使用回数を更新(_種類,R1,R2). rsort(L1,L2) :- sort(L1,L3), reverse(L3,L2). % 以下のサイトは # 出典:: 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/1276810079/5 # # 次の問題を解くプログラムを再帰を使って実装せよ。 # 問題 コインの種類として、1,5,8,10,15の5種類を与える。 # に対して、最小枚数のコインでmを支払うときの枚数を求めよ。 # 金種([15,10,8,5,1]). '与えられた金額に対して、最小枚数のコインでmを支払うときの枚数を求める'(_m,_最小コイン枚数) :- 金種(_金種ならび), sort(_金種ならび,_整列された金種ならび), reverse(_整列された金種ならび,_大きい順の金種ならび), 最小コイン枚数(_大きい順の金種ならび,_m,_最小コイン枚数). 最小コイン枚数([],X,X) :- !. 最小コイン枚数([N|R],U,X) :- M is U mod N, Y is U // N, U2 is U + M, 最小コイン枚数(R,U2,M,Y,X). 最小コイン枚数(R,U,M,Y,X) :- M =< 2,X is Y + M,!. 最小コイン枚数(R,U,M,Y,X) :- M >= 5,最小コイン枚数(R,M,Z),X is Y + Z,!. 最小コイン枚数(R,U,M,Y,4) :- M >= 3,M =< 4,U2 is U + M,最小コイン枚数(R,U2,Z),X is Z + Y - 1,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '与えられた金額に対して、最小枚数のコインでmを支払うときの枚数を求めよ。'(_m,_最小コイン枚数) :- 暫定候補枚数を得る(_m,[15,10,8,5,1],0,_暫定候補枚数), 最小枚数のコインでmを支払うときの枚数(_暫定候補枚数,_最小コイン枚数). 暫定候補枚数を得る(0,_,X,X) :- !. 暫定候補枚数を得る(_m,[P|R1],S1,X) :- D is _m // P, _m_2 is _m mod P, S2 is S + D, 暫定候補枚数を得る(_m_2,S2,X). 最小枚数のコインでmを支払うときの枚数(_m,_暫定候補枚数,_最小コイン枚数) :- findmin(_枚数,暫定候補枚数より少ない支払いを探す(_m,_暫定候補枚数,_枚数),_最小コイン枚数),!. 暫定候補枚数より少ない支払いを探す(_m,_暫定候補枚数,_枚数) :- for(0,A,_暫定候補枚数), for(0,B,_暫定候補枚数), for(0,C,_暫定候補枚数), for(0,D,_暫定候補枚数), for(0,E,_暫定候補枚数), _m is 1 * A + 5 * B + 8 * C + 10 * D + 15 * E, _枚数 A + B + C + D + e, _枚数 =< _暫定候補枚数. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/880 # # [1] 授業単元:計算機とアルゴリズム # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10699.txt # # 問題4 # # 3つの整数 a,b,c を比較し、 それを小さい順に並べて表示するプログラムを作成しなさい。 # 例として a, b, c をそれぞれ 240, 77, 89 としたとき、下のような実行結果を表示するようにしなさい。 # # 実行結果 # # 240 と 77 と 89 を小さい順に並べ替えます # 小さい順は 77, 89, 240 です # :- op(600,xfx,と). :- op(750,xf,を小さい順に並べ替えます). /* _a と _b と _c を小さい順に並べ替えます :- 挿入整列([_a,_b,_c],[_1,_2,_3]), write_formatted('小さい順は %t,%t,%t です\n',[_1,_2,_3]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% _a と _b と _c を小さい順に並べ替えます :- '3つの整数 a,b,c を比較し、 それを小さい順に並べて'(_a,_b,_c,_1,_2,_3), write_formatted('小さい順は %t,%t,%t です\n',[_1,_2,_3]). '3つの整数 a,b,c を比較し、 それを小さい順に並べて'(_a,_b,_c,_1,_2,_3) :- 挿入整列([_a,_b,_c],[_1,_2,_3]). */ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '3つの整数 a,b,c を比較し、 それを小さい順に並べて表示する'(_a,_b,_c) :- '3つの整数 a,b,c を比較し、 それを小さい順に並べて'(_a,_b,_c,_1,_2,_3), write_formatted('小さい順は %t,%t,%t です\n',[_1,_2,_3]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 挿入整列([],L,L) :- !. 挿入整列([A|R1],L2,L3) :- 挿入整列_1(A,L2,L4), 挿入整列(R1,L4,L3). 挿入整列_1(_,[],[]) :- !. 挿入整列_1(A,[B|R1],[A,B|R1]) :- A =< B,!. 挿入整列_1(A,[B|R1],[B|R2]) :- A > B, 挿入整列_1(A,R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/722 # # [1] 授業単元: ハフマン符号 # [2] 問題文(含コード&リンク): 文字とその確率を入力しそれに対するハフマン符号を文字に割当て # 表示する # 文字とその確率を入力しそれに対するハフマン符号を文字に割当て表示する :- 文字とその確率を入力し(LL1), ハフマン符号化(LL1,LL2), ハフマン符号表(LL2). 文字とその確率を入力し(LL1) :- get_split_lines([' ',','],LL), findall([_確率,_文字],( member([_文字,B],LL), atom_to_term(B,_確率,_)), LL1). ハフマン符号化(L1,[[A,'0']|R]) :- sort(L1,L2), append(L3,[[_,A]],L2), ハフマン符号の割り当て(L3,[[B,C]|L4]), ハフマン符号に補正する(L4,[[B,C]],R). ハフマン符号の割り当て([[_,A]],[[A,'1']]) :- !. ハフマン符号の割り当て([[_,A]|R1],[[A,S1]|R2]) :- ハフマン符号の割り当て(R1,R2), R2 = [[B,S2]|_], concat_atom(['1',S2],S1). ハフマン符号に補正する([],L,L) :- !. ハフマン符号に補正する([[A,B]|R1],L1,L) :- concat_atom([B,'0'],C), ハフマン符号に補正する(R1,[[A,C]|L1],L). ハフマン符号表([]) :- !. ハフマン符号表([[A,B]|R]) :- write_formatted('%t %t\n',[A,B]), ハフマン符号表(R). % 以下のサイトは # 出典:: 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/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/217 # # [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)へ出力する'(_並べ替え方法) :- get_lines('input.txt',Lines), 整列(_並べ替え方法,Lines,Lines2), put_lines('out.txt',Lines2). 整列(_並べ替え方法,_対象ならび,_整列されたならび) :- 分割閾値の選択(_対象ならび,_分割閾値,_それ以外のならび), 分割(_並べ替え方法,_それ以外のならび,_分割閾値,_左側ならび,_右側ならび), 整列(_並べ替え方法,_左側ならび,_整列された左側ならび), 整列(_並べ替え方法,_右側ならび,_整列された右側ならび), append(_整列された左側ならび,[_分割閾値|_整列された右側ならび],_整列されたならび). 整列(_,[],[]). 分割閾値の選択([_分割閾値|_残りならび],_分割閾値,_残りならび) :- ここでは先頭要素を分割閾値とする. ここでは先頭要素を分割閾値とする. 分割(昇順,[_要素|_残りならび],_分割閾値,[_要素|_左側ならび],_右側ならび) :- _要素 @=< _分割閾値, 分割(昇順,_残りならび,_分割閾値,_左側ならび,_右側ならび). 分割(降順,[_要素|_残りならび],_分割閾値,[_要素|_左側ならび],_右側ならび) :- _要素 @>= _分割閾値, 分割(降順,_残りならび,_分割閾値,_左側ならび,_右側ならび). 分割(昇順,[_要素|_残りならび],_分割閾値,_左側ならび,[_要素|_右側ならび]) :- _要素 @> _分割閾値, 分割(昇順,_残りならび,_分割閾値,_左側ならび,_右側ならび). 分割(降順,[_要素|_残りならび],_分割閾値,_左側ならび,[_要素|_右側ならび]) :- _要素 @< _分割閾値, 分割(降順,_残りならび,_分割閾値,_左側ならび,_右側ならび). 分割(_,[],_,[],[]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/989 # # [1] 授業単元:プログラミング演習 # [2] 問題文 : # 1.テキストファイル(file,txt)を読み込み、 goodという単語すべてをbadに置換し、filea.txtに出力せよ # 2.テキストファイル(file,txt)を読み込み、文字数の多い行から順に並べかえてfileb.txtに出力せよ # 'テキストファイル(file,txt)を読み込み、 goodという単語すべてをbadに置換し、filea.txtに出力せよ' :- get_lines('file.txt',Lines), findall(Line2,(member(Line,Lines),replace_all(Line,good,bad,Line2)),Lines2), put_lines('filea.txt',Lines2). 'テキストファイル(file,txt)を読み込み、文字数の多い行から順に並べかえてfileb.txtに出力せよ' :- get_lines('file.txt',Lines), findall([_文字数,_行],(member(_行,Lines),sub_atom(_行,_,_文字数,_,_行)),L1), sort(L1,L2), 第二要素だけ選択してならびを反転する(L2,[],L3), put_lines('fileb.txt',L3). 第二要素だけ選択してならびを反転する([],L,L) :- !. 第二要素だけ選択してならびを反転する([[_,A|_]|R1],L1,L) :- 第二要素だけ選択してならびを反転する(R1,[A|L1],L). replace_all('',_,_,[]) :- !. replace_all(Atom,Subatom,R_atom,[R_atom|R]) :- sub_atom(Atom,0,Len,Len3,Subatom), sub_atom(Atom(Len,Len3,_,Atom2), replace_all(Atom2,Subatom,R_atom,R),!. replace_all(Atom,Subatom,R_atom,[Atom1,R_atom|R]) :- sub_atom(Atom,_,_,_,Atom1,Subatom,Atom2,_,_,_), replace_all(Atom2,Subatom,R_atom,R),!. replace_all(Atom,_,_,[Atom]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1267796762/81 # # 【 課題 】入力したテキストに含まれる文字を種類別に使用回数を表示し、降順にソートし出力するプログラムを作れ。 # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】5月中 # 【 Ver  】java version "1.6.0_17" # 【 補足 】使用する文字は半角アルファベットのみです。 # # 文字種(英小文字,a,z). 文字種(英大文字,'A','Z'). 入力したテキストに含まれる文字を種類別に使用回数を表示し、降順にソートし出力する(_テキストファイル,_出力ファイル) :- findall(_文字種,文字種(_文字種,_,_),_文字種ならび), get_chars(_テキストファイル,Chars), 文字を種類別に使用回数を表示し(Chars,_文字種ならび,L), 降順にソートし出力する(_出力ファイル,Chars). 文字を種類別に使用回数を表示し(_,[],[]) :- !. 文字を種類別に使用回数を表示し(Chars,[_文字種|R1],[[_使用回数,_文字種]|R2]) :- count((member(A,Chars),文字種(_文字種,C1,C2),A @>= C1,A @=< C2),_使用回数), write_formatted('%t %t回\n',[_文字種,_使用回数]), 文字を種類別に使用回数を表示し(Chars,R1,R2). 降順にソートし出力する(_出力ファイル,L) :- 降順にソートし(L,L2), open(_出力ファイル,write,Output), 出力する(Output,L2), close(Output),!. 降順にソートし(L,L2) :- sort(L,L1),reverse(L1,L2),!. 出力する(Output,[]) :- !. 出力する(Output,[[_使用回数,_文字種]|R]) :- write_formatted(Output,'%t %t回\n',[_文字種,_使用回数]),出力する(Output,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/901 # # ../test/read.cgi/tech/1269438098/900 # こんな入力・出力例でいいの? # # Input: # # 2 # 1,1,murayama # 1,2,sugano # 3,3,koizumi # 3,4,abe # 5,5,hatoyama # 6,6,ozawa # # Output: # # #1 # Rep. Name: murayama # Rep. Attendance: 1 # Group: 001 # Group Attendance: 2 # # #2 # Rep. Name: koizumi # Rep. Attendance: 1 # Group: 003 # Group Attendance: 2 # 代表の生徒の名前、代表者の出席回数、グループメンバーの出席回数、グループの全体の出席回数の上位x番だけ出力する(_代表の生徒の名前,_代表者の出席回数,_グループメンバーの出席回数上位5位,_グループ全体の出席回数上位5位) :- findall([_代表の個人ID,_名前],生徒(_代表の個人ID,_代表の個人ID,_名前),_代表の個人ID・名前ならび), member([_代表の個人ID,_名前],_代表の個人ID・名前ならび), 代表者の出席回数(_代表の個人ID,_代表者の出席回数), グループメンバーの出席回数(_代表のID,_グループメンバーの出席回数ならび), グループメンバーの出席回数上位5位(_グループメンバーの出席回数ならび,グループメンバーの出席回数上位5位), グループ全体の出席回数(_代表のID,_グループ全体の出席回数ならび), グループ全体の出席回数上位5位(_グループ全体の出席回数ならび,グループ全体の出席回数上位5位). 代表者の出席回数(_代表の個人ID,_代表者の出席回数) :- count(出席者(_代表の個人ID),_代表者の出席回数). グループメンバーの出席回数(_代表のID,_グループメンバーの出席回数ならび) :- findsetof(_個人ID,(生徒(_代表のID,_個人ID,_),\+(_代表のID=_個人のID)),_グループメンバーならび), findall([_出席回数,_個人ID], ( member(_個人ID,_グループメンバーならび), count(出席者(_個人ID),_出席回数)), _グループメンバーの出席回数ならび),!. グループ全体の出席回数(_代表のID,_グループメンバーの出席回数ならび) :- findsetof(_個人ID,生徒(_代表のID,_個人ID,_),_グループメンバーならび), findall([_出席回数,_個人ID], ( member(_個人ID,_グループメンバーならび), count(出席者(_個人ID),_出席回数)), _グループ全体の出席回数ならび),!. グループメンバーの出席回数上位N位(N,_グループメンバーの出席回数ならび,_グループメンバーの出席回数上位5位) :- 大きい順に上位N位(N,_グループメンバーの出席回数ならび,_グループメンバーの出席回数上位5位). グループ全体の出席回数上位N位(N,_グループ全体の出席回数ならび,_グループ全体の出席回数上位5位) :- 大きい順に上位N位(N,_グループ全体の出席回数ならび,_グループ全体の出席回数上位5位). 大きい順に上位N位(L1,L) :- sort(L1,L2), reverse(L2,L3), length(L,N), append(L,_,L3),!. 大きい順に上位N位(L1,L) :- sort(L1,L2), reverse(L2,L),!. キーボードから代表者のID,個人のID,名前を入力するものとし、グループメンバーは代表者のIDでのみで関連付けされる :- キーボードから代表者のID,個人のID,名前を入力する(_代表者のID,_個人のID,_名前), assertz(生徒(_代表者のID,_個人のID,_名前)), キーボードから代表者のID,個人のID,名前を入力するものとし、グループメンバーは代表者のIDでのみで関連付けされる. キーボードから代表者のID,個人のID,名前を入力するものとし、グループメンバーは代表者のIDでのみで関連付けされる. キーボードから代表者のID,個人のID,名前を入力する(_代表者のID,_個人のID,_名前) :- get_split_line([','],[_代表者のID,_個人のID,_名前]). 出席者の入力 :- get_line(Line), atom_to_term(Line,_個人ID,_), integer(_個人ID), assertz(出席者(_個人ID)), 出席者の入力. 出席者の入力. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/908 # # MySQL 5.1 # # TEAMが1 で、 # NAMEにaを含むデータを上位にして、 # SCOREの多い順に取り出したいのですが、 # どう書けばいいですか?お願いします。 # # これを # ID|TEAM|NAME|SCORE # --+----+----+----- # 1 | 1  | aaa | 200 # 2 | 2  | abb | 50 # 3 | 1  | ccc | 300 # 4 | 1  | daa | 400 # 5 | 1  | eae | 100 # 6 | 1  | fff  | 800 # # ↓こうしたい # ID|TEAM|NAME|SCORE # --+----+----+----- # 4 | 1  | daa | 400 # 1 | 1  | aaa | 200 # 5 | 1  | eae | 100 # 6 | 1  | fff  | 800 # 3 | 1  | ccc | 300 # 'TEAMが1でSCOREの多い順に取り出したい'(_SCOREの多い順ならび) :- 'TEAMが1でNAMEにaを含むデータを上位にして'(_aを含む鍵付きデータ,_aを含まない鍵付きデータ), 'SCOREの多い順に取り出したい'(_aを含む鍵付きデータ,_aを含まない鍵付きデータ,_SCOREの多い順ならび),!. 'SCOREの多い順に取り出したい'(_aを含む鍵付きデータ,_aを含まない鍵付きデータ,_SCOREの多い順ならび) :- 降順整列(_aを含む鍵付きデータ,_降順に整列したaを含む鍵付きデータ), 降順整列(_aを含まない鍵付きデータ,_降順に整列したaを含まない鍵付きデータ), 鍵を除去しながら結合する(_降順に整列したaを含む鍵付きデータ,_降順に整列したaを含まない鍵付きデータ,_SCOREの多い順ならび). 'TEAMが1でNAMEにaを含むデータを上位にして'(_aを含む鍵付きデータ,_aを含まない鍵付きデータ) :- findall([SCORE,ID,1,NAME,SCORE],(テーブル(ID,1,NAME,SCORE),'NAMEにaを含む(NAME)),_aを含む鍵付きデータ), findall([SCORE,ID,1,NAME,SCORE],(テーブル(ID,1,NAME,SCORE),\+('NAMEにaを含む'(NAME))),_aを含まない鍵付きデータ),!. 'NAMEにaを含む'(NAME) :- sub_atom(NAME,_,1,_,a),!. 鍵を除去しながら結合する([],[],[]) :- !. 鍵を除去しながら結合する([],Y,X) :- 鍵を除去しながら結合する(Y,[],X),!. 鍵を除去しながら結合する([[_|L]|R1],Y,[L|Z]) :- 鍵を除去しながら結合する(R1,Y,Z). % 以下のサイトは findsort(_集約項,_集約対象項,P,_射影項) :- findsetof(_集約項,P), append(_集約対象項,_射影項,L1), findall(L1,P,L2), sort(L2,L3), append(_集約対象項,_射影項,L), member(L,L3). findrsort(_集約項,_集約対象項,P,_射影項) :- findsetof(_集約項,P), append(_集約対象項,_射影項,L1), findall(L1,P,L2), sort(L2,L3), reverse(L3,L4), append(_集約対象項,_射影項,L), member(L,L4). findsort(_集約対象項,P,_射影項) :- append(_集約対象項,_射影項,L1), findall(L1,P,L2), sort(L2,L3), append(_集約対象項,_射影項,L), member(L,L3). findrsort(_集約対象項,P,_射影項) :- append(_集約対象項,_射影項,L1), findall(L1,P,L2), sort(L2,L3), reverse(L3,L4), append(_集約対象項,_射影項,L), member(L,L4). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). findsetof(A,B) :- findall(A,B,C), setof(A,member(A,C),D), member(A,D). % 以下のサイトは # 出典:: 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 # 左から番号、名前、体重、身長です # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 鍵項目位置(身長,[_,_,_,_身長],[_身長]). % 鍵項目位置(体重,[_,_,_体重,_],[_体重]). % 鍵項目位置(身長・体重,[_,_,_体重,_身長],[_身長,_体重]). '鍵項目順に整列(昇順)の一般解'(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/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/256 # # [1] 授業単元: 並列プログラミング # [2] 問題文(含コード&リンク): 配列をソートするために、クイックソートをMPIを用いて並列化せよ。 # % Prolog 友人(AZ-Prologの開発者)に解答を依頼したところ掲載してよいからとメールがきました。 % AZ-Prologの並列機能を使っています。 % 同様に偶数のNプロセスでソートすることもできます。 % 方法1) % 子プロセスのソート部分は従来のqsortそのままで、親がわであらかじめN個の % PartitionでN個のリストを作ってから並列実行させる。 % 方法2) % 深さ指定のパラメータをわたし、子側でさらに孫をつくるか、自分でソートするか % 分岐をいれておく。 % % % 2プロセスでソートする最も簡単な並列化です。 % ただし、データのプロセス間通信コストが発生するのであまりいい例ではありません。 % (このように単純なプログラムではシングルでソートしたほうが早い場合が多い!?) /* qsort.pl qsort を2プロセス並列で解を求める | ?- mlt_quick_sort([5,4,1,8,4,0,9],Ans). A = [0,1,4,4,5,8,9] yes 軽い説明: mlt_send(Prc,[[Goal,ReturnValue],[Goal2,ReturnValue2]...]) Procの個数分ゴールと戻し値を設定する mlt_receive(Proc,[ReturnValue,ReturnValue2....]) mlt_sendで起動した順、設定された戻し値がユニファイされ る */ mlt_quick_sort([A|L],Ans):- mlt_proc(2,prolog_c,'',consult('qsort.pl'),Proc), % 2つの子プロセスを立ち上げる partition(A,L,Ls,Lb), % 元データを2つに分割する mlt_send(Proc, [[qsort(Ls,X),X],[qsort(Lb,Y),Y]]), % 2つのリストを2つのプロセスで並列ソート mlt_receive(Proc,[ Ans-[A|Else], Else-[] ]), % 結果を起動順に受け取る(上のサブゴールの X,Y ) mlt_kill(Proc). % 子プロセスを削除する %%%%% Quick Sort %%%%% quick_sort(List,Ans):-qsort(List,Ans-[]). qsort([X|L],Ans-Tail):- !,partition(X,L,Lsmall,Lbig), qsort(Lsmall,Ans-[X|Else]), qsort(Lbig,Else-Tail). qsort([],L-L). partition(X,[A|L],Ls,[A|Lb]):-X @< A,!,partition(X,L,Ls,Lb). partition(X,[A|L],[A|Ls],Lb):-!,partition(X,L,Ls,Lb). partition(_,[],[],[]). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/817 # # [テーブルA] # ID, AGE, GROUP # --- ---- ----- # 1 , 10, A # 2 , 20, A # 3 , 30, A # 4 , 20, B # 5 , 40, B # 6 , 60, B # 7 , 10, C # 8 , 30, C # 9 , 50, C # 10 , 70, C # # ↑のテーブルから、 # 各GROUP毎にAGEで順位付けした結果を取得したいです。 # # <結果> # # ID, AGE, GROUP, RANK # --- ---- ----- ----- # 1 , 10, A 1 # 2 , 20, A 2 # 3 , 30, A 3 # 4 , 20, B 1 # 5 , 40, B 2 # 6 , 60, B 3 # 7 , 10, C 1 # 8 , 30, C 2 # 9 , 50, C 3 # 10 , 70, C 4 # # # GROUP BYを使ってみたのですが、 # どうも見当違いのSQLになってしまって。。 # # すいませんが、どのようなSQLを書けばよいかご教示ください。 # '各GROUP毎にAGEで順位付けした結果を取得'(X) :- findsetof(Group,'テーブルA'(_,_,Group),L1), '各GROUP毎にAGEで順位付けした結果を取得'(1,L1,X). '各GROUP毎にAGEで順位付けした結果を取得'(_,[],[]) :- !. '各GROUP毎にAGEで順位付けした結果を取得'(M,[Group|R1],X) :- findall([Age,Group],'テーブルA'(_,Age,Group),L2), 整列(L2,L3), 順序づけ(M,M2,1,L3,L4), '各GROUP毎にAGEで順位付けした結果を取得'(M2,R1,Y), append(L4,Y,X). 順序づけ(M,M,_,[],[]) :- !. 順序づけ(M,MX,N,[[Age,Group]|R1],[M,Age,Group,N|R2]) :- N2 is N + 1, M2 is M + 1, 順序づけ(M2,MX,N2,R1,R2). % 以下のサイトは # 出典:: 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://pc11.2ch.net/test/read.cgi/db/1252492296/713 # # # A B C # - - - # 1 3 a # 1 5 b # 2 8 c # 2 4 d # 2 6 e # 3 3 f # 3 1 g # # 上記のようなSAMPLEテーブルがあるとき、 # AごとにBが最大となるレコードのCを得たい、 # つまり、抽出結果を下記のようにしたいと考えています。 # # A C # - - # 1 b # 2 c # 3 f 'SAMPLE'('1','3','a'). 'SAMPLE'('1','5','b'). 'SAMPLE'('2','8','c'). 'SAMPLE'('2','4','d'). 'SAMPLE'('2','6','e'). 'SAMPLE'('3','3','f'). 'SAMPLE'('3','1','g'). 'AごとにBが最大となるレコードのCを得る'(X,Y) :- findsetof(A,'SAMPLE'(A,_,_),L), member(A,L), findmax([B,A,C],'SAMPLE'(A,B,C),[_,X,Y]). findsetof(A,B,C) :- findall(A,B,L), setof(A,member(A,L),C). findmax(A,P,X) :- findall(A,P,L), sort(L,L2), last(L2,X). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/631 # # MYSQL使ってます。 # id キーワード # 1 りんご # 2 みかん # 3 りんご # のようにDBに登録されてるキーワードが多い順に例えばヒット件数トップ10のキーワードを # 抜き出したいのですがどのように書いたらいいでしょうか? # 件数少ないうちは今までにないキーワードがでたら全検索で数えるって繰り替えそうと思ったんですけど、 # 件数多くなったら効率的に書かないとまずいかなと思いまして。 キーワード数の上位10位までを表示 :- findall([M,N],カウンタカウンタ(M,N),L1), sort(L1,L2), reverse(L2,L3), 上位10位まで(L3,L), キーワード数の上位10位までを表示(L). キーワード数の上位10位までを表示([]) :- !. キーワード数の上位10位までを表示([M|R]) :- キーワードカウンタ(_キーワード,M), キーワード表示(_キーワード), fail. キーワード数の上位10位までを表示(R). キーワード表示(_キーワード) :- キーワード(ID,_キーワード), write_formatted('%t,%t\n',[ID,_キーワード]). 上位10位まで([],_,[]) :- !. 上位10位まで(_,Count,[]) :- Count >= 10,!. 上位10位まで([[M,N]|R1],Count1,[M|R2]) :- Count2 is Count1 + N, 上位10位まで(R1,Count2,R2). キーワードカウンタを準備する :- abolish(キーワードカウンタ/2), キーワード(Id,_キーワード), キーワードカウンタ((+),_キーワード), fail. キーワードカウンタを準備する. キーワードカウンタ((+),_キーワード) :- retract(キーワードカウンタ(_キーワード,_現在のカウント)), _加算されたカウント is _現在のカウント + 1, カウンタカウンタの更新((-),_現在のカウント) カウンタカウンタの更新((+),_加算されたカウント), asserta(キーワードカウンタ(_キーワード,_加算されたカウント)),!. キーワードカウンタ((+),キーワード) :- asserta(キーワードカウンタ(_キーワード,1)), カウンタカウンタの更新((+),1),!. カウンタカウンタの更新((+),M) :- retract(カウンタカウンタ(M,N)), N2 is N + 1, asserta(カウンタカウンタ(M,N2)),!. カウンタカウンタの更新((+),M) :- asserta(カウンタカウンタ(M,1)). カウンタカウンタの更新((-),M) :- retract(カウンタカウンタ(M,N)), N1 is N - 1, asserta(カウンタカウンタ(M,N1)),!. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/599 # # 以下のSQLで最新日の2000円以上の売上があった商品を抽出しているんですが、 # SELECT * FROM SALES WHERE uriage >= 2000 AND date = (select max(date) from SALES) # 「その商品の前回売上があった日の売上額」と「前回の売上と比べてどれだけ増えたのかの増加率」 # を出したい場合どうしたらいいでしょう? # # 商品ID(id) | 日付(date) | 売上額(uriage) | 前回売上額 | 売上増加率 # 3 | 1267714800 | 2500 | ????? | ????? # 4 | 1267714800 | 2800 | ????? | ????? # # [日付の形式はunixtimeで、データ登録の際は日付だけ変更させ、時間と秒は常に統一させています] # [mysql 5.1] # 前回売上との比較売上表(_年/_月/_日) :-     findall(_商品ID,(売上(_商品ID,_日付,_),localtime(_日付,_年,_月,_日,_,_,_,_)),_売上のあった商品IDならび), sort(_売上のあった商品IDならび     member(_商品ID2,_売上のあった商品IDならび),     当日の売上金額計(_商品ID2,_年/_月/_日,_売上金額計),     前回売上があった日(_商品ID2,_日付,_前回売上があった日),     前回売上があった日の売上金額計(_商品ID2,_前回売上があった日,_前回売上があった日の売上金額計),     売上行表示(_商品ID2,_年/_月/_日,_売上金額計,_前回売上があった日の売上金額計),     fail. 前回売上との比較売上表(_,_,_). 前回売上があった日(_商品ID,_日付,_前回売上があった日) :-     localtime(_日付,_年1,_月1,_日1,_,_,_,_),     findmax(_年2/_月2/_日2,(売上(_商品ID,_日付2,_),localtime(_日付2,_年2,_月2,_日2,_,_,_,_),_年1/_月1,_日1 @> _年2/_月2/_日2),_前回売上があった日). 前回売上があった日の売上金額計(_商品ID,_年/_月/_日,_売上金額計) :-     findsum(_売上金額,(売上(_商品ID,_日付2,_売上金額),localtime(_日付2,_年,_月,_日,_,_,_,_)),_売上金額計). 当日の売上金額計(_商品ID,_年/_月/_日,_売上金額計) :-     findsum(_売上金額,(売上(_商品ID,_日付,_売上金額),localtime(_日付,_年,_月,_日,_,_,_,_)),_売上金額計). 売上行表示(_商品ID,_年/_月/_日,_売上金額計,0.0) :-     write_formatted('%8d | %2d/%2d/%2d | %12.0f\n',[_商品ID2,_年/_月/_日,_売上金額計]),!. 売上行表示(_商品ID,_年/_月/_日,_売上金額計,_前回売上金額計) :-     _売上増加率 is _売上金額計 / _前回売上のあった日の売上金額計,     write_formatted('%8d | %2d/%2d/%2d | %12.0f | %12.0f | %4.1f\n',[_商品ID,_年/_月/_日,_売上金額計,_前回売上金額計,_売上増加率]),!. % 以下のサイトは # 出典:: 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件だけ抽出する(_テーブル名,L) :-    functor(Q,_テーブル名,3),    重複を排除したidならびの抽出(ID,Q,L1),    整列(L1,L2),    findall(L3,(member(ID,L1),idに対して最新の5件だけ抽出する(ID,Q,L3)),L). idに対して最新の5件だけ抽出する(ID,Q,L) :-    目標Qの第一引数はID(ID,Q),    idに対して組ならびを抽出する(Q,L3),    最新の5件だけ抽出する(L3,L). idに対して組ならびを抽出する(Q,L3) :-    findall(L1,(call(Q),引数部分だけ抽出する(Q,L1)),L2),    整列(L2,L3),!. 重複を排除したidならびの抽出(ID,Q,L1) :- setof(ID,Q,L1). 目標Qの第一引数はID(ID,Q) :- arg(1,Q,ID),!.    引数部分だけ抽出する(Q,L1) :- Q =.. [_|L1]. 最新の5件だけ抽出する(L3,L) :-    length(L,5),    append(_,L,L3),!. 最新の5件だけ抽出する(L,L) :- !. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1267796762/13 # # 【 課題 】 # ○県、市別に男女の人数をクロス集計するプログラムを作成せよ。 # # 千葉県 柏市 男 # 千葉県 松戸市 男 # 埼玉県 さいたま市 女 # 千葉県 柏市 男 # 埼玉県 越谷市 男 # 千葉県 松戸市 男 # 埼玉県 岩槻市 女 # 千葉県 柏市 女 # 埼玉県 さいたま市 女 # # [実行例](男の場合) # ,柏市,松戸市,さいたま市,越谷市,岩槻市 # 千葉県,2,2,0,0,0 # 埼玉県,0,0,0,1,0 # # [実行例](女の場合) # ,柏市,松戸市,さいたま市,越谷市,岩槻市 # 千葉県,1,0,0,0,0 # 埼玉県,0,0,2,0,1 # # 【 形態 】1. Javaアプリケーション # # 【 期限 】3/28まで # # 【 Ver  】java version "1.5.0_05" # # # CSVへの出力やファイル入出力といったことはできますが、クロス集計のアルゴリズムに苦戦しています。 # よろしくお願い致します。 # # ○県、市別に男女の人数をクロス集計する(_性別) :- findall(_県名,県・市・男女(_県,_,_),_重複を許した県名ならび), sort(_重複を許した県名ならび,_整列した重複しない県名ならび), findall(_都市名,県・市・男女(_,_都市名,_),_重複を許した都市名ならび), sort(_重複を許した県名ならび,_整列した重複しない都市名ならび), concat_atom(_整列した重複しない都市名ならび,',',_都市名行表示), write_formatted(',%t\n',[_都市名行表示]), member(_県名,_整列した重複しない県名ならび), findall(_人数,( member(_都市名,_整列した重複しない都市名), count(_県名,_都市名,_性別),_人数)), _人数ならび), concat_atom([_県名|_人数ならび],_行表示), write_formatted('%t\n',[_行表示]), fail. ○県、市別に男女の人数をクロス集計する(_性別). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1268003943/134 # # 麻雀の手牌が入力として与えられたとき、「待ち」を出力するプログラムを書いてください。 # - 字牌なし・萬子のみの想定、つまり、いわゆる「チンイツ」限定で結構です(プログラミングの本質的にはこの限定でまったく問題ないため) # - 1〜9の数字13個からなる文字列を受け取り、できている順子・刻子・アタマを()、待ちの部分を[]でくくって出力してください # - 面前かつ槓子は存在しない前提でOKです # - ()[]の出力順は自由ですが、順序だけが違うものは同一視してください(例:111222を刻子2つで構成するとき、(111)(222)が(222)(111)に入れ替わるだけのものは同一解答とします) # - 多面待ちのときも含めすべての待ちを出力してください # - 待ちがないときは何も出力しないでください # # 出力例 # 1112224588899 : # 単純なケースです。45を軸にする両面の待ちなので、(111)(222)(888)(99)[45]になります。 # # 1122335556799 : # “99”をアタマの両面か“55”“99”のシャボであるので、(123)(123)(555)(99)[67]、(123)(123)(55)(567)[99]、(123)(123)(99)(567)[55]が正解です。 # # 1112223335559 : # 待ちは“9”単騎ですが、(123)(123)(123)(555)[9]と(111)(222)(333)(555)[9]の2つあります。 # # 1223344888999 : # 1-4の“ノベタン”待ちですが、4をアタマにしての[23]待ちと、1単騎、4単騎で3個の答えになります。 # # 1112345678999 : # 「九蓮宝燈」という役です。1〜9すべてが待ちになっています。これに正しく答えが出るのであれば、プログラムはほぼ正しいでしょう。 # # ttp://www.itmedia.co.jp/enterprise/articles/1004/03/news002_2.html # # 上がり(_待ち牌,_現在の手牌,[_アタマ|_順子または刻子ならび]) :- 整列([_待ち牌|_現在の手牌],_整列された上がり手配候補), アタマ(_アタマ,_整列された上がり手配候補,_アタマを取った残りならび), 順子または刻子(_順子または刻子ならび,_アタマを取った残りならび,_). 刻子または順子([],[],[]). 刻子または順子([U|R1],L,R2) :- 順子(U,L,R3),刻子または順子(R1,R3,R2). 刻子または順子([U|R1],L,R2) :- 刻子(U,L,R3),刻子または順子(R1,R3,R2). アタマ([A,A],[A,A|R],R). アタマ(_アタマ,[A,A,A,A|R1],[A,A|R2]) :- !,アタマ(_アタマ,R1,R2). アタマ(_アタマ,[A,A,A|R1],[A|R2]) :- !,アタマ(_アタマ,R1,R2). アタマ(_アタマ,[A|R1],[A|R2]) :- アタマ(_アタマ,R1,R2). 刻子([A,A,A],[A,A,A|R],R). 刻子(_刻子,[A,A,A,A|R1],[A|R2]) :- !,刻子(_刻子,R1,R2). 刻子(_アタマ,[A|R1],R2) :- 刻子(_アタマ,R1,R2). 順子([A,B,C],_手牌,_残りならび) :- append(L0,L,_手牌),append([A|R1],[B|R2],[C|R3],L), 順子([A,B,C]), append(L0,R1,R2,R4),append(R4,R3,R). 順子([1,2,3]). 順子([2,3,4]). 順子([3,4,5]). 順子([4,5,6]). 順子([5,6,7]). 順子([6,7,8]). 順子([7,8,9]). /* 上がり(_待ち牌,_現在の手牌,[_アタマ|_順子または刻子ならび]) :- 整列([_待ち牌|_現在の手牌],_整列された上がり手配候補), アタマ(_アタマ,_整列された上がり手配候補,_アタマを取った残りならび), アタマの候補(_手牌,_アタマ候補) :- 順子を構成する候補(_整列した手牌ならび,_待ち牌,_構成される順子,_残り牌) :- 刻子を構成する候補(_整列した手牌ならび,_待ち牌,_構成される刻子,_残り牌) :- */ % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/851 # # [1] 授業単元:知識情報基礎実験 # [2] 問題文(含コード&リンク): # 乱数を希望数取得し、それをバブルソート、挿入ソート、クイックソート、ヒーブソートの各種を用いてソートせよ(4個のプログラムを作成する)。 # また、それぞれ比較回数、実行時間を計測せよ。 # クイックソート(_ならび,_整列したならび) :-    第一要素を分割値とする(_ならび,_分割値,_残りならび),    分割値に対しての大小で二分割する(_分割値,_残りならび,_分割値より小さいかまたは等しい値ならび,_分割値より大きい値ならび),    分割値より小さい値ならびを整列する(_小さい値ならび,_整列した小さい値ならび),    分割値より大きい値ならびを整列する(_大きい値ならび,_整列した大きい値ならび),    整列した二つのならびと分割値を結合する(_分割値,_整列した小さい値ならび,_整列した大きい値ならび,_整列した値ならび). クイックソート([],[]). 第一要素を分割値とする([_分割値|_残りならび],_分割値,_残りならび). 分割値に対しての大小で二分割する(_,[],[],[]) :- !. 分割値に対しての大小で二分割する(_分割値,[A|R1],[A|R2],R3) :-    A @=< _分割値,    分割値に対しての大小で二分割する(_分割値,R1,R2,R3),!. 分割値に対しての大小で二分割する(_分割値,[A|R1],R2,[A|R3]) :-    A @> _分割値,    分割値に対しての大小で二分割する(_分割値,R1,R2,R3),!. 分割された部分を整列する(_分割された値ならび,_整列した分割された値ならび) :-    クイックソート(_分割された値ならび,_整列した分割された値ならび),!. 整列した二つのならびと分割値を結合する(_分割値,_整列した分割値より小さいかまたは等しい値ならび,_整列した分割値より大きい値ならび,_整列した値ならび) :-    append(_整列した分割値より小さいかまたは等しい値ならび,[_分割値|_整列した分割値より大きい値ならび],_整列した値ならび),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% クイックソート(_対象ならび,_整列された値ならび) :-    第一要素を分割値とする(_対象ならび,_分割値,_残り対象ならび),    分割値に対しての大小でならびを二分割する(_分割値,_残り対象ならび,_分割値より小さいかまたは等しい値ならび,_分割値より大きい値ならび),    分割されたならびを部分的に整列する(_分割値より小さいかまたは等しい値ならび,_整列された分割値より小さいかまたは等しい値ならび),    分割されたならびを部分的に整列する(_分割値より大きい値ならび,_整列された分割値より大きい値ならび),    整列された二つのならびと分割値を結合する(_分割値,_整列された分割値より小さいかまたは等しい値ならび,_整列された分割値より大きい値ならび,_整列された値ならび). クイックソート([],[]). 第一要素を分割値とする([_分割値|_残り対象ならび],_分割値,_残り対象ならび). 分割値に対しての大小でならびを二分割する(_,[],[],[]) :- !. 分割値に対しての大小でならびを二分割する(_分割値,[A|R1],[A|R2],R3) :-    A @=< _分割値,    分割値に対しての大小でならびを二分割する(_分割値,R1,R2,R3),!. 分割値に対しての大小でならびを二分割する(_分割値,[A|R1],R2,[A|R3]) :-    A @> _分割値,    分割値に対しての大小でならびを二分割する(_分割値,R1,R2,R3),!. 分割されたならびを部分的に整列する(_分割された値ならび,_整列された分割された値ならび) :-    クイックソート(_分割された値ならび,_整列された分割された値ならび),!. 整列された二つのならびと分割値を結合する(_分割値,_整列された分割値より小さいかまたは等しい値ならび,_整列された分割値より大きい値ならび,_整列された値ならび) :-    append(_整列された分割値より小さいかまたは等しい値ならび,[_分割値|_整列された分割値より大きい値ならび],_整列された値ならび),!. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& クイックソート(L,X) :-    第一要素を分割値とする(L,S,R),    分割値に対しての大小でならびを二分割する(S,R,L1,L2),    分割されたならびを部分的に整列する(L1,SL1),    分割されたならびを部分的に整列する(L2,SL2),    整列された二つのならびと分割値を結合する(P,SL1,SL2). クイックソート([],[]). 第一要素を分割値とする([P|R],P,R). 分割値に対しての大小でならびを二分割する(_,[],[],[]) :- !. 分割値に対しての大小でならびを二分割する(P,[A|R1],[A|R2],R3) :-    A @=< P,    分割値に対しての大小でならびを二分割する(P,R1,R2,R3),!. 分割値に対して大小でならびを二分割する(P,[A|R1],R2,[A|R3]) :-    A @> P,    分割値に対しての大小でならびを二分割する(P,R1,R2,R3),!. 分割されたならびを部分的に整列する(L,X) :-    クイックソート(L,X),!. 整列された二つのならびと分割値を結合する(P,SL1,SL2,L) :-    append(SL1,[P|SL2],L),!. % 以下のサイトは # 出典:: 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/555 # # [2] キーボードから3つの整数を受け取り大きさの小さい順に出力するプログラムを作りなさい。 # 但しmain関数内ではint変数一つだけが使えるものとします。またmain関数の再帰呼び出しも # 出来ません。(main関数の引数、argc,argvをint変数として使用することも勿論禁止します) # main関数のみで構成されるプログラムとして下さい。 # 入力される数は1から10までの範囲にあることを常にチェックし、それ以外の入力の場合は # 再入力を促して下さい。 # make :- write('main :-\n'), write(' write(''1-10の整数を空白で区切り3個入力してください : ''),\n'), write(' get_line(Line),(\n'), for(1,N1,10),for(1,N2,10),for(1,N3,10), quicksort([N1,N2,N3],L2), concat_atom(L2,' ',S), write_formatted(' Line=\'%t %t %t\',write(\'%t\\n\')',[N1,N2,N3,S]), make_1(N1,N2,N3), N3=10,N2=10,N1=10, write(' )),!.\n'), write('main :-\n'), write(' write(\'入力された数値範囲を検査してください\\n\'),'), write('\n main.\n'),!. make_1(10,10,10) :- write('\n'),!. make_1(_,_,_) :- write(';\n'),!. main :- write('1-10の整数を空白で区切り3個入力してください\n'), get_line(Line),( Line='1 1 1',write('1 1 1\n'); Line='1 1 2',write('1 1 2\n'); Line='1 1 3',write('1 1 3\n'); Line='1 1 4',write('1 1 4\n'); Line='1 1 5',write('1 1 5\n'); Line='1 1 6',write('1 1 6\n'); Line='1 1 7',write('1 1 7\n'); Line='1 1 8',write('1 1 8\n'); Line='1 1 9',write('1 1 9\n'); Line='1 1 10',write('1 1 10\n'); Line='1 2 1',write('1 1 2\n'); Line='1 2 2',write('1 2 2\n'); Line='1 2 3',write('1 2 3\n'); Line='1 2 4',write('1 2 4\n'); Line='1 2 5',write('1 2 5\n'); Line='1 2 6',write('1 2 6\n'); Line='1 2 7',write('1 2 7\n'); Line='1 2 8',write('1 2 8\n'); Line='1 2 9',write('1 2 9\n'); Line='1 2 10',write('1 2 10\n'); Line='1 3 1',write('1 1 3\n'); Line='1 3 2',write('1 2 3\n'); Line='1 3 3',write('1 3 3\n'); Line='1 3 4',write('1 3 4\n'); Line='1 3 5',write('1 3 5\n'); Line='1 3 6',write('1 3 6\n'); Line='1 3 7',write('1 3 7\n'); Line='1 3 8',write('1 3 8\n'); Line='1 3 9',write('1 3 9\n'); Line='1 3 10',write('1 3 10\n'); Line='1 4 1',write('1 1 4\n'); Line='1 4 2',write('1 2 4\n'); Line='1 4 3',write('1 3 4\n'); Line='1 4 4',write('1 4 4\n'); Line='1 4 5',write('1 4 5\n'); Line='1 4 6',write('1 4 6\n'); Line='1 4 7',write('1 4 7\n'); Line='1 4 8',write('1 4 8\n'); Line='1 4 9',write('1 4 9\n'); Line='1 4 10',write('1 4 10\n'); Line='1 5 1',write('1 1 5\n'); Line='1 5 2',write('1 2 5\n'); Line='1 5 3',write('1 3 5\n'); Line='1 5 4',write('1 4 5\n'); Line='1 5 5',write('1 5 5\n'); Line='1 5 6',write('1 5 6\n'); Line='1 5 7',write('1 5 7\n'); Line='1 5 8',write('1 5 8\n'); Line='1 5 9',write('1 5 9\n'); Line='1 5 10',write('1 5 10\n'); Line='1 6 1',write('1 1 6\n'); Line='1 6 2',write('1 2 6\n'); Line='1 6 3',write('1 3 6\n'); Line='1 6 4',write('1 4 6\n'); Line='1 6 5',write('1 5 6\n'); Line='1 6 6',write('1 6 6\n'); Line='1 6 7',write('1 6 7\n'); Line='1 6 8',write('1 6 8\n'); Line='1 6 9',write('1 6 9\n'); Line='1 6 10',write('1 6 10\n'); Line='1 7 1',write('1 1 7\n'); Line='1 7 2',write('1 2 7\n'); Line='1 7 3',write('1 3 7\n'); Line='1 7 4',write('1 4 7\n'); Line='1 7 5',write('1 5 7\n'); Line='1 7 6',write('1 6 7\n'); Line='1 7 7',write('1 7 7\n'); Line='1 7 8',write('1 7 8\n'); Line='1 7 9',write('1 7 9\n'); Line='1 7 10',write('1 7 10\n'); Line='1 8 1',write('1 1 8\n'); Line='1 8 2',write('1 2 8\n'); Line='1 8 3',write('1 3 8\n'); Line='1 8 4',write('1 4 8\n'); Line='1 8 5',write('1 5 8\n'); Line='1 8 6',write('1 6 8\n'); Line='1 8 7',write('1 7 8\n'); Line='1 8 8',write('1 8 8\n'); Line='1 8 9',write('1 8 9\n'); Line='1 8 10',write('1 8 10\n'); Line='1 9 1',write('1 1 9\n'); Line='1 9 2',write('1 2 9\n'); Line='1 9 3',write('1 3 9\n'); Line='1 9 4',write('1 4 9\n'); Line='1 9 5',write('1 5 9\n'); Line='1 9 6',write('1 6 9\n'); Line='1 9 7',write('1 7 9\n'); Line='1 9 8',write('1 8 9\n'); Line='1 9 9',write('1 9 9\n'); Line='1 9 10',write('1 9 10\n'); Line='1 10 1',write('1 1 10\n'); Line='1 10 2',write('1 2 10\n'); Line='1 10 3',write('1 3 10\n'); Line='1 10 4',write('1 4 10\n'); Line='1 10 5',write('1 5 10\n'); Line='1 10 6',write('1 6 10\n'); Line='1 10 7',write('1 7 10\n'); Line='1 10 8',write('1 8 10\n'); Line='1 10 9',write('1 9 10\n'); Line='1 10 10',write('1 10 10\n'); Line='2 1 1',write('1 1 2\n'); Line='2 1 2',write('1 2 2\n'); Line='2 1 3',write('1 2 3\n'); Line='2 1 4',write('1 2 4\n'); Line='2 1 5',write('1 2 5\n'); Line='2 1 6',write('1 2 6\n'); Line='2 1 7',write('1 2 7\n'); Line='2 1 8',write('1 2 8\n'); Line='2 1 9',write('1 2 9\n'); Line='2 1 10',write('1 2 10\n'); Line='2 2 1',write('1 2 2\n'); Line='2 2 2',write('2 2 2\n'); Line='2 2 3',write('2 2 3\n'); Line='2 2 4',write('2 2 4\n'); Line='2 2 5',write('2 2 5\n'); Line='2 2 6',write('2 2 6\n'); Line='2 2 7',write('2 2 7\n'); Line='2 2 8',write('2 2 8\n'); Line='2 2 9',write('2 2 9\n'); Line='2 2 10',write('2 2 10\n'); Line='2 3 1',write('1 2 3\n'); Line='2 3 2',write('2 2 3\n'); Line='2 3 3',write('2 3 3\n'); Line='2 3 4',write('2 3 4\n'); Line='2 3 5',write('2 3 5\n'); Line='2 3 6',write('2 3 6\n'); Line='2 3 7',write('2 3 7\n'); Line='2 3 8',write('2 3 8\n'); Line='2 3 9',write('2 3 9\n'); Line='2 3 10',write('2 3 10\n'); Line='2 4 1',write('1 2 4\n'); Line='2 4 2',write('2 2 4\n'); Line='2 4 3',write('2 3 4\n'); Line='2 4 4',write('2 4 4\n'); Line='2 4 5',write('2 4 5\n'); Line='2 4 6',write('2 4 6\n'); Line='2 4 7',write('2 4 7\n'); Line='2 4 8',write('2 4 8\n'); Line='2 4 9',write('2 4 9\n'); Line='2 4 10',write('2 4 10\n'); Line='2 5 1',write('1 2 5\n'); Line='2 5 2',write('2 2 5\n'); Line='2 5 3',write('2 3 5\n'); Line='2 5 4',write('2 4 5\n'); Line='2 5 5',write('2 5 5\n'); Line='2 5 6',write('2 5 6\n'); Line='2 5 7',write('2 5 7\n'); Line='2 5 8',write('2 5 8\n'); Line='2 5 9',write('2 5 9\n'); Line='2 5 10',write('2 5 10\n'); Line='2 6 1',write('1 2 6\n'); Line='2 6 2',write('2 2 6\n'); Line='2 6 3',write('2 3 6\n'); Line='2 6 4',write('2 4 6\n'); Line='2 6 5',write('2 5 6\n'); Line='2 6 6',write('2 6 6\n'); Line='2 6 7',write('2 6 7\n'); Line='2 6 8',write('2 6 8\n'); Line='2 6 9',write('2 6 9\n'); Line='2 6 10',write('2 6 10\n'); Line='2 7 1',write('1 2 7\n'); Line='2 7 2',write('2 2 7\n'); Line='2 7 3',write('2 3 7\n'); Line='2 7 4',write('2 4 7\n'); Line='2 7 5',write('2 5 7\n'); Line='2 7 6',write('2 6 7\n'); Line='2 7 7',write('2 7 7\n'); Line='2 7 8',write('2 7 8\n'); Line='2 7 9',write('2 7 9\n'); Line='2 7 10',write('2 7 10\n'); Line='2 8 1',write('1 2 8\n'); Line='2 8 2',write('2 2 8\n'); Line='2 8 3',write('2 3 8\n'); Line='2 8 4',write('2 4 8\n'); Line='2 8 5',write('2 5 8\n'); Line='2 8 6',write('2 6 8\n'); Line='2 8 7',write('2 7 8\n'); Line='2 8 8',write('2 8 8\n'); Line='2 8 9',write('2 8 9\n'); Line='2 8 10',write('2 8 10\n'); Line='2 9 1',write('1 2 9\n'); Line='2 9 2',write('2 2 9\n'); Line='2 9 3',write('2 3 9\n'); Line='2 9 4',write('2 4 9\n'); Line='2 9 5',write('2 5 9\n'); Line='2 9 6',write('2 6 9\n'); Line='2 9 7',write('2 7 9\n'); Line='2 9 8',write('2 8 9\n'); Line='2 9 9',write('2 9 9\n'); Line='2 9 10',write('2 9 10\n'); Line='2 10 1',write('1 2 10\n'); Line='2 10 2',write('2 2 10\n'); Line='2 10 3',write('2 3 10\n'); Line='2 10 4',write('2 4 10\n'); Line='2 10 5',write('2 5 10\n'); Line='2 10 6',write('2 6 10\n'); Line='2 10 7',write('2 7 10\n'); Line='2 10 8',write('2 8 10\n'); Line='2 10 9',write('2 9 10\n'); Line='2 10 10',write('2 10 10\n'); Line='3 1 1',write('1 1 3\n'); Line='3 1 2',write('1 2 3\n'); Line='3 1 3',write('1 3 3\n'); Line='3 1 4',write('1 3 4\n'); Line='3 1 5',write('1 3 5\n'); Line='3 1 6',write('1 3 6\n'); Line='3 1 7',write('1 3 7\n'); Line='3 1 8',write('1 3 8\n'); Line='3 1 9',write('1 3 9\n'); Line='3 1 10',write('1 3 10\n'); Line='3 2 1',write('1 2 3\n'); Line='3 2 2',write('2 2 3\n'); Line='3 2 3',write('2 3 3\n'); Line='3 2 4',write('2 3 4\n'); Line='3 2 5',write('2 3 5\n'); Line='3 2 6',write('2 3 6\n'); Line='3 2 7',write('2 3 7\n'); Line='3 2 8',write('2 3 8\n'); Line='3 2 9',write('2 3 9\n'); Line='3 2 10',write('2 3 10\n'); Line='3 3 1',write('1 3 3\n'); Line='3 3 2',write('2 3 3\n'); Line='3 3 3',write('3 3 3\n'); Line='3 3 4',write('3 3 4\n'); Line='3 3 5',write('3 3 5\n'); Line='3 3 6',write('3 3 6\n'); Line='3 3 7',write('3 3 7\n'); Line='3 3 8',write('3 3 8\n'); Line='3 3 9',write('3 3 9\n'); Line='3 3 10',write('3 3 10\n'); Line='3 4 1',write('1 3 4\n'); Line='3 4 2',write('2 3 4\n'); Line='3 4 3',write('3 3 4\n'); Line='3 4 4',write('3 4 4\n'); Line='3 4 5',write('3 4 5\n'); Line='3 4 6',write('3 4 6\n'); Line='3 4 7',write('3 4 7\n'); Line='3 4 8',write('3 4 8\n'); Line='3 4 9',write('3 4 9\n'); Line='3 4 10',write('3 4 10\n'); Line='3 5 1',write('1 3 5\n'); Line='3 5 2',write('2 3 5\n'); Line='3 5 3',write('3 3 5\n'); Line='3 5 4',write('3 4 5\n'); Line='3 5 5',write('3 5 5\n'); Line='3 5 6',write('3 5 6\n'); Line='3 5 7',write('3 5 7\n'); Line='3 5 8',write('3 5 8\n'); Line='3 5 9',write('3 5 9\n'); Line='3 5 10',write('3 5 10\n'); Line='3 6 1',write('1 3 6\n'); Line='3 6 2',write('2 3 6\n'); Line='3 6 3',write('3 3 6\n'); Line='3 6 4',write('3 4 6\n'); Line='3 6 5',write('3 5 6\n'); Line='3 6 6',write('3 6 6\n'); Line='3 6 7',write('3 6 7\n'); Line='3 6 8',write('3 6 8\n'); Line='3 6 9',write('3 6 9\n'); Line='3 6 10',write('3 6 10\n'); Line='3 7 1',write('1 3 7\n'); Line='3 7 2',write('2 3 7\n'); Line='3 7 3',write('3 3 7\n'); Line='3 7 4',write('3 4 7\n'); Line='3 7 5',write('3 5 7\n'); Line='3 7 6',write('3 6 7\n'); Line='3 7 7',write('3 7 7\n'); Line='3 7 8',write('3 7 8\n'); Line='3 7 9',write('3 7 9\n'); Line='3 7 10',write('3 7 10\n'); Line='3 8 1',write('1 3 8\n'); Line='3 8 2',write('2 3 8\n'); Line='3 8 3',write('3 3 8\n'); Line='3 8 4',write('3 4 8\n'); Line='3 8 5',write('3 5 8\n'); Line='3 8 6',write('3 6 8\n'); Line='3 8 7',write('3 7 8\n'); Line='3 8 8',write('3 8 8\n'); Line='3 8 9',write('3 8 9\n'); Line='3 8 10',write('3 8 10\n'); Line='3 9 1',write('1 3 9\n'); Line='3 9 2',write('2 3 9\n'); Line='3 9 3',write('3 3 9\n'); Line='3 9 4',write('3 4 9\n'); Line='3 9 5',write('3 5 9\n'); Line='3 9 6',write('3 6 9\n'); Line='3 9 7',write('3 7 9\n'); Line='3 9 8',write('3 8 9\n'); Line='3 9 9',write('3 9 9\n'); Line='3 9 10',write('3 9 10\n'); Line='3 10 1',write('1 3 10\n'); Line='3 10 2',write('2 3 10\n'); Line='3 10 3',write('3 3 10\n'); Line='3 10 4',write('3 4 10\n'); Line='3 10 5',write('3 5 10\n'); Line='3 10 6',write('3 6 10\n'); Line='3 10 7',write('3 7 10\n'); Line='3 10 8',write('3 8 10\n'); Line='3 10 9',write('3 9 10\n'); Line='3 10 10',write('3 10 10\n'); Line='4 1 1',write('1 1 4\n'); Line='4 1 2',write('1 2 4\n'); Line='4 1 3',write('1 3 4\n'); Line='4 1 4',write('1 4 4\n'); Line='4 1 5',write('1 4 5\n'); Line='4 1 6',write('1 4 6\n'); Line='4 1 7',write('1 4 7\n'); Line='4 1 8',write('1 4 8\n'); Line='4 1 9',write('1 4 9\n'); Line='4 1 10',write('1 4 10\n'); Line='4 2 1',write('1 2 4\n'); Line='4 2 2',write('2 2 4\n'); Line='4 2 3',write('2 3 4\n'); Line='4 2 4',write('2 4 4\n'); Line='4 2 5',write('2 4 5\n'); Line='4 2 6',write('2 4 6\n'); Line='4 2 7',write('2 4 7\n'); Line='4 2 8',write('2 4 8\n'); Line='4 2 9',write('2 4 9\n'); Line='4 2 10',write('2 4 10\n'); Line='4 3 1',write('1 3 4\n'); Line='4 3 2',write('2 3 4\n'); Line='4 3 3',write('3 3 4\n'); Line='4 3 4',write('3 4 4\n'); Line='4 3 5',write('3 4 5\n'); Line='4 3 6',write('3 4 6\n'); Line='4 3 7',write('3 4 7\n'); Line='4 3 8',write('3 4 8\n'); Line='4 3 9',write('3 4 9\n'); Line='4 3 10',write('3 4 10\n'); Line='4 4 1',write('1 4 4\n'); Line='4 4 2',write('2 4 4\n'); Line='4 4 3',write('3 4 4\n'); Line='4 4 4',write('4 4 4\n'); Line='4 4 5',write('4 4 5\n'); Line='4 4 6',write('4 4 6\n'); Line='4 4 7',write('4 4 7\n'); Line='4 4 8',write('4 4 8\n'); Line='4 4 9',write('4 4 9\n'); Line='4 4 10',write('4 4 10\n'); Line='4 5 1',write('1 4 5\n'); Line='4 5 2',write('2 4 5\n'); Line='4 5 3',write('3 4 5\n'); Line='4 5 4',write('4 4 5\n'); Line='4 5 5',write('4 5 5\n'); Line='4 5 6',write('4 5 6\n'); Line='4 5 7',write('4 5 7\n'); Line='4 5 8',write('4 5 8\n'); Line='4 5 9',write('4 5 9\n'); Line='4 5 10',write('4 5 10\n'); Line='4 6 1',write('1 4 6\n'); Line='4 6 2',write('2 4 6\n'); Line='4 6 3',write('3 4 6\n'); Line='4 6 4',write('4 4 6\n'); Line='4 6 5',write('4 5 6\n'); Line='4 6 6',write('4 6 6\n'); Line='4 6 7',write('4 6 7\n'); Line='4 6 8',write('4 6 8\n'); Line='4 6 9',write('4 6 9\n'); Line='4 6 10',write('4 6 10\n'); Line='4 7 1',write('1 4 7\n'); Line='4 7 2',write('2 4 7\n'); Line='4 7 3',write('3 4 7\n'); Line='4 7 4',write('4 4 7\n'); Line='4 7 5',write('4 5 7\n'); Line='4 7 6',write('4 6 7\n'); Line='4 7 7',write('4 7 7\n'); Line='4 7 8',write('4 7 8\n'); Line='4 7 9',write('4 7 9\n'); Line='4 7 10',write('4 7 10\n'); Line='4 8 1',write('1 4 8\n'); Line='4 8 2',write('2 4 8\n'); Line='4 8 3',write('3 4 8\n'); Line='4 8 4',write('4 4 8\n'); Line='4 8 5',write('4 5 8\n'); Line='4 8 6',write('4 6 8\n'); Line='4 8 7',write('4 7 8\n'); Line='4 8 8',write('4 8 8\n'); Line='4 8 9',write('4 8 9\n'); Line='4 8 10',write('4 8 10\n'); Line='4 9 1',write('1 4 9\n'); Line='4 9 2',write('2 4 9\n'); Line='4 9 3',write('3 4 9\n'); Line='4 9 4',write('4 4 9\n'); Line='4 9 5',write('4 5 9\n'); Line='4 9 6',write('4 6 9\n'); Line='4 9 7',write('4 7 9\n'); Line='4 9 8',write('4 8 9\n'); Line='4 9 9',write('4 9 9\n'); Line='4 9 10',write('4 9 10\n'); Line='4 10 1',write('1 4 10\n'); Line='4 10 2',write('2 4 10\n'); Line='4 10 3',write('3 4 10\n'); Line='4 10 4',write('4 4 10\n'); Line='4 10 5',write('4 5 10\n'); Line='4 10 6',write('4 6 10\n'); Line='4 10 7',write('4 7 10\n'); Line='4 10 8',write('4 8 10\n'); Line='4 10 9',write('4 9 10\n'); Line='4 10 10',write('4 10 10\n'); Line='5 1 1',write('1 1 5\n'); Line='5 1 2',write('1 2 5\n'); Line='5 1 3',write('1 3 5\n'); Line='5 1 4',write('1 4 5\n'); Line='5 1 5',write('1 5 5\n'); Line='5 1 6',write('1 5 6\n'); Line='5 1 7',write('1 5 7\n'); Line='5 1 8',write('1 5 8\n'); Line='5 1 9',write('1 5 9\n'); Line='5 1 10',write('1 5 10\n'); Line='5 2 1',write('1 2 5\n'); Line='5 2 2',write('2 2 5\n'); Line='5 2 3',write('2 3 5\n'); Line='5 2 4',write('2 4 5\n'); Line='5 2 5',write('2 5 5\n'); Line='5 2 6',write('2 5 6\n'); Line='5 2 7',write('2 5 7\n'); Line='5 2 8',write('2 5 8\n'); Line='5 2 9',write('2 5 9\n'); Line='5 2 10',write('2 5 10\n'); Line='5 3 1',write('1 3 5\n'); Line='5 3 2',write('2 3 5\n'); Line='5 3 3',write('3 3 5\n'); Line='5 3 4',write('3 4 5\n'); Line='5 3 5',write('3 5 5\n'); Line='5 3 6',write('3 5 6\n'); Line='5 3 7',write('3 5 7\n'); Line='5 3 8',write('3 5 8\n'); Line='5 3 9',write('3 5 9\n'); Line='5 3 10',write('3 5 10\n'); Line='5 4 1',write('1 4 5\n'); Line='5 4 2',write('2 4 5\n'); Line='5 4 3',write('3 4 5\n'); Line='5 4 4',write('4 4 5\n'); Line='5 4 5',write('4 5 5\n'); Line='5 4 6',write('4 5 6\n'); Line='5 4 7',write('4 5 7\n'); Line='5 4 8',write('4 5 8\n'); Line='5 4 9',write('4 5 9\n'); Line='5 4 10',write('4 5 10\n'); Line='5 5 1',write('1 5 5\n'); Line='5 5 2',write('2 5 5\n'); Line='5 5 3',write('3 5 5\n'); Line='5 5 4',write('4 5 5\n'); Line='5 5 5',write('5 5 5\n'); Line='5 5 6',write('5 5 6\n'); Line='5 5 7',write('5 5 7\n'); Line='5 5 8',write('5 5 8\n'); Line='5 5 9',write('5 5 9\n'); Line='5 5 10',write('5 5 10\n'); Line='5 6 1',write('1 5 6\n'); Line='5 6 2',write('2 5 6\n'); Line='5 6 3',write('3 5 6\n'); Line='5 6 4',write('4 5 6\n'); Line='5 6 5',write('5 5 6\n'); Line='5 6 6',write('5 6 6\n'); Line='5 6 7',write('5 6 7\n'); Line='5 6 8',write('5 6 8\n'); Line='5 6 9',write('5 6 9\n'); Line='5 6 10',write('5 6 10\n'); Line='5 7 1',write('1 5 7\n'); Line='5 7 2',write('2 5 7\n'); Line='5 7 3',write('3 5 7\n'); Line='5 7 4',write('4 5 7\n'); Line='5 7 5',write('5 5 7\n'); Line='5 7 6',write('5 6 7\n'); Line='5 7 7',write('5 7 7\n'); Line='5 7 8',write('5 7 8\n'); Line='5 7 9',write('5 7 9\n'); Line='5 7 10',write('5 7 10\n'); Line='5 8 1',write('1 5 8\n'); Line='5 8 2',write('2 5 8\n'); Line='5 8 3',write('3 5 8\n'); Line='5 8 4',write('4 5 8\n'); Line='5 8 5',write('5 5 8\n'); Line='5 8 6',write('5 6 8\n'); Line='5 8 7',write('5 7 8\n'); Line='5 8 8',write('5 8 8\n'); Line='5 8 9',write('5 8 9\n'); Line='5 8 10',write('5 8 10\n'); Line='5 9 1',write('1 5 9\n'); Line='5 9 2',write('2 5 9\n'); Line='5 9 3',write('3 5 9\n'); Line='5 9 4',write('4 5 9\n'); Line='5 9 5',write('5 5 9\n'); Line='5 9 6',write('5 6 9\n'); Line='5 9 7',write('5 7 9\n'); Line='5 9 8',write('5 8 9\n'); Line='5 9 9',write('5 9 9\n'); Line='5 9 10',write('5 9 10\n'); Line='5 10 1',write('1 5 10\n'); Line='5 10 2',write('2 5 10\n'); Line='5 10 3',write('3 5 10\n'); Line='5 10 4',write('4 5 10\n'); Line='5 10 5',write('5 5 10\n'); Line='5 10 6',write('5 6 10\n'); Line='5 10 7',write('5 7 10\n'); Line='5 10 8',write('5 8 10\n'); Line='5 10 9',write('5 9 10\n'); Line='5 10 10',write('5 10 10\n'); Line='6 1 1',write('1 1 6\n'); Line='6 1 2',write('1 2 6\n'); Line='6 1 3',write('1 3 6\n'); Line='6 1 4',write('1 4 6\n'); Line='6 1 5',write('1 5 6\n'); Line='6 1 6',write('1 6 6\n'); Line='6 1 7',write('1 6 7\n'); Line='6 1 8',write('1 6 8\n'); Line='6 1 9',write('1 6 9\n'); Line='6 1 10',write('1 6 10\n'); Line='6 2 1',write('1 2 6\n'); Line='6 2 2',write('2 2 6\n'); Line='6 2 3',write('2 3 6\n'); Line='6 2 4',write('2 4 6\n'); Line='6 2 5',write('2 5 6\n'); Line='6 2 6',write('2 6 6\n'); Line='6 2 7',write('2 6 7\n'); Line='6 2 8',write('2 6 8\n'); Line='6 2 9',write('2 6 9\n'); Line='6 2 10',write('2 6 10\n'); Line='6 3 1',write('1 3 6\n'); Line='6 3 2',write('2 3 6\n'); Line='6 3 3',write('3 3 6\n'); Line='6 3 4',write('3 4 6\n'); Line='6 3 5',write('3 5 6\n'); Line='6 3 6',write('3 6 6\n'); Line='6 3 7',write('3 6 7\n'); Line='6 3 8',write('3 6 8\n'); Line='6 3 9',write('3 6 9\n'); Line='6 3 10',write('3 6 10\n'); Line='6 4 1',write('1 4 6\n'); Line='6 4 2',write('2 4 6\n'); Line='6 4 3',write('3 4 6\n'); Line='6 4 4',write('4 4 6\n'); Line='6 4 5',write('4 5 6\n'); Line='6 4 6',write('4 6 6\n'); Line='6 4 7',write('4 6 7\n'); Line='6 4 8',write('4 6 8\n'); Line='6 4 9',write('4 6 9\n'); Line='6 4 10',write('4 6 10\n'); Line='6 5 1',write('1 5 6\n'); Line='6 5 2',write('2 5 6\n'); Line='6 5 3',write('3 5 6\n'); Line='6 5 4',write('4 5 6\n'); Line='6 5 5',write('5 5 6\n'); Line='6 5 6',write('5 6 6\n'); Line='6 5 7',write('5 6 7\n'); Line='6 5 8',write('5 6 8\n'); Line='6 5 9',write('5 6 9\n'); Line='6 5 10',write('5 6 10\n'); Line='6 6 1',write('1 6 6\n'); Line='6 6 2',write('2 6 6\n'); Line='6 6 3',write('3 6 6\n'); Line='6 6 4',write('4 6 6\n'); Line='6 6 5',write('5 6 6\n'); Line='6 6 6',write('6 6 6\n'); Line='6 6 7',write('6 6 7\n'); Line='6 6 8',write('6 6 8\n'); Line='6 6 9',write('6 6 9\n'); Line='6 6 10',write('6 6 10\n'); Line='6 7 1',write('1 6 7\n'); Line='6 7 2',write('2 6 7\n'); Line='6 7 3',write('3 6 7\n'); Line='6 7 4',write('4 6 7\n'); Line='6 7 5',write('5 6 7\n'); Line='6 7 6',write('6 6 7\n'); Line='6 7 7',write('6 7 7\n'); Line='6 7 8',write('6 7 8\n'); Line='6 7 9',write('6 7 9\n'); Line='6 7 10',write('6 7 10\n'); Line='6 8 1',write('1 6 8\n'); Line='6 8 2',write('2 6 8\n'); Line='6 8 3',write('3 6 8\n'); Line='6 8 4',write('4 6 8\n'); Line='6 8 5',write('5 6 8\n'); Line='6 8 6',write('6 6 8\n'); Line='6 8 7',write('6 7 8\n'); Line='6 8 8',write('6 8 8\n'); Line='6 8 9',write('6 8 9\n'); Line='6 8 10',write('6 8 10\n'); Line='6 9 1',write('1 6 9\n'); Line='6 9 2',write('2 6 9\n'); Line='6 9 3',write('3 6 9\n'); Line='6 9 4',write('4 6 9\n'); Line='6 9 5',write('5 6 9\n'); Line='6 9 6',write('6 6 9\n'); Line='6 9 7',write('6 7 9\n'); Line='6 9 8',write('6 8 9\n'); Line='6 9 9',write('6 9 9\n'); Line='6 9 10',write('6 9 10\n'); Line='6 10 1',write('1 6 10\n'); Line='6 10 2',write('2 6 10\n'); Line='6 10 3',write('3 6 10\n'); Line='6 10 4',write('4 6 10\n'); Line='6 10 5',write('5 6 10\n'); Line='6 10 6',write('6 6 10\n'); Line='6 10 7',write('6 7 10\n'); Line='6 10 8',write('6 8 10\n'); Line='6 10 9',write('6 9 10\n'); Line='6 10 10',write('6 10 10\n'); Line='7 1 1',write('1 1 7\n'); Line='7 1 2',write('1 2 7\n'); Line='7 1 3',write('1 3 7\n'); Line='7 1 4',write('1 4 7\n'); Line='7 1 5',write('1 5 7\n'); Line='7 1 6',write('1 6 7\n'); Line='7 1 7',write('1 7 7\n'); Line='7 1 8',write('1 7 8\n'); Line='7 1 9',write('1 7 9\n'); Line='7 1 10',write('1 7 10\n'); Line='7 2 1',write('1 2 7\n'); Line='7 2 2',write('2 2 7\n'); Line='7 2 3',write('2 3 7\n'); Line='7 2 4',write('2 4 7\n'); Line='7 2 5',write('2 5 7\n'); Line='7 2 6',write('2 6 7\n'); Line='7 2 7',write('2 7 7\n'); Line='7 2 8',write('2 7 8\n'); Line='7 2 9',write('2 7 9\n'); Line='7 2 10',write('2 7 10\n'); Line='7 3 1',write('1 3 7\n'); Line='7 3 2',write('2 3 7\n'); Line='7 3 3',write('3 3 7\n'); Line='7 3 4',write('3 4 7\n'); Line='7 3 5',write('3 5 7\n'); Line='7 3 6',write('3 6 7\n'); Line='7 3 7',write('3 7 7\n'); Line='7 3 8',write('3 7 8\n'); Line='7 3 9',write('3 7 9\n'); Line='7 3 10',write('3 7 10\n'); Line='7 4 1',write('1 4 7\n'); Line='7 4 2',write('2 4 7\n'); Line='7 4 3',write('3 4 7\n'); Line='7 4 4',write('4 4 7\n'); Line='7 4 5',write('4 5 7\n'); Line='7 4 6',write('4 6 7\n'); Line='7 4 7',write('4 7 7\n'); Line='7 4 8',write('4 7 8\n'); Line='7 4 9',write('4 7 9\n'); Line='7 4 10',write('4 7 10\n'); Line='7 5 1',write('1 5 7\n'); Line='7 5 2',write('2 5 7\n'); Line='7 5 3',write('3 5 7\n'); Line='7 5 4',write('4 5 7\n'); Line='7 5 5',write('5 5 7\n'); Line='7 5 6',write('5 6 7\n'); Line='7 5 7',write('5 7 7\n'); Line='7 5 8',write('5 7 8\n'); Line='7 5 9',write('5 7 9\n'); Line='7 5 10',write('5 7 10\n'); Line='7 6 1',write('1 6 7\n'); Line='7 6 2',write('2 6 7\n'); Line='7 6 3',write('3 6 7\n'); Line='7 6 4',write('4 6 7\n'); Line='7 6 5',write('5 6 7\n'); Line='7 6 6',write('6 6 7\n'); Line='7 6 7',write('6 7 7\n'); Line='7 6 8',write('6 7 8\n'); Line='7 6 9',write('6 7 9\n'); Line='7 6 10',write('6 7 10\n'); Line='7 7 1',write('1 7 7\n'); Line='7 7 2',write('2 7 7\n'); Line='7 7 3',write('3 7 7\n'); Line='7 7 4',write('4 7 7\n'); Line='7 7 5',write('5 7 7\n'); Line='7 7 6',write('6 7 7\n'); Line='7 7 7',write('7 7 7\n'); Line='7 7 8',write('7 7 8\n'); Line='7 7 9',write('7 7 9\n'); Line='7 7 10',write('7 7 10\n'); Line='7 8 1',write('1 7 8\n'); Line='7 8 2',write('2 7 8\n'); Line='7 8 3',write('3 7 8\n'); Line='7 8 4',write('4 7 8\n'); Line='7 8 5',write('5 7 8\n'); Line='7 8 6',write('6 7 8\n'); Line='7 8 7',write('7 7 8\n'); Line='7 8 8',write('7 8 8\n'); Line='7 8 9',write('7 8 9\n'); Line='7 8 10',write('7 8 10\n'); Line='7 9 1',write('1 7 9\n'); Line='7 9 2',write('2 7 9\n'); Line='7 9 3',write('3 7 9\n'); Line='7 9 4',write('4 7 9\n'); Line='7 9 5',write('5 7 9\n'); Line='7 9 6',write('6 7 9\n'); Line='7 9 7',write('7 7 9\n'); Line='7 9 8',write('7 8 9\n'); Line='7 9 9',write('7 9 9\n'); Line='7 9 10',write('7 9 10\n'); Line='7 10 1',write('1 7 10\n'); Line='7 10 2',write('2 7 10\n'); Line='7 10 3',write('3 7 10\n'); Line='7 10 4',write('4 7 10\n'); Line='7 10 5',write('5 7 10\n'); Line='7 10 6',write('6 7 10\n'); Line='7 10 7',write('7 7 10\n'); Line='7 10 8',write('7 8 10\n'); Line='7 10 9',write('7 9 10\n'); Line='7 10 10',write('7 10 10\n'); Line='8 1 1',write('1 1 8\n'); Line='8 1 2',write('1 2 8\n'); Line='8 1 3',write('1 3 8\n'); Line='8 1 4',write('1 4 8\n'); Line='8 1 5',write('1 5 8\n'); Line='8 1 6',write('1 6 8\n'); Line='8 1 7',write('1 7 8\n'); Line='8 1 8',write('1 8 8\n'); Line='8 1 9',write('1 8 9\n'); Line='8 1 10',write('1 8 10\n'); Line='8 2 1',write('1 2 8\n'); Line='8 2 2',write('2 2 8\n'); Line='8 2 3',write('2 3 8\n'); Line='8 2 4',write('2 4 8\n'); Line='8 2 5',write('2 5 8\n'); Line='8 2 6',write('2 6 8\n'); Line='8 2 7',write('2 7 8\n'); Line='8 2 8',write('2 8 8\n'); Line='8 2 9',write('2 8 9\n'); Line='8 2 10',write('2 8 10\n'); Line='8 3 1',write('1 3 8\n'); Line='8 3 2',write('2 3 8\n'); Line='8 3 3',write('3 3 8\n'); Line='8 3 4',write('3 4 8\n'); Line='8 3 5',write('3 5 8\n'); Line='8 3 6',write('3 6 8\n'); Line='8 3 7',write('3 7 8\n'); Line='8 3 8',write('3 8 8\n'); Line='8 3 9',write('3 8 9\n'); Line='8 3 10',write('3 8 10\n'); Line='8 4 1',write('1 4 8\n'); Line='8 4 2',write('2 4 8\n'); Line='8 4 3',write('3 4 8\n'); Line='8 4 4',write('4 4 8\n'); Line='8 4 5',write('4 5 8\n'); Line='8 4 6',write('4 6 8\n'); Line='8 4 7',write('4 7 8\n'); Line='8 4 8',write('4 8 8\n'); Line='8 4 9',write('4 8 9\n'); Line='8 4 10',write('4 8 10\n'); Line='8 5 1',write('1 5 8\n'); Line='8 5 2',write('2 5 8\n'); Line='8 5 3',write('3 5 8\n'); Line='8 5 4',write('4 5 8\n'); Line='8 5 5',write('5 5 8\n'); Line='8 5 6',write('5 6 8\n'); Line='8 5 7',write('5 7 8\n'); Line='8 5 8',write('5 8 8\n'); Line='8 5 9',write('5 8 9\n'); Line='8 5 10',write('5 8 10\n'); Line='8 6 1',write('1 6 8\n'); Line='8 6 2',write('2 6 8\n'); Line='8 6 3',write('3 6 8\n'); Line='8 6 4',write('4 6 8\n'); Line='8 6 5',write('5 6 8\n'); Line='8 6 6',write('6 6 8\n'); Line='8 6 7',write('6 7 8\n'); Line='8 6 8',write('6 8 8\n'); Line='8 6 9',write('6 8 9\n'); Line='8 6 10',write('6 8 10\n'); Line='8 7 1',write('1 7 8\n'); Line='8 7 2',write('2 7 8\n'); Line='8 7 3',write('3 7 8\n'); Line='8 7 4',write('4 7 8\n'); Line='8 7 5',write('5 7 8\n'); Line='8 7 6',write('6 7 8\n'); Line='8 7 7',write('7 7 8\n'); Line='8 7 8',write('7 8 8\n'); Line='8 7 9',write('7 8 9\n'); Line='8 7 10',write('7 8 10\n'); Line='8 8 1',write('1 8 8\n'); Line='8 8 2',write('2 8 8\n'); Line='8 8 3',write('3 8 8\n'); Line='8 8 4',write('4 8 8\n'); Line='8 8 5',write('5 8 8\n'); Line='8 8 6',write('6 8 8\n'); Line='8 8 7',write('7 8 8\n'); Line='8 8 8',write('8 8 8\n'); Line='8 8 9',write('8 8 9\n'); Line='8 8 10',write('8 8 10\n'); Line='8 9 1',write('1 8 9\n'); Line='8 9 2',write('2 8 9\n'); Line='8 9 3',write('3 8 9\n'); Line='8 9 4',write('4 8 9\n'); Line='8 9 5',write('5 8 9\n'); Line='8 9 6',write('6 8 9\n'); Line='8 9 7',write('7 8 9\n'); Line='8 9 8',write('8 8 9\n'); Line='8 9 9',write('8 9 9\n'); Line='8 9 10',write('8 9 10\n'); Line='8 10 1',write('1 8 10\n'); Line='8 10 2',write('2 8 10\n'); Line='8 10 3',write('3 8 10\n'); Line='8 10 4',write('4 8 10\n'); Line='8 10 5',write('5 8 10\n'); Line='8 10 6',write('6 8 10\n'); Line='8 10 7',write('7 8 10\n'); Line='8 10 8',write('8 8 10\n'); Line='8 10 9',write('8 9 10\n'); Line='8 10 10',write('8 10 10\n'); Line='9 1 1',write('1 1 9\n'); Line='9 1 2',write('1 2 9\n'); Line='9 1 3',write('1 3 9\n'); Line='9 1 4',write('1 4 9\n'); Line='9 1 5',write('1 5 9\n'); Line='9 1 6',write('1 6 9\n'); Line='9 1 7',write('1 7 9\n'); Line='9 1 8',write('1 8 9\n'); Line='9 1 9',write('1 9 9\n'); Line='9 1 10',write('1 9 10\n'); Line='9 2 1',write('1 2 9\n'); Line='9 2 2',write('2 2 9\n'); Line='9 2 3',write('2 3 9\n'); Line='9 2 4',write('2 4 9\n'); Line='9 2 5',write('2 5 9\n'); Line='9 2 6',write('2 6 9\n'); Line='9 2 7',write('2 7 9\n'); Line='9 2 8',write('2 8 9\n'); Line='9 2 9',write('2 9 9\n'); Line='9 2 10',write('2 9 10\n'); Line='9 3 1',write('1 3 9\n'); Line='9 3 2',write('2 3 9\n'); Line='9 3 3',write('3 3 9\n'); Line='9 3 4',write('3 4 9\n'); Line='9 3 5',write('3 5 9\n'); Line='9 3 6',write('3 6 9\n'); Line='9 3 7',write('3 7 9\n'); Line='9 3 8',write('3 8 9\n'); Line='9 3 9',write('3 9 9\n'); Line='9 3 10',write('3 9 10\n'); Line='9 4 1',write('1 4 9\n'); Line='9 4 2',write('2 4 9\n'); Line='9 4 3',write('3 4 9\n'); Line='9 4 4',write('4 4 9\n'); Line='9 4 5',write('4 5 9\n'); Line='9 4 6',write('4 6 9\n'); Line='9 4 7',write('4 7 9\n'); Line='9 4 8',write('4 8 9\n'); Line='9 4 9',write('4 9 9\n'); Line='9 4 10',write('4 9 10\n'); Line='9 5 1',write('1 5 9\n'); Line='9 5 2',write('2 5 9\n'); Line='9 5 3',write('3 5 9\n'); Line='9 5 4',write('4 5 9\n'); Line='9 5 5',write('5 5 9\n'); Line='9 5 6',write('5 6 9\n'); Line='9 5 7',write('5 7 9\n'); Line='9 5 8',write('5 8 9\n'); Line='9 5 9',write('5 9 9\n'); Line='9 5 10',write('5 9 10\n'); Line='9 6 1',write('1 6 9\n'); Line='9 6 2',write('2 6 9\n'); Line='9 6 3',write('3 6 9\n'); Line='9 6 4',write('4 6 9\n'); Line='9 6 5',write('5 6 9\n'); Line='9 6 6',write('6 6 9\n'); Line='9 6 7',write('6 7 9\n'); Line='9 6 8',write('6 8 9\n'); Line='9 6 9',write('6 9 9\n'); Line='9 6 10',write('6 9 10\n'); Line='9 7 1',write('1 7 9\n'); Line='9 7 2',write('2 7 9\n'); Line='9 7 3',write('3 7 9\n'); Line='9 7 4',write('4 7 9\n'); Line='9 7 5',write('5 7 9\n'); Line='9 7 6',write('6 7 9\n'); Line='9 7 7',write('7 7 9\n'); Line='9 7 8',write('7 8 9\n'); Line='9 7 9',write('7 9 9\n'); Line='9 7 10',write('7 9 10\n'); Line='9 8 1',write('1 8 9\n'); Line='9 8 2',write('2 8 9\n'); Line='9 8 3',write('3 8 9\n'); Line='9 8 4',write('4 8 9\n'); Line='9 8 5',write('5 8 9\n'); Line='9 8 6',write('6 8 9\n'); Line='9 8 7',write('7 8 9\n'); Line='9 8 8',write('8 8 9\n'); Line='9 8 9',write('8 9 9\n'); Line='9 8 10',write('8 9 10\n'); Line='9 9 1',write('1 9 9\n'); Line='9 9 2',write('2 9 9\n'); Line='9 9 3',write('3 9 9\n'); Line='9 9 4',write('4 9 9\n'); Line='9 9 5',write('5 9 9\n'); Line='9 9 6',write('6 9 9\n'); Line='9 9 7',write('7 9 9\n'); Line='9 9 8',write('8 9 9\n'); Line='9 9 9',write('9 9 9\n'); Line='9 9 10',write('9 9 10\n'); Line='9 10 1',write('1 9 10\n'); Line='9 10 2',write('2 9 10\n'); Line='9 10 3',write('3 9 10\n'); Line='9 10 4',write('4 9 10\n'); Line='9 10 5',write('5 9 10\n'); Line='9 10 6',write('6 9 10\n'); Line='9 10 7',write('7 9 10\n'); Line='9 10 8',write('8 9 10\n'); Line='9 10 9',write('9 9 10\n'); Line='9 10 10',write('9 10 10\n'); Line='10 1 1',write('1 1 10\n'); Line='10 1 2',write('1 2 10\n'); Line='10 1 3',write('1 3 10\n'); Line='10 1 4',write('1 4 10\n'); Line='10 1 5',write('1 5 10\n'); Line='10 1 6',write('1 6 10\n'); Line='10 1 7',write('1 7 10\n'); Line='10 1 8',write('1 8 10\n'); Line='10 1 9',write('1 9 10\n'); Line='10 1 10',write('1 10 10\n'); Line='10 2 1',write('1 2 10\n'); Line='10 2 2',write('2 2 10\n'); Line='10 2 3',write('2 3 10\n'); Line='10 2 4',write('2 4 10\n'); Line='10 2 5',write('2 5 10\n'); Line='10 2 6',write('2 6 10\n'); Line='10 2 7',write('2 7 10\n'); Line='10 2 8',write('2 8 10\n'); Line='10 2 9',write('2 9 10\n'); Line='10 2 10',write('2 10 10\n'); Line='10 3 1',write('1 3 10\n'); Line='10 3 2',write('2 3 10\n'); Line='10 3 3',write('3 3 10\n'); Line='10 3 4',write('3 4 10\n'); Line='10 3 5',write('3 5 10\n'); Line='10 3 6',write('3 6 10\n'); Line='10 3 7',write('3 7 10\n'); Line='10 3 8',write('3 8 10\n'); Line='10 3 9',write('3 9 10\n'); Line='10 3 10',write('3 10 10\n'); Line='10 4 1',write('1 4 10\n'); Line='10 4 2',write('2 4 10\n'); Line='10 4 3',write('3 4 10\n'); Line='10 4 4',write('4 4 10\n'); Line='10 4 5',write('4 5 10\n'); Line='10 4 6',write('4 6 10\n'); Line='10 4 7',write('4 7 10\n'); Line='10 4 8',write('4 8 10\n'); Line='10 4 9',write('4 9 10\n'); Line='10 4 10',write('4 10 10\n'); Line='10 5 1',write('1 5 10\n'); Line='10 5 2',write('2 5 10\n'); Line='10 5 3',write('3 5 10\n'); Line='10 5 4',write('4 5 10\n'); Line='10 5 5',write('5 5 10\n'); Line='10 5 6',write('5 6 10\n'); Line='10 5 7',write('5 7 10\n'); Line='10 5 8',write('5 8 10\n'); Line='10 5 9',write('5 9 10\n'); Line='10 5 10',write('5 10 10\n'); Line='10 6 1',write('1 6 10\n'); Line='10 6 2',write('2 6 10\n'); Line='10 6 3',write('3 6 10\n'); Line='10 6 4',write('4 6 10\n'); Line='10 6 5',write('5 6 10\n'); Line='10 6 6',write('6 6 10\n'); Line='10 6 7',write('6 7 10\n'); Line='10 6 8',write('6 8 10\n'); Line='10 6 9',write('6 9 10\n'); Line='10 6 10',write('6 10 10\n'); Line='10 7 1',write('1 7 10\n'); Line='10 7 2',write('2 7 10\n'); Line='10 7 3',write('3 7 10\n'); Line='10 7 4',write('4 7 10\n'); Line='10 7 5',write('5 7 10\n'); Line='10 7 6',write('6 7 10\n'); Line='10 7 7',write('7 7 10\n'); Line='10 7 8',write('7 8 10\n'); Line='10 7 9',write('7 9 10\n'); Line='10 7 10',write('7 10 10\n'); Line='10 8 1',write('1 8 10\n'); Line='10 8 2',write('2 8 10\n'); Line='10 8 3',write('3 8 10\n'); Line='10 8 4',write('4 8 10\n'); Line='10 8 5',write('5 8 10\n'); Line='10 8 6',write('6 8 10\n'); Line='10 8 7',write('7 8 10\n'); Line='10 8 8',write('8 8 10\n'); Line='10 8 9',write('8 9 10\n'); Line='10 8 10',write('8 10 10\n'); Line='10 9 1',write('1 9 10\n'); Line='10 9 2',write('2 9 10\n'); Line='10 9 3',write('3 9 10\n'); Line='10 9 4',write('4 9 10\n'); Line='10 9 5',write('5 9 10\n'); Line='10 9 6',write('6 9 10\n'); Line='10 9 7',write('7 9 10\n'); Line='10 9 8',write('8 9 10\n'); Line='10 9 9',write('9 9 10\n'); Line='10 9 10',write('9 10 10\n'); Line='10 10 1',write('1 10 10\n'); Line='10 10 2',write('2 10 10\n'); Line='10 10 3',write('3 10 10\n'); Line='10 10 4',write('4 10 10\n'); Line='10 10 5',write('5 10 10\n'); Line='10 10 6',write('6 10 10\n'); Line='10 10 7',write('7 10 10\n'); Line='10 10 8',write('8 10 10\n'); Line='10 10 9',write('9 10 10\n'); Line='10 10 10',write('10 10 10\n')). main :- write('入力された数値範囲を検査してください\n'), main. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/124 # # [1] 授業単元: Cプログラミング入門 # [2] 問題文(含コード&リンク): 入力された2つの文字列(日本語その他バイト文字は不可) # を比較するプログラムを作成せよ。ただし、大文字小文字の違いは無視。単語間に連続して # スペース・タブが複数入っていても単独のスペースとしない。 # # [5] その他の制限: 文字列とポインタまでやってます。 # 入力に関して、キーボードから1つ目の文字列を1行で入力し、改行する。 # この時、入力を促す文字は一切表示しない。入力文字数は128文字まで。 # 出力に関して、一致すれば何も表示しない。不一致の場合は最初に不一致となる # 入力1の文字と入力2の文字(1文字+スペース+1文字+改行)を表示する。 # どちらかが末端の場合は代わりにスペースで埋める。 複数の整数を平均値に近い順にソートする(_整数ならび,_平均値に近い順に整列された整数ならび) :- 'キーボードからまず、入力する整数の個数を入力(最大で100とする)し、改行'(_入力する整数の個数), 指定した数の整数をスペース1つ開けて1行で入力する(_入力する整数の個数,_整数ならび), 相加平均(_整数ならび,_平均値の一), _平均値 is truncate(_平均値の一), 平均値からの隔たりによる整列(_平均値からの隔たりのならび,_平均値,_平均値からの隔たりを鍵として付加して整列された整数ならび), 整列した整数をスペース1つのみあけて1行で出力する(_平均値からの隔たりを鍵として付加して整列された整数ならび). 'キーボードからまず、入力する整数の個数を入力(最大で100とする)し、改行'(_入力する整数の個数) :- repeat, get_integer(_入力する整数の個数), _入力する整数の個数 =< 100,!. 指定した数の整数をスペース1つ開けて1行で入力する(_入力する整数の個数,_整数ならび) :- length(_整数ならび,_入力する整数の個数), get_split_line([' '],_整数ならび). 平均値からの隔たりによる整列([X|Xs],_平均値,Ys) :- U is X - _平均値, 平均値からの隔たりにより分割する(Xs,U,Y,_平均値,Littles,Bigs), 平均値からの隔たりによる整列(Littles,_平均値,Ls), 平均値からの隔たりによる整列(Bigs,_平均値,Bs), append(Ls,[X|Bs],Ys) . 平均値からの隔たりによる整列([],_,[]). 平均値からの隔たりにより分割する([X|Xs],U,Y,_平均値,[[U,X]|Ls],Bs) :- V is X - _平均値, V < U, 平均値からの隔たりにより分割する(Xs,U,Y,_平均値,Ls,Bs),!. 平均値からの隔たりにより分割する([X|Xs],U,Y,_平均値,[[U,X]|Ls],Bs) :- U is X - _平均値, X < Y, 平均値からの隔たりにより分割する(Xs,U,Y,_平均値,Ls,Bs),!. 平均値からの隔たりにより分割する([X|Xs],U,Y,_平均値,Ls,[[U,X]|Bs]) :- 平均値からの隔たりにより分割する(Xs,U,Y,_平均値,Ls,Bs) . 平均値からの隔たりにより分割する([],Y,_,[],[]). 整列した整数をスペース1つのみあけて1行で出力する([]) :- !. 整列した整数をスペース1つのみあけて1行で出力する([[A,B]]) :- write_formatted('%t\n',[A]) :- !. 整列した整数をスペース1つのみあけて1行で出力する([[B,A]|R]) :- write_formatted('%t ',[A]), 整列した整数をスペース1つのみあけて1行で出力する(R) % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/83 # # [1] 授業単元: Cプログラム応用A # [2] 問題文(含コード&リンク): # 文字列操作の標準ライブラリ関数を使用し、指定したファイルの中で、辞書列で最初に出てくる単語と最後に出てくる単語、さらに最も長い単語をを見つけ表示せよ。 # ただし、同じ長さの単語がある場合最初に見つけた一つでいい。 # # ここでの単語とは、スペースや改行、タブで区切られた文字列のことである。 # ただし、単語の長さは100文字以内と考えていい。 # 指定したファイルの中で、辞書列で最初に出てくる単語と最後に出てくる単語、さらに最も長い単語をを見つけ表示する(_ファイル,_最初の単語,_最後の単語,_最もながい単語) :-   get_lines(_ファイル,Lines),   concat_atom(Lines,S),   split(S,[' ','\t','\n'],_単語ならび),   sort(_単語ならび,_整列された単語ならび),   append([_最初に出てくる単語|_],[_最後に出てくる単語],_整列された単語ならび),   findmax(_長さ,(member(_単語,_単語ならび),sub_atom(_単語,_,_長さ,_,_単語)),_最もながい長さ). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/710 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): 数値には初期値が与えられている。 #                この配列を昇順に並べ替えるプログラムを作成しなさい。 # # 表示結果: 数値[00]=80 # 数値[01]=40 # 数値[02]=23 # 数値[03]=69 # 数値[04]=10 # #  ソート後 # 数値[01]=10 # 数値[02]=23 # 数値[03]=40 # 数値[04]=69 # 数値[03]=80 述語数値を第二引数が昇順になるように定義し直す。その際追番を1から振り直す :-   findall(_値,数値(_,_値),L1),   quicksort(L1,L2),   abolish(数値/2),   述語数値を第二引数が昇順になるように定義し直す。その際追番を1から振り直す(1,L2). 述語数値を第二引数が昇順になるように定義し直す。その際追番を1から振り直す(_,[]) :- !. 述語数値を第二引数が昇順になるように定義し直す。その際追番を1から振り直す(M,[N|R]) :-   assertz(数値(M,N)),   M2 is M + 1,   述語数値を第二引数が昇順になるように定義し直す。その際追番を1から振り直す(M2,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/815 # # 【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/915.txt# 【 形態 】1. Javaアプリケーション(main()で開始) # # しりとりゲームをするプログラム # 第一段階ーShiritori.javaを次に掲載する。 #      これをEclipseに入力する #    ー与えられた単語の可否を判定するためのクラスReferee.javaを作成する # # 第二段階ーReferee.javaをしりとりのルールにのっとった判定をさせるように改善 # # 第一段階のRefereeの使用 # ・直前に入力された単語の末尾の文字を記憶するchar型のフィールド #    lastChar # ・次の単語がどの文字で始まらなければならないかをchar型で返すメソッド # mustBeginWith() # ・引数として与えられた単語の可否を判定し、可ならtrueを返すとともにlastCharを更新し、否ならfalseを返すメソッド #    isOK(String newWord) # とりあえずは何でもかんでも「可」とするように作る 馬名しりとり :- write('最初の馬名は :'), get_line(_語1), sub_atom(_語1,0,1,_,_最初の文字), 馬名しりとり(_最初の文字,_語1,_語,[]). 馬名しりとり(_次の文字,_語,_語,_) :- \+(sub_atom(_語,0,1,_,_次の文字)), write_formatted('ゲームオーバー %t-%t はしりとりになっていません\n',[_次の文字,_語]), fail,!. 馬名しりとり(_次の文字,_語,_語,_履歴) :- member(_語,_履歴),!, write_formatted('ゲームオーバー %tは既出です\n',[_語]), fail. 馬名しりとり(_次の文字,_語,_,_) :- 五代血統書(_語), fail. 馬名しりとり(_次の文字,_語,_語,_履歴) :- sub_atom(_語,0,1,_,_次の文字), write_formatted('%t-%t\n',[_次の文字,_語]). 馬名しりとり(_,_語1,_語,_履歴) :- 馬名しりとりルール(_語1,_次の文字1), write('次の馬名は :'), get_line(_語2), 馬名しりとり(_次の文字1,_語2,_語,[_語1|_履歴]). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,ン), Len2 is Len + 1, sub_atom(_語,0,Len2,_,_語2), 馬名しりとり次の文字(_語2,_次の文字). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,ー), Len2 is Len + 1, sub_atom(_語,0,Len2,_,_語2), 馬名しりとり次の文字(_語2,_次の文字). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,_次の文字),!. % *** user: jbis / 2 *** 五代血統書(_馬名) :- jbis(_馬名,L), 五代血統表表示(L). jbis(_馬名,_血統書) :- このサイトの馬名はSJISが使われている(_馬名,_馬名sjis), 'url述語表現'(_馬名sjis,URL1), '%27を切り取る'(URL1,URL2), concat(['http://www.jbis.or.jp/navi_search/?sid=horse&keyword=',URL2],URL), jbis馬名サイト検索(URL,_馬名,_血統サイトの正確なURLならび), 馬名による血統検索(_血統サイトの正確なURLならび,_血統書). jbis馬名サイト検索(URL,_馬名,_血統サイトの正確なURLならび) :- w3c(URL,X), concat_atom(X,X2), sjis2euc(X2,X3), split(X3,['\n','\r'],X4), findall(URL2,( member(A,X4), この行には検索対象の馬名が存在する(A,_馬名), 血統サイトの正確なURLを構成する(A,URL2)),_血統サイトの正確なURLならび), !. 馬名による血統検索(_血統サイトの正確なURLならび,_血統書) :- member(URL,_血統サイトの正確なURLならび), w3c(URL,X), 取れたならびすべての行をEUCに変換(X,_EUC行ならび), findall(_先祖馬名,( member(_馬名を含む行,_EUC行ならび), 血統書の中の馬名を切り取る(_馬名を含む行,_先祖馬名)), _血統書). このサイトの馬名はSJISが使われている(_馬名,_馬名sjis) :- euc2sjis(_馬名,_馬名sjis),!. '%27を切り取る'(URL1,URL2) :- replace_all(URL1,'%27','',URL2),!. 取れたならびすべての行をEUCに変換(Y,Y4) :- concat_atom(Y,Y2), sjis2euc(Y2,Y3), split(Y3,['\n','\r'],Y4),!. この行には検索対象の馬名が存在する(_行,_馬名) :- sub_atom(_行,_,_,_,'cell-br-no sort-02'), split(_行,['','(',')','>'],L), 馬名は最後の二要素のうちのどちらかにある(L,_馬名),!. 馬名は最後の二要素のうちのどちらかにある(L,_馬名) :- append(_,[_馬名],L),!. 馬名は最後の二要素のうちのどちらかにある(L,_馬名) :- append(_,[_馬名,_],L),!. 血統サイトの正確なURLを構成する(_行,URL) :- split(_行,['"'],L), append(_,[U,_],L), concat_atom(['http://www.jbis.or.jp',U,'pedigree/'],URL),!. 血統書の中の馬名を切り取る(_行,_先祖馬名) :- 先祖馬名を含む行はmaleという文字列を含む(_行), sub_atom(_行,Start,Len,_,''), sub_atom(_行,0,Start,_,_行1), split_patern_1(_split_patern_1), split(_行1,_split_patern_1,L), last(L,_先祖馬名),!. 先祖馬名を含む行はmaleという文字列を含む(_行) :- sub_atom(_行,_,_,_,male),!. 血統クロス(_馬名,_クロスならび) :- jbis(_馬名,L), length(L1,31),length(L2,31),append(L1,L2,L), 積集合(L1,L2,_積集合), 血統クロス(_積集合,L1,L2,_クロスならび). 血統クロス([],L1,L2,[]) :- !. 血統クロス([H|R1],L1,L2,[[_世代1,_世代2]|R2]) :- list_nth(N,L1,H), list_nth(N1,L2,H), N2 is N1 + 31, 第何世代か(N,_世代ならび1), min(_世代ならび1,_世代1), 第何世代か(N2,_世代ならび2), min(_世代ならび2,_世代2), 血統クロス(R1,L1,L2,R2). 第何世代か(N,_世代ならび) :- findall(_世代,( 五代血統表表示テーブル(_五代血統表表示テーブル), member(N,_五代血統表表示テーブル), list_nth(_世代,_五代血統表表示テーブル,N)),_世代ならび). 五代血統表表示(L) :- 五代血統表表示テーブル(L1), 五代血統表一行表示(L,L1), fail. 五代血統表表示(_). 五代血統表一行表示(_,[]) :- wr('\n'),!. 五代血統表一行表示(L,[N|R]) :- \+(N=0), list_nth(N,L,_馬名), wr('%t',[_馬名]), 五代血統表一行表示(L,R),!. 五代血統表一行表示(L,[0|R]) :- wr('%15s',[' ']), 五代血統表一行表示(L,R),!. % *** user: 五代血統表表示テーブル / 1 *** 五代血統表表示テーブル([0,0,0,0,5]). 五代血統表表示テーブル([0,0,0,4,0]). 五代血統表表示テーブル([0,0,0,0,6]). 五代血統表表示テーブル([0,0,3,0,0]). 五代血統表表示テーブル([0,0,0,0,8]). 五代血統表表示テーブル([0,0,0,7,0]). 五代血統表表示テーブル([0,0,0,0,9]). 五代血統表表示テーブル([0,2,0,0,0]). 五代血統表表示テーブル([0,0,0,0,12]). 五代血統表表示テーブル([0,0,0,11,0]). 五代血統表表示テーブル([0,0,0,0,13]). 五代血統表表示テーブル([0,0,10,0,0]). 五代血統表表示テーブル([0,0,0,0,15]). 五代血統表表示テーブル([0,0,0,14,0]). 五代血統表表示テーブル([0,0,0,0,16]). 五代血統表表示テーブル([1,0,0,0,0]). 五代血統表表示テーブル([0,0,0,0,20]). 五代血統表表示テーブル([0,0,0,19,0]). 五代血統表表示テーブル([0,0,0,0,21]). 五代血統表表示テーブル([0,0,18,0,0]). 五代血統表表示テーブル([0,0,0,0,23]). 五代血統表表示テーブル([0,0,0,22,0]). 五代血統表表示テーブル([0,0,0,0,24]). 五代血統表表示テーブル([0,17,0,0,0]). 五代血統表表示テーブル([0,0,0,0,27]). 五代血統表表示テーブル([0,0,0,26,0]). 五代血統表表示テーブル([0,0,0,0,28]). 五代血統表表示テーブル([0,0,25,0,0]). 五代血統表表示テーブル([0,0,0,0,30]). 五代血統表表示テーブル([0,0,0,29,0]). 五代血統表表示テーブル([0,0,0,0,31]). 五代血統表表示テーブル([0,0,0,0,36]). 五代血統表表示テーブル([0,0,0,35,0]). 五代血統表表示テーブル([0,0,0,0,37]). 五代血統表表示テーブル([0,0,34,0,0]). 五代血統表表示テーブル([0,0,0,0,39]). 五代血統表表示テーブル([0,0,0,38,0]). 五代血統表表示テーブル([0,0,0,0,40]). 五代血統表表示テーブル([0,33,0,0,0]). 五代血統表表示テーブル([0,0,0,0,43]). 五代血統表表示テーブル([0,0,0,42,0]). 五代血統表表示テーブル([0,0,0,0,44]). 五代血統表表示テーブル([0,0,41,0,0]). 五代血統表表示テーブル([0,0,0,0,46]). 五代血統表表示テーブル([0,0,0,45,0]). 五代血統表表示テーブル([0,0,0,0,47]). 五代血統表表示テーブル([32,0,0,0,0]). 五代血統表表示テーブル([0,0,0,0,51]). 五代血統表表示テーブル([0,0,0,50,0]). 五代血統表表示テーブル([0,0,0,0,52]). 五代血統表表示テーブル([0,0,49,0,0]). 五代血統表表示テーブル([0,0,0,0,54]). 五代血統表表示テーブル([0,0,0,53,0]). 五代血統表表示テーブル([0,0,0,0,55]). 五代血統表表示テーブル([0,48,0,0,0]). 五代血統表表示テーブル([0,0,0,0,58]). 五代血統表表示テーブル([0,0,0,57,0]). 五代血統表表示テーブル([0,0,0,0,59]). 五代血統表表示テーブル([0,0,56,0,0]). 五代血統表表示テーブル([0,0,0,0,61]). 五代血統表表示テーブル([0,0,0,60,0]). 五代血統表表示テーブル([0,0,0,0,62]). split_patern_1(['\r','>',A,B]) :- AL = [60,47,97,62,60,47,116,100,62], BL = [60,47,97,62,60,117,108,32,99,108,97,115,115,61,34,108,105,115,116,45,105,99,111,110,45,48,49,34,62], atom_codes(A,AL), atom_codes(B,BL). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/321 # # # スコアランキングで、自分の上下4人を含めた9人分の情報を取ってきたいのですが、どのようにすればよいでしょうか? # (自分が1位などの場合は自分と下位8人分を取得します) # スコアランキングで、自分の上下4人を含めた9人分の情報を取る(_自分,L) :-   findall([_スコア,_氏名],スコア(_氏名,_スコア),L1),   sort(L1,L2),   reverse(L2,L3),   スコアランキングで、自分の上下4人を含めた9人分の情報を取る(_スコア,_自分,L3,L). スコアランキングで、自分の上下4人を含めた9人分の情報を取る(_スコア,_自分,L3,L) :-   length(L1,4),   length(L2,4),   append(L1,[[_スコア,_自分]|L2],L),   append(_,L,_,L3),!. スコアランキングで、自分の上下4人を含めた9人分の情報を取る(_スコア,_自分,L3,L) :-   list_nth(N,L3,[_スコア,_自分]),   N < 4,   length(L,8),   append(L,_,L3),!. スコアランキングで、自分の上下4人を含めた9人分の情報を取る(_スコア,_自分,L3,L) :-   length(L,8),   append(_,L,L3),!. スコアランキングで、自分の上下4人を含めた9人分の情報を取る(_スコア,_自分,L,L). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/321 # # # スコアランキングで、自分の上下4人を含めた9人分の情報を取ってきたいのですが、どのようにすればよいでしょうか? # (自分が1位などの場合は自分と下位8人分を取得します) # スコアランキングで、自分の上下4人を含めた9人分の情報を取る(_自分,L) :-   findall([_スコア,_氏名],スコア(_氏名,_スコア),L1),   sort(L1,L2),   reverse(L2,L3),   append(L11,[[_スコア,_氏名]|L12],L3),   自分の最良の席を取る(L11,[_スコア,_自分],L12,L). 自分の最良の席を取る(L11,[_スコア,_自分],L12,L) :-   length(L12,Len2),Len2 =< 4,   Len1 is 9 - Len2 - 1,length(L1,Len1),   append(_,L1,L11),   append(L1,[[_スコア,自分]|,L12],L),!. 自分の最良の席を取る(L11,[_スコア,_自分],L12,L) :-   length(L11,Len1),Len1 =< 4,   Len2 is 9 - Len1 - 1,length(L2,Len2),   append(Len2,_,L12),   append(L11,[[_スコア,_自分]|L2],L),!. 自分の最良の席を取る(L11,[_スコア,_自分],L12,L) :-   length(L1,4),length(L2,4),   append(_,L1,L11),   append(L2,_,L12),   append(L1,[[_スコア,_自分]|L2],L),!. 自分の最良の席を取る(L11,[_スコア,_自分],L12,L) :- append(L11,[[_スコア,_自分]|L12],L). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/321 # # # スコアランキングで、自分の上下4人を含めた9人分の情報を取ってきたいのですが、どのようにすればよいでしょうか? # (自分が1位などの場合は自分と下位8人分を取得します) # スコアランキングで、自分の上下4人を含めた9人分の情報を取る(_自分,L) :- findall([_スコア,_氏名],スコア(_氏名,_スコア),L1), sort(L1,L2), reverse(L2,L3), for(5,N,1), append(_,L,_,L3), length(L,9), member([_スコア,_自分],L), 自分の最良の席を取る(N,_自分,L). 自分の最良の席を取る(N,_自分,L) :- list_nth(N,L,[_,_自分]),!. 自分の最良の席を取る(N,_自分,L) :- M is 10-N, list_nth(M,L,[_,_自分]),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/709 # # [1] 授業単元:C言語とアルゴリズム # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10227.txt 配列aのデータを基本選択法によって昇順に整列し、整列後の配列a内容を表示 :- a(L),基本選択法(L,L2),write_formatted('%t\n',[L2]). 基本選択法([A,B|R],L) :- A =< B, 最初に見つかったAより小さい数と交換(A,[B|R],X,L2), 基本選択法の二(A,X,L2,L). 基本選択法([A,B|R],L) :- A > B, 基本選択法([B,A|R],L). 基本選択法の二(A,B,L1,[A|L2]) :- A =< B, 基本選択法([B|L1],L2). 基本選択法の二(A,B,L1,L) :- A > B, 基本選択法([B|L1],L). 最初に見つかったAより小さい数と交換(A,[],A,[]) :- !. 最初に見つかったAより小さい数と交換(A,[B|R],B,[A|R]) :- B > A,!. 最初に見つかったAより小さい数と交換(A,[B|R1],X,[B|R2]) :- A =< B, 最初に見つかったAより小さい数と交換(A,R1,X,R2). 配列aのデータを基本選択法によって降順に整列し、整列後の配列a内容を表示 :- a(L), 基本選択法降順(L,L2),write_formatted('%t\n',[L2]). 基本選択法降順([A,B|R],L) :- A >= B, 最初に見つかったAより大きい数と交換(A,[B|R],X,L2), 基本選択法降順の二(A,X,L2,L). 基本選択法降順([A,B|R],L) :- A < B, 基本選択法降順([B,A|R],L). 基本選択法降順の二(A,B,L1,[A|L2]) :- A >= B, 基本選択法降順([B|L1],L2). 基本選択法降順の二(A,B,L1,L) :- A < B, 基本選択法降順([B|L1],L). 最初に見つかったAより大きい数と交換(A,[],A,[]) :- !. 最初に見つかったAより大きい数と交換(A,[B|R],B,[A|R]) :- B < A,!. 最初に見つかったAより大きい数と交換(A,[B|R1],X,[B|R2]) :- A =< B, 最初に見つかったAより大きい数と交換(A,R1,X,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/709 # # [1] 授業単元:C言語とアルゴリズム # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10227.txt # # [課題1] #  100から999までの乱数が100個入った配列aの内容を10個ずつに区切って表示しなさい.さらに # 配列aのデータを基本選択法によって昇順に整列し、整列後の配列a内容を表示させなさい. # [課題2] #  100から999までの乱数が100個入った配列aの内容を10個ずつに区切って表示しなさい.さらに # 配列aのデータを基本選択法によって降順に整列し、整列後の配列a内容を表示させなさい. a([983,386,577,215,393,935,686,292,349,821,762,527,690,359,663,626,340,226, 872,236,711,468,367,529,882,630,162,923,767,335,429,802,622,958,969,967,893, 656,311,242,529,973,721,219,384,437,798,624,615,670,813,326,191,180,756,973, 762,870,896,581,205,325,384,727,336,405,746,229,113,957,424,595,982,145,714, 367,534,564,943,150,287,808,376,378,888,184,403,651,954,299,232,160,576,568, 839,812,926,586,994,939]). '100から999までの乱数が100個入った配列aの内容を10個ずつに区切って表示' :- a(L), member10(L1,L), concat_atom(L1,' ',S), write_formatted('%t\n',[S]), fail. '100から999までの乱数が100個入った配列aの内容を10個ずつに区切って表示'. member10(L1,L) :- length(L1,10),append(L1,L2,L). member10(L1,L) :- length(L3,10),append(L3,L2,L),member10(L1,L2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/677 # # [1] 授業単元:プログラミング演習 # [2] # 5.以下の英単語を辞書順に(アルファベット順に)ソートによって並べ替えて表示するプログラムを作成せよ。すべての4文字の単語であることを利用してもよい。 # # mane, malt, mama, mark, mare, maid, made, mach, many, mess, meat, neat, like, lime, limb # # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10230.txt # 英単語ならび([mane, malt, mama, mark, mare, maid, made, mach, many, mess, meat, neat, like, lime, limb]). '英単語を辞書順に(アルファベット順に)ソートによって並べ替えて表示する' :- 英単語ならび(L1), '英単語を辞書順に(アルファベット順に)ソートによって並べ替える'(L1,[],L2), writeln(L2). '英単語を辞書順に(アルファベット順に)ソートによって並べ替える'([],L,L) :- !. '英単語を辞書順に(アルファベット順に)ソートによって並べ替える'([_単語|R],L1,L2) :- 小さい順整列ならびに文字列挿入(_単語,L1,L2), '英単語を辞書順に(アルファベット順に)ソートによって並べ替える'(R,L2,L). 小さい順整列ならびに文字列挿入(_文字列,[],[_文字列]) :- !. 小さい順整列ならびに文字列挿入(_文字列,[A|R],[_文字列,A|R]) :- _文字列 @< A,!. 小さい順整列ならびに文字列挿入(_文字列,[A|R1],[A|R2]) :- _文字列 @>= A,小さい順整列ならびに文字列挿入(_文字列,R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/677 # # [1] 授業単元:プログラミング演習 # [2] # 3.キーボードから次々に整数を入力し、入力のたびにそれまでに入力した数字を # 小さい順に表示するプログラムを作成せよ。数字は10個入力したらプログラムは終了するようにすること. キーボードから 垢棒或瑤鯑力し、入力のたびにそれまでに入力した数字を小さい順に表示する :- キーボードから 垢棒或瑤鯑力し、入力のたびにそれまでに入力した数字を小さい順に表示する(10,[]). キーボードから 垢棒或瑤鯑力し、入力のたびにそれまでに入力した数字を小さい順に表示する(0,_) :- !. キーボードから 垢棒或瑤鯑力し、入力のたびにそれまでに入力した数字を小さい順に表示する(N,_現在まで整列されたならび) :- get_integer(_整数), 小さい順整列ならびに挿入(_整数,_現在まで整列されたならび,_整列し直したならび), concat_atom(_整列し直したならび,' ',_整列文字列), write_formatted('%t\n',[_整列文字列]), N1 is N - 1, キーボードから 垢棒或瑤鯑力し、入力のたびにそれまでに入力した数字を小さい順に表示する(N1,_整列し直したならび). 小さい順整列ならびに挿入(N,[],[N]) :- !. 小さい順整列ならびに挿入(N,[A|R],[N,A|R]) :- N < A,!. 小さい順整列ならびに挿入(N,[A|R1],[A|R2]) :- N >= A,小さい順整列ならびに挿入(N,R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/677 # # [1] 授業単元:プログラミング演習 # [2] # 2.サンプルプログラムを参考乱数によって生成した20個の数字を配列に入れ、バブルソートによって大きいものから順に表示するプログラムを作成せよ。 乱数によって生成した20個の数字を配列に入れ、バブルソートによって大きい順に表示 :- findall(M,( between(1,20,_), M is random(1000), 整数ならび), バブルソートによって大きい順に(_整数ならび,_整列した整数ならび), writeln(_整列した整数ならび). バブルソートによって大きい順に(L1,L2) :- 大きい順の整列が崩れるまで(L1,L3), バブルソートによって大きい順に(L3,L2). バブルソートによって大きい順に(L,L). 大きい順の整列が崩れるまで([A,B|R],[B,A|R]) :- A @< B. 大きい順の整列が崩れるまで([A,B|R1],[A|R2]) :- A @>= B, 大きい順の整列が崩れるまで([B|R1],R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/677 # # [1] 授業単元:プログラミング演習 # [2] 1.サンプルプログラムを参考に乱数によって生成した20個の数字を配列に入れ、バブルソートによって小さい順に表示するプログラムを作成せよ。 乱数によって生成した20個の数字を配列に入れ、バブルソートによって小さい順に表示 :- findall(M,( between(1,20,N), M is random(1000)), 整数ならび), バブルソートによって小さい順に(_整数ならび,_整列した整数ならび), writeln(_整列した整数ならび). バブルソートによって小さい順に(L1,L2) :- 整列順が崩れるまで(L1,L3), バブルソートによって小さい順に(L3,L2),!. バブルソートによって小さい順に(L,L). 整列順が崩れるまで([A,B|R],[B,A|R]) :- A @> B. 整列順が崩れるまで([A,B|R1],[A|R2]) :- A @=< B, 整列順が崩れるまで([B|R1],R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% writeln([]). writeln([A|R]) :- writef('%w\n',[A]),writeln(R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/432 # # [1] 授業単元:暇なヤシ集まれ # [2] 問題文(含コード&リンク): #  最大10桁の数字列sと 10000 以下の正整数dが #  与えられたとき、sの各数字を並べ替えて出来る全 #  ての数の中で、dで割り切れる数の総数を求める。 # #  計算例) s, d => 解 #  ・ 000, 1 => 1 #  ・ 1234567890, 1 => 3628800 #  ・ 123434, 2 => 90 # '最大10桁の数字列sと 10000 以下の正整数dが与えられたとき、sの各数字を並べ替えて出来る全ての数の中で、dで割り切れる数の総数を求める'(_数字ならび,D,X) :- length(_数字ならび,Len), Len =< 10, D < 10000, findall(Y,(数字ならびから順列整数(_数字ならび,Len,Y),0 is Y mod D),L), sort(L,L2), length(L2,X). 数字ならびから順列整数(Y,0,0). 数字ならびから順列整数(Y,N,X) :- del(Z = Y - A), M is N - 1, 数字ならびから順列整数(Z,M,X2), X is truncate(10^M*A+X2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/365 # # 【質問テンプレ】 # [1]授業単元:応用C言語演習 # [2]問題文(含コード&リンク) # 標準入力から1文字以上の英数字と'_'で構成される単語を読み込み、 # それぞれの単語が何回、何行目の何個目の単語に出現したかを単語アルファベット順 # にリストする索引作成プログラム # アルファベット順出力の後出現頻度(出現が多い単語順、同数についてはアルファベ # ット順)順についても同じ書式で出力 # 改行記号とタブ/アルファベット/数字/ '_' /空白しか標準入力されないとして良い。 # 入力行数、単語長、種数、単語辺りの出現回数に制限は無い。 # 単語の前後の区切りは単語を構成しない文字とする。(行末記号を含む) # 書式: 単語 (回数) 位置(行番号が若い順)改行 # 位置: 'L'行番号(1から開始)-行内単語番号(1から開始) # alpha (3回) L32-5 L66-4 L124-1 # beta (2回) L192-1 L276-3 # 文から索引の作成(_ファイル,_索引ならび) :- get_lines(_ファイル,Lines), 行単位に索引を作成(1,Lines,[],_索引ならび). 行単位に索引を作成(_行番号,[],X,X). 行単位に索引を作成(_行番号,[Line|R1],Y,X) :- split(Line,[' ',',','\r','t'],_単語ならび), 行単位に索引に追加(1,_行番号,_単語ならび,Y,Y2), _行番号2 is _行番号 + 1, 行単位に索引を作成(_行番号2,R1,Y2,X). 行単位に索引に追加(_行での相対位置,_行番号,[],X,X). 行単位に索引に追加(_行での相対位置,_行番号,[_単語|R1],Y,X) :- 索引に追加(_単語,_行番号,_行での相対位置,Y,Y2), _行での相対位置2 is _行での相対位置 + 1, 行単位に索引に追加(_行での相対位置2,_行番号,R1,Y2,X). 索引に追加(_単語,_行番号,_行での相対位置,[[_単語,_位置情報ならび,_頻度]|R1],[[_単語,_更新された位置情報,_頻度2]|R1]) :- append([_位置情報ならび,[_行番号,_行での相対位置],_更新された位置情報ならび), _頻度2 is _頻度 + 1,!. 索引に追加(_単語,_行番号,_行での相対位置,[[_単語1,_位置情報ならび1,_頻度1]|R1],[[_単語,[_行番号,_行での相対位置],1],[単語1,_位置情報ならび1,_頻度1]|R1]) :- _単語 @< _単語2,!. 索引に追加(_単語,_行番号,_行での相対位置,[[_単語1,_位置情報ならび1,_頻度1]|R1],[[単語1,_位置情報ならび1,_頻度1]|R2]) :- _単語 @> _単語2, 索引に追加(_単語,_行番号,_行での相対位置,R1,R2) :- 索引の全表示([]). 索引の全表示([[_単語,_位置情報ならび,頻度]|R]) :- findall(S,(member([A,B],_位置情報ならび),concat_atom(['L',A,'-',B],S)),L), concat_atom(L,' ',S2), write_formatted('%t (%t回) %t\n',[_単語,頻度,S2]), 索引の全表示(R). 出現頻度順索引全表示(_索引ならび) :- findall([_頻度|L],(member(L,_索引ならび),last(L,_頻度)),L1), sort(L1,L2), findall(L,member([_|L],L2),L3), reverse(L3,L4), 索引の全表示(L3). 索引の保護(_文名,_保護ファイル,_索引ならび) :- 現在定義されている索引は消去(_文名), assertz(索引(_文名,_索引ならび)), tell(_保護ファイル), listing(索引), told. 索引の定義(_文名,_保護ファイル,_索引ならび) :- reconsult(_保護ファイル), 索引(_文名,_索引ならび). 現在定義されている索引は削除(_文名) :- retract(索引(_文名,_)),!. 現在定義されている索引は削除(_). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/339 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):5人の学生の3教科(国・数・英)の点数を # 読み込んで、2次元配列を用いて以下の条件を満たすプログラムを作成せよ。 # (1)科目別の最高点を求める。 # (2)各学年の3教科の平均を求める。 # これらを表にして表示する。 # '5人の学生の3教科(国・数・英)の点数を読み込んで、2次元配列を用いて、科目別最高点、3教科の平均を表示' :- findall(L,(for(1,N,5),get_line(Line),split(Line,[','],L)),_学生の得点ならび), 科目別最高点(_学年の得点ならび,[_国最高点,_数最高点,_英最高点]), write('科目別最高点,国,数,英\n'), write_formatted(',%t,%t,%t\n',[_国最高点,_数最高点,_英最高点]), どんな学年があるか(_学生の得点ならび,_学年ならび), write('学年別、科目別平均点\n'), member(_学年,_学年ならび), findavg([_国,_数,_英],member([_学年,_国,_数_英],_学年の得点ならび),[_国平均,_数平均,_英平均]), member([_学年,_国平均,_数平均,_英平均],_各学年の3教科の平均), write_formatted('%t,%t,%t,%t\n',[_学年,_国平均,_数平均,_英平均]), fail. '5人の学生の3教科(国・数・英)の点数を読み込んで、2次元配列を用いて、科目別最高点、3教科の平均を表示'. 科目別最高点(_学年の得点ならび,_科目別最高点) :- 行列の転置(_学年の得点ならび,[_|L1]), findall(Max,(member(L2,L1),max(L2,Max)),_科目別最高点). どんな学年があるか(_学生の得点ならび,_学年ならび) :- findall(_学年,member(_学年,_学年の得点ならび),L), sort(L,_学年ならび). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/316 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10165.txt # 課題1、関数rand()を使用して0〜999の整数を10個作り、 #     画面に表示させた後、昇順(数値の小さい順)に表示させるプログラム #     (実行例) #    756、836、237、109、290、647、27、933、198、239 #     27、109、198、237、239、290、647、756、836、933 # # 課題2、関数rand()を使用して0〜9の整数を作る。これを100回実行し、各数値の出現回数をn[0]〜n[9]の #     10個の配列にセット、これを用いて次のような棒グラフを表示するプログラムを作成せよ。 #    (実行例) #     0:*************** # 1:******** # 2:************* # 3:*********** # 4:******* # 5:********* # 6:*********** # 7:******** # 8:****** # 9:************ '0〜999の整数を10個作り、画面に表示させた後、昇順(数値の小さい順)に表示'(_整列した整数ならび) :- findall(N,N is random mod 1000,L), 昇順整列(L,[],_整列した整数ならび), ならびを行出力(_整数整列ならび). 昇順整列([],X,X). 昇順整列([A|R1],L,X) :- 挿入(A,L,L1),昇順整列(R1,L1,X). 挿入(A,[],[A]) :- !. 挿入(A,[B|R1],[A,B|R1]) :- A =< B,!. 挿入(A,[B|R1],[B|R2]) :- 挿入(A,R1,R2). ならびを行出力([]). ならびを行出力([A|R]) :- write_formatted('%t\n',[A]), ならびを行出力(R). 課題2 :-   課題2(100,[0,0,0,0,0,0,0,0,0,0],L),   課題2_グラフ(L). 課題2(0,L,L) :- !. 課題2(M,Y,L) :-   N is random mod 10, N2 is N + 1,   'N番目要素をカウントアップ'(1,N2,Y,Y1),   M1 is M - 1,   課題2(M1,Y1,L). 課題2_グラフ(L) :-   for(1,N,10),   N1 is N - 1,   list_nth(N,L,_頻度),   findall('*',for(1,U,_頻度),L2),   concat_atom([N1,':'|L2],S),   write_formatted('%t\n',[S]),   N = 10. 'N番目要素をカウントアップ'(M,0,Y,Y1) :- 'N番目要素をカウントアップ'(1,10,Y,Y1). 'N番目要素をカウントアップ'(N,N,[A|R1],[B|R1]) :- B is A + 1,!. 'N番目要素をカウントアップ'(M,N,[A|R1],[A|R2]) :- M2 is M + 1,'N番目要素をカウントアップ'(M2,N,R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/510 # # 【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/842.txt # (1)学生の姓名を入力し、該当する学生の学籍番号、学年、席次を表示する。 # 次のデータは学生の学籍番号、名前、欠席日数、席次を配列linesで格納したものです。 # String[] lines = { "0001, 山田太郎,2,3,42", "0002, 田中一郎,2,6,31", "0003, 斎藤花子,2,2,4" }; # splitとequalsメソッドを利用する。区切り記号はスペース。 # 引数 -n # (2) (1)を利用して学生の名前の一部を入力し、該当する学生の学籍番号、名前、欠席日数を表示する。 # 引数 -q # (3) (1)を利用して各学生の全てのデータを席次順に表示する。 学籍簿('0001', 山田太郎,2,3,42). 学籍簿('0002', 田中一郎,2,6,31). 学籍簿('0003', 斎藤花子,2,2,4). 学生の姓名を入力し、該当する学生の学籍番号、学年、席次を表示(_名前) :-   学籍簿(_学籍番号,_名前,_欠席日数,_学年,_席次),   write_formatted('%t,%t,%t,%t\n',[_名前,_学籍番号,学年,_席次]). 学生の名前の一部を入力し、該当する学生の学籍番号、名前、欠席日数を表示(_名前の一部) :-   学籍簿(_学籍番号,_名前,_欠席日数,_学年,_席次),   sub_atom(_名前,_,_,_,_名前の一部),   write_formatted('%t,%t,%t,%t\n',[_名前の一部,_学籍番号,名前,_欠席日数]). '各学生の全てのデータを席次順(昇順)に表示' :-   findall([_学年,_席次],学籍簿(_学籍番号,_名前,_欠席日数,_学年,_席次),L1),   sort(L1,L2),   member([_学年,_席次],L2),   学籍簿(_学籍番号,_名前,_欠席日数,_学年,_席次),   write_formatted('%t,%t,%t,%t\n',[_名前,_学籍番号,学年,_席次]),   fail.   '各学生の全てのデータを席次順(昇順)に表示'. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/745 # # # [1] 授業単元:プログラミング初歩 # # [2] 問題文(含コード&リンク): # # ・文字列を,a ならば z,b ならば y,c ならば x のように,小文字も大文字もアルファベットの逆順の出現文字に置き換えるプログラムを作りなさい. # ・文字列が与えられたとき,アルファベットを大文字,小文字を区別せずに出現頻度順に小文字で並べた文字列を返すプログラムを作りなさい. # 文字列が与えられたとき,アルファベットを大文字,小文字を区別せずに出現頻度順に小文字で並べた文字列を返す(_文字列,_出現頻度順に文字を並べ替えた文字列) :-   atom_chars(_文字列,_文字ならび),   出現頻度順に文字ならびを変換(_文字ならび,[],_出現頻度順に並べ替えたもじならび),   atom_chars(_出現頻度順に並べ替えたもじならび,_出現頻度順に文字を並べ替えた文字列). 出現頻度順に文字ならびを変換([],Y,X) :-   sort(Y,Z),   出現頻度ならびから逆順に文字選択(Z,[],X). 出現頻度順に文字ならびを変換([C|R1],Y,X) :-   出現頻度ならびをカウントアップ(C,Y,Z),   出現頻度順に文字ならびを変換(R1,Z,X). 出現頻度ならびをカウントアップ(C,[],[1,C2]) :- to_lower(C,C2), !. 出現頻度ならびをカウントアップ(C,[[N,C2]|R1],[[N2,C2]|R1]) :- to_lower(C,C2), N2 is N + 1,!. 出現頻度ならびをカウントアップ(C,[[N,C1]|R1],[[N,C1]|R2]) :-   出現頻度ならびをカウントアップ(C,R1,R2). 出現頻度ならびから逆順に文字選択([],X,X) :- !. 出現頻度ならびから逆順に文字選択([[N,C]|R1],Y,X) :-   出現頻度ならびから逆順に文字選択(R1,[C|Y],X). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/157 # # [1] 授業単元: アルゴリズム&アプリケーション # [2] 問題文(含コード&リンク):売掛表がcsvファイルで作られています。 # 各行の情報は、 # 顧客名,前月繰越高,当月入金高,当月売上高,締め日付 # であり、締め日付で昇順に整列していて、見出し等冗長部分はありません。 # 今回は問題を単純化するため、一人の顧客分しか扱わないことにします。 # さて更新プログラムのバグから、或る月の前月繰越高が # その前月の 前月繰越高-当月入金高+当月売上高 と不整合になってしまいました。 # 不整合になった以降の情報が正しく、 # それ以前の情報の当月入金高、当月売上高、締め日付については誤りがないとして、 # 1) 不整合部分を探し # 2) それ以前のすべての前月繰越高を全体が整合するように書き換えなさい。 # ファイルは一旦別のファイル(例えば/tmp/xxxxxx)に正しいものをつくり、 # その後、元のcsvファイルに書き戻しなさい。 # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C # [4] 期限: 期限はありません # [5] その他の制限: 日付などの持ち方は自由に工夫してよい。 # # 売掛表の遡行修正(_ファイル名) :- get_split_lines(_ファイル名,[','],L), L = [[_,A,_,_,_]|_], 不整合が生じた行(L,A,_それ以前のならび,_不整合が生じた行,_それ以後のならび), reverse(_それ以前のならび,_逆順のそれ以前のならび), _不整合が生じた行 = [_,_前月繰越高,_,_,_], 不整合が生じる以前の行を遡って修正(_前月繰越高,_逆順のそれ以前のならび,[],L2), append(L2,[_不整合が生じた行|_それ以後のならび],_整合されたならび), 書き戻し(_ファイル名,_整合されたならび). 不整合が生じた行([[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R1],_前月繰越高2,[],[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付],R1) :- \+(_前月繰越高2 = _前月繰越高),!. 不整合が生じた行([[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R1],_前月繰越高,[[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R2],_不整合が生じた行,R3) :- _当月繰越高 is _前月繰越高 - _当月入金高 + _当月売上高, 不整合が生じた行(R1,_当月繰越高,[[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R2],_不整合が生じた行,R3). 不整合が生じる以前の行を遡って修正(_,[],L,L) :- !. 不整合が生じる以前の行を遡って修正(_前月繰越高,[[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]|R1],L1,L2) :- _前々月繰越高 is _前月繰越高 - 当月売上高 + _当月入金高, 不整合が生じる以前の行を遡って修正(_前々月繰越高,[[_顧客名,_前々月繰越高,_当月入金高,_当月売上高,_締め日付]|L1],L2). 書き戻し(_ファイル名,_整合されたならび) :- tmpnam(TMPNAMFILE), open(TMPNAMFILE,write,Output), 仮ファイルに書く(Output,_整合されたならび), close(Output), cp(TMPNAMFILE,_ファイル名). 仮ファイルに書く(Output,_整合されたならび), member(L,_整合されたならび), concat_atom(L,',',S), write_formatted(Output,'%t\n',[S]), fail. 仮ファイルに書く(_,_). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 132代目 #72 # [1]授業単元:プログラミング演習 # [2] 1から100000までの数を列挙する。 # nまで書き終わった時点でそれぞれの数字dがtimes[d] (0<=d<=9)回使われていたとする。 # times[d]が小さい順にdを並べて順列を作る。(同じ回数の場合dが大きいほうが後)この順列が最初からそれまでに累積何回変わったか # nが1000の倍数毎に表にして出力(100000まで) # 回数と順位を要素とする構造体配列を使うこと # 整数の文字表現が増えると累計順位が変化する(_n個まで,_順位交代回数) :- 整数の文字表現が増えると累計順位が変化する(1,100000,[[0,'0'],[1,'1'],[0,'2'],[0,'3'],[0,'4'],[0,'5'],[0,'6'],[0,'7'],[0,'8'],[0,'9']],['0','2','3','4','5','6','7','8','9','1'],0,_n個まで,_順位交代回数). 整数の文字表現が増えると累計順位が変化する(Max,Max,_,_,_順位交代回数,Max,_順位交代回数) :- !. 整数の文字表現が増えると累計順位が変化する(N,Max,_,_,_順位交代回数,N,_順位交代回数) :- 0 is N mod 1000. 整数の文字表現が増えると累計順位が変化する(N,Max,LL1,_順位ならび_1,_順位交代回数_1,_n個まで,_順位交代回数) :- 整数の文字表現が増えると累計順位が変化して行く(N,Max,LL1,_順位ならび_1,_順位交代回数_1,_n個まで,_順位交代回数). 整数の文字表現が増えると累計順位が変化して行く(N,Max,LL1,_順位ならび_1,_順位交代回数_1,_n個まで,_順位交代回数) :- 整数の文字表現が増えると(N,N_2,_次の数字ならび), 最新の順位ならび(_次の数字ならび,LL1,LL2,_順位ならび_2), 累計順位が変化して行く(N_2,Max,LL2,_順位ならび_1,_順位ならび_2,_順位交代回数_1,_n個まで,_順位交代回数). 整数の文字表現が増えると(N,N_2,_次の数字ならび) :- succ(N,N_2), number_chars(N_2,_次の数字ならび). 最新の順位ならび(_次の数字ならび,LL1,LL2,_順位ならび_2) :- 'select/4を使った標本値の出現度数加算(但し、[_度数,_標本値]の順に管理される)'(_次の数字ならび,LL1,LL2), 順位ならび(LL2,_順位ならび_2). 'select/4を使った標本値の出現度数加算(但し、[_度数,_標本値]の順に管理される)'([],LL,LL). 'select/4を使った標本値の出現度数加算(但し、[_度数,_標本値]の順に管理される)'(_標本値ならび,LL1,LL) :- 'select/4で鍵管理して標本値の出現度数を加算して行く(但し、[_度数,_標本値]の順に管理される)'(_標本値ならび,LL1,LL). 'select/4で鍵管理して標本値の出現度数を加算して行く(但し、[_度数,_標本値]の順に管理される)'([_標本値|R],LL1,LL) :- 'select/4で鍵管理して標本値の出現度数を加算(但し、[_度数,_標本値]の順に管理される)'(_標本値,LL1,LL2), 'select/4を使った標本値の出現度数加算(但し、[_度数,_標本値]の順に管理される)'(R,LL2,LL). 'select/4で鍵管理して標本値の出現度数を加算(但し、[_度数,_標本値]の順に管理される)'(_標本値,LL1,LL2) :- select([_度数_1,_標本値],LL1,[_度数_2,_標本値],LL2), succ(_度数_1,_度数_2). 順位ならび(_度数標本値ならび,_順位ならび) :- '度数・標本値順に整列する'(_度数標本値ならび,_整列した度数標本値ならび), 整列された度数標本値ならびから標本値の順位を取り出す(_整列した度数標本値ならび,_順位ならび). '度数・標本値順に整列する'(_度数標本値ならび,_整列した度数標本ならび) :- sort(_度数標本値ならび,_整列した度数標本ならび). 整列された度数標本値ならびから標本値の順位を取り出す(_整列した度数標本値ならび,_順位ならび) :- findall(_標本値,member([_,_標本値],_整列した度数標本値ならび),_順位ならび). 累計順位が変化して行く(N_2,Max,LL2,_順位ならび_1,_順位ならび_2,_順位交代回数_1,_n個まで,_順位交代回数) :- 順位に変化があった場合だけ順位交代回数を更新する(_順位ならび_1,_順位ならび_2,_順位交代回数_1,_順位交代回数_2), 整数の文字表現が増えると累計順位が変化する(N_2,Max,LL2,_順位ならび_2,_順位交代回数_2,_n個まで,_順位交代回数). 順位に変化があった場合だけ順位交代回数を更新する(_順位ならび_1,_順位ならび_2,_順位交代回数_1,_順位交代回数_2) :- '順位に変化があった場合、交代回数が更新される'(_順位ならび_1,_順位ならび_2,_順位交代回数_1,_順位交代回数_2),!. 順位に変化があった場合だけ順位交代回数を更新する(_,_,_順位交代回数,_順位交代回数). '順位に変化があった場合、交代回数が更新される'(_順位ならび_1,_順位ならび_2,_順位交代回数_1,_順位交代回数_2) :- '順位に変化があった場合、'(_順位ならび_1,_順位ならび_2), 交代回数が変化する(_順位交代回数_1,_順位交代回数_2). '順位に変化があった場合、'(_順位ならび_1,_順位ならび_2) :- \+(sort(_順位ならび_1,_順位ならび_2)). 交代回数が変化する(_順位交代回数_1,_順位交代回数_2) :- succ(_順位交代回数_1,_順位交代回数_2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/836 # # [1] 授業単元: プログラミング実習 # [2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10095.txt # 文字列の配列を辞書順(アルファベット順)に並べ替えるプログラムを作成せよ 辞書順整列([_基準語|R1],X) :- atom_codes(_基準語,_基準語コードならび), 大小関係によって分類(R1,_基準語コードならび,_小さいグループ,_大きいグループ), 辞書順整列(_大きいグループ,_整列された大きいグループ), 辞書順整列(_小さいグループ,_整列された小さいグループ), append(_整列された小さいグループ,[_基準語|_整列された大きいグループ],X) . 辞書順整列([],[]). 大小関係によって分類([],_,[],[]). 大小関係によって分類([_語|R1],_基準語コードならび,[_語|_小さいグループ],_大きいグループ) :- atom_codes(_語,_語コードならび), 辞書順に比較基準語より小さいか等しい(_語コードならび,_基準語コードならび), 大小関係によって分類(R1,_基準語コードならび,_小さいグループ,_大きいグループ),!. 大小関係によって分類([_語|R1],_基準語コードならび,_小さいグループ,[_語|_大きいグループ]) :- 大小関係によって分類(R1,_基準値,_小さいグループ,_大きいグループ) . 辞書順に比較して基準語より小さいか等しい([],[]) :- !. 辞書順に比較して基準語より小さいか等しい([],[_|_]) :- !. 辞書順に比較して基準語より小さいか等しい([A|R1],[A|R2]) :- 辞書順に比較して基準語より小さいか等しい(R1,R2),!. 辞書順に比較して基準語より小さいか等しい([A|_],[B|_]) :- A >= 97, A =< 122, B >= 97, B =< 122,!, A < B. 辞書順に比較して基準語より小さいか等しい([A|_],[B|_]) :- A >= 97, A =< 122, B >= 65, B =< 90,!, A1 is A - 32, A1 < B. 辞書順に比較して基準語より小さいか等しい([A|_],[B|_]) :- A >= 65, A =< 90, B >= 97, B =< 122,!, B1 is B - 32, A < B1. 辞書順に比較して基準語より小さいか等しい([A|_],[B|_]) :- A < B,!. % 以下のサイトは http;//http://pc12.2ch.net/test/read.cgi/tech/1255709298/832 # [1] 授業単元: プログラミング実習 # [2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10093.txt # # N個(Nは定数マクロとして適当な数字を定義せよ)の整数擬似乱数を発生させ、 # これらの整数を大きい順に並べて表示するプログラムを作成せよ。 # 並べ方の方法は、まず配列の中から最大値を選び、配列の一番先頭の要素と交換する。 # 次に、先頭要素を除く残りの要素(二番目以降)の中で最大値を選び、配列の二番目の要素と交換する。 # 次に、三番目以降の要素の中で最大値を選び、配列の三番目の要素と交換する・・・・・ # というように残りの要素に対しても繰り返しおこなう。これにより書く要素が大きい順に配列の丈夫に埋まっていく。 # 要素数(20). k2_832 :- 要素数(_要素数). findall(R,(for(1,N,_要素数),R is random // 3217),L1), 最大値交換法による整列(L1,L2), write_formatted('発生した数値列=%t\n',[L1]), write_formatted('整列した数値列=%t\n',[L2]). 最大値交換法による整列([A],[A]) :- !. 最大値交換法による整列([A|R1],[Max|R2]) :- 最大値の位置(R1,[Nth|_],Max), 最大値と先頭要素を置換(A,Nth,Max,R1,Y), 最大値交換法による整列(Y,R2),!. 最大値交換法による整列([A|R1],[A|R2]) :- 最大値交換法による整列(R1,R2). 最大値と先頭要素を置換(A,Nths,Max,R1,X) :- Max @> A, 'ならびの位置指定置換'(Nths,A,R1,L). ならびの位置指定置換(1,A,[_|R],[A|R]) :- !. ならびの位置指定置換(N,A,[B|R1],[B|R2]) :- N1 is N - 1,ならびの位置指定置換(N1,A,R1,R2). 最大値の位置(_ならび,_位置ならび,_最大値) :- _ならび = [A|R1], 最大値の位置(R1,A,1,[1],_逆順の位置ならび,_最大値), reverse(_逆順の位置ならび,_位置ならび). 最大値の位置([],A,N,NX,NX,A). 最大値の位置([B|R1],A,N1,_,NX,X) :- B @> A, N2 is N1 + 1, 最大値の位置(R1,B,N2,[N2],NX,X). 最大値の位置([B|R1],A,N1,NY,NX,X) :- B = A, N2 is N1 + 1, 最大値の位置(R1,B,N2,[N2|NY],NX,X),!. 最大値の位置([B|R1],A,N1,NY,NX,X) :- B @< A, N2 is N1 + 1, 最大値の位置(R1,A,N2,NY,NX,X),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/463 # # 【課題】 # http://ime.nu/www51.tok2.com/home/rg550/cgi-bin/hosoku/img0047.zip # 【課題1】 # 実行例のようにキーボードから文字列を読み込み、文字型の配列に一文字づつ格納 # した後、整列し(順番はどちらでもかまいません)、出力するプログラムを # 作成しなさい。 # 【課題2】 # 0から9までの整数乱数を100個発生させ、実行例のようにその出現分布を棒グラフと # 値で出力するプログラムを作成しなさい。また、100個の乱数の平均値も合わせて # 出力しなさい。 # ただし、0から9 それぞれの個数を数えるための変数に必ず配列を用いてください。 # (出現個数カウント用の変数を10個用意してはいけません。) 例えば、出現個数 # カウント用の配列 count[] を用意すると、 count[0] に0が出現した回数が # 格納される。もし0が10回出現した場合、count[0]=10となる。) % 課題1 '実行例のようにキーボードから文字列を読み込み、文字型の配列に一文字づつ格納した 後、整列し(順番はどちらでもかまいません)、出力する' :- get_chars(_文字ならび), sort(_文字ならび,_整列した文字ならび), atom_chars(_整列した文字列,_整列した文字ならび), write_formatted('%t\n',[_整列した文字列]). % 課題2 '0から9までの整数乱数を100個発生させ、実行例のようにその出現分布を棒グラフと値 で出力する' :- findall([N,0,[]],for(0,N,9),_出現個数カウント用ならび), '0から9までの整数乱数を100個発生させ'(1,L1), 'その出現分布を棒グラフと値で出力する'(L1,_出現個数カウント用ならび). '0から9までの整数乱数を100個発生させ'(N,[]) :- N > 100,!. '0から9までの整数乱数を100個発生させ'(N,[_乱整数|R]) :- _乱整数 is random mod 10, N2 is N + 1, '0から9までの整数乱数を100個発生させ'(N2,R). 'その出現分布を棒グラフと値で出力する'([],L) :- 'グラフと値で出力'(L),!. 'その出現分布を棒グラフと値で出力する'([N|R],L) :- member([N,_カウント,L1],L), _カウント2 is _カウント + 1, ならびの置換([N,_カウント,L1],[N,_カウント2,[_|L1]],L,L2), 'その出現分布を棒グラフと値で出力する'(R,L2). グラフと値で出力([]). グラフと値で出力([[N,C,L]|R]) :- all(L,'*'), write_formatted(' %t: %t %t\n',[N,L,C]), グラフと値で出力(R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/481 # # [1]C言語初級 # [2] 次のプログラムから仕様書を起こして、全く異なるアルゴリズム # で同じ処理をするものに書き換えよ # http://ime.nu/codepad.org/FjM5LBs9 # # 提示されたプログラムソース # # # C, pasted yesterday: # # #include # # int check(long l){ # if( l% 3==0) return 1; # while(l!=0){ # if(l % 10==3) return 1; # l/=10; # } # return 0; # } # # int main(void){ # long l; # for(l=1;l<10000*10000;l++) # if( check(l) ) printf("%ld%c",l,10); # return 0; # # } # %%%%%%%%%%%%%%%% 遡行した仕様 %%%%%%%%%%%%%%%%%%% 要求仕様 1から10000*10000までの範囲の整数Nが以下の条件を満たす時、 1) Nが3の倍数 2) Nを10進表示した時にどこかの桁に3が現れる 全てのNを昇順に整列して、順序番号を付加して表示せよ。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '3の倍数であるか、10進数表記で3が現れる' :- '3の倍数であるか、10進数表記で3が現れる'(1,1). '3の倍数であるか、10進数表記で3が現れる'(_,100000000) :- !. '3の倍数であるか、10進数表記で3が現れる'(_順序番号,N) :- '3の倍数であるか、10進数表記で3が現れるかの判定'(N), _順序番号_2 is _順序番号 + 1, N2 is N + 1, '3の倍数であるか、10進数表記で3が現れる'(_順序番号_2,N2),!. '3の倍数であるか、10進数表記で3が現れる'(_順序番号,N) :- N2 is N + 1, '3の倍数であるか、10進数表記で3が現れる'(_順序番号,N2). '3の倍数であるか、10進数表記で3が現れるかの判定'(N) :- N < 3,!,fail. '3の倍数であるか、10進数表記で3が現れるかの判定'(N) :- 0 is N mod 3,!. '3の倍数であるか、10進数表記で3が現れるかの判定'(N) :- N2 is N // 10, '3の倍数であるか、10進数表記で3が現れるかの判定'(N2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/449 # # [1] 授業単元:C++実習2 # [2] 問題文(含コード&リンク): # -関数テンプレート- # 配列へのポインタと要素数を渡すと昇順にソートする関数を作成せよ。 # 但し,関数テンプレートにより作成すること。想定する配列の型は文字列以外とする。 # ソートのアルゴリズムはバブルソート(単純交換法)とする。また,関数をテストする適切なmain関数も作成し提出すること。 # 関数名前名は b_sort とし,第1引数は配列へのポインタ, 第2引数はint型で配列の要素数, 戻値は無しとする。 昇順挿入整列(_ならび,_昇順に整列したならび) :- 昇順挿入整列(_ならび,[],_昇順に整列したならび). 昇順挿入整列([],L,L). 昇順挿入整列([A|R1],L1,L) :- 昇順整列状態を保って挿入する(A,L1,L2), 昇順挿入整列(R1,L2,L). 昇順整列状態を保って挿入する(_挿入要素,L1,L2) :- append(L3,L4,L1), append(L3,[_挿入要素|L4],L2), すべての要素が小さい(L3,_挿入要素), すべての要素が大きいか等しい(L4,_挿入要素). すべての要素が大きい([],_). すべての要素が大きい([A|R],B) :- A @> B,すべての要素が大きい(R,B). すべての要素が小さい([],_). すべての要素が小さい([A|R],B) :- A @< B,すべての要素が小さい(R,B). すべての要素が小さいか等しい([],_). すべての要素が小さいか等しい([A|R],B) :- A @=< B,すべての要素が小さいか等しい(R,B). すべての要素が大きいか等しい([],_). すべての要素が大きいか等しい([A|R],B) :- A @>= B,すべての要素が大きいか等しい(R,B). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/442 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10025.txt # 「スコアー,ステージナンバー,名前」が入っているファイルがあるとする。 # # 降順にソート済みのスコアーデータのファイルから、上位10件を配列に読み込み、 # 新たに11件目のスコアーデータを入力後、スコアーの大きい順に並び替えを行い、 # 上位10件のデータを再度書き込むプログラムを作成せよ # # 999999,6,faegalr # 999976,123,aaaaaa # 999923,23,Steel # 999765,43,tyudayo # 786754,34,tyui # 713146,10,gawehgpoin # 654789,12,abaeuogn # 479136,65,gwerhja # 456789,43,tyu # 454545,45,454545 # 123456,34,ert t908(File) :- get_lines(File,Lines), findall(U,(member(A,Lines),split(A,[','],U)),L1), get_line(Line), split(Line,[','],W), 降順整列状態を保って挿入する(W,L1,L2), append(L3,[_],L2), findall(S,(member(L4,L3),concat_atom(L4,',',S)),L5), put_lines(File,L5). 降順整列状態を保って挿入する(_挿入要素,L1,L2) :- append(L3,L4,L1), append(L3,[_挿入要素|L4],L2), すべての要素が大きい(L3,_挿入要素), すべての要素が小さいか等しい(L4,_挿入要素). すべての要素が大きい([],_). すべての要素が大きい([A|R],B) :- A @> B,すべての要素が大きい(R,B). すべての要素が小さいか等しい([],_). すべての要素が小さいか等しい([A|R],B) :- A @=< B,すべての要素が小さいか等しい(R,B). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247636661/669 # # ちょっと質問 # レシピリスト #  オムレツ:卵 バター #  オムライス:卵 バター ご飯 玉葱 人参 ベーコン #  カレー:じゃがいも 人参 玉葱 牛肉 ルー #  ・・・ # 在庫リスト # 豚肉 バター じゃがいも トマト 牛乳・・・ # # というリストがあり、今の在庫でどんなものが出来るか、 # どんなものが出来そうか?を優先順位つけたい場合 # どういうやり方がスマートでしょう? # レシピリストを頭から順に、在庫リストと総当たりで比較? # 逆に在庫リストにあるものを1個ずつ拾ってレシピリストと比較? # # こういうプログラムってどっかにあるかなぁ 作ることのできるお勧め料理は(_料理ならび) :- 料理種別を選択してもらう(_種別), 現在の材料で作ることのできる料理を探す(_料理ならびの一), 確信度が高い順に並べ直す(_種別,_料理ならびの一,_料理ならび). 現在の材料で作ることのできる料理を探す([_料理|R]) :- レシピ(_料理,_材料ならび), すべての材料が在庫としてある(_材料ならび), 現在の材料で作ることのできる料理を探す(R). 現在の材料で作ることのできる料理を探す([]). すべての材料が在庫としてある([]) :- !. すべての材料が在庫としてある([_材料|R]) :- 在庫(_材料), すべての材料が在庫としてある(R). 料理種別を選択してもらう(_種別) :- write('どんな種類の料理をお望みですか\n'), get_line(_文), 料理種別を選択してもらう(_文,_種別). 料理種別を選択してもらう(_文,_種別) :- 文を解析して種別を得る(_文,_種別), member(_種別,[肉料理,魚料理,卵料理]),!. 料理種別を選択してもらう(_,_種別) :- write('申し訳ございませんが現在ご用意できるのは'), 可能な料理種別を列挙する, write('しかございません。この中からお選びください\n'), get_line(_文), 料理種別を選択してもらう(_文,_種別). 可能な料理種別を列挙する :- concat_atom([肉料理,魚料理,卵料理],と,_列挙文字列), write_formatted('%t',[_列挙文字列]). 確信度が高い順に並べ直す(_種別,_料理ならびの一,_料理ならび) :- 料理ならびに確信度を付加(_種別,_料理ならびの一,_確信度が先頭に付いた料理ならび), rsort(_確信度が先頭に付いた料理ならび,_確信度が先頭に付いた料理ならびの二), 先頭の確信度を外す(_確信度が先頭に付いた料理ならびの二,_料理ならび). 料理ならびに確信度を付加(_,[],[]) :- !. 料理ならびに確信度を付加(_種別,[_料理|R1],[[_確信度,_料理]|R2]) :- 分類確信度(_種別,_料理,_確信度), 料理ならびに確信度を付加(_種別,R1,R2),!. 料理ならびに確信度を付加(_種別,[_料理|R1],[[0,_料理]|R2]) :- 料理ならびに確信度を付加(_種別,R1,R2),!. 先頭の確信度を外す([],[]) :- !. 先頭の確信度を外す([[_|_料理]|R1],[_料理|R2]) :- 先頭の確信度を外す(R1,R2). レシピ(オムレツ,[卵,バター]). レシピ(オムライス,[卵,バター,ご飯,玉葱,人参,ベーコン]). レシピ(カレー,[じゃがいも,人参,玉葱,牛肉,ルー]). 在庫(豚肉). 在庫(バター). 在庫(じゃがいも). 在庫(トマト). 在庫(牛乳). 在庫(卵). 在庫(人参). 分類確信度(肉料理,オムレツ,20). 分類確信度(肉料理,カレー,50). 分類確信度(肉料理,ターンシチュー,90). 分類確信度(肉料理,ビーフステーキ,100). 分類確信度(卵料理,ボイルドエッグ,100). 分類確信度(卵料理,ベーコンスクランブル,80). 分類確信度(卵料理,茶碗蒸し,70). 分類確信度(卵料理,オムレツ,60). 分類確信度(魚料理,シュリンプカレー,80). 文を解析して料理種別を得る(_文,_種別) :- atom_chars(_文,_文字ならび), 料理種別を解析して得る(_文字ならび,R,_種別). 料理種別を解析して得る(_文,_残りの文,_種別) :- 料理種別(_文,_残りの文の一,_種別), 料理種別の後置詞(_残りの文の一,_残りの文), 料理種別の述部(_残りの文の二,_残りの文). 料理種別を解析して得る(_文,_残りの文,_種別) :- 料理種別(_文,_残りの文の一,_種別), 料理種別の後置詞(_残りの文の一,_残りの文),!. 料理種別を解析して得る(_文,_残りの文,_種別) :- 料理種別(_文,[],_種別),!. 料理種別([肉,料,理|R],R,肉料理). 料理種別([卵,料,理|R],R,卵料理). 料理種別([魚,料,理|R],R,魚料理). 料理種別([す,っ,ぽ,ん,料,理|R],R,すっぽん料理). 料理種別の後置詞([を|R],R). 料理種別の後置詞([が|R],R). 料理種別の述部([食,べ,た,い|R],R). 料理種別の述部([く,だ,さ,い|R],R). rsort(L1,L2) :- sort(L1,L3),reverse(L3,L2). % 以下のサイトは # 出典:: 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」を入力すると終了する) : '), length(Ln,100), get_line(_行), 成績データを得る(Ln,_行,_成績ならび). 成績データを得る(_,'0 0',[]) :- !. 成績データを得る([],_,[]). 成績データを得る([_|Ln],_行,[[_成績,N行,_学籍番号]|R]) :- split(_行,[' '],[_学籍番号,_成績]), length([_|Ln],N行), get_line(_行2), 成績データを得る(Ln,_行2,R). 成績データを成績順に並べ直す(_成績ならび,_整列した成績ならび) :- sort(_成績ならび,_点数が少ない順に整列した成績ならび), reverse(_点数が少ない順に整列した成績ならび,_整列した成績ならび). 上位11名の選別(L,X) :- length(X,11), append(X,_,L),!. 上位11名の選別(X,X). 上位11名を表示する(_上位11名ならび) :- append(_,[[A,B,C]|R],_上位11名ならび), writef('%t %t\n',[C,A]), R = [],!. % 以下のサイトは # 出典:: 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」を入力すると終了する) : '), length(Ln,100), get_line(_行), 成績データを得る(Ln,_行,_成績ならび). 成績データを得る(_,'0 0',[]) :- !. 成績データを得る([],_,[]). 成績データを得る([_|Ln],_行,[[_成績,N行,_学籍番号]|R]) :- split(_行,[' '],[_学籍番号,_成績]), length([_|Ln],N行), get_line(_行2), 成績データを得る(Ln,_行2,R). 成績データを成績順に並べ直す(_成績ならび,_整列した成績ならび) :- sort(_成績ならび,_点数が少ない順に整列した成績ならび), reverse(_点数が少ない順に整列した成績ならび,_整列した成績ならび). 上位11名の選別(L,X) :- length(X,11), append(X,_,L),!. 上位11名の選別(X,X). 上位11名を表示する(_上位11名ならび) :- append(_,[[A,B,C]|R],_上位11名ならび), writef('%t %t\n',[C,A]), R = [],!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/343 # # [1] 授業単元: C言語演習 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10014.txt # # 図のような過程を辿るもっとも簡単な整列アルゴリズムを実現せよ # [0] 567,724,23,43,148,72 # [1] 23,724,567,43,148,72 # [2] 23,43,567,724,148,72 # [3] 23.43,72,724,148,567 # [4] 23,43,72,148,724,567 # [5] 23,43,72,148,567,724 挙動([0],[567,724,23,43,148,72]). 挙動([1],[23,724,567,43,148,72]). 挙動([2],[23,43,567,724,148,72]). 挙動([3],[23.43,72,724,148,567]). 挙動([4],[23,43,72,148,724,567]). 挙動([5],[23,43,72,148,567,724]). 整列([],[]) :- !. 整列([A|R1],[B|R3]) :- 自分より後のならびの最小値が自分より小さいときにはこれと置換する([A|R],[B|R2]), 整列(R2,R3),!. 整列([A|R1],[A|R2]) :- 整列(R2,R3). 自分より後のならびの最小値が自分より小さいときにはこれと置換する([_自分|R1],[_最小値|R2]) :- 最小値(R,_最小値位置,_最小値), _最小値 < _自分, 要素番号によるならびの置換(_最小値位置,_自分,R1,R2). 最小値([A|R],_最小値位置,_最小値) :- 最小値(2,A,R,1,_最小値位置,_最小値). 最小値(_,_最小値,[],M,M,_最小値). 最小値(N1,Min,[A|R],M,N_最小値) :- A < Min, N2 is N + 1, 最小値(N2,A,R,N1,N,_最小値). 最小値(N1,Min,[_|R],M,N,_最小値) :- A >= Min, N2 is N + 1, 最小値(N2,Min,R,M,N,_最小値). 要素番号によるならびの置換(1,_置換要素,[_|R1],[_置換要素|R1]) :- !. 要素番号によるならびの置換(N,_置換要素,[A|R1],[A|R2]) :- N1 is N - 1, 要素番号によるならびの置換(N1,_置換要素,R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/324 # # どなたか教えてください。例えば、 # hoge[]={300,400,500,200,100} をソートしたときに元の配列番号の並びかえで # {4,3,0,1,2}として別の配列に格納したいんですがどうしたらいいでしょうか。 # テンプレ使うまでもない質問だと思ったので、こんな形ですいません。 # よろしくお願いします。 与えられたならびの整列した順序を示す現在の位置番号ならび(_ならび,_索引) :-   位置番号を明示的に付加する(_ならび,1,L3),   sort(L3,L2),   位置番号を切り取り索引を作る(L2,_索引). 位置番号を明示的に付加する([],_,[]). 位置番号を明示的に付加する([A|R1],N,[[A,N]|R2]) :-   N2 is N + 1,   位置番号を明示的に付加する(R1,N2,R2). 位置番号を切り取り索引を作る(L2,_索引) :-   findall(A,member([_,A],L2),_索引). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/615 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # ソートされた2つの配列A[N], B[N]が与えられる。 # AとBのそれぞれの要素を足して得られる、長さN*Nの配列、すなわち # for(int i = 0; i < N; i++) # for(int j = 0; j < N; j++) # C[i * N + j] = A[i] + B[j]; # のC[]をソートした配列を、 # およそN*Nに比例する時間で得るプログラムを作成せよ。 # ただし、Nは4000以下、A[], B[]の要素は絶対値が2の28乗以下の整数であるとしてよい。 t731(AL,BL,L) :- findall(C,(member(A,AL),member(B,BL),C is A + B),L1), quicksort(L1,L). % 以下のサイトは %文字列置換 %

%このディレクトリの索引

% *** user: '文字列置換' / 5 ***
'文字列置換'(_文字列,_置換述語,_要素変数,_置換変数,_置換された文字列) :-
    atom_chars(_文字列,_ならび),
    '全要素に適用して置換'(_ならび,_置換述語,_要素変数,_置換変数,_置換ならび),
    concat_atom(_置換ならび,_置換された文字列),
    ! .

% *** user: '文字列置換' / 4 ***
'文字列置換'(_対象文字列,_置換される副文字列,_置換する副文字列,_置換された文字列) :-
    replace(_対象文字列,_置換される副文字列,_置換する副文字列,_置換された文字列),
    ! .

% *** user: replace_all / 4 ***
replace_all('',A,B,'') :-
    ! .
replace_all(String,S1,'',X) :-
    atom_chars(String,StringL),
    atom_chars(S1,S1L),
    replace_31(StringL,S1L,Y),
    concat_atom(Y,X),
    ! .
replace_all(String,S1,S2,X) :-
    atom_chars(String,StringL),
    atom_chars(S1,S1L),
    atom_chars(S2,S2L),
    replace_41(StringL,S1L,S2L,Y),
    concat_atom(Y,X),
    ! .

% *** user: replace / 4 ***
replace(String,S1,'',X) :-
    atom_chars(String,StringL),
    atom_chars(S1,S1L),
    replace_3(StringL,S1L,Y),
    concat_atom(Y,X),
    ! .
replace(String,S1,S2,X) :-
    atom_chars(String,StringL),
    atom_chars(S1,S1L),
    atom_chars(S2,S2L),
    replace_4(StringL,S1L,S2L,Y),
    concat_atom(Y,X),
    ! .

% *** user: replace_3 / 3 ***
replace_3(L,L1,R) :-
    append(L1,R,L),
    ! .
replace_3([A|R],L1,[A|R2]) :-
    replace_3(R,L1,R2) .
% *** user: replace_4 / 4 ***
replace_4(L,L1,L2,R2) :-
    append(L1,R,L),
    append(L2,R,R2),
    ! .
replace_4([A|R],L1,L2,[A|R2]) :-
    replace_4(R,L1,L2,R2) .

% *** user: replace_31 / 3 ***
replace_31([],_,[]) :-
    ! .
replace_31(L,L1,Y) :-
    append(L1,R,L),
    replace_31(R,L1,Y),
    ! .
replace_31([A|R],L1,[A|R2]) :-
    replace_31(R,L1,R2) .

% *** user: replace_41 / 4 ***
replace_41([],_,_,[]) :-
    ! .
replace_41(L,L1,L2,R2) :-
    append(L1,R,L),
    replace_41(R,L1,L2,R3),
    append(L2,R3,R2),
    ! .
replace_41([A|R],L1,L2,[A|R2]) :-
    replace_41(R,L1,L2,R2) .

% *** user: '全要素に適用して置換' / 5 ***
'全要素に適用して置換'(L,P,Element,_置換変数,X) :-
    length(L,Len),
    findall(U,(for(1,N,Len) , list_nth(N,L,A,Element,C) , (error_protect(P,fail) , U = _置換変数 ; \+(error_protect(P,fail)) , U = Element)),X) .

% *** user: 'split' / 3 ***
split(_文,_区切り語ならび,_区切られた語ならび) :-
    区切り語ならびの変形(_区切り語ならび,SeparatersL),
    atom_chars(_文,_文字ならび),
    split_1(_文字ならび,SeparatersL,_区切られた語ならび).

% *** user: 'split_1' / 3 ***
split_1([],SeparatersL,[]).
split_1(L1,SeparatersL,[A|R]) :-
    \+(L1=[]),
    split_2(L1,SeparatersL,L2,R2),
    \+(L2=[]),
    atom_chars(A,L2),
    split_1(R2,SeparatersL,R).
split_1(L1,SeparatersL,X) :-
    \+(L1=[]),
    split_2(L1,SeparatersL,L2,R2),
    L2=[],
    split_1(R2,SeparatersL,X).

% *** user: 'split_2' / 4 ***
split_2([],_,[],[]).
split_2(L1,SeparatersL,[],R) :-
    member(L2,SeparatersL),
    append(L2,R,L1).
split_2([A|R1],SeparatersL,[A|R2],R) :-
    \+((member(L2,SeparatersL),append(L2,_,[A|R1]))),
    split_2(R1,SeparatersL,R2,R).

% *** user: '区切り語ならびの変形' / 2 ***
区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :-
    sort(_区切り語ならび,_昇順の区切り語ならび),
    reverse(_昇順の区切り語ならび,_降順の区切り語ならび),
    atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび).

% *** user: 'atomList2charsList' / 2 ***
atomList2charsList([],[]) :- !.
atomList2charsList([A|R1],[L|R2]) :-
    atom_chars(A,L),
    atomList2charsList(R1,R2).

%
% % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1136788500/374 # # 問3. M個のデータのうち、その2番目の小さいデータと同じデータの個数を #    求めるアルゴリズムの流れ図を示せ。 t702(L,_データ,_個数) :- n番目に小さいデータと同じデータの個数(L,2,_データ,_個数). n番目に小さいデータと同じデータの個数(L,N番目,_データ,_個数) :- quicksort(L,L1), M is N番目 - 1, length(L3,M), append(L3,[_データ|R],L1), findsum(1,member(_データ,[_データ|R]),_個数). % *** user: findsum / 3 *** findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), 加算(_値ならび,_合計値),!. % *** user: '整数加算' / 2 *** 加算([],0). 加算([N|R],X) :- 加算(R,Y), X is Y + N. % *** user: quicksort / 2 *** quicksort([X|Xs],Ys) :- partition(Xs,X,Littles,Bigs), quicksort(Littles,Ls), quicksort(Bigs,Bs), append(Ls,[X|Bs],Ys) . quicksort([],[]). % *** user: partition / 4 *** partition([X|Xs],Y,[X|Ls],Bs) :- X =< Y, partition(Xs,Y,Ls,Bs). partition([X|Xs],Y,Ls,[X|Bs]) :- X > Y, partition(Xs,Y,Ls,Bs). partition([],Y,[],[]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/188 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク): #   入力した任意の小数5つを降順にソートし出力する # [3] 環境 #  [3.1] OS: Windows #  [3.2] コンパイラ名とバージョン: VC #  [3.3] 言語: C # [4] 期限: 本日中 # [5] その他の制限:初心者用講座 配列を用いる # # 助けてください # # # t656 :- t656(X), write_formatted('%t\n',[X]). t656(X) :- '5つの数を得る'(5,L), 要素数の少ない降順整列(L,[],X). 要素数の少ない降順整列([],L,L) :- !. 要素数の少ない降順整列([_数|R1],[],X) :- 要素数の少ない降順整列(R1,[_数],X),!. 要素数の少ない降順整列([_数|R1],[N|R2],X) :- _数 >= N, 要素数の少ない降順整列(R1,[_数,N|R1],X). 要素数の少ない降順整列([_数|R1],[N|R2],X) :- _数 < N, 降順の挿入(_数,[N|R2],Y), 要素数の少ない降順整列(R1,Y,X). 降順の挿入(_数,[],[_数]) :- !. 降順の挿入(_数,[N|R],[_数,N|R]) :- _数 >= N,!. 降順の挿入(_数,[N|R1],[N|R2]) :- _数 < N,降順の挿入(_数,R1,R2). '5つの数を得る'(0,[]) :- !. '5つの数を得る'(M,[T|R]) :- write_formatted('小さな数を入力して改行してください(残り%t個) : ',[M]), get_line(Line), atom_to_term(Line,T,_), M1 is M - 1, '5つの数を得る'(M1,R),!. '5つの数を得る'(M,X) :- write('正しい入力がえられませんでした\nもう一度入力してください\n'), '5つの数を得る'(M,X). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/42 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):問題の基準に従い、 # 任意のローカルフォルダに置いた、指定したwords.txtの指定行から # 指定した行数の英単語を読み込み、 # マージソートをして表示するプログラムを作成せよ。 # 同じようにヒープソートや基数ソートのプログラムも作成せよ。 # 問題の定義はhttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9906.txt # 指定されたwords.txtは # http://nojiriko.asia/data/words.txt にコピーさせていただきました。 # 単語の綴りを逆に並べた際の(ASCIIコードに基づく)辞書順に並び替えよ。 # たとえば"a","b""aa","ab","za","aaa"をこの基準で並べると、 # "a","aa","za","aaa","b","ab"となる。 # ただし、マージソートはボトムアップ方式で実行し、連結リストを用いて # 新たに別の列を作らずに、一方の列に他方の列のノードを挿入することで実現する。 # マージソートは下に指定した構成でプログラムを書くこと。 # # /*適切なファイルをインクルード*/ # # #define WORDS_START 100000 /*開始行目*/ # #define WORDS_NUM 10 /*抽出する単語数(10,100などさまざまな値で試せ)*/ # #define WORD_LIMIT 64 /*単語の文字数の最大数*/ # 開始行(100000). 抽出する単語数(10). 単語の文字数の最大数(64). t634(_整列されたならび) :- 開始行(_開始行), 抽出する単語数(_抽出する単語数), 単語の文字数の最大数(_単語の文字数の最大数), n行目まで読み飛ばす('words.txt',_開始行,Input), 対象となる語ならびを得る(Input,_抽出する単語数,L), close(Input), 文字列の反転と文字数の調整(L,L2), 先頭から挿入して整列する(L2,[],_整列されたならび). 対象となる語ならびを得る(Input,_抽出する単語数,L) :- findall(X,(for(1,N,_抽出する単語数),get_line(Input,_,X)),L). 文字列の反転と文字数の調整(_,[],[]) :- !. 文字列の反転と文字数の調整(_単語の文字数の最大数,[_語|R1],[_反転した語|R2]) :- atomic_length(_語,Len), Len > _単語の文字数の最大数,!, atom_reverse(_語,反転した語_1), sub_atom(_反転した語_1,0,_単語の文字数の最大数,_,_反転した語), 文字列の反転と文字数の調整(_単語の文字数の最大数,R1,R2). 文字列の反転と文字数の調整(_単語の文字数の最大数,[_語|R1],[_反転した語|R2]) :- atom_reverse(_語,反転した語), 文字列の反転と文字数の調整(_単語の文字数の最大数,R1,R2). 先頭から挿入して整列する([],X,X) :- !. 先頭から挿入して整列する([A|R],Y,X) :- 整列するように挿入する(A,Y,Z), 先頭から挿入して整列する(R,Z,X). 整列するように挿入する(A,[],[A]) :- !. 整列するように挿入する(A,[B|R],[A,B|R]) :- A @=< B,!. 整列するように挿入する(A,[B|R1],[B|R2]) :- A @> B, 整列するように挿入する(A,R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % *** user: 'n行目まで読み飛ばす' / 3 *** 'n行目まで読み飛ばす'(File,1,Input) :- open(File,read,Input),!. 'n行目まで読み飛ばす'(File,N,Input) :- open(File,read,Input), N2 is N - 1, for(1,M,N2), get_line(Input,_診断,_), ( _診断 = '終了', close(Input), !, fail ; true ), M = N2,!. % *** user: get_line / 3 *** get_line(Instream,_診断,X) :- get_char(Instream,C), get_line_3(Instream,_診断,C,Chars), atom_chars(X,Chars),!. % *** user: get_line_3 / 4 *** get_line_3(_,'連続','\n',[]) :- !. get_line_3(Instream,_診断,'\r',X) :- get_char(Instream,C2), get_line_3_2(Instream,_診断,C2,X),!. get_line_3(Instream,'終了',end_of_file,[]) :- !. get_line_3(Instream,_診断,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,_診断,C2,R). % *** user: get_line_3_2 / 4 *** get_line_3_2(Instream,'連続','\n',[]) :- !. get_line_3_2(Instream,_診断,C,['\r'|R]) :- \+(C == '\n'), get_line_3(Instream,_診断,C,R),!. % 以下のサイトは # 出典:: http://ime.nu/pc12.ch.net/test/read.cgi/tech/1247438792/887 # # [1] 授業単元:ic論 # [2] 問題文 # キーボードから入力した二つの単語を辞書的順序に表示するプログラムを作れ。 # 条件は # ・関数の呼び出しを使う(main関数とstrcomp関数を使う) # ・ポインタを使う # ・配列を使う # # ・例は # 「2つの単語を入力してください。 #  red,green # # キーボードから入力した二つの単語を辞書的順序に表示する :- キーボードから入力した二つの単語を(_単語ならび), 辞書的順序整列(_単語ならび,_辞書的順序に並べかえた単語ならび), 表示する(_辞書的順序に並べかえた単語ならび). キーボードから入力した二つの単語を([_単語_1,_単語_2]) :- write('二つの単語をカンマ区切りで入力してください : '), readln([_単語_1,_単語_2|_]). 辞書順整列([],[]) :- !. 辞書順整列([_単語],[_単語]) :- !. 辞書順整列([_基単語|_単語ならび],_辞書順に整列された単語ならび) :- atom_chars(_基単語,_文字ならび2), 辞書順整列分割(_単語ならび,_文字ならび2,_より小さい単語ならび,_より大きい単語ならび), 辞書順整列(_より小さい単語ならび,_辞書順に整列された単語ならび1), 辞書順整列(_より大きい単語ならび,_辞書順に整列された単語ならび1), append(_辞書順に整列された単語ならび1,[_基単語|_辞書順に整列された単語ならび2],_辞書順に整列された単語ならび). 辞書順文字ならび比較([],[],=). 辞書順文字ならび比較([A|R1],[A|R2],_判定) :- 辞書順文字ならび比較(R1,R2,_判定),!. 辞書順文字ならび比較([A|R1],[B|R2],<) :- \+(A==B), to_upper(B,A),!. 辞書順文字ならび比較([A|R1],[B|R2],>) :- \+(A==B), to_upper(A,B),!. 辞書順文字ならび比較([A|R1],[B|R2],>) :- A @> B,!. 辞書順文字ならび比較([A|R1],[B|R2],<) :- A @< B,!. 辞書順整列分割([],_,[],[]) :- !. 辞書順整列分割([_単語|R1],_文字ならび2,_より小さい単語ならび,_より大きい単語ならび) :- atom_chars(_単語,_文字ならび1), 辞書順文字ならび比較(_文字ならび1,_文字ならび2,>), 辞書順整列分割(R1,_文字ならび2,_より小さい単語ならび,[_単語|_より大きい単語ならび]),!. 辞書順整列分割([_単語|R1],_文字ならび2,_より小さい単語ならび,_より大きい単語ならび) :- 辞書順整列分割(R1,_文字ならび2,[_単語|_より小さい単語ならび],_より大きい単語ならび). 表示する(_辞書的順序に並べかえた単語ならび) :- append(_,[_単語|R],_辞書的順序に並べかえた単語ならび), writef('%t\n',[_単語]), R = []. % 以下のサイトは 勤務体制(X) :- 開館時刻(_開館時刻), 勤務体制(_開館時刻,[],X), 全員が勤務できる(X). 勤務体制(_時刻,Y,X) :- 閉館時刻(_時刻), Y = [[_|A],[_|B]|_], 全解探索(_人,(要素(_人,A),要素(_人,B) ではない),[]), ならびの反転(Y,X),!. 勤務体制(_時刻,Y,X) :- 閉館時刻(_時刻) ではない, 時刻別勤務体制(_時刻,Y,[],_勤務体制), length(_勤務体制,Len), 必要人数(_時刻,_必要人数), Len > 0, Len >= _必要人数, 男性がいる(_勤務体制), 役職者がいる(_勤務体制), 連続勤務検査(_勤務体制,Y), _時刻の二 is _時刻 + 1, 勤務体制(_時刻の二,[[_時刻|_勤務体制]|Y],X). 時刻別勤務体制(_時刻,U,Y,X) :- 人員選択(_時刻,U,Y,_人), 時刻別勤務体制(_時刻,U,[_人|Y],X). 時刻別勤務体制(_時刻,_,X,X). 連続勤務検査(_勤務体制,X) :- 全解探索(_人,(人員(_人,_),要素(_人,_勤務体制) ではない),L), 連続勤務検査の二(L,X). 連続勤務検査の二([],_) :- !. 連続勤務検査の二([_人|_],[[_|A]]) :- 要素(_人,A), !,fail. 連続勤務検査の二([_人|_],[[_|A],[_|B]|_]) :- 要素(_人,A), 要素(_人,B) ではない,!, fail. 連続勤務検査の二([_人|R],X) :- 連続勤務検査の二(R,X). 連続勤務限界を越えた(_人,X) :- 連続勤務限界時間(_限界時間), 連続勤務限界を越えた(1,_限界時間,_人,X). 連続勤務限界を越えた(N,N,_,_) :- !. 連続勤務限界を越えた(M,N,_人,[[_|A]|R]) :- member(_人,A), M2 is M+1, 連続勤務限界を越えた(M2,N,_人,R),!. 男性がいる([_人|_]) :- 性別(_人,男),!. 男性がいる([_|R]) :- 男性がいる(R). 女性の役職者がいない([]) :- !. 女性の役職者がいない([_人|_]) :- 役職(_人,_), 性別(_人,女),!,fail. 女性の役職者がいない([_|R]) :- 女性の役職者がいない(R). 役職者がいる([_人|_]) :- 役職(_人,_),!. 役職者がいる([_|R]) :- 役職者がいる(R). 所長と副所長が共にいる(_人,_勤務体制候補) :- 役職(_人,所長), member(_所長候補,_勤務体制候補), 役職(_所長候補,所長),!. 所長と副所長が共にいる(_人,_勤務体制候補) :- 役職(_人,副所長), member(_副所長候補,_勤務体制候補), 役職(_所長候補,副所長),!. アルバイトの男女が一緒(_人,X) :- 役職(_人,_) ではない, 性別(_人,男), findall(FM,(member(A,X),役職(A,_) ではない,性別(A,FM)),L), member(女,L), 女性の役職者がいない(X),!. アルバイトの男女が一緒(_人,X) :- 役職(_人,_) ではない, 性別(_人,女), findall(FM,(member(A,X),役職(A,_) ではない,性別(A,FM)),L), member(男,L), 女性の役職者がいない(X),!. 全員が勤務できる(X) :- findall(U,人員(U,_),L), sort(L,L1), findall(V,member([_|V],X),L2), flat(L2,L3), sort(L3,L1). /* 役職者を先に定義すること */ 人員(像一,1). 人員(項,2). 人員(彩,3). 人員(ミルク,4). 人員(モヘ,5). 人員(ビー,6). 人員(チー,7). 人員選択(_時刻,U,X,_人) :- 人員(_人,_人員順序), 用事(_人,_時刻) ではない, U=[[_|[_人]]|_] ではない, (要素(A,X),人員(A,B),B>=_人員順序) ではない, 所長と副所長が共にいる(_人,X) ではない, アルバイトの男女が一緒(_人,X) ではない, 連続勤務限界を越えた(_人,U) ではない. 必要人数(_時刻,1) :- _時刻 >= 19,!. 必要人数(_,2). 用事(像一,9). 用事(像一,11). 用事(項,11). 用事(項,14). 用事(彩,14). 用事(モヘ,N) :- N >= 9, N =< 14. /* 用事(モヘ,9). 用事(モヘ,10). 用事(モヘ,15). 用事(モヘ,16). */ 用事(ビー,10). 用事(チー,12). 用事(チー,16). 用事(ビー,12). 用事(ビー,13). 用事(ビー,16). 用事(ミルク,9). 用事(ミルク,10). 用事(ミルク,15). 用事(彩,10). 用事(彩,19). 用事(項,20). 用事(ミルク,17). 用事(チー,15). 用事(ビー,N) :- N >= 17. 用事(チー,N) :- N >= 17. 用事(モヘ,N) :- N >= 17. 性別(像一,男). 性別(項,男). 性別(彩,女). 性別(モヘ,女). 性別(ビー,女). 性別(ミルク,男). 性別(チー,女). 役職(像一,所長). 役職(項,副所長). 役職(彩,主任). 時間給(像一,_,2600). 時間給(項,_,2000). 時間給(彩,_,1800). 時間給(ミルク,_,950). 時間給(モヘ,_時刻,780) :- _時刻 >= 18,!. 時間給(モヘ,_,760). 時間給(ビー,_時刻,820) :- _時刻 >= 18,!. 時間給(ビー,_,800). 時間給(ミルク,_時刻,900) :- _時刻 >= 18,!. 時間給(チー,_,850). 連続勤務限界時間(3). 支給額合計([],0) :- !. 支給額合計([[_時刻|L]|R],S) :- 支給額合計(R,S1), findall(U,(member(V,L),時間給(V,_時刻,U)),L2), 加算(L2,S2), S is S1+S2. 開館時刻(9). 閉館時刻(21). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/689 # # [2] 問題文(含コード&リンク): POSデータ解析システムを作ってみよう # K氏は、3つのコンビニエンスストア(X店、Y店、Z店)をチェーン店に持つオーナーです。コンビ # ニエンスストアの経営において、売れ筋商品と死に筋商品の的確な把握は死活問題に直結する重要な業務 # です。そこでK氏は、チェーン店に、毎日どんな商品がどれくらい売れたのかといった販売情報を、CS # Vファイルとして送るように指示していました。しかし、送られてくるデータファイルは膨大であり、そ # れらを統合して、全店を通して最も売れた商品はどれで、何が売れていないかを把握することは困難でし # た。つまり、送られてくるデータを適切に活用できないでいました。そこで、K氏はあなたに、こういっ # たことを解決するシステム(POSデータ解析システム)を開発するように頼みました。K氏は、毎日送 # られてくるX、Y、Z店の個別の販売情報を合計した一括データを入手したいそうです。 # <第1ステップ> # まず、あなたは、各店舗から送ってもらうCSV ファイル名を以下のようにするよう、お願いしました。 # X店=data-x.csv Y店=data-y.csv Z店=data-z.csv # また、商品名(全100 品種)は必ず以下の形式で入力するように指示しました。 # 「 Item-00 」から「 Item-99 」までの半角7文字 # さらに、各店から送られてくるレコードのフィールドは、以下の項目にして、売上時刻順に並べてもら # うよう、お願いしました。以下のようなCSV ファイルが送られてくることになります。 # 売上時刻 商品名 売上個数 # 0:12,Item-42,2 # 0:12,Item-03,1 # 0:49,Item-92,3 # ・ # ・ # 23:38,Item-80,1 # また、毎日送られてくるCSVファイルとは別に、単価情報が格納された tanka.csv ファイルを作りま # した。このファイルのレコードのフィールドは、次のようになっていて、商品名順に並んでいます。 # 商品名 単価 # Item-00,150 # Item-01,120 # ・ # Item-99,230 # 最後に、K 氏に提供する統合ファイル(data-all.csv)のレコードの中身は以下のようにして、商品名 # の小さい順にレコードを作りました。 # 商品名 単価 総売上個数 売上高 # ここで、大事なことは、売上情報を統合することです。例えば、単価150 円のItem-23 という商品が、 # X 店では15 個、Y 店では、25 個、Z 店では10 個売れたとすると、以下のようになっているということです。 # Item-23,150,50,7500 # また、全店舗を通して1 個も売れなかった商品情報は載せないことにしました。 # # # <第2ステップ> # K氏から、data-all.csv のレコードの中身を以下のように変更し、レコードを並べる順番も、これまで # の商品名順ではなく、売上順位の高い順にして欲しいと要望がありました。 # 売上順位 商品名 単価 総売上個数 売上高 全売上高にしめる割合(%) # 全売上高とは、全商品の売上高の合計です。全売上高にしめる割合の有効数字は4 桁(10%未満の場合は # 3 桁)にします。例えば、全売上高が100 万円で、該当商品の売上高が12,345 円だとすると、割合(%) # は 1.23 となります。 # 売上順位は、同じ売上高の場合は同一順位とします。 # 例えば、data-all.csv ファイルは次のようになります。 # 1,Item-23,150,50,7500,10.71 # 2,Item-52,240,30,7200,10.28 # 2,Item-53,360,20,7200,10.28 # 4,Item-14,230,30,6900,9.85 # ・ t589_1 :- 基礎情報を得る(TL,XL,YL,ZL), 3つのコンビニエンスストアの情報を集約する第1ステップ(XL,YL,ZL,TL,_集約ならび), _集約情報から統合ファイル出力(_集約ならび). t589_2 :- 基礎情報を得る(TL,XL,YL,ZL), 3つのコンビニエンスストアの情報を集約する第2ステップ(XL,YL,ZL,TL,_集約ならび), 集約情報から金額順位順統合ファイル出力(_集約ならび). 基礎情報を得る(TL,XL,YL,ZL) :- get_split_lines('tanka.csv',[',',' '],TL), get_split_lines('data-x.csv',[',',' '],XL), get_split_lines('data-y.csv',[',',' '],YL), get_split_lines('data-z.csv',[',',' '],ZL),!. '3つのコンビニエンスストアの情報を集約する第1ステップ'(XL,YL,ZL,TL,_集約ならび) :- append(XL,YL,ZL,L1), 売上の存在する商品名を得る(L1,_商品名ならび), findall([_商品名,_単価,_数量,_金額], ( member(_商品名,_商品名ならび), member([_商品名,_単価],TL), 商品合計数量を得る(_商品名,_合計数量), _金額 is _合計数量 * _単価), _集約ならび). '3つのコンビニエンスストアの情報を集約する第2ステップ'(XL,YL,ZL,TL,_集約ならび) :- append(XL,YL,ZL,L1), 売上の存在する商品名を得る(L1,_商品名ならび), findall([_商品名,_単価,_数量,_金額], ( member(_商品名,_商品名ならび), member([_商品名,_単価],TL), 商品合計数量を得る(_商品名,_合計数量), _金額 is _合計数量 * _単価), _集約ならびの一), rsort(_集約ならびの一,_金額合計で整列した集約ならび), 総売上金額を得る(_集約ならびの一,_総売上金額), 順位売上比率付き集約ならび(1,1,_金額合計で整列した集約ならび,_集約ならび). 総売上金額を得る(_集約ならびの一,_総売上金額) :- findsum(_金額合計,member([_金額合計,_,_,_],_集約ならびの一),_総売上金額). 順位売上比率付き集約ならび(_,_,_,[],[]) :- !. 順位売上比率付き集約ならび(M,N,_総売上金額,[[A,B,C,D],[A|R2]|R3],[[M,B,C,D,A,E]|R4]) :- E is A / _総売上金額, N2 is N + 1, 順位売上比率付き集約ならび(M,N2,[[A|R2]|R3],R4). 順位売上比率付き集約ならび(M,N,_総売上金額,[[A,B,C,D]|R3],[[M,B,C,D,A,E]|R4]) :- E is A / _総売上金額, N2 is N + 1, 順位売上比率付き集約ならび(N2,N2,R3,R4). 集約情報から統合ファイル出力(L) :- open('data-all.csv',write,Output), ( member([_商品名,_単価,_数量,_金額],L), concat_atom([_商品名,_単価,_数量,_金額],',',S), write_formatted(Output,'%t\n',[S]), fail; close(Output), ),!. 集約情報から金額順位順統合ファイル出力([]). 集約情報から金額順位順統合ファイル出力([[A,B,C,D,E,F]|R]) :- F2 is round(F * 100.0) / 100, write_formatted_atom(S,'%t,%t,%t,%t,%t,%.2f',[A,B,C,D,E,F2]), write_formatted('%t\n',[S]), 集約情報から金額順位順統合ファイル出力(R). 商品合計数量を得る(_商品名,_合計数量) :- findsum(_数量,member([_,_商品名,_数量],_合計数量). 売上の存在する商品名を得る(L1,_整列してユニークな商品名ならび) :- 商品名のみ選択(L1,L2), sort(L2,_整列してユニークな商品名ならび). 売上の存在する商品名を得る(L1,_商品名ならび), member(_商品名,_商品名ならび), findall([_商品名,_単価,_数量,_金額], ( member([_商品名,_単価],TL), member([_,_商品名,_数量],L1), _金額 is _数量 * _単価), _集約ならび). 売上の存在する商品名を得る(L1,_整列してユニークな商品名ならび) :- 商品名のみ選択(L1,L2), sort(L2,_整列してユニークな商品名ならび). 商品名のみ選択([],[]) :- !. 商品名のみ選択([[_,A,_]|R1],[A|R2]) :- 商品名のみ選択(R1,R2). rsort(L,L2) :- sort(L,L1), reverse(L1,L2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/604 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9849.txt # 配列を引数とする再帰呼び出しによるマージソート # #  入出力配列を引数とする再帰的手続きを作成し、マージソートを実現せよ。 # ただし、各入力要素X[i]は整数値をとるものとする。関数として、 # 長さnの配列Xをマージソートによって小さい順に並べ替えた配列Yを求める # msort(int X[],int n,int Y[]),すでに並べ替えられている長さn1の配列Y1と長さn2の # 配列Y2を併合した配列Yを求めるmerge(int Y1[],int n1,int Y2[],int n2,intY[]), # 長さnの配列Xの各要素のアドレス、ならびに内容を # 表示するshow_addr(int X[],int n)を用意する。 debug(off). msort([],[]). msort([X],[X]). msort(_ならび,_sortされたならび) :- ならびを分割(_ならび,_ならび1,_ならび2), show_list(分割,[_ならび,_ならび1,_ならび2]), msort(_ならび1,_整列されたならび1), show_list(msort,[ならび1,_整列されたならび1]), msort(_ならび2,_整列されたならび2), show_list(msort,[ならび2,_整列されたならび2]), merge(_整列されたならび1,_整列されたならび2,_整列されたならび), show_list(merge,[_整列されたならび1,_整列されたならび2,_整列されたならび]). ならびを分割([],[],[]). ならびを分割([X],[X],[]). ならびを分割([A,B|R1],[A|R2],[B|R3]) :- ならびを分割(R1,R2,R3). merge([],X,X) :- !. merge(X,[],X) :- !. merge([A|R1],[B|R2],[A|R3]) :- A @< B,merge(R1,[B|R2],R3). merge([A|R1],[B|R2],[B|R3]) :- A @>= B,merge([A|R1],R2,R3). show_list(_,_) :- debug(off). show_list(_述語,_ならびのならび) :- debug(on),write_formatted('%t: %t\n',[_述語, % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/535 # # [1] C++ # [2] 問題文(含コード&リンク): # (1) 演算子+,-,*,/と整数と浮動小数点数からなる計算式の文字列から # 計算木を作成せよ。計算木は次のようなc_tree構造体を使うとする。 # # struct c_tree # { # int type; # union { int n_value; double d_value; }; # c_tree *left, *right; # }; # typeは、'+', '-', '*', '/', 'n', 'd'のいずれか。 # # (2) 優先順位に注意してc_tree構造体からなる計算木から # 計算式の文字列を作成せよ。 文字列から式の生成(_文字列,_式) :- atom_chars(_文字列,Chars), 語彙の切り出し(Chars,_語彙ならび,OpsX,_), 結合度評価(OpsX,_語彙ならび,_式). 語彙の切り出し(L,X,OpsX,R) :- 語彙の切り出しの一(L1,Y,[],OpsX,R), 数値への変換(Y,X),!. 語彙の切り出しの一([],[],OpsX,OpsX,[]) :- !. 語彙の切り出しの一([')'|L1],[],OpsX,OpsX,L1) :- !. 語彙の切り出しの一(['('|L1],[L2|R2],OpsY,OpsX,R) :- 括弧構造の解析(L1,L2,OpsY,OpsX1,R1), 語彙の切り出しの一(R1,R2,OpsX1,OpsX,R). 語彙の切り出しの一(L1,[C|R2],OpsY,OpsX,R) :- is_op(A,B,C), member([A,B,C],OpsY), atom_chars(C,Chars), append(Chars,R1,L1), 語彙の切り出しの一(R1,R2,OpsY,OpsX,R). 語彙の切り出しの一([A|R1],R2,OpsY,OpsX,R) :- member(A,[' ','\t','\n']), 語彙の切り出しの一(R1,R2,OpsY,OpsX,R),!. 語彙の切り出しの一(L1,[C|R2],OpsY,OpsX,R) :- is_op(A,B,C), not(member([A,B,C],OpsY)), atom_chars(C,Chars), append(Chars,R1,L1), 語彙の切り出しの一(R1,R2,[[A,B,C]|OpsY],OpsX,R). 語彙の切り出しの一(L1,[W|R2],OpsY,OpsX,R) :- 語彙の切り出しの二(L1,G,L2), 数値表現への変換(G,W), 語彙の切り出しの一(L2,R2,OpsY,OpsX,R). 語彙の切り出しの二([],[],[]) :- !. 語彙の切り出しの二([')'|R],[],[')'|R]) :- !. 語彙の切り出しの二([' '|R],[],R) :- !. 語彙の切り出しの二(['\t'|R],[],R) :- !. 語彙の切り出しの二(L1,[],L1) :- is_op(A,B,C), atom_chars(C,Chars), append(Chars,R,L1),!. 語彙の切り出しの二([A|R1],[A|R2],R) :- 語彙の切り出しの二(R1,R2,R). 括弧構造の解析([')'|R],[],OpsX,OpsX,R). 括弧構造の解析(L,L1,OpsY,OpsX,R) :- 語彙の切り出しの一(L,L1,OpsY,OpsX,R). 結合度評価(_式に現れるop,_語彙ならび,_項) :- sort(_式に現れるop,_整列したop), reverse(_整列したop,_結合度順op), 結合度評価の一(_結合度順op,_語彙ならび,_項). 結合度評価の一(_,[A],A) :- atomic(A),!. 結合度評価の一([[_結合度,yfx,Op]|R1],_語彙ならび,P) :- append(L1,[Op|L2],_語彙ならび), 結合度評価の一([[_結合度,yfx,Op]|R1],L1,X1), 結合度評価の一([[_結合度,yfx,Op]|R1],L2,X2), functor(P,Op,2), arg(1,P,X1), arg(2,P,X2),!. 結合度評価の一([_|R1],_語彙ならび,P) :- 結合度評価の一(R1,_語彙ならび,P). 数値へ変換(L,_数値,R) :- 整数生成(L,_数値,R,),!. 数値へ変換(L,_数値,R) :- 浮動小数点数生成(L,_数値,R),!. 整数生成([A|R],N,R) :- atom_chars(A,L), length(L,Len), 整数生成の一(L,_,N),!. 整数生成の一([],1,0) :- !. 整数生成の一([A|R1],U,X) :- 文字整数変換(A,N), 整数生成の一(R1,U2,Y), U is U2 * 10, X is N * U2 + Y,!. 文字整数変換('0',0). 文字整数変換('1',1). 文字整数変換('2',2). 文字整数変換('3',3). 文字整数変換('4',4). 文字整数変換('5',5). 文字整数変換('6',6). 文字整数変換('7',7). 文字整数変換('8',8). 文字整数変換('9',9). 浮動小数点数生成([A,(+),C|R],F,R) :- sub_atom(A,_,1,0,e), concat_atom([A,(+),C],D), atom_chars(D,L), 浮動小数点数生成の一(L,_F),!. 浮動小数点数生成([A,(-),C|R],F,R) :- sub_atom(A,_,1,0,e), concat_atom([A,(+),C],D), atom_chars(D,L), 浮動小数点数生成の一(L,_,F),!. 浮動小数点数生成([A|R],F,R) :- atom_chars(A,L), 浮動小数点数生成の一(L,_,F). 浮動小数点数生成の一(L,'e+',F) :- append(L1,['e','+'|L2],L), append(L11,['.'|L12],L1), length(L12,Len1), 浮動小数点数の一(L1,'.',F1), F is F1 * (10 ^ Len1). 浮動小数点数生成の一(L,'e-',L11,L12,L2) :- append(L1,['e','+'|L2],L), append(L11,['.'|L12],L1), length(L12,Len1), 浮動小数点数の一(L1,'.',F1), F is F1 / (10 ^ Len1). 浮動小数点数生成の一(L,'.',F) :- append(L1,['.'|L2],L), length(L2,Len), append(L1,L2,L3), 整数生成の一(L3,_,N), F is N / ( 10 ^ Len),!. is_op(400,yfx,(+)). is_op(400,yfx,(-)). is_op(500,yfx,(*)). is_op(500,yfx,(*)). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/291 # # [1] 授業単元:コンピュータリテラシー # [2] 問題文(含コード&リンク):問題文と参考は以下です #   http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9806.txt # ・試験の過程を記録 # 1,番号、得点を入力したあと平均点を計算 # 2,番号順と得点順に並べ替え(ifを使いどちらか選択できるようにする) # 3,番号、得点、平均との差を出力 # 以上のプログラムを作成 成績を記録する :- write('番号と得点をスペースで区切って一行で入力してください\n'), get_line(_行), 成績を記録する(_行). 成績を記録する(end_of_file) :- !. 成績を記録する(_行) :- split(_行,[' '],[_番号,_得点]), assertz(成績(_番号,_得点)), get_line(_次の行), 成績を記録する(_次の行). 平均点(_平均点) :- findavg(_得点,成績(_,_得点),_平均点). 番号順に並べ直し(_番号順成績ならび) :- findall([_番号,_得点],成績(_番号,_得点),_成績ならび), quicksort(_成績ならび,_番号順成績ならび). 得点順に並べ直し(_得点順成績ならび) :- findall([_得点,番号],成績(_番号,_得点),_得点・番号成績ならび), quicksort(_得点・番号成績ならび,_整列した得点・番号ならび), 項目位置を元に戻す(_整列した得点・番号ならび,_得点順成績ならび). 項目位置を元に戻す([],[]). 項目位置を元に戻す([[A,B]|R1],[[B,A]|R2]) :- 項目位置を元に戻す(R1,R2). 番号、得点、平均との差の出力 :- 平均点(_平均点), write('番号 得点 平均との差\n'), 成績(_番号,_得点), _平均との差 is _得点 - _平均点, write_formatted('%t %t %t\n',[_番号,_得点,_平均との差]), fail. 番号、得点、平均との差の出力. quicksort([],[]) :- !. quicksort([X|Xs],Ys) :- partition(Xs,X,Littles,Gigs), quicksort(Littles,Ls), quicksort(Bigs,Bs), append(Ls,[X|Bs],Ys). partition([],Y,[],[]) :- !. partition([X|Xs],Y,[X|Ls],Bs) :- X @=< Y,partition(Xs,Y,Ls,Bs). partition([X|Xs],Y,Ls,[X|Bs]) :- X @> Y,partition(Xs,Y,Ls,Bs). %%%%%%%% findavg/3 加算/2 他 %%%%%%%%%%%%%%%%%%%% :- op(A,B,は). findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), '加算'(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. 加算(trunc(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A is trunc(B)),SL),!. 加算(四捨五入(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 四捨五入(B)),SL),!. 加算(切捨て(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切捨て(B)),SL),!. 加算(切り上げ(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切り上げ(B)),SL),!. 加算([],L) :- var(L), L = 0.0e+00,!. 加算([],L) :- \+(var(L)), 加算の変数に零をおく(L),!. 加算([L|R],SL) :- ならび(L), 行列の転置([L|R],L1), 加算_2(L1,SL),!. 加算(X,S) :- 加算_1(X,0.0e+00,S) . 加算_1([],S,S) :- !. 加算_1([A|R],Y,S) :- ならび(A), ならび(Y), !, ならび加算(A,Y,Z), 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), 加算_1(R,Y,S),!. 加算_1([A|R],Y,S) :- A1 は A, Z is A1 + Y, 加算_1(R,Z,S). 加算_1(A,Y,S) :- とからりすと(A,L), !, 加算_1(L,Y,S) . 加算_2([],[]) :- !. 加算_2([L|R],[S|R2]) :- 加算(L,S), 加算_2(R,R2). 加算の変数に零をおく([]) :- !. 加算の変数に零をおく([A|R]) :- 変数(A), A = 0.0e+00, 加算の変数に零をおく(R),!. とからりすと(A,[A]) :- atomic(A),!. とからりすと(A と B,C) :- とからりすと(A,A1), とからりすと(B,B1), append(A1,B1,C). 変数(_変数) :- var(_変数). ならび([_|_]). _項 は (_ネットワーク :: _式) :- _ネットワーク :: _項 は _式, ! . _評価項 は N : L :- M は N, L1 は L, list_nth(M,L1,_評価項), ! . _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail) . _評価値 は [X|{P}] :- findall(X,P,_評価値), ! . _評価項 は ` _値 :- !, _評価項 = _値, ! . _項 は _式 :- var(_式), _項 = _式, ! . _項 は _式 :- error_protect(一時関数定義(_式,_項),fail) . _項 は _式 :- atom(_式), member(_式,[minint,maxint,cputtime,time,csize,cused,dbsize,dbused,gsize,gused,noptrs,ptrsued,ssize,sused,tsize,tused]), !, _項 is _式, ! . _項 は _式 :- 二項組込み関数(_式), 二項組込み関数の評価(_式,_項) . _項 は _式 :- 二項組込み関数(_式), !, fail . _項 は _式 :- functor(_式,Functor,1), arg(1,_式,Arg), Y は Arg, functor(_式_1,Functor,1), arg(1,_式_1,Y), member(Functor,[atom,real,integer,var,float,list]), !, error_protect(_式_1,fail), _項 = Y, ! . _項 は _式 :- atom(_式), error_protect(get_global(_式,_項),fail), ! . _項 は _式 :- real(_式), _項 = _式, ! . _項 は _式 :- real(_式), !, fail . _項 は _式 :- list(_式), findall(X,(member(U,_式) , X は U),_項) . _項 は _式 :- list(_式), !, fail. _項 は _erlang_module : _erlang関数 :- erlang関数評価(_erlang_module : _erlang関数,_項),!. _項 は _式 :- 関数定義(_式,_項),!. _項 は _式 :- functor(_式,_関数,_次数), function(_関数,_次数), findall(Arg,(for(1,N,_次数) , arg(N,_式,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), _式の二 =.. [_関数|L2], error_protect(_項 is _式の二,fail) . _項 は _評価関数 :- error_protect(_項 is _評価関数,fail),!. _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail),!. _項 は _評価項 :- 述語評価が可能(_評価項,_関数,_次数,_次数足す一), _評価項 =.. _評価項の項分解ならび, findall(Arg,(for(1,N,_次数) , arg(N,_評価項,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), append(L2,[_],_変数を付加した引数ならび), _解付き評価項 =.. [_関数|_変数を付加した引数ならび], error_protect(_解付き評価項,fail), arg(_次数足す一,_解付き評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), error_protect(_評価項,fail), arg(Arg,_評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), \+(error_protect(_評価項,fail)), _評価項 = _項,!. _項 は _式 :- atomic(_式), \+(述語評価が可能(_式,_関数,_次数,_次数足す一)), _項 = _式,!. 述語評価が可能(_評価項,_関数,_次数,_次数足す一) :- functor(_評価項,_関数,_次数), _次数足す一 is _次数 + 1, \+(predicate_type(_関数,_次数足す一,undefined)),!. 関数評価に於いて引数部分の関数評価([],[]). 関数評価に於いて引数部分の関数評価([L|R1],[L2|R2]) :- list(L), !, 関数評価に於いて引数部分の関数評価(L,L2), 関数評価に於いて引数部分の関数評価(R1,R2), ! . 関数評価に於いて引数部分の関数評価([F|R1],[F|R2]) :- \+(error_protect(F2 は F,fail)), !, 関数評価に於いて引数部分の関数評価(R1,R2) . 関数評価に於いて引数部分の関数評価([F|R1],[F2|R2]) :- error_protect(F2 は F,fail), 関数評価に於いて引数部分の関数評価(R1,R2) . erlang関数評価(os : cmd(Command),_項) :- erlang :: (os : cmd(Command) -> _項_1), _項 は string2atom(_項_1),!. erlang関数評価(_erlang_module : _erlang関数,_項) :- erlang :: (_erlang_module : _erlang関数 -> _項),!. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, number(_値の一), _値の二 は _項の二, number(_値の二), _値 is _値の一 + _値の二, !. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 + _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, list(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),LY), concat_list(LY,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atom(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),L), concat_atom(L,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 * _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(` _値,_値) :- !. 関数定義(@ _式,_値) :- _値 は _式,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _値の二 >= 0.0e+00, _四捨五入後の値 is floor(_値の二 + 0.5) * 1.0,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 is ceil(_値の二 - 0.5),!. 関数定義(切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二) * 1.0,!. 関数定義(切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二),!. 関数定義(十円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 10 + 0.5) * 10,!. 関数定義(十円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は trunc(_値の二 / 10) * 10,!. 関数定義(十円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 10) * 10,!. 関数定義(百円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 100 + 0.5) * 100,!. 関数定義(百円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 100) * 100,!. 関数定義(百円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二 / 100) * 100,!. 関数定義(整数化(_値),_整数化された値) :- _値の二 は _値, _整数化された値 is trunc(_値の二),!. 関数定義(char_code(_項),_値) :- ( atom(_項), atomic_length(_項,1), char_code(_項,_値) ; integer(_項), char_code(_値,_項) ; 複合項(_項), _項の一 は _項, _値 は char_code(_項の一) ), !. 関数定義($ _大域変数名,_値) :- atom(_大域変数名), get_global(_大域変数名,_値の一), _値 は _値の一,!. 関数定義(S,E) :- functor(S,select,1), to(S,E),!. 関数定義(setq(A,B),E) :- atom(A), B1 は B, set_global(A,B1), E = B1,!. 関数定義(++ A,X) :- A1 は A, list(A1), 加算(A1,X),!. 関数定義(A ++ B,X) :- C is B / A, X = A + C + B,!. 関数定義(car(A),E) :- A1 は A, A1 = [E|_],!. 関数定義(cdr(A),E) :- A1 は A, A1 = [_|E],!. 関数定義(cons(A,B),E) :- A1 は A, B1 は B, E = [A1|B1],!. 関数定義(length(A),E) :- A1 は A, list(A1), length(A1,E),!. 関数定義(decode(A,B,C,D),E) :- A1 は A, B1 は B, A1 = B1, E は C,!. 関数定義(decode(A,B,C,D),E) :- E は D,!. 関数定義(decompcons(A),E) :- A1 は A, decompcons(A1,E),!. 関数定義(substr(A,B,C),E) :- 関数定義(subatomic(A,B,C),E),!. 関数定義(subatomic(A,B,C),E) :- A1 は A, B1 は B, C1 は C, subatomic(A1,B1,C1,E),!. 関数定義(concat(A),E) :- A1 は A, concat(A1,E),!. 関数定義(concat(A,B),E) :- A1 は A, B1 は B, concat(A1,B1,E),!. 関数定義(append(A,B),E) :- A1 は A, B1 は B, append(A1,B1,E),!. 関数定義(reverse(A),E) :- A1 は A, reverse(A1,E),!. 関数定義(string2atom(A),E) :- A2 は A, flat(A2,B), atom_codes(E,B),!. 関数定義(P,E) :- functor(P,greatest,Arg), P =.. [greatest|L], findall(B,(member(A,L) , B は A),L2), max(L2,E),!. 関数定義(P,E) :- functor(P,least,Arg), P =.. [least|L], findall(B,(member(A,L) , B は A),L2), min(L2,E),!. 関数定義(cel(_列数,_行数,_行列),_解) :- _関数評価された行数 は _行数, _関数評価された列数 は _列数, list_nth(_関数評価された行数,_行列,_行), list_nth(_関数評価された列数,_行,_解),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/950 # # 【質問テンプレ】 # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 下に示すように,要素数が7 でint 型の配列に読み込んだ全要素を逆順に # 並べ替えるプログラムを作成せよ. # # vx[ 0] : 58 # vx[ 1] : 32 # vx[ 2] : 17 # vx[ 3] : 46 # vx[ 4] : 22 # vx[ 5] : 73 # vx[ 6] : 69 # vx[ 0] = 69 # vx[ 1] = 73 # vx[ 2] = 22 # vx[ 3] = 46 # vx[ 4] = 17 # vx[ 5] = 32 # vx[ 6] = 58 % Prolog % ここでは定義された単位節の一引数だけソートして差し替える問題としてみよう。 t455 :- 指定引数だけ順序替えする単位節ソート(2,vx/2). vx(0,58). vx(1,32). vx(2,17). vx(3,46). vx(4,22). vx(5,73). vx(6,69). 指定引数だけ順序替えする単位節ソート(_鍵位置,Functor/Arity) :- Len1 is Arity+1, length(L,Len1), list_nth(1,L,Functor), P =.. L, findall(K,(clause(P,_),arg(_鍵位置,P,K)),L1), quicksort(L1,L2), reverse(L2,L3), findall(L4,(retract(P2),P2=..L4),L5), ソート項目の差し替え(_鍵位置,L5,L3). ソート項目の差し替え(_,[],[]) :- !. ソート項目の差し替え(_鍵位置,[[_関数|_引数ならび]|R1],[_鍵項目|R2]) :- replace_nth(_鍵位置,_鍵項目,_引数ならび,_置き換えられた引数ならび), P =.. [_関数|_置き換えられた引数ならび], assertz(P), ソート項目の差し替え(_鍵位置,R1,R2). replace_nth(N,K,L1,L) :- replace_nth(1,N,K,L1,L). replace_nth(N,N,K,[_|R],[K|R]) :- !. replace_nth(M,N,K,[A|R1],[A|R2]) :- M2 is M + 1, replace_nth(M2,N,K,R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/733 # # [1] 授業単元: プログラミングC # [2] 問題文(含コード&リンク): # キーボードから半角英数で文字列を入力し、これを数字(0→9)、大文字(A→Z)、 # 小文字(a→z)の順に並べ替えるプログラムを作成せよ。 # ヒント:並べ替えアルゴリズムは、バブルソート(隣接交換法)を使うと簡単だろう。 #     文字列長はstrlen命令を使うとよい。みたいです。 t388 :-   get_line(Line),   atom_chars(Line,Chars),   バブルソート(Chars,_整列した文字ならび),   atom_chars(Line2,_整列した文字ならび),   write_formatted('%t\n',[Line2]). バブルソート(L,X) :-   整順が崩れるまで(L,L2),   バブルソート(L2,X),!. バブルソート(L,L). 整順が崩れるまで([A],[A]) :- !,fail. 整順が崩れるまで([A,B|R1],[A|R2]) :-   A @=< B,   整順が崩れるまで([B|R1],R2). 整順が崩れるまで([A,B|R1],[B,A|R1]) :-   A @> B. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/660 # # [1] 授業単元:情報 # [2] 問題文(含コード&リンク): # パソコン甲子園 2008 予選問題 問7 ふしぎな虫 # http://www.pref.fukushima.jp/pc-concours/2009/03/pdf/2008yosen.pdf ふしぎな虫(_虫,_分後) :- atom_chars(_虫,Chars), 同じ時間の虫変化(0,_分後,[Chars],Chars2), atom_chars(_同色の虫,Chars2),!. ふしぎな虫(_,'NA'). 同じ時間の虫の変化(M,_,_) :- M > 10,!,fail. 同じ時間の虫の変化(N,N,_虫ならび) :- member(_すべて同色の虫,_虫ならび), すべて同じ色(_すべて同色の虫),!. 同じ時間の虫の変化(M,N,_虫ならび) :- findall(_変化した虫ならび, ( member(_虫,_虫ならび), ふしぎな虫の色変化(_虫,_変化した虫ならび)),L3), 平坦化(L3,L4), 同一要素のない整列(L4,L5), M2 is M + 1, 同じ時間の虫の変化(M2,N,L5). ふしぎな虫の色変化(_虫,_変化した虫ならび) :- findall(L2,色違いの2つの体節のペア(_虫,L2),_変化した虫ならび). 色違いの2つの体節のペア([A,B|R1],[C,C|R1]) :- 三色組み合わせ(A,B,C). 色違いの2つの体節のペア([A|R1],[A|R2]) :- 色違いの2つの体節のペア(R1,R2). 三色組み合わせ(A,B,C) :- not(A==B), member(C,[r,g,b]), not(A==C), not(B==C). すべて同じ色([],_). すべて同じ色([A|R],A) :- すべて同じ色(R,A). 平坦化([],[]) :- ! . 平坦化([A|R],L) :- A=[_|_],!,平坦化(A,L1),平坦化(R,L2),append(L1,L2,L). 平坦化([A|R],[A|R1]) :- 平坦化(R,R1) . 同一要素のない整列([],[]). 同一要素のない整列([X|Xs],Ys) :- 同一要素のない分割(Xs,X,Littles,Bigs), 同一要素のない整列(Littles,Ls), 同一要素のない整列(Bigs,Bs), append(Ls,[X|Bs],Ys) . 同一要素のない分割([],Y,[],[]). 同一要素のない分割([X|Xs],Y,[X|Ls],Bs) :- X @< Y, 同一要素のない分割(Xs,Y,Ls,Bs) . 同一要素のない分割([X|Xs],Y,Ls,[X|Bs]) :- X @> Y, 同一要素のない分割(Xs,Y,Ls,Bs) . 同一要素のない分割([X|Xs],Y,Ls,Bs) :- X = Y, 同一要素のない分割(Xs,Y,Ls,Bs). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/607 # # 簡単なデータベース機能を持つプログラムを作成しなさい.対象となるデータは自分で 考えてください. #   (住所録,商品の在庫,図書,ワールドカップの勝敗....) #  以下の要件を示します. # # 1. ファイルからデータを読み込む機能をつけること. # 2. データは4つ以上の項目を保持させること. #  (住所録では、「名前」「住所」「郵便番号」「電話番号」等で4項目以上) # 3. 並び替えの機能をつけること.また並び替える項目が指定できること. # 4. 各項目についてデータの検索を行う機能をつけること.また,検索条件を組み合わ せることができること. #  (住所録なら,「郵便番号」が 399 で始まって,かつ,「電話番号」が 026 で始ま る 等) # 5. データは半角英数字(英語やローマ字)で扱ってよい # 6. データの追加ができること. # 7. データの削除ができること.削除は上記の検索と組み合わせることで,ある条件に 合致したデータを削除できること. # 8. 追加・削除した結果をファイルに保存できること. 鍵項目位置(書籍名,prolog関連書籍(_書籍名,_,_,_,_,_,_,_),_書籍名). 鍵項目位置(副書籍名,prolog関連書籍(_,_副書籍名,_,_,_,_,_,_),_副書籍名). 鍵項目位置(著者名,prolog関連書籍(_,_,_著者名,_,_,_,_,_),_著者名). 鍵項目位置(翻訳者名,prolog関連書籍(_,_,_,_翻訳者名,_,_,_,_),_翻訳者名). 鍵項目位置(発行年月日,prolog関連書籍(_,_,_,_,_発行年月日,_,_,_),_発行年月日). 鍵項目位置(出版社名,prolog関連書籍(_,_,_,_,_,_出版社名,_),_出版社名), 鍵項目位置(書籍コード,prolog関連書籍(_,_,_,_,_,_,_書籍コード),_書籍コード). 項目名を指定しての参照(_述語名/_引数の数,_項目名ならび,_値ならび) :- length(L,_引数の数), P =.. [_述語名|L], findall(_項目値,( call(P), member(_項目名,_項目名ならび), 鍵項目位置(_項目名,P,_項目値)),_値ならび). 項目名を指定して節構造ならびの参照(_項目名ならび,_節構造ならび,_値ならび) :- member([_頭部,_本体],_節構造ならび), findall(_項目値,( call(_本体), /* このアサーションを実行するかが大問題 */ member(_項目名,_項目名ならび), 鍵項目位置(_項目名,_頭部,_項目値)),_値ならび). データベースへの登録(_ファイル) :- reconsult(_ファイル). データベースへの追加(_項) :- assertz(_項). データベースからの削除(_項) :- retract(_項). データベースの保存(_述語名/_引数の数,_保存ファイル名) :- tell(_保存ファイル名), listing(_述語名/_引数の数), told. 節定義の並べ替え(_述語名/_引数の数,_鍵項目,上昇順) :- 上昇順節構造(_述語名/_引数の数,_鍵項目,_上昇順に整列された節構造ならび), abolish(_述語名/引数の数), ( member([H,B],_上昇順に整列された節構造ならび), assertz((H :- B)), fail; true ). 節定義の並べ替え(_述語名/_引数の数,_鍵項目,下降順) :- 下降順節構造(_述語名/_引数の数,_鍵項目,_上昇順に整列された節構造ならび), abolish(_述語名/引数の数), ( member([H,B],_上昇順に整列された節構造ならび), assertz((H :- B)), fail; true ). 上昇順節構造(_述語名/_引数の数, _鍵項目, _上昇順に整列された節構造ならび) :- 節構造ならびの取得(_述語名/_引数の数,_節構造ならび), ならびの先頭に鍵項目を付加(_鍵項目ならび, _節構造ならび, _鍵付加き節構造ならび), 上昇順整列(_鍵付加き節構造ならび, _上昇順に整列された鍵付き節構造ならび), ならびの先頭の鍵項目を除去(_上昇順に整列された鍵付き節構造ならび, _上昇順に整列された節構造ならび),!. 下降順節構造(_述語名/_引数の数,_鍵項目,_下降順に整列された節構造ならび) :- 節構造ならびの取得(_述語名/_引数の数,_節構造ならび), ならびの先頭に鍵項目を付加(_鍵項目ならび, _節構造ならび, _鍵付加き節構造ならび), 下降順整列(_鍵付加き節構造ならび, _下降順に整列された鍵付き節構造ならび), ならびの先頭の鍵項目を除去(_下降順に整列された鍵付き節構造ならび, _下降順に整列された節構造ならび),!. 節構造ならびの取得(_述語名/_引数の数,_節構造ならび) :- length(L,_引数の数), H =.. [_述語名|L], findall([H,B],clause(H,B),_節構造ならび),!. ならびの先頭に鍵項目を付加(_,[],[]) :- !. ならびの先頭に鍵項目を付加(_鍵項目ならび, [[_頭部,_本体]|R1], [_鍵付き節構造|R2]) :- findall(_値,(member(_鍵,_鍵項目ならび),鍵項目位置(_鍵,_頭部,_値)),L), append(L,[_頭部,_本体],_鍵付き節構造), ならびの先頭の鍵項目を除去(_鍵項目ならび,_鍵付き節構造ならび,_節構造ならび) :- length(_鍵項目ならび,_除去する項数), ならびの先頭N個の鍵項目を除去(N,_鍵付き節構造ならび,_節構造ならび). ならびの先頭N個の鍵項目を除去(N,[L1|R1],[L2|R2]) :- append(L0,L2,L1), length(L0,N), ならびの先頭N個の鍵項目を除去(N,R1,R2). 上昇順に整列(L1,L2) :- 整列(上昇,L1,L2). 下降順に整列(L1,L2) :- 整列(下降,L1,L2). 整列(_,[],[]) :- !. 整列(_上昇または下降,[X|Xs],Ys) :- 配分(_上昇または下降,Xs,X,Littles,Gigs), 整列(_上昇または下降,Littles,Ls), 整列(_上昇または下降,Bigs,Bs), append(Ls,[X|Bs],Ys). 配分(_,[],Y,[],[]) :- !. 配分(上昇,[X|Xs],Y,[X|Ls],Bs) :- X @=< Y,!,配分(上昇,Xs,Y,Ls,Bs). 配分(上昇,[X|Xs],Y,Ls,[X|Bs]) :- X @> Y,!,配分(上昇,Xs,Y,Ls,Bs). 配分(下降,[X|Xs],Y,[X|Ls],Bs) :- X @>= Y,!,配分(下降,Xs,Y,Ls,Bs). 配分(下降,[X|Xs],Y,Ls,[X|Bs]) :- X @< Y,!,配分(下降,Xs,Y,Ls,Bs). 鍵項目位置定義(述語名,_項目名ならび) :- length(_項目名ならび,Len), for(1,N,Len), list_nth(N,_項目名ならび,_項目名), 変数文字列の生成(Len,N,項目名,_項目変数文字列,_変数文字列), concat_atom(['鍵項目位置(',_項目名,述語名,'(',_変数文字列,')', _項目変数文字列,')'],S), parse_atom(S,1,P,V), assertz_with_names(P,V), N = Len,!. 変数文字列の生成(N,Len,項目名,_項目変数文字列,_変数文字列) :- M is N - 1, length(L1,M), all(L1,'_'), M2 is Len - N, length(L2,M2), all(L2,'_'), atom_concat('_',項目名,_項目変数文字列), append(L1,[_項目変数文字列|L2],L), concat_atom(L,',',_変数文字列). all([],_). all([A|R],V) :- all(R,V). % 以下のサイトは # 出典 #511 # [1] 授業単元:情報基礎B # [2] 問題文(含コード&リンク):試験の点数10人分をキーボードから入力し、以下の内容を出力するプログラムを作成せよ。 # 平均点、標準偏差、得点の高い順の点数リスト(出来れば、バブルソート以外の # アルゴリズムでお願いします。) t333(_点数ならび,_平均点,_標準偏差,_点数順ならび) :- 算術平均(_点数ならび,_平均点), 標準偏差(_点数ならび,_標準偏差), quicksort(_点数ならび,_点数順ならび). 算術平均([],N,S,M) :- M is S / N,!. 算術平均([A|R],N,S,M) :- S1 is S + A,算術平均(R,N,S1,M) . 算術平均(L,M) :- length(L,N),算術平均(L,N,0.0,M). 標準偏差([],N,M,S,V) :- V is sqrt(S / (N - 1)),!. 標準偏差([A|R],N,M,S,V) :- S1 is (A - M) ^ 2,S2 is S + S1,標準偏差(R,N,M,S2,V). 標準偏差(L,V) :- length(L,N),算術平均(L,M),標準偏差(L,N,M,0.0,V) . quicksort([],[]) :- !. quicksort([X|Xs],Ys) :- partition(Xs,X,Littles,Gigs), quicksort(Littles,Ls), quicksort(Bigs,Bs), append(Ls,[X|Bs],Ys). partition([],Y,[],[]) :- !. partition([X|Xs],Y,[X|Ls],Bs) :- X @=< Y,partition(Xs,Y,Ls,Bs). partition([X|Xs],Y,Ls,[X|Bs]) :- X @> Y,partition(Xs,Y,Ls,Bs). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/ # # [1] 授業単元:C言語実習 # [2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin /joyful/img/9658.txt # {5,21,4,14,12}, # {25,20,15,3,7}, # {24,11,6,1,13}, # {16,2,17,19,8}, # {23,18,22,9,10} # # の横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替え(上が小さくな るように) # 結果を出力 # # 結果は # # 5 21 4 14 12 # 25 20 15 3 7 # 24 11 6 1 13 # 16 2 17 19 8 # 23 18 22 9 10 # # のような形で出力 '横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替えて出力する'(_ファイル) :- 行列に入力する(_ファイル,_行列1), '横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替えてW得点データをバブルソートを用いて国語の得点の大きい順に並び替えよ出力する'(_行列1,_行列2), 出力する(_行列2),!. '横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替えて出力する'(_行列1,_行列2) :- 各行を整列する(_行列1,_行列3), 縦の各列を整列する(_行列3,_行列2). 行列に入力する(_ファイル,_行列) :- get_split_lines(_ファイル,['{',',','}'],_行列). 各行を整列する([],[]) :- !. 各行を整列する([_行|R1],[_整列された行|R2]) :- quicksort(_行,_整列された行), 各行を整列する(R1,R2). 縦の各列を整列する(_行列1,_行列2) :- 転置(_行列2,_行列3), 各行を整列する(_行列3,_行列4), 転置(_行列4,_行列2). 出力する(_行列2) :- append(L0,[L|R],_行列2), concat_atom(L,' ',S), writef('%t\n',[S]), R = []. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines) . get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat , get_line(Line) , (Line = end_of_file , (!) , fail ; true)), Lines). get_chars(File,L) :- \+(is_stream(_,File,_)), exists(File,read), open(File,read,Input), get_char(Input,X), get_chars(Input,X,L), close(Input),!. get_chars(Input,L) :- is_stream(_,Input,_), get_char(Input,X), get_chars(Input,X,L),!. get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. 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,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). get_line_3(_,'連続','\n',[]) :- !. get_line_3(Instream,_診断,'\r',X) :- get_char(Instream,C2), get_line_3_2(Instream,_診断,C2,X),!. get_line_3(Instream,'終了',end_of_file,[]) :- !. get_line_3(Instream,_診断,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,_診断,C2,R). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). get_chars(L) :- findall(U,( repeat , get_char(U) , (U = end_of_file , (!) , fail ; true)), L). get_line(Instream,_診断,X) :- get_char(Instream,C), get_line_3(Instream,_診断,C,Chars), atom_chars(X,Chars),!. get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. 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,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). get_line_3(_,'連続','\n',[]) :- !. get_line_3(Instream,_診断,'\r',X) :- get_char(Instream,C2), get_line_3_2(Instream,_診断,C2,X),!. get_line_3(Instream,'終了',end_of_file,[]) :- !. get_line_3(Instream,_診断,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,_診断,C2,R). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). get_line_3_2(Instream,'連続','\n',[]) :- !. get_line_3_2(Instream,'連続',C,['\r'|R]) :- \+(C == '\n'), get_line_3(Instream,_診断,C,R),!. split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,(member(U,Y) , not U = ''),L), L = X,!. sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,(member(U,Y) , \+(member(U,_区切り符号ならび))),Z), Z = X,!. split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび) , atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). 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),!. 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),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), number(C,Nl),!. split_5(B,C) :- concat_atom(B,C),!. split_32(['"','"'|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_32([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"','"'|R],R2,_区切り符号,_区切り符号ならび,['"'|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42([],[],'',_,[]) :- !. split_42([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. number(A,B) :- number_codes(A,B). numeric_list([],[]) :-!. numeric_list([A|R],[B|R1]) :- digit(A), char_code(A,B), numeric_list(R,R1),!. numeric_list(['.'|R],[46|R1]) :- numeric_list(R,R1),!. numeric_list([-|R],[45|R1]) :- numeric_list(R,R1),!. 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % *** user: quicksort / 2 *** quicksort([X|Xs],Ys) :- partition(Xs,X,Littles,Bigs), quicksort(Littles,Ls), quicksort(Bigs,Bs), append(Ls,[X|Bs],Ys). quicksort([],[]). partition([X|Xs],Y,[X|Ls],Bs) :- X @=< Y, partition(Xs,Y,Ls,Bs). partition([X|Xs],Y,Ls,[X|Bs]) :- X @> Y, partition(Xs,Y,Ls,Bs). partition([],Y,[],[]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/244 # # 〔1〕授業単元:C言語 # 〔2〕問題文:http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9601.txt # ・2つの整数型の変数を入れ替える関数 swapを定義して、それを用いて配列中の数字をランダムに入れ替えるプログラムを作りなさい。 # 1から52までの数が順番に入った配列を用意し、十分に入れ替えた結果を表示すること。 # これができた人は、次のように表示を変更しなさい。 # ・ 52個の数字を1〜13、14〜26、27〜39、40〜52の4組に分けて考える # ・ それぞれ1番目から13番目の数字を、A、2、3、4、5、6、7、8、9、T、J、Q、K と表示する(TはTenのT) # 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,2,0,21,22,… # ↓ # A,2,3,4,5,6,7,8,9,T,J,Q,K,A,2,3,4,5,6,7,8,9,T,… # ?これができた人は、次のように表示を変更しなさい。 # ・トランプの4つのスートをアルファベットで表示することにする(スペードは s, ハート #  はh、ダイヤはd、 クラブはc) # ・ 1〜13はスペード(s)、14〜26はハート(h)、27〜39はダイヤ(d)、40〜52はクラブ(c)とする # ・ それぞれの数字をA〜Kとshdcの組合せで表示する # ・ 例:1ならAs(スペードのA)、52ならKc(クラブのK) # As,2s,…..,Ks,Ah,2h,……,Kh,Ad,2d,……,Kd,Ac,2c,…..,Kc 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),!. t319_2(X) :- findall(U,( between(1,52,N), t319_2_1(N,U)),X). t319_2_1(N,U) :- M is N mod 13, '数字カード・絵カード'(M,U). '数字カード・絵カード'(1,'A') :- !. '数字カード・絵カード'(10,'T') :- !. '数字カード・絵カード'(11,'J') :- !. '数字カード・絵カード'(12,'Q') :- !. '数字カード・絵カード'(0,'K') :- !. '数字カード・絵カード'(N,N). トランプの準備(X) :- findall(U,( between(1,52,N), 一枚のカードを作る(N,U)),_整列したカード), トランプを切る(100,_整列したカード,X). 一枚のカードを作る(N,U) :- M is N mod 13, M2 is (N - 1) // 13, 数字カード・絵カード(M,U1), カードの種類(M2,U2), atom_concat(U1,U2,U). カードの種類(0,s). カードの種類(1,h). カードの種類(2,d). カードの種類(3,c). トランプを切る(0,L,L) :- !. トランプを切る(N,L,X) :- M1 is random(52) + 1, M2 is random(52) + 1, swap_nth(M1,M2,L,L1), N2 is N - 1,!, トランプを切る(N2,L1,X). swap_nth(M,N,L1,L2) :- nth1(M,L1,A), nth1(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),!. append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/243 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9605.txt # ある宝くじ売り場は窓口が1つだけあり、10::00〜15:00の5時間営業している # この宝くじ売り場には平均して4分に1人の客がやってくる # また、1人の客が宝くじの購入に要する時間tは以下に従うようにする # # 購入に要する時間  割合 #    1分     20% #    3分     60% #    5分     13% #   10分      5% #   15分      2% # # この宝くじ売り場にできるだろう行列の変化の様子をシュミレーションし、 # 下記の実行結果のように売り場に並んでいる客の行列の状態を15分刻みで表示するプログラムを作成せよ # # 実行結果 # $ ./a.out ※rand()関数を使っているため、実行環境によって全く同じ結果にはならない # 10:00 : # 10:15 : * # 10:30 : # 10:45 : ** # 11:00 : # 11:15 : *** # 11:30 : *** # 11:45 : **** # 12:00 : ** # 12:15 : **** # 12:30 : ***** # 12:45 : ****** # 13:00 : ******* # 13:15 : ******* # 13:30 : ******* # 13:45 : ******* # 14:00 : ***** # 14:15 : * # 14:30 : **** # 14:45 : ********* # 15:00 : ****** # 時間内に来た客の数 : 92 # 時間内に対応できた客の数 : 86 '宝くじ売り場にできるだろう行列の変化の様子をシュミレーションし、 下記の実行結果のように売り場に並んでいる客の行列の状態を15分刻みで表示する'(_レジならび記録) :- 待ち時間付き顧客ならびの生成(_顧客ならび), レジのシミュレーション(0,300,L2,[],RL,_レジならび記録), '15分ごとにグラフ表示'(_レジならび記録). 待ち時間付き顧客ならびの生成(L) :- findall([T,W,N],(between(1,75,N),顧客ならびの生成(T,W)),L1), sort(L1,L). 顧客ならびの生成(_開店N分後,_購入に要する時間) :- _開店N分後 is random(300), 購入に要する時間(_購入に要する時間). レジのシミュレーション(N,N,_,L,L,[[N|L]]) :- !. レジのシミュレーション(N1,N,[[N1,W,_]|R1],L1,L2,R2) :- レジのシミュレーション(N1,N,R1,[W|L3],L2,R2). レジのシミュレーション(N1,N,[[N2,W,Z]|R1],L1,L2,[[N1,L1]|R2]) :- N2 > N1, '1分経過した待ち列'(L1,L3), N3 is N1 + 1, レジのシミュレーション(N3,N,[[N2,W,Z]|R1],L3,L2,R2). '15分ごとにグラフ表示'([]) :- !. '15分ごとにグラフ表示'([[N,L]|R]) :- 0 is N mod 15, '時・分を得る'(N,_時,_分), 星の生成(L,_星文字列), writef('%w:%w : %w\n',[_時,_分,_星文字列]), '15分ごとにグラフ表示'(R),!. '15分ごとにグラフ表示'([[N,L]|R]) :- \+(0 is N mod 15)), '15分ごとにグラフ表示'(R),!. '時・分を得る'(N,_時,分) :- D is N // 60, _時 is 10 + D, _分 is N mod 60. 星の生成(L,_星文字列) :- length(L,Len), length(L1,Len), all(L1,'*'), atom_chars(_星文字列,L1),!. 購入に要する時間(_購入に要する時間) :- N is random(100), 乱順発生番号(A,N), 購入に要する時間(A,_購入に要する時間). 購入に要する時間('1分客',1). 購入に要する時間('3分客',3). 購入に要する時間('5分客',5). 購入に要する時間('10分客',10). 購入に要する時間('15分客',15). 乱順発生番号('1分客',N) :- N>=0,N=<19. 乱順発生番号('3分客',N) :- N>=20,N=<79. 乱順発生番号('5分客',N) :- N>=80,N=<92. 乱順発生番号('10分客',N) :- N>=93,N=<97. 乱順発生番号('15分客',N) :- N>=98,N=<99. '1分経過した待ち列'([],[]) :- !. '1分経過した待ち列'([1|R1],R2) :- '1分経過した待つ列'(R1,R2),!. '1分経過した待ち列'([N|R1],[N2|R2]) :- N2 is N - 1, '1分経過した待ち列'(R1,R2). all([],_) :- !. all([A|R],A) :- all(R,A). % 以下のサイトは # [1]授業単元:プログラミング演習課題3 # [2]問題文:http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9516.txt # ファイルに登録された成績コードを読み、構造体列にデータを編集し指定された項目で # ソート処理を行って、画面に一覧(見出しと明細データ)を出力する。 # ソートの順序は降順とし、10行毎に見出しを入れる。 # # 成績ファイル: # コード(6桁),氏名(20桁),国語(3桁),算数(3桁),理科(3桁),社会(3桁) # # 構造体の定義: # struct seito { # char cd[7]; # char simei[21]; # int kokugo; # int sansu; # int rika; # int syakai; # }; # # ソート項目は、コード、氏名、国語、算数、理科、社会が選択できるようにする。 項目長(コード,7,6). 項目長(氏名,21,20). 項目長(国語,3,3). 項目長(算数,3,3). 項目長(理科,3,3). 項目長(社会,3,3). 項目位置(コード,A,[A,_,_,_,_,_]). 項目位置(氏名,A,[_,A,_,_,_,_]). 項目位置(国語,A,[_,_,A,_,_,_]). 項目位置(算数,A,[_,_,_,A,_,_]). 項目位置(理科,A,[_,_,_,_,A,_]). 項目位置(社会,A,[_,_,_,_,_,A]). 'ファイルに登録された成績コードを読み、構造体列にデータを編集し指定された項目で ソート処理を行って、画面に一覧(見出しと明細データ)を出力する。 ソートの順序は降順とし、10行毎に見出しを入れる。'(_ファイル,_キーならび) :- 'ファイルに登録された成績コードを読み、'(_ファイル,_行ならび), '構造体列にデータを編集し指定された項目でソート処理(ソートの順序は降順とし)を行って、'(_行ならび,_先頭にキーが付加された降順整列した値ならび), length(_キーならび,_キーの長さ), '画面に一覧(見出しと明細データ)を出力する。10行毎に見出しを入れる。'(_先頭にキーが付加された降順整列した値ならび,1,_キーの長さ). 'ファイルに登録された成績コードを読み、'(_ファイル,_行ならび) :- get_lines(_ファイル,_行ならび). '構造体列にデータを編集し指定された項目でソート処理(ソートの順序は降順とし)を行って、'(_行ならび,_キーならび,L2) :- 構造体列にデータを編集し指定された項目で(_行ならび,_キーならび,L1), 'ソート処理(ソートの順序は降順とし)を行って、'(L1,L2). 構造体列にデータを編集し指定された項目で(_行ならび,_キーならび,L1) :- キーを付加しながら項目の切り出し(_行ならび,_キーならび,L1). キーの付加([],L,L) :- !. キーの付加([_項目名|R1],L,[_値|R2]) :- 項目位置(_項目名,_値,L), キーの付加(R1,L,R2). キーを付加しながら項目の切り出し([],_,[]) :- !. キーを付加しながら項目の切り出し([_行|R1],_キーならび,[L2|R2]) :- 項目の切り出し(_行,0,[コード,氏名,国語,算数,理科,社会],L), キーの付加(_キーならび,L,L2), キーを付加しながら項目の切り出し(R1,_キーならび,R2),!. 項目の切り出し(_行,_開始点,[A|R1],[B|R2]) :- 項目長(A,Len,_), sub_atom(_行,_開始点,Len,_,B), _次の開始点 is _開始点 + Len, 項目の切り出し(_行,_次の開始点,R1,R2). 'ソート処理(ソートの順序は降順とし)を行って、'(L1,L2) :- sort(L1,L3), reverse(L3,L2). '画面に一覧(見出しと明細データ)を出力する。10行毎に見出しを入れる。'([],_,_) :- !. '画面に一覧(見出しと明細データ)を出力する。10行毎に見出しを入れる。'([_キーの付いた値ならび|R],_行目,_キーの長さ) :- '10行毎に見出しを入れる。'(_行目), 明細データを出力する(_キーの長さ,_キーの付いた値ならび), _次の行目 is _行目 + 1, '画面に一覧(見出しと明細データ)を出力する。'(R,_次の行目,_キーの長さ). '10行毎に見出しを入れる。'(_行目) :- 1 is _行目 mod 10, writef('成績ファイル:\nコード(6桁),氏名(20桁),国語(3桁),算数(3桁),理科(3桁),社会(3桁)\n'),!. '10行毎に見出しを入れる。'(_). 明細データを出力する(_キーの長さ,_キーの付いた値ならび) :- キーを取り除く(_キーの長さ,_キーの付いた値ならび,_値ならび), 表示項目の調整([コード,氏名,国語,算数,理科,社会],_値ならび,_表示値ならび), writef('%t,%t,%t,%t,%t,%t\n',_表示値ならび). キーを取り除く(_キーの長さ,_キーの付いた値ならび,_値ならび) :- length(VL,_キーの長さ), append(VL,_値ならび,_キーの付いた値ならび),!. 表示項目長の調整([],[],[]) :- !. 表示項目長の調整([_項目名|R1],[_値|R2],[_表示値|R3]) :- 項目長(_項目名,_,Len), sub_atom(_値,0,Len,_,_表示値), 表示項目長の調整(R1,R2,R3). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/481 # # [1] 授業単元:ソフトウェア演習C # [2] 問題文: # 文書ないのすべての単語とその単語の頻度をメンバとして持つ構造体を定義し、 # この構造体へのポインタをノードの値として持つ二分木のノードを定義せよ # # 次に、任意のノードはその左の部分木にはそのノードの単語より辞書順で # 小さい単語のみがあり、その右の部分木にはより大きい単語のみがあるように # 保持される。 # 新たに単語がすでに木にあるかどうかを探すには、ルート(根元)から出発して # そのノードに格納されている単語と新しい単語を比較する。 # 二つが一致したら、それで良い。 # 新しい単語が木の単語より小さいときは、探索は左の子供に対して続けられ、 # そうでなければ右の子供が調べられる。 # 求める方向に子供がないときは、新しい単語は木の中にはないと言うことであり、 # また実際にはその子供のないところがそれを置く場所である。 # このプロセスは再帰的である必要があり、単語の挿入を行うadd_word()関数を # 定義せよ。 # この関数は再帰的に呼ばれて、左または右の部分木に振り分けられる。 # 単語は木の中の単語と一致する(その場合カウント(頻度)がインクリメントされる)か、 # あるいはノードを作成し、木に加えなければならないことを示すヌル・ポインタと # 出会う。 # 新たにノードが生成されると、この関数ではそのノードへのポインタが返され、 # 親ノードに埋め込まれる。 # この関数を利用し、以下のテキストをコマンド実行時の引数として与えられた # ファイルを入力して二分探索木を生成し、単語と頻度のリストを表示する # プログラムを作成せよ。 # # 文章: ファイル名:test.txt # University was founded in April 1998 at Iwate, # which is situated in the northeastern part of Japan. # University consists of four faculties Software and Information Science, # Nursing, Social Welfare, # and policy Studies, and additionally other educational supporut centers. 二分木に情報と頻度を保持する :- get_chars('test.txt',Chars), chars_split(Chars,[' ',',','.'],WordList), 木作成(WordList). 情報と頻度を保持した二分木の昇順表示 :- 二分木から値と頻度を取り出す(1,_頻度付きの値ならび), member([_語,_頻度],_頻度付きの値ならび), write_formatted('語彙=%t,頻度=%t\n',[_語,_頻度]), fail; true. 木作成(_ならび) :- abolish(節/5), 節作成(_ならび,1,1,_). 木作成([],_,_,_). 木作成([_値|R],_節,_開始節番号,_次の節番号) :- to_lower(_値,_小文字化した値), 節作成(_小文字化した値,_節,_開始節番号,_受取節番号), 木作成(R,_節,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- not(節(_節,_,_,_,_)), _左 is _受取節番号+1, _右 is _受取節番号+2, _次の節番号 is _受取節番号+3, assertz(節(_節,_左,_右,_値,1)),!. 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_), _値 @< _値2, 節作成(_値,_左,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_), _値 @> _値2 , 節作成(_値,_右,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_頻度), _値 = _値2 , _頻度2 is _頻度 + 1, retract(節(_節,_左,_右,_値2,_頻度)), assertz(節(_節,_左,_右,_値2,_頻度2)). 二分木から値と頻度を取り出す(_節,_頻度付きの値ならび) :- findall([_値,頻度],二分木から値と頻度を取り出す(_節,_,_値,_,_頻度),_頻度付きの値ならび). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- 節(_節,_左,_,_値2,_,_頻度2), 二分木から値と頻度を取り出す(_左,_値2,_値,_頻度2,_頻度). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- 節(_節,_,_右,_値2,_頻度2), 二分木から値と頻度を取り出す(_右,_,_値,_,_頻度). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- not(var(_値1)), not(var(_頻度1)), _値1=_値, _頻度1=_頻度. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_chars(File,Chars) :- open(File,read,Input), findall(X,(repeat,get_char(Input,X),(X=end_of_file,!,fail;true)),Chars), close(Input). concat_atom([A],Sep,[A]) :- !. concat_atom([A|R],Sep,X) :- concat_atom(R,Sep,Y), atom_concat(A,Sep,Y1), atom_concat(Y1,Y,X). chars_split(L,SeparatesL,WordsList) :- split_1(L,SeparatesL,WordsList),!. split_1([],SeparatersL,[]). split_1(L1,SeparatersL,[A|R]) :- not(L1=[]), split_2(L1,SeparatersL,L2,R2), not(L2=[]), atom_chars(A,L2), split_1(R2,SeparatersL,R). split_1(L1,SeparatersL,X) :- not(L1=[]), split_2(L1,SeparatersL,L2,R2), L2=[], split_1(R2,SeparatersL,X). split_2([],_,[],[]). split_2(L1,SeparatersL,[],R) :- member(L2,SeparatersL), append(L2,R,L1). split_2([A|R1],SeparatersL,[A|R2],R) :- not((member(L2,SeparatersL),append(L2,_,[A|R1]))), split_2(R1,SeparatersL,R2,R). 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). % 以下のサイトは データを追加する度に整列する(L) :- get_line(Line), データを追加する度に整列する(Line,[],L). データを追加する度に整列する(end_of_file,_,_) :- !,fail. データを追加する度に整列する(Line,L1,L) :- データを挿入する(Line,L1,L). データを追加する度に整列する(Line,L1,L) :- データを挿入する(Line,L1,L2), get_line(Line2), データを追加する度に整列する(Line2,L2,L). データを挿入する(A,[],[A]) :- !. データを挿入する(A,[B|R],[A,B|R]) :- A @=< B,!. データを挿入する(A,[B|R1],[B|R2]) :- A @> B,データを挿入する(A,R1,R2),!. % 以下のサイトは %% TECHINIQUES OF PROLOG PROGRAMMING by T. Van Le, ph D. %% topo_sort(Graph,List) :- createq(Graph,Queue), t_sort(Graph,Queue,List). createq(G,Q-Qt) :- setof(X,minimal(X,G),L), append(L,Qt,Q). minimal(X,G) :- member(X:Y,G), not(member(A:X,G)). t_sort([],[]-[],[]) :- !. t_sort(G,[X|Q]-Qt,[X|L]) :- find_successors(X,G,G1,Qt-Qs), t_sort(G1,Q-Qs,L). find_successors(X,G,G1,Q-Qt) :- select(X:Y,G,G2),!, (member(A:Y,G2),!, Q = Q1; Q = [Y|Q1]), find_successors(X,G2,G1,Q1-Qt). find_successors(_,G,G,Q-Q). select(H,[H|T],T). select(X,[H|T],[T|T1]) :- select(X,T,T1). graph([ics:is1,dma:ps2,dma:se1,dsa:ps2,dsa:se1, dsa:co1,is1:is2,is1:ps2,is1:se1,co1:co2,is2:pm, is2:is3,ps2:is3,co2:os,pm:cp,is3:cp,os:cp]). ?- graph(G),topo_sort(G,L). L = [dma,dsa,ics,co1,is1,co2,is2,ps2,se1,os,pm,is3,cp] -> % 以下のサイトは %% TECHINIQUES OF PROLOG PROGRAMMING by T. Van Le, ph D. %% selection_sort([],[]). selection_sort(L,[H|T]) :- least(H,L,R), selection_sort(R,T). least(X,L,R) :- select(X,L,R), smaller(X,R). smaller(_,[]). smaller(X,[H|T]) :- X =< H, smaller(X,T). select(H,[H|T],T). select(X,[H|T],[T|T1]) :- select(X,T,T1). % 以下のサイトは %% TECHINIQUES OF PROLOG PROGRAMMING by T. Van Le, ph D. %% sort_list(L,L1) :- quick_sort(L,[],L1). quick_sort([],R,R). quick_sort([H|T],R,L1) :- partition(T,Lt,H,Gt), quick_sort(Gt,R,GtsR), quick_sort(Lt,[H|GtsR],L1). partition([],[],_,[]). partition([H|T],[H|TLt],X,Gt) :- H =< X,partition(T,TLt,X,Gt). partition([H|T],Lt,X,[H|TGt]) :- H > X, partition(T,Lt,X,TGt). % 以下のサイトは %% TECHINIQUES OF PROLOG PROGRAMMING by T. Van Le, ph D. %% permutation_sort(L,L1) :- permutation(L,L1), ordered(L1). ordered([]). ordered([X]). ordered([X,Y|R]) :- X =< Y, ordered([Y,R]). permutation([],[]). permutation(L,[H|T]) :- select(H,L,R), permutation(R,T). select(H,[H|T],T). select(X,[H|T],[T|T1]) :- select(X,T,T1). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/604 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9849.txt # 配列を引数とする再帰呼び出しによるマージソート # #  入出力配列を引数とする再帰的手続きを作成し、マージソートを実現せよ。 # ただし、各入力要素X[i]は整数値をとるものとする。関数として、 # 長さnの配列Xをマージソートによって小さい順に並べ替えた配列Yを求める # msort(int X[],int n,int Y[]),すでに並べ替えられている長さn1の配列Y1と長さn2の # 配列Y2を併合した配列Yを求めるmerge(int Y1[],int n1,int Y2[],int n2,intY[]), # 長さnの配列Xの各要素のアドレス、ならびに内容を # 表示するshow_addr(int X[],int n)を用意する。 debug(off). msort([],[]). msort([X],[X]). msort(_ならび,_sortされたならび) :- ならびを分割(_ならび,_ならび1,_ならび2), show_list(分割,[_ならび,_ならび1,_ならび2]), msort(_ならび1,_整列されたならび1), show_list(msort,[ならび1,_整列されたならび1]), msort(_ならび2,_整列されたならび2), show_list(msort,[ならび2,_整列されたならび2]), merge(_整列されたならび1,_整列されたならび2,_整列されたならび), show_list(merge,[_整列されたならび1,_整列されたならび2,_整列されたならび]). ならびを分割([],[],[]). ならびを分割([X],[X],[]). ならびを分割([A,B|R1],[A|R2],[B|R3]) :- ならびを分割(R1,R2,R3). merge([],X,X) :- !. merge(X,[],X) :- !. merge([A|R1],[B|R2],[A|R3]) :- A @< B,merge(R1,[B|R2],R3). merge([A|R1],[B|R2],[B|R3]) :- A @>= B,merge([A|R1],R2,R3). show_list(_,_) :- debug(off). show_list(_述語,_ならびのならび) :- debug(on),write_formatted('%t: %t\n',[_述語, % 以下のサイトは %% TECHINIQUES OF PROLOG PROGRAMMING by T. Van Le, ph D. %% insertion_sort([],[]). insertion_sort([H|T],L1) :- insertion_sort(T,L2), insert(H,L2,L1). insert(X,[],[X]). insert(X,[H|T],[X,H|T]) :- X =< H. insert(X,[H|T],[H|T1]) :- X >H,insert(X,T,T1). % 以下のサイトは ===ヒープソート=== ヒープソートはメモリ上のスタックやヒープ領域に木構造を構築することによってソートを実現する。ここでは、標準入力ファイルから整数列が与えられたものを、引数上(スタック上)に木構造を成長させて、読み込みを終了したら、昇順に整列された値を取り出すことのできる述語 ヒープソートを定義してみる。 ヒープソート(_木構造) :- read(_整数), ヒープソート(_整数,[],_木構造). ヒープソート(end_of_file,_木構造,_木構造) :- !. ヒープソート(_整数,_木構造_1,_木構造) :- 挿入(_整数,_木構造_1,_木構造_2), read(_整数_2), ヒープソート(_整数_2,_木構造_2,_木構造). 挿入(_整数,[],_木構造) :- 木構造(_整数,[],[],_木構造). 挿入(_整数,_木構造_1,_木構造_2) :- 木構造(_値,_左部分木_1,_右部分木_1,_木構造_1), 挿入(_整数,_値,_左部分木_1,_右部分木_1,_左部分木_2,_右部分木_2), 木構造(_値,_左部分木_2,_右部分木_2,_木構造_2). 挿入(_整数,_値,_左部分木_1,_右部分木,_左部分木_2,_右部分木) :- _整数 =< _値, 挿入(_整数,_左部分木_1,_左部分木_2). 挿入(_整数,_値,_左部分木,_右部分木_1,_左部分木,_右部分木_2) :- _整数 > _値, 挿入(_整数,_右部分木_1,_右部分木_2). 木構造(_値,_左部分木,_右部分木,_木構造) :- functor(_木構造,木,3), arg(1,_木構造,_値), arg(2,_木構造,_左部分木), arg(3,_木構造,_右部分木). 次に、end_of_fileで構築が終った木構造から順に昇順に値を取り出す非決定性の述語 ヒープからの昇順取り出し/2 を定義し、それを使って昇順に整列したリストを取り出す。 ヒープからの昇順取り出し(_木構造,_値) :- 木構造(_,_左部分木,_右部分木,_木構造), ヒープからの昇順取り出し(_左部分木,_値). ヒープからの昇順取り出し(_木構造,_値) :- 木構造(_値,_,_,_木構造). ヒープからの昇順取り出し(_木構造,_値) :- 木構造(_,_左部分木,_右部分木,_木構造), ヒープからの昇順取り出し(_右部分木,_値). ヒープからの昇順リスト(_木構造,_昇順に整列したリスト) :- findall(_値,ヒープから昇順取り出し(_木構造,_値),_昇順に整列したリスト). % 以下のサイトは %% TECHINIQUES OF PROLOG PROGRAMMING by T. Van Le, ph D. %% bubble_sort(L,L1) :- swqp(L,L2,0), bubble_sort(L2,L1). bubble_sort(L,L). swap([X,Y|R],[X|T],S) :- X =< Y,swap([Y|R],T,S). swap([X,Y|R],[Y|T],S) :- X > Y, swap([X|R],T,1). swap([X],[X],1). % 以下のサイトは % バブルソート極めて簡素なロジックによるものですが、 % ! が微妙で、あまりよいプログラムとはいえません。 バブルソート(_対象ならび,_整列済みならび) :- 交換(_対象ならび,_対象ならびの一),!, バブルソート(_対象ならびの一,_整列済みならび). バブルソート(_整列済みならび,_整列済みならび). 交換([],[]) :- !,fail. 交換([A,B|R],[B,A|R]) :- A @> B,!. 交換([A|R1],[A|R2]) :- 交換(R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/159 # #