このディレクトリの索引

% 以下のサイトは # 出典 :: 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). % 以下のサイトは '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). % 以下のサイトは 'select/4を使った標本値の出現度数加算'([],LL,LL). 'select/4を使った標本値の出現度数加算'(_標本値ならび,LL1,LL) :- 'select/4で鍵管理して標本値の出現度数を加算して行く'(_標本値ならび,LL1,LL). 'select/4で鍵管理して標本値の出現度数を加算して行く'([_標本値|R],LL1,LL) :- select([_標本値,_度数_1],LL1,[_標本値,_度数_2],LL2), succ(_度数_1,_度数_2), 'select/4を使った標本値の出現度数加算'(R,LL2,LL). % 以下のサイトは '与えられた数字よりも小さい数字の中で、素数がいくつあるか調べる データが標準入力で与えられた際、結果を標準出力に出力する' :- データが標準入力で与えられた際(_与えられた数字), '与えられた数字よりも小さい数字の中で、素数がいくつあるか調べる'(_与えられた数字,_いくつ), 結果を標準出力に出力する(_いくつ). データが標準入力で与えられた際(_与えられた数字) :- write('数字を入力してください : '), read_line_to_codes(current_input,Codes), number_codes(_与えられた数字,Codes). '与えられた数字よりも小さい数字の中で、素数がいくつあるか調べる'(_与えられた数字,_いくつ) :- '与えられた数字よりも小さい数字の中で'(_与えられた数字,_与えられた数字よりも小さい数字のならび), 素数がいくつあるか調べる(_与えられた数字よりも小さい数字のならび,_いくつ). '与えられた数字よりも小さい数字の中で'(_与えられた数字,_与えられた数字よりも小さい数字のならび) :- succ(_与えられた数字_1,_与えられた数字), findall(N,between(2,_与えられた数字_1,N),_与えられた数字よりも小さい数字のならび). 素数がいくつあるか調べる(_与えられた数字よりも小さい数字のならび,_いくつ) :- 度数(非決定性のエラトステネスの篩(_与えられた数字よりも小さい数字のならび,_素数),_いくつ). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|L1],_素数) :- 先頭の素数を網として篩に掛けて行く(N,L1,_素数). 先頭の素数を網として篩に掛けて行く(N,L1,_素数) :- 'L1の要素でNで割り切れないものを篩に掛ける'(N,L1,L2), 非決定性のエラトステネスの篩(L2,_素数). 'L1の要素でNで割り切れないものを篩に掛ける'(N,L1,L2) :- findall(_要素,( 'L1の要素で'(L1,_要素), 'Nで割り切れないものを篩に掛ける'(_要素,N)),L2). 'L1の要素で'(L1,_要素) :- member(_要素,L1). 'Nで割り切れないものを篩に掛ける'(_要素,N) :- \+(0 is _要素 mod N). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). 結果を標準出力に出力する(_いくつ) :- writef('結果は %w\n',[_いくつ]). :- '与えられた数字よりも小さい数字の中で、素数がいくつあるか調べる データが標準入力で与えられた際、結果を標準出力に出力する',halt. % 以下のサイトは # 出典 :: CodeIQ q1365 # # 成績の分布などを表すのに使われる度数分布表。 # ひと目で全体の散らばり具合がわかって便利です。 # # 【問題】 # 今回は素数の度数分布表を作ってみます。 # 入力として2つの正の整数が与えられます。 # 一つ目は分布させる素数の最大値、二つ目は区切りの大きさです。 # 例えば、30と5が与えられたとき、30までの素数を5で区切って出力します。 # 30までの素数は2, 3, 5, 7, 11, 13, 17, 19, 23, 29ですので、 # 出力内容は以下のようになります。 # 01-05:*** # 06-10:* # 11-15:** # 16-20:** # 21-25:* # 26-30:* # 同様に、40と7が与えられると、以下のように出力されます。 # 01-07:**** # 08-14:** # 15-21:** # 22-28:* # 29-35:** # 36-42:* # 上記のように出力するプログラムを作成してください。 # なお、最低限、以下の入力に対して正常に動作することを確認してください。 # 入力1:100 15 # 入力2:1200 25 # 入力3:12345 789 # '今回は素数の度数分布表を作ってみます。'(_最大値,_区切り) :- 素数の度数分布表(_最大値,_区切り,_度数分布表), 度数分布図として表示する(_度数分布表). 素数の度数分布表(_最大値,_区切り,_度数分布表) :- 素数を生成する(_最大値,_素数ならび), 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表). 素数を生成する(_最大値,_素数ならび) :- findall(_自然数,between(2,_最大値,_自然数),L), エラトステネスの篩(L,_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([M|R1],[M|R2]) :- エラトステネスの篩(M,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(M,R1,L) :- findall(N,( member(N,R1), \+(0 is N mod M)),L). 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表) :- findall([_範囲下限,_範囲上限,_度数],( 素数の度数分布(_素数ならび,_最大値,_区切り,1,_区切り,_範囲下限,_範囲上限,_度数)),_度数分布表). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限,_範囲上限,_範囲下限,_範囲上限,_度数) :- 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数). 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数) :- _範囲下限 =< _最大値, 度数((between(_範囲下限,_範囲上限,_素数),member(_素数,_素数ならび)),_度数). '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- _範囲下限_1 =< _最大値, 次の範囲を確定する(_最大値,_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限), 素数の度数分布(_素数ならび,_最大値,_区切り,_次の範囲下限,_次の範囲上限,_範囲下限,_範囲上限,_度数). 次の範囲を確定する(_最大値,_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限) :- 次の範囲下限(_区切り,_範囲下限_1,_次の範囲下限), 次の範囲上限(_最大値,_区切り,_範囲上限_1,_次の範囲上限). 次の範囲下限(_区切り,_範囲下限_1,_次の範囲下限) :- _次の範囲下限 is _範囲下限_1 + _区切り. 次の範囲上限(_最大値,_区切り,_範囲上限_1,_最大値) :- _最大値 < _範囲上限_1 + _区切り,!. 次の範囲上限(_最大値,_区切り,_範囲上限_1,_次の範囲上限) :- _次の範囲上限 is _範囲上限_1 + _区切り. 度数(_目標,_度数) :- findall(_,_目標,L), length(L,_度数). 度数分布図として表示する(_度数分布表) :- 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数), 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数). 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数), 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲上限の表示桁数). 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数) :- findall(_桁数,範囲下限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲下限の表示桁数). 範囲下限値の桁数(_度数分布表,_下限桁数) :- member([_範囲下限,_,_],_度数分布表), number_chars(_範囲下限,Chars), length(Chars,_下限桁数). 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲の表示桁数) :- findall(_桁数,範囲上限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲の表示桁数). 範囲上限値の桁数(_度数分布表,_上限桁数) :- member([_,_範囲上限,_],_度数分布表), number_chars(_範囲上限,Chars), length(Chars,_上限桁数). 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- forall( member([_範囲下限,_範囲上限,_度数],_度数分布表), 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数)). 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数) :- ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列), 星文字列(_度数,_星文字列), writef('%w:%w\n',[_範囲表現文字列,_星文字列]). ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列) :- ヘッドゼロサプライ(_範囲下限の表示桁数,_範囲下限,_表示範囲下限), ヘッドゼロサプライ(_範囲上限の表示桁数,_範囲上限,_表示範囲上限), atomic_list_concat([_表示範囲下限,'-',_表示範囲上限],_範囲表現文字列). ヘッドゼロサプライ(_桁数,_数値,_ヘッドゼロサプライ数値表現) :- ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト), 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト), 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現). ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト) :- length(_ヘッドゼロサプライされたリスト,_桁数). 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト) :- number_chars(_数値,_数字のリスト), append(_頭部の枠リスト,_数字のリスト,_ヘッドゼロサプライされたリスト), 全ての要素が同じ(_頭部の枠リスト,'0'). 全ての要素が同じ([],_). 全ての要素が同じ([V|R],V) :- 全ての要素が同じ(R,V). 星文字列(_度数,_星文字列) :- findall(*,between(1,_度数,_),L), atomic_list_concat(L,_星文字列). 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現) :- atom_chars(_ヘッドゼロサプライ数値表現,_ヘッドゼロサプライされたリスト). % 以下のサイトは # 出典 :: #132 # 親テーブル # Id, 資産 # 1, 100 # 2, 200 # 3, 400 # # 子テーブル # Id, 親Id, 資産 # 1, 1, 10 # 2, 1, 20 # 3, 2, 10 # 4, 2, 20 # 5, 2, 30 # 6, 3, 10 # # から # Id, 資産 # 1, 60 -- 親1の子供は二人だから、各々の子に 100/2 = 50 を加算する。 # 2, 70 # 3, 76 -- 親2の子供は三人だから、各々の子に 200/3 = 66 を加算する。 # 4, 86 # 5, 96 # 6, 410 -- 親3の子供は一人だから、400 をそのまま加算する。 # # という結果を得たい。 # 要するに、親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい。 # SQL で出来ます? # # 親テーブル(1, 100). 親テーブル(2, 200). 親テーブル(3, 400). 子テーブル(1, 1, 10). 子テーブル(2, 1, 20). 子テーブル(3, 2, 10). 子テーブル(4, 2, 20). 子テーブル(5, 2, 30). 子テーブル(6, 3, 10). 親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい(_一覧) :- findall([_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額],子供の親資産と自分を含めた兄弟人数を調べて親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額),_一覧). 子供の親資産と自分を含めた兄弟人数を調べて親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額) :- 子テーブル(_Id,_親Id,_資産), 親資産と自分を含めた兄弟人数を調べて(_Id,_親Id,_親資産,_自分を含めた兄弟人数), _親の資産を子供に分配して各々の子供の資産と合わせた額 is _資産 + _親資産 // _自分を含めた兄弟人数. 親資産と自分を含めた兄弟人数を調べて(_Id,_親Id,_親資産,_自分を含めた兄弟人数) :- 親テーブル(_親Id,_親資産), 自分を含めた兄弟人数(_親Id,_自分を含めた兄弟人数). 自分を含めた兄弟人数(_親Id,_自分を含めた兄弟人数) :- 度数(子テーブル(_,_親Id,_),_自分を含めた兄弟人数). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは # 出典 :: #132 # 親テーブル # Id, 資産 # 1, 100 # 2, 200 # 3, 400 # # 子テーブル # Id, 親Id, 資産 # 1, 1, 10 # 2, 1, 20 # 3, 2, 10 # 4, 2, 20 # 5, 2, 30 # 6, 3, 10 # # から # Id, 資産 # 1, 60 -- 親1の子供は二人だから、各々の子に 100/2 = 50 を加算する。 # 2, 70 # 3, 76 -- 親2の子供は三人だから、各々の子に 200/3 = 66 を加算する。 # 4, 86 # 5, 96 # 6, 410 -- 親3の子供は一人だから、400 をそのまま加算する。 # # という結果を得たい。 # 要するに、親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい。 # SQL で出来ます? # # 親テーブル(1, 100). 親テーブル(2, 200). 親テーブル(3, 400). 子テーブル(1, 1, 10). 子テーブル(2, 1, 20). 子テーブル(3, 2, 10). 子テーブル(4, 2, 20). 子テーブル(5, 2, 30). 子テーブル(6, 3, 10). 親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい(_一覧) :- findall([_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額],子供の親資産と自分を含めた兄弟人数を調べて親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額),_一覧). 子供の親資産と自分を含めた兄弟人数を調べて親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額) :- 子テーブル(_Id,_親Id,_資産), 親資産と自分を含めた兄弟人数を調べて(_Id,_親Id,_親資産,_自分を含めた兄弟人数), _親の資産を子供に分配して各々の子供の資産と合わせた額 is _資産 + _親資産 // _自分を含めた兄弟人数. 親資産と自分を含めた兄弟人数を調べて(_Id,_親Id,_親資産,_自分を含めた兄弟人数) :- 親テーブル(_親Id,_親資産), 自分を含めた兄弟人数(_親Id,_自分を含めた兄弟人数). 自分を含めた兄弟人数(_親Id,_自分を含めた兄弟人数) :- 度数(子テーブル(_,_親Id,_),_自分を含めた兄弟人数). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #880 # [1]授業単元:C言語 # [2]問題文 # マインスイーパのような爆弾ゲームプログラムを作成する。 # 1. マス目を8× 8に設定する。 # 2. 爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)。 # 3.まだ指定していないマス目には数字の0の代わりに記号'-'を表示する。 # 4.爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を # 表示する(最小で0、最大で8)。 # 5. 爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字 # の'x'を表示し、"Bomb!"と表示して終了する。 # # [3]環境 # [3.1]windows7 # [3.2]gcc # [3.3]C/C++ # [4]7月20日 # よろしくお願いします。 # マインスイーパ :- 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面). 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面) :- 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面), '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(_平坦なならびで表現された盤面). マインスイーパ(_平坦なならびで表現された盤面) :- 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面),!. マインスイーパ(_平坦なならびで表現された盤面) :- マインスイーパを継続する(_平坦なならびで表現された盤面). 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面) :- 度数((member(A,_平坦なならびで表現された盤面),atom(A)),64), write('あなたの勝ちです。\n'). マインスイーパを継続する(_平坦なならびで表現された盤面) :- '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置), マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置) :- 爆弾を隠して盤面を表示する(_平坦なならびで表現された盤面), マス目を選択させる(_行位置,_列位置). マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面),!. マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面), 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面) :- 平坦化した位置に変換(_行位置,_列位置,_nth1), nth1(_nth1,_平坦なならびで表現された盤面,0). 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面) :- 爆弾は周囲にいくつあるか(_nth1,_平坦なならびで表現された盤面,_個数), writef('周囲に爆弾は %w 個あります\n',[_個数]),!. '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面) :- 得点は(_平坦なならびで表現された盤面,_得点), 爆弾が置かれたすべてのマス目に小文字のxを表示し(_平坦なならびで表現された盤面), writef('\n Bomb! \n\n\n あなたの得点は %t です\n',[_得点]). 得点は(_平坦なならびで表現された盤面,_得点) :- 度数((member(A,_平坦なならびで表現された盤面),\+(var(A)),A==0),_得点). 爆弾が置かれたすべてのマス目に小文字のxを表示し([]) :- !. 爆弾が置かれたすべてのマス目に小文字のxを表示し(L) :- 爆弾が置かれたすべてのマス目に小文字のxを表示して行く(L). 爆弾が置かれたすべてのマス目に小文字のxを表示して行く([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾が置かれたすべてのマス目に小文字のxを表示し(R). 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 行末まで表示する(A,R). 行末まで表示する(A,R) :- 爆弾を含むマス目表示文字(A,_表示文字), 爆弾を含むマス目表示(R,_表示文字). 爆弾を含むマス目表示(R,_表示文字) :- writef('%w',[_表示文字]), R = [], write('\n'). マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R) :- append(_,[A|R],[_1,_2,_3,_4,_5,_6,_7,_8]). 爆弾を含むマス目表示文字(V,'-') :- var(V),!. 爆弾を含むマス目表示文字('x','x') :- !. 爆弾を含むマス目表示文字(_,0). 爆弾を隠して盤面を表示する([]). 爆弾を隠して盤面を表示する([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾を隠して盤面を表示する(R). 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 爆弾を隠して行末まで表示する(A,R). 爆弾を隠して行末まで表示する(A,R) :- 爆弾を隠すマス目表示文字(A,_表示文字), 爆弾を隠すマス目表示(_表示文字,R). 爆弾を隠すマス目表示(_表示文字,R) :- writef('%w',[_表示文字]), R = [], write('\n'). 爆弾を隠すマス目表示文字(V,'-') :- var(V),!. 爆弾を隠すマス目表示文字('x','-') :- !. 爆弾を隠すマス目表示文字(_,0). 平坦化した位置に変換(_行位置,_列位置,_nth1) :- _nth1 is (_行位置-1) * 8 + _列位置. 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面) :- length(_平坦なならびで表現された盤面,64). '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(L) :- 爆弾は10個にし(Lp), 同じマス目に重ならないようにランだけに配置する(Lp,L). 爆弾は10個にし(Lp) :- length(Lp,10). 同じマス目に重ならないようにランだけに配置する([],L) :- !. 同じマス目に重ならないようにランだけに配置する([_|R1],L) :- 同じマス目に重ならないようにランダムに一個爆弾を設置する(L), 同じマス目に重ならないようにランだけに配置する(R1,L). 同じマス目に重ならないようにランダムに一個爆弾を設置する(L) :- ランダムに(L,_nth0), 同じマス目に重ならないように一個爆弾を設置する(_nth0,L),!. ランダムに(L,_nth0) :- repeat, _nth0 is random(64). 同じマス目に重ならないように一個爆弾を設置する(_nth0,L) :- 同じマス目に重ならないように(_nth0,L,V), 一個爆弾を設置する(V). 同じマス目に重ならないように(_nth0,L,V) :- nth0(_nth0,L,V), var(V). 一個爆弾を設置する(x). 爆弾は周囲にいくつあるか(N,L,_個数) :- 度数(周囲の八箇所の中で爆弾があるのは(N,L),_個数). 周囲の八箇所の中で爆弾があるのは(N,L) :- 周辺の八箇所の中で(N,_nth1), '_nth1には爆弾がある'(_nth1,L). 周辺の八箇所の中で(N,_nth1) :- member(_式,[N-9,N-8,N-7,N-1,N,N+1,N+7,N+8,N+9]), _nth1 is _式. '_nth1には爆弾がある'(_nth1,L) :- nth1(_nth1,L,V), 変数ではなく爆弾がある(V). 変数ではなく爆弾がある(V) :- 変数ではなく(V), V = x. 変数ではなく(V) :- \+(var(V)). マス目を選択させる(_行位置,_桁位置) :- 整数を得る('マス目の行位置(1-8) ',between(1,8,_行位置),_行位置), 整数を得る('マス目の桁位置(1-8) ',between(1,8,_桁位置),_桁位置),!. 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から(_催促文,_行), 行を条件付きで整数に変換する(_行,_条件,_整数),!. 催促文付き行入力から(_催促文,_行) :- writef('%w',[_催促文]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_chars(_行,Codes). 行を条件付きで整数に変換する(_行,_条件,_整数) :- 行を整数に変換する(_行,_整数), 整数入力条件検査(_条件). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査(_整数). 整数検査(_整数) :- integer(_整数),!. 整数検査(_項) :- 整数検査再入力要請(_項). 整数検査再入力要請(_項) :- writef('入力された項 %w は整数になりません。再入力をお願いします。\n',[_項]), fail. 整数入力条件検査(_条件) :- catch(_条件,E,fail),!. 整数入力条件検査(_条件) :- 整数入力条件検査再入力要請(_条件). 整数入力条件検査再入力要請(_条件) :- writef('入力された %w は成立しません。再入力をお願いします。\n',[_条件]), fail. % 以下のサイトは # 出題 :: プログラミングのお題スレ Part3 #482 # # お題:二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。 # 例 # aabaabbab -> a '二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_多数派の文字) :- 文字ならびに変換して二種の文字を得る(_二種類の文字からなる長さが奇数の文字列,_文字ならび,_甲,_乙), 多数派の文字を求める(_文字ならび,_甲,_乙,_多数派の文字). 文字ならびに変換して二種の文字を得る(_二種類の文字からなる長さが奇数の文字列,_文字ならび,_甲,_乙) :- atom_chars(_二種類の文字からなる長さが奇数の文字列,_文字ならび), ふたつの文字は異なる(_文字ならび,_甲,_乙),!. ふたつの文字は異なる(_文字ならび,_甲,_乙) :- append([_甲|_],[_乙|_],_文字ならび), _甲 \== _乙. 多数派の文字を求める(_文字ならび,_甲,_乙,_多数派の文字) :- 度数を得る(_文字ならび,_甲,_甲の度数,_乙の度数), 多数派の文字を得る(_甲,_乙,_甲の度数,_乙の度数,_多数派の文字). 度数を得る(_文字ならび,_甲,_甲の度数,_乙の度数) :- length(_文字ならび,_文字数), 度数(member(_甲,_文字ならび),_甲の度数), _乙の度数 is _文字数 - _甲の度数. 多数派の文字を得る(_甲,_,_甲の度数,_乙の度数,_甲) :- _甲の度数 > _乙の度数. 多数派(_,_乙,_,_,_乙). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは # 出題 :: プログラミングのお題スレ Part3 #482 # # お題:二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。 # 例 # aabaabbab -> a '二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_多数派の文字) :- 二種類の文字からなる長さが奇数の文字列があるとき(_二種類の文字からなる長さが奇数の文字列,_文字種_1,_文字種_2,Ln1,Ln2), 多数派の文字を求める(_文字種_1,_文字種_2,Ln1,Ln2,_多数派の文字). 二種類の文字からなる長さが奇数の文字列があるとき(_二種類の文字からなる長さが奇数の文字列,_文字種_1,_文字種_2,Ln1,Ln2) :- atom_chars(_二種類の文字からなる長さが奇数の文字列,Chars), 二種類の文字に分類して度数を示すならびを得る(Chars,_文字種_1,_文字種_2,Ln1,Ln2). 二種類の文字に分類して度数を示すならびを得る([],_,_,[],[]) :- !. 二種類の文字に分類して度数を示すならびを得る(L,A,B,Ln1,Ln2) :- 二種類の文字に分類して度数を示すならびを作って行く(L,A,B,Ln1,Ln2). 二種類の文字に分類して度数を示すならびを作って行く(L,A,B,Ln1,Ln2) :- 文字の度数を進める(L,A,B,Ln1_2,Ln2_2,R,Ln1,Ln2), 二種類の文字に分類して度数を示すならびを得る(R,A,B,Ln1_2,Ln2_2). 文字の度数を進める([A|R],A,_,Ln1,Ln2,R,[_|Ln1],Ln2) :- !. 文字の度数を進める([B|R],_,B,Ln1,Ln2,R,Ln1,[_|Ln2]). 多数派の文字を求める(_,B,Ln1,Ln2,B) :- append(Ln1,[_|_],Ln2),!. 多数派の文字を求める(A,_,_,_,A). % 以下のサイトは '100000以下のどの桁にも0を含まない削除可能素数の度数'(_度数) :- 度数('100000以下のどの桁にも0を含まない削除可能素数'(_削除可能素数),_度数). '100000以下のどの桁にも0を含まない削除可能素数'(_削除可能素数) :- まず素数候補を100000以下に絞りましょう(_素数ならび), どの桁にも0を含まない削除可能素数を選別する(_素数ならび,_削除可能数). どの桁にも0を含まない削除可能素数を選別する(_素数ならび,_削除可能数) :- どの桁にも0を含まない削除可能素数の数字ならび(_素数ならび,_削除可能素数の数字ならび), 削除可能素数であるか検査して数値に戻す(_素数ならび,_削除可能素数の数字ならび,_削除可能素数). まず素数候補を100000以下に絞りましょう(_素数ならび) :- '2から100000までの数ならび'(_2から100000までの数ならび), エラトステネスの篩(_2から100000までの数ならび,_素数ならび). '2から100000までの数ならび'(_2から100000までの数ならび) :- findall(N,between(2,100000,N),_2から100000までの数ならび). どの桁にも0を含まない削除可能素数の数字ならび(_素数ならび,_削除可能素数の数字ならび) :- どの桁にも0を含まない削除可能素数候補を数字ならびで受け取る(_素数ならび,_削除可能素数の数字ならび). どの桁にも0を含まない削除可能素数候補を数字ならびで受け取る(_素数ならび,_削除可能素数の数字ならび) :- 素数をひとつ選択し削除可能素数の数字ならびに分解する(_素数ならび,_削除可能素数の数字ならび), どの桁にも0を含まない(_削除可能素数の数字ならび). 素数をひとつ選択し削除可能素数の数字ならびに分解する(_素数ならび,_削除可能素数の数字ならび) :- member(_素数,_素数ならび), number_chars(_素数,_削除可能素数の数字ならび). どの桁にも0を含まない(_削除可能素数の数字ならび) :- \+(member('0',_削除可能素数の数字ならび)). 削除可能素数であるか検査して数値に戻す(_素数ならび,_削除可能素数の数字ならび,_削除可能素数) :- once(削除可能素数であるか検査する(_素数ならび,_削除可能素数の数字ならび)), number_chars(_削除可能素数,_削除可能素数の数字ならび). 削除可能素数であるか検査する(_素数ならび,[]) :- !. 削除可能素数であるか検査する(_素数ならび,L) :- ひと桁ずつ減らしていってどれも素数である(_素数ならび,L). ひと桁ずつ減らしていってどれも素数である(_素数ならび,_素数を構成する数字ならび) :- 素数を構成する数字ならび(_素数ならび,_素数を構成する数字ならび), select(_,_素数を構成する数字ならび,R), 削除可能素数であるか検査する(_素数ならび,R). 素数を構成する数字ならび(_素数ならび,_素数を構成する数字ならび) :- number_chars(_素数,_素数を構成する数字ならび), 素数(_素数ならび,_素数). 素数(_素数ならび,_素数) :- member(_素数,_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([_確定した素数|R1],[_確定した素数|R2]) :- 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2). 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2) :- 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび), エラトステネスの篩(_残ったならび,R2). 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび) :- findall(_確定した素数で割り切れないもの,( 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの)),_残ったならび). 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの) :- member(_確定した素数で割り切れないもの,R1), \+(0 is _確定した素数で割り切れないもの mod _確定した素数). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは '2文字の抽出とその出現頻度を求める'(_文字列,_抽出された出現頻度付きの2文字ならび) :- '2文字の抽出と'(_文字列,_抽出された2文字ならび), その出現頻度を求める(_文字列,_抽出された2文字ならび,_抽出された出現頻度付きの2文字ならび). '2文字の抽出と'(_文字列,_抽出された2文字ならび) :- setof(_2文字,[_文字列,S,R,_2文字] ^ sub_atom(_文字列,S,2,R,_2文字),_抽出された2文字ならび). その出現頻度を求める(_文字列,_抽出された2文字ならび,_抽出された出現頻度付きの2文字ならび) :- findall([_2文字,_出現頻度],( member(_2文字,_抽出された2文字ならび), 出現頻度(sub_atom(_文字列,_,2,_,_2文字),_出現頻度)),_抽出された出現頻度付きの2文字ならび). 出現頻度(P,_出現頻度) :- findall(1,P,L), length(L,_出現頻度). % 以下のサイトは # # ガリ夫くん:スマ子さん、最近実は数字萌えに目覚めたんです! # # スマ子さん: 藪から棒にアブノーマル宣言をされても困るのだけれども……。 # # ガリ夫くん:特に1ちゃんと0ちゃんは最高っすよ! 長女として他の数字子ちゃん達を一生懸命支える1ちゃん。全てを無に帰す力を持ったミステリアス美少女の0ちゃん。……かわええ〜。 # # スマ子さん:……もう帰っていいかしら。 # # ガリ夫:もう数の世界には1ちゃんと0ちゃん以外要りません! 1ちゃんと0ちゃんさえいれば、それで満足です! # # スマ子さん:あら、それはなかなか鋭い指摘ね。 # # ガリ夫くん:……と言いますと? # # スマ子さん:実は、私たちが普段使っている数は、勝手に0〜9までの数を使いますよと決めているに過ぎないの。実際には0と1だけでも数を表すことは可能なのよ。 # # ガリ夫くん:ほうほう……。 # # スマ子さん:これを2進法って言うんだけれどもね。一の位が1になったら、その次の位は一の位を0に戻して、その上の位を1増やして……ってしていくとあらゆる数を表すことができるわ。例えば、1,10,11,100,101,110,111……ってな具合にね。 # # ガリ夫くん:なるほど! と言うことは全ての数は1ちゃんと0ちゃんのハーレムと化すんですね! ここは天国か! # # スマ子さん:……。ところでガリ夫くん、1ちゃんと0ちゃんはどちらがお好き? # # ガリ夫くん:う〜〜〜ん……甲乙つけ難いですが、やっぱり健気な1ちゃんですかね〜。 # # スマ子さん:じゃあその1ちゃん、ハーレムの中にどれぐらいいるのか、知りたくない? # # ガリ夫くん:知りたい知りたい! 1ちゃんのこと、もっと知りたい! # # スマ子さん:うわあ……。ま、まあいいわ! 1ちゃんの数を数えて、それじゃあ2014年にちなんでこんな問題を解いてみましょう! そう、スマートにね! # # # 【問】 # 1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか、答えてください。 # # 解答用テキストファイルに問題の答えと、その答えを導出したプロセスを記述して、提出してください。 # また、プログラムを使用した場合はソースコードを解答用テキストファイルに貼り付けてください。言語は問いませんが、ideone(http://ideone.com/)で実行できるものを解答として提出してください。 # '1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか、答えてください。'('ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合',_ペアの組数) :- 'ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合の、1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか'(_ペアの組数). '1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか、答えてください。'('ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合',_ペアの組数) :- 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合の、1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか'(_ペアの組数). 'ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合の、1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか'(_ペアの組数) :- '1〜2014までの数を2進法で表した時に1の登場する回数ならび'(_数を2進法で表した時に1の登場する回数ならび), 度数('ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合のペア'(_数を2進法で表した時に1の登場する回数ならび),_ペアの組数). 'ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合のペア'([A,A|R]). 'ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合のペア'([_|R]) :- 'ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合のペア'(R). 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合の、1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか'(_ペアの組数) :- '1〜2014までの数を2進法で表した時に1の登場する回数ならび'(_数を2進法で表した時に1の登場する回数ならび), 度数('ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'(_数を2進法で表した時に1の登場する回数ならび),_ペアの組数). 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'([A,A|R]). 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'([A,A|R]) :- 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'(R). 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'([A,B|R]) :- \+(A=B), 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'([B|R]). '1〜2014までの数を2進法で表した時に1の登場する回数ならび'(_数を2進法で表した時に1の登場する回数ならび) :- findall(_数を2進法で表した時に1の登場する回数,( between(1,2014,_数), '数を2進法で表した時に1の登場する回数'(_数,_数を2進法で表した時に1の登場する回数)),_数を2進法で表した時に1の登場する回数ならび). '数を2進法で表した時に1の登場する回数'(_数,_数を2進法で表した時に1の登場する回数) :- 度数('桁を2で割った時の剰余が1'(_数),_数を2進法で表した時に1の登場する回数). 桁を2で割った時の剰余が1(N) :- 1 is N mod 2. 桁を2で割った時の剰余が1(N) :- 最上位桁まで剰余が1かどうか調べる(N). 最上位桁まで剰余が1かどうか調べる(N) :- N > 0, N_1 is N // 2, 桁を2で割った時の剰余が1(N_1). 度数(_目標,_度数) :- findall(1,_目標,_度数を示す1のならび), length(_度数を示す1のならび,_度数). % 以下のサイトは count(X,Y,Z) :- 'Yの要素としてXがいくつ存在するか'(X,Y,Z). 'Yの要素としてXがいくつ存在するか'(X,Y,Z) :- '加算器型count'(X,Y,0,Z). '加算器型count'(X,Y,Z1,Z) :- '停止節::第二引数のリストが[]になったら停止する。countは第三引数に生成されている。'(X,Y,Z1,Z). '加算器型count'(X,Y,Z1,Z) :- '加算器型count Yが[]で無い限りcountを続ける'(X,Y,Z1,Z). '停止節::第二引数のリストが[]になったら停止する。countは第三引数に生成されている。'(_,[],Z,Z). '加算器型count Yが[]で無い限りcountを続ける'(X,[W|Y],Z1,Z) :- 加算するかどうか(X,W,Z1,Z2), '加算型count'(X,Y,Z2,Z). 加算するかどうか(X,X,Z1,Z2) :- Z2 is Z1 + 1. 加算するかどうか(X,W,Z1,Z1) :- \+(X = W). % 以下のサイトは count(X,Y,Z) :- '加算器型count'(X,Y,0,Z). '加算器型count'(_,[],Z,Z) :- '停止節::第二引数のリストが[]になったら停止する。countは第三引数に生成されている。'(_,[],Z,Z),!. '加算器型count'(X,Y,Z1,Z) :- '加算器型count Yが[]で無い限りcountを続ける'(X,Y,Z1,Z). '停止節::第二引数のリストが[]になったら停止する。countは第三引数に生成されている。'(_,[],Z,Z). '加算器型count Yが[]で無い限りcountを続ける'(X,[W|Y],Z1,Z) :- 加算するかどうか(X,W,Z1,Z2), '加算器型count'(X,Y,Z2,Z). 加算するかどうか(X,X,Z1,Z2) :- Z2 is Z1 + 1. 加算するかどうか(X,W,Z1,Z1) :- \+(X = W). % 以下のサイトは '_ならび の中に _ある要素 はいくつ存在するか'(_ある要素,_ならび,_いくつ) :- count(_ある要素,_ならび,_いくつ). count(X,Y,Z) :- '加算器型count'(X,Y,0,Z). '加算器型count'(_,[],Z,Z) :- !. '加算器型count'(X,Y,Z1,Z) :- '加算器型count Yが[]で無い限りcountを続ける'(X,Y,Z1,Z). '加算器型count Yが[]で無い限りcountを続ける'(X,[W|Y],Z1,Z) :- 加算するかどうか(X,W,Z1,Z2), '加算器型count'(X,Y,Z2,Z). 加算するかどうか(X,X,Z1,Z2) :- Z2 is Z1 + 1. 加算するかどうか(X,W,Z1,Z1) :- \+(X = W). % 以下のサイトは '_ならび の中に _ある要素 はいくつ存在するか'(_ある要素,_ならび,_いくつ) :- count(_ある要素,_ならび,_いくつ). count(X,Y,Z) :- '加算器型count'(X,Y,0,Z). '加算器型count'(_,[],Z,Z) :- !. '加算器型count'(X,Y,Z1,Z) :- '加算器型count Yが[]で無い限りcountを続ける'(X,Y,Z1,Z). '加算器型count Yが[]で無い限りcountを続ける'(X,[W|Y],Z1,Z) :- 加算するかどうか(X,W,Z1,Z2), '加算器型count'(X,Y,Z2,Z). 加算するかどうか(X,X,Z1,Z2) :- Z2 is Z1 + 1. 加算するかどうか(X,W,Z1,Z1) :- \+(X = W). % 以下のサイトは # 出典 :: twitter_by_@yantene_20150911 # 受験番号、 # 先頭二桁が入学年度(2016年度)、 # 次の一桁が受験先学年種別(博士前期)、 # 次の一桁が試験種別(学内入試)、 # 次の一桁が受験先系(3系)、 # 最後三桁が連番、といったところかな? 'といったところかな?'. '受験番号、 先頭二桁が入学年度(2016年度)、 次の一桁が受験先学年種別(博士前期)、 次の一桁が試験種別(学内入試)、 次の一桁が受験先系(3系)、 最後三桁が連番、といったところかな?'(_受験番号,_年度,_受験先学年種別,_試験種別,_受験先系,_連番) :- '受験番号、'(_受験番号,_年度,_受験先学年種別,_試験種別,_受験先系,_連番). '受験番号、'(_受験番号,_年度,_受験先学年種別,_試験種別,_受験先系,_連番) :- 先頭二桁が入学年度(_受験番号,_年度), 次の一桁が受験先学年種別(_受験番号,_受験先学年種別), 次の一桁が試験種別(_受験番号,_試験種別), 次の一桁が受験先系(_受験番号,_受験先系), 最後三桁が連番(_受験番号,_連番), 'といったところかな?'. 先頭二桁が入学年度(_受験番号,_年度) :- 整数の西暦年を得る(_受験番号,_整数の西暦年), atom_number(_年度数字列,_整数の西暦年), atom_concat(_年度数字列,年度,_年度). 整数の西暦年を得る(_受験番号,_整数の西暦年) :- sub_atom(_受験番号,0,2,_,_年度_1), atom_number(_年度_1,_整数の西暦年の下2桁), _整数の西暦年 is _整数の西暦年の下2桁 + 2000. 次の一桁が受験先学年種別(_受験番号,_受験先学年種別) :- sub_atom(_受験番号,2,1,_,_受験先学年種別コード), 受験先学年種別コード(_受験先学年種別,_受験先学年種別コード). 受験先学年種別コード(修士過程,'1'). 受験先学年種別コード(博士過程前期,'2'). 受験先学年種別コード(博士過程後期,'3'). 次の一桁が試験種別(_受験番号,_試験種別) :- sub_atom(_受験番号,3,1,_,_試験種別コード), 試験種別コード(_試験種別,_試験種別コード). 試験種別コード(学内入試,'1'). 試験種別コード(学外入試,'2'). 次の一桁が受験先系(_受験番号,_受験先系) :- sub_atom(_受験番号,4,1,_,_受験先系コード), 受験先系コード('1系','1'). 受験先系コード('2系','2'). 受験先系コード('3系','3'). 最後の三桁が連番(_受験番号,_連番) :- sub_atom(_受験番号,5,3,_,_連番). % 以下のサイトは # 出典 :: 正規表現 Part9 #786 # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- 'キャリッジ・リターンが30回登場したら'(_文字列,_末尾を削除された文字列). 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列_1,_文字列) :- 'キャリッジ・リターンが30回未満しかない場合そのまま文字列を解とする'(_文字列_1,_文字列). 'キャリッジ・リターンが30回登場したら'(_文字列,_末尾を削除された文字列) :- sub_atom(_文字列,0,_,_,_末尾を削除された文字列), sub_atom(_文字列,_,1,0,'\r'), 度数(sub_atom(_末尾を削除された文字列,_,1,_,'\r'),30). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 'キャリッジ・リターンが30回未満しかない場合そのまま文字列を解とする'(_文字列,_文字列) :- \+('キャリッジ・リターンが30回登場したら'(_文字列,_)). % 以下のサイトは 同一要素数ならびを要素の出現順に得る(_ならび,_同一要素数ならび) :- findall([_要素,_度数],( 同一要素数を得る(_ならび,_要素,_度数)),_同一要素数ならび). 同一要素数を得る(_ならび,_要素,_度数) :- 最初の要素を得る(_ならび,_残りならび,_要素), 度数(member(_要素,[_要素|_残りならび]),_度数). 最初の要素を得る(_ならび,_残りならび,_要素) :- append(_前ならび,[_要素|_残りならび],_ならび), '_前ならびは_要素を含まない'(_前ならび,_要素). '_前ならびは_要素を含まない'(_前ならび,_要素) :- \+(member(_要素,_前ならび)). 度数(_目標,_度数) :- findall(1,_目標,_目標が真になった数だけ整数1を要素とするならび), length(_目標が真になった数だけ整数1を要素とするならび,_度数). % 以下のサイトは 同一要素数ならび(_ならび,_同一要素数ならび) :- findall([_要素,_度数],( 同一要素数を得る(_ならび,_要素,_度数)),_同一要素数ならび). 同一要素数を得る(_ならび,_要素,_度数) :- 最終要素を得る(_ならび,_前要素ならび,_要素), 度数(member(_要素,[_要素|_前要素ならび]),_度数). 最終要素を得る(_ならび,_前要素ならび,_要素) :- append(_前要素ならび,[_要素|_残りならび],_ならび), '_残りならびは_要素を含まない'(_残りならび,_要素). '_残りならびは_要素を含まない'(_残りならび,_要素) :- \+(member(_要素,_残りならび)). 度数(_目標,_度数) :- findall(1,_目標,_目標が真になった数だけ整数1を要素とするならび), length(_目標が真になった数だけ整数1を要素とするならび,_度数). % 以下のサイトは 'コールユーブンゲン No.45 a) の階名'(['ミ-1','ミ-1','ド-1','ソ-1','ファ-1','ミ-1','ファ-1','レ-1','ラ-1','ソ-1','ファ-1','ソ-1','ミ-1','シ-1','ド-2','ファ-1','ラ-1','レ-1','ファ-1','シ-0','ソ-1','ファ-1','ミ-1','ド-1','ソ-1','ファ-1','ミ-1','ラ-1','ファ-1','ド-2','シ-1','ラ-1','ソ-1','ド-2','ミ-1','ラ-1','レ-1','ファ-1','シ-0','レ-1','ソ-1','ド-1','ミ-1','ド-2','シ-1','ラ-1','ド-2','ラ-1','シ-1','ミ-1','シ-1','ド-2','シ-1','ラ-1','ソ-1','ファ-1','ラ-1','ファ-1','ソ-1','ド-1','ソ-1','ラ-1','シ-1','ド-2','ソ-1','レ-2','シ-1','ド-2','ラ-1','ド-2','ラ-1','シ-1','ラ-1','ミ-1','レ-1','ラ-1','ソ-1','ラ-1','ファ-1','ミ-1','ソ-1','ド-1','ド-1','レ-1','ミ-1','ファ-1','ソ-1','ラ-1','ファ-1','ド-2','ラ-1','ソ-1','ファ-1','ラ-1','レ-1','レ-1','ミ-1','ファ-1','ソ-1','ラ-1','シ-1','ソ-1','レ-2','ド-2','シ-1','ド-2','ミ-1','シ-1','ド-2','シ-1','ラ-1','ド-1','ソ-1','ラ-1','ソ-1','ファ-1','ラ-1','ミ-1','ファ-1','ド-1','レ-1','シ-0','レ-1','ソ-1','ド-1']). 'この練習曲がコールユーブンゲンの代表曲だという根拠として、音階の出現数が最も多いことが挙げられる。それではそのことを示す資料を作っておくことにしよう。' :- 'コールユーブンゲン No.45 a) の音階出現表'. 'コールユーブンゲン No.45 a) の音階出現表' :- forall(('コールユーブンゲン No.45 a) に出現する音階とその出現数'(A,B,_出現数),_出現数 > 0), writef('%t,%t,%t\n',[A,B,_出現数])). 'コールユーブンゲン No.45 a) に出現する音階とその出現数'(A,B,_出現数) :- 'コールユーブンゲン No.45 a) に出現する音階と'(L,A,B), その出現数(L,A,B,_出現数). 'コールユーブンゲン No.45 a) に出現する音階と'(L,A,B) :- 'コールユーブンゲン No.45 a) の階名'(L), setof(A,member(A,L),L2), 順列(L2,2,[A,B]). その出現数(L,A,B,_出現数) :- count(append(_,[A,B|_],L),_出現数). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは # 出典 :: CodeIQ q1365 # # 成績の分布などを表すのに使われる度数分布表。 # ひと目で全体の散らばり具合がわかって便利です。 # # 【問題】 # 今回は素数の度数分布表を作ってみます。 # 入力として2つの正の整数が与えられます。 # 一つ目は分布させる素数の最大値、二つ目は区切りの大きさです。 # 例えば、30と5が与えられたとき、30までの素数を5で区切って出力します。 # 30までの素数は2, 3, 5, 7, 11, 13, 17, 19, 23, 29ですので、 # 出力内容は以下のようになります。 # 01-05:*** # 06-10:* # 11-15:** # 16-20:** # 21-25:* # 26-30:* # 同様に、40と7が与えられると、以下のように出力されます。 # 01-07:**** # 08-14:** # 15-21:** # 22-28:* # 29-35:** # 36-42:* # 上記のように出力するプログラムを作成してください。 # なお、最低限、以下の入力に対して正常に動作することを確認してください。 # 入力1:100 15 # 入力2:1200 25 # 入力3:12345 789 # '今回は素数の度数分布表を作ってみます。'(_最大値,_区切り) :- 素数の度数分布表(_最大値,_区切り,_度数分布表), 度数分布図として表示する(_度数分布表). 素数の度数分布表(_最大値,_区切り,_度数分布表) :- 素数を生成する(_最大値,_素数ならび), 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表). 素数を生成する(_最大値,_素数ならび) :- findall(_自然数,between(2,_最大値,_自然数),L), エラトステネスの篩(L,_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([M|R1],[M|R2]) :- エラトステネスの篩(M,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(M,R1,L) :- findall(N,( member(N,R1), \+(0 is N mod M)),L). 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表) :- findall([_範囲下限,_範囲上限,_度数],( 素数の度数分布(_素数ならび,_最大値,_区切り,1,_区切り,_範囲下限,_範囲上限,_度数)),_度数分布表). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限,_範囲上限,_範囲下限,_範囲上限,_度数) :- 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数). 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数) :- _範囲下限 =< _最大値, 度数((between(_範囲下限,_範囲上限,_素数),member(_素数,_素数ならび)),_度数). '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- _範囲下限_1 =< _最大値, 次の範囲を確定する(_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限), 素数の度数分布(_素数ならび,_最大値,_区切り,_次の範囲下限,_次の範囲上限,_範囲下限,_範囲上限,_度数). 次の範囲を確定する(_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限) :- _次の範囲下限 is _範囲下限_1 + _区切り, _次の範囲上限 is _範囲上限_1 + _区切り. 度数(_目標,_度数) :- findall(_,_目標,L), length(L,_度数). 度数分布図として表示する(_度数分布表) :- 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数), 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数). 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数), 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲上限の表示桁数). 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数) :- findall(_桁数,範囲下限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲下限の表示桁数). 範囲下限値の桁数(_度数分布表,_下限桁数) :- member([_範囲下限,_,_],_度数分布表), number_chars(_範囲下限,Chars), length(Chars,_下限桁数). 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲の表示桁数) :- findall(_桁数,範囲上限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲の表示桁数). 範囲上限値の桁数(_度数分布表,_上限桁数) :- member([_,_範囲上限,_],_度数分布表), number_chars(_範囲上限,Chars), length(Chars,_上限桁数). 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- forall( member([_範囲下限,_範囲上限,_度数],_度数分布表), 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数)). 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数) :- ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列), 星文字列(_度数,_星文字列), writef('%w:%w\n',[_範囲表現文字列,_星文字列]). ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列) :- ヘッドゼロサプライ(_範囲下限の表示桁数,_範囲下限,_表示範囲下限), ヘッドゼロサプライ(_範囲上限の表示桁数,_範囲上限,_表示範囲上限), atomic_list_concat([_表示範囲下限,'-',_表示範囲上限],_範囲表現文字列). ヘッドゼロサプライ(_桁数,_数値,_ヘッドゼロサプライ数値表現) :- ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト), 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト), 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現). ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト) :- length(_ヘッドゼロサプライされたリスト,_桁数). 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト) :- number_chars(_数値,_数字のリスト), append(_頭部の枠リスト,_数字のリスト,_ヘッドゼロサプライされたリスト), 全ての要素が同じ(_頭部の枠リスト,'0'). 全ての要素が同じ([],_). 全ての要素が同じ([V|R],V) :- 全ての要素が同じ(R,V). 星文字列(_度数,_星文字列) :- findall(*,between(1,_度数,_),L), atomic_list_concat(L,_星文字列). 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現) :- atom_chars(_ヘッドゼロサプライ数値表現,_ヘッドゼロサプライされたリスト). % 以下のサイトは # 出典 :: わかりやすい Javaによる医療言語処理入門 p62-65 # # n-gram :: 文字列から文字の出現確率を求める。 # 'n-gram'(_文字列,_文字,_出現確率) :- 文字の出現頻度の総数を求める(_文字列,_文字の出現頻度の総数), 文字の出現頻度(_文字列,_文字,_文字の出現頻度), _出現確率 is _文字の出現頻度 / _文字の出現頻度の総数. 文字の出現頻度の総数を求める(_文字列,_文字の出現頻度の総数) :- sub_atom(_文字列,_,_文字の出現頻度の総数,_,_文字列). 文字の出現頻度(_文字列,_文字,_文字の出現頻度) :- 重複なく文字を取り出す(文字列,_文字), 頻度(文字を取り出す(_文字列,_文字),_文字の出現頻度). 重複なく文字を取り出す(_文字列,_文字) :- 文字の集合(_文字列,_文字の集合), member(_文字,_文字の集合). 文字の集合(_文字列,_文字の集合) :- setof(C,(A,B,C) ^ sub_atom(_文字列,A,1,B,C),_文字の集合). 文字を取り出す(_文字列,_文字) :- sub_atom(_文字列,_,1,_,_文字). 頻度(P,_頻度) :- findall(1,P,L), length(L,_頻度). % 以下のサイトは # 出典 :: わかりやすい Javaによる医療言語処理入門 p60-61 # 文字列から二文字の出現頻度を求める。 # 二文字の出現頻度(_文字列,_二文字,_二文字の出現頻度) :- 重複なく二文字を取り出す(文字列,_二文字), 頻度(二文字を取り出す(_文字列,_二文字),_二文字の出現頻度). 重複なく二文字を取り出す(_文字列,_二文字) :- 二文字の集合(_文字列,_二文字の集合), member(_二文字,_二文字の集合). 二文字の集合(_文字列,_二文字の集合) :- setof(C_2,(A,B,C_2) ^ sub_atom(_文字列,A,2,B,C_2),_二文字の集合). 二文字を取り出す(_文字列,_二文字) :- sub_atom(_文字列,_,2,_,_二文字). 頻度(P,_頻度) :- findall(1,P,L), length(L,_頻度). % 以下のサイトは % [1] 授業単元:C言語演習課題 % http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9422.txt % 問題 % 年と月を「YYYY/MM」と入力し、入力された月のカレンダーを表示しなさい。 % % 1752年10月以前、及び10000年1月以降はエラーを返す。 % % 出力形式は以下のとおり % ・1行目は該当月の1日が月曜日でなければ、前月の最終月曜日から表示。 % ・該当月の最終日が日曜日でなければ、翌月の第1日曜日まで表示。 % ・6行目の表示が必要ない場合は表示しない。 % % うるう年判定は以下のとおり % ・年が4で割り切れる年はうるう年。 % ・年が100で割り切れる年はうるう年でない。 % ・年が400で割り切れる年はうるう年である。 % % [出力例] % 年月日を入力:2009/07 % % 月 火 水 木 金 土 日 % 29 30 01 02 03 04 05 % 06 07 08 09 10 11 12 % 13 14 15 16 17 18 19 % 20 21 22 23 24 25 26 % 27 28 29 30 31 01 02 課題のカレンダー(_年/_月) :- not((_年/_月 >= 1752/10,_年/_月 =< 10000/1)), write('エラー: 入力された年月は範囲を逸脱しています\n'),!. 課題のカレンダー(_年/_月) :- _年/_月 @=< 2009/6,!, 曜日検索(_日付,_曜日,2009/6/13,土曜), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー(_年/_月) :- _年/_月 @>= 2009/6,!, 曜日検索(2009/6/13,土曜,_日付,_曜日), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー表示(_年/_月/_日,月曜) :- 日付候補を得る(_年/_月/_日,_年/_月/_日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 課題のカレンダー表示(_年/_月/_日,_曜日) :- not(_曜日=月曜), 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日), 日付候補を得る(_年/_月/_日,_前週の月曜日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日) :- 曜日検索(_前週の月曜日,_前週の曜日,_年/_月/_日,_曜日), _前週の曜日 = 月曜,!. 日付候補を得る(_年/_月/_日,_起点日付,_曜日,_日付整数ならび) :- findall(_日付,( 曜日(_起点日付,_曜日,_日付2,_),(_日付2=_年2/_月2/7,_年2/_月2 @> _年/_月,!,fail;true)),_日付整数ならび). 課題のカレンダー週表示(_日付整数ならび) :- n個組(7,_日付整数ならび,_7個組), 月曜から日曜までヘッドゼロサプライで表示(_7個組). 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t\n',[_日文字列]),!. 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日|R]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t ',[_日付文字列]), 月曜から日曜までヘッドゼロサプライで表示(R). 課題のカレンダー見出し表示 :- write_formatted('月 火 水 木 金 土 日\n'). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_日付,_曜日,_今日,_今日の曜日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_前日,_前日の曜日,_今日,_今日の曜日), 曜日検索(_日付,_曜日,_前日,_前日の曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_日付,_曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_翌日,_翌日の曜日), 曜日検索(_翌日,_翌日の曜日,_日付,_曜日). '曜日'(_日付,_曜日,_日付,_曜日) :- ! . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @> _日付2, '前日・今日'(_日付3,_曜日3,_日付1,_曜日1), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @< _日付2, '前日・今日'(_日付1,_曜日1,_日付3,_曜日3), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . 前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :- not(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/550 # # [1] 授業単元: Ruby演習 [2] 問題文、http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9426.txt # Rubyの問題がわかりません 助けてください # # (1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい # # p wday["sunday"] #=> "日曜日" # p wday["monday"] #=> "月曜日" # p wday["saturday"] #=> "土曜日" # # (2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい # # (3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてくださ い。 # 「sunday」は日曜日のことです。 # 「monday」は月曜日のことです。 # # (4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行(正 規表現で定義するなら「/\uff3cs+/」)で区切られた文字列をハッシュに変換するメソ ッドstr2hashを定義してください。 # # p str2hash("bule 青 white 白\uff3cnred赤"); # #=> {"bule"=>"青", "white"=>"白", "red"=>"赤"} :- op(450,xfx,(=>)). % (1) wday({ "sunday" => "日曜日","monday" => "月曜日","saturday" #=> "土曜日"}). % (2) hash_count(Hashname,Count) :- functor(P,Hashname,1), call(P), arg(1,P,H), count(H,Count). count(','(A,B),Count) :- count(B,Count2), Count is Count2 + 1. count(A,1). % (3) ?- each(wday.A=>B),write_formatted('「%t」は%tのことです。\n',[A,B]),fail;true. each(Hashname.Key=>Value) :- functor(P,Hashname,1), arg(1,P,V), each(V,Key=>Value). each(','(Key=>Value,B),Key=>Value). each(','(_,B),Key=>Value) :- each(B,Key=>Value). each(Key=>Value,Key=>Value). % (4) str2hash(Atom,Hash) :- split(Atom,[' ','\t','\n'],L), findall(U,n個組(2,L,U),L2), hashを成長させる(L2,Hash). hashを成長させる([A,B],{ A=>B }) :- !. hashを成長させる([[A,B]|R], { (A=>B,R2) }) :- hashを成長させる(R,{ R2 }). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/103 # # 【質問テンプレ】 # [1] 授業単元: C言語演習 # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9753.txt # 2.入力された年月の1日が何曜日かを調べる。 #   曜日のチェックはZellerの公式を使用する。Zellerの公式は、 #    #   曜日を表す値=(y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ (( 13 * m ) + 8 ) / 5 ] + d ) % 7 # #           ※ 上記の公式中の y は年、 m は月、 d は日を表し、 #             []はその数を越えない最大の整数を表す。(例: [13.6]は13になる) # #   で、曜日を表す値は次のようになっている。 # #     日曜日 = 0, 月曜日 = 1, 火曜日 = 2, 水曜日 = 3, # # 木曜日 = 4, 金曜日 = 5, 土曜日 = 6, # #   ※但し、1月と2月は前年の13月14月として計算するものとする。 % (1) 年月の入力 年月入力処理(_年,_月) :- 年入力処理(_年), 月入力処理(_月). % (2) 曜日計算 :- op(450,xfx,が),op(500,xfx,であり),op(600,xfx,ならば),op(450,xfx,は). 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は (Y + Y // 4 - Y // 100 + Y // 400 + ((( 13 * M ) + 8 ) // 5 ) + D ) mod 7). 曜日計算処理(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値), 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値を得る'(_年,1,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,13,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,2,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,14,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値) :- _年=Y,_月=M,_日=D, 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は _Zellerの公式), _曜日を表す値 is _Zellerの公式,!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % (3) カレンダー表示 カレンダー表示 :- 年月入力処理(_年,_月), 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,1,_曜日を表す整数値), カレンダー表示データ編集(_年,_月,_曜日を表す整数値,_カレンダー表示文字列ならび), 要素に空白を挿入して全行表示(_カレンダー表示文字列ならび). カレンダー表示データ編集(_年,_月,_各月1日の曜日を表す整数値,_カレンダー表示文字列ならび) :- 年月文字列編集処理(_年,_月,_年月文字列), 月日数(_年,_月,_月日数), findall(S,for(1,N,_月日数),ヘッドゼロサプレス(2,N,S)),_表示日ならび), Length is _月日数 + _各月1日の曜日を表す整数値, M is (7 - (Length mod 7)), '7個組ならび'(Length,M,_表示日ならび,_7個組ならび), 見出しならび(_年月文字列,_見出しならび), append(_見出しならび,_7個組ならび,_カレンダー表示文字列ならび). 見出しならび(_年月文字列,[[_年月文字列],[日,月,火,水,木,金,土]]). '7個組ならび'(Length,0,_表示日ならび,_7個組ならび) :- length(L0,Length), すべての要素が(L0,' '), append(L0,_表示日ならび,L), '7個組'(L,_7個組ならび),!. '7個組ならび'(Length,M,_表示日ならび,_7個組ならび) :- not(M=0), length(L0,Length), すべての要素が(L0,' '), length(L2,M), すべての要素が(L2,' '), append(L0,_表示日ならび,L2,L), '7個組'(L,_7個組ならび),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,28) :- not(うるう年(_年)),!. 月日数(_,_月,30) :- member(_月,[4,6,9,11]). 月日数(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). % (4) 基礎述語の定義 年入力処理(_年) :- write('表示したいカレンダーは西暦何年 ? '), get_line(_行), 年入力処理の二(_行,_年), 年入力検査(_年),!. 年入力処理(_年) :- 年入力処理(_年). 年入力処理の二(_行,_年) :- atom_to_term(_行,_年), integer(_年),!. 年入力処理の二(_行,_年) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 年入力検査(_年) :- _年 >= 1583, _年 =< 3999,!. 年入力検査(_年) :- write_formatted('この年を表す整数%tは不正です\n',[_年]), fail. 月入力処理(_月) :- write('月は ? '), get_line(_行), 月入力処理の二(_行,_月), 月入力検査(_月),!. 月入力処理(_月) :- 月入力処理(_月). 月入力処理の二(_行,_月) :- atom_to_term(_行,_月,_), integer(_月),!. 月入力処理の二(_行,_月) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 月入力検査(_月) :- _月 >= 1, _月 =< 12,!. 月入力検査(_月) :- write_formatted('この月を表す整数%tは不正です\n',[_月]), fail. 日付文字列編集処理(_年,_月,_日,_日付文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), ヘッドゼロサプライ(2,_日,_日文字列), concat_atom([_年文字列,_月文字列,_日文字列],_日付文字列). 年月文字列編集処理(_年,_月,_年月文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), concat_atom([_年文字列,_月文字列],_年月文字列). ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). ヘッドゼロサプレス(N桁,_整数,_ヘッド空白整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプレス_1(N桁,_数字ならび,_ヘッド空白整数文字ならび), concat_atom(_ヘッド空白整数文字ならび,_ヘッド空白整数文字列),!. ヘッドゼロサプレス_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプレス_1(N桁,L,[' '|R]) :- M桁 is N桁 - 1, ヘッドゼロサプレス_1(M桁,L,R). 要素に空白を挿入して全行表示([]) :- !. 要素に空白を挿入して全行表示([L|R]) :- concat_atom(L,' ',_表示行), write_formatted('%t\n',[_表示行]), 要素に空白を挿入して全行表示(R). すべての要素が([],_). すべての要素が([V|R],V) :- すべての要素が(R,V). '7個組'([],[]) :- !. '7個組'([A,B,C,D,E,F,G|R1]),[[A,B,C,D,E,F,G]|R2]) :- '7個組'(R1,R2). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. not(P) :- \+(P). append([],L1,L2,L) :- append(L1,L2,L) . append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R) . concat_atom([],'') :- !. concat_atom([A],A) :- !. concat_atom([A|R],S) :- concat_atom(R,S1), atom_concat(A,S1,S). concat_atom([],_,'') :- !. concat_atom([A],_,A) :- !. concat_atom([A|R],_区切り文字列,S) :- concat_atom(R,_区切り文字列,S1), atom_concat(A,_区切り文字列,S2), atom_concat(S2,S1,S). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/157 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9762.txt # # 正数による正方行列のうち、全ての行、列、斜め列の合計が同じであり、 # かつ2回以上使用される数字が存在しないものを魔方陣という。 # 下図に示すa,bに数値を設定したときに、1〜9の整数によって構成される魔方陣を # 出力するプログラムを作成せよ。 # 但し、魔方陣が作成不可能な(a,b)の組み合わせが設定された場合は、「Impossible」 # と出力するとする。 # # la_lb_l__l # l__l__l__l # l__l__l__l # 魔方陣(N枡,A,B,_行列) :- 魔方陣のための行列の生成(N枡,_行列), _行列 = [[A,B|_],_,_], 行の合計が全て一致する(_行列,S), 列の合計が全て一致する(_行列,S), 正方行列の斜め要素の合計が一致する(_行列,S). 魔方陣のための行列の生成(N枡,_行列) :- N2 is N枡 ^ 2, findall(M,for(1,M,N2),NL),!, 順列(NL,N2,_順列数字ならび), findall(_N個組,n個組(N枡,_順列数字ならび,_N個組),_行列). 行の合計が全て一致する([],S) :- !. 行の合計が全て一致する([_行|R],S) :- 魔方陣の加算(_行,0,S), 行の合計が全て一致する(R,S). 列の合計が全て一致する(_行列,S) :- 行列の転置(_行列,_転置行列), 列の合計が全て一致する(_転置行列,S),!. 正方行列の斜め要素の合計が一致する(_正方行列,S) :- length(_行列,Len), 左上から右下方向の合計(1,Len,_正方行列,0,S), 右上から左下方向の合計(1,Len,_正方行列,0,S),!. 左上から右下方向の合計(M,N,_,S,S) :- M > N,!. 左上から右下方向の合計(M,N,_行列,S1,S) :- list_nth(M,_行列,_行), list_nth(M,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 左上から右下方向の合計(M2,N,_行列,S2,S),!. 右上から左下方向の合計(M,N,_,S,S) :- M > N,!. 右上から左下方向の合計(M,N,_行列,S1,S) :- M1 is N - M + 1, list_nth(M1,_行列,_行), list_nth(M1,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 右上から左下方向の合計(M2,N,_行列,S2,S),!. n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. 魔方陣の加算([],X,X) :- !. 魔方陣の加算([A|R],Y,X) :- Z is A + Y, 魔方陣の加算(R,Z,X). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/566 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 番号と点数を配列に初期化して、それらを # 5段階にランク付けをして、受験番号・ランクを表示するプログラムを作成。 # ランク付けをする部分を関数Rankとして、番号と評価を表示する部分を関数Outputとすること。 # なお、ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 # 60〜79点をB、80〜100点をAとする。 # ただし、受験者の数は、50人以下とする。 # 番号と点数は、以下の配列を使用すること。 # 番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10}; # 点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100}; # '問題文の5段階にランク付け'('ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 60〜79点をB、80〜100点をAとする。 '). 番号の定義文('番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10};'). 点数の定義文('点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100};'). 'ランクならびの生成'(_ランクならび) :- '問題文の5段階にランク付け'(_ランク定義文), ランクの定義文解析(_ランク定義文,_ランクならび). 番号ならびの生成(_番号ならび) :- 番号の定義文(_番号の定義文), 番号の定義文解析(_番号の定義文,_番号ならび). 点数ならびの生成(_点数ならび) :- 点数の定義文(_点数の定義文), 点数の定義文解析(_点数の定義文,_点数ならび). '5段階にランク付けをして、受験番号・ランクを表示する' :- ランクならびの生成(_ランクならび), 番号ならびの生成(_番号ならび), 点数ならびの生成(_点数ならび), '5段階にランク付けをして、受験番号・ランクを表示する'(_番号ならび,_点数ならび,_ランクならび). '5段階にランク付けをして、受験番号・ランクを表示する'([],[],_). '5段階にランク付けをして、受験番号・ランクを表示する'([_番号|R1],[_点数|R2],_ランクならび) :- append(_,[[_点数下限,_点数上限,_ランク]|_],_ランクならび), _点数 >= _点数下限, _点数 =< _点数上限, writef('受験番号:%t ランク:%t\n',[_番号,_ランク]), '5段階にランク付けをして、受験番号・ランクを表示する'(R1,R2,_ランクならび). ランクの定義文解析(_ランク定義文,_ランクならび) :- 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文), split(_半角数字変換されたランク定義文,[' ','。','、','〜','点を','とする'],L), n個組(3,L,_ランクならび). 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文) :- atom_chars(_ランク定義文,Chars), findall(_文字_1, append(_,[_文字|_],Chars), 全角数字ならば半角数字に変換(_文字,_文字_1)), Chars2), atom_chars(_半角数字変換されたランク定義文,Chars2). 全角数字ならば半角数字に変換([_全角数字|R1],[_半角数字|R2]) :- 全角数字半角数字変換(_全角数字,_半角数字), 全角数字ならば半角数字に変換(R1,R2). 全角数字ならば半角数字に変換([_文字|R1],[_文字|R2]) :- \+(全角数字半角数字変換(_文字,_)), 全角数字ならば半角数字に変換(R1,R2). 全角数字半角数字変換(0,0). 全角数字半角数字変換(1,1). 全角数字半角数字変換(2,2). 全角数字半角数字変換(3,3). 全角数字半角数字変換(4,4). 全角数字半角数字変換(5,5). 全角数字半角数字変換(6,6). 全角数字半角数字変換(7,7). 全角数字半角数字変換(8,8). 全角数字半角数字変換(9,9). 番号の定義文解析(_番号の定義文,_番号ならび) :- split(_番号の定義文,['=',',',';'],[_|_番号ならび]). 点数の定義文解析(_点数の定義文,_点数ならび) :- split(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは # 指数表記を使わずに整数を素因数分解することを考えます。 # つまり、「72=2×2×2×3×3」のように表現します。 # このときに使う『×』の数は4つです。 # # ここで、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなるものを考えます。 # 上の72の例であれば、各桁の和は7+2で「9」ですが、『×』の数は「4」なので不適です。 # # この条件を満たすものとしては、「110=2×5×11」や「210=2×3×5×7」、 # 「512=2×2×2×2×2×2×2×2×2」などがあります。 # # では、4桁の整数で上記の条件を満たす数をすべて求めてください。 # # プログラミング言語は不問です。 # お好きな言語で計算してください。 # # 【解答方法】 # 解答用テキストファイルをダウンロードしてください。 # # 解答用テキストファイルを完成させ、アップロードしてください。 '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める' :- findall(_4桁の数,( '4桁の数の各桁の合計'(_4桁の数,_乗算記号度数), 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(_4桁の数,_指数表記を使った素因数分解,_乗算記号度数)),L), writef('%t\n',[L]). '4桁の数の各桁の合計'(_4桁の数,_各桁の合計) :- between(1000,9999,_4桁の数), 各桁の合計(_4桁の数,0,_各桁の合計). 各桁の合計(0,_各桁の合計,_各桁の合計) :- !. 各桁の合計(N,_各桁の合計_1,_各桁の合計) :- M is N mod 10, N_1 is N // 10, _各桁の合計_2 is _各桁の合計_1 + M, 各桁の合計(N_1,_各桁の合計_2,_各桁の合計). 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(N,_指数表記を使った素因数分解,_乗算記号度数) :- 素因数分解(2,N,N,0,[],L), 素因数分解項構成(L,_指数表記を使った素因数分解,0,_乗算記号度数). 素因数分解(U,M,N,C,X,X) :- U > N // 2,!. 素因数分解(U,M,N,0,Y,X) :- member(J^_,Y), 0 is U mod J, U2 is U + 2, 素因数分解(U2,N,N,0,Y,X),!. 素因数分解(2,M,N,0,Y,X) :- \+(0 is M mod 2), 素因数分解(3,N,N,0,Y,X),!. 素因数分解(2,M,N,C,Y,X) :- \+(0 is M mod 2), 素因数分解(3,N,N,0,[2^C|Y],X),!. 素因数分解(U,M,N,0,Y,X) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, 素因数分解(U2,N,N,0,Y,X),!. 素因数分解(U,M,N,C,Y,X) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, 素因数分解(U2,N,N,0,[U^C|Y],X),!. 素因数分解(U,M,N,C,Y,X) :- 0 is M mod U, C2 is C + 1, M1 is M // U, 素因数分解(U,M1,N,C2,Y,X). 素因数分解項構成([J^M],J^M,_乗算記号度数_1,_乗算記号度数) :- _乗算記号度数 is _乗算記号度数_1 + M -1,!. 素因数分解項構成([J^M|R1],B * J^M,_乗算記号度数_1,_乗算記号度数) :- _乗算記号度数_2 is _乗算記号度数_1 + M, 素因数分解項構成(R1,B,_乗算記号度数_2,_乗算記号度数). :- '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める',halt. % 以下のサイトは # 指数表記を使わずに整数を素因数分解することを考えます。 # つまり、「72=2×2×2×3×3」のように表現します。 # このときに使う『×』の数は4つです。 # # ここで、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなるものを考えます。 # 上の72の例であれば、各桁の和は7+2で「9」ですが、『×』の数は「4」なので不適です。 # # この条件を満たすものとしては、「110=2×5×11」や「210=2×3×5×7」、 # 「512=2×2×2×2×2×2×2×2×2」などがあります。 # # では、4桁の整数で上記の条件を満たす数をすべて求めてください。 # # プログラミング言語は不問です。 # お好きな言語で計算してください。 # # 【解答方法】 # 解答用テキストファイルをダウンロードしてください。 # # 解答用テキストファイルを完成させ、アップロードしてください。 '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める'(L) :- findall(N,( between(1000,9999,N), 各桁の合計(N,0,_乗算記号度数), 素因数分解(N,X,_乗算記号度数)),L). 各桁の合計(0,_各桁の合計,_各桁の合計) :- !. 各桁の合計(N,_各桁の合計_1,_各桁の合計) :- M is N mod 10, N_1 is N // 10, _各桁の合計_2 is _各桁の合計_1 + M, 各桁の合計(N_1,_各桁の合計_2,_各桁の合計). 素因数分解表示(N) :- 素因数分解(N,X,_乗算記号度数), writef('%t = %t\n乗算記号度数 = %t\n',[N,X,_乗算記号度数]). 素因数分解(N,X,_乗算記号度数) :- 素因数分解(2,N,N,0,[],L,0,_乗算記号度数_1), 素因数分解項構成(L,X,_乗算記号度数_1,_乗算記号度数). 素因数分解(U,M,N,C,X,X,_乗算記号度数,_乗算記号度数) :- U > N // 2,!. 素因数分解(U,M,N,0,Y,X,_乗算記号度数_1,_乗算記号度数) :- member(J^_,Y), 0 is U mod J, U2 is U + 2, 素因数分解(U2,N,N,0,Y,X,_乗算記号度数_1,_乗算記号度数),!. 素因数分解(2,M,N,0,Y,X,_乗算記号度数_1,_乗算記号度数) :- \+(0 is M mod 2), 素因数分解(3,N,N,0,Y,X,_乗算記号度数_1,_乗算記号度数),!. 素因数分解(2,M,N,C,Y,X,_乗算記号度数_1,_乗算記号度数) :- \+(0 is M mod 2), _乗算記号度数_2 is _乗算記号度数_1 + C - 1, 素因数分解(3,N,N,0,[2^C|Y],X,_乗算記号度数_2,_乗算記号度数),!. 素因数分解(U,M,N,0,Y,X,_乗算記号度数_1,_乗算記号度数) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, 素因数分解(U2,N,N,0,Y,X,_乗算記号度数_1,_乗算記号度数),!. 素因数分解(U,M,N,C,Y,X,_乗算記号度数_1,_乗算記号度数) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, _乗算記号度数_2 is _乗算記号度数_1 + C - 1, 素因数分解(U2,N,N,0,[U^C|Y],X,_乗算記号度数_2,_乗算記号度数),!. 素因数分解(U,M,N,C,Y,X,_乗算記号度数_1,_乗算記号度数) :- 0 is M mod U, C2 is C + 1, M1 is M // U, 素因数分解(U,M1,N,C2,Y,X,_乗算記号度数_1,_乗算記号度数). 素因数分解項構成([A],A,_乗算記号度数,_乗算記号度数) :- !. 素因数分解項構成([A|R1],B * A,_乗算記号度数_1,_乗算記号度数) :- _乗算記号度数_2 is _乗算記号度数_1 + 1, 素因数分解項構成(R1,B,_乗算記号度数_2,_乗算記号度数). % 以下のサイトは # 指数表記を使わずに整数を素因数分解することを考えます。 # つまり、「72=2×2×2×3×3」のように表現します。 # このときに使う『×』の数は4つです。 # # ここで、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなるものを考えます。 # 上の72の例であれば、各桁の和は7+2で「9」ですが、『×』の数は「4」なので不適です。 # # この条件を満たすものとしては、「110=2×5×11」や「210=2×3×5×7」、 # 「512=2×2×2×2×2×2×2×2×2」などがあります。 # # では、4桁の整数で上記の条件を満たす数をすべて求めてください。 # # プログラミング言語は不問です。 # お好きな言語で計算してください。 # # 【解答方法】 # 解答用テキストファイルをダウンロードしてください。 # # 解答用テキストファイルを完成させ、アップロードしてください。 '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める'(_各桁の和と乗算記号度数の一致する4桁の数ならび) :- '9999以下の素数ならび'(_9999以下の素数ならび), findall(_4桁の数,( '4桁の数の各桁の合計'(_4桁の数,_乗算記号度数), 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(_4桁の数,_9999以下の素数ならび,_乗算記号度数)),_各桁の和と乗算記号度数の一致する4桁の数ならび). '9999以下の素数ならび'(_9999以下の素数ならび) :- findall(N,between(2,9999,N),_2以上9999以下の数リスト), エラトステネスの篩(_2以上9999以下の数リスト,_9999以下の素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([M|R1],[M|R2]) :- 'R1の残りの数ならびの中で、Mで割り切れるものは篩い落とす'(M,R1,L), エラトステネスの篩(L,R2). 'R1の残りの数ならびの中で、Mで割り切れるものは篩い落とす'(M,R1,L) :- findall(N,( 'R1の残りの数ならびの中で'(R1,N), 'Mで割り切れるものは篩い落とす'(N,M)),L). 'R1の残りの数ならびの中で'(R1,N) :- member(N,R1). 'Mで割り切れるものは篩い落とす'(N,M) :- \+(0 is N mod M). '4桁の数の各桁の合計'(_4桁の数,_各桁の合計) :- between(1000,9999,_4桁の数), 各桁の合計(_4桁の数,0,_各桁の合計). 各桁の合計(0,_各桁の合計,_各桁の合計) :- !. 各桁の合計(N,_各桁の合計_1,_各桁の合計) :- '下位1桁を切り取って加算する'(N,_各桁の合計_1,_下位一桁を切り取った数,_各桁の合計_2), 各桁の合計(_下位一桁を切り取った数,_各桁の合計_2,_各桁の合計). '下位1桁を切り取って加算する'(N,_各桁の合計_1,_下位一桁を切り取った数,_各桁の合計_2) :- M is N mod 10, _下位一桁を切り取った数 is N // 10, _各桁の合計_2 is _各桁の合計_1 + M. 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(N,_素数ならび,_乗算記号度数) :- 素数で何回割り切れるか(N,_素数ならび,[],_素因数の数の合計を表すならび), 素因数の数の合計を表すならびから乗算記号度数を得る(_素因数の数の合計を表すならび,_乗算記号度数). 素数で何回割り切れるか(N,[],_何回,_何回). 素数で何回割り切れるか(N,[_素数|R],_何回_1,_何回) :- 一つの素数で割ることができる数を加算する(N,_素数,_何回_1,_何回_2), 素数で何回割り切れるか(N,R,_何回_2,_何回). 一つの素数で割ることができる数を加算する(N,_素数,_何回,_何回) :- 素数で割り切れなくなったらその素数は終了する(N,_素数),!. 一つの素数で割ることができる数を加算する(N,_素数,L1,L) :- 素数で割れるだけ割っていく(N,_素数,L1,N_1,L). 素数で割り切れなくなったらその素数は終了する(N,_素数) :- \+(0 is N mod _素数). 素数で割れるだけ割っていく(N,_素数,L1,N_1,L) :- N_1 is N // _素数, 一つの素数で割ることができる数を加算する(N_1,_素数,[_|L1],L). 素因数の数の合計を表すならびから乗算記号度数を得る([_|L],_乗算記号度数) :- length(L,_乗算記号度数). % 以下のサイトは # 指数表記を使わずに整数を素因数分解することを考えます。 # つまり、「72=2×2×2×3×3」のように表現します。 # このときに使う『×』の数は4つです。 # # ここで、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなるものを考えます。 # 上の72の例であれば、各桁の和は7+2で「9」ですが、『×』の数は「4」なので不適です。 # # この条件を満たすものとしては、「110=2×5×11」や「210=2×3×5×7」、 # 「512=2×2×2×2×2×2×2×2×2」などがあります。 # # では、4桁の整数で上記の条件を満たす数をすべて求めてください。 # # プログラミング言語は不問です。 # お好きな言語で計算してください。 # # 【解答方法】 # 解答用テキストファイルをダウンロードしてください。 # # 解答用テキストファイルを完成させ、アップロードしてください。 '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める' :- findall(_4桁の数,( '4桁の数の各桁の合計'(_4桁の数,_乗算記号度数), 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(_4桁の数,_指数表記を使った素因数分解,_乗算記号度数)),L), writef('%t\n',[L]). '4桁の数の各桁の合計'(_4桁の数,_各桁の合計) :- between(1000,9999,_4桁の数), 各桁の合計(_4桁の数,0,_各桁の合計). 各桁の合計(0,_各桁の合計,_各桁の合計) :- !. 各桁の合計(N,_各桁の合計_1,_各桁の合計) :- M is N mod 10, N_1 is N // 10, _各桁の合計_2 is _各桁の合計_1 + M, 各桁の合計(N_1,_各桁の合計_2,_各桁の合計). 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(N,_指数表記を使った素因数分解,_乗算記号度数) :- 素因数分解(2,N,N,0,[],L), 素因数分解項構成(L,_指数表記を使った素因数分解,0,_乗算記号度数). 素因数分解(U,M,N,C,X,X) :- U > N // 2,!. 素因数分解(U,M,N,0,Y,X) :- member(J^_,Y), 0 is U mod J, U2 is U + 2, 素因数分解(U2,N,N,0,Y,X),!. 素因数分解(2,M,N,0,Y,X) :- \+(0 is M mod 2), 素因数分解(3,N,N,0,Y,X),!. 素因数分解(2,M,N,C,Y,X) :- \+(0 is M mod 2), 素因数分解(3,N,N,0,[2^C|Y],X),!. 素因数分解(U,M,N,0,Y,X) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, 素因数分解(U2,N,N,0,Y,X),!. 素因数分解(U,M,N,C,Y,X) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, 素因数分解(U2,N,N,0,[U^C|Y],X),!. 素因数分解(U,M,N,C,Y,X) :- 0 is M mod U, C2 is C + 1, M1 is M // U, 素因数分解(U,M1,N,C2,Y,X). 素因数分解項構成([J^M],J^M,_乗算記号度数_1,_乗算記号度数) :- _乗算記号度数 is _乗算記号度数_1 + M -1,!. 素因数分解項構成([J^M|R1],B * J^M,_乗算記号度数_1,_乗算記号度数) :- _乗算記号度数_2 is _乗算記号度数_1 + M, 素因数分解項構成(R1,B,_乗算記号度数_2,_乗算記号度数). :- '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める',halt. % 以下のサイトは # # ガリ夫くん:スマ子さん、最近実は数字萌えに目覚めたんです! # # スマ子さん: 藪から棒にアブノーマル宣言をされても困るのだけれども……。 # # ガリ夫くん:特に1ちゃんと0ちゃんは最高っすよ! 長女として他の数字子ちゃん達を一生懸命支える1ちゃん。全てを無に帰す力を持ったミステリアス美少女の0ちゃん。……かわええ〜。 # # スマ子さん:……もう帰っていいかしら。 # # ガリ夫:もう数の世界には1ちゃんと0ちゃん以外要りません! 1ちゃんと0ちゃんさえいれば、それで満足です! # # スマ子さん:あら、それはなかなか鋭い指摘ね。 # # ガリ夫くん:……と言いますと? # # スマ子さん:実は、私たちが普段使っている数は、勝手に0〜9までの数を使いますよと決めているに過ぎないの。実際には0と1だけでも数を表すことは可能なのよ。 # # ガリ夫くん:ほうほう……。 # # スマ子さん:これを2進法って言うんだけれどもね。一の位が1になったら、その次の位は一の位を0に戻して、その上の位を1増やして……ってしていくとあらゆる数を表すことができるわ。例えば、1,10,11,100,101,110,111……ってな具合にね。 # # ガリ夫くん:なるほど! と言うことは全ての数は1ちゃんと0ちゃんのハーレムと化すんですね! ここは天国か! # # スマ子さん:……。ところでガリ夫くん、1ちゃんと0ちゃんはどちらがお好き? # # ガリ夫くん:う〜〜〜ん……甲乙つけ難いですが、やっぱり健気な1ちゃんですかね〜。 # # スマ子さん:じゃあその1ちゃん、ハーレムの中にどれぐらいいるのか、知りたくない? # # ガリ夫くん:知りたい知りたい! 1ちゃんのこと、もっと知りたい! # # スマ子さん:うわあ……。ま、まあいいわ! 1ちゃんの数を数えて、それじゃあ2014年にちなんでこんな問題を解いてみましょう! そう、スマートにね! # # # 【問】 # 1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか、答えてください。 # # 解答用テキストファイルに問題の答えと、その答えを導出したプロセスを記述して、提出してください。 # また、プログラムを使用した場合はソースコードを解答用テキストファイルに貼り付けてください。言語は問いませんが、ideone(http://ideone.com/)で実行できるものを解答として提出してください。 # '1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか、答えてください。'(_ペアの組数) :- findall(_2進法で表した時に1の登場する回数,( '1〜2014までの数を2進法で表した時に1の登場する回数'(_数を2進法で表した時に1の登場する回数)),_2進法で表した時に1の登場する回数ならび), 度数(append(_,[_1の回数,_1の回数|_],_数を2進法で表した時に1の登場する回数ならび),_ペアの組数). '1〜2014までの数を2進法で表した時に1の登場する回数'(_数を2進法で表した時に1の登場する回数) :- between(1,2014,_数), '数を2進法で表した時に1の登場する回数'(_数,_数を2進法で表した時に1の登場する回数). '数を2進法で表した時に1の登場する回数'(_実,_数を2進法で表した時に1の登場する回数) :- '数を2進法で表した時に1の登場する回数'(_実,0,_数を2進法で表した時に1の登場する回数). '数を2進法で表した時に1の登場する回数'(0,_1の回数,_1の回数) :- !. '数を2進法で表した時に1の登場する回数'(_実,_1の累積回数,_1の回数) :- _剰余 is _実 mod 2, _商 is _実 // 2, '剰余が1ならば加算'(_剰余,_商,_1の累積回数,_1の回数). '剰余が1ならば加算'(1,_商,_1の累積回数_1,_1の回数) :- succ(_1の累積回数_1,_1の累積回数_2), '数を2進法で表した時に1の登場する回数'(_商,_1の累積回数_2,_1の回数). '剰余が1ならば加算'(0,_商,_1の累積回数_1,_1の回数) :- '数を2進法で表した時に1の登場する回数'(_商,_1の累積回数_1,_1の回数). 度数(_目標,_度数) :- findall(1,_目標,_度数を示す1のならび), length(_度数を示す1のならび,_度数). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/178 # お題 # "この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。" # の□をそれぞれ適切な数字に置き換え、正しい文章として完成させるコードを書け。 # # 元ネタ:https://www.facebook.com/NewtonScience/photos/a.314504251971427.78296.285001398255046/716155815139600/ # # '"この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。" という文章がある。□をそれぞれ適切な数字に置き換え、正しい文章として完成させるコードを書け。'(_正しい文章) :- '1が□個,2が□個,3が□個,1から3以外の数字が□個'(_n1,_n2,_n3,_n4,_1,_2,_3,_4), '"この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。" という文章がある。□をそれぞれ適切な数字に置き換え、正しい文章として完成させる'(_1,_2,_3,_4,_正しい文章), 正しい文章である(_正しい文章,_n1,_n2,_n3,_n4). '1が□個,2が□個,3が□個,1から3以外の数字が□個'(_n1,_n2,_n3,_n4,_1,_2,_3,_4) :- '1が□個'(_n1,_1), '2が□個'(_n2,_2), '3が□個'(_n3,_3), '1から3以外の数字が□個ある'(_n4,_4). '1が□個'(_n1,_1) :- between(0,9,_n1), number_chars(_n1,[_1]). '2が□個'(_n2,_2) :- between(0,9,_n2), number_chars(_n2,[_2]). '3が□個'(_n3,_3) :- between(0,9,_n3), number_chars(_n3,[_3]). '1から3以外の数字が□個ある'(_n4,_4) :- between(0,9,_n4), number_chars(_n4,[_4]). '"この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。" という文章がある。□をそれぞれ適切な数字に置き換え、正しい文章として完成させる'(_1,_2,_3,_4,_正しい文章) :- swritef(_正しい文章,'この文字列には1が%t個,2が%t個,3が%t個,1から3以外の数字が%t個ある。',[_1,_2,_3,_4]). 正しい文章である(_正しい文章,_n1,_n2,_n3,_n4) :- '1の度数は'(_正しい文章,_n1), '2の度数は'(_正しい文章,_n2), '3の度数は'(_正しい文章,_n3), '1から3以外の数字の度数'(_正しい文章,_n4). '1の度数は'(_正しい文章,_n1) :- 度数(sub_atom(_正しい文章,_,1,_,'1'),_n1). '2の度数は'(_正しい文章,_n2) :- 度数(sub_atom(_正しい文章,_,1,_,'2'),_n2). '3の度数は'(_正しい文章,_n3) :- 度数(sub_atom(_正しい文章,_,1,_,'3'),_n3). '1から3以外の数字の度数'(_正しい文章,_n4) :- 度数((sub_atom(_正しい文章,_,1,_,A),member(A,['4','5','6','7','8','9','0'])),_n4). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは # # あなたは既に読んでしまった札を記憶していることにします。 # 現在の自陣にある札のうち、一文字目が決まり字である札は何枚あるでしょうか。 # '現在の自陣にある札のうち、一文字目が決まり字である札は何枚あるでしょうか。'(_まだ読んでいない札,_既に読んでしまった札,_自陣にある札ならび,_何枚) :- 自陣の札の上の句の先頭の文字の未出の読み札数(_まだ読んでいない札,_既に読んでしまった札,_自陣にある札ならび,_度数ならび), 目標の度数(member(1,_度数ならび),_何枚). 自陣の札の上の句の先頭の文字の未出の読み札数(_,_,[],[]). 自陣の札の上の句の先頭の文字の未出の読み札数(_まだ読んでいない札,_既に読んでしまった札,[_下の句|R1],[_度数|R2]) :- 下の句から上の句の先頭の文字を得る(_下の句,_上の句の先頭文字), 上の句の先頭の文字の度数を得る(_まだ読んでいない札,_既に読んでしまった札,_上の句の先頭の文字,_度数), 自陣の札の上の句の先頭の文字の未出の読み札数(_まだ読んでいない札,_既に読んでしまった札,R1,R2). 下の句から上の句の先頭の文字を得る(_下の句,_上の句の先頭の文字) :- 百人一首(_歌), '上の句と下の句'(_歌,_上の句,_下の句), '上の句の先頭の文字、下の句の先頭の文字'(_歌,_,_,_上の句の先頭の文字,_). '上の句と下の句'(_歌,_上の句,_下の句) :- sub_atom(_歌,S,1,R,' '), sub_atom(_歌,_,R,0,_下の句), 目標の度数(sub_atom(_下の句,_,1,_,' ')),1), sub_atom(_歌,0,S,_,_上の句). '上の句の先頭の文字、下の句の先頭の文字'(_歌,_上の句,_下の句,_上の句の先頭の文字,_下の句の先頭の文字) :- '上の句と下の句'(_歌,_上の句,_下の句), sub_atom(_上の句,0,1,_,_上の句の先頭の文字), sub_atom(_下の句,0,1,_,_下の句の先頭の文字). 上の句の先頭の文字の度数を得る(_既に読んでしまった札,_上の句の先頭の文字,_度数) :- 目標の度数(上の句の先頭の文字の(_上の句の先頭の文字),_度数). 上の句の先頭の文字の(_上の句の先頭の文字) :- 百人一首(_歌), \+(member(_歌,_既に読んでしまった札)), sub_atom(_歌,0,1,_,_上の句の先頭の文字). 百人一首('あきのたの かりほのいほの とまをあらみ わがころもでは つゆにぬれつつ'). 百人一首('はるすぎて なつきにけらし しろたへの ころもほすてふ あまのかぐやま'). 百人一首('あしびきの やまどりのをの しだりをの ながながしよを ひとりかもねむ'). 百人一首('たごのうらに うちいでてみれば しろたへの ふじのたかねに ゆきはふりつつ'). 百人一首('おくやまに もみぢふみわけ なくしかの こゑきくときぞ あきはかなしき'). 百人一首('かささぎの わたせるはしに おくしもの しろきをみれば よぞふけにける'). 百人一首('あまのはら ふりさけみれば かすがなる みかさのやまに いでしつきかも'). 百人一首('わがいほは みやこのたつみ しかぞすむ よをうぢやまと ひとはいふなり'). 百人一首('はなのいろは うつりにけりな いたづらに わがみよにふる ながめせしまに'). 百人一首('これやこの ゆくもかへるも わかれては しるもしらぬも あふさかのせき'). 百人一首('わたのはら やそしまかけて こぎいでぬと ひとにはつげよ あまのつりぶね'). 百人一首('あまつかぜ くものかよひぢ ふきとぢよ をとめのすがた しばしとどめむ'). 百人一首('つくばねの みねよりおつる みなのがは こひぞつもりて ふちとなりぬる'). 百人一首('みちのくの しのぶもぢずり たれゆゑに みだれそめにし われならなくに'). 百人一首('きみがため はるののにいでて わかなつむ わがころもでに ゆきはふりつつ'). 百人一首('たちわかれ いなばのやまの みねにおふる まつとしきかば いまかへりこむ'). 百人一首('ちはやぶる かみよもきかず たつたがは からくれなゐに みづくくるとは'). 百人一首('すみのえの きしによるなみ よるさへや ゆめのかよひぢ ひとめよくらむ'). 百人一首('なにはがた みじかきあしの ふしのまも あはでこのよを すぐしてよとや'). 百人一首('わびぬれば いまはたおなじ なにはなる みをつくしても あはむとぞおもふ'). 百人一首('いまこむと いひしばかりに ながつきの ありあけのつきを まちいでつるかな'). 百人一首('ふくからに あきのくさきの しをるれば むべやまかぜを あらしといふらむ'). 百人一首('つきみれば ちぢにものこそ かなしけれ わがみひとつの あきにはあらねど'). 百人一首('このたびは ぬさもとりあへず たむけやま もみぢのにしき かみのまにまに'). 百人一首('なにしおはば あふさかやまの さねかづら ひとにしられで くるよしもがな'). 百人一首('をぐらやま みねのもみぢば こころあらば いまひとたびの みゆきまたなむ'). 百人一首('みかのはら わきてながるる いづみがは いつみきとてか こひしかるらむ'). 百人一首('やまざとは ふゆぞさびしさ まさりける ひとめもくさも かれぬとおもへば'). 百人一首('こころあてに をらばやをらむ はつしもの おきまどはせる しらぎくのはな'). 百人一首('ありあけの つれなくみえし わかれより あかつきばかり うきものはなし'). 百人一首('あさぼらけ ありあけのつきと みるまでに よしののさとに ふれるしらゆき'). 百人一首('やまがはに かぜのかけたる しがらみは ながれもあへぬ もみぢなりけり'). 百人一首('ひさかたの ひかりのどけき はるのひに しづごころなく はなのちるらむ'). 百人一首('たれをかも しるひとにせむ たかさごの まつもむかしの ともならなくに'). 百人一首('ひとはいさ こころもしらず ふるさとは はなぞむかしの かににほひける'). 百人一首('なつのよは まだよひながら あけぬるを くものいづこに つきやどるらむ'). 百人一首('しらつゆに かぜのふきしく あきののは つらぬきとめぬ たまぞちりける'). 百人一首('わすらるる みをばおもはず ちかひてし ひとのいのちの をしくもあるかな'). 百人一首('あさぢふの をののしのはら しのぶれど あまりてなどか ひとのこひしき'). 百人一首('しのぶれど いろにいでにけり わがこひは ものやおもふと ひとのとふまで'). 百人一首('こひすてふ わがなはまだき たちにけり ひとしれずこそ おもひそめしか'). 百人一首('ちぎりきな かたみにそでを しぼりつつ すゑのまつやま なみこさじとは'). 百人一首('あひみての のちのこころに くらぶれば むかしはものを おもはざりけり'). 百人一首('あふことの たえてしなくは なかなかに ひとをもみをも うらみざらまし'). 百人一首('あはれとも いふべき人は 思ほえで 身のいたづらに なりぬべきかな'). 百人一首('ゆらのとを わたるふなびと かぢをたえ ゆくへもしらぬ こひのみちかな'). 百人一首('やへむぐら しげれるやどの さびしきに ひとこそみえね あきはきにけり'). 百人一首('かぜをいたみ いはうつなみの おのれのみ くだけてものを おもふころかな'). 百人一首('みかきもり ゑじのたくひの よるはもえ ひるはきえつつ ものをこそおもへ'). 百人一首('きみがため をしからざりし いのちさへ ながくもがなと おもひけるかな'). 百人一首('かくとだに えやはいぶきの さしもぐさ さしもしらじな もゆるおもひを'). 百人一首('あけぬれば くるるものとは しりながら なほうらめしき あさぼらけかな'). 百人一首('なげきつつ ひとりぬるよの あくるまは いかにひさしき ものとかはしる'). 百人一首('わすれじの ゆくすゑまでは かたければ けふをかぎりの いのちともがな'). 百人一首('たきのおとは たえてひさしく なりぬれど なこそながれて なほきこえけれ'). 百人一首('あらざらむ このよのほかの おもひでに いまひとたびの あふこともがな'). 百人一首('めぐりあひて みしやそれとも わかぬまに くもがくれにし よはのつきかな'). 百人一首('ありまやま ゐなのささはら かぜふけば いでそよひとを わすれやはする'). 百人一首('やすらはで ねなましものを さよふけて かたぶくまでの つきをみしかな'). 百人一首('おほえやま いくののみちの とほければ まだふみもみず あまのはしだて'). 百人一首('いにしへの ならのみやこの やへざくら けふここのへに にほひぬるかな'). 百人一首('よをこめて とりのそらねは はかるとも よにあふさかの せきはゆるさじ'). 百人一首('いまはただ おもひたえなむ とばかりを ひとづてならで いふよしもがな'). 百人一首('あさぼらけ うぢのかはぎり たえだえに あらはれわたる せぜのあじろぎ'). 百人一首('うらみわび ほさぬそでだに あるものを こひにくちなむ なこそをしけれ'). 百人一首('もろともに あはれとおもへ やまざくら はなよりほかに しるひともなし'). 百人一首('はるのよの ゆめばかりなる たまくらに かひなくたたむ なこそをしけれ'). 百人一首('こころにも あらでうきよに ながらへば こひしかるべき よはのつきかな'). 百人一首('あらしふく みむろのやまの もみぢばは たつたのかはの にしきなりけり'). 百人一首('さびしさに やどをたちいでて ながむれば いづこもおなじ あきのゆふぐれ'). 百人一首('ゆふされば かどたのいなば おとづれて あしのまろやに あきかぜぞふく'). 百人一首('おとにきく たかしのはまの あだなみは かけじやそでの ぬれもこそすれ'). 百人一首('たかさごの をのへのさくら さきにけり とやまのかすみ たたずもあらなむ'). 百人一首('うかりける ひとをはつせの やまおろしよ はげしかれとは いのらぬものを'). 百人一首('ちぎりおきし させもがつゆを いのちにて あはれことしの あきもいぬめり'). 百人一首('わたのはら こぎいでてみれば ひさかたの くもゐにまがふ おきつしらなみ'). 百人一首(' せをはやみ いはにせかるる たきがはの われてもすゑに あはむとぞおもふ'). 百人一首('あはぢしま かよふちどりの なくこゑに いくよねざめぬ すまのせきもり'). 百人一首('あきかぜに たなびくくもの たえまより もれいづるつきの かげのさやけさ'). 百人一首('ながからむ こころもしらず くろかみの みだれてけさは ものをこそおもへ'). 百人一首('ほととぎす なきつるかたを ながむれば ただありあけの つきぞのこれる'). 百人一首('おもひわび さてもいのちは あるものを うきにたへぬは なみだなりけり'). 百人一首('よのなかよ みちこそなけれ おもひいる やまのおくにも しかぞなくなる'). 百人一首('ながらへば またこのごろや しのばれむ うしとみしよぞ いまはこひしき'). 百人一首('よもすがら ものおもふころは あけやらで ねやのひまさへ つれなかりけり'). 百人一首('なげけとて つきやはものを おもはする かこちがほなる わがなみだかな'). 百人一首('むらさめの つゆもまだひぬ まきのはに きりたちのぼる あきのゆふぐれ'). 百人一首('なにはえの あしのかりねの ひとよゆゑ みをつくしてや こひわたるべき'). 百人一首('たまのをよ たえなばたえね ながらへば しのぶることの よわりもぞする'). 百人一首('みせばやな をじまのあまの そでだにも ぬれにぞぬれし いろはかはらず'). 百人一首('きりぎりす なくやしもよの さむしろに ころもかたしき ひとりかもねむ'). 百人一首('わがそでは しほひにみえぬ おきのいしの ひとこそしらね かわくまもなし'). 百人一首('よのなかは つねにもがもな なぎさこぐ あまのをぶねの つなでかなしも'). 百人一首('みよしのの やまのあきかぜ さよふけて ふるさとさむく ころもうつなり'). 百人一首('おほけなく うきよのたみに おほふかな わがたつそまに すみぞめのそで'). 百人一首('はなさそふ あらしのにはの ゆきならで ふりゆくものは わがみなりけり'). 百人一首('こぬひとを まつほのうらの ゆふなぎに やくやもしほの みもこがれつつ'). 百人一首('かぜそよぐ ならのをがはの ゆふぐれは みそぎぞなつの しるしなりける'). 百人一首('ひともをし ひともうらめし あぢきなく よをおもふゆゑに ものおもふみは'). 百人一首('ももしきや ふるきのきばの しのぶにも なほあまりある むかしなりけり'). 目標の度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは # 要件 # # ユーザーテーブル(users)は入会日(joined_on)と退会日(left_on)を持っている # 退会していないユーザーの場合、退会日にはNULLが入る # ユーザー数の増減を確認するために、日付単位で入会したユーザーの人数と退会したユーザーの人数を一覧化したい。どうすれば取得できるか? # 例 # # ユーザーテーブル(users) # # id joined_on left_on # 1 2014-08-01 2014-08-10 # 2 2014-08-01 2014-08-05 # 3 2014-08-03 NULL # 4 2014-08-03 2014-08-10 # 5 2014-08-10 NULL # 期待する出力結果 # # date joined_count left_count # 2014-08-01 2 0 # 2014-08-03 2 0 # 2014-08-05 0 1 # 2014-08-10 1 2 # ユーザーテーブル(1,'2014-08-01','2014-08-10'). ユーザーテーブル(2,'2014-08-01','2014-08-05'). ユーザーテーブル(3,'2014-08-03','NULL'). ユーザーテーブル(4,'2014-08-03','2014-08-10'). ユーザーテーブル(5,'2014-08-10','NULL'). 'ユーザーテーブル(users)は入会日(joined_on)と退会日(left_on)を持っている 退会していないユーザーの場合、退会日にはNULLが入る ユーザー数の増減を確認するために、日付単位で入会したユーザーの人数と 退会したユーザーの人数を一覧化したい。どうすれば取得できるか?' :- setof(_日付,[_日付] ^ 'joined_onの候補+left_offの候補'(_日付),_日付候補), '日付単位で入会したユーザーの人数と退会したユーザーの人数を一覧したい。'(_日付候補). 'joined_onの候補+left_offの候補'(_日付) :- ユーザーテーブル(_,_入会日付,_退会日付), member(_日付,[_入会日付,_退会日付]), \+(_日付 = 'NULL'). '日付単位で入会したユーザーの人数と退会したユーザーの人数を一覧したい。'(_日付候補) :- '日付単位で入会したユーザーの人数と退会したユーザーの人数を'(_日付候補,_日付,_入会したユーザーの人数,_退会したユーザーの人数,R), 表示する(_日付,_入会したユーザーの人数,_退会したユーザーの人数), R = []. '日付単位で入会したユーザーの人数と退会したユーザーの人数を'(_日付候補,_日付,_入会したユーザーの人数,_退会したユーザーの人数,R) :- append(_,[_日付|R],_日付候補), 度数(ユーザーテーブル(_,_日付,_),_入会したユーザーの人数), 度数(ユーザーテーブル(_,_,_日付),_退会したユーザーの人数). 表示する(_日付,_入会したユーザーの人数,_退会したユーザーの人数) :- writef('%t %3r %3r\n',[_日付,_入会したユーザーの人数,_退会したユーザーの人数]). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/860 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # n個の整数を含む集合Sと、 # q個の異なる整数を含む集合Tを入力とし、 # Tに含まれる整数の中でSに含まれるものの数Cを # 出力するプログラムを作成せよ。 # # 入力 # 1行目にSを表すn個の整数、 # 2行目にTを表すq個の整数が与えられる。 # 出力 # Tに含まれる整数の中でSに含まれるものの数Cを出力せよ。 # 条件 # n : 10以下 # q : 5以下 # 集合に含まれる整数の値 以上、6未満 # # 実行例) # 3 8 4 1 9 2 5 7 6 入力(集合S:n個(9)) # 1 3 5 10 入力(集合T:q個(4)) # 3 出力(C) # 21 30 5 21 10 39 14 入力(集合S:n個(7)) # 1 21 10 入力(集合T:q個(3)) # 2 出力(C) # 'n個の整数を含む集合Sと、 q個の異なる整数を含む集合Tを入力とし、 Tに含まれる整数の中でSに含まれるものの数Cを 出力するプログラムを作成せよ。'(_n,_q) :- 'n個の整数を含む集合Sと、q個の異なる整数を含む集合Tを入力とし、'(_n,_S,_q,_T), 'Tに含まれる整数の中でSに含まれるものの数Cを'(_T,_S,_C), 出力する(_C). 'n個の整数を含む集合Sと、q個の異なる整数を含む集合Tを入力とし、'(_n,_S,_q,_T) :- 'n個の整数を含む集合Sの入力、'(_n,_S), 'q個の異なる整数を含む集合Tの入力'(_q,_T). 'n個の整数を含む集合Sの入力、'(_n,_S) :- writef('集合S 入力する整数は%t個です : ',[_n]), get_split_line([' '],_S). 'q個の異なる整数を含む集合Tの入力'(_q,_T) :- writef('集合T 入力する整数は%t個で、同じ数字であってはいけません : ',[_q]), get_split_line([' '],_T). 'Tに含まれる整数の中でSに含まれるものの数Cを'(_T,_S,_C) :- setof(_整数,member(_整数,_T),_T_1), count((member(_N,_T_1),member(_N,_S)),_C). 出力する(_C) :- writef('%t\n',[_C]). % 以下のサイトは % % SWI-Prologに於いてfindall/3と同等の述語をmesage_queueを使って定義してみる。 % % findall/3と同じ機能の述語をメッセージキューを利用して定義する。 % メッセージキューを使って全解を収集する(_限界数,_選択項,_副目標,_回収値ならび) :- message_queue_create(_キュー番号), スレッド上でメッセージキューに限界数までの選択項を登録する(_限界数,_キュー番号,_選択項,_副目標), 'メッセージを待ち合わせ、回収する'(_キュー番号,_回収値ならび), message_queue_destroy(_キュー番号). スレッド上でメッセージキューに限界数までの選択項を登録する(_限界数,_キュー番号,_選択項,_副目標) :- thread_create(メッセージキューに限界数までの選択項を登録する(_限界数,_キュー番号,_選択項,_副目標),_,[]). 'メッセージを待ち合わせ、回収する'(_キュー番号,_回収値ならび) :- メッセージを待ち合わせる(_キュー番号), メッセージを回収する(_キュー番号,_回収値ならび). メッセージを待ち合わせる(_キュー番号) :- repeat, thread_peek_message(_キュー番号,end_of_file),!. メッセージを回収する(_キュー番号,_回収値ならび) :- findall(_回収値,( thread_get_message(_キュー番号,_回収値), ( _回収値 = end_of_file,!,fail; true)), _メッセージならび). %%%%%%%%%%%%%%%%%%%% スレッド側 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% メッセージキューに限界数までの選択項を登録する(_限界数,_キュー番号,_選択項,_副目標) :- 副目標を実行して選択項を登録する(_キュー番号,_選択項,_副目標), ( メッセージが限界数を超えた(_キュー番号,_限界数),!,fail; fail). メッセージキューに限界数までの選択項を登録する(_,_キュー番号,_,_) :- thread_send_message(_キュー番号,end_of_file). メッセージが限界数を超えた(_キュー番号,_限界数) :- メッセージの現在の度数を数える(_キュー番号,_度数), _度数 >= _限界数, thread_send_message(_キュー番号,end_of_file),!. 副目標を実行して選択項を登録する(_キュー番号,_選択項,_副目標) :- call(_副目標), 重複メッセージにはならない(_キュー番号,_選択項), thread_send_message(_キュー番号,_選択項). 重複メッセージにはならない(_キュー番号,_選択項) :- \+(thread_peek_message(_キュー番号,_選択項)). メッセージの現在の度数を数える(_キュー番号,_度数) :- message_queue_property(_キュー番号,size(_度数)). % 以下のサイトは % % SWI-Prologに於いてfindall/3と同等の述語をmesage_queueを使って定義してみる。 % % findall/3と同じ機能の述語をメッセージキューを利用して定義する。 % メッセージキューを使って全解を収集する(_限界数,_選択項,_副目標,_回収値ならび) :- message_queue_create(_キュー番号), スレッド上でメッセージキューに限界数までの選択項を登録(_限界数,_キュー番号,_選択項,_副目標), メッセージを回収する(_キュー番号,_回収値ならび), message_queue_destroy(_キュー番号). スレッド上でメッセージキューに限界数までの選択項を登録(_限界数,_キュー番号,_選択項,_副目標) :- thread_create(メッセージキューに限界数までの選択項を登録(_限界数,_キュー番号,_選択項,_副目標),_,[]). メッセージを回収する(_キュー番号,L) :- thread_peek_message(_キュー番号,end_of_file), thread_get_message(_キュー番号,_回収値_1), メッセージを回収する(_キュー番号,_回収値_1,L),!. メッセージを回収する(_キュー番号,L) :- メッセージを回収する(_キュー番号,L). メッセージを回収する(_キュー番号,end_of_file,[]) :- !. メッセージを回収する(_キュー番号,_回収値,[_回収値|R]) :- thread_get_message(_キュー番号,_回収値_2), メッセージを回収する(_キュー番号,_回収値_2,R). %%%%%%%%%%%%%%%%%%%% スレッド側 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% メッセージキューに限界数までの選択項を登録(_限界数,_キュー番号,_選択項,_副目標) :- 副目標の実行と選択項の登録(_キュー番号,_選択項,_副目標), ( メッセージが限界数を超えた(_キュー番号,_限界数),!,fail; fail). メッセージキューに限界数までの選択項を登録(_,_キュー番号,_,_) :- thread_send_message(_キュー番号,end_of_file). メッセージが限界数を超えた(_キュー番号,_限界数) :- メッセージの現在の度数(_キュー番号,_度数), _度数 >= _限界数, thread_send_message(_キュー番号,end_of_file),!. 副目標の実行と選択項の登録(_キュー番号,_選択項,_副目標) :- call(_副目標), 重複メッセージにはならない(_キュー番号,_選択項), thread_send_message(_キュー番号,_選択項). 重複メッセージにはならない(_キュー番号,_選択項) :- \+(thread_peek_message(_キュー番号,_選択項)). メッセージの現在の度数(_キュー番号,_度数) :- message_queue_property(_キュー番号,size(_度数)). % 以下のサイトは # # 述語名は'$解の度数','$射影項' の述語名は必須ではない。 # :- dynamic(['$解の度数'/2,'$射影項'/2]). 解の数を制限した全解照会(_限界実行回数,_射影項,_実行項,_射影項ならび) :- 履歴管理(_管理指標), forall(解の数を制限した解照会(_限界実行回数,_管理指標,_射影項,_実行項),true), 射影項の収集(_管理指標,_射影項ならび). 解の数を制限した解照会(_限界実行回数,_管理指標,_射影項,_実行項) :- 解の数を勘定しながらの実行(_管理指標,N,_射影項,_実行項), ( N = _限界実行回数; N = _限界実行回数,!,fail; asserta('$解の度数'(_管理指標,N))). 解の数を勘定しながらの実行(_管理指標,N,_射影項,_実行項) :- call(_実行項), 解は既出解を捨てて収集する(_管理指標,_射影項,_実行項), retract('$解の度数'(_管理指標,N_1)), succ(N_1,N). 解は既出解を捨てて収集する(_管理指標,_射影項,_実行項) :- \+(catch('$射影項'(_管理指標,_射影項),E,fail)), asserta('$解の度数'(_管理指標,_射影項)),!. 履歴管理(_管理指標) :- _管理指標 is random(2147483647), \+(catch('$射影項'(_管理指標,_),E,fail)), asserta('$解の度数'(_管理指標,0)),!. 履歴管理(_管理指標) :- 履歴管理(_管理指標). 射影項の収集(_管理指標,_射影項ならび) :- findall(_射影項,'$射影項'(_管理指標,_射影項)),_射影項ならび). % 以下のサイトは # # 述語名は'$call_n_count'である必要はない。 # :- dynamic([call_n_id/2,call_n_goal/2]). call_n(_n,P) :- call_n_id(_id), call_n_goal(_id,N,P), ( N = _n; N = _n,!,fail; asserta('$call_n_count'(_id,N))). call_n_goal(_id,N,P) :- call(P), call_n_unique_goal(_id,P), retract('$call_n_count'(_id,N_1)), succ(N_1,N). call_n_unique_goal(_id,P) :- \+(catch('$call_n_goal'(_id,P),E,fail)), asserta('$call_n_goal'(_id,P)),!. call_n_id(_id) :- _id is random(2147483647), \+(catch('$call_n_count'(_id,_),E,fail)), asserta('$call_n_count'(_id,0)),!. call_n_id(_id) :- call_n_id(_id). % 以下のサイトは # 出題 :: プログラミングのお題スレ Part3 #482 # # お題:二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。 # 例 # aabaabbab -> a '二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_多数派の文字) :- 二種類の文字からなる長さが奇数の文字列があるとき(_二種類の文字からなる長さが奇数の文字列,_文字種_1,_文字種_2,Ln1,Ln2), 多数派の文字を求める(_文字種_1,_文字種_2,Ln1,Ln2,_多数派の文字). 二種類の文字からなる長さが奇数の文字列があるとき(_二種類の文字からなる長さが奇数の文字列,_文字種_1,_文字種_2,Ln1,Ln2) :- atom_chars(_二種類の文字からなる長さが奇数の文字列,Chars), 二種類の文字に分類して度数を示すならびを得る(Chars,_文字種_1,_文字種_2,Ln1,Ln2). 二種類の文字に分類して度数を示すならびを得る([],_,_,[],[]) :- !. 二種類の文字に分類して度数を示すならびを得る([A|R],A,B,[_|Ln1],Ln2) :- 二種類の文字に分類して度数を示すならびを得る(R,A,B,Ln1,Ln2). 二種類の文字に分類して度数を示すならびを得る([B|R],A,B,Ln1,[_|Ln2]) :- 二種類の文字に分類して度数を示すならびを得る(R,A,B,Ln1,Ln2). 多数派の文字を求める(_,B,Ln1,Ln2,B) :- append(Ln1,[_|_],Ln2),!. 多数派の文字を求める(A,_,_,_,A). % 以下のサイトは # # 出典: http://blog.livedoor.jp/beziehungswahn/archives/37228198.html # % '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(_順位,_薬剤,_売上米ドル金額). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(1,'Abilify',6460215394). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(2,'Nexium',6135667614). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(3,'Humira',5549996855). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(4,'Crestor',5310818889). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(5,'Cymbalta',5219860418). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(6,'Advair Diskus',5121312668). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(7,'Enbrel',4681201645). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(8,'Remicade',4098233242). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(9,'Copaxone',3697182238). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(10,'Neulasta',3580364758). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(11,'Rituxan',3288614045). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(12,'Lantus Solostar',3005681663). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(13,'Spiriva Handihaler',2998207542). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(14,'Atripla',2856818557). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(15,'Januvia',2843496907). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(16,'Avastin',2688414938). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(17,'Lantus',2556825619). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(18,'Oxycontin',2534909675). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(19,'Lyrica',2415254835). '2013年度のアメリカ合衆国での売上ベスト20の薬剤'(20,'Epogen',2280696834). # 2位 Nexium(ネキシウム)、$6,135,667,614、プロトンポンプ阻害剤であり、逆流性食道炎に使用します。アメリカ人はフライドポテトとか脂っこいものを食べ過ぎなんでしょうね。酒も度数が強いものをストレートで飲むし。そりゃ、胃を壊して胸やけがするはずです。 # 出典: http://ja.wikipedia.org/wiki/%E3%82%A8%E3%82%BD%E3%83%A1%E3%83%97%E3%83%A9%E3%82%BE%E3%83%BC%E3%83%AB % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/487 # 次のようなデータがあります。 # tozai nihon # 関東 関東 # 関西 関西 # −− 関西 # 関西 関東 # −− 関東 # −− −− # 関東 関東 # 関西 関西 # # (−−)は空のデータ # # # tozaiとnihonではtozaiが優先されます。 # 例えば、tozai=関西,nihon=関東となっていた場合、tozaiが優先されるので「関西」と見なされます。 # この条件で、関東と関西のデータがそれぞれ何件あるか調査する為に次の3つのSQL文を出しました。 # これらを一つの文にまとめたいのですが、どのようにしたらよいでしょうか? # # select count(*) from hoge where tozai='関東' or (tozai='' and nihon='関東'); # 結果=3 # # select count(*) from hoge where tozai='関西' or (tozai='' and nihon='関西'); # 結果=4 # # select count(*) from hoge where tozai='' and nihon=''; # 結果=1 # # 'tozaiとnihonではtozaiが優先されます。 例えば、tozai=関西,nihon=関東となっていた場合、tozaiが優先されるので「関西」と見なされます。 この条件で、関東と関西のデータがそれぞれ何件あるか調査する為に次の3つのSQL文を出しました。 これらを一つの文にまとめたいのですが、どのようにしたらよいでしょうか?'(_関東,_関西,_どちらでもない) :- findall([N1,N2,N3], 'hogeのtozai,nohonからhoge_tableの値をえる'(N1,N2,N3),LL), 縦列を合計する(LL,_関東,_関西,_どちらでもない). 'hogeのtozai,nohonからhoge_tableの値をえる'(N1,N2,N3) :- hoge(_tozai,_nihon), hoge_select(_tozai,_hihon,N1,N2,N3). 縦列を合計する(LL,_関東,_関西,_どちらでもない) :- 転置(LL,[L1,L2,L3]), '転置された三つの行から_関東,_関西,_どちらでもないを求める'(L1,L2,L3,_関東,_関西,_どちらでもない). '転置された三つの行から_関東,_関西,_どちらでもないを求める'(L1,L2,L3,_関東,_関西,_どちらでもない). '転置された1行目の合計が_関東となる'(L1,_関東), '転置された2行目の合計が_関西となる'(L2,_関西), '転置された3行目の合計が_どちらでもないとなる'(L3,_どちらでもない), '転置された1行目の合計が_関東となる'(L1,_関東) :- sum_list(L1,_関東). '転置された2行目の合計が_関西となる'(L2,_関西) :- sum_list(L2,_関西). '転置された3行目の合計が_どちらでもないとなる'(L3,_どちらでもない) :- sum_list(L3,_どちらでもない). hoge_select('','',0,0,1). hoge_select('',関東,1,0,0). hoge_select('',関西,0,1,0). hoge_select(関東,_,1,0,0). hoge_select(関西,_,0,1,0). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/555 # お題:円の中心点と半径が与えられるとき、その円と円の内部に # 含まれる格子点(座標成分がすべて整数になる点)の個数を数える。 # 例) # ? 1 1 1 # 5 # ? 0.5 0.5 1 # 4 # # '円の中心点と半径が与えられるとき、その円と円の内部に 含まれる格子点(座標成分がすべて整数になる点)の個数を数える。'(_円の中心点x座標,_円の中心点y座標,_半径,_円の内部に含まれる格子点の個数) :- 調べるべき座標範囲を得る(_円の中心点x座標,_円の中心点y座標,_半径,_調べるべきx座標下限,_調べるべきx座標上限,_調べるべきy座標下限,_調べるべきy座標上限), count(( 円の内部に含まれる格子点候補(_調べるべきx座標下限,_調べるべきx座標上限,_調べるべきy座標下限,_調べるべきy座標上限,X,Y), '点(X,Y)は円の内部にある'(_円の中心点x座標,_円の中心点y座標,_半径,X,Y)),_円の内部に含まれる格子点の個数). 調べるべき座標範囲を得る(_円の中心点x座標,_円の中心点y座標,_半径,_調べるべきx座標下限,_調べるべきx座標上限,_調べるべきy座標下限,_調べるべきy座標上限) :- _調べるべきx座標下限 is truncate(_円の中心点x座標 - _半径), _調べるべきx座標上限 is truncate(_円の中心点x座標 + _半径 + 0.5), _調べるべきy座標下限 is truncate(_円の中心点y座標 - _半径), _調べるべきy座標上限 is truncate(_円の中心点y座標 + _半径 + 0.5). 円の内部に含まれる格子点候補(_調べるべきx座標下限,_調べるべきx座標上限,_調べるべきy座標下限,_調べるべきy座標上限,X,Y) :- between(_調べるべきx座標下限,_調べるべきx座標上限,X), between(_調べるべきy座標下限,_調べるべきy座標上限,Y). '点(X,Y)は円の内部にある'(_円の中心点のx座標,_円の中心点のy座標,_半径,X,Y) :- (X - _円の中心点のx座標) ^ 2 + (Y - _円の中心点のy座標) ^ 2 =< _半径 ^ 2. count(P,Count) :- findall(1,P,L), length(L,Count). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/465 # お題:与えられた文字列中の各文字数をカウントして表示せよ。 # 表示順や形式は定めない。 # # 回答例およびチェック用出力例: c # #include <stdio.h> # void check(const char *cs) { # int i, counts[256] = {0}; # for (i = 0; cs[i] != '\0'; i++) counts[cs[i]] += 1; # for (i = 0; i < 256; i++) { # if (counts[i]) printf("'%c'=>%d, ", (char)i, counts[i]); # } # } # int main() { # check("We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris."); # return 0; # } # ↓ # ' '=>16, ','=>2, '.'=>1, ':'=>1, 'W'=>1, 'a'=>7, 'b'=>1, 'c'=>2, 'd'=>2, 'e'=>14 # , 'f'=>1, 'g'=>3, 'h'=>3, 'i'=>6, 'l'=>4, 'm'=>3, 'n'=>4, 'o'=>6, 'p'=>3, 'r'=>8 # , 's'=>4, 't'=>6, 'u'=>4, 'v'=>2, 'w'=>1, 'y'=>1, 'z'=>1, # # '与えられた文字列中の各文字数をカウントして表示せよ。表示順や形式は定めない。'(_文字列,_各文字数のカウント) :- findall(_文字_1,( setof(_文字_1,sub_atom(_文字列,_,1,_,_文字_1),[_文字_1])), _重複のない文字ならび), findall([_文字,_文字数のカウント],( member(_文字,_重複のない文字ならび), カウント(sub_atom(_文字列,_,1,_,_文字),_文字数のカウント)), _各文字数のカウント). カウント(P,_カウント) :- findall(1,P,L), length(L,_カウント). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/198 # # お題:チャンパーノウン定数を表示せよ。 # 表示された文字列中に"991"を一つだけ含むこと。 'お題:チャンパーノウン定数を表示せよ。 表示された文字列中に"991"を一つだけ含むこと。' :- 'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(1,'0.'). 'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N,A) :- count(sub_atom(A,_,3,_,'991'),2),!,fail. 'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N,A) :- atom_number(B,N), atom_concat(A,B,C), '表示された文字列中に"991"を一つだけ含むこと。'(N,C). '表示された文字列中に"991"を一つだけ含むこと。'(N,_チャンパーノウン定数) :- '文字列中に"991"を一つだけ含むこと。'(_チャンパーノウン定数), writef('%t\n',[_チャンパーノウン定数]). '表示された文字列中に"991"を一つだけ含むこと。'(N,C) :- N_2 is N + 1, チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N_2,C,_チャンパーノウン定数). '文字列中に"991"を一つだけ含むこと。'(_チャンパーノウン定数) :- count(sub_atom(_チャンパーノウン定数,_,3,_,'991'),1). count(P,N) :- findall(1,P,L), length(L,Count). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/194 # # [1] 授業単元:C言語 # # [2] 問題文(含コード&リンク): # 1〜100の整数のうち「6の倍数」の個数を表示するプログラムを作成しなさい、ただし、for文とif文を用いて作成すること # 1次元配列を用いて5人分の数学の得点を100点満点で入力し、「数学の得点の最小値と最大値」を画面表示、およびファイルに書き出すプログラムを作成しなさい。ただし、書き出し用ファイル名は「sugaku.txt」にしなさい。 # # '1〜100の整数のうち「6の倍数」の個数を表示するプログラムを作成しなさい、ただし、for文とif文を用いて作成すること' :- '1〜100の整数のうち「6の倍数」の個数を'(_6の倍数の個数), 表示する(_6の倍数の個数). '1〜100の整数のうち「6の倍数」の個数を'(_6の倍数の個数) :- 個数(('1〜100の整数のうち'(N),'「6の倍数」'(N)),_6の倍数の個数). '1〜100の整数のうち'(N) :- between(1,100,N). '「6の倍数」'(N) :- 0 is N mod 6. 表示する(_6の倍数の個数) :- writef('6の倍数の個数は %t です\n',[_6の倍数の個数]). 個数(_副目標,_真になる度数) :- findsum(1,_副目標,_真になる度数). findsum(_選択項,_副目標,_合計値) :- findall(_選択項,_副目標,_値ならび), sum_list(_値ならび,_合計値),!. % 以下のサイトは # # お題:テキストファイルを読み込み、その中で最もよく使われている単語ベスト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/1370255305/785 # # 与えられた自然数nを上回る2の冪を返す関数をなるべく最短処理になるように自作してください # 宿題じゃないので期限は問いません # 例: # n=1 → 1 # n=2 → 2 # n=3 → 4 # n=6 → 8 # n=300 → 512 # # 与えられた自然数nを上回る2の冪を返す(_n,_2の冪) :- count('1ビット右シフト'(_n),_冪), _2の冪 is 2 ^ _冪. '1ビット右シフト'(0) :- !,fail. '1ビット右シフト'(N). '1ビット右シフト'(N) :- M is N >> 1, '1ビット右シフト'(M). count(P,N) :- findall(1,P,L), length(L,N). % 以下のサイトは # # 目標_1と目標_2を限界度数成功させる。 # 目標_1と目標_2を限界度数成功させる(_限界度数,_目標_1,_目標_2) :- forall_n(_限界度数,_目標_1,_目標_2). forall_n(_限界度数,_目標_1,_目標_2) :- message_queue_create(_キュー番号), ( thread_create(度数(_限界度数,_キュー番号),_,[]); forall(( thread_get_message(_キュー番号,_項), ( _項 = 0,!,fail;call(_目標_1))), call(_目標_2)). 度数(_限界度数,_キュー番号) :- between(1,_限界度数,_度数), _剰余 is _度数 mod ( _限界度数 + 1 ), thread_send_message(_キュー番号,_剰余), _度数 = _限界度数. % 以下のサイトは # # 目標を限界度数成功させて指定した蒐集項をならびとして得る # 目標を限界度数成功させて指定した蒐集項をならびとして得る(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- findall_n(_限界度数,_蒐集項,_目標,_蒐集項ならび). findall_n(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- message_queue_create(_キュー番号), ( '子スレッドで、生成された度数を、限界度数に達したら0をキューに送る'(_限度度数,_キュー番号); キューから限界度数を示す0を受信するまで目標を成功させて蒐集項ならびを得る(_蒐集項,_目標,_キュー番号,_蒐集項ならび)). キューから限界度数を示す0を受信するまで目標を成功させて蒐集項ならびを得る(_蒐集項,_目標,_キュー番号,_蒐集項ならび) :- findall(_蒐集項,( thread_get_message(_キュー番号,_項), ( _項 = 0,!,fail;call(_目標))), _蒐集項ならび). '子スレッドで、生成された度数を、限界度数に達したら0をキューに送る'(_限度度数,_キュー番号) :- thread_create(度数(_限界度数,_キュー番号),_,[]). 度数(_限界度数,_キュー番号) :- between(1,_限界度数,_度数), _剰余 is _度数 mod ( _限界度数 + 1 ), thread_send_message(_キュー番号,_剰余), _度数 = _限界度数. % % 先にlength/2等で解の枠が決まっている場合があるが、 % findall/3述語だと、その枠を無視して、全解を蒐集して、 % その上で第三引数のならびとの単一化を試みようとする。 % 目標の解が1000万個というように多量の場合は、 % スタックオーバーフローが生じてエラーとなって終了する。 % % これに対して、この述語は子スレッドを作り出して、ここで % 本来は現在の解数を数えさせてキュー経由で親スレッドは % これを受信する。この為には親スレッドから子スレッドに解が % 取れたことを送信するためのキューが必要であるがここでは % それを省略した。子から親への片方向の通信になっている。 % % 子スレッドは1から解の限界数まで整数をキューに一気に詰め、 % さらに、終了の合図である0を詰める。親スレッドは目標が % 達成される度にキューから一つ度数情報を取り出す。 % 解の数が限界数に達した時に子スレッドが既に送信してあった % 0を受信することになり、親スレッドのfindall_n/4の目標内の % カットが発動されて強制的にfindall_n/4を終了させることが % できる。 % % ここではfindall/3を対象にしているがsetof/3やbagof/3も % 全く同様の問題があるし、解決策も同じである。 % 以下のサイトは # # 目標を限界度数成功させてその項をリストとして得る # 目標を限界度数成功させてその項をならびとして得る(_限界度数,_目標,_目標ならび) :- findall_n(_限界度数,_目標,_目標ならび). findall_n(_限界度数,_目標,_目標ならび) :- message_queue_create(_キュー番号), ( thread_create(度数(_限界度数,_キュー番号),_,[]); findnall(_目標,( thread_get_message(_キュー番号,_項), ( _項 = 0,!,fail;call(_目標))), _目標ならび)). 度数(_限界度数,_キュー番号) :- between(1,_限界度数,_度数), _剰余 is _度数 mod ( _限界度数 + 1 ), thread_send_message(_キュー番号,_剰余), _度数 = _限界度数. % 以下のサイトは # # 目標を限界度数成功させて指定した蒐集項をならびとして得る # 目標を限界度数成功させて指定した蒐集項をならびとして得る(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- findall_n(_限界度数,_蒐集項,_目標,_蒐集項ならび). findall_n(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- メッセージキューを生成し番号ならびを詰める(_限界度数,_キュー番号), '目標を実行して蒐集項ならびを得る'(_限界度数,_キュー番号,_蒐集項,_目標,_蒐集項ならび). '目標を実行して蒐集項ならびを得る'(_限界度数,_キュー番号,_蒐集項,_目標,_蒐集項ならび) :- findall(_蒐集項,( call(_目標), thread_get_message(_キュー番号,_項), ( _項 = _限界度数,!,true;true)),_蒐集項ならび). メッセージキューを生成し番号ならびを詰める(_限界度数,_キュー番号) :- message_queue_create(_キュー番号), thread_create(度数(_限界度数,_キュー番号),_,[]). 度数(_限界度数,_キュー番号) :- between(1,_限界度数,_度数), thread_send_message(_キュー番号,_度数), _度数 = _限界度数. % % 先にlength/2等で解の枠が決まっている場合があるが、 % findall/3述語だと、その枠を無視して、全解を蒐集して、 % その上で第三引数のならびとの単一化を試みようとする。 % 目標の解が1000万個というように多量の場合は、 % スタックオーバーフローが生じてエラーとなって終了する。 % % これに対して、この述語は子スレッドを作り出して、ここで % 本来は現在の解数を数えさせてキュー経由で親スレッドは % これを受信する。この為には親スレッドから子スレッドに解が % 取れたことを送信するためのキューが必要であるがここでは % それを省略した。子から親への片方向の通信になっている。 % % 子スレッドは1から解の限界数まで整数をキューに一気に詰める。 % 親スレッドは目標が達成される度にキューから一つ度数情報を % 取り出す。 % 解の数が限界数に達した時に子スレッドが既に送信してあった % 親スレッドのfindall_n/4の目標内のカットが発動されて % それ以後は蒐集せずにfindall_n/4を終了させることができる。 % % ここではfindall/3を対象にしているがsetof/3やbagof/3も % 全く同様の問題があるし、解決策も同じである。 % 以下のサイトは # # 目標を限界度数成功させて指定した蒐集項をならびとして得る # 目標を限界度数成功させて指定した蒐集項をならびとして得る(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- findall_n(_限界度数,_蒐集項,_目標,_蒐集項ならび). findall_n(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- message_queue_create(_キュー番号), 度数(_限界度数,_キュー番号), findall(_蒐集項,( thread_get_message(_キュー番号,_項), ( _項 = 0,!,fail;call(_目標))), _蒐集項ならび). 度数(_限界度数,_キュー番号) :- between(1,_限界度数,_度数), _剰余 is _度数 mod ( _限界度数 + 1 ), thread_send_message(_キュー番号,_剰余), _度数 = _限界度数. % % ?- length(L,4),findall(N,between(1,10000000,N),L). % false. % 1000万要素と4要素のリストの単一化。この結論を得るまでに数秒を要する。 % % ?- length(L,4),findall_n(4,N,between(1,10000000,N),L). % L = [1,2,3,4] % % ?- length(L,4),findall_n(5,N,between(1,10000000,N),L). % false. % % ?- length(L,4),findall_n(5,N,between(1,4,N),L). % L = [1,2,3,4] % % 以下のサイトは 要素ごとの度数を得る([],[]). 要素ごとの度数を得る(_ならび,[[_度数,_選択した要素]|R2]) :- 要素を一つ選択してその度数と残りならびをえる(_ならび,0,_度数,_選択した要素,_残りならび), 要素ごとの度数を得る(_残りならび,R2). 要素を一つ選択してその度数と残りならびをえる(L1,_度数_1,_度数,_要素,L) :- select(_要素,L1,R1), _度数_2 is _度数_1 + 1, 要素を一つ選択してその度数と残りならびをえる(R1,_度数_2,_度数,_要素,L). 要素を一つ選択してその度数と残りならびをえる(L,_度数,_度数,_,L) :- !. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/777 # # [1] 授業単元:標準入力から N を入力し、N 個のサイコロの出目の和の確率の一覧を作成せよ。 # [2] 問題文:確率は小数三位を四捨五入すること。 # N = 2 # 1 : 0.00% # 2 : 2.78% # 3 : 5.56% # 4 : 8.33% # 5 : 11.11% # 6 : 13.89% # 7 : 16.17% # 8 : 13.89% # 9 : 11.11% # 10 : 8.33% # 11 : 5.56% # 12 : 2.78% # [3.3] 言語:C # [4] 期限:2013-08-04 22:00 # # '標準入力から N を入力し、N 個のサイコロの出目の和の確率の一覧を作成せよ。 確率は小数三位を四捨五入すること。' :- '標準入力から N を入力し、'(_N), 'N 個のサイコロの出目の和の確率の一覧を作成せよ。確率は小数三位を四捨五入すること。'(_N). '標準入力から N を入力し、'(_N) :- 整数を得る('サイコロの個数を入力してください',_N > 0,_N). 'N 個のサイコロの出目の和の確率の一覧を作成せよ。確率は小数三位を四捨五入すること。'(_N) :- 'N 個のサイコロの出目の和'(_N,_N_6,_出目の和ならび), between(1,_N_6,_M), 'サイコロの出目の和の確率を表示する。確率は小数三位を四捨五入すること。'(_出目の和ならび,_M,_N_6,_確率), '表示する。確率は小数三位を四捨五入すること。'(_M,_確率), _M = _N. 'N 個のサイコロの出目の和'(_N,_N_6,_出目の和ならび) :- _N_6 is 6 * _N, findall(Sum,( 重複順列([1,2,3,4,5,6],_N,L), sum(L,Sum)), _出目の和ならび). 'サイコロの出目の和の確率。確率は小数三位を四捨五入すること。'(_出目の和ならび,_出目の和,_N_6,_確率) :- count(member(_出目の和,_出目の和ならび),Count), _確率 is ((Count / _N_6) * 1000 + 5) / 1000. '表示する。確率は小数三位を四捨五入すること。'(_M,_確率) :- writef('%t : ',[_M]), format('~2f%\n',[_確率]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/751 # # (sum, kosu)に対して、 # sum = a1 + ・・・  + an ( n <= kosu , 1 <= ai <= 4 ) # を満たす、数列 (a1,・・・ ,an)は何通りあるか? # # '(sum, kosu)に対して、sum = a1 + ・・・  + an ( n <= kosu , 1 <= ai <= 4 ) を満たす、数列 (a1,・・・ ,an)は何通りあるか? '(_sum,_kosu,_何通り) :- findall(_n,between(1,_n,_kosu),_1からの_kosuまでの整数ならび), count('(sum, kosu)に対して、sum = a1 + ・・・  + an ( n <= kosu , 1 <= ai <= 4 ) を満たす、数列 (a1,・・・ ,an)'(_1からの_kosuまでの整数ならび,_sum,_kosu,L),_何通り). '(sum, kosu)に対して、sum = a1 + ・・・  + an ( n <= kosu , 1 <= ai <= 4 ) を満たす、数列 (a1,・・・ ,an)'(_1からの_kosuまでの整数ならび,_sum,_kosu,L) :- between(1,_n,_kosu), 組み合わせ(_1からの_kosuまでの整数ならび,_n,L), sum(L,_sum). % 以下のサイトは # # 文字列から数字列を検索する # 数字文字列を検索してその数値を得る(_文字列,_前文字列,_数字文字列,_後文字列,_数値) :- 数字文字列を検索して(_文字列,_前文字列,_数字文字列,_後文字列), その数値を得る(_数字文字列,_数値). 数字文字列を検索して(_文字列,_前文字列,_数字文字列,_後文字列) :- 数字文字列を検索する(_文字列,_前文字列,_数字文字列,_後文字列). その数値を得る(_数字文字列,_数値) :- atom_number(_数字文字列,_数値). 数字文字列を検索する(_文字列,_前文字列,_数字文字列,_後文字列) :- '前文字列・数字文字列・後文字列に分割'(_文字列,_前文字列,_数字文字列,_後文字列), 前文字列が空文字であるか前文字列の最後の文字が数字ではない(_前文字列), 後文字列が空文字であるか後文字列の最初の文字が数字ではない(_後文字列). '前文字列・数字文字列・後文字列に分割'(_文字列,_前文字列,_数字文字列,_後文字列) :- sub_atom(_文字列,_開始点,_長さ,_残り長さ,_数字文字列), _長さ > 0, 数字文字列である(_数字文字列), sub_atom(_文字列,0,_開始点,_,_前文字列), sub_atom(_文字列,_,_残り長さ,0,_後文字列). 前文字列が空文字であるか前文字列の最後の文字が数字ではない(''). 前文字列が空文字であるか前文字列の最後の文字が数字ではない(_前文字列) :- sub_atom(_前文字列,_,1,0,_文字), 符号とピリオドを含む数字ではない(_文字). 後文字列が空文字であるか後文字列の最初の文字が数字ではない(''). 後文字列が空文字であるか後文字列の最初の文字が数字ではない(_後文字列) :- sub_atom(_後文字列,0,1,_,_文字), 符号とピリオド含む数字ではない(_文字). 符号とピリオドを含む数字である('+'). 符号とピリオドを含む数字である('-'). 符号とピリオドを含む数字である('.'). 符号とピリオドを含む数字である(_文字) :- 数字である(_文字). 符号とピリオドを含む数字ではない(_文字) :- \+(符号とピリオドを含む数字である(_文字)). 数字である(_文字) :- _文字 @>= '0', _文字 @=< '9'. 数字ではない(_文字) :- \+(数字である(_文字)). 数字文字列である(_数字文字列) :- 'IEEE974等の浮動小数点数表示形式'(_数字文字列). 数字文字列である(_数字文字列) :- 全ての文字が数字である(_数字文字列), \+(数字列の禁則(_数字文字列)). 全ての文字が符号とピリオドを含む数字である(_数字文字列) :- forall(sub_atom(_数字文字列,_,1,_,_文字),符号とピリオドを含む数字である(_文字)). 全ての文字が数字である(_数字文字列) :- forall(sub_atom(_数字文字列,_,1,_,_文字),数字である(_文字)). 'IEEE974等の浮動小数点数表示形式'(_数字文字列) :- sub_atom(_数字文字列,S,2,R,_二文字), member(_二文字,['E+','E-','e+','e-']), 二文字は先頭または末尾にはこない(S,R), 前後文字列の形式が正しい(_数字文字列,S,R). 二文字は先頭または末尾にはこない(S,R) :- S > 0, R > 0. 前後文字列の形式が正しい(_数字文字列,S,R) :- sub_atom(_数字文字列,0,S,_,_数字文字列_1), sub_atom(_数字文字列,_,S,0,_数字文字列_2), 全ての文字が符号とピリオドを含む数字である(_数字文字列_1), 全ての文字が数字である(_数字文字列_2). 数字列の禁則(_数字文字列) :- ピリオドが2個以上ある(_数字文字列),!. 数字列の禁則(_数字文字列) :- ピリオドが先頭文字か末尾文字にある(_数字文字列),!. 数字列の禁則(_数字文字列) :- 'ピリオドの前後に+か-がある'(_数字文字列),!. 数字列の禁則(_数字文字列) :- '+が先頭文字以外にある'(_数字文字列),!. 数字列の禁則(_数字文字列) :- '-が先頭文字以外にある'(_数字文字列),!. ピリオドが2個以上ある(_数字文字列) :- findall(1,sub_atom(_数字文字列,_,1,_,'.'),L), length(L,_度数), _度数 > 1,!. ピリオドが先頭文字か末尾文字にある(_数字文字列) :- sub_atom(_数字文字列,0,1,_,'.'),!. ピリオドが先頭文字か末尾文字にある(_数字文字列) :- sub_atom(_数字文字列,_,1,0,'.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'+.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'-.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'.+'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'.-'),!. '+が先頭文字以外にある'(_数字文字列) :- sub_atom(_数字文字列,_開始点,1,_,'+'), _開始点 > 0,!. '-が先頭文字以外にある'(_数字文字列) :- sub_atom(_数字文字列,_開始点,1,_,'-'), _開始点 > 0,!. % 以下のサイトは # # 子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。 # このとき、考え得る階段の上がり方が何通りあるか求めるメソッドを実装してください。 '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方が何通りあるか求める。'(_n,_何通り) :- length(Ln,_n), 度数('子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'([],Ln,L),_何通り). '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(L,L,[]). '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_前回までに登った段,Ln,[_一歩で何段|_残りの段]) :- append(_前回までに登った段,[_|_],Ln), '一歩で1段、2段、もしくは3段を登ることができます'(_前回までに登った段,_一歩で何段,_登った段), '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_登った段,Ln,_残りの段). '一歩で1段、2段、もしくは3段を登ることができます'(_前回までに登った段,_一歩で何段,_登った段) :- member(_一歩で何段,[[_],[_,_],[_,_,_]]), append(_前回までに登った段,_一歩で何段,_登った段). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは # 子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。 # このとき、考え得る階段の上がり方が何通りあるか求めるメソッドを実装してください。 '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方が何通りあるか求める。'(_n,_何通り) :- 度数('子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(0,_n,L),_何通り). '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_n,_n,[]). '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_前回までに登った段段,_n,[_一歩で何段|_残りの段]) :- _前回までに登った段 < _n, '一歩で1段、2段、もしくは3段を登ることができます'(_前回までに登った段,_一歩で何段,_登った段), '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_登った段,_n,_残りの段). '一歩で1段、2段、もしくは3段を登ることができます'(_前回までに登った段,_一歩で何段,_登った段) :- member(_一歩で何段,[1,2,3]), _登った段 is _前回までに登った段 + _一歩で何段. 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは # 子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。 # このとき、考え得る階段の上がり方が何通りあるか求めるメソッドを実装してください。 '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方が何通りあるか求める。'(_n,_何通り) :- 度数('子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(0,_n,L),_何通り). '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_n,_n,[]). '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_前回までに登った段,_n,[_一歩で何段|_残りの段]) :- _前回までに登った段 < _n, member(_一歩で何段,[1,2,3]), _登った段 is _前回までに登った段 + _一歩で何段, '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_登った段,_n,_残りの段). % 以下のサイトは 検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列) :- 重い検索(_検索文字列,_文字列,_前文字列_1,_検索情報_1,_後文字列_1), 投機的検索(_検索文字列,_文字列,_前文字列_1,_検索情報_1,_後文字列_1,_前文字列,_検索情報,_後文字列). 検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列,_前文字列,_検索情報,_後文字列). 検索(_検索文字列,_文字列,_前文字列_1,_検索情報_1,_後文字列_1,_前文字列,_検索情報,_後文字列) :- 検索(_検索文字列,_後文字列_1,_前文字列_2,_検索情報,_後文字列), atomic_list_concat([_前文字列_1,_検索文字列,_前文字列_2],_前文字列). 重い検索(_検索文字列,_文字列,_前文字列,[_度数1,_度数2],_後文字列) :- sub_atom(_文字列,S,_,R,_検索文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列), count(sub_atom(_前文字列,_,_,_,'http://'),_度数1), count(sub_atom(_後文字列,_,_,_,'http://'),_度数2),!. % 以下のサイトは 投機的検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列) :- 重い検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列). 投機的検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列) :- 重い検索(_検索文字列,_文字列,_前文字列_1,_検索情報,_後文字列_1), 投機的検索(_検索文字列,_後文字列_1,_前文字列_2,_検索情報,_後文字列), atomic_list_concat([_前文字列_1,_検索文字列,_前文字列_2],_前文字列). 重い検索(_検索文字列,_文字列,_前文字列,[_度数1,_度数2],_後文字列) :- sub_atom(_文字列,S,_,R,_検索文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列), count(sub_atom(_前文字列,_,_,_,'http://'),_度数1), count(sub_atom(_後文字列,_,_,_,'http://'),_度数2),!. % 以下のサイトは # [1] 授業単元:Python # [2] 問題文(含コード&リンク): 課題2 # http://pc12.2ch.net/test/read.cgi/tech/1153585095/789 [1] 授業単元:Python [2] 問題文(含コード&リンク): 下の例参照 与えられた数字のみからなる文字列から各桁の数字に分割し、 隣り合う数字の合計の下一桁の値を並べたものを次の文字列とし、 結果が一桁になるまで繰り返しそれぞれの過程の文字列を出力する。 [3] 環境:特になし [4] 期限: 明日まで [5] その他の制限: 例 # 525123214112431 # 77635535523674 # 4398088075931 # 727886872424 # 99564459666 # 8410894522 # 251873974 # 76950261 # 3545287 # 899705 # 78675 # 5432 # 95 # 4 # # 上から2段目から最後の段までに現れる0から9数字の # 総出現数と各数字毎の出現比率を出力する。 # [3] 環境:特になし # [4] 期限: 明日まで # [5] その他の制限: # # 129個 # 0: 10回 3% # 1: 43回 20% # 2: 8回 2% # ... # 9: 18回 6% # のように出力してください。 対象となる文字列('525123214112431'). 対象となる文字列('77635535523674'). 対象となる文字列('4398088075931'). 対象となる文字列('727886872424'). 対象となる文字列('99564459666'). 対象となる文字列('8410894522'). 対象となる文字列('251873974'). 対象となる文字列('76950261'). 対象となる文字列('3545287'). 対象となる文字列('899705'). 対象となる文字列('78675'). 対象となる文字列('5432'). 対象となる文字列('95'). 対象となる文字列('4'). '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を出力する。' :- findall(_文字列,( 対象となる文字列(_対象となる文字列), _行ならび), '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率), 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率). '上から2段目から最後の段までに現れる0から9数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率) :- '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで), '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数), '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率). '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで) :- _行ならび = [_|_上から2段目から最後の段まで]. '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数) :- atomic_list_concat(_上から2段目から最後の段まで,_文字列), findall(_度数,( member(_数字文字,['0','1','2','3','4','5','6','7','8','9']), count(sub_atom(_文字列,_,1,_,_数字文字),_度数)), _0から9までの数字の出現ならび), sum(_0から9までの数字の出現ならび,_総出現数). '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率) :- findall(_出現比率,( member(_度数,_0から9までの数字の出現数ならび), _出現比率 is _度数 / _総出現数 * 100.0)), _各数字毎の出現比率). 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率) :- write('数: 出現数 出現比率\n'), '数字の出現数・出現比率を一行で出力する'(_0から9までの数字の出現数ならび,_各数字毎の出現比率,N), N = 9. '数字の出現数・出現比率を一行で出力する'(N,_0から9までの数字の出現数ならび,_各数字毎の出現比率,N) :- nth0(N,_0から9までの数字の出現数ならび,_出現数), nth0(N,_各数字毎の出現比率,_出現比率), writef(' %t: %t回 ',[N,_出現数]), format('~1f%\n',[_出現比率]). % 以下のサイトは # [1] 授業単元:Python # [2] 問題文(含コード&リンク): 課題2 # http://pc12.2ch.net/test/read.cgi/tech/1153585095/789 [1] 授業単元:Python [2] 問題文(含コード&リンク): 下の例参照 与えられた数字のみからなる文字列から各桁の数字に分割し、 隣り合う数字の合計の下一桁の値を並べたものを次の文字列とし、 結果が一桁になるまで繰り返しそれぞれの過程の文字列を出力する。 [3] 環境:特になし [4] 期限: 明日まで [5] その他の制限: 例 # 525123214112431 # 77635535523674 # 4398088075931 # 727886872424 # 99564459666 # 8410894522 # 251873974 # 76950261 # 3545287 # 899705 # 78675 # 5432 # 95 # 4 # # 上から2段目から最後の段までに現れる0から9数字の # 総出現数と各数字毎の出現比率を出力する。 # [3] 環境:特になし # [4] 期限: 明日まで # [5] その他の制限: # # 129個 # 0: 10回 3% # 1: 43回 20% # 2: 8回 2% # ... # 9: 18回 6% # のように出力してください。 対象となる文字列('525123214112431 77635535523674 4398088075931 727886872424 99564459666 8410894522 251873974 76950261 3545287 899705 78675 5432 95 4'). '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を出力する。' :- 対象となる文字列(_対象となる文字列), split(_対象となる文字列,['\n'],_行ならび), '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率), 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率). '上から2段目から最後の段までに現れる0から9数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率) :- '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで), '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数), '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率). '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで) :- _行ならび = [_|_上から2段目から最後の段まで]. '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数) :- atomic_list_concat(_上から2段目から最後の段まで,_文字列), findall(_度数,( member(_数字文字,['0','1','2','3','4','5','6','7','8','9']), count(sub_atom(_文字列,_,1,_,_数字文字),_度数)), _0から9までの数字の出現ならび), sum(_0から9までの数字の出現ならび,_総出現数). '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率) :- findall(_出現比率,( member(_度数,_0から9までの数字の出現数ならび), _出現比率 is _度数 / _総出現数 * 100.0)), _各数字毎の出現比率). 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率) :- write('数: 出現数 出現比率\n'), '数字の出現数・出現比率を一行で出力する'(_0から9までの数字の出現数ならび,_各数字毎の出現比率,N), N = 9. '数字の出現数・出現比率を一行で出力する'(N,_0から9までの数字の出現数ならび,_各数字毎の出現比率,N) :- nth0(N,_0から9までの数字の出現数ならび,_出現数), nth0(N,_各数字毎の出現比率,_出現比率), writef(' %t: %t回 ',[N,_出現数]), format('~1f%\n',[_出現比率]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/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),_その他). % 以下のサイトは % ユーティリティ述語 sub_atom/10 の提案 % % A .. 文字列 (atom) % S .. 検索文字列開始変位 (integer) % L .. 検索文字列の長さ (integer) % R .. 残り長さ (integer) % H .. 検索文字列より前側の文字列 (atom) % X .. 検索文字列 (atom) % T .. 検索文字列より後の残り文字列 (atom) % HL .. 検索文字列より前側の文字ならび (chars) % XL .. 検索文字列文字ならび (chars) % TL .. 検索文字列より後の残り文字ならび (chars) % A がvarである時はH-HL,X-XL,T-TLの3組の中にvar-varの組があってはなりません。 sub_atom_12(A,W1,W2,S,L,R,H,X,T,HL,XL,TL) :- '文字列W1から始まりW2で終わる。W1,W2の間にW1,W2は現れない'(A,V,W,S,L,R,H,X,T,HL,XL,TL). '文字列W1から始まりW2で終わる。W1,W2の間にW1,W2は現れない'(A,W1,W2,S,L,R,H,X,T,HL,XL,TL) :- sub_atom(A,S,L,R,H,X,T,HL,XL,TL), 文字列W1から始まりW2で終わる(X,W1,W2,S1,S2), 'W1,W2の間の文字列にW1,W2は現れない'(X,S1,S2,W1,W2). 文字列W1から始まりW2で終わる(X,W1,W2,S1,S2) :- sub_atom(X,0,S1,_,W1), sub_atom(X,S2,_,0,W2). 'W1,W2の間の文字列にW1,W2は現れない'(X,W1,W2,S1,S2) :- sub_atom(X,S1,_,S2,_W1とW2の間の文字列), \+(sub_atom(_W1とW2の間の文字列,_,_,_,W1)), \+(sub_atom(_W1とW2の間の文字列,_,_,_,W2)). count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- atom(A), !, sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), N is S + L, sub_atom(A,N,R,_,T), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- var(A), !, atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL), length(HL,S), length(XL,L), length(TL,R), concat_atom([H,X,T],A), sub_atom(A,S,L,R,H,X,T,HL,XL,TL). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/10 # # RegularExpressionでIPアドレスが正しいかどうか判断するのは無理かね? # 無理なら各オクテット切り出して0〜255の範囲にあるか地道にチェックするけど 'RegularExpressionでIPアドレスが正しいかどうか判断するのは無理かね? 無理なら各オクテット切り出して0〜255の範囲にあるか地道にチェックするけど'(_IPアドレス文字列) :- split(_IPアドレス文字列,['.'],L), count((member(N,L),integer(N),between(0,255,N)),4). % 以下のサイトは # # モンテカルロ法により円周率を求める # 試行限界数(10000000). モンテカルロ法により円周率を求める(_試行限界数,_円周率) :- var(_試行限界数), 試行限界数(_試行限界数), モンテカルロ法により円周率を求める(_試行限界数,_円周率),!. モンテカルロ法により円周率を求める(_試行限界数,_円周率) :- count('_x,_yを乱数から求め、ピタゴラスの定理を使って座標点(_x,_y)が四分の一円の内部であるか判定する'(_試行限界数), _四分の一円の内部に落ちた数), _円周率 is (_四分の一円の内部に落ちた数 * 4.0) / _試行限界数. '_x,_yを乱数から求め、ピタゴラスの定理を使って座標点(_x,_y)が四分の一円の内部であるか判定する'(_試行限界数) :- between(1,_試行限界数,_), '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y), ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y). '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y) :- _x is random(100001) / 100000, _y is random(100001) / 100000,!. ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y) :- 1.0 >= _x * _x + _y * _y. count(P,N) :- findall(1,P,L), length(L,N). % 以下のサイトは # # 集約鍵の詳細化 (坂内広蔵氏による集約キーのグラフ化の研究の一部をなぞったもの) # 集約鍵の詳細化(_集約鍵ならび,_詳細化された集約鍵) :- append(_詳細化された集約鍵,_,_集約鍵ならび). % % ?- 集約鍵の詳細化([部,課,係],_詳細化された集約鍵). % % _詳細化された集約鍵 = []; % _詳細化された集約鍵 = [部]; % _詳細化された集約鍵 = [部,課]; % _詳細化された集約鍵 = [部,課,係]; % % false. % % ?- findall(L,集約鍵の詳細化([部,課,係],L),_詳細化された集約鍵ならび). % % _詳細化された集約鍵ならび = [[],[部],[部,課],[部,課,係]] % % ?- % % それでは、 % 集約鍵の詳細化とはどういう意味か。SQLを使って説明する。 ここでは社員数を把握している。 % % 集約鍵 = [] の場合、 % % select count(*) from 社員; % 336 % % % 集約鍵 = [部] の場合、 % % select 部,count(*) from 社員 group by 部; % 営業,200 % 開発,136 % % % 集約鍵 = [部,課] の場合、 % % select 部,課,count(*) from 社員 group by 部,課; % 営業,食品,112 % 営業,薬品,88 % 開発,食品,70 % 開発,薬品,60 % 開発,検査,6 % % % 集約鍵 = [部,課,係] の場合、 % % select 部,課,係,count(*) from 社員 group by 部,課,係; % 営業,食品,東東京,18 % 営業,食品,西東京,20 % 営業,食品,神奈川,20 % 営業,食品,埼玉,16 % 営業,食品,千葉,16 % 営業,食品,群馬,8 % 営業,食品,栃木,7 % 営業,食品,茨城,7 % 営業,薬品,東京,19 % 営業,薬品,神奈川,12 % <以下省略> % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/311 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # 以下のような入力が与えられたときに # 3 # 11010 # 01111 # 10101 # 01110 # 01100 # # 01011 # 01010 # 00100 # 00110 # 10100 # # 11110 # 01110 # 01101 # 01110 # 00001 # # 以下のように出力されるプログラムを作成してください。よろしくお願いします。 # 4 # 3 # 8 # '以下のような入力が与えられたときに 3 11010 01111 10101 01110 01100 01011 01010 00100 00110 10100 11110 01110 01101 01110 00001 以下のように出力されるプログラムを作成してください。よろしくお願いします。 4 3 8'(LL) :- プログラム(LL,_解), writef('%t\n',[_解]). プログラム(LL,_解) :- 転置(LL,LL1), '1の最大連続数を得る'(LL1,_最大連続数), '最大連続数の連続は何か所にあるか'(LL1,_最大連続数,_何か所), _解 is _最大連続数 * _何か所. '1の最大連続数を得る'(LL1,_最大連続数) :- '1の最大連続数を得る'(LL1,0,_最大連続数). '1の最大連続数を得る'([],_最大連続数,_最大連続数) :- !. '1の最大連続数を得る'([L|R],_最大連続数_1,_最大連続数) :- 'Lの最大連続数'(L,_連続数), _連続数 > _最大連続数_1, '1の最大連続数を得る'(R,_連続数,_最大連続数),!. '1の最大連続数を得る'([_|R],_最大連続数_1,_最大連続数) :- '1の最大連続数を得る'(R,_最大連続数_1,_最大連続数). 'Lの最大連続数'(L,_Lの最大連続数) :- findmax(_連続数,( append(L1,L2,L3,L), '1の連続数'(L1,L2,L3,_連続数)), _Lの最大連続数). '1の連続数'(L1,L2,L3,_連続数) :- all(L2,1), \+(last(L1,1)), \+(L3 = [1|_]), length(L2,_連続数). '最大連続数の連続は何か所にあるか'([],_最大連続数,0) :- !. '最大連続数の連続は何か所にあるか'([L|R],_最大連続数,_何か所) :- length(L2,_最大連続数), count(( append(L1,L2,L3,L), '1の連続数'(L1,L2,L3,_最大連続数)), Count), '最大連続数の連続は何か所にあるか'(R,_最大連続数,_何か所_1), _何か所 is _何か所_1 + Count. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/705 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # [3] 環境 # 問題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 # [3.1] OS: unix #  [3.2] コンパイラ名とバージョン: gcc #  [3.3] 言語: C # [4] 期限:2月19日 # [5] その他の制限: なし # よろしくお願いします。 球の体積を計算する(_球の半径,_球の体積) :- count(( between(1,100000,_), '3座標を乱数で得る'(X,Y,Z), 原点からの距離が球の半径の範囲(X,Y,Z)), _球の半径の範囲内の個数), _球の体積 is (_球の半径の範囲内の個数 / 100000) * (_球の半径 ^ 3) * 8. '3座標を乱数で得る'(X,Y,Z) :- X is random(1001) / 1000, Y is random(1001) / 1000, Z is random(1001) / 1000. 原点からの距離が球の半径の範囲(X,Y,Z) :- sqrt(X ^ 2 + Y ^ 2 + Z ^ 2) =< 1.0. count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum(L,Sum) :- sum(L,0,Sum). sum([],Sum,Sum) :- !. sum([N|R],Sum_1,Sum) :- Sum_2 is Sum_1 + N, sum(R,Sum_2,Sum). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/595 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 5列5行の多次元配列(0または1が適当に並べられているもの)を用意し # 1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更し # そうでない場合は1のままにする この操作を10回行った配列を求めるプログラムを作成する # またこの配列は上下左右繋がっていて1,1の配列の場合上は1,5、左は5.1である # '5列5行の多次元配列(0または1が適当に並べられているもの)を用意し 1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更し そうでない場合は1のままにする この操作を10回行った配列を求めるプログラムを作成する またこの配列は上下左右繋がっていて1,1の配列の場合上は1,5、左は5.1である'(_5列5行の多次元配列,_変換された5列5行の多次元配列) :- '5列5行の多次元配列(0または1が適当に並べられているもの)を用意し1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更しそうでない場合は1のままにするこの操作を10回行った配列を求める'(_5列5行の多次元配列,_変換された5列5行の多次元配列). '5列5行の多次元配列(0または1が適当に並べられているもの)を用意し1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更しそうでない場合は1のままにするこの操作を10回行った配列を求める'(_5列5行の多次元配列,_変換された5列5行の多次元配列) :- 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換する(0,_5列5行の多次元配列,_変換された5列5行の多次元配列). 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換することを10回繰り返す(10,_5列5行の多次元配列,_5列5行の多次元配列) :- !. 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換することを10回繰り返す(N,_5列5行の多次元配列_1,_変換された5列5行の多次元配列) :- 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換する(_5列5行の多次元配列_1,_5列5行の多次元配列_2), N_2 is N + 1, 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換することを10回繰り返す(N2,_5列5行の多次元配列_2,_変換された5列5行の多次元配列). 前後左右の配列に1が2または3個存在するならこの配列の列全体を0に置換する(_5列5行の多次元配列_1,_5列5行の多次元配列_2) :- 列の置換(_5列5行の多次元配列_1,_置換された5列5行の多次元配列_1), 行の置換(_5列5行の多次元配列_1,_置換された5列5行の多次元配列_2), 二つの配列の論理積を取る(_置換された5列5行の多次元配列_1,_置換された5列5行の多次元配列_2,_5列5行の多次元配列_2). 行の置換(_5列5行の多次元配列,_置換された5列5行の多次元配列) :- '最終行を前、第一行を後ろに付加した5列6行の多次元配列'(_5列5行の多次元配列,_5列7行の多次元配列), findall(L,( append(L0,[_前の行,_行,_後の行|R],_5列7行の多次元配列), '1が2または3個存在するならこの配列の列全体を0に置換する'(_前の行,_行,_後の行,L)), _置換された5列5行の多次元配列). 列の置換(_5列5行の多次元配列,_置換された5列5行の多次元配列) :- 転置(_5列5行の多次元配列,_転置された5列5行の多次元配列), 行の置換(_転置された5列5行の多次元配列,_置換された転置された5列5行の多次元配列_1), 転置(_置換された転置された5列5行の多次元配列_1,_置換された5列5行の多次元配列). '最終行を前、第一行を後ろに付加した5列7行の多次元配列'(_5列5行の多次元配列,_5列7行の多次元配列) :- last(_5列5行の多次元配列,_最終行), _5列5行の多次元配列 = [_第一行|_], append([_最終行|_5列5行の多次元配列],[_第一行],_5列7行の多次元配列),!. '1が2または3個存在するならこの配列の列全体を0に置換する'(_前の行,_行,_後の行,[0,0,0,0,0]) :- count(member(1,_前の行),_前の行の1の個数), between(2,3,_前の行の1の個数),!. '1が2または3個存在するならこの配列の列全体を0に置換する'(_前の行,_行,_後の行,[0,0,0,0,0]) :- count(member(1,_後の行),_後の行の1の個数), between(2,3,_後の行の1の個数),!. '1が2または3個存在するならこの配列の列全体を0に置換する'(_,_行,_,_行). 二つの配列の論理積を取る([],[],[]) :- !. 二つの配列の論理積を取る([L1|R1],[L2|R2],[L3|R3]) :- '2つのならび要素の論理積'(L1,L2,L3), 二つの配列の論理積を取る(R1,R2,R3). '2つのならび要素の論理積'([],[],[]) :- !. '2つのならび要素の論理積'([N1|R1],[N2|R2],[N3|R3]) :- N3 is N1 /\ N2, '2つのならび要素の論理積'(R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/610 # # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントするプログラムを作成せよ. # # 【実行例】 # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # program :- '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'. '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする' :- 入力したDNA塩基配列(_DNA配列), forall(( 塩基(_塩基名,_塩基記号), count(sub_atom(_DNA配列,_,1,_,_塩基記号),_個数)), writef('%t (%t) : %t\n',[_塩基名,_塩基記号,_個数])). 入力したDNA塩基配列(_DNA配列) :- write('DNA塩基配列を入力してください : '), get_line(_DNA配列). 塩基('Thymine',t). 塩基('Cytosine',c). 塩基('Adenine',a). 塩基('Guanine',g). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/612 # # [1] 授業単元:(文字列) # [2] 問題文(含コード&リンク):文字列st の中に含まれる文字ch の個数(含まれて # いなければ0 とする)を返す関数 # int str_chnum(const char st[], int ch) # を作成せよ.以下の実行例のように,関数の動作を確認 # できるmain 関数も作成すること. # 【注意】scanf で文字列を入力させた後にgetchar 関 # 数で文字を入力させたい場合,getchar で文字を入力 # させる前に # scanf("%*c"); # などとして,バッファに残った改行コードを読み捨て # ておく必要がある. # # のように動作するプログラムを作成せよ # '文字列stの中に含まれる文字chの個数(含まれていなければ0 とする)を返す関数'(_st,_ch,_文字列stの中に含まれるchの個数) :- count(sub_atom(_st,_,1,_,_ch),_文字列stの中に含まれるchの個数). % 以下のサイトは うるう年は何回来るか(_年起点,_年終点,_うるう年の回数) :- count(( between(_年起点,_年終点,_年), うるう年(_年)), _うるう年の回数). 'ある日から後の年のある日は何日目か(起点日と終点日はそれぞれ日数に含める)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はそれぞれ日数に含める, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2. 'ある日から後の年のある日は何日目か(起点日と終点日はともに日数に含めない)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はともに日数に含めない, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2 - 2. 'ある日から後の年のある日は何日目か(起点日と終点日のどちらかは日数に含めない)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はともに日数に含めない, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2 - 1. ある年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目) :- うるう年は何回来るか(_年起点,_年終点,_うるう年の回数), '基本は一年365日で計算し、それにうるう年の回数(日数)を加える'(_年起点,_年終点,_うるう年の回数,_何日目). '基本は一年365日で計算し、それにうるう年の回数(日数)を加える'(_年起点,_年終点,_うるう年の回数,_何日目) :- _何日目 is _うるう年の回数 + 365 * (_年終点 - _年起点 + 1). 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目) :- _翌年 is _年起点 + 1, ある年の元旦から後の年の大晦日は何日目か(_翌年,_年終点,_何日目). ある年の元旦から後の年のある日は何日目か(_年起点,_年終点,_月終点,_日終点,_何日目) :- _前年 is _年終点 - 1, ある年の元旦から後の年の大晦日は何日目か(_年起点,_前年,_何日目_1), ある年月日はその年の元旦から何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _何日目_1 + _何日目_2. ある年月日はその年の元旦から何日目か(_年,_月,_日,_元旦から何日) :- 月日数ならび(_年,_月日数ならび), _前月 is _月 - 1, length(L0,_月), append(L0,_,_月日数ならび), sum(L0,_前月末日までの日数), _元旦から何日 is _前月末日までの日数 + _日. 大晦日は何日目か(_年,_月,_日,_大晦日は何日目) :- 月日数ならび(_年,_月日数ならび), 翌月から一日から大晦日は何日目か(_年,_月,_日,_月日数ならび,_翌月の一日から大晦日は何日目), 今日を含めて今月末日までの日数(_年,_月,_日,_月日数ならび,_今日を含めて今月の末日までの日数), _大晦日は何日目 is _今日を含めて今月の末日までの日数 + _翌月の一日から大晦日は何日目. 翌月から一日から大晦日は何日目か(_年,_月,_日,_月日数ならび,_何日目) :- length(L0,_月), append(L0,_翌月からの月日数ならび,_月日数ならび), sum(_翌月からの月日数ならび,_何日目). 今日を含めて今月末日までの日数(_年,_月,_日,_月日数ならび,_今日を含めて今月の末日までの日数) :- nth1(_月,_月日数ならび,_今月の日数), _今日を含めて今月の末日までの日数 is _今月の日数 - _日 + 1. 明日から今月末日までの日数(_年,_月,_日,_月日数ならび,_明日から今月の末日までの日数) :- nth1(_月,_月日数ならび,_今月の日数), _明日から今月の末日までの日数 is _今月の日数 - _日. 月日数ならび(_年,[31,29,31,30,31,30,31,31,30,31,30,31]) :- うるう年(_年),!. 月日数ならび(_年,[31,28,31,30,31,30,31,31,30,31,30,31]). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_),!, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 起点日と終点日はそれぞれ日数に含める. 起点日と終点日はともに日数に含めない. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/598 # # mysql 5.5 # # テーブル master # tcode # tname # lastdate # 〜 # # daily_data # select tcode,max(tdate) as maxdate # from daily_date # group by tcode; # # このdaily_dateから得られるmaxdateを使って # masterのtcodeの対応するlastdateに入れたいのですが、 # どのようにupdateを書けば良いのでしょうか? # 'daily_dateから得られるmaxdateを使ってmasterのtcodeの対応するlastdateに入れたい' :- dail_dateテーブルの構造(P1,_daily_date_tcode,_date), masterテーブルの構造(P2,_master_tcode,_lastdate), findsetof(_tcode,P1,L1), 最大日付に変更する(L1,P1,P2,_daily_date_tcode,_date,_master_tcode,_lastdate),!. daily_dateテーブルの構造(P,_tcode,_date) :- count(テーブル定義(daily_date,_,_),_アリティ), length(L,_アリティ), P =.. [daily_date|L], tcodeとdateの列位置を確定する(L,_tcode,_date),!. tcodeとdateの列位置を確定する(L,_tcode,_date),!. テーブル定義(daily_date,_nth1_tcode,tcode), テーブル定義(daily_date,_nth1_date,date), nth1(_nth1_tcode,L,_tcode), nth1(_nth1_date,L,_date),!. masterテーブルの構造(P,_tcode,_date) :- count(テーブル定義(master,_,_),_アリティ), length(L,_アリティ), P =.. [master|L], tcodeとlastdateの列位置を確定する(L,_tcode,_lastdate),!. tcodeとlastdateの列位置を確定する(L,_tcode,_date),!. テーブル定義(master,_nth1_tcode,tcode), テーブル定義(master,_nth1_lastdate,lastdate), nth1(_nth1_tcode,L,_tcode), nth1(_nth1_date,L,_lastdate),!. 最大日付に変更する(L1,P1,P2,_daily_date_tcode,_date,_master_tcode,_lastdate) :- forall(( member(_tcode,L1), findmax(_date,P1,_maxdate), lastdateの更新(_maxdate,P2,_tcode,_lastdate)), true). lastdateの更新(_maxdate,P,_tcode,_lastdate) :- retract(P), _lastdate = _maxdate, asserta(P),!. lastdateの更新(_maxdate,P,_tcode,_lastdate) :- _lastdate = _maxdate, asserta(P),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/537 # # SQLite 3.7.7.1 を PDO で操作しています。 # 以下ようなテーブルがあった場合にそれぞれのarticle_idのcomment_idをカウントするのはどのようなSQLを書いたら良いのでしょうか。 # # article_idを指定して一件だけ取り出す場合は、SELECT文にCOUNT(comments.comment_id) as comment_countのようにしてWHERE句でarticle_idを指定すれば取得できたのですが、全件の取得する場合が思うような結果が得られず困っております。。 # # ■ このような結果が欲しいです # article_id   comment_count # --------------------------- # 1       1 # 2       0 # 3       2 # 4       0 # 5       2 # # ■ articles # article_id   content # --------------------------- # 1       hoge # 2       hoge # 3       hoge # 4       hoge # 5       hoge # # ■ comments # comment_id   article_id # --------------------------- # 1       5 # 2       3 # 3       3 # 4       1 # 5       5 # # '以下のようなテーブルがあった場合にそれぞれのarticle_idのcomment_idをカウントする ■ このような結果が欲しいです article_id   comment_count --------------------------- 1       1 2       0 3       2 4       0 5       2 ■ articles article_id   content --------------------------- 1       hoge 2       hoge 3       hoge 4       hoge 5       hoge ■ comments comment_id   article_id --------------------------- 1       5 2       3 3       3 4       1 5       5 '(_article_id,_カウント) :- articles(_article_id,_), count(comments(_,_article_id),_カウント). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/868 # # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 発展課題 13..1 # ATM(Automated Teller Machine; 現金自動預け払い機)システムを実現するプログラムを考える。 # 氏名,口座番号,暗証番号,預金残高を要素とする構造体を宣言し, 512人分の口座が作成可能なようにせよ.また,初期値として次のように構造体の内容を設定せよ. # 立命太郎の口座番号は1234で,預金残高を1,234,560円に設定する. # 野路花子の口座番号は5678で,預金残高を987,600円に設定する. # 衣笠一郎の口座番号は9012で,預金残高を538,600円に設定する. # 暗証番号は口座番号に1111を足して10000で割った余りに設定する. # ここで暗証番号は、口座番号を引数としてとり、それに1111を足して10000で割った余りを計算する関数を作成して設定すること. # 上記の方法で初期値を設定し、設定された3人の預金残高を画面へ出力するプログラムを作成せよ.ただし、ひとり分の預金残高を表示する関数を作成して、これを繰り返し使って3人の預金残高を出力すること. # % ./initAccount 預金残高は次のとおりです. # 立命太郎 (1234) 1234560 円 # 野路花子 (5678) 987600 円 # 衣笠一郎 (9012) 538600 円 # % # :- dynamic([口座名義/2,暗証番号/2,口座残高/2]). '発展課題 13..1 ATM(Automated Teller Machine; 現金自動預け払い機)システムを実現する' :- 'ATM(Automated Teller Machine; 現金自動預け払い機)システム'. 'ATM(Automated Teller Machine; 現金自動預け払い機)システム' :- 口座番号を得る(_口座番号), '入金/出金/残高参照'(_口座番号), fail. 'ATM(Automated Teller Machine; 現金自動預け払い機)システム' :- 'ATM(Automated Teller Machine; 現金自動預け払い機)システム'. 口座番号を得る(_口座番号) :- 整数を得る('口座番号 : ',between(0,9999999,_口座番号),_口座番号), 口座名義(_口座番号,_口座名義), writef('%t 様ですね\n',[_口座名義]), 整数を得る('暗証番号 : ',between(0,9999,_暗証番号),_暗証番号), 暗証番号(_口座番号,_暗証番号),!. '入金/出金/残高参照'(_口座番号) :- メニュー表示, 整数を得る('0-4の数字',between(0,3,_選択),_選択), '入金/出金/残高参照'(_選択,_口座番号). メニュー表示 :- writef('\n0..終了\n\n1..入金\n2..出金\n3..残高参照\n\n'). '入金/出金/残高参照'(0,_) :- !. '入金/出金/残高参照'(1,_口座番号) :- 入金(_口座番号). '入金/出金/残高参照'(2,_口座番号) :- 出金(_口座番号). '入金/出金/残高参照'(3,_口座番号) :- 残高参照(_口座番号). 入金(_口座番号) :- write('紙幣を入力してください : '), 紙幣を数える(_入力額,正常終了), writef('%t 円入力されました : \n',[_入力額]), 口座残高の入金更新(_口座番号,_入金額). 口座残高の入金更新(_口座番号,_入金額) :- retract(口座残高(_口座番号,_口座残高)), _更新された口座残高 is _口座残高 + _入金額, assertz(口座残高(_口座番号,_更新された口座残高)). 出金(_口座番号) :- 整数を得る('出金額を入力してください : ',true,_出金額), '診断:: 出金額の入力'(_口座番号,_出金額), 紙幣を出力して口座残高の出金更新(_口座番号,_出金額),!. 出金(_口座番号) :- 出金(_口座番号). '診断:: 出金額の入力'(_口座番号,_出金額) :- 口座残高(_口座番号,_口座残高), _口座残高 >= _出金額,!. '診断:: 出金額の入力'(_口座番号,_出金額) :- writef('入力された出金額%tは残高不足です\n再入力をお願いします\n',[_出金額]), fail. 紙幣を出力して口座残高の出金更新(_口座番号,_出金額) :- 紙幣を出力して(_出金額,正常終了), 口座残高の出金更新(_口座番号,_出金額),!. 紙幣を出力して口座残高の出金更新(_口座番号,_出金額) :- write('現在紙幣の出力ができません。\nなお、口座残高は変更ございません\n'), fail. 口座残高の出金更新(_口座番号,_出金額) :- retract(口座残高(_口座番号,_口座残高)), _更新された口座残高 is _口座残高 - _出金額, assertz(口座残高(_口座番号,_更新された口座残高)). 残高参照(_口座番号) :- 個人口座残高の表示(_口座番号). 紙幣を数える(_入力額,正常終了). 紙幣を出力して(_出金額,正常終了). '立命太郎の口座番号は1234で,預金残高を1,234,560円に設定する.' :- assertz(口座名義(1234,立命太郎)), 暗証番号(1234,_暗証番号), assertz(暗証番号(1234,_暗証番号)), assertz(口座残高(1234,1234560)). '野路花子の口座番号は5678で,預金残高を987,600円に設定する.' :- assertz(口座名義(5678,野路花子)), 暗証番号(5678,_暗証番号), assertz(暗証番号(5678,_暗証番号)), assertz(口座残高(5678,987600)). '衣笠一郎の口座番号は9012で,預金残高を538,600円に設定する.' :- assertz(口座名義(9012,衣笠一郎)), 暗証番号(9012,_暗証番号), assertz(暗証番号(9012,_暗証番号)), assertz(口座残高(9012,538600)). '暗証番号は口座番号に1111を足して10000で割った余りに設定する. ここで暗証番号は、口座番号を引数としてとり、それに1111を足して10000で割った余りを計算する関数を作成して設定すること.'(_口座番号,_暗証番号) :- 暗証番号(_口座番号,_暗証番号). 暗証番号(_口座番号,_暗証番号) :- _暗証番号 is (_口座番号 + 1111) mod 10000. '上記の方法で初期値を設定し、設定された3人の預金残高を画面へ出力するプログラムを作成せよ.ただし、ひとり分の預金残高を表示する関数を作成して、これを繰り返し使って3人の預金残高を出力すること.' :- '立命太郎の口座番号は1234で,預金残高を1,234,560円に設定する.', '野路花子の口座番号は5678で,預金残高を987,600円に設定する.', '衣笠一郎の口座番号は9012で,預金残高を538,600円に設定する.', 設定された3人の預金残高を画面へ出力する. 設定された3人の預金残高を画面へ出力する :- 口座名義(_口座番号,_), 個人口座残高の表示(_口座番号), fail. 設定された3人の預金残高を画面へ出力する. 個人口座残高の表示(_口座番号) :- 口座名義(_口座番号,_口座名義), 口座残高(_口座番号,_口座残高), writef('%t (%t) %t 円\n',[_口座名義,_口座番号,_口座残高]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/434 # # [1] C言語 # [2] 1) codepad.org/u1WNoZPtの関数と反対の動作をする関数、 #     及び二つの関数の動作確認が出来るmain関数を作成せよ。 #   2) キーボードから入力されたアルファベット及び数字の数を数えて、 #     少ないほうを消去するプログラムを作成せよ。 #     ただし、同数の場合は両方とも消去する。 # [3.1] Windows7 # [3.3] C言語 # [4] 12/19 19時まで # [5] 特になし # # 'キーボードから入力されたアルファベット及び数字の数を数えて、少ないほうを消去するプログラムを作成せよ。ただし、同数の場合は両方とも消去する。'(_残った文字列) :- 'キーボードから入力された'(_文字列), 'アルファベット及び数字の数を数えて'(_文字列,_アルファベットの数,_数字の数), '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列). 'キーボードから入力された'(_文字列) :- write('アルファベットと数字だけからなる文字列を入力してください : '), get_line(_文字列). 'アルファベット及び数字の数を数えて'(_文字列,_アルファベットの数,_数字の数) :- count((sub_atom(_文字列,_,1,_,_文字),アルファベット(_文字)),_アルファベットの数), count((sub_atom(_文字列,_,1,_,_文字),数字(_文字)),_アルファベットの数). アルファベット(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. アルファベット(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 数字(_文字) :- _文字 @>= '0', _文字 @=< '9'. '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- 少ないほうを消去する。(_文字列,_アルファベットの数,_数字の数,_残った文字列). '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- 'ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列). '少ないほうを消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット < _数字の数, アルファベットを消去する(_文字列,_残った文字列). '少ないほうを消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット > _数字の数, 数字を消去する(_文字列,_残った文字列). 'ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット = _数字の数, 両方とも消去する(_文字列,_残った文字列). アルファベットを消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(アルファベット(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). 数字を消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(数字(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). 両方とも消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(数字(_文字)), \+(アルファベット(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). count(P,Count) :- findall(1,P,L), length(L,Count). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/102 # # [1] 授業単元:言語処理 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/0VyMr7kt # 上記のプログラムを変更して、逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み,計算結果を出力するプログラムを作成せよ. # さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示するプログラムを作成せよ. # '逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み,計算結果を出力する.さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル) :- 逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み(_テキストファイル,_逆ポーランド式ならび), 計算結果を出力する(_逆ポーランド式ならび), 'さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル). 逆ポーランド記法で記載された式が書かれたテキストファイルを読み込み(_テキストファイル,_逆ポーランド式ならび) :- get_chars(_テキストファイル,_文字ならび), 数字を値に変換する(_文字ならび,_文字ならび_1), 空白を除去する(_文字ならび_1,_逆ポーランド式ならび). 数字を値に変換する([],[]). 数字を値に変換する([A|R1],[B|R1]) :- 数字ならば数に変換(A,B), 数字を値に変換する(R1,R2),!. 数字を値に変換する([A|R1],[A|R2]) :- 数字を値に変換する(R1,R2). 空白改行などを除去する([],[]). 空白改行などを除去する([A|R1],[A|R1]) :- member(A,[+,-,*,/,0,1,2,3,4,5,6,7,8,9]), 空白改行などを除去する(R1,R2),!. 空白改行などを除去する([_|R1],[_|R2]) :- 空白改行などを除去する(R1,R2). 数字ならば数に変換(A,B) :- A @>= '0', A @=< '9', atom_number(A,B). 計算結果を出力する(_逆ポーランド式ならび) :- 計算結果(_逆ポーランド式ならび,[],_値), writef('%t\n',[_値]). 計算結果([],[_値],_値). 計算結果([N|R1],L1,_値) :- number(N), 計算結果(R1,[N|L1],_値),!. 計算結果([_演算子|R1],[N1,N2|R2],_値) :- 演算(_演算子,N1,N2,N3), 計算結果(R1,[N3|R2],_値). 演算(_演算子,N1,N2,N3) :- F =.. [_演算子,N1,N2], N3 is F. 'さらに,各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(_テキストファイル) :- get_lines(_テキストファイル,Lines), '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(Lines). '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を表示する'(Lines) :- append(_,[_行|R],Lines), '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を'(_行), 表示する(_頻度ならび), R = []. '各行の内容を字句解析(トークンに分解)し,各要素の個数をカウントした結果を'(_行,_頻度ならび) :- '各行の内容を字句解析(トークンに分解)し'(_行,_字句ならび), 各要素の個数をカウントした結果を(_字句ならび,_頻度ならび). '各行の内容を字句解析(トークンに分解)し'(_行,_字句ならび) :- sPLIT(_行,[' ','+','-','*','/','1','2','3','4','5','6','7','8','9','0'],L_1), 空白を取り除く(L_1,_字句ならび). 各要素の個数をカウントした結果を(_字句ならび,_頻度ならび) :- setof(_要素,[_要素] ^ member(_要素,_字句ならび),L_1), findall([_頻度,_字句],( member(_字句,L_1), count(member(_字句,_字句ならび),_頻度)),_頻度ならび). 表示する(_頻度ならび) :- append(_,[[_頻度,_字句]|R],_頻度ならび), writef('%t,%t回 ',[_字句,_頻度]), R = [], write('\n'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/70 # # [1] c言語 # [2] () キーボードから0 以上100以下の整数を入力し, # (1) 0以上10未満 # (2) 10 以上20未満 # (3) 20 以上30未満 # ..... # (10) 90 以上100 未満 # (11) 100 # の11 段階に分類して頻度を調べるプログラムを作成せよ.ただし,負の値が入力された場合 # にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面 # 表示して頻度には数えないこと. # # ()整数値を要素にもつk 行m 列行列A とm 行n 列行列B を宣言し,それらの要素をキーボー # ドから入力してA×B を算出するプログラムを作成せよ.ただし,k,m,n はk≠m,m≠n,k≧2, # m≧2,n≧2 を満たす任意の値をプログラム内で各自設定してよい.ただし,A×B の値を画面 # 表示する前に,k 行n列行列C に値を代入しておくこと. # # ' キーボードから0 以上100以下の整数を入力し, (1) 0以上10未満 (2) 10 以上20未満 (3) 20 以上30未満 ..... (10) 90 以上100 未満 (11) 100 の11 段階に分類して頻度を調べるプログラムを作成せよ.ただし,負の値が入力された場合 にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示して頻度には数えないこと.' :- 頻度ならびの初期化(0,_頻度ならびの初期状態), 'キーボードから0 以上100以下の整数を入力し,11 段階に分類して頻度を調べる.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示して頻度には数えないこと'(_頻度ならびの初期状態,_頻度ならび,継続), 現在の頻度の表示(_頻度ならび). 頻度ならびの初期化(100,[[100,101,0]]) :- '100の場合だけは範囲指定にならないが、ここでは101未満として形式的に一致させる',!. 頻度ならびの初期化(N,[[N,N_2,0]|R]) :- N_2 is N + 10, 頻度ならびの初期化(N_2,R). '100の場合だけは範囲指定にならないが、ここでは101未満として形式的に一致させる'. 'キーボードから0 以上100以下の整数を入力し,11 段階に分類して頻度を調べる.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示して頻度には数えないこと'(_,_頻度ならび,_頻度ならび,終了) :- !. 'キーボードから0 以上100以下の整数を入力し,11 段階に分類して頻度を調べる.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示して頻度には数えないこと'(_入力された整数,_頻度ならび_1,_頻度ならび,_) :- 現在の頻度の表示(_頻度ならび_1), ' キーボードから0 以上100以下の整数を入力する.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示する.'(_入力された整数), 頻度ならびの更新(_入力された整数,_頻度ならび_1,_頻度ならび_2,_状態_2), 'キーボードから0 以上100以下の整数を入力し,ただし,負の値が入力された場合にはプログラムを終了し,11 段階に分類して頻度を調べる.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示して頻度には数えないこと'(_入力された整数,[],_頻度ならび,_状態_2). ' キーボードから0 以上100以下の整数を入力する.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示する.'(_整数) :- write('0 以上100以下の整数を入力してください : '), get_line(Line), '診断::整数入力'(Line,_整数),!. ' キーボードから0 以上100以下の整数を入力する.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示する.'(_整数) :- ' キーボードから0 以上100以下の整数を入力する.ただし,負の値が入力された場合にはプログラムを終了し,101 以上の数が入力された場合には入力値が無効であることを画面表示する.'(_整数). '診断::整数入力'(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), _整数 < 101,!. '診断::整数入力'(Line,_整数) :- writef('入力された%tからは0以上100以下の整数が得られません。再入力をお願いします。\n',[Line]), fail. 頻度ならびの更新(_入力された整数,_頻度ならび_1,_頻度ならび_2,継続) :- between(0,100,_入力された整数), 頻度ならびの更新(_入力された整数,_頻度ならび_1,_頻度ならび_2),!. 頻度ならびの更新(N,_頻度ならび,_頻度ならび,終了) :- N < 0,!. 頻度ならびの更新(_入力された整数,_頻度ならび_1,_頻度ならび_2) :- append(L0,[[_範囲以上,_範囲未満,_頻度_1]|R],_頻度ならび_1), _入力された整数 >= _範囲以上, _入力された整数 < _範囲未満, _頻度_2 is _頻度_1 + 1, append(L0,[[_範囲以上,_範囲未満,_頻度_2]|R],_頻度ならび_2). 頻度ならびの初期化(100,[[100,101,0]]) :- !. 頻度ならびの初期化(N,[[N,N_2,0]|R]) :- N_2 is N + 10, 頻度ならびの初期化(N_2,R). 現在の頻度の表示([[100,101,_頻度]]) :- writef('%t 頻度=%t\n',[_頻度]),!. 現在の頻度の表示([[_範囲以上,_範囲未満,_頻度]|R]) :- writef('%t 以上 %t 未満 頻度=%t\n',[_範囲以上,_範囲未満,_頻度]), 現在の頻度の表示(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/7 # # [1] 授業単元:問題1:二次元配列 問題2:関数 # [2] 問題文(含コード&リンク): # 問題1:ファイルから入力した英小文字a-zの頻度のヒストグラムを # 出力するプログラムを書いてください。入力ファイルはプログラムファイルを使えば良い。 # # 問題2:1文字を引数としてそれが小文字であれば大文字にして返し # そうでなければそのまま文字を返す関数を作成しキーボードから # 文字入力としてこの関数の動作を確認せよ。 # [3.1] OS: windows vista #  [3.2] コンパイラ名とバージョン:visual studio2010 #  [3.3] 言語: C言語 # [4] 期限: 11月30日 # [5]ポインタはやってません。宜しくお願いします 。 # # '1文字を引数としてそれが小文字であれば大文字にして返し そうでなければそのまま文字を返す関数を作成しキーボードから 文字入力としてこの関数の動作を確認せよ。' 'キーボードから文字入力としてこの関数の動作を確認せよ'. 'キーボードから文字入力としてこの関数の動作を確認せよ' :- get_char(_文字), '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返された文字_1), to_upper(_文字,_返された文字_2), writef('キーボードから入力した文字 "%t",返された文字 "%t"\n',[_返された文字_1,_返された文字_2]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- to_upper(_文字,_返す文字). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字). それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字) :- それが小文字であれば(_文字), 大文字にして返し(_文字,_返す文字). それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字) :- そうでなければ(_文字), _返す文字 = _文字. それが小文字であれば(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 大文字にして返し(_文字,_返す文字) :- nth1(Nth,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_文字), nth1(Nth,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_返す文字). そうでなければ(_文字) :- \+(_文字 @>= 'a'),!. そうでなければ(_文字) :- \+(_文字 @=< 'z'),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% それが小文字であれば(_文字) :- char_code(_文字,_文字コード), between(97,122,_文字コード). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% それが小文字であれば(_文字) :- char_code(_文字,_文字コード), _文字コード >= 97, _文字コード =< 122. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 大文字にして返し(_文字,_返す文字) :- 小文字大文字(_文字,_大文字). 小文字大文字(a,'A'). 小文字大文字(b,'B'). 小文字大文字(c,'C'). 小文字大文字(d,'D'). 小文字大文字(e,'E'). 小文字大文字(f,'F'). 小文字大文字(g,'G'). 小文字大文字(h,'H'). 小文字大文字(i,'I'). 小文字大文字(j,'J'). 小文字大文字(k,'K'). 小文字大文字(l,'L'). 小文字大文字(m,'M'). 小文字大文字(n,'N'). 小文字大文字(o,'O'). 小文字大文字(p,'P'). 小文字大文字(q,'Q'). 小文字大文字(r,'R'). 小文字大文字(s,'S'). 小文字大文字(t,'T'). 小文字大文字(u,'U'). 小文字大文字(v,'V'). 小文字大文字(w,'W'). 小文字大文字(x,'X'). 小文字大文字(y,'Y'). 小文字大文字(z,'Z'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 大文字にして返し(_文字,_返す文字) :- char_code(_文字,_文字コード), _大文字の文字コード is _文字コード - 32, char_code(_返す文字,_大文字の文字コード),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- 小文字大文字(_文字,_返す文字). 小文字大文字(a,'A') :- !. 小文字大文字(b,'B') :- !. 小文字大文字(c,'C') :- !. 小文字大文字(d,'D') :- !. 小文字大文字(e,'E') :- !. 小文字大文字(f,'F') :- !. 小文字大文字(g,'G') :- !. 小文字大文字(h,'H') :- !. 小文字大文字(i,'I') :- !. 小文字大文字(j,'J') :- !. 小文字大文字(k,'K') :- !. 小文字大文字(l,'L') :- !. 小文字大文字(m,'M') :- !. 小文字大文字(n,'N') :- !. 小文字大文字(o,'O') :- !. 小文字大文字(p,'P') :- !. 小文字大文字(q,'Q') :- !. 小文字大文字(r,'R') :- !. 小文字大文字(s,'S') :- !. 小文字大文字(t,'T') :- !. 小文字大文字(u,'U') :- !. 小文字大文字(v,'V') :- !. 小文字大文字(w,'W') :- !. 小文字大文字(x,'X') :- !. 小文字大文字(y,'Y') :- !. 小文字大文字(z,'Z') :- !. 小文字大文字(_文字,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/7 # # [1] 授業単元:問題1:二次元配列 問題2:関数 # [2] 問題文(含コード&リンク): # 問題1:ファイルから入力した英小文字a-zの頻度のヒストグラムを # 出力するプログラムを書いてください。入力ファイルはプログラムファイルを使えば良い。 # # 問題2:1文字を引数としてそれが小文字であれば大文字にして返し # そうでなければそのまま文字を返す関数を作成しキーボードから # 文字入力としてこの関数の動作を確認せよ。 # [3.1] OS: windows vista #  [3.2] コンパイラ名とバージョン:visual studio2010 #  [3.3] 言語: C言語 # [4] 期限: 11月30日 # [5]ポインタはやってません。宜しくお願いします 。 # # 'ファイルから入力した英小文字a-zの頻度のヒストグラムを出力するプログラムを書いてください。入力ファイルはプログラムファイルを使えば良い。' :- get_chars('c161_7.html',Chars), '英小文字a-zの頻度の'(Chars,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]), ヒストグラムを出力する([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]). '英小文字a-zの頻度の'([],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]). '英小文字a-zの頻度の'([_文字|_残りならび],L1,L) :- 英小文字ならば頻度を更新(_文字,L1,L2), '英小文字a-zの頻度の'(_残りならび,L2,L),!. '英小文字a-zの頻度の'([_|_残りならび],L1,L) :- '英小文字a-zの頻度の'(_残りならび,L1,L). 英小文字ならば頻度を更新(_文字,L1,L2) :- nth0(Nth0,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_文字), length(L0,Nth0), append(L0,[S|R],L1), S2 is S + 1, append(L0,[S2|R],L2). ヒストグラムを出力する(L) :- ヒストグラムの用意(L,LL1), 転置(LL1,LL2), 出力する(LL2). ヒストグラムの用意(L,LL1) :- 最大値(L,_最大値), length(L1,_最大値), findall(L1,( 星のリストに変換(L,L1)), LL1). 星のリストに変換(L,L1) :- member(N,L), length(R,N), append(L0,R,L1), all(L0,' '), all(R,*). 出力する([]). 出力する([L|R]) :- atomic_list_concat(L,S), writef('%t\n',[S]), 出力する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/7 # # [1] 授業単元:問題1:二次元配列 問題2:関数 # [2] 問題文(含コード&リンク): # 問題1:ファイルから入力した英小文字a-zの頻度のヒストグラムを # 出力するプログラムを書いてください。入力ファイルはプログラムファイルを使えば良い。 # # 問題2:1文字を引数としてそれが小文字であれば大文字にして返し # そうでなければそのまま文字を返す関数を作成しキーボードから # 文字入力としてこの関数の動作を確認せよ。 # [3.1] OS: windows vista #  [3.2] コンパイラ名とバージョン:visual studio2010 #  [3.3] 言語: C言語 # [4] 期限: 11月30日 # [5]ポインタはやってません。宜しくお願いします 。 # # '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- to_upper(_文字,_返す文字). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字). それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字) :- それが小文字であれば(_文字), 大文字にして返し(_文字,_返す文字). それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字) :- そうでなければ(_文字), _返す文字 = _文字. それが小文字であれば(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 大文字にして返し(_文字,_返す文字) :- nth1(Nth,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_文字), nth1(Nth,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_返す文字). そうでなければ(_文字) :- \+(_文字 @>= 'a'),!. そうでなければ(_文字) :- \+(_文字 @=< 'z'),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% それが小文字であれば(_文字) :- char_code(_文字,_文字コード), between(97,122,_文字コード). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% それが小文字であれば(_文字) :- char_code(_文字,_文字コード), _文字コード >= 97, _文字コード =< 122. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 大文字にして返し(_文字,_返す文字) :- 小文字大文字(_文字,_大文字). 小文字大文字(a,'A'). 小文字大文字(b,'B'). 小文字大文字(c,'C'). 小文字大文字(d,'D'). 小文字大文字(e,'E'). 小文字大文字(f,'F'). 小文字大文字(g,'G'). 小文字大文字(h,'H'). 小文字大文字(i,'I'). 小文字大文字(j,'J'). 小文字大文字(k,'K'). 小文字大文字(l,'L'). 小文字大文字(m,'M'). 小文字大文字(n,'N'). 小文字大文字(o,'O'). 小文字大文字(p,'P'). 小文字大文字(q,'Q'). 小文字大文字(r,'R'). 小文字大文字(s,'S'). 小文字大文字(t,'T'). 小文字大文字(u,'U'). 小文字大文字(v,'V'). 小文字大文字(w,'W'). 小文字大文字(x,'X'). 小文字大文字(y,'Y'). 小文字大文字(z,'Z'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 大文字にして返し(_文字,_返す文字) :- char_code(_文字,_文字コード), _大文字の文字コード is _文字コード - 32, char_code(_返す文字,_大文字の文字コード),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- 小文字大文字(_文字,_返す文字). 小文字大文字(a,'A') :- !. 小文字大文字(b,'B') :- !. 小文字大文字(c,'C') :- !. 小文字大文字(d,'D') :- !. 小文字大文字(e,'E') :- !. 小文字大文字(f,'F') :- !. 小文字大文字(g,'G') :- !. 小文字大文字(h,'H') :- !. 小文字大文字(i,'I') :- !. 小文字大文字(j,'J') :- !. 小文字大文字(k,'K') :- !. 小文字大文字(l,'L') :- !. 小文字大文字(m,'M') :- !. 小文字大文字(n,'N') :- !. 小文字大文字(o,'O') :- !. 小文字大文字(p,'P') :- !. 小文字大文字(q,'Q') :- !. 小文字大文字(r,'R') :- !. 小文字大文字(s,'S') :- !. 小文字大文字(t,'T') :- !. 小文字大文字(u,'U') :- !. 小文字大文字(v,'V') :- !. 小文字大文字(w,'W') :- !. 小文字大文字(x,'X') :- !. 小文字大文字(y,'Y') :- !. 小文字大文字(z,'Z') :- !. 小文字大文字(_文字,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/889 # # [1] 授業単元:C言語 # [2] 問題 # 0から255までの整数を8bitの2進数で表わし、小さい方から順に左から右へ並べ、 # それらを上位のbitから6bitづつ区切って342個の整数に変換するとき、 # (最後に2bitあまるので下位4bitを0で埋める) # 変換後のそれぞれの整数の出現数をカウントし、整数とその出現数を表示する。 # 表示する際は、整数は6bitで表示し、整数の小さい順に出力すること。 # 例: # 00000000 00000001 00000010 ... # ↓ # 000000 000000 000100 000010 ... # ↓ # 000000 XX回 # 000001 XX回 # ... # 111111 XX回 # # '0から255までの整数を8bitの2進数で表わし、小さい方から順に左から右へ並べ、 それらを上位のbitから6bitづつ区切って342個の整数に変換するとき、 (最後に2bitあまるので下位4bitを0で埋める) 変換後のそれぞれの整数の出現数をカウントし、整数とその出現数を表示する。 表示する際は、整数は6bitで表示し、整数の小さい順に出力すること。 例: 00000000 00000001 00000010 ... ↓ 000000 000000 000100 000010 ... ↓ 000000 XX回 000001 XX回 ... 111111 XX回' :- '0から255までの整数を8bitの2進数で表わし'(_256個の2進数表示ならび), 'それらを上位のbitから6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'(_256個の2進数表示ならび,_342個の6ビット2進数表示ならび), '変換後のそれぞれの整数の出現数をカウントし、整数とその出現数を表示する'(_342個の6ビット2進数表示ならび). '0から255までの整数を8bitの2進数で表わし'(_256個の2進数表示ならび) :- findall(_二進数表示ならび,( between(0,255,N), 二進数表示ならび(N,[],_二進数表示ならび)), _256個の2進数表示ならび). 二進数表示ならび(0,L,L) :- !. 二進数表示ならび(N,L1,L) :- M is N mod 2, D is N // 2, 二進数表示ならび(D,[M|L1],L). 'それらを上位のbitから6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'(_256個の2進数表示ならび,_342個の6ビット2進数表示ならび) :- flatten(_256個の2進数表示ならび,_平坦化されたビットならび), '6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'(_平坦化されたビットならび,_342個の6ビット2進数表示ならび). '6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'([_1,_2,_3,_4,_5,_6|R1],[[_1,_2,_3,_4,_5,_6],R2]) :- '6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'(R1,R2). '6bitづつ区切って342個の整数に変換するとき(最後に2bitあまるので下位4bitを0で埋める)'(_2bitあまり,[_下位4bit0で埋めた6個組]) :- append(_2bitあまり,[0,0,0,0],_下位4bit0で埋めた6個組). '変換後のそれぞれの整数の出現数をカウントし、整数とその出現数を表示する'(_342個の6ビット2進数表示ならび) :- _2の6乗の上限値 is truncate(2 ^ 6 - 1), between(0,_2の6乗の上限値,N), 'それぞれの整数の出現数をカウントし'(_342個の6ビット2進数表示ならび,N,_6ビット2進数表示ならび,_頻度), 整数とその出現数を表示する(_6ビット2進数表示ならび,_頻度), N = _2の6乗の上限値. 'それぞれの整数の出現数をカウントし'(_342個の6ビット2進数表示ならび,N,_6ビット2進数表示ならび,_頻度) :- '6ビット2進数表示ならび'(N,_6ビット2進数表示ならび), count(member(_6ビット2進数表示ならび,_342個の6ビット2進数表示ならび),_頻度). '6ビット2進数表示ならび'(N,L) :- length(L,6), 二進数表示ならび(N,[],L1), append(L0,L1,L), all(L0,0). all([],_). all([A|R],A) :- all(R,A). 整数とその出現数を表示する(_6ビット2進数表示ならび,_頻度) :- atomic_list_concat(_6ビット2進数表示ならび,_6ビット2進数表示文字列), 整数から頭部空白文字列(3,_頻度,_頻度表示文字列), writef('%t%t回\n',[_6ビット2進数表示文字列,_頻度表示文字列]). 整数から頭部空白文字列(N桁,_整数,_整数表示文字列) :- length(L,N桁), nuber_chars(_整数,L1), append(L0,L1,L), all(L0,' '), atomic_list_concat(L,_整数表示文字列). % 以下のサイトは # 出典:: 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/1337692704/440 # # 「課題」 # 以下に示すのは、int型配列aの要素の中で値が正であるものを順に並べた要素 # をもつ配列bを作るプログラムである(配列aが{5,-1,3,4,-2,7}であれば、配列bは{5,4 # ,3,7}となる)  # int count =0; # for (int i=0;i<a.length; i++) # if (a[i]>0) count++ # int[] b =new int[count]; # int j =0; # for (int i=0; i<a.length;i++) # if(a[i]>0)b[j++]=a[i]; # # これを実行できるようにする宿題です。 # 明日の朝までに提出です。 # # '整数のならびaの要素の中で値が正であるものを順に並べた要素をもつならびbを作る'(_a,_b) :- findall(A,( member(A,_a), A >= 0), _b). % 以下のサイトは # [1] 授業単元: プログラム言語基礎 # [2] 問題文(含コード&リンク):n個の整数を入力し、入力した値の中で奇数と偶数の個数を表示せよ # [3] 環境 #  [3.1] OS: Windows #  [3.2] コンパイラ名とバージョン: borland 2,31 #  [3.3] 言語: C # [4] 期限: 今日の17時まで # [5] その他の制限: まだ習い始めて間もないです。 # # #include # # void main(void) # { # int x; # # printf("x = "); # scanf("%d",&x); # if(x%2 !=0) # { # printf("\n xは奇数"); # } # else{ # printf("\n xは偶数"); # } # } # これを応用して作れだそうです。 # # どうかよろしくお願いします 'n個の整数を入力し、入力した値の中で奇数と偶数の個数を表示せよ'(_n個) :- rawmode, 'n個の整数を入力し、入力した値の中で奇数と偶数の個数を表示せよ'(_n個,0,0), norawmode. 'n個の整数を入力し、入力した値の中で奇数と偶数の個数を表示せよ'(0,_,_) :- !. 'n個の整数を入力し、入力した値の中で奇数と偶数の個数を表示せよ'(N,_奇数の個数_1,_偶数の個数_1) :- '整数を入力し、入力した値の中で奇数と偶数の個数を表示'(_奇数の個数_1,_偶数の個数_1,_奇数の個数_2,_偶数の個数_2), N_1 is N - 1, 'n個の整数を入力し、入力した値の中で奇数と偶数の個数を表示せよ'(N_1,_奇数の個数_2,_偶数の個数_2). '整数を入力し、入力した値の中で奇数と偶数の個数を表示'(_奇数の個数_1,_偶数の個数_1,_奇数の個数_2,_偶数の個数_2) :- 整数を得る(整数,_整数), 奇数または偶数の頻度を更新(_整数,_奇数の個数_1,_偶数の個数_1,_奇数の個数_2,_偶数の個数_2), writef('現在までの 奇数の個数=%t, 偶数の個数=%t \n',[_奇数の個数_2,_偶数の個数_2]). 奇数または偶数の頻度を更新(_整数,_奇数の個数_1,_偶数の個数_1,_奇数の個数_1,_偶数の個数_2) :- 0 is _整数 mod 2, _偶数の個数_2 is _偶数の個数_1 + 1,!. 奇数または偶数の頻度を更新(_整数,_奇数の個数_1,_偶数の個数_1,_奇数の個数_2,_偶数の個数_1) :- \+(0 is _整数 mod 2), _奇数の個数_2 is _奇数の個数_1 + 1. % 以下のサイトは # [1] プログラミング # [2] 50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求めるプログラムを作成せよ. # # 次のような出力が得られることを確認せよ (表示形式は各自工夫せよ). # o 310円 → 50円×3枚+80円×2枚+120円×0枚 # o 390円 → 50円×3枚+80円×0枚+120円×2枚, 50円×3枚+80円×3枚+120円×0枚 # [3] 環境 #  [3.1] winXP sp2 #  [3.2] cygwin #  [3.3] C # [4] 2006年10月23日23時59分 # [5] 途中までやったんで埋める形でお願いします # 途中までやったぶんは次書きます '50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求めて、これを表示する. ' :- 'キーボードから金額 t を入力し'(_金額t), '50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求める'(_金額t,_切手枚数の組合せならび), 組合せを表示する(_金額t,_切手枚数の組合せならび). '50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求める. '(_金額t,_切手枚数の組合せならび) :- setof([_50円切手の枚数,_80円切手の枚数,_120円切手の枚数], [_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数] ^ 組合せ合計が金額tと一致する(_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数)),_切手枚数の組合せならび). 'キーボードから金額 t を入力し'(_金額t) :- 整数を得る('金額t ',_金額t > 0,_金額t). 組合せ合計が金額tと一致する(_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数) :- 組合せ合計が金額tと一致する(_L,_金額t), 組合せ枚数を数える(L,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数). 組合せ合計が金額tと一致する(_L,_金額t) :- between(1,12,N), 組合せ([50,50,50,50,80,80,80,80,120,120,120],N,L), sum_list(L,_金額t), 組合せ枚数を数える(L,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数) :- 度数(member(50,L),_50円切手の枚数), 度数(member(80,L),_80円切手の枚数), 度数(member(120,L),_120円切手の枚数). 組合せを表示する(_,[]) :- write('切手の組合せは作れません\n'). 組合せを表示する(_金額t,_切手枚数の組合せならび) :- forall(append(_,[[_50円切手の枚数,_80円切手の枚数,_120円切手の枚数]|R],_切手枚数の組合せならび), writef('%w -> 50円切手×%w枚+80円切手×%w枚+120円切手×%w枚\n',[_金額t,_50円切手の枚数,_80円切手の枚数,_120円切手の枚数])). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R2]) :- 'Nを1減らして残り要素の組合せ'(R1,N,R2). 組合せ([_|R1],N,R2) :- 'Nはそのままで残り要素の組合せ'(R1,N,R2). 'Nを1減らして残り要素の組合せ'(R1,N,R2) :- N > 1, succ(N_1,N), 組合せ(R1,N_1,R2). 'Nはそのままで残り要素の組合せ'(R1,N,R2) :- N > 1, 組合せ(R1,N,R2). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ # '2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。' :- findall(Count,( between(1,100,N), count((between(1,100,M), U is random(1000), U < 400), Count)), L), 分布を表示する(L). 分布を表示する(L) :- between(0,100,N), 表示文字列を生成(N,L,_表示文字列), writef('%t: %t\n',[_カウント表示文字列]), N = 100. 表示文字列を生成(N,L,_表示文字列) :- 整数から文字列(2,Count,_カウント表示文字列), findall((*),( member(N,L)), L), atomic_list_concat([_カウント表示文字列,': '|L],_表示文字列). 整数から文字列(_文字列桁,_整数,_文字列) :- 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列),!. 整数から文字列(_文字列桁,_整数,_文字列) :- atom_number(_文字列,_整数). 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列) :- length(L,_文字列桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,' '), atomic_list_concat(L,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ 'πの値をモンテカルロ法で求めよ'(_pi) :- 'πの値をモンテカルロ法で求めよ'(0,[],L), length(L,_頻度), _pi is _頻度 * 4 / 100000. 'πの値をモンテカルロ法で求めよ'(100000,L,L) :- !. 'πの値をモンテカルロ法で求めよ'(N,L_1,L) :- '点が四分の一円弧の内側の時はカウントする'(L_1,L), N_2 is N + 1, 'πの値をモンテカルロ法で求めよ'(N_2,L_2,L). '点が四分の一円弧の内側の時はカウントする'(L_1,[1|L_1] _x is random(10001) / 10000, _y is random(10001) / 10000, _x ^ 2 + _y ^ 2 >= 1.0,!. '点が四分の一円弧の内側の時はカウントする'(L,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ # # '1 ∫ x^2dx をモンテカルロ法で求めよ 0'(_積分値) :- '区間0..1範囲のx^2dxの積分値をモンテカルロ法で求めよ'(_積分値). '区間0..1範囲のx^2dxの積分値をモンテカルロ法で求めよ'(_積分値) :- 'x^2dx をモンテカルロ法で求めよ'(0,0,_頻度), _積分値 is _頻度 / 100000. '区間0..1範囲のx^2dxの積分値をモンテカルロ法で求めよ'(100000,_頻度,_頻度) :- !. '区間0..1範囲のx^2dxの積分値をモンテカルロ法で求めよ'(N,_頻度_1,_頻度) :- 頻度を更新する(_頻度_1,_頻度_2), N_2 is N + 1, '区間0..1範囲のx^2dxの積分値をモンテカルロ法で求めよ'(N_2,_頻度_2,_頻度). 頻度を更新する(_頻度_1,_頻度_2) :- _x is random(10001) / 10000, _y is random(10001) / 10000, _y =< _x ^ 2, _頻度_2 is _頻度_1 + 1,!. 頻度を更新する(_頻度,_頻度). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ # 'コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn,そのmax、min を調べよ。'(_n) :- append(_,[_試行回数|R],[10,100,1000,10000,100000]), 試行回数の集計ならび(_試行回数,_最大値,_最小値), 整数から文字列(6,_試行回数,_試行回数文字列), writef('試行回数%t: 最大値=%t 最小値=%t\n',[_試行回数文字列,_最大値,_最小値]), R = []. 試行回数の集計ならび(_試行回数,_最大値,_最小値) :- findall(S,( between(1,_試行回数,_), count(( between(1,_n,_), 1 is random(1)), S)), L), min(L,_最小値), max(L,_最大値),!. 整数から文字列(_文字列桁,_整数,_文字列) :- 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列),!. 整数から文字列(_文字列桁,_整数,_文字列) :- atom_number(_文字列,_整数). 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列) :- length(L,_文字列桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,' '), atomic_list_concat(L,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ 'サイコロを10,100,1000,10000,100000 回投げて分布を調べよ'(N,0,0,0,0,0,0,_1,_2,_3,_4,_5,_6) :- append(_,[_何回|R],[10,100,1000,10000,100000]), サイコロの目の頻度(0,_何回,L1,L2), writef('投げた回数..%t, 1..%t,2..%t,3..%t,4..%t,5..%t,6..%t\n',[_何回|L2]), R = []. サイコロの目の頻度(_何回,_何回,L,L) :- !. サイコロの目の頻度(N,_何回,L1,L) :- _サイコロの目 is random(6) + 1, 頻度に加算(_サイコロの目,L1,L2), N_2 is N + 1, サイコロの目の頻度(N_2,_何回,L2,L). 頻度に加算(1,[_1,_2,_3,_4,_5,_6],[_1_2,_2,_3,_4,_5,_6]) :- _1_2 is _1 + 1. 頻度に加算(2,[_1,_2,_3,_4,_5,_6],[_1,_2_2,_3,_4,_5,_6]) :- _2_2 is _2 + 1. 頻度に加算(3,[_1,_2,_3,_4,_5,_6],[_1,_2,_3_2,_4,_5,_6]) :- _3_2 is _3 + 1. 頻度に加算(4,[_1,_2,_3,_4,_5,_6],[_1,_2,_3,_4_2,_5,_6]) :- _4_2 is _4 + 1. 頻度に加算(5,[_1,_2,_3,_4,_5,_6],[_1,_2,_3,_4,_5_2,_6]) :- _5_2 is _5 + 1. 頻度に加算(6,[_1,_2,_3,_4,_5,_6],[_1,_2,_3,_4,_5,_6_2]) :- _6_2 is _6 + 1. % 以下のサイトは # # 1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。 # '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となるPrologプログラムを作成しなさい。'(_乱数ならび) :- '1から99までを値域とする乱数'(_乱数), '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,0,0,0,_乱数ならび). '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_,1,3,3,[]) :- !. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(22,0,_22以下の頻度_1,_22以下の頻度_1,[22|R]) :- var(_22の枠), '1から99までを値域とする乱数'(_乱数), '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,1,_22以下の頻度_1,_22以下の頻度_1,R),!. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_値,_22,_22以下の頻度_1,_22以下の頻度_1,[_値|R]) :- _値 =< 22, _22以下の頻度_1 < 3, _22以下の頻度_2 is _22以下の頻度_1 + 1, '1から99までを値域とする乱数'(_乱数), 中央値が22となる(_乱数,_22,_22以下の頻度_2,_22以上の頻度_1,R),!. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_値,_22,_22以下の頻度_1,_22以下の頻度_1,[_値|R]) :- _値 >= 22, _22以上の頻度_1 < 3, _22以上の頻度_2 is _22以上の頻度_1 + 1, '1から99までを値域とする乱数'(_乱数), '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,_22,_22以下の頻度_1,_22以上の頻度_2,R),!. '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_,_22,_22以下の頻度_1,_22以下の頻度_1,R) :- '1から99までを値域とする乱数'(_乱数), '1から99までを値域とする7つの整数を乱数を使って順に発生させて中央値が22となる'(_乱数,_22,_22以下の頻度_1,_22以上の頻度_1,R),!. '1から99までを値域とする乱数'(_乱数) :- _乱数 is random(99) + 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/267 # # [1] 授業単元:C言語(配列) # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/KOT3NBPz # # キーボードから3×3の行列の数値を入力し行列のランク(階数)を出力するプログラムを作成せよ 'キーボードから3×3の行列の数値を入力し行列のランク(階数)を出力するプログラムを作成せよ' :- 'キーボードから3×3の行列の数値を入力し'(_行列), '行列のランク(階数)を出力する'(_行列). 'キーボードから3×3の行列の数値を入力し'(_行列) :- length(_行列,3), findall(L,( member(L,_行列), length(L,3), 行を入力(L)), _行列). 行を入力([]). 行を入力([_数値|R]) :- 数を得る(数値,_数値), 行を入力(R). '行列のランク(階数)を出力する'(_行列) :- ガウス行列に変形(_行列,_ガウス行列), '要素に零以外の数が存在する行数'(_ガウス行列,_ランク), writef('行列 %t のランクは %t です\n',[_行列,_ランク]). '要素に零以外の数が存在する行数'(_行列,_ランク) :- count((member(L,_行列),零以外の要素が存在する行(L)),_ランク). 零以外の要素が存在する行(_行) :- member(_要素,_行), \+(_要素 = 0), \+(_要素 = 0.0),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/246 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/xFhlH4zn # # /* # 1から5までの数値を繰り返し入力し、それぞれの数値の頻度を以下のように表せ。 # ただし、入力範囲外の値が入力されたら入力を終了し結果を表示する。 # # # [実行例] # 値:3 # 値:4 # 値:3 # 値:3 # 値:2 # 値:2 # 値:3 # 値:0 # # //頻度を*のグラフで表し、3の倍数はxで表示する。// # 1=0: # 2=2:** # 3=4:**x* # 4=1:* # 5=0: # # */ # '1から5までの数値を繰り返し入力し、それぞれの数値の頻度を 1=0: 2=2:** 3=4:**x* 4=1:* 5=0: のように表せ。ただし、入力範囲外の値が入力されたら入力を終了し結果を表示する。' :- '1から5までの数値を入力範囲外の値が入力されるまで繰り返し入力し、結果を頻度とグラフで表示する'. '1から5までの数値を入力範囲外の値が入力されるまで繰り返し入力し、結果を頻度とグラフで表示する' :- '1から5までの数値を入力範囲外の値が入力されるまで繰り返し入力し'(_入力値ならび), 結果を頻度とグラフで表示する(_入力値ならび). '1から5までの数値を入力範囲外の値が入力されるまで繰り返し入力し'(_入力値ならび) :- 数値を入力(_数値), '1から5までの数値を入力範囲外の値が入力されるまで繰り返し入力し'(_数値,_入力値ならび). '1から5までの数値を入力範囲外の値が入力されるまで繰り返し入力し'(_数値,[]) :- 入力範囲外の値が入力された(_数値),!. '1から5までの数値を入力範囲外の値が入力されるまで繰り返し入力し'(_数値,[_数値|R]) :- '1から5までの数値'(_数値), 数値を入力(_数値_2), '1から5までの数値を入力範囲外の値が入力されるまで繰り返し入力し'(_数値_2,R). 数値を入力(_数値) :- 整数を得る('1から5までの整数(終了する時は範囲外の数値を入力)',_数値). '1から5までの数値'(_数値) :- between(1,5,_数値). 入力範囲外の値が入力された(_値) :- \+(between(1,5,_数値)). 結果を頻度とグラフで表示する(_入力値ならび) :- between(1,5,N), 結果を頻度とグラフで(N,_入力値ならび,0,_頻度,_グラフ表示記号ならび), 表示する(N,_頻度,_グラフ表示記号ならび), N = 5. 結果を頻度とグラフで(_,[],_頻度,_頻度,[]) :- !. 結果を頻度とグラフで(N,[N|R1],_頻度_1,_頻度,[_表示記号|R2]) :- _頻度_2 is _頻度_1 + 1, グラフの表示記号を選択する(_頻度_2,_表示記号), 結果を頻度とグラフで(N,R1,_頻度_2,_頻度,R2),!. 結果を頻度とグラフで(N,[_|R1],_頻度_1,_頻度,R2) :- 結果を頻度とグラフで(N,R1,_頻度_1,_頻度,R2). グラフの表示記号を選択する(_頻度,x) :- 頻度が3の倍数になったら(M_1). グラフの表示記号を選択する(_頻度,*) :- 頻度が3の倍数でなかったら(_頻度). 頻度が3の倍数になったら(_頻度) :- 0 is _頻度 mod 3. 頻度が3の倍数でなかったら(_頻度) :- \+(0 is _頻度 mod 3). 表示する(N,_頻度,_グラフ表示記号ならび) :- atomic_list_concat(_グラフ表示記号ならび,_表示グラフ文字列), writef('%t=%t: %t\n',[N,_頻度,_表示グラフ文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/226 # # [1]C言語 繰り返し文 # [2]問題 長いのでリンクでお願いします。 # http://ime.nu/codepad.org/iaWNbokN # [3]Linux ubuntu gcc C言語 # [4]今週日曜日迄 # [5]配列 ポインタなどは習ってないですよろしくお願いします。 # # 課題1. # キーボードから2 以上の整数を1 つ入力し,その数が素数(1 とその数以外で割り切れない数) のときだけ, # その数を表示するプログラムを作成せよ.ただし,以下の条件を満たすこと. # プログラム中で,ループ回数をカウントし,入力値が素数のときにループ回数も # 表示する #  次ページに記載されているサンプルプログラムよりもループ回数が少なくなるようにする # 1)サンプルプログラムでは,入力値(n) が素数の場合のループ回数は,n - 2 回になる # 2)入力値が小さい場合(n = 2, 3 など) は,ループ回数が少なくなっていなくてもよい# # #include <stdio.h> # int main(void) # { # int n, i, count = 0; # printf("n: "); # scanf("%d", &n); # for (i = 2; i * i <= n; i++) { # count++; # if (n % i == 0) { # break; # } # } # if (i * i > n) { # printf("%d: %d\n", n, count); # } # return 0; # } # # 'キーボードから2 以上の整数を1つ入力し,その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する.ただし,以下の条件を満たすこと.プログラム中で,ループ回数をカウントし,入力値が素数のときにループ回数も表示する' :- 'キーボードから2 以上の整数を1つ入力し'(_2以上の整数), 'その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する'(_2以上の整数). 'キーボードから2 以上の整数を1 つ入力し,その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する.ただし,以下の条件を満たすこと.プログラム中で,ループ回数をカウントし,入力値が素数のときにループ回数も表示する' :- 'キーボードから2 以上の整数を1つ入力し,その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する.ただし,以下の条件を満たすこと.プログラム中で,ループ回数をカウントし,入力値が素数のときにループ回数も表示する'. 'キーボードから2 以上の整数を1つ入力し'(_2以上の整数) :- 整数を得る('2以上の整数を1つ',_2以上の整数 >= 2,_2以上の整数),!. 'その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する'(0) :- !. 'その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する'(_2以上の整数) :- 'Nは素数か'(_2以上の整数), writef('%tは素数です\n',[_2以上の整数]), fail. 'Nは素数か'(N) :- findall(M,between(2,N,M),L), 'エラトステネスの篩'(L,L2), last(L2,N),!. エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/226 # # [1]C言語 繰り返し文 # [2]問題 長いのでリンクでお願いします。 # http://ime.nu/codepad.org/iaWNbokN # [3]Linux ubuntu gcc C言語 # [4]今週日曜日迄 # [5]配列 ポインタなどは習ってないですよろしくお願いします。 # # 課題1. # #include <stdio.h> # int main(void) # { # int n, i, count = 0; # printf("n: "); # scanf("%d", &n); # for (i = 2; i * i <= n; i++) { # count++; # if (n % i == 0) { # break; # } # } # if (i * i > n) { # printf("%d: %d\n", n, count); # } # return 0; # } # # # 課題2. キーボードから10 進整数を入力し,その数を2 進数に変換した値を表示するプログラムを作成 # せよ.ただし,変換後の2 進数は正しい順序で表示すること(入力が10 ならば,1010 と表示). # # 課題3.課題1,2 のプログラムを作成するにあたり,どのように考えてプログラムを実現したのかをレ # ポートにまとめよ(プログラムの説明ではなく,問題を解くための考え方を説明する). # ※プログラムが完成していなくても,自分の考えた解き方をレポートにまとめること # */ # 'キーボードから10進整数を入力し,その数を2進数に変換した値を表示する' :- キーボードから10進整数を入力し(_10進整数), その数を2進数に変換した値を表示する(_10進整数). キーボードから10進整数を入力し(_10進整数) :- 整数を得る('10進整数',integer(_10進整数),_10進整数). その数を2進数に変換した値を表示する(_10進整数) :- その数を2進数に変換した値を(_10進整数,[],_2進数に変換した値), 表示する(_2進数に変換した値). その数を2進数に変換した値を(_10進整数,_2進数に変換した値) :- _10進整数 >= 0, その数を2進数に変換した値を(_10進整数,[],L), atomic_list_concat(L,_2進数に変換した値),!. その数を2進数に変換した値を(_10進整数,_2進数に変換した値) :- 負数を2進数に変換(_10進整数,_2進数に変換した値). その数を2進数に変換した値を(N,L1,[N|L1]) :- N < 2,!. その数を2進数に変換した値を(_10進整数,L1,L) :- M_1 is _10進整数 // 2, M_2 is _10進整数 mod 2, その数を2進数に変換した値を(M_1,[M_2|L1],L). 負数を2進数に変換(_10進整数,_2進数に変換した値) :- _10進整数_2 is abs(_10進整数) + 1, その数を2進数に変換した値を(_10進整数_2,[],L_1), 'Lを32要素に拡張して否定する'(L_1,L_2), atomic_list_concat(L_2,_2進数に変換した値). 'Lを32要素に拡張して否定する'(L_1,L_2) :- length(L,32), append(L_0,L_1,L), all(L_0,0), 各要素を反転する(L,L_2),!. 各要素を反転する([],[]). 各要素を反転する([0|R1],[1|R2]) :- 各要素を反転する(R1,R2). 各要素を反転する([1|R1],[0|R2]) :- 各要素を反転する(R1,R2). 表示する(_2進数に変換した値) :- writef('%t\n',[_2進数に変換した値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/189 # # [1] 授業単元:C言語 文字列 # [2] 問題文 # http://ime.nu/s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/img/382.txt # # 文字列処理 キーボードからアルファベット小文字で入力し、イニシャルで表示する # プログラムを作成しなさい。 # 入力できる文字数は姓、名、最大20文字、配列を宣言すること。 # 文字変換関数を使用すること。 # (実行結果) 氏名をアルファベット小文字で入力して下さい # tanaka # hanako # tanaka hanako さんのイニシャルはH,Tです # # キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、 # その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントするプログラムを作成しなさい。 # ただし、入力する文字数は最大30文字とする。 # 文字列操作関数を必ず用いること # # (実行結果) 文字列を入力して下さい. # TanakaHanako1234          # 入力文字列は TanakaHanako1234 で          小文字は10文字,大文字は2文字,数字は4文字です. 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)、その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする' :- 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)'(_入力文字列), 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_入力文字列,_小文字の数,_大文字の数,_数字の数). 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)'(_入力文字列) :- write('文字列を入力してください\n'), get_line(Line), 最大30文字(Line,_入力文字列). 最大30文字(Line,_入力文字列) :- atom_length(Line,_長さ), _長さ > 30, sub_atom(Line,0,30,_,_入力文字列),!. 最大30文字(_入力文字列,_入力文字列). 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_入力文字列,_小文字の数,_大文字の数,_数字の数) :- count((sub_atom(_入力文字列,_,1,_,_文字),_文字 @>= 'a',_文字 @=< 'z'),_小文字の数), count((sub_atom(_入力文字列,_,1,_,_文字),_文字 @>= 'A',_文字 @=< 'Z'),_大文字の数), count((sub_atom(_入力文字列,_,1,_,_文字),_文字 @>= '0',_文字 @=< '9'),_数字の数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/161 # # [1] 授業単元:プログラミング言語 # [2] 問題文 # 1.空白、タブ、改行を数えるプログラムを書け。 # 2.二つ以上の空白を一つの空白に置き換えながら、入力を出力にコピーするプログラムを書け。 # '空白、タブ、改行を数える'(_文字列,_空白数,_タブ数,_改行数) :- 空白を数える(_文字列,_空白数), タブを数える(_文字列,_タブ数), 改行を数える(_文字列,_改行数). 空白を数える(_文字列,_空白数) :- count(sub_atom(_文字列,_,1,_,' '),_空白数). 空白を数える(_文字列,_タブ数) :- count(sub_atom(_文字列,_,1,_,'\t'),_タブ数). 改行を数える(_文字列,_改行数) :- count(sub_atom(_文字列,_,1,_,'\n'),_改行数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/27 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/xFhlH4zn # # /* # 1から5までの数値を繰り返し入力し、それぞれの数値の頻度を以下のように表せ。 # ただし、入力範囲外の値が入力されたら入力を終了し結果を表示する。 # # # [実行例] # 値:3 # 値:4 # 値:3 # 値:3 # 値:2 # 値:2 # 値:3 # 値:0 # # //頻度を*のグラフで表し、3の倍数はxで表示する。// # 1=0: # 2=2:** # 3=4:**x* # 4=1:* # 5=0: # # */ '1から5までの数値を繰り返し入力(入力範囲外の値が入力されたら入力を終了)し、それぞれの数値の頻度を*のグラフで表し、3の倍数はxで表示する' :- '1から5までの数値を繰り返し入力(入力範囲外の値が入力されたら入力を終了)し'(L), 'それぞれの数値の頻度を*のグラフで表し、3の倍数はxで表示する'(L). '1から5までの数値を繰り返し入力(入力範囲外の値が入力されたら入力を終了)し'(L) :- 整数を得る('1から5までの数値',_整数), '1から5までの数値を繰り返し入力(入力範囲外の値が入力されたら入力を終了)し'(_整数,L). '1から5までの数値を繰り返し入力(入力範囲外の値が入力されたら入力を終了)し'(N,L) :- \+(between(1,5,N)),!. '1から5までの数値を繰り返し入力(入力範囲外の値が入力されたら入力を終了)し'(_整数_1,[_整数_1|R]) :- 整数を得る('1から5までの数値',_整数_2), '1から5までの数値を繰り返し入力(入力範囲外の値が入力されたら入力を終了)し'(_整数_2,R). 'それぞれの数値の頻度を*のグラフで表し、3の倍数はxで表示する'(L) :- between(1,5,N), 'それぞれの数値の頻度を'(N,L,_頻度), '*のグラフで表し、3の倍数はxで表示する'(N,_頻度), N = 5. 'それぞれの数値の頻度を'(N,L,_頻度) :- count(member(N,L),_頻度). '*のグラフで表し、3の倍数はxで表示する'(N,_頻度) :- writef('%t=%t:',[N,_頻度]), '*のグラフで表し、3の倍数はxで表示する'(N,0,_頻度), write('\n'). '*のグラフで表し、3の倍数はxで表示する'(N,_頻度,_頻度) :- !. '*のグラフで表し、3の倍数はxで表示する'(N,M,_頻度) :- '*のグラフで表し'(N,M_1,M_2), '*のグラフで表し、3の倍数はxで表示する'(N,M_2,_頻度). '*のグラフで表し、3の倍数はxで表示する'(N,M_1_頻度) :- '3の倍数はxで表示する'(N,M_1,M_2) '*のグラフで表し、3の倍数はxで表示する'(N,M_2,_頻度). '*のグラフで表し'(N,M_1,M_2) :- M_2 is M_1 + 1, \+(0 is M_2 mod 3), writef(*). '3の倍数はxで表示する'(N,M_1,M_2) :- M_2 is M_1 + 1, 0 is M_2 mod 3, writef(x). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/793 # # [1] 授業単元:プログラミング # [2] 問題文: # http://ime.nu/codepad.org/3HrmfsVo # http://ime.nu/codepad.org/InxgbSAZ # http://ime.nu/codepad.org/99RFoVNY # # /* # プログラムの引数に書籍データのファイルと列数(a) を与える。書籍データのファイルは # c2md.csv である。 # # 各行が1つの書籍データを表している。書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち、 # それらをカンマ(,)で区切って表している。ただし書名にカンマ(,)が含まれる場合には、書名は二重引用符 # (”)で囲まれている。発行年、本体価格は正の整数値で記述されており、情報がない不明の場合は記述がない。 # # a で指定された列だけを表示せよ。 # ただし1行を出版社出版社名を表す文字の配列、書名を表す文字の配列、発行年を表す整数、本体価格 # を表す整数に分解する関数bunkatu を実装することで実現せよ。 # # */ # /* # プログラムの引数に書籍データのファイル(c2md.csv) を与える。各出版社が2000 年から2012 年ま # でに出版した本の冊数を求め、その冊数の多い順に表示せよ。 # ただし出版社名(name)とその出版社が2000 年から2012 年までに出版した本の冊数(pub)を表す以 # 下の構造体bkcmpy を用意する。 # struct bkcmpy { # char name[100]; # int pub; # }; # 各出版社に対して、このbkcmpy を作成し、この構造体の情報を出力することでプログラムを作成せよ。 # # プログラムでは、出版社が全部で150 社以下であることは仮定し、bkcmpy のポインターの配列 # bkcmpydb[150] を用意する。関数touroku ではbkcmpydb と読み込んだ出版社名cname を与える。 # cname が既にbkcmpydb に登録されていたら、その構造体のpub を1 増やし、登録されていなかった # ら、bkcmpy を1つ作成してbkcmpydb に登録する。 # /* # プログラムの引数に書籍データのファイル(c2md.csv) を与える。各出版社が2000 年から2012 年ま # でに出版した本の中で最高価格の本の情報を表示せよ。 # ただし出版社名(name)、書名(book)、発行年(year)、最高価格(price)を表す以下の構造体bkcmpy # を用意する。 # # struct bkcmpy { # char name[100]; # char book[420]; # int year; # int price; # }; # # 各出版社に対して、このbkcmpy を作成し、この構造体の情報を出力することでプログラムを作成せよ。 # # */ 'プログラムの引数に書籍データのファイルと列数(a) を与える。書籍データのファイルはc2md.csv である。各行が1つの書籍データを表している。書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち、それらをカンマ(,)で区切って表している。ただし書名にカンマ(,)が含まれる場合には、書名は二重引用符(”)で囲まれている。発行年、本体価格は正の整数値で記述されており、情報がない不明の場合は記述がない。a で指定された列だけを表示せよ。'(_ファイル名,_列数a) :- get_lines(_ファイル名,_行ならび), 書籍データならびに変換する(_行ならび,_書籍データならび), 空文字でないデータの列数が列数aと一致する情報だけ表示する(_列数a,_書籍データならび). 書籍データならびに変換する([],[]). 書籍データならびに変換する([_行|R1],[[_出版社名,_書名,_発行年,_本体価格]|R2]) :- '書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち'(_行,_出版社名,_書名,_発行年,_本体価格), 書籍データならびに変換する(R1,R2). '書籍データは出版社名、書名、発行年、本体価格4つの属性を持ち'(_書籍データ,_出版社名,_書名,_発行年,_本体価格) :- 二重引用符をエスケープに使ったsplit(_書籍データ,[_出版社名,_書名,_発行年,本体価格]). 二重引用符をエスケープに使ったsplit(_書籍データ,L) :- atom_chars(_書籍データ,_書籍データ文字ならび), 二重引用符をエスケープに使った文字ならびを区切る(_書籍データ文字ならび,L). 二重引用符をエスケープに使った文字ならびを区切る([],[]). 二重引用符をエスケープに使った文字ならびを区切る(L1,[A|R2]) :- 二重引用符にぶつかった(L1,A,R1_2), 二重引用符をエスケープに使った文字ならびを区切る(R1_2,R2),!. 二重引用符をエスケープに使った文字ならびを区切る(L1,[A|R2]) :- カンマ区切りを切り取る(L1,A,R1), 二重引用符をエスケープに使った文字ならびを区切る(R1,R2). 二重引用符にぶつかった(L1,A,R1_2) :- append(L0,['"'|R1],L1), \+(member('''',L0)), append(L1_1,['"'|R1_2],R1), atom_chars(A,L1_1),!. カンマ区切りを切り取る(L1,A,R1) :- append(L0,[','|R1],L1), atom_chars(A,L0),!. 空文字でないデータの列数が列数aと一致する情報だけ表示する(_列数a,_書籍データならび) :- member(L,_書籍データならび), count((member(A,L),\+(A='')),_列数a), writef('%t,%t,%t,%t\n',L), fail. 空文字でないデータの列数が列数aと一致する情報だけ表示する(_列数a,_書籍データならび). % 以下のサイトは # 出典 :: #132 # 親テーブル # Id, 資産 # 1, 100 # 2, 200 # 3, 400 # # 子テーブル # Id, 親Id, 資産 # 1, 1, 10 # 2, 1, 20 # 3, 2, 10 # 4, 2, 20 # 5, 2, 30 # 6, 3, 10 # # から # Id, 資産 # 1, 60 -- 親1の子供は二人だから、各々の子に 100/2 = 50 を加算する。 # 2, 70 # 3, 76 -- 親2の子供は三人だから、各々の子に 200/3 = 66 を加算する。 # 4, 86 # 5, 96 # 6, 410 -- 親3の子供は一人だから、400 をそのまま加算する。 # # という結果を得たい。 # 要するに、親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい。 # SQL で出来ます? # # 親テーブル(1, 100). 親テーブル(2, 200). 親テーブル(3, 400). 子テーブル(1, 1, 10). 子テーブル(2, 1, 20). 子テーブル(3, 2, 10). 子テーブル(4, 2, 20). 子テーブル(5, 2, 30). 子テーブル(6, 3, 10). 親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい(_一覧) :- findall([_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額],子供の親資産と自分を含めた兄弟人数を調べて親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額),_一覧). 子供の親資産と自分を含めた兄弟人数を調べて親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額) :- 子テーブル(_Id,_親Id,_資産), 親資産と自分を含めた兄弟人数を調べて(_Id,_親Id,_親資産,_自分を含めた兄弟人数), _親の資産を子供に分配して各々の子供の資産と合わせた額 is _資産 + _親資産 // _自分を含めた兄弟人数. 親資産と自分を含めた兄弟人数を調べて(_Id,_親Id,_親資産,_自分を含めた兄弟人数) :- 親テーブル(_親Id,_親資産), 自分を含めた兄弟人数(_親Id,_自分を含めた兄弟人数). 自分を含めた兄弟人数(_親Id,_自分を含めた兄弟人数) :- 度数(子テーブル(_,_親Id,_),_自分を含めた兄弟人数). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/592 # # [1] 授業単元:データ構造入門 # [2] 問題文(含コード&リンク):問題文が長いためこちらに記載しました http://ime.nu/ideone.com/R8gaZ # # 【問題1】 # サイコロのように1から6の目を等確率で発生させる関数を、rand()関数を用いて次の方法で作成せよ。 # 1+(int)(6.0*rand()/(1.0+RAND_MAX)); の演算で、1から6まで発生させる。 # 'サイコロのように1から6の目を等確率で発生する乱数'(_サイコロのように1から6の目を等確率で発生する数) :- _サイコロのように1から6の目を等確率で発生する数 is ceiling(6.0 * random(2147483647) / (1.0+2147483647)). サイコロ乱数発生テスト(_繰り返し回数,_1,_2,_3,_4,_5,_6) :- findall(N,( between(1,_繰り返し回数,_), 'サイコロのように1から6の目を等確率で発生する乱数'(N)), L), findall(Count,( between(1,6,M), count(member(M,L),Count)), [_1,_2,_3,_4,_5,_6]). count(P,Count) :- findall(1,P,L), length(L,Count). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/592 # # [1] 授業単元:データ構造入門 # [2] 問題文(含コード&リンク):問題文が長いためこちらに記載しました http://ime.nu/ideone.com/R8gaZ # # 【問題1】 # サイコロのように1から6の目を等確率で発生させる関数を、rand()関数を用いて次の方法で作成せよ。 # 1+(int)(6.0*rand()/(1.0+RAND_MAX)); の演算で、1から6まで発生させる。 # 'サイコロのように1から6の目を等確率で発生する乱数'(_サイコロのように1から6の目を等確率で発生する数) :- _サイコロのように1から6の目を等確率で発生する数 is ceiling(6.0 * random(2147483647) / (1.0+2147483647)). サイコロ乱数発生テスト(_繰り返し回数,_1,_2,_3,_4,_5,_6) :- サイコロのように1から6の目を等確率で発生する乱数ならび(_繰返し回数,_乱数ならび), サイコロの目ごとの度数(_乱数ならび,[_1,_2,_3,_4,_5,_6]). サイコロのように1から6の目を等確率で発生する乱数ならび(_繰返し回数,_乱数ならび) :- findall(N,( between(1,_繰り返し回数,_), 'サイコロのように1から6の目を等確率で発生する乱数'(N)),_乱数ならび). サイコロの目ごとの度数(_乱数ならび,[_1,_2,_3,_4,_5,_6]) :- findall(_度数,( between(1,6,M), 度数(member(M,_乱数ならび),_度数)),[_1,_2,_3,_4,_5,_6]). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/592 # # [1] 授業単元:データ構造入門 # [2] 問題文(含コード&リンク):問題文が長いためこちらに記載しました http://ime.nu/ideone.com/R8gaZ # # 【問題1】 # サイコロのように1から6の目を等確率で発生させる関数を、rand()関数を用いて次の方法で作成せよ。 # 1+(int)(6.0*rand()/(1.0+RAND_MAX)); の演算で、1から6まで発生させる。 # 'サイコロのように1から6の目を等確率で発生する乱数'(_サイコロのように1から6の目を等確率で発生する数) :- _サイコロのように1から6の目を等確率で発生する数 is ceiling(6.0 * random(2147483647) / (1.0+2147483647)). サイコロ乱数発生テスト(_繰り返し回数,_1,_2,_3,_4,_5,_6) :- findall(N,( between(1,_繰り返し回数,_), 'サイコロのように1から6の目を等確率で発生する乱数'(N)), L), findall(Count,( between(1,6,M), count(member(M,L),Count)), [_1,_2,_3,_4,_5,_6]). count(P,Count) :- findall(1,P,L), length(L,Count). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/309 # # [1] 授業単元:C言語プログラム演習 # [2] 問題文: # ../test/read.cgi/tech/1342966104/308の関数を用いて、1からuまでの乱数をN回発生させ、1から10までのそれぞれの数が発生した回数を数値および*の数で表し、さらに乱数の平均値も表示するプログラムを作成せよ。 # <出力例> # 1 :9回 : ********* # 2 :11回 : *********** # 3 :10回 : ********** # # 10 :5回 : ***** # 平均:5.54 # '1からuまでの乱数をN回発生させ、1から10までのそれぞれの数が発生した回数を数値および*の数で表し、さらに乱数の平均値も表示する'(_u,N) :- '1からuまでの乱数をN回発生させ'(_u,N,L), '1から10までのそれぞれの数が発生した回数を数値および*の数で表し'(L), 'さらに乱数の平均値も表示する'(L). '1からuまでの乱数をN回発生させ'(_u,N,L) :- findall(_1から_uまでの乱数,( between(1,N,_), _1から_uまでの乱数 is random(_u) + 1), L). '1から10までのそれぞれの数が発生した回数を数値および*の数で表し'(L,_度数を表す数値,_度数を表すグラフ) :- '1から10までの'(N), 'それぞれの数が発生した回数を'(L,_度数), '数値および*の数で表し'(_度数,_度数を表す数値,_度数を表すグラフ), writef('%t: %t回 %t\n',[_度数を表す数値,_度数を表すグラフ]), N = 10. '1から10までの'(N) :- between(1,10,N). 'それぞれの数が発生した回数を'(L,_度数) :- count(member(N,L),_度数). '数値および*の数で表し'(_度数,_度数を表す数値,_度数を表すグラフ) :- _度数 = _度数を表す数値, '度数を*で表す'(_度数,_度数を表すグラフ). '度数を*で表す'(_度数,_度数を表すグラフ) :- length(L,_度数), all(L,'*'), atomic_list_concat(L,_度数を表すグラフ). 'さらに乱数の平均値も表示する'(L) :- 相加平均(L,_平均値), writef('乱数の平均値: %t\n',[_平均値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/308 # # [1] 授業単元:C言語プログラム演習 # [2] 問題文: # http://ime.nu/codepad.org/gSiVgqsJ # 上記の関数ransuuは、整数型の引数uを受け取ると1からuまでの乱数(1からuまでの中からでたらめに選んだ数)を返す。 # この関数を用いて、1から10までの乱数をN回発生させ、1から10までのそれぞれの数が発生した回数を数値で表示するプログラムを作成せよ。 # 但し、#define文でNを100回と設定せよ。 # <出力例> # 1 :9回 # 2 :11回 # 3 :10回 # # 10 :5回 # '1から10までの乱数をN回発生させ、1から10までのそれぞれの数が発生した回数を数値で表示する。但し、#define文でNを100回と設定せよ。 ' :- '但し、#define文でNを100回と設定せよ。', '1から10までの乱数をN回発生させ'(L), '1から10までのそれぞれの数が発生した回数を数値で表示する'(L). '但し、#define文でNを100回と設定せよ。' :- abolish(発生回数/1), asserta(発生回数(100)). '1から10までの乱数をN回発生させ'(L) :- 発生回数(N), '1からuまでの乱数をN回発生させ'(10,N,L). '1からuまでの乱数をN回発生させ'(_u,N,L) :- findall(_1から_uまでの乱数,( between(1,N,_), _1から_uまでの乱数 is random(_u) + 1), L). '1から10までのそれぞれの数が発生した回数を数値で表示する'(L) :- between(1,10,N), count(member(N,L),_度数), writef('%t: %t回\n',[N,_度数]), N = 10. % 以下のサイトは # 出典 :: # [1] 授業単元: # [2] 問題文(含コード&リンク): # 試合で自分のチームが勝つ・負ける・引き分けるの予想を、10人に予想してもらってプログラムに入力する。 # 予想した人が男性の場合は M を入力し、女性の場合は W を入力する。 # 勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。 # それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し表示するプログラムを、 # # 構造体 # struct datatype # { # char sex;// 男女の性別、男性 M、女性 W # int expectation;// 勝ち 1、負け 2、引き分け 0 # } # # を利用して作成せよ # '試合で自分のチームが勝つ・負ける・引き分けるの予想を、10人に予想してもらってプログラムに入力する。予想した人が男性の場合は M を入力し、女性の場合は W を入力する。勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。 それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し表示する' :- '試合で自分のチームが勝つ・負ける・引き分けるの予想を、10人に予想してもらってプログラムに入力する。予想した人が男性の場合は M を入力し、女性の場合は W を入力する。勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。'(_10人の予想ならび), 'それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し表示する'(_10人の予想ならび). '試合で自分のチームが勝つ・負ける・引き分けるの予想を、10人に予想してもらってプログラムに入力する。予想した人が男性の場合は M を入力し、女性の場合は W を入力する。勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。'(_10人の予想ならび) :- findnsols([_性別,_予想],10,( '予想を入力する。予想した人が男性の場合は M を入力し、女性の場合は W を入力する。勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。'(_性別,_予想)),_10人の予想ならび),!. '予想を入力する。予想した人が男性の場合は M を入力し、女性の場合は W を入力する。勝ちを予想した場合は 整数1 を入力し、負けを予想した場合は 整数 2 を入力し、引き分けを予想した場合は 整数 0 を入力する。'(_性別,_予想) :- write('性別を入力してください(M or F) : '), 行入力(_性別), 整数を得る('勝ち=1, 負け=2, 引き分け=0 を入力してください',between(0,2,_予想),_予想). 'それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し表示する'(_10人の予想ならび) :- 'それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し'(_10人の予想ならび,_予想結果ならび), 表示する(_予想結果ならび). 'それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し'(_10人の予想ならび,_予想結果ならび) :- findall([_性別,_勝ち合計,_引き分け合計,_負け合計],( '男女別に「 勝ち1・引き分け0・負け2 」を集計し'(_性別,_勝ち合計,_引き分け合計,_負け合計)),_予想結果ならび). '男女別に「 勝ち1・引き分け0・負け2 」を集計し'(_性別,_勝ち合計,_引き分け合計,_負け合計) :- 男女別に(_性別), '「 勝ち1・引き分け0・負け2 」を集計し'(_性別,_勝ち合計,_引き分け合計,_負け合計). 男女別に(_性別):- member(_性別,['M','F']). '「 勝ち1・引き分け0・負け2 」を集計し'(_性別,_勝ち合計,_引き分け合計,_負け合計) :- 勝ち1合計(_10人の予想ならび,_性別,_勝ち合計), 引き分け0合計(_10人の予想ならび,_性別,_引き分け合計), 負け2合計(_10人の予想ならび,_性別,_負け合計). 勝ち1合計(_10人の予想ならび,_性別,_勝ち):- 度数(member([_性別,1],_10人の予想ならび),_勝ち). 引き分け0合計(_10人の予想ならび,_性別,_引き分け):- 度数(member([_性別,0],_10人の予想ならび),_引き分け). 負け2合計(_10人の予想ならび,_性別,_負け):- 度数(member([_性別,2],_10人の予想ならび),_負け). 表示する(_予想結果ならび):- forall(member([_性別,_勝ち,_引き分け,_負け]_予想結果ならび), writef('%w 勝ち=%w,引き分け=%w,負け=%w\n',[_性別,_勝ち,_引き分け,_負け])). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). % 整数を得る/3 % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #880 # [1]授業単元:C言語 # [2]問題文 # マインスイーパのような爆弾ゲームプログラムを作成する。 # 1. マス目を8× 8に設定する。 # 2. 爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)。 # 3.まだ指定していないマス目には数字の0の代わりに記号'-'を表示する。 # 4.爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を # 表示する(最小で0、最大で8)。 # 5. 爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字 # の'x'を表示し、"Bomb!"と表示して終了する。 # # [3]環境 # [3.1]windows7 # [3.2]gcc # [3.3]C/C++ # [4]7月20日 # よろしくお願いします。 # マインスイーパ :- 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面). 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面) :- 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面), '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(_平坦なならびで表現された盤面). マインスイーパ(_平坦なならびで表現された盤面) :- 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面),!. マインスイーパ(_平坦なならびで表現された盤面) :- マインスイーパを継続する(_平坦なならびで表現された盤面). 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面) :- 度数((member(A,_平坦なならびで表現された盤面),atom(A)),64), write('あなたの勝ちです。\n'). マインスイーパを継続する(_平坦なならびで表現された盤面) :- '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置), マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置) :- 爆弾を隠して盤面を表示する(_平坦なならびで表現された盤面), マス目を選択させる(_行位置,_列位置). マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面),!. マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面), 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面) :- 平坦化した位置に変換(_行位置,_列位置,_nth1), nth1(_nth1,_平坦なならびで表現された盤面,0). 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面) :- 爆弾は周囲にいくつあるか(_nth1,_平坦なならびで表現された盤面,_個数), writef('周囲に爆弾は %w 個あります\n',[_個数]),!. '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面) :- 得点は(_平坦なならびで表現された盤面,_得点), 爆弾が置かれたすべてのマス目に小文字のxを表示し(_平坦なならびで表現された盤面), writef('\n Bomb! \n\n\n あなたの得点は %t です\n',[_得点]). 得点は(_平坦なならびで表現された盤面,_得点) :- 度数((member(A,_平坦なならびで表現された盤面),\+(var(A)),A==0),_得点). 爆弾が置かれたすべてのマス目に小文字のxを表示し([]) :- !. 爆弾が置かれたすべてのマス目に小文字のxを表示し(L) :- 爆弾が置かれたすべてのマス目に小文字のxを表示して行く(L). 爆弾が置かれたすべてのマス目に小文字のxを表示して行く([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾が置かれたすべてのマス目に小文字のxを表示し(R). 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 行末まで表示する(A,R). 行末まで表示する(A,R) :- 爆弾を含むマス目表示文字(A,_表示文字), 爆弾を含むマス目表示(R,_表示文字). 爆弾を含むマス目表示(R,_表示文字) :- writef('%w',[_表示文字]), R = [], write('\n'). マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R) :- append(_,[A|R],[_1,_2,_3,_4,_5,_6,_7,_8]). 爆弾を含むマス目表示文字(V,'-') :- var(V),!. 爆弾を含むマス目表示文字('x','x') :- !. 爆弾を含むマス目表示文字(_,0). 爆弾を隠して盤面を表示する([]). 爆弾を隠して盤面を表示する([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾を隠して盤面を表示する(R). 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 爆弾を隠して行末まで表示する(A,R). 爆弾を隠して行末まで表示する(A,R) :- 爆弾を隠すマス目表示文字(A,_表示文字), 爆弾を隠すマス目表示(_表示文字,R). 爆弾を隠すマス目表示(_表示文字,R) :- writef('%w',[_表示文字]), R = [], write('\n'). 爆弾を隠すマス目表示文字(V,'-') :- var(V),!. 爆弾を隠すマス目表示文字('x','-') :- !. 爆弾を隠すマス目表示文字(_,0). 平坦化した位置に変換(_行位置,_列位置,_nth1) :- _nth1 is (_行位置-1) * 8 + _列位置. 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面) :- length(_平坦なならびで表現された盤面,64). '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(L) :- 爆弾は10個にし(Lp), 同じマス目に重ならないようにランだけに配置する(Lp,L). 爆弾は10個にし(Lp) :- length(Lp,10). 同じマス目に重ならないようにランだけに配置する([],L) :- !. 同じマス目に重ならないようにランだけに配置する([_|R1],L) :- 同じマス目に重ならないようにランダムに一個爆弾を設置する(L), 同じマス目に重ならないようにランだけに配置する(R1,L). 同じマス目に重ならないようにランダムに一個爆弾を設置する(L) :- ランダムに(L,_nth0), 同じマス目に重ならないように一個爆弾を設置する(_nth0,L),!. ランダムに(L,_nth0) :- repeat, _nth0 is random(64). 同じマス目に重ならないように一個爆弾を設置する(_nth0,L) :- 同じマス目に重ならないように(_nth0,L,V), 一個爆弾を設置する(V). 同じマス目に重ならないように(_nth0,L,V) :- nth0(_nth0,L,V), var(V). 一個爆弾を設置する(x). 爆弾は周囲にいくつあるか(N,L,_個数) :- 度数(周囲の八箇所の中で爆弾があるのは(N,L),_個数). 周囲の八箇所の中で爆弾があるのは(N,L) :- 周辺の八箇所の中で(N,_nth1), '_nth1には爆弾がある'(_nth1,L). 周辺の八箇所の中で(N,_nth1) :- member(_式,[N-9,N-8,N-7,N-1,N,N+1,N+7,N+8,N+9]), _nth1 is _式. '_nth1には爆弾がある'(_nth1,L) :- nth1(_nth1,L,V), 変数ではなく爆弾がある(V). 変数ではなく爆弾がある(V) :- 変数ではなく(V), V = x. 変数ではなく(V) :- \+(var(V)). マス目を選択させる(_行位置,_桁位置) :- 整数を得る('マス目の行位置(1-8) ',between(1,8,_行位置),_行位置), 整数を得る('マス目の桁位置(1-8) ',between(1,8,_桁位置),_桁位置),!. 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から(_催促文,_行), 行を条件付きで整数に変換する(_行,_条件,_整数),!. 催促文付き行入力から(_催促文,_行) :- writef('%w',[_催促文]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_chars(_行,Codes). 行を条件付きで整数に変換する(_行,_条件,_整数) :- 行を整数に変換する(_行,_整数), 整数入力条件検査(_条件). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査(_整数). 整数検査(_整数) :- integer(_整数),!. 整数検査(_項) :- 整数検査再入力要請(_項). 整数検査再入力要請(_項) :- writef('入力された項 %w は整数になりません。再入力をお願いします。\n',[_項]), fail. 整数入力条件検査(_条件) :- catch(_条件,E,fail),!. 整数入力条件検査(_条件) :- 整数入力条件検査再入力要請(_条件). 整数入力条件検査再入力要請(_条件) :- writef('入力された %w は成立しません。再入力をお願いします。\n',[_条件]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/855 # # [1] 授業単元:C言語 # [2] 問題文: # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ。 # <実行例> # 文字列を入力せよ:one-two-three-four # three-four # # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ :- 入力された文字列で(_文字列), '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列), 表示せよ(_2つ目のハイフン以降の文字列). 入力された文字列で(_文字列) :- get_line(_文字列). '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列) :- atom_chars(_文字列,_文字ならび), '2つ目のハイフン以降の文字列だけを'(0,_文字列ならび,0,_2つ目のハイフン以降の文字ならび), atom_chars(_2つ目のハイフン以降の文字列,_2つ目のハイフン以降の文字ならび). '2つ目のハイフン以降の文字列だけを'(_文字列ならび,2,_文字列ならび) :- !. '2つ目のハイフン以降の文字列だけを'(['-'|R1],_度数_1,_2つ目のハイフン以降の文字列) :- _度数_2 is _度数_1 + 1, '2つ目のハイフン以降の文字列だけを'(R1,_度数_2,_2つ目のハイフン以降の文字列). '2つ目のハイフン以降の文字列だけを'([_|R1],_度数_1,_2つ目のハイフン以降の文字列) :- '2つ目のハイフン以降の文字列だけを'(R1,_度数_2,_2つ目のハイフン以降の文字列). 表示せよ(_2つ目のハイフン以降の文字列) :- writef('%t\n',[_2つ目のハイフン以降の文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/855 # # [1] 授業単元:C言語 # [2] 問題文: # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ。 # <実行例> # 文字列を入力せよ:one-two-three-four # three-four # # 入力された文字列で2つ目のハイフン以降の文字列だけを表示せよ :- 入力された文字列で(_文字列), '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列), 表示せよ(_2つ目のハイフン以降の文字列),!. 入力された文字列で(_文字列) :- get_line(_文字列). '2つ目のハイフン以降の文字列だけを'(_文字列,_2つ目のハイフン以降の文字列) :- '2つ目のハイフン'(_文字列,_2つ目のハイフンの位置), 以降の文字列だけを(_文字列,_2つ目のハイフン以降の文字列). '2つ目のハイフン'(_文字列,_2つ目のハイフンの位置) :- sub_atom(_文字列,0,_2つ目のハイフンの位置,_,_副文字列), count(sub_atom(_副文字列,_,1,_,'-'),2),!. 以降の文字列だけを(_文字列,_2つ目のハイフンの位置,_2つ目のハイフン以降の文字列) :- _2つ目のハイフンの次の位置 is _2つ目のハイフンの位置 + 1, sub_atom(_文字列,_2つ目のハイフンの次の位置,_,0,_2つ目のハイフン以降の文字列),!. 表示せよ(_2つ目のハイフン以降の文字列) :- writef('%t\n',[_2つ目のハイフン以降の文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/745 # # 問題 # 1が連続しない2進数を1から小さい順に1000個求めよ。 # 例 # 10 => OK # 110 => NG # 10101 =>OK # 11011 =>NG # # '1が連続しない2進数を1から小さい順に1000個求めよ。'(_1000個の数ならび) :- findall(_10進数,( '1が連続しない2進数を1から小さい順に'([1],1,_度数,_ビットならび), ( _度数 > 1000,!,fail; 'ビットならびを10進数に変換'(_ビットならび,_10進数))), _1000個の数ならび). '1が連続しない2進数を1から小さい順に'([1|L],_度数,_度数,[1|L]). '1が連続しない2進数を1から小さい順に'([1|L],_度数_1,_度数,_ビットならび) :- _度数_2 is _度数_1 + 1, '1が連続しない2進数を1から小さい順に'([0,1|L],_度数_2,_度数,_ビットならび). '1が連続しない2進数を1から小さい順に'([0|L],_度数_1,_度数,_ビットならび) :- member(N,[1,0]), '1が連続しない2進数を1から小さい順に'([N,0|L],_度数_1,_度数,_ビットならび). 'ビットならびを10進数に変換'(L,_10進数) :- atomic_list_concat([0,b|L],_二進数表示), atom_to_term(_二進数表示,_10進数,_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/745 # # 問題 # 1が連続しない2進数を1から小さい順に1000個求めよ。 # 例 # 10 => OK # 110 => NG # 10101 =>OK # 11011 =>NG # # '1が連続しない2進数を1から小さい順に1000個求めよ。' :- '1が連続しない2進数を1から小さい順に1000個求めよ。'([1],1). '1が連続しない2進数を1から小さい順に1000個求めよ。'([1|L],_度数) :- atomic_list_concat([0,b|[1|L]],S), atom_to_term(S,X,_), writef('%t: %t=%t\n',[_度数,X,S]), _度数 = 1000,!. '1が連続しない2進数を1から小さい順に1000個求めよ。'([1|L],_度数_1) :- _度数_2 is _度数_1 + 1, '1が連続しない2進数を1から小さい順に1000個求めよ。'([0|[1|L]],_度数_2). '1が連続しない2進数を1から小さい順に1000個求めよ。'([0|L],_度数) :- member(N,[1,0]), '1が連続しない2進数を1から小さい順に1000個求めよ。'([N|[0|L]],_度数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/902 # # DBMS:SQLite3.7.12.1(System.Data.SQLite1.0.81.0) # # [テーブルデータ] # # CREATE TABLE tblA( # id INTEGER, # status001 INTEGER, # status002 INTEGER, # status003 INTEGER, # status004 INTEGER, # . # . # . # status300 INTEGER # ); # # id |status001|status002|.... . |status300| # ----+--------+--------+ +--------| # 1| 0 | 0 | | 0 | # 2| 1 | 0 | | 0 | # 3| 0 | 0 | | 1 | # 4| 0 | 1 | | 1 | # 5| 0 | 0 | | 0 | # 6| 1 | 1 | | 0 | # 7| 0 | 1 | | 0 | # 8| 1 | 1 | | 1 | # 9| 1 | 1 | | 0 | # # 想定レコード数 50,000〜2000,000 # # [欲しい結果] # ------------------------------------------- # status001 | 4 //status001=1であるレコード数 # status002 | 5 //status002=1であるレコード数 # . # . # . # status300 | 3 //status300=1であるレコード数 # # 正規化に問題があるように思えますが # これらを一度のSQLで取得出来ないでしょうか。 # この結果を最も速く取得する方法を模索しています(__) # # 各フィールドの値が1である組数(_フィールド名,_組数) :- between(1,300,N), 引数ならびを生成し指定フィールドを1とする(L1), member([_フィールド名,L],L1), 指定フィールドが1の組数(L,_組数). 引数ならびを生成し指定フィールドを1とする(N,_フィールド名,L) :- フィールド名の復元(N,_フィールド名), length(L,300), nth1(N,L,1). 指定フィールドが1の組数(L,_組数) :- P =.. [tblA,_id|L], count(P,_組数), _組数 > 0. フィールド名の復元(_フィールド名_0,N,_フィールド名) :- '3要素のフィールド名識別名をならびで確保'(L), number_chars(N,Chars), append(L1,Chars,L), 変数として残った要素は0に単一化(L1), ならび要素を結合したものがフィールド名([_フィールド名_0|L],_フィールド名). '3要素のフィールド名識別名をならびで確保'(L) :- length(L,3). append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). 変数として残った要素は0に単一化([]). 変数として残った要素は0に単一化(['0'|R]) :- 変数として残った要素は0に単一化(R). ならび要素を結合したものがフィールド名(L,_フィールド名) :- atomic_list_concat(L,_フィールド名). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/900 # # テーブル名:PRODUCT # # CODE, PRODUCT_NAME, M_Type # 001,パソコン,01 # 002,パソコン NEC,01 # 003,パソコン FUJITSU,01 # 004,パソコン,01 # 005,パソコン,02 # 006,プリンター,03 # ・・・ # # とあるとき # # # PRODUCT_NAMEの重複するデータを抽出するにはどうしたらいいでしょうか? # # 001,パソコン,01 # 004,パソコン,01 # 005,パソコン,02 # # が出て欲しい # # # PRODUCT_NAMEかつM_Typeも一緒のデータを抽出するにはどうしたらいいでしょうか? # # 001,パソコン,01 # 004,パソコン,01 # # が出て欲しい # # お願いします。 # 'PRODUCT_NAMEの重複するデータを抽出する'(_CODE,_PRODUCT_NAME,_M_Type) :- setof([_PRODUCT_NAME,_M_Type],[_CODE,_PRODUCT_NAME,_M_Type] ^ ( 'PRODUCT'(_CODE,_PRODUCT_NAME,_M_Type)),L1), findall([_PRODUCT_NAME,_M_Type],( member(_PRODUCT_NAME,L1), count('PRODUCT'(_CODE,_PRODUCT_NAME,_M_Type),COUNT), COUNT >= 2),L2), member([_PRODUCT_NAME,_M_Type],L2), 'PRODUCT'(_CODE,_PRODUCT_NAME,_M_Type). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/900 # # テーブル名:PRODUCT # # CODE, PRODUCT_NAME, M_Type # 001,パソコン,01 # 002,パソコン NEC,01 # 003,パソコン FUJITSU,01 # 004,パソコン,01 # 005,パソコン,02 # 006,プリンター,03 # ・・・ # # とあるとき # # # PRODUCT_NAMEの重複するデータを抽出するにはどうしたらいいでしょうか? # # 001,パソコン,01 # 004,パソコン,01 # 005,パソコン,02 # # が出て欲しい # # # PRODUCT_NAMEかつM_Typeも一緒のデータを抽出するにはどうしたらいいでしょうか? # # 001,パソコン,01 # 004,パソコン,01 # # が出て欲しい # # お願いします。 # 'PRODUCT_NAMEの重複するデータを抽出する'(_CODE,_PRODUCT_NAME,_M_Type) :- setof(_PRODUCT_NAME,[_CODE,_PRODUCT_NAME,_M_Type] ^ ( 'PRODUCT'(_CODE,_PRODUCT_NAME,_M_Type)),L1), findall(_PRODUCT_NAME,( member(_PRODUCT_NAME,L1), count('PRODUCT'(_CODE,_PRODUCT_NAME,_M_Type),COUNT), COUNT >= 2),L2), member(_PRODUCT_NAME,L2), 'PRODUCT'(_CODE,_PRODUCT_NAME,_M_Type). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/600 # # [1] 授業単元:C++ # [2] 問題文(含コード&リンク):文字列を入力し含まれる数字の数を調べるcount_num, # 含まれる大文字の数を調べるcount_up,含まれる小文字を調べるcount_lowをポインタを使って作れ # http://ime.nu/ideone.com/9YNeC # count_num(_文字列,_文字列に含まれる数字の数) :- 文字列を入力し含まれる数字の数を調べる(_文字列,_文字列に含まれる数字の数). 文字列を入力し含まれる数字の数を調べる(_文字列,_文字列に含まれる数字の数) :- count(( sub_atom(文字列,_,1,_,_文字), 数字(_文字)), _文字列に含まれる漢字の数). 数字(_文字) :- _文字 @>= '0', _文字 @=< '9'. count_up(_文字列,_文字列に含まれる大文字の数) :- 文字列を入力し含まれる大文字の数を調べる(_文字列,_文字列に含まれる大文字の数). 文字列を入力し含まれる大文字の数を調べる(_文字列,_文字列に含まれる大文字の数) :- count(( sub_atom(_文字列,_1,_,_文字), 大文字(_文字)), _文字列に含まれる大文字の数). 大文字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. count_low(_文字列,_文字列に含まれる大文字の数) :- 文字列を入力し含まれる小文字の数を調べる(_文字列,_文字列に含まれる小文字の数). 文字列を入力し含まれる小文字の数を調べる(_文字列,_文字列に含まれる小文字の数) :- count(( sub_atom(_文字列,_1,_,_文字), 小文字(_文字)), _文字列に含まれる大文字の数). 小文字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. % count/2 % % 私のように具体的な述語名を選択する場合、それなら抽象とはどう向き合うのかという % 課題を背負うことになる。たとえばここでは、 % % count_low(_文字列,_文字列に含まれる大文字の数) :- % 文字列を入力し含まれる小文字の数を調べる(_文字列,_文字列に含まれる小文字の数). % % 意味: count_lowとは、文字列を入力し含まれる小文字の数を調べる、ことだ。 % % としたが、 % % 文字列を入力し含まれる小文字の数を調べる(_文字列,_文字列に含まれる小文字の数) :- % count_low(_文字列,_文字列に含まれる小文字の数). % % 意味: 文字列を入力し含まれる小文字の数を調べるには、実は、count_lowすればよい。 % もあり得るに違いない。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/573 # # [1] 授業単元: STL # [2] 問題文(含コード&リンク): # 問 二つの値xとyを使用して差を返す関数形式マクロdiff(x,y)を使用し, # キーボードからint型の2つの数値n1とn2を入力した場合に、入力した2つの数値とその差を出力するmain関数のプログラムを作成しなさい。 # 問 四季を表す列挙体seasonを定義し、キーボードから0,1,2,3を入力した場合に、 # それぞれ"Spring", "Summer", "Fall", "Winter"と表示するプログラムを作成しなさい。ただし、enum season {Spring, Summer, Fall, Winter};を使用し、キーボードから0,1,2,3以外の数字が入力された場合には、入力し直す処理を含めなさい。 # 問 数字文字の出現回数の百分率を小数点以下1桁まで求め、 # '*'のグラフと共に表示するmain関数のプログラムを作成しなさい。 # 問 キーボードから入力した行数と空白以外の文字数を求め, # 行数と文字数を表示するmain関数のプログラムを作成しなさい。ただし、文字入力は、全角文字はなく、半角文字だけであるとする。 # 'キーボードから入力した行数と空白以外の文字数を求め,行数と文字数を表示する。ただし、文字入力は、全角文字はなく、半角文字だけであるとする。' :- 'キーボードから入力した'(Lines), '行数と空白以外の文字数を求め'(Lines,_行数,_空白以外の文字数), '行数と文字数を表示する'(_行数,_空白以外の文字数). キーボードから入力した([]) :- at_end_of_stream(user_input). キーボードから入力した([Line|R]) :- get_line(Line), キーボードから入力した(R). 行数と空白以外の文字数を求め(Lines,_行数,_空白以外の文字数) :- length(Lines,_行数), findsum(_一行の中にある空白以外の文字数,( member(_行,Lines), 一行の中にある空白以外の文字数(_行,_一行の中にある空白以外の文字数)), _空白以外の文字数). 一行の中にある空白以外の文字数(Line,_一行の中にある空白以外の文字数) :- count(( sub_atom(Line,_,1,_,_文字), \+(_文字 = ' ')), _一行の中にある空白以外の文字数). '行数と文字数を表示する'(_行数,_空白以外の文字数) :- writef('%t %t\n',[_行数,_空白以外の文字数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/573 # # [1] 授業単元: STL # [2] 問題文(含コード&リンク): # 問 二つの値xとyを使用して差を返す関数形式マクロdiff(x,y)を使用し, # キーボードからint型の2つの数値n1とn2を入力した場合に、入力した2つの数値とその差を出力するmain関数のプログラムを作成しなさい。 # 問 四季を表す列挙体seasonを定義し、キーボードから0,1,2,3を入力した場合に、 # それぞれ"Spring", "Summer", "Fall", "Winter"と表示するプログラムを作成しなさい。ただし、enum season {Spring, Summer, Fall, Winter};を使用し、キーボードから0,1,2,3以外の数字が入力された場合には、入力し直す処理を含めなさい。 # 問 数字文字の出現回数の百分率を小数点以下1桁まで求め、 # '*'のグラフと共に表示するmain関数のプログラムを作成しなさい。 # 問 キーボードから入力した行数と空白以外の文字数を求め, # 行数と文字数を表示するmain関数のプログラムを作成しなさい。ただし、文字入力は、全角文字はなく、半角文字だけであるとする。 # 数字文字の出現回数の百分率を小数点以下1桁まで求め(_文字列) :- atom_chars(_文字列,_文字ならび), length(_文字ならび,_総文字数), 数字文字の出現回数の百分率を小数点以下1桁まで求め(_文字ならび,[[],[],[],[],[],[],[],[],[],[]],_出現度数ならび), '*のグラフと共に百分率を小数点以下1桁まで求めて表示する'(_総文字数,_出現度数ならび). 数字文字の出現回数の百分率を小数点以下1桁まで求め([_文字|R],L1,L) :- 出現回数ならびを得る(L1,L). 数字文字の出現回数の百分率を小数点以下1桁まで求め([_文字|R],L1,L) :- 度数加算(_文字,L1,L2), 数字文字の出現回数の百分率を小数点以下1桁まで求め(R,L2,L),!. 数字文字の出現回数の百分率を小数点以下1桁まで求め([_文字|R],L1,L) :- 数字文字の出現回数の百分率を小数点以下1桁まで求め(R,L1,L). 出現回数ならびを得る(L1,L) :- findall(N,( member(L0,L1), length(L0,N)), L). 度数加算('0',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[[_|_0],_1,_2,_3,_4,_5,_6,_7,_8,_9]). 度数加算('1',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,[_|_1],_2,_3,_4,_5,_6,_7,_8,_9]). 度数加算('2',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,[_|_2],_3,_4,_5,_6,_7,_8,_9]). 度数加算('3',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,[_|_3],_4,_5,_6,_7,_8,_9]). 度数加算('4',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,[_|_4],_5,_6,_7,_8,_9]). 度数加算('5',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,[_|_5],_6,_7,_8,_9]). 度数加算('6',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,_5,[_|_6],_7,_8,_9]). 度数加算('7',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,_5,_6,[_|_7],_8,_9]). 度数加算('8',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,_5,_6,_7,[_|_8],_9]). 度数加算('9',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,_5,_6,_7,_8,_[_|9]]). '*のグラフと共に百分率を小数点以下1桁まで求めて表示する'(_総文字数,_出現度数ならび) :- append(L0,[_出現度数|R],_出現度数ならび), length(L0,N), '百分率を小数点以下1桁まで求めてNの星グラフを表示する'(N,_出現度数,_百分率), R = []. '百分率を小数点以下1桁まで求めてNの星グラフを表示する'(N,_総文字数,_出現度数) :- 星表示文字列(_出現度数,_星表示文字列), _百分率 is _出現度数 / _総文字数, format(S,'~4.1f',[_百分率]), writef('[%t] %t%% %t\n',[N,_百分率,_星表示文字列]). 星表示文字列(_出現度数,_星表示文字列) :- length(L,_出現度数), all(L,'*'), atomic_list_concat(L,_星文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/816 # # table1 # id | name # ----------- # 0 | りんご # 1 | みかん # # table2 # no | id # ---------- # 0 | 0 # 1 | 0 # 2 | 1 # 3 | 1 # 4 | 1 # # この二つのテーブルから以下の結果を得るSQLの書き方を教えてください # id | name | num # ------------------- # 0 | りんご | 2 # 1 | みかん | 3 # # select id, name, (select count(code) from table2 as t2, table1 as t1 where t1.id=t2.code) as num from table1; # 自分で考えた↑では2行ともnumが5になってしまいました # # SELECT id, COUNT(id) # FROM table2 # GROUP BY id # # の結果と table1 を結合 # table1(0,りんご). table1(1,みかん). table2(0,0). table2(1,0). table2(2,1). table2(3,1). table2(4,1). 'table2をidで集約したテーブルにtable1を結合する'(_id,_name,_度数) :- setof(_id,[_no,_id] ^ ( table2(_no,_id)),_idならび), member(_id,_idならび), count(table2(_,_id),_度数), table1(_id,_name). % findsetof/3 % count/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/773 # # ・DBMS名とバージョン: Access2003 # ・テーブルデータ: ID、作業開始日、作業完了日、作業区分 # ・欲しい結果 #  一定期間の作業開始日及び作業完了日を日付別にカウントしたい。 # ・説明 # 例えば、2012/06/01から2012/06/07の期間を指定した場合、以下の様に取得したい。 # # 日付     作業開始 作業完了 # 2012/06/01    10      10 # 2012/06/02     5      5 # 2012/06/03    20      15 # 2012/06/04    21      20 # 2012/06/05     7      10 # 2012/06/06    10      15 # 2012/06/07     4      10 # # '一定期間の作業開始及び作業完了を日付別に作業開始・終了度数で表示する'(_期間日下限,_期間日上限) :- 一定期間の作業開始及び作業完了を(_期間日下限,_期間日上限,_日付ならび), '日付別に作業開始・終了度数で表示する'(_日付ならび). 一定期間の作業開始及び作業完了を(_期間日下限,_期間日上限,_日付ならび) :- setof(_日付,[_ID,_作業開始日,_作業完了日,_作業区分,_期間日下限,_期間日上限,_日付] ^ ( テーブルデータ(_ID,_作業開始日,_作業完了日,_作業区分), 作業開始日か作業完了日が期間内(_期間日下限,_期間日上限,_作業開始日,_作業完了日,_日付)),_日付ならび). 作業開始日か作業完了日が期間内(_期間日下限,_期間日上限,_作業開始日,_作業完了日,_作業開始日) :- _作業開始日 @>= _期間日下限, _作業開始日 @=< _期間日上限. 作業開始日か作業完了日が期間内(_期間日下限,_期間日上限,_作業開始日,_作業完了日,_作業完了日) :- _作業完了日 @>= _期間日下限, _作業完了日 @=< _期間日上限. '日付別に作業開始・終了度数で表示する'(_日付ならび) :- 日付別に(_日付ならび,_日付,R), '作業開始・終了度数を得る'(_日付,_作業開始度数,_作業終了度数), '作業開始・終了度数で表示する'(_日付,_作業開始度数,_作業終了度数), R = []. 日付別に(_日付ならび,_日付,R) :- append(_,[_日付|R],_日付ならび). '作業開始・終了度数を得る'(_日付,_作業開始度数,_作業終了度数) :- count(テーブルデータ(_,_日付,_,_),_作業開始度数), count(テーブルデータ(_,_,_日付,_),_作業終了度数). '作業開始・終了度数で表示する'(_日付,_作業開始度数,_作業終了度数) :- writef('%t %t %t\n',[_日付,_作業開始度数,_作業終了度数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/200 # # {1] 授業単元:一次元配列(回数の表示) # [2] 問題文: # 得点(0点〜100点)を入力して、すべての得点が入力を終えたとき、 # 1回以上入力された得点について回数を表示せよ。また、入力の終わりは # 999が入力されたときとする。また、得点の表示は0点から100点に向かっ # て行うこと。 # [実行例] # 10 # 100 # 50 # 60 # 10 # 50 # 10 # 999 # # 得点 回数 # 10  3 # 50  2 # 60  1 # 100 1 # '得点(0点〜100点)を入力して、すべての得点が入力を終えたとき、1回以上入力された得点について回数を表示する。また、入力の終わりは999が入力されたときとする。また、得点の表示は0点から100点に向かって行うこと。' '得点(0点〜100点)を入力する。入力の終わりは999が入力されたときとする'(_得点ならび), '1回以上入力された得点について回数を表示せよ。得点の表示は0点から100点に向かって行うこと。'(_得点ならび). '得点(0点〜100点)を入力する。入力の終わりは999が入力されたときとする'(_得点ならび) :- findall(_得点,( 整数を得る('得点(0点〜100点)',(_得点 >= 0,_得点 =< 100),_得点), ( _得点 = 999,!,fail;true)), _得点ならび). '1回以上入力された得点について回数を表示する。得点の表示は0点から100点に向かって行うこと。'(_得点ならび) :- write('得点 回数\n'), '0点から100点に向かって'(_点数), '1回以上入力された得点について回数を'(_点数,_得点ならび), _点数 = 100. '0点から100点に向かって'(_点数) :- between(0,100,_点数). '1回以上入力された得点について回数を表示する'(_点数,_得点ならび) :- count(member(_点数,_得点ならび),_度数), _度数 >= 1, writef('%4r %4r\n',[_点数,_度数]),!. '1回以上入力された得点について回数を表示する'(_,_). % count/2 % 整数を得る/3 % 得点の入力述語がc158_200.htmlとは違う。 % 代表的な2パターンと言える。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/200 # # {1] 授業単元:一次元配列(回数の表示) # [2] 問題文: # 得点(0点〜100点)を入力して、すべての得点が入力を終えたとき、 # 1回以上入力された得点について回数を表示せよ。また、入力の終わりは # 999が入力されたときとする。また、得点の表示は0点から100点に向かっ # て行うこと。 # [実行例] # 10 # 100 # 50 # 60 # 10 # 50 # 10 # 999 # # 得点 回数 # 10  3 # 50  2 # 60  1 # 100 1 # '得点(0点〜100点)を入力して、すべての得点が入力を終えたとき、1回以上入力された得点について回数を表示する。また、入力の終わりは999が入力されたときとする。また、得点の表示は0点から100点に向かって行うこと。' '得点(0点〜100点)を入力する。入力の終わりは999が入力されたときとする'(_得点ならび), '1回以上入力された得点について回数を表示せよ。得点の表示は0点から100点に向かって行うこと。'(_得点ならび). '得点(0点〜100点)を入力する。入力の終わりは999が入力されたときとする'(_得点ならび) :- 整数を得る('得点(0点〜100点)',(_得点 >= 0,_得点 =< 100),_得点), '得点(0点〜100点)を入力する。入力の終わりは999が入力されたときとする'(_得点,_得点ならび). '得点(0点〜100点)を入力する。入力の終わりは999が入力されたときとする'(999,[]). '得点(0点〜100点)を入力する。入力の終わりは999が入力されたときとする'(_得点,[_得点|R]) :- 整数を得る('得点(0点〜100点)',(_得点_2 >= 0,_得点_2 =< 100),_得点_2), '得点(0点〜100点)を入力する。入力の終わりは999が入力されたときとする'(_得点_2,R). '1回以上入力された得点について回数を表示する。得点の表示は0点から100点に向かって行うこと。'(_得点ならび) :- write('得点 回数\n'), '0点から100点に向かって'(_点数), '1回以上入力された得点について回数を'(_点数,_得点ならび), _点数 = 100. '0点から100点に向かって'(_点数) :- between(0,100,_点数). '1回以上入力された得点について回数を表示する'(_点数,_得点ならび) :- count(member(_点数,_得点ならび),_度数), _度数 >= 1, writef('%4r %4r\n',[_点数,_度数]),!. '1回以上入力された得点について回数を表示する'(_,_). % count/2 % 整数を得る/3 % 得点の入力述語で先読みを使っている。それで述語が二つに分かれた。 % 一般に入力情報を終了条件に使用するときは、このような先読みを使う。 % c158_200_1.htmlのようにfindallを使ってバックトラックで入力を済ませる入力パターンもある。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/586 # # 問題 # 円Cの半径r、中心の座標(x,y)が与えられたとき # 円の面積の第1象限の部分、第2象限の部分、第3象限の部分、第4象限の部分を求めよ。 # 円の面積(_r,_面積) :- _面積 is _r * _r * pi. '円Cの半径r、中心の座標(x,y)が与えられたとき円の面積の第1象限の部分、第2象限の部分、第3象限の部分、第4象限の部分を求めよ'(_r,_中心のx座標,_中心のy座標,_第1象限の面積,_第2象限の面積,_第3象限の面積,_第4象限の面積) :- 円の面積(_r,_円の面積), 半径を0からrまで変化させて中心座標から半径分だけ離れた任意の座標の象限の統計をとる(100000,_r,_中心のx座標,_中心のy座標,0,0,0,0,_第1象限の度数,_第2象限の度数,_第3象限の度数,_第4象限の度数), 度数から面積を得る(_円の面積,_第1象限の度数,_第2象限の度数,_第3象限の度数,_第4象限の度数,_第1象限の面積,_第2象限の面積,_第3象限の面積,_第4象限の面積). 半径を0からrまで変化させて中心座標から半径分だけ離れた任意の座標の象限の統計をとる(0,_r,_,_,_第1象限の度数,_第2象限の度数,_第3象限の度数,_第4象限の度数,_第1象限の度数,_第2象限の度数,_第3象限の度数,_第4象限の度数) :- !. 半径を0からrまで変化させて中心座標から半径分だけ離れた任意の座標の象限の統計をとる(N,_r,_中心のx座標,_中心のy座標,_第1象限の度数_1,_第2象限の度数_1,_第3象限の度数_1,_第4象限の度数_1,_第1象限の度数,_第2象限の度数,_第3象限の度数,_第4象限の度数) :- 標本点を得る(_r,_中心のx座標,_中心のy座標,_x,_y), 象限度数に加算(_x,_y,_第1象限の度数_1,_第2象限の度数_1,_第3象限の度数_1,_第4象限の度数_1,_第1象限の度数_2,_第2象限の度数_2,_第3象限の度数_2,_第4象限の度数_2). N_1 is N - 1, 半径を0からrまで変化させて中心座標から半径分だけ離れた任意の座標の象限の統計をとる(N_1,_r,_中心のx座標,_中心のy座標,_第1象限の度数_2,_第2象限の度数_2,_第3象限の度数_2,_第4象限の度数_2,_第1象限の度数,_第2象限の度数,_第3象限の度数,_第4象限の度数). 象限度数に加算(_x,_y,_第1象限の度数,_第2象限の度数,_第3象限の度数,_第4象限の度数,_第1象限の度数_2,_第2象限の度数,_第3象限の度数,_第4象限の度数) :- _x > 0.0, _y > 0.0, _第1象限の度数_2 is _第1象限の度数 + 1,!. 象限度数に加算(_x,_y,_第1象限の度数,_第2象限の度数,_第3象限の度数,_第4象限の度数,_第1象限の度数,_第2象限の度数_2,_第3象限の度数,_第4象限の度数) :- _x < 0.0, _y > 0.0, _第2象限の度数_2 is _第2象限の度数 + 1,!. 象限度数に加算(_x,_y,_第1象限の度数,_第2象限の度数,_第3象限の度数,_第4象限の度数,_第1象限の度数,_第2象限の度数,_第3象限の度数_2,_第4象限の度数) :- _x < 0.0, _y < 0.0, _第3象限の度数_2 is _第3象限の度数 + 1,!. 象限度数に加算(_x,_y,_第1象限の度数,_第2象限の度数,_第3象限の度数,_第4象限の度数,_第1象限の度数,_第2象限の度数,_第3象限の度数,_第4象限の度数_2) :- _x > 0.0, _y < 0.0, _第4象限の度数_2 is _第4象限の度数 + 1,!. 象限度数に加算(_x,_y,_第1象限の度数,_第2象限の度数,_第3象限の度数,_第4象限の度数,_第1象限の度数,_第2象限の度数,_第3象限の度数,_第4象限の度数). 標本点を得る(_r,_中心のx座標,_中心のy座標,_x,_y) :- 半径とラジアン角度をランダムに得る(_r,_半径,_ラジアン角度), _x is _半径 * cos(_ラジアン角度) + _中心のx座標, _y is _半径 * sin(_ラジアン角度) + _中心のy座標. 半径とラジアン角度をランダムに得る(_r,_半径,_ラジアン角度) :- _半径 is _r * (random(10000) + 1) / 10000, _ラジアン角度 is 2 * pi * (random(10000) + 1) / 10000. 度数から面積を得る(_円の面積,_第1象限の度数,_第2象限の度数,_第3象限の度数,_第4象限の度数,_第1象限の面積,_第2象限の面積,_第3象限の面積,_第4象限の面積) :- _標本数 is _第1象限の度数+_第2象限の度数+_第3象限の度数+_第4象限の度数, _第1象限の面積 is _円の面積 * _第1象限の度数 / _標本数, _第2象限の面積 is _円の面積 * _第2象限の度数 / _標本数, _第3象限の面積 is _円の面積 * _第3象限の度数 / _標本数, _第4象限の面積 is _円の面積 * _第4象限の度数 / _標本数. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/109 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # テストを受験した学生の人数をまず入力し、それから各学生達のテストの点数を次々に入力して配列に格納したうえで、 # 0点以上 20点未満・20点以上 40点未満・40点以上 60点未満・60点以上 80点未満・80点以上100点以下の各ランクに属する人数を計算して表示するプログラムを作成しなさい。 # ただしテストを受験する学生の人数は10人以下とする。 # 'テストを受験した学生の人数をまず入力し、それから各学生達のテストの点数を次々に入力して配列に格納したうえで、0点以上 20点未満・20点以上 40点未満・40点以上 60点未満・60点以上 80点未満・80点以上100点以下の各ランクに属する人数を計算して表示するプログラムを作成しなさい。ただしテストを受験する学生の人数は10人以下とする。' :- 'テストを受験した学生の人数をまず入力し、ただしテストを受験する学生の人数は10人以下とする。'(_学生の人数), 'それから各学生達のテストの点数を次々に入力して配列に格納したうえで、'(_各学生たちのテストの点数の格納されたならび), '0点以上 20点未満・20点以上 40点未満・40点以上 60点未満・60点以上 80点未満・80点以上100点以下の各ランクに属する人数を計算して表示する'(_各学生たちのテストの点数の格納されたならび). 'テストを受験した学生の人数をまず入力し、ただしテストを受験する学生の人数は10人以下とする。'(_学生の人数) :- write('テストを受験した学生の人数(10人以下)を入力してください : '), get_line(Line), '診断: テストを受験した学生の人数'(Line,_学生の人数),!. 'テストを受験した学生の人数をまず入力し、ただしテストを受験する学生の人数は10人以下とする。'(_学生の人数) :- 'テストを受験した学生の人数をまず入力し、ただしテストを受験する学生の人数は10人以下とする。'(_学生の人数). '診断: テストを受験した学生の人数'(Line,_学生の人数) :- atom_to_term(Line,_学生の人数,_), integer(_学生の人数), _学生の人数 >= 0, _学生の人数 =< 10. 'それから各学生達のテストの点数を次々に入力して配列に格納したうえで、'(_学生の人数,_各学生たちのテストの点数の格納されたならび) :- length(_各学生たちのテストの点数の格納されたならび,_学生の人数), findall(_点数,( 各学生達のテストの点数を次々に入力して(_各学生たちのテストの点数の格納されたならび,_点数)), _各学生たちのテストの点数の格納されたならび). 各学生達のテストの点数を次々に入力して(_各学生たちのテストの点数の格納されたならび,_点数) :- append(Ln,[_|_],_各学生たちのテストの点数の格納されたならび), length([_|Ln],_何番目), writef('%t番目の点数 : ',[_何番目]), get_integer(_点数). '0点以上 20点未満・20点以上 40点未満・40点以上 60点未満・60点以上 80点未満・80点以上100点以下の各ランクに属する人数を計算して表示する'(_各学生たちのテストの点数の格納されたならび) :- '80点未満のランクの表示'(A,B,_各学生たちのテストの点数の格納されたならび), '80点以上 100点以下の表示'(_各学生たちのテストの点数の格納されたならび). '80点未満のランクの表示'(_各学生たちのテストの点数の格納されたならび) :- append(_,[[A,B]|R],[[A,B],[[0,20],[20,40],[40,60],[60,80]]), ランク範囲の人数(A,B,_各学生たちのテストの点数の格納されたならび,_人数)), writef('%t点以上 %t点未満 %t 人\n',[A,B,_人数]), R = []. ランク範囲の人数(A,B,_各学生たちのテストの点数の格納されたならび,_人数) :- count(( member(_点数,_各学生たちのテストの点数の格納されたならび), _点数 >= A, _点数 < B), _人数). '80点以上 100点以下の表示'(_各学生たちのテストの点数の格納されたならび) :- count(( member(_点数,_各学生たちのテストの点数の格納されたならび), _点数 >= 80, _点数 =< 100), _人数), writef('80点以上 100点以下 %t 人\n',[_人数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/93 # # [1] 授業単元: C言語 # [2] 問題文:正の整数m,n(m>n)があるとき、 #       順列mPnを計算するプログラムの作成。 # '正の整数m,n(m>n)があるとき、順列mPnを計算する'(_mPn) :- findall(N,between(1,_m,N),L), count(順列(L,_n,_),_mPn). count(P,N) :- findall(1,P,L), length(L,N). 順列(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). % 以下のサイトは 分数の計算と表示 :- 分数を2項読み込む([一,分子,一,分母,二,分子,二,分母],[_分子_1,_分母_1,_分子_2,_分母_2]), _答え仮分数分子 is _分子_1 * _分母_2 + _分子_2 * _分母_1, _答え仮分数分母 is _分母_1 * _分母_2, 最大公約数(_答え仮分数分子,_答え仮分数分母,_最大公約数), _答え仮分数分子_2 is _答え仮分数分子 // _最大公約数, _答え仮分数分母_2 is _答え仮分数分母 // _最大公約数, 帯分数(_答え仮分数分子_2,_答え仮分数分母_2,_答え整数部分, _答え分子,_答え分母), 分数計算表示(_分子_1,_分子_2,_答え分子,_答え整数部分,_分母_1,_分母_2,_答え分母). 分数を2項読み込む([],[]). 分数を2項読み込む([A,B|R1],[C|R2]) :- writef('第%t項の%tを整数で入力してください : ',[A,B]), get_integer(C), 分数を2項読み込む(R1,R2). 分数計算表示(_分子_1,_分子_2,_答え分子,_整数部分,_分母_1,_分母_2,_答え分母) :- _整数部分 >= 1, \+(_答えの分子=0), writef(' %2r %2r %2r \n',[_分子_1,_分子_2,_答え分子]), writef('---- + ---- =%2r---- \n',[_整数部分]), writef(' %2r %2r %2r \n',[_分母_1,_分母_2,_答え分母]). 分数計算表示(_分子_1,_分子_2,_答え分子,_整数部分,_分母_1,_分母_2,_答え分母) :- _整数部分 >= 1, 答えの分子=0, writef(' %2r %2r\n',[_分子_1,_分子_2]), writef('---- + ---- = %2r \n',[_整数部分]), writef(' %2r %2r\n',[_分母_1,_分母_2]). 分数計算表示(_分子_1,_分子_2,_答え分子,_整数部分,_分母_1,_分母_2,_答え分母) :- _整数部分 = 0, writef(' %2r %2r %2r \n',[_分子_1,_分子_2,_答え分子]]), write('---- + ---- = ---- \n'), writef(' %2r %2r %2r \n',[_分母_1,_分母_2,_答え分子]]). 帯分数(_仮分数分子,_仮分数分母,_帯分数整数部分, _帯分数分子,_帯分数分母) :- _帯分数整数部分 is _仮分数分子 // _仮分数分母, _帯分数分子 is _仮分数分子 mod _仮分数分母. _帯分数分母 = _仮分数分母. % 行列の掛算の中での分数 行列の掛算(L1,L2,X) :- 転置(L2,L4), 行列の掛算_1(L1,L4,X). 行列の掛算_1([],_,[]) :-!. 行列の掛算_1([A|R1],L,[S1|R3]) :- 行列の掛算_2(A,L,S1), 行列の掛算_1(R1,L,R3). 行列の掛算_2(_,[],[]) :-!. 行列の掛算_2(A,[B|R2],[C|R3]) :- 行列の掛算_3(A,B,C), 行列の掛算_2(A,R2,R3). 行列の掛算_3([],[],0) :-!. 行列の掛算_3([A|R1],[B|R2],S) :- 分数を含む掛算(A,B,S1), 行列の掛算_3(R1,R2,S2), 分数を含む加算(S1,S2,S),!. 分数を含む加算(A1 / A2,B1 / B2,C) :- S1 is A1 * B2 + A2 * B1, S2 is A2 * B2, 約分(S1 / S2,C),!. 分数を含む加算(A1 / A2,B,C) :- S1 is A1 + A2 * B, 約分(S1 / A2,C),!. 分数を含む加算(A,B1 / B2,C) :- S1 is B1 + B2 * A, 約分(S1 / B2,C),!. 分数を含む加算(A,B,C) :- C is A + B. 分数を含む掛算(A1 / A2,B1 / B2,C) :- S1 is A1 * B1, S2 is A2 * B2, 約分(S1 / S2,C),!. 分数を含む掛算(A1 / A2,B,C) :- S1 is A1 * B, 約分(S1 / A2,C),!. 分数を含む掛算(A,B1 / B2,C) :- S1 is B1 * A, 約分(S1 / B2,C),!. 分数を含む掛算(A,B,C) :- C is A * B. 約分(B / A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子,_分母,_分子 / _分母). 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % get_numberのなかでの分数 get_number(_数値) :- get_line(Line), get_number_診断(Line,_数値),!. get_number(_数値) :- get_number(_数値). get_number_診断(Line,_数値,_) :- atom_to_term(Line,_数値,_), 数値か(_数値),!. get_number_診断(Line,_数値,_) :- writef('入力された %t からは数値が得られません。再入力をお願いします。\n',[Line]), fail. 数値か(_分子/_分母) :- integer(_分子), integer(_分母),!. 数値か(_数値) :- number(_数値). % '1/3 + 3/5 + 7/9 + 9/11 + 11/13+..........+95/97 + 97/99 を合計する' :- 分子ならび(_分子ならび), 分母ならび(_分母ならび), 分子(_分子ならび,_分母ならび,_分子), 分母(_分母ならび,_分母), _合計 is _分子 / _分母, writef('合計は %t です\n',[_合計]). 分子([N],_分母ならび,_分子) :- '重複のないならびからNを取り除く'(N,_分母ならび,L), 全てを掛ける([N|L],_分子),!. 分子([N|R1],_分母ならび,_分子) :- '重複のないならびからNを取り除く'(N,_分母ならび,L), 全てを掛ける(L,_分子_1), 分子式(R1,_分母ならび,_分子_2), _分子 is _分子_1 + _分子_2. 分子ならび(_分子ならび) :- findall(N,( for(1,N,97), 1 is N mod 2), _分子ならび). 分母([X],X) :- !. 分母([A|R],_分母) :- 分母(R,_分母_1) _分母 is A * _分母_1. 分母ならび(_分母ならび) :- findall(N,( for(3,N,99), 1 is N mod 2), _分母ならび). '重複のないならびからNを取り除く'(N,L,R) :- append(L0,[N|R1],L), append(L0,R1,R),!. % 分数の加算 分数の加算(_分子1/_分母1,_分子2/_分母2,_分子/_分母) :- A is _分母1 * _分母2, B is _分子1 * _分母2 + _分子2 * _分母1, 約分(B/A,_分子/_分母). 約分(B/A,_分子/_分母) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C. % 荷重移動平均 加重移動平均(_データならび,_サンプル数,_加重移動平均) :- reverse(_データならび,_反転したデータならび), length(L0,_サンプル数), append(L0,L1,_反転したデータならび), _分母 is _サンプル数 * (_サンプル数 + 1) / 2, 加重移動平均分子の計算(_サンプル数,L0,_分子), _加重移動平均 is _分子 / _分母,!. 加重移動平均分子の計算(_,[],0) :- !. 加重移動平均分子の計算(N,[A|R],S) :- N1 is N - 1, V is A * N, 加重移動平均分子の計算(N1,R,S1), S is S1 + V. % '2,3,4,5,6の数が書かれたカードが1枚ずつ、合計5枚ある。これらのカードを無作為に横一列に並べたとき、どのi=1,2,3,4,5に対しても左からi番目のカードに書かれた数がi以上となる確率を求める'(_確率) :- '左からi番目のカードに書かれた数がi以上の度数'(1,2,0,0,_分子,_分母), \+(_分母 = 0), _確率 is _分子 / _分母,!. '左からi番目のカードに書かれた数がi以上の度数'(5,_カード,X,Y,X,Y) :- _カード > 6,!. '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :- _カード > 6, _i2 is _i + 1, '左からi番目のカードに書かれた数がi以上の度数'(_i2,2,_分子2,_分母2,_分子,_分母),!. '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :- _カード >= _i, _分子2 is _分子1 + 1, _分母2 is _分母1 + 1, '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子2,_分母2,_分子,_分母),!. '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :- _カード >= _i, _分母2 is _分母1 + 1, '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母2,_分子,_分母),!. '2,3,4,5,6の数が書かれたカードが1枚ずつ、合計5枚ある。これらのカードを無作為に横一列に並べたとき、どのi=1,2,3,4,5に対しても左からi番目のカードに書かれた数がi以上となる確率を求める'(_確率) :- '左からi番目のカードに書かれた数がi以上の度数'(1,2,0,0,_分子,_分母), \+(_分母 = 0), _確率 is _分子 / _分母,!. '左からi番目のカードに書かれた数がi以上の度数'(5,_カード,X,Y,X,Y) :- _カード > 6,!. '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :- _カード > 6, _i2 is _i + 1, '左からi番目のカードに書かれた数がi以上の度数'(_i2,2,_分子2,_分母2,_分子,_分母),!. '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :- _カード >= _i, _分子2 is _分子1 + 1, _分母2 is _分母1 + 1, '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子2,_分母2,_分子,_分母),!. '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :- _カード >= _i, _分母2 is _分母1 + 1, '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母2,_分子,_分母),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/729 # # DBはSQLiteを想定してますが、MySQLでもpostgreSQLでも全然かまいません # # # 採取リスト # |番号|名称|コード|登録日|登録者|公開| # # というテーブルがあります。 # イメージとして、とある物体がありまして、登録者が各自で次々と登録していきます。 # 各物体には登録者の間で共有されていてぶれのないコード(A-0001とか)があるものの、 # 名称に関しては、ある程度の裁量があるため、登録者によって表記にぶれが起きます。 # # |番号|名称 |コード | 登録日  |登録者|公開| # |01  |クラゲ |A-001|2012/6/1 | 田中 | 1  | # |02  |くらげ |A-001 |2012/6/2 | 鈴木 | 0  | # |03  |海月 |A-001 |2012/6/3 | 佐藤 | 1  | # |04  |クラゲ |A-001|2012/6/4 | 高橋 | 0  | # |05  |ひとで |A-002|2012/6/5 | 小林 | 0  | # # 番号はオートナンバーで主キー。 # 登録日はそのままINSERTされた日。 # 告知フラグは0か1で、外部に公開されていたら1です。 # # んで、ここから公開されてない行を抜き出すビューを作りたいんです。 # CREATE VIEW 未公開リスト (番号, 名称, コード) # AS SELECT 番号, 名称, コード FROM 採取リスト WHERE 公開 = 0 # みたいなSQLを走らせると、 # # |番号|名称  |コード| # |02  |くらげ |A-001| # |04  |クラゲ |A-001| # |05  |ひとで |A-002| # # という風になってしまいますが「くらげ」と「クラゲ」で実質的に重複してしまいます。 # これを例えば「コードを基準にして重複がないように選んだ」上で、 # 名称には、特定の登録者の名称を用いてまとめることはできないのでしょうか? # 単に、DISTINCTを使うだけでは無理なようですが・・・。 # # 未公開リスト(_番号,_名称,_コード) :- '「コードを基準にして重複がないように選んだ」上で、名称には、特定の登録者の名称を用いてまとめる'(_番号,_名称,_コード). '「コードを基準にして重複がないように選んだ」上で、名称には、特定の登録者の名称を用いてまとめる'(_番号,_名称,_コード) :- 名称を登録者で置換したコードならび(_名称を登録者で置換したコードならび), 採取リスト(_番号,_名称_1,_コード,_登録日,_登録者,0), 名称を選択(_コード,_名称_1,_名称を登録者で置換したコードならび,_名称). 名称を登録者で置換したコードならび(_重複するコードならび) :- setof(_コード,[_番号,_名称,_コード,_登録日,_登録者,_公開] ^ ( 採取リスト(_番号,_名称,_コード,_登録日,_登録者,_公開)),L1), setof([_コード,_名称],[_番号,_名称,_コード,_登録日,_登録者,_公開] ^ ( 採取リスト(_番号,_名称,_コード,_登録日,_登録者,_公開)),L2), 名称を登録者で置換したコードならび(L1,L2,_重複するコードならび),!. 名称を登録者で置換したコードならび(L1,L2,名称を登録者で置換したコードならび) :- findall([_コード,_],( member(_コード,L1), count(member([_コード,_],L2),_度数)), _度数 > 1),_重複するコードならび), 名称を早い者勝ちに登録者名に決定する(_重複するコードならび,名称を登録者で置換したコードならび),!. 名称を早い者勝ちに登録者名に決定する([]). 名称を早い者勝ちに登録者名に決定する([[_コード,_登録者]|R]) :- 採取リスト(_番号,_名称,_コード,_登録日,_登録者,_公開), 名称を早い者勝ちに登録者名に決定する(R). 名称を選択(_コード,_,_名称を登録者で置換したコードならび,_名称) :- member([_コード,_名称],_名称を登録者で置換したコードならび),!. 名称を選択(_コード,_名称,_,_名称) :- \+(member([_コード,_],_名称を登録者で置換したコードならび)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/14 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/hz40AN0p # #include # int main(void) # { # int i, j; # for(i=1; i<=4; i++) # { # for(j=1; j<=i; j++) # { # printf("*"); # } # printf("\n"); # } # return 0; # } # 上記のプログラムを参考にして下記の模様を出力するプログラムを、for文を利用して作成せよ。 # * # ** # *** # **** # * # ** # *** # **** # * # ** # *** # **** # '上記のプログラムを参考にして下記の模様を出力するプログラムを、for文を利用して作成せよ。' :- for(1,_count,3), for(1,_i,4), for(1,_j,_i), write(*), _j = _i, write('\n'), _i = 4, _count = 3. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/703 # # # レポート課題 # # 標準入力で与えた単語が,指定ファイル中に出現した回数を出力するプログラムを作成せよ. # 単語データは以下の構造体を使用し,ハッシュを使用すること # ハッシュ関数は各自で定義してよい # 単語は,スペースまたは改行で区切られる文字列とする # ハッシュのサイズはコマンド引数から指定し,作成したハッシュテーブルの偏り具合を表示すること # # struct word { # char *str; # int count; # struct word *next; # }; # 実行例 # # $ ./wordcount 13 api.txt # [0]:147 [1]:133 [2]:170 [3]:137[4]:133[5]:132 [6]:160 [7]:167 [8]:136 [9]:154 [10]:142 [11]:149 [12]:125 # Word => API # API: 10 # Word => virtual # virtual: 33 # Word => 0 # $ # # # お願いします。 # # '標準入力で与えた単語が,指定ファイル中に出現した回数を出力する'(_指定ファイル) :- 標準入力で与えた単語が(_標準入力で与えた単語), 指定ファイル中に出現した回数を(_指定ファイル,_標準入力で与えた単語,_出現した回数), 出力する(_指定ファイル,_標準入力で与えた単語,_出現した回数). 標準入力で与えた単語が(_標準入力で与えた単語) :- get_line(_標準入力で与えた単語). 指定ファイル中に出現した回数を(_指定ファイル,_標準入力で与えた単語,_指定ファイル中に出現した回数) :- get_lines(_指定ファイル,Lines), count(( member(_行,Lines), sub_atom(_行,_,_,_,_標準入力で与えた単語)), _指定ファイル中に出現した回数). 出力する(_指定ファイル,_標準入力で与えた単語,_指定ファイル中に出現した回数) :- writef('単語 %t が ファイル "%t" 中に出現した回数は %t です。\n',[_標準入力で与えた単語,_指定ファイル,_指定ファイル中に出現した回数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- get_line(_文字列), count((sub_atom(_文字列,_,1,_,_文字),英字(_文字)),_英字の数), count((sub_atom(_文字列,_,1,_,_文字),数字(_文字)),_数字の数), count((sub_atom(_文字列,_,1,_,_文字),\+(英字(_文字)),\+(数字(_文字))),_その他の文字の数), writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). % count/2 % 説明的でない述語表現。行き止まりの述語がならぶ。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- get_line(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- count((sub_atom(_文字列,_,1,_,_文字),英字(_文字)),_英字の数), count((sub_atom(_文字列,_,1,_,_文字),数字(_文字)),_数字の数), count((sub_atom(_文字列,_,1,_,_文字),\+(英字(_文字)),\+(数字(_文字))),_その他の文字の数). % count/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力する。'(_文字列). '文字列を入力し'(_文字列) :- get_line(_文字列). 'その文字列に含まれる英字、数字、その他の文字の数を出力する'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), 出力する(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- count((sub_atom(_文字列,_,1,_,_文字),英字(_文字)),_英字の数), count((sub_atom(_文字列,_,1,_,_文字),数字(_文字)),_数字の数), count((sub_atom(_文字列,_,1,_,_文字),\+(英字(_文字)),\+(数字(_文字))),_その他の文字の数). 英字(_英字) :- _英字 @>= 'a', _英字 @=< 'z',!. 英字(_英字) :- _英字 @>= 'A', _英字 @=< 'Z'. 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. 出力する(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). % count/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/602 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力する。'(_文字列). '文字列を入力し'(_文字列) :- get_line(_文字列). 'その文字列に含まれる英字、数字、その他の文字の数を出力する'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), 出力する(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- findall(_文字種,( sub_atom(_文字列,_,1,_,_文字), 文字種判定(_文字,_文字種)), L), count(member(英,L),_英字の数), count(member(数,L),_数字の数), count(member(他,L),_その他の文字の数). 文字種判定(_英字,英) :- _英字 @>= 'a', _英字 @=< 'z',!. 文字種判定(_英字,英) :- _英字 @>= 'A', _英字 @=< 'Z'. 文字種判定(_数字,数) :- _数字 @>= '0', _数字 @=< '9'. 文字種判定(_その他の文字,他) :- \+(英字(_その他の文字)), \+(数字(_その他の文字)). 出力する(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数 %t, 数字の数 %t, その他の文字の数 %t\n',[_英字の数,_数字の数,_その他の文字の数]). % count/2 % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/573 # # ../test/read.cgi/tech/1335517816/556 ありがとうございます。 # {1] 授業単元:プログラミング演習 # [2] 問題文: # 要素数50の文字型配列を用意。 # そして幾つかの単語を「,」で区切って入力すると、 # 入力された単語数が表示されるプログラムを作成しなさい。 # ヒントは下記のプログラム # http://ime.nu/codepad.org/OvHXNm6s # '要素数50のならびを用意。そして幾つかの単語を「,」で区切って入力すると、入力された単語数が表示される' :- '要素数50のならびを用意'(L), 'そして幾つかの単語を「,」で区切って入力すると'(L), '入力された単語数が表示される'(L). '要素数50のならびを用意'(L) :- length(L,50). 'そして幾つかの単語を「,」で区切って入力すると'(L) :- findall(A,( append(_,[_|R],L), get_char(C), ( C = '\n',!,member(A,[_|R]); A = C)), L). '入力された単語数が表示される'(L) :- '入力された単語数が'(L,_単語数), 表示される(_単語数). '入力された単語数が'(L,_単語数), count(( append(L1,L2,L), 度数加算(L2)), _単語数). 度数加算([A]) :- \+(var(A)),!. 度数加算([A,V|_]) :- \+(var(A)), var(V),!. 度数加算([','|_]) :- !. 表示される(_単語数) :- writef('単語数は %t です。\n',[_単語数]). % 以下のサイトは # 出典 :: SQL質疑応答スレ 12問目 #598 # ../test/read.cgi/db/1316769778/597 # すいませんお世話になります。 # # $recordSetは繰り返し処理で処理しをしようと思っています。 # 今後です(笑 # # 2件しかデータは入れていないですが、 # # idオートインクル # # id/day/game # # 1 / 2012/03/26 / 勝ち # 2 / 2012/04/26 / 負け # # # です。 # # ちなみに # SELECT COUNT(*) FROM fx WHERE day LIKE "%2012/03/%" AND game LIKE "%勝ち%" # で実行すると # COUNT 1 と出ます。 # # SELECT COUNT(*) FROM fx WHERE day LIKE "%2012/04/%" AND game LIKE "%勝ち%" # で実行すると # COUNT 0 と出ます。 # # これを踏まえて %ここ% この中身に変数を入れたらいいんだという # 安易な考えなのですが、 # # <?php print "{$game_s}"; ?> # これを実行したら Arrayと出ました。 # # どうでしょうか? # # fx(1,'2012/03/26',勝ち). fx(2,'2012/04/26',負け). 'SELECT COUNT(*) FROM fx WHERE $条件1 AND $条件2'(_id,_day,_game,_条件1,_条件2,_度数) :- count((fx(_id,_day,_game),_条件1,_条件2),_度数). count(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). ?- 'SELECT COUNT(*) FROM fx WHERE $条件1 AND $条件2'(_id,_day,_game,_game=勝ち,sub_atom(_day,0,4,_,'2015'),_度数). _度数 = 0. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/689 # # すみません。 # 高専機械科卒なんですがお願いいたします。 # # 以下のようなテーブルにて、あかさたなでGROUP BYしてそれぞれの件数を出力できないかどうか悩んでおります。 # # CREATE TABLE `name_list` ( # kanji varchar(64), # yomi varchar(64) # ) # # INSERT INTO name_list (kanji,yomi) VALUES # ('安部','あべ'), # ('井口','いぐち'), # ('臼井','うすい'), # ('江本','えもと'), # ('小川','おがわ'), # ('柿本','かきもと'), # ('木島','きじま'), # ('九条','くじょう'), # ('毛森','けもり'), # ('小島','こじま'), # ('佐藤','さとう'), # ('しみず','')・・・・・・ # # 勿論、各頭文字で一件ずつじゃないのですが # これを # # あ行 5件 # か行 5件 # さ行 8件 # # のように集計をかけたいと思っておりますが # よい方法が思いつかず… # # 出力結果は、例でして出力した左側のフィールドはなんでもOKです。 # 右側のあかさたな行のそれぞれのレコード数がチェックできればOKです。 # # なにとぞよろしくお願いいたします。 # 名簿(安部,あべ). 名簿(井口,いぐち). 名簿(臼井,うすい). 名簿(江本,えもと). 名簿(小川,おがわ). 名簿(柿本,かきもと). 名簿(木島,きじま). 名簿(九条,くじょう). 名簿(毛森,けもり). 名簿(小島,こじま). 名簿(佐藤,さとう). 名簿(しみず,''). '各頭文字で一件ずつじゃないのですが、これを あ行 5件 か行 5件 さ行 8件 のように集計をかけたい'(_行,_件数) :- append(_,[_行,_次の行|_],[あ,か,さ,た,な,は,ま,や,ら,わ,ん]), count((名簿(_,_ひらがな読み),_ひらがな読み @>= _行,_ひらがな読み @< _次の行),_件数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/334 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/4r1e9DdC # 上記のransuu関数を用いて、以下のような数当てゲームプログラムを作成せよ。 # このプログラムはmain関数とransuu関数からなるプログラム。 # 1) 1から100までの整数乱数を1つ発生させる。 # 2) 利用者に1から100までのある整数を入力してもらう。 # 3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。 # 4) 数を当てることができなかった場合には、もう一度数を入力してもらう。 # 5) 6回以内に当たった場合には"あなたの勝ち"と表示して終了。6回続けて外れた場合には"あなたの負け"と表示して終了。 # 数当てゲームプログラム :- '1) 1から100までの整数乱数を1つ発生させる。'(_1から100までの整数乱数), 数当てゲームプログラム([],_1から100までの整数乱数,_). 数当てゲームプログラム(_試行回数,_1から100までの整数乱数,_診断) :- \+(var(_診断)), '5) 6回以内に当たった場合には"あなたの勝ち"と表示して終了。6回続けて外れた場合には"あなたの負け"と表示して終了。'(_試行回数,_診断),!. 数当てゲームプログラム(_試行回数,_1から100までの整数乱数,_) :- '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数), '3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。'(_1から100までの整数乱数,_利用者が入力する1から100までの整数), '4) 数を当てることができなかった場合には、もう一度数を入力してもらう。'(_診断,_利用者が入力する1から100までのある整数), 数当てゲームプログラム([_|_試行回数],_1から100までの整数乱数,_診断), '1) 1から100までの整数乱数を1つ発生させる。'(_1から100までの整数乱数) :- _1から100までの整数乱数 is random(100) + 1. '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数) :- write('1から100までの整数を入力してください : '), get_line(Line), '1から100までの整数入力診断'(Line,_利用者が入力する1から100までのある整数),!. '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数) :- '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数). '1から100までの整数入力診断'(Line,_利用者が入力する1から100までのある整数) :- atom_to_term(Line,_利用者が入力する1から100までのある整数,_), integer(_利用者が入力する1から100までのある整数), _利用者が入力する1から100までのある整数 >= 1, _利用者が入力する1から100までのある整数 =< 100,!. '1から100までの整数入力診断'(Line,_利用者が入力する1から100までのある整数) :- writef('入力された %t からは1から100までの整数が得られません。\n',[Line]), fail. '3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。'(_数,_数) :- write('当り\n'). '3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。'(_発生した乱数,_入力した数) :- _発生した乱数 > _入力した数, write('もっと大きい\n'). '3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。'(_発生した乱数,_入力した数) :- _発生した乱数 < _入力した数, write('もっと小さい\n'). '4) 数を当てることができなかった場合には、もう一度数を入力してもらう。'(当り,_) :- !. '4) 数を当てることができなかった場合には、もう一度数を入力してもらう。'(_診断,_利用者が入力する1から100までのある整数) :- \+(_診断 = 当り), fail. 'もう一度数を入力してもらう。'(_利用者が入力する1から100までのある整数) :- '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数). '5) 6回以内に当たった場合には"あなたの勝ち"と表示して終了。6回続けて外れた場合には"あなたの負け"と表示して終了。'(_,当り) :- write('あなたの勝ち\n'),!. '5) 6回以内に当たった場合には"あなたの勝ち"と表示して終了。6回続けて外れた場合には"あなたの負け"と表示して終了。'([_,_,_,_,_,_],_) :- write('あなたの負け\n'),!. % 以下のサイトは # http://oshiete.goo.ne.jp/qa/7474619.html # A,B,Cを使って直角三角形が成り立ち真となる関係right triangleを定義するプログラムを教えてください。今のところ # triangle(A,B,C). # vertical(seg(point(X,Y),point(X,Y1)). # horizontal(seg(point(X,Y),point(X1,Y)). # を使うところまではわかっているのですが先に進みません。 'A,B,Cを使って直角三角形が成り立ち真となる関係'(座標(A),座標(B),座標(C)) :- '三点の座標から辺の長さを得る'(A,B,C,_辺1,_辺2,_辺3), 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(_辺1),辺の長さ(_辺2),辺の長さ(_辺3)). 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(A),辺の長さ(B),辺の長さ(C)) :- A > B,A > C, A * A =:= B * B + C * C,!. 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(A),辺の長さ(B),辺の長さ(C)) :- B > A,B > C, 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(B),辺の長さ(A),辺の長さ(C)). 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(A),辺の長さ(B),辺の長さ(C)) :- C > A,C > B, 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(C),辺の長さ(A),辺の長さ(B)). 'A,B,Cを使って直角三角形が成り立ち真となる関係'(ラジアン角度(A),辺の長さ(B),辺の長さ(C)) :- A is pi / 2,!. 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(A),ラジアン角度(B),辺の長さ(C)) :- 'A,B,Cを使って直角三角形が成り立ち真となる関係'(角度(B),辺の長さ(A),辺の長さ(C)). 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(A),ラジアン角度(B),辺の角度(C)) :- 'A,B,Cを使って直角三角形が成り立ち真となる関係'(角度(C),辺の長さ(A),辺の長さ(B)). 'A,B,Cを使って直角三角形が成り立ち真となる関係'(度数法角度(A),辺の長さ(B),辺の長さ(C)) :- 180.0 is A * 1.0,!. 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(A),度数法角度(B),辺の長さ(C)) :- 'A,B,Cを使って直角三角形が成り立ち真となる関係'(度数法角度(B),辺の長さ(A),辺の長さ(C)). 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(A),辺の長さ(B),度数法角度(C)) :- 'A,B,Cを使って直角三角形が成り立ち真となる関係'(度数法角度(C),辺の長さ(A),辺の長さ(B)). '三点の座標から辺の長さを得る'((X1,Y1),(X2,Y2),(X3,Y3),_辺1,_辺2,_辺3) :- _辺1 is sqrt((X1-X2) * (X1-X2) + (Y1-Y2) * (Y1-Y2)), _辺2 is sqrt((X1-X3) * (X1-X3) + (Y1-Y3) * (Y1-Y3)), _辺1 is sqrt((X2-X3) * (X2-X3) + (Y2-Y3) * (Y2-Y3)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/235 # # [1] 授業単元:プログラミング # [2] 問題文: # # ransuu関数は整数型の引数uを受け取ると1からuまでの乱数を返す。 # この関数を用いて、1から6までの乱数を100回発生させる。 # 1から6までのそれぞれの数が発生した回数を出力しなさい。 # http://ime.nu/codepad.org/2MXb2oGy # ransuu(_u,_1からuまでの乱数) :- 整数型の引数uを受け取ると1からuまでの乱数を返す(_u,_1からuまでの乱数). 整数型の引数uを受け取ると1からuまでの乱数を返す(_u,_1からuまでの乱数) :- _1からuまでの乱数 is random(_u) + 1. '1から6までの乱数を100回発生させる。1から6までのそれぞれの数が発生した回数を出力しなさい。' :- '1から6までの乱数を100回発生させる。1から6までのそれぞれの数が発生した回数を出力しなさい。'(1,0,0,0,0,0,0,_1,_2,_3,_4,_5,_6), writef('乱数出現度数\n1 = %t\n2 = %t\n3 = %t\n4 = %t\n5 = %t\n6 = %t\n',[_1,_2,_3,_4,_5,_6]). '1から6までの乱数を100回発生させる。1から6までのそれぞれの数が発生した回数を出力しなさい。'(N,_1,_2,_3,_4,_5,_6,_1,_2,_3,_4,_5,_6) :- N > 100,!. '1から6までの乱数を100回発生させる。1から6までのそれぞれの数が発生した回数を出力しなさい。'(N,_1_1,_2_1,_3_1,_4_1,_5_1,_6_1,_1,_2,_3,_4,_5,_6) :- ransuu(6,_発生した乱数), 度数加算(_発生した乱数,_1_1,_2_1,_3_1,_4_1,_5_1,_6_1,_1_2,_2_2,_3_2,_4_2,_5_2,_6_2), N_2 is N + 1, '1から6までの乱数を100回発生させる。1から6までのそれぞれの数が発生した回数を出力しなさい。'(N_2,_1_2,_2_2,_3_2,_4_2,_5_2,_6_2,_1,_2,_3,_4,_5,_6). 度数加算(1,_1_1,_2,_3,_4,_5,_6,_1_2,_2,_3,_4,_5,_6) :- _1_2 is _1_1 + 1,!. 度数加算(2,_1,_2_1,_3,_4,_5,_6,_1,_2_2,_3,_4,_5,_6) :- _2_2 is _2_1 + 1,!. 度数加算(3,_1,_2,_3_1,_4,_5,_6,_1,_2,_3_2,_4,_5,_6) :- _3_2 is _3_1 + 1,!. 度数加算(4,_1,_2,_3,_4_1,_5,_6,_1,_2,_3,_4_2,_5,_6) :- _4_2 is _4_1 + 1,!. 度数加算(5,_1,_2,_3,_4,_5_1,_6,_1,_2,_3,_4,_5_2,_6) :- _5_2 is _5_1 + 1,!. 度数加算(6,_1,_2,_3,_4,_5,_6_1,_1,_2,_3,_4,_5,_6_2) :- _6_2 is _6_1 + 1,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/235 # # [1] 授業単元:プログラミング # [2] 問題文: # # ransuu関数は整数型の引数uを受け取ると1からuまでの乱数を返す。 # この関数を用いて、1から6までの乱数を100回発生させる。 # 1から6までのそれぞれの数が発生した回数を出力しなさい。 # http://ime.nu/codepad.org/2MXb2oGy # ransuu(_u,_1からuまでの乱数) :- 整数型の引数uを受け取ると1からuまでの乱数を返す(_u,_1からuまでの乱数). 整数型の引数uを受け取ると1からuまでの乱数を返す(_u,_1からuまでの乱数) :- _1からuまでの乱数 is random(_u) + 1. '1から6までの乱数を100回発生させる。1から6までのそれぞれの数が発生した回数を出力しなさい。' :- '1から6までの乱数を100回発生させる'(L), between(1,6,N), count(member(N,L),_発生した回数), writef('乱数 %t 発生数 %t回\n',[N,_発生した回数]), N = 6. '1から6までの乱数を100回発生させる'(L) :- findall(_1から6までの乱数,( between(1,100,_), ransuu(6,_1から6までの乱数)), L). % 以下のサイトは # # 図.1のような。格子状の経路があるとします。 # (1) このときPからQまでいくのに何通りの経路があるか数えてください。ただし遠回りはせずかならずQに近づく方向に進む(右方向か下方向にだけ進む)とします。 # (2) (1)と条件は同じで、図.2のように経路の一部がない(通れない)場合に、PからQまでいくのに何通りの経路があるか数えてください。 # P-+-+-+ P-+-+-+ # | | | | | | | | # +-+-+-+ +-+-+-+ # | | | | | | | # +-+-+-+ +-+-+ + # | | | | | | | | # +-+-+-+ +-+ +-+ # | | | | | | | | # +-+-+-Q +-+-+-Q # 図.1 図.2 # 経路の表現の仕方、記憶の仕方は自由とします。上記のようなキャラクタでの表現でもよいですし、最初からプログラムで扱いやすいデータとして持っていてもOKです。入力も外部からの入力でもよいですし、プログラム中にコーディングされていてもOKです。 # 出発点(あ). 終着点(と). 接続(あ,い). 接続(あ,お). 接続(い,う). 接続(い,か). 接続(う,え). 接続(う,き). 接続(え,く). 接続(お,か). 接続(お,け). 接続(か,き). 接続(き,く). 接続(き,さ). 接続(く,し). 接続(け,こ). 接続(け,す). 接続(こ,さ). 接続(こ,せ). 接続(さ,そ). 接続(し,た). 接続(す,せ). 接続(す,ち). 接続(せ,つ). 接続(そ,た). 接続(ち,つ). 接続(つ,て). 接続(て,と). 通れない通路ありで右または下のみ移動可の道順は何通り(_何通り) :- 度数(道順(_),_何通り). 道順(_道順) :- 出発点(_出発点), 終着点(_終着点), 道順(_出発点,_終着点,_道順). 道順(_点,_隣接点,[_点,_隣接点]) :- 接続(_点,_隣接点). 道順(_点,_終着点,[_点|R]) :- 接続(_点,_隣接点), 道順(_隣接点,_終着点,R). % 度数/2 % 以下のサイトは # # 図.1のような。格子状の経路があるとします。 # (1) このときPからQまでいくのに何通りの経路があるか数えてください。ただし遠回りはせずかならずQに近づく方向に進む(右方向か下方向にだけ進む)とします。 # (2) (1)と条件は同じで、図.2のように経路の一部がない(通れない)場合に、PからQまでいくのに何通りの経路があるか数えてください。 # P-+-+-+ P-+-+-+ # | | | | | | | | # +-+-+-+ +-+-+-+ # | | | | | | | # +-+-+-+ +-+-+ + # | | | | | | | | # +-+-+-+ +-+ +-+ # | | | | | | | | # +-+-+-Q +-+-+-Q # 図.1 図.2 # 経路の表現の仕方、記憶の仕方は自由とします。上記のようなキャラクタでの表現でもよいですし、最初からプログラムで扱いやすいデータとして持っていてもOKです。入力も外部からの入力でもよいですし、プログラム中にコーディングされていてもOKです。 # 出発点(あ). 終着点(と). 接続(あ,い). 接続(あ,お). 接続(い,う). 接続(い,か). 接続(う,え). 接続(う,き). 接続(え,お). 接続(え,く). 接続(お,か). 接続(お,け). 接続(か,き). 接続(か,こ). 接続(き,く). 接続(き,さ). 接続(く,し). 接続(す,せ). 接続(す,ち). 接続(せ,そ). 接続(せ,つ). 接続(そ,た). 接続(そ,と). 接続(た,と). 接続(ち,つ). 接続(つ,て). 接続(て,と). 完全格子で右または下へのみ移動の道順は何通り(_何通り) :- 度数(道順(_),_何通り). 道順(_道順) :- 出発点(_出発点), 終着点(_終着点), 道順(_出発点,_終着点,_道順). 道順(_点,_隣接点,[_点,_隣接点]) :- 接続(_点,_隣接点). 道順(_点,_終着点,[_点|R]) :- 接続(_点,_隣接点), 道順(_隣接点,_終着点,R). % 度数/2 % 以下のサイトは # # 図.1のような。格子状の経路があるとします。 # (1) このときPからQまでいくのに何通りの経路があるか数えてください。 # (2) (1)と条件は同じで、図.2のように経路の一部がない(通れない)場合に、PからQまでいくのに何通りの経路があるか数えてください。 # P-+-+-+ P-+-+-+ # | | | | | | | | # +-+-+-+ +-+-+-+ # | | | | | | | # +-+-+-+ +-+-+ + # | | | | | | | | # +-+-+-+ +-+ +-+ # | | | | | | | | # +-+-+-Q +-+-+-Q # 図.1 図.2 # 経路の表現の仕方、記憶の仕方は自由とします。上記のようなキャラクタでの表現でもよいですし、最初からプログラムで扱いやすいデータとして持っていてもOKです。入力も外部からの入力でもよいですし、プログラム中にコーディングされていてもOKです。 # 出発点(あ). 終着点(と). 接続(あ,い). 接続(あ,お). 接続(い,う). 接続(い,か). 接続(う,え). 接続(う,き). 接続(え,く). 接続(お,か). 接続(お,け). 接続(か,き). 接続(き,く). 接続(き,さ). 接続(く,し). 接続(け,こ). 接続(け,す). 接続(こ,さ). 接続(こ,せ). 接続(さ,そ). 接続(し,た). 接続(す,せ). 接続(す,ち). 接続(せ,つ). 接続(そ,た). 接続(ち,つ). 接続(つ,て). 接続(て,と). 接続(い,あ). 接続(お,あ). 接続(う,い). 接続(か,い). 接続(え,う). 接続(き,う). 接続(く,え). 接続(か,お). 接続(け,お). 接続(き,か). 接続(く,き). 接続(さ,き). 接続(し,く). 接続(こ,け). 接続(す,け). 接続(さ,こ). 接続(せ,こ). 接続(そ,さ). 接続(た,し). 接続(せ,す). 接続(ち,す). 接続(つ,せ). 接続(た,そ). 接続(つ,ち). 接続(て,つ). 接続(と,て). 通れない通路ありの全方向移動可の道順は何通り(_何通り) :- 度数(道順(_),_何通り). 道順(_道順) :- 出発点(_出発点), 終着点(_終着点), 道順(_出発点,_終着点,[],_道順). 道順(_点,_隣接点,_履歴,[_点,_隣接点]) :- 接続(_点,_隣接点), \+(member([_点,_隣接点],_履歴)), \+(member([_隣接点,_点],_履歴)). 道順(_点,_終着点,_履歴,[_点|R]) :- 接続(_点,_隣接点), \+(member([_点,_隣接点],_履歴)), \+(member([_隣接点,_点],_履歴)), 道順(_隣接点,_終着点,[[_点,_隣接点]|_履歴],R). % 度数/2 % 以下のサイトは # # 図.1のような。格子状の経路があるとします。 # (1) このときPからQまでいくのに何通りの経路があるか数えてください。 # (2) (1)と条件は同じで、図.2のように経路の一部がない(通れない)場合に、PからQまでいくのに何通りの経路があるか数えてください。 # P-+-+-+ P-+-+-+ # | | | | | | | | # +-+-+-+ +-+-+-+ # | | | | | | | # +-+-+-+ +-+-+ + # | | | | | | | | # +-+-+-+ +-+ +-+ # | | | | | | | | # +-+-+-Q +-+-+-Q # 図.1 図.2 # 経路の表現の仕方、記憶の仕方は自由とします。上記のようなキャラクタでの表現でもよいですし、最初からプログラムで扱いやすいデータとして持っていてもOKです。入力も外部からの入力でもよいですし、プログラム中にコーディングされていてもOKです。 # 出発点(あ). 終着点(と). 接続(あ,い). 接続(あ,お). 接続(い,う). 接続(い,か). 接続(う,え). 接続(う,き). 接続(え,お). 接続(え,く). 接続(お,か). 接続(お,け). 接続(か,き). 接続(か,こ). 接続(き,く). 接続(き,さ). 接続(く,し). 接続(す,せ). 接続(す,ち). 接続(せ,そ). 接続(せ,つ). 接続(そ,た). 接続(そ,と). 接続(た,と). 接続(ち,つ). 接続(つ,て). 接続(て,と). 接続(い,あ). 接続(お,あ). 接続(う,い). 接続(か,い). 接続(え,う). 接続(き,う). 接続(お,え). 接続(く,え). 接続(か,お). 接続(け,お). 接続(き,か). 接続(こ,か). 接続(く,き). 接続(さ,き). 接続(し,く). 接続(せ,す). 接続(ち,す). 接続(そ,せ). 接続(つ,せ). 接続(た,そ). 接続(と,そ). 接続(と,た). 接続(つ,ち). 接続(て,つ). 接続(と,て). 完全格子で全方向移動可の道順は何通り(_何通り) :- 度数(道順(_),_何通り). 道順(_道順) :- 出発点(_出発点), 終着点(_終着点), 道順(_出発点,_終着点,[],_道順). 道順(_点,_隣接点,_履歴,[_点,_隣接点]) :- 接続(_点,_隣接点), \+(member([_点,_隣接点],_履歴)), \+(member([_隣接点,_点],_履歴)). 道順(_点,_終着点,_履歴,[_点|R]) :- 接続(_点,_隣接点), \+(member([_点,_隣接点],_履歴)), \+(member([_隣接点,_点],_履歴)), 道順(_隣接点,_終着点,[[_点,_隣接点]|_履歴],R). % 度数/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/786 # # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- sub_atom(_文字列,0,_,_,_末尾を削除された文字列), count(sub_atom(_末尾を削除された文字列,_,1,_,'\r'),30),!. 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/49 # # [1] 授業単元 情報工学 # [2] 問題文 # n枚のカードからr枚のカードを選ぶ組み合わせを計算するプログラムを作成せよ。 # 但し、n≧1  r≧1  n≧rを前提してよい。(入力エラーの処理は不要) # 'n枚のカードからr枚のカードを選ぶ組み合わせを計算する'(_n,_r,_n枚のカードからr枚のカードを選ぶ組み合わせ) :- findall(N,between(1,_n,N),L), count(組合せ(L,_r,_),_n枚のカードからr枚のカードを選ぶ組み合わせ). 組合せ(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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% nCr(_n,_r,_組合せ数) :- _z is _n - _r + 1, 階乗(_n,_z,_組合せ数). 階乗(_r,_r,_r). 階乗(_n,_r,_組合せ数) :- _n_1 is _n - 1, 階乗(_n_1,_r,_組合せ数_1), _組合せ数 is _組合せ数_1 * _n. % 以下のサイトは # # I have several prolog facts: # # relation('Kitchen', [item(spoon), item(fork), item(knife) ]). # relation('Lounge', [item(sofa), item(chair), item(table) ]). # relation('Bedroom', [item(bed), item(desk), item(drawers)]). # And a list that is generated at runtime, for example: # # [item(spoon), item(knife)] # From this list, in this case, I would like 'Kitchen' to be returned as it is the best match. # # I think I need to use the intersection/3 predicate to get a count of how many matches there are to the runtime list, so Kitchen would return 2 and the others would return 0, but I don't know a way of recursing through all the relation/2 predicates and testing each one, before only returning the best match. relation('Kitchen', [item(spoon), item(fork), item(knife) ]). relation('Lounge', [item(sofa), item(chair), item(table) ]). relation('Bedroom', [item(bed), item(desk), item(drawers)]). 指定されたitemを利用している部屋(_指定itemならび,_部屋) :- '指定itemならびの形式変換'(_指定itemならび,_形式変換済み指定itemならび), relation(_部屋,_部屋を構成するitempならび), 積集合(_部屋を構成するitempならび,_形式変換済み指定itemならび,[_|_]). '指定itemならびの形式変換'([],[]). '指定itemならびの形式変換'([_item|R1],[item(_item)|R2]) :- '指定itemならびの形式変換'(R1,R2). % 以下のサイトは # 出典:: 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). % 以下のサイトは # I'm working on a predicate which will count the number of divisors for a given number. It won't count all of them, but enough for me to know that it has more than two sets of factors. Here is what I have: # # countFactors([_,_,_,_X]):-!. # countFactors(Product, Count,Divisor, _X):- # Divisor =< Product/2, # Product mod Divisor = 0, # NewC is Count + 1, # NextD is Divisor + 1, # countFactors(Product,NewC, NextD, NewC). # However, running countFactors(16,0,2,X). Simply returns false, whereas i would expect it to return X = 2 # # EDIT: Ok, so now I realise why it returns false: it works fine if the divisor in question is a factor, and recurses. However, if it isn't a factor, then it gives false, but doesn't increment to the next divisor, it just stops and returns false. # # So my question is, how can I correct this? countFactors(Product, Count,Divisor, _X):- Divisor =< Product // 2, M is Product mod Divisor, NextD is Divisor + 1, newC(Count, M, NewC), countFactors(Product,NewC, NextD, _X). countFactors(Product,_X,Divisor,_X) :- Divisor > Product // 2. newC(Count, 0, NewC) :- NewC is Count + 1. newC(Count, M, Count) :- \+(M == 0). % 以下のサイトは # Part 1: Write a Prolog and an Ada programs, that determine the number of # a’s and b’s in a string. Then print this number. # The user inputs a string as an array of characters. # Then the program replies by a number that contains the number of [a’s] added to the number of [b’s]. 'the program replies by a number that contains the number of [a’s] added to the number of [b’s].'(_string_list,_number_of_a_or_b) :- count((member(A,_string_list),(A==97;A==98)),_number_of_a_or_b). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/745 # # ●正規表現の使用環境 # PCREライブラリを使用したアプリケーション # # ●検索か置換か? # 置換 # # ●説明 # HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索 # もし有れば対応する前方タグ内の後ろに@を付けたい # # ●対象データ # <AB><CD>nea##kv</CD>nk#eccu</AB> # nea<YY><EF>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK>#<CD>asiaev</CD>un##ima</KK> # # ●希望する結果 # <AB><CD@>nea##kv</CD>nk#eccu</AB> # nea<YY><EF@>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK@>#<CD>asiaev</CD>un##ima</KK> # % % ここでは、 % 非決定性の処理を考える。先頭から順に置換が進んでいくように。 % 注意するべきことは、普通に非決定性に書くと、既に置換したつもりの % 部分が変数の束縛が解かれて、置換前の状態にもどってしまうこと。 % この型の述語では常にその点に注意する。 % 'HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_文字列,_置換された文字列) :- タグとデータに分割する(_文字列,_タグとデータならび), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_タグとデータならび,_置換されたタグとデータならび), atomic_list_concat(_置換されたタグとデータならび,_置換された文字列). タグとデータに分割する(_文字列,[_前データ,_タグ|R]) :- データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列), タグとデータに分割する(_残り文字列,R),!. タグとデータに分割する(_文字列,[_文字列]). データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列) :- sub_atom(_文字列,S1,1,_,'<'), sub_atom(_文字列,0,S1,_,_前データ), sub_atom(_文字列,S2,1,_,'>'), Len is S2 - S1 + 1, sub_atom(_文字列,S1,Len,R,_タグ), sub_atom(_文字列,S2_2,R,0,_残り文字列),!. '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L1,L2) :- append(L0,[A,B|R],L1). タグである(A), '#が二つ以上ある'(B), sub_atom(A,_,_,2,A_1), atomic_list_concat([A_1,'@>',B],C), append(L0,[C,B|R1],L2), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L0,A,B,C,R,L2). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([A|R1],[A|R2]) :- '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,R2). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([],[]). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L0,A,B,C,R1,L2). append(L0,[C|R1],L2). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L0,A,B,C,R1,L2) :- '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,L2_1), append(L0,[C,B|L2_1],L2). タグである(A) :- sub_atom(A,0,1,_,<), sub_atom(A,_,1,0,>). '#が二つ以上ある'(B) :- count(sub_atom(B,_,1,_,'#'),Count), Count >= 2. % % count/2 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/745 # # ●正規表現の使用環境 # PCREライブラリを使用したアプリケーション # # ●検索か置換か? # 置換 # # ●説明 # HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索 # もし有れば対応する前方タグ内の後ろに@を付けたい # # ●対象データ # <AB><CD>nea##kv</CD>nk#eccu</AB> # nea<YY><EF>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK>#<CD>asiaev</CD>un##ima</KK> # # ●希望する結果 # <AB><CD@>nea##kv</CD>nk#eccu</AB> # nea<YY><EF@>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK@>#<CD>asiaev</CD>un##ima</KK> # # # 'HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_文字列,_置換された文字列) :- タグとデータに分割する(_文字列,_タグとデータならび), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_タグとデータならび,_置換されたタグとデータならび), atomic_list_concat(_置換されたタグとデータならび,_置換された文字列). タグとデータに分割する(_文字列,[_前データ,_タグ|R]) :- データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列), タグとデータに分割する(_残り文字列,R),!. タグとデータに分割する(_文字列,[_文字列]). データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列) :- sub_atom(_文字列,S1,1,_,'<'), sub_atom(_文字列,0,S1,_,_前データ), sub_atom(_文字列,S2,1,_,'>'), Len is S2 - S1 + 1, sub_atom(_文字列,S1,Len,R,_タグ), sub_atom(_文字列,S2_2,R,0,_残り文字列),!. '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([],[]) :- !. '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([A,B|R1],[A,C|R2]) :- タグである(A), '#が二つ以上ある'(B), sub_atom(A,_,_,2,A_1), atomic_list_concat([A_1,'@>'],C), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,R2),!. '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([A|R1],[A|R2]) :- '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,R2). タグである(A) :- sub_atom(A,0,1,_,<), sub_atom(A,_,1,0,>). '#が二つ以上ある'(B) :- count(sub_atom(B,_,1,_,'#'),Count), Count >= 2. % % count/2 % % 以下のサイトは # # チャールスT.ホーングレン著 「管理会計」 小倉栄一郎・加藤勝康訳 1974年 日本生産性本部刊 p341より # # 問題 # # 予算に計上されたある会社の事業部活動にかんしてつぎのデータが与えられている。 # # 平均利用可能資産: # 受取資産 $ 100,000 # 棚卸資産 300,000 # 工場および設備(純額) 200,000 # --------- # $ 600,000 # ========= # 間接固定費 $ 200,000 # 変動単価 単位当たり$1 # 平均利用可能資産にたいする所要投資利益率 25% # 期待販売量 100,000単位 # # 問 # # 1.a. 平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの # 平均単価価格が必要であるか。 # b. 期待される資産回転率はどれほどであろうか。 # # c. 売上額にたいする純利益率はどれほどであろうか。 # # 2.a. もし販売量が120,000単位であるならば、利用可能資産にたいしてどれほどの # 投資利益率が得られるであろうか。 # b. もし販売数量が80,000単位ならばどうか。 # # 3. いま同一会社の他の事業部にたいして100,000単位のうち30,000単位が販売され # るものと仮定しよう。他の事業部管理者は、$4 という暫定売価に失望していた。 # その価格でなら自分のところでもそれだけの製造は可能であることを主張して、 # $2.25を申し出ている。売手側事業部の管理者は、自己のデータを健闘してみた。 # もし他の事業部に販売しなければ、在庫を$40,000、工場および設備を$60,000、 # 間接固定費を$20,000削減できると決定した。$2.25で販売すべきであろうか。 # 計算過程を示せ。 # % 1.a. '平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの平均単価価格が必要であるか。'(_平均単価価格) :- 期待販売量(_期待販売量), 売上額(_売上額), _平均単価価格 is _売上額 / _期待販売量. % 1.b. '期待される資産回転率はどれほどであろうか。'(_期待される資産回転率) :- 売上額(_売上額), 平均利用可能資産(_平均利用可能資産), _期待される資産回転率 is _売上額 / _平均利用可能資産. % 1.c. '売上額にたいする純利益はどれほどであろうか。'(_売上額にたいする純利益率) :- 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), 売上額(_売上額), _売上額にたいする純利益率 is _平均利用可能資産にたいする期待利益 / _売上額. % 2.a. 'もし販売量が120,000単位であるならば、利用可能資産にたいしてどれほどの投資利益率が得られるであろうか。'(_平均単価価格,_利用可能資産にたいする投資利益率) :- 'もし販売量が120,000単位であるならば、', 利益額(120000,_平均単価価格,_利益額), 平均利用可能資産(_平均利用可能資産), _利用可能資産にたいする投資利益率 is _利益額 / _平均利用可能資産. 利益額(_販売量,_平均単価価格,_利益額) :- _売上額 is _平均単価価格 * _販売量, 変動費(_変動費), 固定費(_固定費), _利益額 id _売上額 - _変動費 - _固定費. % 2.b. 'もし販売数量が80,000単位ならばどうか'(_平均単価価格,_利用可能資産にたいする投資利益率) :- 'もし販売量が80,000単位であるならば、', 利益額(80000,_平均単価価格,_利益額), 平均利用可能資産(_平均利用可能資産), _利用可能資産にたいする投資利益率 is _利益額 / _平均利用可能資産. 'もし販売量が120,000単位であるならば、' :- retract(期待販売量(_)), asserta(期待販売量(120000)). 'もし販売数量が80,000単位であるならば、' :- retract(期待販売量(_)), asserta(期待販売量(80000)). 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益) :- 平均利用可能資産(_平均利用可能資産), 平均利用可能資産にたいする所要投資利益率(_平均利用可能資産にたいする所要投資利益率), _平均利用可能資産にたいする期待利益 is _平均利用可能資産 * _平均利用可能資産にたいする所要投資利益率. 売上額(_売上額) :- 変動費(_変動費), 固定費(_固定費), 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), _売上額 is _変動費 + _固定費 + _平均利用可能資産に対する期待利益. 変動費(_変動費) :- 期待販売量(_期待販売量), 変動単価_単位当たり(_変動単価_単位当たり), _変動費 is _変動単価_単位当たり * _期待販売量. 平均利用可能資産(_平均利用可能資産) :- 受取資産(_受取資産), 棚卸資産(_棚卸資産), '工場および設備(純額)'(_工場および設備), _平均利用可能資産 is _受取資産 + _棚卸資産 + _工場および設備. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 受取資産(100000). 棚卸資産(300000). '工場および設備(純額)'(200000). 間接固定費(200000). 変動単価_単位当たり(1). 平均利用可能資産にたいする所要投資利益率(0.25). 期待販売量(100000). % 以下のサイトは # # チャールスT.ホーングレン著 「管理会計」 小倉栄一郎・加藤勝康訳 1974年 日本生産性本部刊 p341より # # 問題 # # 予算に計上されたある会社の事業部活動にかんしてつぎのデータが与えられている。 # # 平均利用可能資産: # 受取資産 $ 100,000 # 棚卸資産 300,000 # 工場および設備(純額) 200,000 # --------- # $ 600,000 # ========= # 間接固定費 $ 200,000 # 変動単価 単位当たり$1 # 平均利用可能資産にたいする所要投資利益率 25% # 期待販売量 100,000単位 # # 問 # # 1.a. 平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの # 平均単価価格が必要であるか。 # b. 期待される資産回転率はどれほどであろうか。 # # c. 売上額にたいする純利益率はどれほどであろうか。 # # 2.a. もし販売量が120,000単位であるならば、利用可能資産にたいしてどれほどの # 投資利益率が得られるであろうか。 # b. もし販売数量が80,000単位ならばどうか。 # # 3. いま同一会社の他の事業部にたいして100,000単位のうち30,000単位が販売され # るものと仮定しよう。他の事業部管理者は、$4 という暫定売価に失望していた。 # その価格でなら自分のところでもそれだけの製造は可能であることを主張して、 # $2.25を申し出ている。売手側事業部の管理者は、自己のデータを健闘してみた。 # もし他の事業部に販売しなければ、在庫を$40,000、工場および設備を$60,000、 # 間接固定費を$20,000削減できると決定した。$2.25で販売すべきであろうか。 # 計算過程を示せ。 # % 1.a. '平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの平均単価価格が必要であるか。'(_平均単価価格) :- 期待販売量(_期待販売量), 売上額(_売上額), _平均単価価格 is _売上額 / _期待販売量. % 1.b. '期待される資産回転率はどれほどであろうか。'(_期待される資産回転率) :- 売上額(_売上額), 平均利用可能資産(_平均利用可能資産), _期待される資産回転率 is _売上額 / _平均利用可能資産. % 1.c. '売上額にたいする純利益はどれほどであろうか。'(_売上額にたいする純利益率) :- 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), 売上額(_売上額), _売上額にたいする純利益率 is _平均利用可能資産にたいする期待利益 / _売上額. 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益) :- 平均利用可能資産(_平均利用可能資産), 平均利用可能資産にたいする所要投資利益率(_平均利用可能資産にたいする所要投資利益率), _平均利用可能資産にたいする期待利益 is _平均利用可能資産 * _平均利用可能資産にたいする所要投資利益率. 売上額(_売上額) :- 変動費(_変動費), 固定費(_固定費), 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), _売上額 is _変動費 + _固定費 + _平均利用可能資産に対する期待利益. 変動費(_変動費) :- 期待販売量(_期待販売量), 変動単価_単位当たり(_変動単価_単位当たり), _変動費 is _変動単価_単位当たり * _期待販売量. 平均利用可能資産(_平均利用可能資産) :- 受取資産(_受取資産), 棚卸資産(_棚卸資産), '工場および設備(純額)'(_工場および設備), _平均利用可能資産 is _受取資産 + _棚卸資産 + _工場および設備. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 受取資産(100000). 棚卸資産(300000). '工場および設備(純額)'(200000). 間接固定費(200000). 変動単価_単位当たり(1). 平均利用可能資産にたいする所要投資利益率(0.25). 期待販売量(100000). % 以下のサイトは # # チャールスT.ホーングレン著 「管理会計」 小倉栄一郎・加藤勝康訳 1974年 日本生産性本部刊 p341より # # 問題 # # 予算に計上されたある会社の事業部活動にかんしてつぎのデータが与えられている。 # # 平均利用可能資産: # 受取資産 $ 100,000 # 棚卸資産 300,000 # 工場および設備(純額) 200,000 # --------- # $ 600,000 # ========= # 間接固定費 $ 200,000 # 変動単価 単位当たり$1 # 平均利用可能資産にたいする所要投資利益率 25% # 期待販売量 100,000単位 # # 問 # # 1.a. 平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの # 平均単価価格が必要であるか。 # b. 期待される資産回転率はどれほどであろうか。 # # c. 売上額にたいする純利益率はどれほどであろうか。 # # 2.a. もし販売量が120,000単位であるならば、利用可能資産にたいしてどれほどの # 投資利益率が得られるであろうか。 # b. もし販売数量が80,000単位ならばどうか。 # # 3. いま同一会社の他の事業部にたいして100,000単位のうち30,000単位が販売され # るものと仮定しよう。他の事業部管理者は、$4 という暫定売価に失望していた。 # その価格でなら自分のところでもそれだけの製造は可能であることを主張して、 # $2.25を申し出ている。売手側事業部の管理者は、自己のデータを健闘してみた。 # もし他の事業部に販売しなければ、在庫を$40,000、工場および設備を$60,000、 # 間接固定費を$20,000削減できると決定した。$2.25で販売すべきであろうか。 # 計算過程を示せ。 # % 1.a. '平均利用可能資産にたいする所要投資利益率が得られるためには、どれほどの平均単価価格が必要であるか。'(_平均単価価格) :- 期待販売量(_期待販売量), 売上額(_売上額), _平均単価価格 is _売上額 / _期待販売量. % 1.b. '期待される資産回転率はどれほどであろうか。'(_期待される資産回転率) :- 売上額(_売上額), 平均利用可能資産(_平均利用可能資産), _期待される資産回転率 is _売上額 / _平均利用可能資産. % 1.c. '売上額にたいする純利益はどれほどであろうか。'(_売上額にたいする純利益率) :- 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), 売上額(_売上額), _売上額にたいする純利益率 is _平均利用可能資産にたいする期待利益 / _売上額. 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益) :- 平均利用可能資産(_平均利用可能資産), 平均利用可能資産にたいする所要投資利益率(_平均利用可能資産にたいする所要投資利益率), _平均利用可能資産にたいする期待利益 is _平均利用可能資産 * _平均利用可能資産にたいする所要投資利益率. 売上額(_売上額) :- 変動費(_変動費), 固定費(_固定費), 平均利用可能資産にたいする期待利益(_平均利用可能資産にたいする期待利益), _売上額 is _変動費 + _固定費 + _平均利用可能資産に対する期待利益. 変動費(_変動費) :- 期待販売量(_期待販売量), 変動単価_単位当たり(_変動単価_単位当たり), _変動費 is _変動単価_単位当たり * _期待販売量. 平均利用可能資産(_平均利用可能資産) :- 受取資産(_受取資産), 棚卸資産(_棚卸資産), '工場および設備(純額)'(_工場および設備), _平均利用可能資産 is _受取資産 + _棚卸資産 + _工場および設備. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 受取資産(100000). 棚卸資産(300000). '工場および設備(純額)'(200000). 間接固定費(200000). 変動単価_単位当たり(1). 平均利用可能資産にたいする所要投資利益率(0.25). 期待販売量(100000). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/614 # # ・DBMS名とバージョン # MySQL # # ・テーブルデータ # 店舗(店舗ID 店舗名) # # 商品(商品ID 店舗ID 商品名) # (※同じ名前の商品が複数の店舗にあっても、別の商品として扱う) # # 売り上げ(売り上げID 商品ID 個数) # # ・欲しい結果 # 店舗名 商品名 売り上げ個数合計 # (※店舗名、商品名でソート) # # ・説明 # SELECT * FROM `店舗` ORDER BY `店舗名`; # この結果をプログラム側でループ # SELECT * FROM 商品 WHERE 店舗ID=? ORDER BY `商品名`; # さらにこの結果をループ # SELECT SUM(個数) FROM 売り上げ WHERE 商品ID=? # # これだと時間がかかりすぎるので、これを1つ、または2つのSQLにまとめたいです。 # # # SELECT *, SUM(`売り上げ`.個数`) AS `売り上げ個数合計` # FROM `商品` # LEFT JOIN `売り上げ` ON `商品`.`商品ID` = `売り上げ`.`商品ID` # WHERE `商品`.`店舗ID`=? # # とりあえず下2つだけでもまとめようとしてみたのですが、合計が商品毎ではなく店舗毎の合計になってしまいます。 # # # '店舗名・商品名を鍵として売り上げ個数合計を集約する'(_店舗名,_商品名,_売り上げ個数合計) :- '店舗名・商品名を鍵ならびとする'(LL1), '店舗名・消費名を鍵に売り上げ個数合計を集約する'(LL1,LL2), member([_店舗名,_商品名,_売り上げ個数合計],LL2). '店舗名・商品名を鍵ならびとする'(LL1) :- findsetof([_店舗名,_商品名],( 店舗(_店舗ID,_店舗名), 商品(_商品ID,_店舗ID,_商品名)), LL1). '店舗名・消費名を鍵に売り上げ個数合計を集約する'(LL1,LL2) :- findall([_店舗名,_商品名,_売り上げ個数合計],( count((member([_店舗名,_商品名],LL1), 店舗(_店舗ID,_店舗名), 商品(_商品ID,_店舗ID,_商品名)),_売り上げ個数合計)), LL2). % findsetof/3 % count/2 % findsum/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/167 # # [1] 情報科学入門 # [2] (1)1から1000までの間に、3と7の倍数の値がいくつ含まれているのか求めるプログラムを書け。 #    (2)キーボードから西暦年を入力し、その年がサッカーワールドカップ開催年かどうかを判定するプログラムを作成せよ。 # '1から1000までの間に、3と7の倍数の値がいくつ含まれているのか求めるプログラムを書け。'(_3と7の倍数の数) :- count((for(1,N,1000),0 is N mod (3 * 7)),_3と7の倍数の数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/464 # # DBMSはMySQL 5.0です。 # # テーブル 合否 # 社員番号,結果,エラーコード # 1,合格,0 # 2,合格,0 # 1,合格,1 # 1,不合格,0 # 3,合格,0 # 2,合格,0 # 2,不合格,1 # # こういうテーブルがあります。 # 社員は一人で複数回受験できて、合格か不合格の結果を記録します。 # 但し、特定の条件だとエラーになって結果は出るけどエラーコードに1がつきます。 # # (1)エラーコードが0のものの、合格と不合格の件数が知りたいとき # SELECT 結果,COUNT(結果) FROM 合否 WHERE エラーコード=0 GROUP BY 結果 # # 結果 # 合格,4 # 不合格,1 # # (2)エラーコードにかかわらず、合格と不合格の件数が知りたいとき # SELECT 結果,COUNT(結果) FROM 合否 GROUP BY 結果 # # 結果 # 合格,5 # 不合格,2 # # そこで、 # (1)と(2)を同じ表に出力したいときはどう書けばいいでしょうか。 # このような表になればいいです。よろしくお願いします。 # 合格,4,5 # 不合格,1,2 # '(1) エラーコードが0のものの、合格と不合格の件数が知りたい'(_エラーコード0のものの合格の件数,_エラーコード0のものの不合格の件数) :- count(合否(_,合格,0),_エラーコード0のものの合格の件数), count(合否(_,不合格,0),_エラーコード0のものの不合格の件数). '(2) エラーコードにかかわらず、合格と不合格の件数が知りたい'(_エラーコードにかかわらない合格の件数,_エラーコードにかかわらない不合格の件数) :- count(合否(_,合格,_),_エラーコードにかかわらない合格の件数), count(合否(_,不合格,_),_エラーコードにかかわらない不合格の件数). '(1)と(2)を同じ表に出力する'(_結果,_エラーコード0の件数,_エラーコードにかかわらない件数) :- '(1) エラーコードが0のものの、合格と不合格の件数が知りたい'(_エラーコード0のものの合格の件数,_エラーコード0のものの不合格の件数), '(2) エラーコードにかかわらず、合格と不合格の件数が知りたい'(_エラーコードにかかわらない合格の件数,_エラーコードにかかわらない不合格の件数), member([_結果,_エラーコード0の件数,_エラーコードにかかわらない件数],[[合格,_エラーコード0のものの合格の件数,_エラーコードにかかわらない合格の件数],[不合格,_エラーコード0のものの不合格の件数,_エラーコードにかかわらない不合格の件数]]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/464 # # DBMSはMySQL 5.0です。 # # テーブル 合否 # 社員番号,結果,エラーコード # 1,合格,0 # 2,合格,0 # 1,合格,1 # 1,不合格,0 # 3,合格,0 # 2,合格,0 # 2,不合格,1 # # こういうテーブルがあります。 # 社員は一人で複数回受験できて、合格か不合格の結果を記録します。 # 但し、特定の条件だとエラーになって結果は出るけどエラーコードに1がつきます。 # # (1)エラーコードが0のものの、合格と不合格の件数が知りたいとき # SELECT 結果,COUNT(結果) FROM 合否 WHERE エラーコード=0 GROUP BY 結果 # # 結果 # 合格,4 # 不合格,1 # # (2)エラーコードにかかわらず、合格と不合格の件数が知りたいとき # SELECT 結果,COUNT(結果) FROM 合否 GROUP BY 結果 # # 結果 # 合格,5 # 不合格,2 # # そこで、 # (1)と(2)を同じ表に出力したいときはどう書けばいいでしょうか。 # このような表になればいいです。よろしくお願いします。 # 合格,4,5 # 不合格,1,2 # '(1) エラーコードが0のものの、合格と不合格の件数が知りたい'(_エラーコード0のものの合格の件数,_エラーコード0のものの不合格の件数) :- count(合否(_,合格,0),_エラーコード0のものの合格の件数), count(合否(_,不合格,0),_エラーコード0のものの不合格の件数). '(2) エラーコードにかかわらず、合格と不合格の件数が知りたい'(_エラーコードにかかわらない合格の件数,_エラーコードにかかわらない不合格の件数) :- count(合否(_,合格,_),_エラーコードにかかわらない合格の件数), count(合否(_,不合格,_),_エラーコードにかかわらない不合格の件数). '(1)と(2)を同じ表に出力する' :- '(1) エラーコードが0のものの、合格と不合格の件数が知りたい'(_エラーコード0のものの合格の件数,_エラーコード0のものの不合格の件数), '(2) エラーコードにかかわらず、合格と不合格の件数が知りたい'(_エラーコードにかかわらない合格の件数,_エラーコードにかかわらない不合格の件数), writef('合格,%t,%t\n不合格,%t,%t\n',[_エラーコード0のものの合格の件数,_エラーコード0のものの不合格の件数,_エラーコードにかかわらない合格の件数,_エラーコードにかかわらない不合格の件数]). % 以下のサイトは # # データセット # date # 2001-10-19 # 2001-10-19 # 2003-12-7 # 2004-9-7 # .... # # といったidと日付の集まりがあります。日付は重複しています。 # ここから,SELECT count(date) FROM table GROUP BY dateで日付ごとの集計が # とれたのですが、さらにmaxを使って集計が最大の日の日付とカウント数を # 出したいのですがうまくいきません。 # 上の例では、2001-10-19,2というのを取りたいのですが、どうやったらいいんでしょうか? '集計が最大の日の日付とカウント数'(_日付,_度数) :- findsetof(_日付,( データセット(_日付)), _日付ならび), member(_日付,_日付ならび), count(データセット(_日付),_度数). % 以下のサイトは # 出典:: 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/1325685876/393 # # [1] 授業単元:プログラミング # [2]特定範囲の乱数を計算する関数を作成して、0から9ま # での10種類の乱数を発生させて、それぞれの値の発 # 生回数を調べるプログラムをかけ。 # '特定範囲の乱数を計算する関数を作成して、0から9までの10種類の乱数を発生させて、それぞれの値の発生回数を調べる'(_標本数,_発生回数ならび) :- findall(_乱数,( 線形合同法による擬似乱数の発生(_標本数,10,_乱数)), L), それぞれの値の発生回数を調べる(L,_発生回数ならび). それぞれの値の発生回数を調べる(L,_発生回数ならび) :- findall([N,_発生回数],( for(0,N,9), count(member(N,L),_発生回数)), _発生回数ならび). 'Aの種'(97411897). 'Bの種'(75289433). 'Xの種'(42308843). 線形合同法による擬似乱数の発生(N,M,X) :- 定数を決定する(A,B,X0), X1 is (A * X0 + B) mod M, 線形合同法による擬似乱数の発生(1,N,A,B,M,X1,X). 線形合同法による擬似乱数の発生(N,N,A,B,M,X,X). 線形合同法による擬似乱数の発生(N1,N,A,B,M,X1,X) :- X2 is (A * X1 + B) mod M, N2 is N + 1, 線形合同法による擬似乱数の発生(N2,N,A,B,M,X2,X). 定数を決定する(A,B,X) :- get_time(Time), 'Aの種'(_Aの種), 'Bの種'(_Bの種), 'Xの種'(_Xの種), A is truncate(Time) mod _Aの種 + 1, B is truncate(Time) mod _Bの種 + 1, X is truncate(Time) mod _Xの種 + 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/205 # # [1] 授業単元:楽しいC言語(ファイルからの読み込み) # [2] 問題文(含コード&リンク):以下の実行例のように,キーボードからファイル名を # 読み込み,そのファイル中の数字文字の個数をカウント # して画面に表示するプログラムを作成せよ.(’0’〜’9’ # のそれぞれの個数を別々に数える必要はない.) # # 【実行結果例】 # % cat intro.txt # Hello! # I’m Taro .MASAKI # I was born in Tokyo in 1991. # ./intro # ファイル名:intro.txt # ファイル中の数字文字の個数:4 # 'キーボードからファイル名を読み込み,そのファイル中の数字文字の個数をカウントして画面に表示する' :- write('ファイル名 : '), get_line(_ファイル名), get_chars(_ファイル名,Chars), count((member(A,Chars),数字(A)),_数字の度数). writef('ファイル中の数字文字の個数: %t\n',[_数字の度数]). 数字(A) :- char_code(A,Code), Code >= 48, Code =< 57. count(P,N) :- findall(1,P,L), length(L,N). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/205 # # [1] 授業単元:楽しいC言語(ファイルからの読み込み) # [2] 問題文(含コード&リンク):以下の実行例のように,キーボードからファイル名を # 読み込み,そのファイル中の数字文字の個数をカウント # して画面に表示するプログラムを作成せよ.(’0’〜’9’ # のそれぞれの個数を別々に数える必要はない.) # # 【実行結果例】 # % cat intro.txt # Hello! # I’m Taro .MASAKI # I was born in Tokyo in 1991. # ./intro # ファイル名:intro.txt # ファイル中の数字文字の個数:4 # 'キーボードからファイル名を読み込み,そのファイル中の数字文字の個数をカウントして画面に表示する' :- write('ファイル名 : '), get_line(_ファイル名), get_chars(_ファイル名,Chars), count((member(A,Chars),数字(A)),_数字の度数). writef('ファイル中の数字文字の個数: %t\n',[_数字の度数]). 数字(A) :- char_code(A,Code), Code >= 48, Code =< 57. count(P,N) :- findall(1,P,L), length(L,N). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/348 # # (質問) #  チェックボックス値による検索を行いたいと思っています。 # # MYSQL5.1 # # T1 マスタテーブル # ID | DATE     | DATA # --+----------+----- # 1 | 2007-11-11 | aaa # 2 | 2007-11-11 | bbb # 3 | 2007-11-10 | ccc # # T2 チェックボックステーブル1 # ID | cate1     | # --+--------- | # 1 | 201      | # 1 | 202      | # 1 | 205      | # 2 | 202      | # 2 | 203      | # 3 | 203      | # 3 | 204      | # # T3チェックボックステーブル2 # ID | cate2     | # --+--------- | # 1 | 401      | # 1 | 403      | # 1 | 404      | # 3 | 403      | # 3 | 404      | # 3 | 405      | # # このような3つのテーブルから、下記のように出したいがどうすれば # # T2で 201、202、を含み # 且つ # T3で 403 を含む  # # 結果 T1のIDレコード # 1 | 2007-11-11 | aaa # # 試した事 # select * from `T1` # join `T2` using(ID) # join `T3` using(ID) # where # cate1 in(201,202) # and cate2 in(403) # group by ID # having count(*)=?? # # 絞るのにカウント数がT1、T2のチェックレコード数で # 可変するので詰まっています。 # そもそも、考え方がおかしいのかもしれません。 # 良い方法をご教示ください。 # 'T2で 201、202、を含み 且つ T3で 403 を含む T1のIDレコード' :- 'T1'(_ID,_DATE,_DATA), 'T2'(_ID,_cate1), '201、202、を含み'(_cate1), 'T3'(_ID,403), writef('%t | %t | %t\n',[_ID,_DATE,_DATA]), fail. 'T2で 201、202、を含み 且つ T3で 403 を含む T1のIDレコード'. '201、202、を含み'(201). '201、202、を含み'(202). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/332 # # oracleです。 # # ・テーブルデータ # テーブルA #  ID |日付 #  100|10/1 #  100|10/2 # 100|10/5 #  101|11/1 #  102|11/1 #  102|11/2 #  103|12/1 # # # テーブルB #  ID |期間(自)|期間(至) #  100|10/1  |10/4 #  101|10/1  |10/30 #  102|11/1  |11/5 #  103|12/1  |12/1 #   # # ・欲しい結果 # #  ID |期間内のカウント #  100|2 #  101|0 #  102|2 #  103|1 #   # # ・説明: # IDをキーに、期間内のIDごとのカウントをとりたいです。 # SQL1本で取得する方法はありますでしょうか? # 列は増やしたくないです。 # テーブルA(100,10/1). テーブルA(100,10/2). テーブルA(100,10/5). テーブルA(101,11/1). テーブルA(102,11/1). テーブルA(102,11/2). テーブルA(103,12/1). テーブルB(100,10/1,10/4). テーブルB(101,10/1,10/30). テーブルB(102,11/1,11/5). テーブルB(103,12/1,12/1). 'IDをキーに、期間内のIDごとのカウントをとりたい'(_ID,_期間_自,_期間_至,_度数) :- findsetof([_ID,_期間_自,_期間_至],( テーブルB(_ID,_期間_自,_期間_至)), LL1), append(_,[[_ID,_期間_自,_期間_至]|_],LL1), count(( テーブルA(_ID,_日付), _日付 @>= _期間_自, _日付 @=< _期間_至), _度数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/293 # # oracleです。 # # ・テーブルデータ # テーブルA #  ID |状態 #  100|○ #  100|○ #  101|○ #  102|○ #  104|○ #  105|× # テーブルB #  ID |状態 #  100|○ #  100|○ #  100|○ #  103|○ #  105|○ #  106|× # # ・欲しい結果 # #  ID |AのCOUNT(ID)|BのCOUNT(ID) #  100|2 |3 #  101|1 |null #  102|1 |null #  104|1 |null #  105|null |1 # # ・説明: # A,B各テーブルの状態が○であるものをID単位でカウントし、 #  AとBのテーブルを結合したいのですが、SQL1本で可能でしょうか? #  結合する際、どちらかのテーブルのカウントが1以上であれば出力したいです。 # # 'A,B各テーブルの状態が○であるものをID単位でカウントし、AとBのテーブルを結合したいのですが、SQL1本で可能でしょうか? 結合する際、どちらかのテーブルのカウントが1以上であれば出力したいです。'(_ID,CountA,CountB) :- findsetof(_ID,( テーブルA(_ID,○ ); テーブルB(_ID,○ )), L), append(_,[_ID|_],L), count(テーブルA(_ID,○ ),CountA), count(テーブルB(_ID,○ ),CountB). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/875 # # [1]プログラミング実習 # [2] # 表面に色が塗られたサイコロが二つあります # それぞれ共に # 赤が3面 # 青が2面 # 緑が1面 # あります # 二つのサイコロを同時に振ると色の組み合わせは # 1)赤赤 # 2)赤青 # 3)赤緑 # 4)青青 # 5)青緑 # 6)緑緑 # の6通りありますが # 出やすい組み合わせの順に並び替えて出力しなさい # [3]C # [4]11/30 # [5]標準ライブラリのみでコンソールに出力すること # # パターン(1,赤,赤). パターン(2,赤,青). パターン(2,青,赤). パターン(3,赤,緑). パターン(3,緑,赤). パターン(4,青,青). パターン(5,青,緑). パターン(5,緑,青). パターン(6,緑,緑). サイコロ(1,[赤,赤,赤,青,青,緑]). サイコロ(2,[赤,赤,赤,青,青,緑]). 出やすい組み合わせの順に並び替えて出力しなさい :- サイコロの出目を数える(100000,L), 大きい順に取り出す(L). サイコロの出目を数える(0,[[0,1],[0,2],[0,3],[0,4],[0,5],[0,6]]) :- !. サイコロの出目を数える(M,L) :- 'サイコロの目'(_目_1,_目_2), パターン(_パターン番号,_目_1,_目_2), M_1 is M - 1, サイコロの出目を数える(M_1,L_1), 'パターンの度数を更新'(_パターン番号,L_1,L). 'サイコロの目'(_目_1,_目_2) :- サイコロの目(1,_目_1), サイコロの目(2,_目_2). サイコロの目(N,_目_1) :- サイコロ(N,L1), M is rendom(6) + 1, nth1(M,L1,_目_1),!. 'パターンの度数を更新'(_パターン番号,L1,L2) :- append(L0,[[_度数_1,_パターン番号]|R],L1), _度数_2 is _度数 + 1, append(L0,[[_度数_2,_パターン番号]|R],L2). 大きい順に取り出す([]). 大きい順に取り出す(L) :- append(L0,[[_度数,_パターン番号]|R],L) :- 全て要素の度数が等しいか小さい(_度数,L0,R), 表示する(_パターン番号), append(L0,R,L2), 大きい順に取り出す(L2). 全ての要素の度数が等しいか小さい(A,L1,L2) :- append(L1,L2,L), \+((append(_,[B|_],L),B > A)),!. 表示する(_パターン番号) :- パターン(_パターン番号,_色1,_色2), writef('%t%t',[_色1,_色2]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1294641578/703 # # 年代別集計をしたく以下のようにしていますが # 結果が0でもその年代も表示したいのですができませんでしょうか? # # SELECT CASE # when r.age between 0 and 9 then '0 - 9' # when r.age between 10 and 19 then '10 - 19' # when r.age between 20 and 29 then '20 - 29' # when r.age between 30 and 39 then '30 - 39' # when r.age between 40 and 49 then '40 - 49' # when r.age between 50 and 59 then '50 - 59' # when r.age between 60 and 69 then '60 - 69' # when r.age between 70 and 79 then '70 - 79' # when r.age between 80 and 89 then '80 - 89' # when r.age between 90 and 99 then '90 - 99' # when r.age >=100 then '100' # end AS "age_group" # ,COUNT(CASE # when r.age between 0 and 9 then '0 - 9' # when r.age between 10 and 19 then '10 - 19' # when r.age between 20 and 29 then '20 - 29' # when r.age between 30 and 39 then '30 - 39' # when r.age between 40 and 49 then '40 - 49' # when r.age between 50 and 59 then '50 - 59' # when r.age between 60 and 69 then '60 - 69' # when r.age between 70 and 79 then '70 - 79' # when r.age between 80 and 89 then '80 - 89' # when r.age between 90 and 99 then '90 - 99' # when r.age >=100 then '100' # end) AS "age_count" # FROM rank as r # GROUP BY age_group # ORDER BY age_group; # # '年代別集計を結果が0でも表示する' :- findall([_年代別表示,_度数],( for(0,N,10), 年代別に集計する(N,_年代別表示,_度数)), LL), 表示する(LL). 年代別に集計する(10,'100才以上',_度数) :- '100才以上を集計する'(_度数),!. 年代別に集計する(N,_年代別表示,_度数) :- _年齢下限 is N * 10, _年齢上限 is _年齢下限 + 9, 年齢範囲の集計(_年齢下限,_年齢上限,_度数), concat_atom([_年齢下限,才,'-',_年齢上限,才],_年代別表示). '100才以上を集計する'(_度数) :- count(( rank(_age), _age >= 100), _度数). 年齢範囲の集計(_年齢下限,_年齢上限,_度数) :- count(( rank(_age), _age >= _年齢下限, _age =< _年齢上限), _度数). 表示する(LL) :- append(_,[[_年代別表示,_度数]|R],LL), writef('%t,%t\n',[_年代別表示,_度数]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/662 # # 【質問テンプレ】 # [1] 授業単元:プログラミング入門(C) # [2] 問題文(含コード&リンク): # 無限ループを用い、 1〜100までの数値を任意に10回分だけ入力し、その度数分布を求めよ。 # ただし、for文は用いず、while文で。度数分布は5等分して表示せよ。(例えば1~20に4個 21~40に3個 41~60に2個 61~80に1個 81~100に0個) # '無限ループを用い、 1〜100までの数値を任意に10回分だけ入力し、その度数分布を求めよ。'(_1_20,_21_40,_41_60,_61_80,_81_100) :- '無限ループを用い、 1〜100までの数値を任意に10回分だけ入力し、その度数分布を求めよ。'([],[],[],[],[],[],_1_20,_21_40,_41_60,_61_80,_81_100), 度数分布の表示(_1_20,_21_40,_41_60,_61_80,_81_100). '無限ループを用い、 1〜100までの数値を任意に10回分だけ入力し、その度数分布を求めよ。'([_,_,_,_,_,_,_,_,_,_],_1_20,_21_40,_41_60,_61_80,_81_100,_1_20,_21_40,_41_60,_61_80,_81_100). '無限ループを用い、 1〜100までの数値を任意に10回分だけ入力し、その度数分布を求めよ。'([_,_,_,_,_,_,_,_,_,_],_,_,_,_,_,_1_20,_21_40,_41_60,_61_80,_81_100) :- '無限ループを用い、 1〜100までの数値を任意に10回分だけ入力し、その度数分布を求めよ。'([],[],[],[],[],[],_1_20,_21_40,_41_60,_61_80,_81_100). '無限ループを用い、 1〜100までの数値を任意に10回分だけ入力し、その度数分布を求めよ。'(Ln,L1,L2,L3,L4,L5,_1_20,_21_40,_41_60,_61_80,_81_100) :- '1〜100までの数値を任意に10回分だけ入力し度数分布を'(L1,L2,L3,L4,L5,L1_2,L2_2,L3_2,L4_2,L5_2), '無限ループを用い、 1〜100までの数値を任意に10回分だけ入力し、その度数分布を求めよ。'([_|Ln],L1_2,L2_2,L3_2,L4_2,L5_2,_1_20,_21_40,_41_60,_61_80,_81_100). '1〜100までの数値を任意に10回分だけ入力し度数分布を'(L1,L2,L3,L4,L5,L1_2,L2_2,L3_2,L4_2,L5_2) :- _任意の数値 is random(100) + 1, _階級 is (_任意の数字 - 1) // 20 + 1, 分布ならびの更新(_階級,L1,L2,L3,L4,L5,L1_2,L2_2,L3_2,L4_2,L5_2), 分布ならびの更新(1,L1,L2,L3,L4,L5,[_|L1],L2,L3,L4,L5). 分布ならびの更新(2,L1,L2,L3,L4,L5,L1,[_|L2],L3,L4,L5). 分布ならびの更新(3,L1,L2,L3,L4,L5,L1,L2,[_|L3],L4,L5). 分布ならびの更新(4,L1,L2,L3,L4,L5,L1,L2,L3,[_|L4],L5). 分布ならびの更新(5,L1,L2,L3,L4,L5,L1,L2,L3,L4,[_|L5]). 度数分布の表示(_1_20,_21_40,_41_60,_61_80,_81_100) :- for(1,N,5), nth1(N,[_1_20,_21_40,_41_60,_61_80,_81_100],L), 度数表示(N,L), N = 5. 度数分布の表示(N,L) :- length(L,_度数), M1 is (N - 1) * 20 + 1, M2 is M * 20, writef('%t-%t %t個\n',[M1,M2,_度数]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/659 # # [1] 授業単元:(文字列) # [2] 問題文(含コード&リンク):文字列st の中に含まれる文字ch の個数(含まれて # いなければ0 とする)を返す関数 # int str_chnum(const char st[], int ch) # を作成せよ.以下の実行例のように,関数の動作を確認 # できるmain 関数も作成すること. # 【注意】scanf で文字列を入力させた後にgetchar 関 # 数で文字を入力させたい場合,getchar で文字を入力 # させる前に # scanf("%*c"); # などとして,バッファに残った改行コードを読み捨て # ておく必要がある. # # のように動作するプログラムを作成せよ # '文字列st の中に含まれる文字ch の個数(含まれていなければ0 とする)を返す'(_何個) :- '文字列stの入力'(_st), '文字chの入力'(_ch), '文字列st の中に含まれる文字ch の個数'(_st,_ch,_何個). '文字列stの入力'(_st) :- write('文字列を入力して下さい : '), get_line(_st). '文字chの入力'(_ch) :- write('個数を数える文字を入力して下さい : '), get_char(_ch). '文字列st の中に含まれる文字ch の個数'(_st,_ch,_何個) :- count(sub_atom(_st,_,1,_,_ch),_何個). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/400 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): #  入力された数値が素数か否かを判定し,結果を画面に出力せよ.ただし # #  .襦璽很仁瓩鮖箸κ法 #  ∈撞⊇萢を使う方法 #  上記のどちらも使わない方法 # #  のいずれについても解答する事. # '入力された数値が素数か否かを判定し,結果を画面に出力する'(_数) :- 入力された数値が(_入力された数値), '素数か否かを判定し,結果を画面に出力する'(_入力された数値). 入力された数値が(_入力された数値) :- write('1以上の整数を入力して下さい : '), get_line(Line), 入力された数値診断(Line,_入力された数値),!. 入力された数値が(_入力された数値) :- 入力された数値が(_入力された数値). 入力された数値診断(Line,_入力された数値) :- atom_to_term(Line,_入力された数値,_), integer(_入力された数値), _入力された数値 >= 1,!. 入力された数値診断(Line,_入力された数値) :- writef('入力された %t からは1以上の整数が得られません。再入力をお願いします\n',[Line]), fail. '素数か否かを判定し,結果を画面に出力する'(_入力された数値) :- 素数(_入力された数値), writef('%tは素数です\n',[_入力された数値]),!. '素数か否かを判定し,結果を画面に出力する'(_入力された数値) :- \+(素数(_入力された数値)), writef('%tは素数ではありません\n',[_入力された数値]). 素数(_数) :- 約数の個数(_数,_約数の個数), _約数の個数 =< 2. 約数の個数(_数,_約数の個数) :- _数_1 is _数 - 1, count(( for(1,N,_数_1), 0 is _数 mod N)), _約数の個数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/383 # # # [1] 授業単元:プログラミング演習 # # [2] 問題文(含コード&リンク): # # # http://ime.nu/codepad.org/bMCs37CD # # 4): # 身体検査データを構造体配列として格納し、身長の平均値と視力の分布を求める # プログラムを作成する。身長検査データは標準入力からでもプログラムに記述でも # どちらでもいい。 # # 結果 平均身長 〇〇cm #    視力の分布 0.0〜:○人 #          0.1〜:○人(以下略 # # struct{ # # } '身体検査データを構造体配列として格納し、身長の平均値と視力の分布を求める' :- 身体検査データ(_身体検査データならび), 身長の平均値を求める(_身体検査データならび,_身長の平均値), 視力の分布を求める(_身体検査データならび,_度数分布). 結果を表示する(_身長の平均値,_度数分布). 身長の平均値を求める(_身体検査データならび,_身長の平均値) :- findavg(_身長,( append(_,[個人データ(氏名(_),身長(_身長),視力(_))|_],_身体検査データならび)), _身長の平均値). 視力の分布を求める(_身体検査データならび,_度数分布) :- length(_身体検査データならび,_標本数), findall([_階級下限,_階級上限,_度数,_比率],( '0.0から2.0まで0.1刻みの階級で'(_階級下限,_階級上限), 階級の度数(_階級下限,_階級上限,_度数), _比率 is _度数 / _標本数), _度数分布). '0.0から2.0まで0.1刻みの階級で'(_階級下限,_階級上限) :- '0.0から2.0まで0.1刻みの階級で'(0.0,0.1,_階級下限,_階級上限). '0.0から2.0まで0.1刻みの階級で'(_階級下限,_階級上限,_階級下限,_階級上限), _階級上限 =< 2.0. '0.0から2.0まで0.1刻みの階級で'(_階級下限_1,_階級上限_1,_階級下限,_階級上限) :- _階級上限_1 =< 2.0, _階級下限_2 is _階級下限_1 + 0.1, _階級上限_2 is _階級上限_1 + 0.1, '0.0から2.0まで0.1刻みの階級で'(_階級下限_2,_階級上限_2,_階級下限,_階級上限). 階級の度数(_階級下限,_階級上限,_度数) :- count(( append(_,[個人データ(氏名(_),身長(_),視力(_視力))|_],_身体検査データならび), _視力>=_階級下限, _視力< _階級上限), _度数). 結果を表示する(_身長の平均値,_度数分布) :- writef('平均身長 %8r cm\n視力の分布 ',[_身長の平均値]), append(_,[_階級下限,_,_度数,_]|R],_度数分布), 度数分布明細表示(_階級下限,_度数,R). R = []. 度数分布明細表示(_階級下限,_度数,[]) :- writef(' %4r 〜: %4r人\n',[_階級下限,_度数]),!. 度数分布明細表示(_階級下限,_度数,_) :- writef(' %4r 〜: %4r人\n ',[_階級下限,_度数]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/249 # # ・MySQL5です # ・テーブルデータ #  ID|名前|データ #  01|鈴木|0001 #  02|佐藤|0002 #  01|鈴木|0003 # ・欲しい結果 #  ID|名前|*|DATA1|DATA2 #  01|鈴木|2|0001 |0003 #  02|佐藤|1|0002 | # # ・説明:group by と count(*) を使うと↓のように、グループ化され消えてしまう列の値を(この場合`0003`の部分)、↑みたく、行に書出す方法はありますか? #  ID|名前|*|データ #  01|鈴木|2|0001 #  02|佐藤|1|0002 # # ・補足:IDは1~1400、count数は1~97、DATAは1~4000位あります。 # # 欲しい結果(_組) :- 欲しい結果(_組,_). 欲しい結果(_組,_残り鍵ならび) :- 鍵ならびを作る(_鍵ならび), 鍵データの収集(_鍵ならび,_組,_残り鍵ならび). 欲しい結果の表示 :- 欲しい結果(_組,_残り鍵ならび), concat_atom(_組,'|',_組表示文字列), writef('%t\n',[_組表示文字列]), _残り鍵ならび = []. 鍵ならびを作る(_鍵ならび) :- findsetof([_ID,_名前],( テーブルデータ(_ID,_名前,_データ)), _鍵ならび). 鍵データの収集(_鍵ならび,_既に処理した鍵ならび,_組,_残り鍵ならび) :- 一つ鍵を取り出し(_鍵ならび,_既に処理した鍵ならび,_鍵,_残り鍵ならび), 鍵に対応するデータならび(_鍵,_鍵に対応するデータならび), 組の構成(_鍵,_鍵に対応するデータならび,_組). 一つ鍵を取り出し(_鍵ならび,_既に処理した鍵ならび,_鍵,_残り鍵ならび) :- append(_既に処理した鍵ならび,[_鍵|_残り鍵ならび],_鍵ならび). 鍵に対応するデータならび(_鍵,_鍵に対応するデータならび) :- _鍵 = [_ID,_名前], findall(_データ,( テーブルデータ(_ID,_名前,_データ)), _鍵に対応するデータならび). 組の構成(_鍵,_鍵に対応するデータならび,_組) :- length(_鍵に対応するデータならび,_度数), append(_鍵,[_度数|_鍵に対応するデータならび],_組). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/147 # # 1] 授業単元: Cプロ # [2] 問題文(含コード&リンク):文字列st の中に含まれる文字ch の個数(含まれて # いなければ0 とする)を返す関数 # int str_chnum(const char st[], int ch) # を作成せよ. # 以下の実行例のように,関数の動作を確認 # できるmain 関数も作成して完成させよ # 【実行例】文字列を入力してください:Koukka # 検索する文字を入力してください:k # その文字は2 個含まれています。 # (注意)】scanf で文字列を入力させた後にgetchar 関 # 数で文字を入力させたい場合,getchar で文字を入力 # させる前に # scanf("%*c"); # などとして,バッファに残った改行コードを読み捨て # ておく必要がある. # # '文字列st の中に含まれる文字ch の個数を表示しなさい' :- 文字列の入力(_文字列), 検索文字の入力(_検索する文字), '文字列st の中に含まれる文字ch の個数(含まれていなければ0 とする)を返す'(_文字列,_検索する文字,_個数), writef('文字列 %t に文字 %t は %t個含まれています。\n',[_文字列,_検索する文字,_含まれる個数]). 文字列の入力(_文字列) :- write('文字列を入力しなさい : '), get_line(_文字列). 検索文字の入力(_検索する文字) :- write('検索する文字を入力しなさい : '), get_line(_文字列), sub_atom(_文字列,0,1,_,_検索する文字). '文字列の中に含まれる文字の個数(含まれていなければ0 とする)を返す'(_文字列,_検索する文字,_含まれる個数) :- count(sub_atom(_文字列,_1,_,_検索する文字),_含まれる個数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/221 # # DBMSはMysqlの5.0.87です。 # # +------+------------+---------+----------+ # | id   | product_id | assy_id | parts_id | # +------+------------+---------+----------+ # |    1 |          1 |      12 |        1 | # |    2 |          1 |      12 |        2 | # |    3 |          1 |      12 |        3 | # |    4 |          1 |      12 |        3 | # |    5 |          1 |      12 |        5 | # +------+------------+---------+----------+ # # 上記のテーブルで、product_id、assy_id、parts_idが同じレコードが2行以上有るものを抽出したいのです。 # 上記の例だとidが3と4のレコードになります。 # # # '上記のテーブルで、product_id、assy_id、parts_idが同じレコードが2行以上有るものを抽出する'(_id) :- findsetof([_product_id,_assy_id,_parts_id],( テーブル(_id,_product_id,_assy_id,_parts_id)), LL), append(_,[[_product_id,_assy_id,_parts_id]|_],LL), count(テーブル(_,_product_id,_assy_id,_parts_id),Count), Count >= 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/100 # # [1] 授業単元:C言語 # [2] 問題文 # 整数n(>=1)を入力し,nの約数の個数を返す関数int divisor(int)を用いてnが素数かどう # かを判定し,その結果を画面表示するプログラムを作成せよ. # '整数n(>=1)を入力し,nの約数の個数を返す述語を用いてnが素数かどうか判定する' :- '整数n(>=1)を入力し'(_n), 約数の個数(_n,_約数の個数), 素数かどうか判定する(_約数の個数,_判定), writef('%tは%t\n',[_n,_判定]). '整数n(>=1)を入力し'(_n) :- write('整数(>=1)を入力して下さい : '), get_line(Line), '整数n(>=1)を入力診断'(Line,_n),!. '整数n(>=1)を入力し'(_n) :- '整数n(>=1)を入力し'(_n). '整数n(>=1)を入力診断'(Line,_n) :- atom_to_term(Line,_n,_), integer(_n), _n >= 1,!. '整数n(>=1)を入力診断'(Line,_n) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '約数の個数'(_数,_約数の個数) :- _数_1 is _数 - 1, count(( for(1,N,_数_1), 0 is _数 mod N)), _約数の個数). 素数かどうか判定する(_約数の個数,素数です) :- _約数の個数 =< 2,!. 素数かどうか判定する(_約数の個数,素数ではない). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/196 # # PHPでMySQLかsqlite3を使おうと思っています。 # 表の先頭に新しい行を追加して、行の総数が指定した数(たとえば10)よりも多くなった場合は # 多くなった分を表の末尾から削除して行数を一定以上に増やさないようにしたいのですがどうすればいいですか? # ロケット鉛筆みたいに最大数が決まっていてはみ出たら押し出すみたいなことをしたいです。 # 表の先頭に追加して上限を超えたら最後尾から削除するんじゃなくて # 表の最後尾に追加して上限を超えたら先頭から削除するのでもいいです。 # どちらのほうが簡単かどうかもわかっていませんがよろしくお願いします。 # # '表の先頭に新しい行を追加して、行の総数が指定した数(たとえば10)よりも多くなった場合は多くなった分を表の末尾から削除して行数を一定以上に増やさないようにしたい'(_テーブル名,_行) :- length(_行,_列数), '表の先頭に新しい行を追加して'(_テーブル名,_行), '行の総数が指定した数(たとえば10)よりも多くなった場合は多くなった分を表の末尾から削除して'(10,_テーブル名,_列数). '表の先頭に新しい行を追加して'(_テーブル名,_行) :- P =.. [_テーブル|_組み], asserta(P),!. '行の総数が指定した数(たとえば10)よりも多くなった場合は多くなった分を表の末尾から削除して'(_限界数,_テーブル名,_列数) :- length(L,_列数), P =.. [_テーブル名|L], count(P,_現在の行数), '行の総数が指定した数(たとえば10)よりも多くなった場合は多くなった分を表の末尾から削除して'(_現在の行数,_限界数,_テーブル名,_列数). '行の総数が指定した数(たとえば10)よりも多くなった場合は多くなった分を表の末尾から削除して'(_現在の行数,_限界数,_テーブル名,_列数) :- _現在の行数 =< _限界数,!. '行の総数が指定した数(たとえば10)よりも多くなった場合は多くなった分を表の末尾から削除して'(_現在の行数,_限界数,_テーブル名,_列数) :- _現在の行数 > _限界数, 'retractしながら全行を回収する'(_テーブル名,_列数,_項ならび), 多くなった分を表の末尾から削除して(_限界数,_項ならび,_末尾を削除された項ならび), assertz_all(_末尾を削除されたこうならび). 'retractしながら全行を回収する'(_テーブル名,_列数,_項ならび) :- length(L1,_列数), P =.. [_テーブル名|L1], findall(P,retract(P),_項ならび),!. 多くなった分を表の末尾から削除して(_限界数,_項ならび,_末尾を削除された項ならび) :- length(L,_限界数), append(_末尾を削除された項ならび,_,_項ならび). assertz_all([]). assertz_all([_項|R]) :- assertz(_項), assertz_all(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/968 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):文字列st の中に含まれる文字ch の個数(含まれて # いなければ0 とする)を返す関数 # int str_chnum(const char st[], int ch) # を作成せよ.以下の実行例のように,関数の動作を確認 # 例.文字列を入力してください:Koukadai # 検索する文字を入力してください:a # その文字は2 個含まれています。 # # '文字列st の中に含まれる文字ch の個数(含まれていなければ0 とする)を返す'(_st,_ch,_文字の個数) :- count(sub_atom(_st,_,1,_,_ch),_個数). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(P,N) :- findsum(1,P,F), N is truncate(F) . findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0). sum([N|R],S) :- sum(R,S2), S is N + S2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/940 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # int型の2次元配列がある。このうち1つの変数に注目したとき、その変数の値と同じ値を持つ変数が # 上下左右に何個繋がっているかを返すプログラムを作成せよ。 # 例えば以下のような配列 int array[8][8];があるとき、 # 左下の1 (array[7][0])を指定した場合、「1」は5個繋がっていることになる。 # その右隣の3 (array[7][1])を指定した場合、「3」は3個繋がっていることになる。 # # 0 2 1 3 0 1 1 2 # 2 2 2 1 1 2 3 3 # 3 0 2 1 2 3 2 2 # 1 1 1 2 1 0 0 1 # 2 3 3 2 1 0 1 0 # 2 1 1 2 2 3 0 1 # 1 1 2 1 2 0 3 1 # 1 3 3 3 0 0 1 1 # # '行列の位置を指定してその位置の値と同じ値が上下左右に何個繋がっているかを返す'(LL,_行位置,_列位置,_度数) :- append(L1,[_列|R1],LL), length([_|L0],_行位置), append(L11,[_値|R11],_列), length([_|L11],_列位置), 上下左右に何個繋がっているか(なし,[L1,[_列|R1]],[L11,[_値|R11]],_度数). 上下左右に何個繋がっているか(_来た方向,[L1,[_列|R1]],[L11,[_値|R11]],_度数) :- 来た方向を取り除く(_方向,_方向ならび), 各方向の個数を集計する(_方向ならび,[L1,[_列|R1]],[L11,[_値|R11]],_度数_L), length(_度数_L,_度数). 各方向の個数を集計する([],_,_,[]) :- !. 各方向の個数を集計する各方向の個数を集計する([_方向|R],[L1,[_列|R1]],[L11,[_値|R11]],[_|_度数]) :- 連接する値(_方向,[L1,[_列|R1]],[L11,[_値|R11]],[L2,[_列2|R2]],[L22,[_値|R22]]), 上下左右に何個繋がっているか(_方向,[L2,[_列2|R2]],[L22,[_値2|R22]],_度数_1), 各方向の個数を集計する(R,[L1,[_列|R1]],[L11,[_値|R11]],_度数_2), append(_度数_1,_度数_2,_度数),!. 各方向の個数を集計する([_|R],[L1,[_列|R1]],[L11,[_値|R11]],_度数) :- 各方向の個数を集計する(R,[L1,[_列|R1]],[L11,[_値|R11]],_度数). 連接する値(上,[L1,[_列|R1]],[L2,[_値|R2]],[L11,[_上の列|[_列|R11]]],[L22,[_上の値|R22]]) :- append(L11,[_上の列],L1), length(L2,Len), append(L22,[_上の値|R22],_上の列), length(L22,Len),!. 連接する値(右,[L1,[_列|R1]],[L2,[_値|R2]],[L1,[_列|R1]],[L22,[_右の値|R22]]) :- append(L2,[_値],L22), [_右の値|R22] = R2,!. 連接する値(左,[L1,[_列|R1]],[L2,[_値|R2]],[L1,[_列|R1]],[L22,[_左の値|[_値|R2]]]) :- append(L22,[_左の値],L2),!. 連接する値(下,[L1,[_列|R1]],[L2,[_値|R2]],[L11,[_下の列|R11]],[L22,[_上の値|R22]]) :- length(L2,Len), append(L1,[_列],L11), [_下の列|R11] = R1, append(L22,[_上の値|R22],_下の列), length(L22,Len),!. 来た方向を取り除く(上,[上,右,左]) :- !. 来た方向を取り除く(右,[上,右,下]) :- !. 来た方向を取り除く(左,[上,左,下]) :- !. 来た方向を取り除く(下,[右,左,下]) :- !. 来た方向を取り除く(なし,[上,右,左,下]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/827 # # [1] 授業単元:モンテカルロ # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/foLSr # # 問題1. サイコロを10, 100 ,1000 ,10000 ,100000 回投げて分布を調べよ。 # 問題2. コイン投げも同様にして、Sn = X1 +....+ Xn のSn, そのmax,min を調べよ。 # 問題3.  面積 # ∫ 1 # 0 x^2 dx # をモンテカルロ法で求めよ。 # # 問題4. π の値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 'π の値をモンテカルロ法で求める'(_π の値) count(( for(1,N,10000), X is random(1000) / 1000, Y is random(1000) / 1000, ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y)), Count), _π の値 is Count / (10000 / 4). ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y) :- 1.0 >= _x * _x + _y * _Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/827 # # [1] 授業単元:モンテカルロ # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/foLSr # # 問題1. サイコロを10, 100 ,1000 ,10000 ,100000 回投げて分布を調べよ。 # 問題2. コイン投げも同様にして、Sn = X1 +....+ Xn のSn, そのmax,min を調べよ。 # 問題3.  面積 # ∫ 1 # 0 x^2 dx # をモンテカルロ法で求めよ。 # # 問題4. π の値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 'モンテカルロ法で積分区間0-1のx^2の値を求める'(_試行回数,_値) :- count(( between(1,_試行回数,_), X is random(1000), Y is random(1000),Y =< X * X), Count), _値 is Count / _試行回数. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/827 # # [1] 授業単元:モンテカルロ # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/foLSr # # 問題1. サイコロを10, 100 ,1000 ,10000 ,100000 回投げて分布を調べよ。 # 問題2. コイン投げも同様にして、Sn = X1 +....+ Xn のSn, そのmax,min を調べよ。 # 問題3.  面積 # ∫ 1 # 0 x^2 dx # をモンテカルロ法で求めよ。 # # 問題4. π の値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 'コイン投げも同様にして、Sn = X1 +....+ Xn のSn, そのmax,min を調べよ。'(_n,_分布ならび) :- findall([_回数,_Sn,_max,_min],( append(_,[_回数|_],[10,100,1000,10000,100000]), 'コインを指定された回数投げて_Sn,_max,_minを得る'(_回数,_n,_Sn,_Max,_Min)), _分布ならび). 'コインを指定された回数投げて_Sn,_max,_minを得る'(_回数,_n,_Sn,_Max,_Min) :- findall(_合計,( for(1,_,_回数), 'コインを_n回投げて表となった回数'(_n,_合計)), L), sum(L,_Sn), max(L,_max), min(L,_min). 'コインを_n回投げて表となった合計'(_n,_合計回数) :- count((for(1,_,_n),1 is random(2)),_合計回数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/113 # # 助けて下さい頭がパンクしそうです。 # # CARD # |CARDID|HOWMANYLEVEL| # |   1 |        | # |   2 |        | # # CARDLEVEL # |CARDID|LV1|LV2|LV3|LV4|LV5| # |   1 |0 | 0| 23 | 28 | 0|  # |   2 |0 | 0| 0 | 30 | 55| # |   1 |0 | 0| 25 | 29 | 0| # # CARDテーブルの HOWMANYLEVELに # CARDLEVELから0以外の個数を入れたいです。 # CARDLEVELのCARDIDは複数あります。 # # 'CARDテーブルの HOWMANYLEVELにCARDLEVELから0以外の個数を入れたいです。CARDLEVELのCARDIDは複数あります' :- 'CARD'(_CARDID,_), findall(Count,( 'CARDLEVEL'(_CARDID,_LV1,_LV2,_LV3,_LV4,_LV5), count(( member(LV,[_LV1,_LV2,_LV3,_LV4,_LV5]), \+(LV=0)), Count)), L), sum(L,_HOWMANYLEVEL), retract('CARD'(_CARDID,_)), assertz('CARD'(_CARDID,_HOWMANYLEVEL)), fail. 'CARDテーブルの HOWMANYLEVELにCARDLEVELから0以外の個数を入れたいです。CARDLEVELのCARDIDは複数あります'. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/761 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # 円1:x^2+y^2=r^2と円2:(x-r)^2+(y-r)^2=r^2が重なっている部分の面積を求めるプログラムを作成しなさい。 # ただしπ=3,14159とする。               # 'x^2+y^2=r^2と円2:(x-r)^2+(y-r)^2=r^2が重なっている部分の面積を求める'(_r,_重なっている部分の面積) :- count(( for(1,N,100000), _x is random(1001) / 1000, _y is random(1001) / 1000, 1.0 =< _x * _x + _y * _y), COUNT), _重なっている部分の面積 is _r * _r * ( 1 - 2 * COUNT / 100000). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/724 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # 標準入力に現れた行数と文字数をカウントするCプログラムline_count.cを書きなさい。 # 実行例は例えば次のようになります # $ ./line_count < testfile. txt # I am a student. # I have a programming C class. # # lines: 2 letters: 46 ← 欲しいのはこの2つの数字、つまり行数と文字数です. # $ # # [3.1] OS: unix # [3.2] コンパイラ名とバージョン: gcc # [3.3] 言語: C # [4] 期限:10月19日(出来れば早めにお願いします) # よろしくお願いします。 # 標準入力に現れた行数と文字数をカウントする :- get_char(Char), 標準入力に現れた行数と文字数をカウントする(Char,0,0,_行数,_文字数), writef('%t,%t\n',[_行数,_文字数]). 標準入力に現れた行数と文字数をカウントする(end_of_file,_行数,_文字数,_行数,_文字数). 標準入力に現れた行数と文字数をカウントする('\n',_行数_1,_文字数_1,_行数,_文字数) :- _行数_2 is _行数_1 + 1, get_char(Char), 標準入力に現れた行数と文字数をカウントする(Char,_行数_2,_文字数_1,_行数,_文字数),!. 標準入力に現れた行数と文字数をカウントする(Char,_行数_1,_文字数_1,_行数,_文字数) :- _文字数_2 is _文字数_1 + 1, get_char(Char2), 標準入力に現れた行数と文字数をカウントする(Char2,_行数_1,_文字数_2,_行数,_文字数),!. % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/968 # # # テーブル A: フィールド t, r # テーブル B: フィールド p, t # # テーブル B から p の値を指定して t の値を読み込みたいです。 # これだけなら select t from B where p = hoge で済むと思います。 # # さらに条件を追加して、テーブルAにおいて t の値がそれに等しいようなレコードの数が最小なものを選ぶにはどのようにすればよいでしょうか? # # 例えば # テーブルAが (0, 1), (0, 2), (0, 3), (1, 1), (1, 2) # テーブルBが (0, 0), (0, 1), (1, 0), (1, 1), ... # となっていたら # (0), (1) # ではなく # (1) # だけを得たいです。 # # 'テーブル A: フィールド t, r テーブル B: フィールド p, t テーブル B から p の値を指定して t の値を読み込み テーブルAにおいて t の値がそれに等しいようなレコードの数が最小なものを選ぶ'(_p,_t) :- findall([Count,_t],( 'B'(_p,_t), count('A'(_t,_r),Count)), L), min(L,[Count,_]), member([Count,_t],L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/941 # # DBMS : Mysql # # 説明 # データは10万件あると想定します。 # 挿入する際に一つのワードを二つのカラムに大して重複チェックを行いたいです。 # どちらか片方にそのワードが含まれていたらcountで0を返す結果が欲しいです。 # # select count(*) from table where colA = 'ワード' OR colB = 'ワード' # これだと現在2秒程度かかるので高速化したいです。 # # よろしくお願いします。 # # '挿入する際に一つのワードを二つのカラムに大して重複チェックを行いたいです。どちらか片方にそのワードが含まれていたらcountで0を返す結果が欲しい'(_ワード,_colA,_colB) :- 'どちらか片方にそのワードが含まれていたらcountで0を返す結果が欲しい'(_ワード,_colA,_colB), assertz(table(_colA,_colB)). 'どちらか片方にそのワードが含まれていたらcountで0を返す結果が欲しい'(_ワード,_colA,_colB) :- count(( table(_colA,_colB), どちらかに片方にワードが存在(_ワード,_colA,_colB,Count)), 0). どちらかに片方にワードが存在(_ワード,_ワード,_) :- !. どちらかに片方にワードが存在(_ワード,_,_ワード) :- !. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/900 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # C言語の乱数発生関数を使ってサイコロ関数  int dice( void ) を作成し、以下の統計的な性質を検証せよ。 # (1) 10,100,1000,1万回、10万回、100万回、1000万回、1億回の試行での 期待値(平均値)の変化 # (2)前記の試行回数での各数字の出目の確率 # (3)2つのサイコロを投げた時の11、22のようなぞろ目の確率 # レポートのグラフはExcelを用いる。 # '10,100,1000,1万回、10万回、100万回、1000万回、1億回の試行での 期待値(平均値)の変化' :- 試行回数での各数字の出目の確率(0,[0,0,0,0,0,0,0,0,0,0]). 試行回数での各数字の出目の確率(100000000,L) :- 各数字の出目の確率を表示する(100000000,L),!. 試行回数での各数字の出目の確率(N,L) :- member(N,[10,100,1000,10000,100000,1000000,10000000]), 各数字の出目の確率を表示する(N,L), fail. 試行回数での各数字の出目の確率(M,L1) :- _ランダム値 is random(10), ランダム値頻度の更新(_ランダム値,L1,L2), M2 is M + 1, 試行回数での各数字の出目の確率(M2,L2). ランダム値頻度の更新(N,L1,L2) :- append(L0,[M|R],L2), length(L0,N), M2 is M + 1, append(L0,[M2|R],L2),!. 各数字の出目の確率を表示する(N,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9]) :- writef('試行回数 %t :: '), append(L0,[_頻度|R],[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9]), length(L0,M), _確率 is _頻度 / N, writef('%t: %t,',[M,_確率]), R = [], write('\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/807 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/P8lye0BT # このプログラムを応用し、100以上200未満の乱数を10000回発生させ、各数値が何回乱数として発生したのかをcsv形式ファイルに出力し、結果をExcelのグラフを示しなさい。 # '100以上200未満の乱数を10000回発生させ、各数値が何回乱数として発生したのかをcsv形式ファイルに出力する'(_csvファイル) :- '100以上200未満の乱数を10000回発生させ'(L), 各数値が何回乱数として発生したのかをcsv形式ファイルに出力する(_csvファイル,L). '100以上200未満の乱数を10000回発生させ'(L) :- length(L,10000), findall(N,( append(_,[_|_],L), N is random(100)+100), L). 各数値が何回乱数として発生したのかをcsv形式ファイルに出力する(_csvファイル,L) :- open(_csvファイル,write,Outstream), 各数値が(N), 何回乱数として発生したのか(N,L,_何回), 出力する(Outstream,_何回), N = 199, write(Outstream,'\n'), close(Outstream). 各数値が(N) :- for(100,N,199). 何回乱数として発生したのか(N,L,_何回) :- count(member(N,L),_何回). 出力する(Outsteam,N) :- writef(Outstream,'%t,',[N]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/538 # # select *, tableid=1 from test # みたいに全てのカラムに加えてtableid=1を加えたものを取得したいのですが # どういうSQLかけばいいのでしょう? # *はidとnameが入ってるとしたらこんな感じのものを期待してます # # ++++++++++++++++++++ # + id + name + .tableid .+ # ++++++++++++++++++++ # + 1 .+ .加藤 +   1   + # ++++++++++++++++++++ # + 2 .+ .伊藤 +   1   + # ++++++++++++++++++++ # + 3 .+ .佐藤 +   1   + # ++++++++++++++++++++ # # 'select *, tableid=1 from test みたいに全てのカラムに加えてtableid=1を加えたものを取得する'(X) :- count(テーブル構造(_テーブル,_,_項目名),_項目数), length(L,_項目数), P =.. [_テーブル|L], call(P), append(L,['tableid=1'],X). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/616 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # ファイルの中に含まれる文字のエントロピーを計算したい。 # 次のように作りなさい。 # (a)文字をgetchar関数で1文字ずつ読み込み、その文字ciの出現頻度f(ci)をカウントする。 # (b)総文字数Sと出現頻度f(ci)から出現確立P(ci)を計算する関数を作成しなさい。 # P(ci)=1/S*f(ci)…(1) # S=Σf(ci)…(2) # i # (c)出現確立P(ci)からエントロピーHを計算する関数を作成しなさい。 # ただし、0log0=0とみなす。 # H=-ΣP(ci)log2(←底)P(ci)…(3) # fopenを使った場合は加点する。 # ファイル入出力を使わない場合は、リダイレクトを用いて標準入力から読み込む実行例を示すこと。 # また、すべての文字の出現頻度が同じであるファイルを作成し、 その時のエントロピーを示すこと。 # 下記のプログラム参照。 # # 続く # 一文字読み込んで出現頻度を計算する(_ファイル名,_出現頻度ならび,_出現確率ならび) :- open(_ファイル名,read,Instream), repeat, get_char(Instream,_文字), 一文字読み込んで出現頻度を計算する(Instream,_文字,1,[[_文字,1]],_総文字数,_文字の出現頻度ならび,_出現確率ならび), at_end_of_stream(Instream), close(Instream). 一文字読み込んで出現頻度を計算する(Instream,_文字,_総文字数,_文字の出現頻度ならび,_総文字数,_文字の出現頻度ならび,_出現確率ならび) :- 出現確率を計算する(_総文字数,_文字の出現頻度ならび,_文字の出現確率ならび), member([_文字,_出現頻度],_文字の文字の出現頻度ならび2), member([_文字,_出現確率],_出現確率ならび), writef('文字 = %t, 出現頻度 = %t, 出現確率 = %t\n',[_文字,_出現頻度,_出現確率]). 一文字読み込んで出現頻度を計算する(Instream,_,_総文字数1,_文字の出現頻度ならび1,_総文字数,_文字の出現頻度ならび) :- get_char(Instream,_文字), 出現頻度ならびの更新(_文字,_総文字数1,_文字の出現頻度ならび1,_総文字数2,_文字の出現頻度ならび2), 一文字読み込んで出現頻度を計算する(Instream,_文字,_総文字数2,_文字の出現頻度ならび2,_総文字数,_文字の出現頻度ならび). 出現頻度ならびの更新(_文字,_総文字数1,_文字の出現頻度ならび1,_総文字数2,_文字の出現頻度ならび2) :- append(L0,[[_文字,_出現頻度1]|R],_文字の出現頻度ならび1), _出現頻度2 is _出現頻度1 + 1, _総文字数2 is _総文字数1 + 1, append(L0,[[_文字,_出現頻度2]|R],_文字の出現頻度ならび2),!. 出現頻度ならびの更新(_文字,_総文字数1,_文字の出現頻度ならび1,_総文字数2,[[_文字,1]|_文字の出現頻度ならび1]) :- _総文字数2 is _総文字数1 + 1. 出現確率を計算する(_総文字数,[],[]) :- !. 出現確率を計算する(_総文字数,[[_文字,_出現頻度]|R2],[[_文字,_出現確率]|R3]) :- _出現確率 is _出現頻度 / _総文字数, 出現確率を計算する(_総文字数,R2,R2). 出現確率からエントロピーを計算する(_出現確率ならび,_エントロピー) :- 出現確率からエントロピーを計算する(_出現確率ならび,0.0,_エントロピー). 出現確率からエントロピーを計算する([],_エントロピー,_エントロピー) :- !. 出現確率からエントロピーを計算する([[_,_出現確率]|R],_エントロピーの一,_エントロピー) :- _エントロピーのニ is _エントロピーの一 - (log(_出現確率) / log(2) * _出現確率, 出現確率からエントロピーを計算する(R,_エントロピーのニ,_エントロピー). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/616 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # ファイルの中に含まれる文字のエントロピーを計算したい。 # 次のように作りなさい。 # (a)文字をgetchar関数で1文字ずつ読み込み、その文字ciの出現頻度f(ci)をカウントする。 # (b)総文字数Sと出現頻度f(ci)から出現確立P(ci)を計算する関数を作成しなさい。 # P(ci)=1/S*f(ci)…(1) # S=Σf(ci)…(2) # i # (c)出現確立P(ci)からエントロピーHを計算する関数を作成しなさい。 # ただし、0log0=0とみなす。 # H=-ΣP(ci)log2(←底)P(ci)…(3) # fopenを使った場合は加点する。 # ファイル入出力を使わない場合は、リダイレクトを用いて標準入力から読み込む実行例を示すこと。 # また、すべての文字の出現頻度が同じであるファイルを作成し、 その時のエントロピーを示すこと。 # 下記のプログラム参照。 # # 続く # 一文字読み込んで出現頻度を計算する(_ファイル名,_出現頻度ならび,_出現確率ならび) :- open(_ファイル名,read,Instream), repeat, get_char(Instream,_文字), 一文字読み込んで出現頻度を計算する(Instream,_文字,1,[[_文字,1]],_総文字数,_文字の出現頻度ならび,_出現確率ならび), at_end_of_stream(Instream), close(Instream). 一文字読み込んで出現頻度を計算する(Instream,_文字,_総文字数,_文字の出現頻度ならび,_総文字数,_文字の出現頻度ならび,_出現確率ならび) :- 出現確率を計算する(_総文字数,_文字の出現頻度ならび,_文字の出現確率ならび), member([_文字,_出現頻度],_文字の文字の出現頻度ならび2), member([_文字,_出現確率],_出現確率ならび), writef('文字 = %t, 出現頻度 = %t, 出現確率 = %t\n',[_文字,_出現頻度,_出現確率]). 一文字読み込んで出現頻度を計算する(Instream,_,_総文字数1,_文字の出現頻度ならび1,_総文字数,_文字の出現頻度ならび) :- get_char(Instream,_文字), 出現頻度ならびの更新(_文字,_総文字数1,_文字の出現頻度ならび1,_総文字数2,_文字の出現頻度ならび2), 一文字読み込んで出現頻度を計算する(Instream,_文字,_総文字数2,_文字の出現頻度ならび2,_総文字数,_文字の出現頻度ならび). 出現頻度ならびの更新(_文字,_総文字数1,_文字の出現頻度ならび1,_総文字数2,_文字の出現頻度ならび2) :- append(L0,[[_文字,_出現頻度1]|R],_文字の出現頻度ならび1), _出現頻度2 is _出現頻度1 + 1, _総文字数2 is _総文字数1 + 1, append(L0,[[_文字,_出現頻度2]|R],_文字の出現頻度ならび2),!. 出現頻度ならびの更新(_文字,_総文字数1,_文字の出現頻度ならび1,_総文字数2,[[_文字,1]|_文字の出現頻度ならび1]) :- _総文字数2 is _総文字数1 + 1. 出現確率を計算する(_総文字数,[],[]) :- !. 出現確率を計算する(_総文字数,[[_文字,_出現頻度]|R2],[[_文字,_出現確率]|R3]) :- _出現確率 is _出現頻度 / _総文字数, 出現確率を計算する(_総文字数,R2,R2). 出現確率からエントロピーを計算する(_出現確率ならび,_エントロピー) :- 出現確率からエントロピーを計算する(_出現確率ならび,0.0,_エントロピー). 出現確率からエントロピーを計算する([],_エントロピー,_エントロピー) :- !. 出現確率からエントロピーを計算する([[_,_出現確率]|R],_エントロピーの一,_エントロピー) :- _エントロピーのニ is _エントロピーの一 - (log(_出現確率) / log(2) * _出現確率, 出現確率からエントロピーを計算する(R,_エントロピーのニ,_エントロピー). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309527259/120 # # [1] 問題文(含コード&リンク):このスレで「◆QZaw55cn4cって」から始まる定形の書き込みの # 間隔を調べ、最短書き込み間隔と最長書き込み間隔を表示しなさい。 # [2] 環境 #  [2.1] 言語: C #  [2.2] OS: LINUX #  [2.3] コンパイラ名とバージョン: # [3] 回答希望期限:2011年7月8日 # # 'ログから書き込みの間隔を調べ、最短書き込み間隔と最長書き込み間隔を表示する' :- get_split_lines('http://codepad.org/nYthq5XX',[' ','/',':','.'],LL), findall([A,B,C,D,E,F],( member(L,LL), append(_,[A,B,C,D,E,F,_],L)), LL2), 日付間隔ならびを得る(LL2,_日付間隔ならび), max(_日付間隔ならび,_最長書き込み間隔), min(_日付間隔ならび,_最短書き込み間隔), 表示する(_最長書き込み間隔,_最短書き込み間隔),!. 日付間隔ならびを得る([_],[]) :- !. 日付間隔ならびを得る([[A1,B1,C1,D1,E1,F1],[A2,B2,C2,D2,E2,F2]|R1],[[_何日,_何時間,_何分,_何秒]|R2]) :- count(翌日(A1,B1,C1,A2,B2,C2,_,_,_),Count), 時分秒の補正(Count,D1,E1,F1,D2,E2,F2,_何日,_何時間,_何分,_何秒), 日付間隔ならびを得る([[A2,B2,C2,D2,E2,F2]|R1],R2). 時分秒の補正(Count,D1,E1,F1,D2,E2,F2,_何日,_何時間,_何分,_何秒) :- 秒に変換(D1,E1,F1,_秒1), 秒に変換(D2,E2,F2,_秒2), 時分秒の補正(_秒1,_秒2,Count,_何日,_何時間,_何分,_何秒). 時分秒の補正(_秒1,_秒2,_何日,_何日,_何時間,_何分,_何秒) :- _秒2 @>= _秒1, _秒数 is (_秒2 - _秒1), 秒数から時間の算出(_秒数,_何時間,_何分,_何秒),!. 時分秒の補正(_秒1,_秒2,Count,_何日,_何時間,_何分,_何秒) :- _秒2 < _秒1, _何日 is Count - 1, _秒数 is 38400 + (_秒2 - _秒1), 秒数から時間の算出(_秒数,_何時間,_何分,_何秒). 秒数から時間の算出(_秒数,_何時間,_何分,_何秒) :- _何時間 is _秒数 // 3600, S2 is S1 mod 3600, _何分 is S2 // 60, _何秒 is S2 mod 60,!. 表示する(_最長書き込み間隔,_最短書き込み間隔) :- writef('最長書き込み間隔は %t日 %t時間 %t分 %秒 です。\n',_最長書き込み間隔), writef('最短書き込み間隔は %t日 %t時間 %t分 %秒 です。\n',_最短書き込み間隔),!. % 翌日/9の定義は http://nojiriko.asia/prolog/c150_293.html 参照 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/143 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # 8 桁までの整数を表わす文字列(例: "-3246") を整数値(例: ?3246) に変換する関数を作りたい。各問いに答えよ。 # # 1. 整数を表わす文字列はつぎの条件を全て同時に満たすと考えられる。 # # (1) 文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である # (2) 文字列の2 文字目以降は’0’〜’9’ である # (3) 符号を除いた文字列の長さは1 以上8 以下である # # 文字列を引数とし、これらの条件を同時に満たす時に整数値1 を、一つでも満たさない時(整数と # して文字列にエラーがある場合) には0 を戻り値として返す関数check() を作れ。 # # 2. 変換したい文字列を引数とし、正負を判断して値が正または0 の時には1 を、負の時には?1 # を、整数として文字列にエラーがある場合には0 を返す関数sign() を作れ。 # # 3. 問1, 2 を利用して、8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す関数 # myatoi() を作成せよ。 # # myatoi(_文字列,_整数値) :- '8 桁までの整数を表わす文字列を引数とし、整数値に変換する'(_文字列,_整数値),!. '8 桁までの整数を表わす文字列を引数とし、整数値に変換する'(_文字列,_整数値) :- check(_文字列,1), sign(_文字列,_符号), atom_chars(_文字列,Chars), 数値部を得る(Chars,_数値部), _整数値 is _数値部 * _符号,!. check(_文字列,1) :- '文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である'(_文字列), '文字列の2 文字目以降は’0’〜’9’ である '(_文字列), '符号を除いた文字列の長さは1 以上8 以下である'(_文字列),!. check(_,0). '文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である'(_文字列) :- append(_,[A|_],['+','-']), subatom(_文字列,0,1,_,A),!. '文字列の2 文字目以降は’0’〜’9’ である '(_文字列) :- sub_atom(_文字列,1,_,0,_副文字列), count(sub_atom(_副文字列,_,1,_,_文字), _文字 @>= '0', _文字 @=< '9'),Count), sub_atom(_副文字列,0,Count,0,_副文字列),!. '符号を除いた文字列の長さは1 以上8 以下である'(_文字列) :- sub_atom(_文字列,1,Len,0,_文字列), Len >= 1, Len =< 8,!. sign(_文字列,1) :- '変換したい文字列を引数とし、正負を判断して値が正または0 の時には1'(_文字列),!. sign(_文字列,-1) :- '変換したい文字列を引数とし、正負を判断して値が負の時には-1'(_文字列),!. '変換したい文字列を引数とし、正負を判断して値が正または0 の時には1'(_文字列) :- sub_atom(_文字列,0,1,_,_文字), append(_,[_文字|_],['+','-','0','1','2','3','4','5','6','7','8','9']),!. '変換したい文字列を引数とし、正負を判断して値が負の時には-1'(_文字列) :- sub_atom(_文字列,0,1,_,'-'),!. 数値部を得る([],1,0) :- !. 数値部を得る(['+'|R],M,N) :- 数値部を得る(R,M,N),!. 数値部を得る(['-'|R],M,N) :- 数値部を得る(R,M,N),!. 数値部を得る([_文字|R],M,N) :- 数値部を得る(R,M1,N1), 文字数値変換(_文字,N2), M is M1 * 10, N is N2 * M + N1. 文字数値変換('0',0). 文字数値変換('1',1). 文字数値変換('2',2). 文字数値変換('3',3). 文字数値変換('4',4). 文字数値変換('5',5). 文字数値変換('6',6). 文字数値変換('7',7). 文字数値変換('8',8). 文字数値変換('9',9). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/374 # # [2]下記のプログラムにおいて,numcountは,値が0 〜M -1 の範囲の大きさN のint型の配列を引数として渡されると(ただし,M, N は正の整数),同じ値が複数ある時はそれを1 個とみなしてその配列中の数の # 個数を返す関数である.例えば,配列の値を7, 4, 8, 2, 4, 6, 1, 6, 4, 5 とすると, # (ダブリを省くと) この中には,7, 4, 8,2, 6, 1, 5 の7 個があるので,関数numcountは7 を返す. 重複を取り除いた要素の個数(_ならび,_重複を取り除いた要素の個数) :- count((append(L0,[A|R],_ならび),\+(member(A,L0))),_重複を取り除いた要素の個数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/310 # # C++の入ったパソコンが先ほど壊れてしまったので御助力お願いします。 # 急なことで時間が全くありません。本当に申し訳ないです・・・ # # [1] 授業単元: 確率統計学 # [2] 問題文(含コード&リンク): # 10個のサイコロを同時に振り、1の目が出る確率を求める。ただし、回数は100、1000、10000、100000と変化させ、確率と誤差を求めよ。 # これは、完成済みで結果の出力のみお願います。また、エラーが出た場合は御助力をお願いします。 # http://codepad.org/jZHx7pfy # '10個のサイコロを同時に振り1の目が出る確率を求める'(Max,_1の目の出る確率) :- '1の目が出る確率を求める'(Max,_1の目の出る確率). '1の目が出る確率を求める'(Max,_1の目の出る確率) :- '1の目の総数'(1,Max,_1の目の総数), _1の目の出る確率 is _1の目の総数 / (Max * 10). '10個のサイコロを同時に振り'(L) :- length(L,10), findall(N,( append(_,[_|_],L), N is random(6) + 1), L). '1の目の総数'(_回数,_限界回数,0) :- _回数 > _限界回数,!. '1の目の総数'(_回数,_限界回数,X) :- '10個のサイコロを同時に振り'(L), count(member(1,L),Count), _回数_2 is _回数 + 1, '1の目の総数'(_回数_2,_限界回数,Y). X is Count + Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/293 # # 【1】c言語 【2】二つの西暦で入力された年月日から、その間の日数を計算するプログラムを作成してください。 # ここに処理が入る というとこのプログラムをお願いします # プログラムのベース # int uruu(int y); # int monthday(int y, int m); # //---------------------------------------------------- # int main(){ # int year_a, month_a, day_a; # int year_b, month_b, day_b; # int days; # int i; # days = 0; # printf("日数計算プログラム\n"); # printf("数え始める西暦年月日を入力してください\n"); # scanf("%d,%d,%d",&year_a, &month_a, &day_a); # printf("数え終わる西暦年月日を入力してください\n"); # scanf("%d,%d,%d",&year_b, &month_b, &day_b); # ここに処理が入いる # printf("%d年%d月%d日から%d年%d月%d日までの日数は%d日です。\n", year_a, month_a, day_a, year_b, month_b, day_b, days); # return 0; } # //うるう年ならtrue(1)、そうでないならfalse(0)を返す関数 # int uruu(int y){ # int ret; # ここに処理が入る # return ret; } # //年、月を受け取り、その月の日数を返す関数 # int monthday(int y, int m){ # int d; # ここに処理が入る # return d; } # # '二つの西暦で入力された年月日から、その間の日数を計算する' :- 起点年月日の入力(_起点年,_起点月,_起点日), 終点年月日の入力(_終点年,_終点月,_終点日), count(翌日(_起点年,_起点月,_起点日,_終点年,_終点月,_終点日,_,_,_),_日数), writef('日数は %t です。\n',[_日数]). 起点年月日の入力(_起点年,_起点月,_起点日) :- write('起点となる年を入力してください : '), get_integer(_起点年), write('起点となる月を入力してください : '), get_integer(_起点月), write('起点となる日を入力してください : '), get_integer(_起点日),!. 終点年月日の入力(_終点年,_終点月,_終点日) :- write('終点となる年を入力してください : '), get_integer(_終点年), write('終点となる月を入力してください : '), get_integer(_終点月), write('終点となる日を入力してください : '), get_integer(_終点日),!. 翌日(_集点年,_終点月,_終点日,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日) :- !,fail. 翌日(_年,_月,_日,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日) :- 月末日の翌日(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日). 翌日(_年,_月,_日,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日) :- 月末日ではない日の翌日(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日). 翌日(_年,_月,_日,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日) :- 月末日の翌日(_年,_月,_日,_翌日の年_1,_翌日の月_1,_翌日の日_1), 翌日(_翌日の年_1,_翌日の月_1,_翌日の日_1,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日). 翌日(_年,_月,_日,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日) :- 月末日でないない日の翌日(_年,_月,_日,_翌日の年_1,_翌日の月_1,_翌日の日_1), 翌日(_翌日の年_1,_翌日の月_1,_翌日の日_1,_終点年,_終点月,_終点日,_翌日の年,_翌日の月,_翌日の日). 月末日の翌日(_年,2,28,_年,2,29) :- うるう年(_年),!. 月末日の翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 月末日の翌日(_年,12,31,_年_2,1,1) :- _年_2 is _年 + 1,!. 月末日の翌日(_年,_月,31,_年,_月_2,1) :- _月_2 is _月 + 1,!. 月末日の翌日(_年,_月,30,_年,_月_2,1) :- member(_月,[4,6,9,11]),!. 月末日ではない日の翌日(_年,_月,_日,_年,_月,_日_2) :- _日_2 is _日 + 1,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/257 # # [2]下記のプログラムにおいて,numcountは,値が0 〜M -1 の範囲の大きさN のint型の配列を引数として渡されると(ただし,M, N は正の整数),同じ値が複数ある時はそれを1 個とみなしてその配列中の数の # 個数を返す関数である.例えば,配列の値を7, 4, 8, 2, 4, 6, 1, 6, 4, 5 とすると,(ダブリを省くと) この中には,7, 4, 8,2, 6, 1, 5 の7 個があるので,関数numcountは7 を返す. # これは,例えば,0 〜M -1 の範囲でどんな数が出てきたかをチェックしておき(ヒント: 大きさM のint型の配列を用い,最初はすべて0に初期化しておき,数iが現れたら,そのi番目を1にすればよい), # 最後に1度でも出てきたものを数えれば求めることができる.関数numcountを,下記のプログラムの/* INSERT HERE */の部分に挿入できるように書け.(提出はプログラム全体) # # #include <stdio.h> # #define M 10 /* 適当な正整数(数の範囲が0 〜M -1) */ # #define N 10 /* 適当な正整数(入力する数の個数)*/ # /* INSERT HERE */ # intmain(void) # { # inti, a[N]; # /* a[0]〜a[N-1] の値を入力する*/ # for(i= 0; i< N; i++) { # printf("a[%1d] = ? ", i); # scanf("%d", &a[i]); # } # printf("numcount= %3d\n", numcount(a)); # return 0; # } # # '同じ値が複数ある時はそれを1 個とみなしてならびの数の個数を返す'(M,N,_ならび,_個数) :- ランダムに値を入力(M,N,_ならび), '同じ値が複数ある時はそれを1 個とみなしてならびの数の個数を返す'(M,_ならび,_個数). '同じ値が複数ある時はそれを1 個とみなしてならびの数の個数を返す'(M,_ならび,_個数) :- length(L,M), 出現検査(_ならび,L), 値の存在する個数を調べる(L,_個数). 出現検査([],L) :- !. 出現検査([I|R],L) :- length(L0,I), append(L0,[V|_],L), V = 1, 出現検査(R,L). 値の存在する個数を調べる(L,_個数) :- 値の存在する個数を調べる(L,[],_個数). 値の存在する個数を調べる([],L,_個数), length(L,_個数),!. 値の存在する個数を調べる([V|R1],L,_個数) :- \+(var(V)), 値の存在する個数を調べる(R1,[_|L],_個数). 値の存在する個数を調べる([V|R1],L,_個数) :- var(V), 値の存在する個数を調べる(R1,L,_個数). ランダムに値を入力(M,N,_ならび) :- length(_ならび,N), findall(V,( append(_,[_|_],_ならび), V is random(M)), _ならび). ?- 'a##'. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/290 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): #   逆ポーランド記法の電卓を実装をする #   なお、電卓の条件は以下です # 条件及び動作例:http://www.dotup.org/uploda/www.dotup.org1758622.txt.html # # 条件 # ・入力はコンソールでする # ・数式の終わりは;を入力 # ・数式は後置記法で入力 # ・数値計算はdouble型可能な範囲 # ・演算は、四則演算及びsqr (2乗を求める関数)とする。 # ・スタック、キュー、木構造のいずれか(または複数)を利用すること。 #  なお、これらのデータ構造の実装にはポインタを使うこと。 # ・自由拡張 #  ・前置記法で書かれた数式(文字列)を後置記法に変換する関数を作成せよ。 #   また、この関数を用いて、前置記法で書かれた数式に対する電卓を実現 #  ・ユーザ入力ミスの対応と説明文の表示 # # 動作例 # % ./a.out # 5.1 3 + ; # 8.10000 # 2 4 * ; # 8.00000 # 8 sqr ; # 64.00000 # quit # % □ 逆ポーランド記法の電卓を実装をする :- 逆ポーランド記法の電卓を実装をする([]). 逆ポーランド記法の電卓を実装をする(_スタック_1) :- 入力(_逆ポーランド式), \+(_逆ポーランド式=quit), sPLIT(_逆ポーランド式,[+,-,*,/,sqr],L), 式をスタックにプッシュする(L,_スタック_1,_スタック_2), 演算評価(_スタック2,_スタック3), _スタック_3 = [_答え|_], writef('%t\n',[_答え]), 逆ポーランド記法の電卓を実装をする(_スタック_3). 逆ポーランド記法の電卓を実装をする(_スタック_1). 演算評価([],[]) :- !. 演算評価([-|R1],[C|R2]) :- 演算評価(R1,[A,B|R2]), C is A - B,!. 演算評価([+|R1],[C|R2]) :- 演算評価(R1,[A,B|R2]), C is A + B,!. 演算評価([*|R1],[C|R2]) :- 演算評価(R1,[A,B|R2]), C is A * B,!. 演算評価([/|R1],[C|R2]) :- 演算評価(R1,[A,B|R2]), C is A / B,!. 演算評価([sqr|R1],[C|R2]) :- 演算評価(R1,[A|R2]), C is A * A,!. 演算評価([V|R1],[V|R2]) :- number(V), 演算評価(R1,R2). 式をスタックにプッシュする([],_スタック,_スタック) :- !. 式をスタックにプッシュする([' '|R],_スタック_1,_スタック_2) :- 式をスタックにプッシュする(R,_スタック_1,_スタック_2). 式をスタックにプッシュする([A|R],_スタック_1,_スタック_2) :- 式をスタックにプッシュする(R,[A|_スタック_1],_スタック_2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/188 # # [1] 授業単元: 演算子 # # [2] 問題文: 変数の下位16ビット中の 1 のビット数を数える関数 int bit_count(int x) を作成し、それを用いて実際に 1 のビット数を数えて、その値を出力するプログラムを作成せよ。 # '1 のビット数を数えて、その値を出力する'(_整数) :- _整数_1 is _整数 // 2, _整数_2 is _整数 mod 2, bit_count(_整数_1,_1ビット数_1), bit_count(_整数_2,_1ビット数_2), Count is _1ビット数_1 + _1ビット数_2, writef('1ビット数の数は %t です。\n',[Count]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/184 # # [1] 授業単元: 演算子 # # [2] 問題文: 変数の下位16ビット中の 1 のビット数を数える関数 int bit_count(int x) を作成せよ。 # bit_count(_整数,_1ビット数) :- '変数の下位16ビット中の 1 のビット数を数える'(_整数,_1ビット数). '変数の下位16ビット中の 1 のビット数を数える'(_整数,_1ビット数) :- _整数_1 is _整数 mod 0x10000, '1 のビット数を数える'(_整数_1,Count). '1 のビット数を数える'(0,0) :- !. '1 のビット数を数える'(1,1) :- !. '1 のビット数を数える'(N,X) :- N_1 is N // 2, M is N mod 2, '1 のビット数を数える'(M,Y), X is Y + N_1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/166 # # [1] 授業単元:C言語 # [2] 問題文:コンソールから2つの数(数1,数2とする)を入力する.ただし,数1は複数の桁の整数で,数2は1桁の数であるとする. # 数1が数2の倍数のときには,数1が数2の倍数である旨を表示し,そうでない場合は,数1が数2の倍数では無い旨,教示する. # そして,数1に含まれる,数字としての数2の個数を数え,結果をコンソールに出力させる. # 以上を4つの関数で構成されるプログラムとして作成せよ. # # 実行例 # 数1を入力して下さい 23242 ←キーボードから23242と入力 # 数2を入力して下さい 2 ←キーボードから2と入力 # 23242は2の倍数です # 23242に含まれる2の数字は3個です # # 数1を入力して下さい 323 # 数2を入力して下さい 3 # 323は3の倍数ではありません # 323に含まれる3の数字は2個です # お願いします # # <仕様> # プログラムを以下の関数で構成する. # 数1が数2の倍数であるか否かの判定の関数 # ・引数:数1, 数2(いずれもint型) # ・戻り値:0または1(いずれもint型) # 0…数1は数2の倍数ではない # 1…数1は数2の倍数 # 数1に含まれる数字としての数2の個数を数える関数 # ・引数:数1, 数2(いずれもint型) # ・戻り値:数えた結果の個数(int型) # 数1, 数2にまつわる分析を行う関数 # ・引数:数1, 数2(いずれもint型) # ・戻り値:分析結果…2桁の整数 # 1の位 :数1に含まれる数2の数字の個数 # 10の位:数1が数2の倍数か否か(0:非倍数,1:倍数)) # main関数. # ・数1, 数2をキーボードから入力する # ・上記の分析関数を呼び出す # ・下記の分析結果を表示する. # 数1が数2の倍数か否か # 数1に含まれる数2の数字の個数 # 関数 銑の名称やソースプログラム内の位置は任意で良い. # # 'コンソールから2つの数(数1,数2とする)を入力する.ただし,数1は複数の桁の整数で,数2は1桁の数であるとする'(_数1,_数2) :- '数1を入力する。ただし,数1は複数の桁の整数であるとする'(_数1), '数2を入力する。ただし,数2は1桁の数であるとする'(_数2). '数1を入力する。ただし,数1は複数の桁の整数であるとする'(_数1) :- write('数1を入力してください(複数の桁の整数) : '), get_line(Line), 'ただし,数1は複数の桁の整数であるとする'(Line,_数1),!. '数1を入力する。ただし,数1は複数の桁の整数であるとする'(_数1) :- '数1を入力する。ただし,数1は複数の桁の整数であるとする'(_数1). 'ただし,数1は複数の桁の整数であるとする'(Line,_数1) :- atom_to_term(Line,_数1,_), integer(_数1), _数1 > 9,!. 'ただし,数1は複数の桁の整数であるとする'(Line,_) :- writef('入力された %t から複数桁の整数が得られません。再入力をお願いします。\n',[Line]), fail. '数2を入力する。ただし,数2は1桁の数であるとする'(_数2) :- write('数2を入力してください(1桁の整数) : '), get_line(Line), 'ただし,数2は1桁の数であるとする'(Line,_数2),!. '数2を入力する。ただし,数2は1桁の数であるとする'(_数2) :- '数2を入力する。ただし,数2は1桁の数であるとする'(_数2). 'ただし,数2は1桁の数であるとする'(Line,_数2) :- atom_to_term(Line,_数2,_), integer(_数2), _数2 >= 0, _数2 =< 9,!. 'ただし,数2は1桁の数であるとする'(Line,_) :- writef('入力された %t から1桁の数が得られません。再入力をお願いします。\n',[Line]), fail. '数1が数2の倍数のときには,数1が数2の倍数である旨を表示し,そうでない場合は,数1が数2の倍数では無い旨,教示する'(_数1,_数2,_教示) :- '数1が数2の倍数のときには,数1が数2の倍数である旨を表示し'(_数1,_数2,_教示),!. '数1が数2の倍数のときには,数1が数2の倍数である旨を表示し,そうでない場合は,数1が数2の倍数では無い旨,教示する'(_数1,_数2,_教示) :- '数1が数2の倍数でない場合は、数1が数2の倍数では無い旨,教示する'(_数1,_数2,_教示),!. '数1が数2の倍数のときには,数1が数2の倍数である旨を表示し'(_数1,_数2,数1が数2の倍数である) :- _数1 is _数2 * 2. '数1が数2の倍数でない場合は、数1が数2の倍数では無い旨,教示する'(_数1,_数2,数1が数2の倍数では無い) :- \+(_数1 is _数2 * 2). '数1に含まれる,数字としての数2の個数を数え,結果をコンソールに出力させる'(_数1,_数2,_数1に含まれる数2の個数) :- '数1に含まれる,数字としての数2の個数を数え'(_数1,_数2,_数1に含まれる数2の個数), 結果をコンソールに出力させる(_数1に含まれる数2の個数). '数1に含まれる,数字としての数2の個数を数え'(_数1,_数2,_数1に含まれる数2の個数) :- number_chars(_数1,L1), number_chars(_数2,L2), count(append(_,L2,_,L1),_数1に含まれる数2の個数), 結果をコンソールに出力させる(_数1に含まれる数2の個数) :- writef('数1には数2の数が%t個含まれます。\n',[_数1に含まれる数2の個数]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/108 # # 以下のCのプログラム "test.c" から # 電話番号情報を抜き取り述語 電話帳/2 を定義しなさい。 # 電話番号はperson型の構造体 telbook として定義されている。 # # #include <stdio.h> # #include <string.h> # #define MAX 100 # struct person { # char name[MAX]; # char telno[MAX]; # }; # int search(struct person telbook[], int n, char *name) # { # /* ... */ # } # int main(void) # { # char name[MAX]; # struct person telbook[] = # { {"Taro", "090-111-1111"}, # {"Hanako", "090-222-2222"}, # {"Ichiro", "090-333-3333"}, # {"Jiro", "090-444-4444"}, # {"Hanayo", "090-555-5555"} }; # int n = 5; /* 電話帳に登録された人数 */ # int idx; # # printf("名前 > "); scanf("%s", name); # idx = search(telbook, n, name); # if (idx < 0) { # printf("該当者なし\n"); # } else { # printf("%s\n", telbook[idx].telno); # } # return 0; # } # # 'Cのプログラム "test.c" から電話番号情報を抜き取り述語 電話帳/2 を定義する' :- get_lines('test.c',Lines), telbookを捜す(Lines,R), 電話帳を定義する(R). telbookを捜す(Lines,R) :- append(L0,[_行|R],Lines), sub_atom(_行,_,_,_,'struct person telbook[];'),!. 電話帳を定義する(Lines) :- append(_,[_行|R],Lines), split(_行,[' ','{','"','}'],[_名前,_電話番号]), assertz(電話帳(_名前,_電話番号)), '}が2回出現'(R),!. '}が2回出現'([_行|_]) :- count(sub_atom(_行,_,1,_,'}'),2),!. '}が2回出現'([]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/945 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # strcmp()を利用し、input.txtを読み込み、キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力するプログラムを作成しなさい。 # 'input.txtを読み込み、キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力する' :- 'input.txtを読み込み'(LL), キーボードから英単語を1つ入力し(_英単語), 英単語から何個含まれるか(LL,_英単語,_何個), writef('英単語%tはinput.txtに%t個含まれる\n',[_英単語,_何個]). 'input.txtを読み込み'(LL) :- see('input.txt'), readln(X,_終了状態), 'input.txtを読み込み'(X,_終了状態,LL), seen. 'input.txtを読み込み'(_,end_of_file,[]) :- !. 'input.txtを読み込み'(L,_,[L|R]) :- readln(L2,_終了状態2), 'input.txtを読み込み'(L2,_終了状態2,R). キーボードから英単語を1つ入力し(_英単語) :- get_line(_英単語),!. 英単語から何個含まれるか(LL,_英単語,_何個) :- flatten(LL,L), count(member(_英単語,L),_何個). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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. % split/3の定義 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/929 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # strcmp()を利用し、../test/read.cgi/tech/1307166756/904で利用したものと同様のimput.txtを読み込む。 # キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力するプログラムを作成しなさい。 # 'キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力するプログラムを作成しなさい' :- 'キーボードから英単語を1つ入力し'(_英単語), 'その単語が、input.txtに何個含まれるかを出力する'(_英単語). 'キーボードから英単語を1つ入力し'(_英単語) :- get_line(_英単語). 'その単語が、input.txtに何個含まれるかを出力する'(_英単語) :- 'input.txtを読み込む'(LL), 何個含まれるか(LL,_英単語,_何個), 出力する(_英単語,_何個). 'input.txtを読み込む'(LL) :- see('input.txt'), readln(X,_終了状態), 'input.txtを読み込む'(X,_終了状態,LL), seen,!. 'input.txtを読み込む'(_,end_of_file,[]) :- !. 'input.txtを読み込む'(A,_,[A|R]) :- readln(B,_終了状態2), 'input.txtを読み込む'(B,_終了状態2,R). 何個含まれるか(LL,_英単語,_何個) :- flatten(LL,L), count(member(_英単語,L),_何個). 出力する(_英単語,_何個) :- writef('%t はinput.txt中に %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. % split/3の定義 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/908 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # strcmp()を利用し、../test/read.cgi/tech/1307166756/904で利用したものと同様のimput.txtを読み込む。 # キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力するプログラムを作成しなさい。 # 'キーボードから英単語を1つ入力し、その単語が、input.txtに何個含まれるかを出力する' :- 'キーボードから英単語を1つ入力し'(_英単語), 'その単語が、input.txtに何個含まれるかを出力する'(_英単語). 'キーボードから英単語を1つ入力し'(_英単語) :- get_line(_英単語). 'その単語が、input.txtに何個含まれるかを出力する'(_英単語) :- 'その単語が、input.txtに何個含まれるか'(_英単語,_何個), 出力する(_英単語,_何個). 'その単語が、input.txtに何個含まれるか'(_英単語,_何個) :- get_chars('input.txt',Chars), concat_atom(Chars,S), split(S,[' ','\n'],_単語ならび), count(member(_英単語,_単語ならび),_何個). 出力する(_英単語,_何個) :- writef('単語 %t は %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. % split/3の定義 % 以下のサイトは # 出典:: 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/891 # # [1] C言語演習 # [2] http://ime.nu/codepad.org/Qbz0E2cP を改良して、 # 「乗除」の回数を減らすプログラムを作成しなさい。 # ただし、http://ime.nu/codepad.org/ko7MPFKI 以外の方法を使用すること。 # ,離廛蹈哀薀爐鰺用して、以下のプログラムを作成せよ。 # 1.各素数の各桁の和が偶数になる数のみを表示するプログラム # 2.表示されている1の個数を表示するプログラム # [3.1] Windows7 # [3.3] C言語 # [4] 今日の21時まで # [5]配列まで # ,呂匹里茲Δ砲靴堂鷽瑤鮓困蕕靴燭も教えていただけると幸いです。 # どうかよろしくお願いします。 # # :- dynamic(階乗保存計算/2). 表示されている1の個数を表示する :- '1000未満の素数ならび'(_素数ならび), concat_atom(_素数ならび,' ',_素数ならび表示), writef('%t\n',[_素数ならび表示]), 表示されている1の個数を表示する(_素数ならび). 表示されている1の個数を表示する(_素数ならび) :- 表示されている1の個数を表示する(_素数ならび,_1の個数), writef('数字列に含まれる1の個数は %t 個です。\n',[_1の個数]). 表示されている1の個数を表示する([],0) :- !. 表示されている1の個数を表示する([N|R],_個数) :- number_chars(N,Chars), count(member('1',Chars),_個数1), 表示されている1の個数を表示する(R,_個数2) _個数 is _個数1 + _個数2,!. '1000未満の素数ならび'(_素数ならび) :- '1000未満の素数ならび'(5,[2,3],_素数ならび). '1000未満の素数ならび'(1000,_素数ならび,_素数ならび) :- !. '1000未満の素数ならび'(N,L1,_素数ならび) :- 奇数(N), 既に計算済みの素数では割り切れない(N,L1), L1 = [M|_], ウィルソンの定理による素数判定(N,素数です), N2 is N + 1, '1000未満の素数ならび'(N2,[N|L1],_素数ならび). '1000未満の素数ならび'(N,L1,_素数ならび) :- N2 is N + 1, '1000未満の素数ならび'(N2,L1,_素数ならび). 既に計算済みの素数では割り切れない(N,[]) :- !. 既に計算済みの素数では割り切れない(N,[M|R]) :- 0 is N mod M,!, fail. 既に計算済みの素数では割り切れない(N,[M|R]) :- 既に計算済みの素数では割り切れない(N,R). ウィルソンの定理による素数判定(X,素数です) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), 0 is (Z + 1) mod X,!. ウィルソンの定理による素数判定(X,素数ではありません) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), \+(0 is (Z + 1) mod X),!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). 奇数(N) :- 1 is N mod 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/843 # # [1] 授業単元:文字列 # [2] 問題文(含コード&リンク): # ファイルinput.txtに、1行最大80文字で空白を挟みながら、英数字が記載されている。 # このinput.txtを読み込み、その中に含まれるアルファベット・数字の各文字が何文字ずつあるかを表示するプログラムを作りなさい # 'ファイルinput.txtに、1行最大80文字で空白を挟みながら、英数字が記載されている。このinput.txtを読み込み、その中に含まれるアルファベット・数字の各文字が何文字ずつあるかを表示する' :- 'このinput.txtを読み込み'(Chars), 'その中に含まれるアルファベット・数字の各文字が何文字ずつあるか'(Chars,L), 表示する(L). 'このinput.txtを読み込み'(Chars) :- get_chars('input.txt',Chars),!. その中に含まれるアルファベット・数字の各文字が何文字ずつあるか(Chars,L) :- 'アルファベット・数字'(Alphabets), setof(Char,( member(Char,Chars), member(Char,Alphabets)), L1), findall([Char,Count],( member(Char,L1), count(member(Char,Chars),Count)), L),!. 表示する(L) :- append(_,[[_文字,_出現数]|R],L), writef('文字 %t %t回\n',[_文字,_出現数]), R = []. 'アルファベット・数字'(Chars) :- findall(Char1,( for(65,N1,90), char_code(Char1,N1)), L1), findall(Char2,( for(97,N2,122), char_code(Char2,N1)), L2), findall(Char3,( for(48,N3,57), char_code(Char3,N3)), L3), append(L1,L2,L4), append(L4,L3,Chars),!. % 以下のサイトは # 出典:: 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',!. % 以下のサイトは # # I need to write a small Prolog program to count the number of occurrence # of each element in a list. # # numberOfRepetition(input, result) # For example: # # numberOfRepetition([a,b,a,d,c,a,b], X) # can be satisfied with X=[a/3,b/2,d/1,c/1] because a occurs three times, # b occurs 2 times and c and d one time. numberOfRepetition(_input,_result) :- setof(A,member(A,_input),L1), findall(B/Count,( member(B,L1), count(B,_input,Count)), _result). count(A,[],0). count(A,[A|R],X) :- count(A,R,Y), X is Y + 1. count(A,[_|R],X) :- count(A,R,X). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/589 # # [1] C言語演習 # [2] for文を使用して以下のプログラムを作成せよ。 #    0から100までの奇数だけの和を求めて表示するプログラム #   ◆0から2011までの奇数の個数を求めて表示するプログラム #  [3.1] Windows7 #  [3.3] C言語 # [4] 水曜19時まで # [5] 多重ループまで # どなたかよろしくお願いします。 # # '0から1000までの奇数だけの和を求めて表示する' '0から1000までの奇数だけの和を求めて'(_和), 項名付きで表示する(和,'',_和). '0から1000までの奇数だけの和を求めて'(_和) :- findsum(_奇数,( for(0,_奇数,100), 1 is _奇数 mod 2), _和). '0から2011までの奇数の個数を求めて表示する' :- '0から2011までの奇数の個数を求めて'(_個数), 項名付きで表示する(個数,個,_個数). '0から2011までの奇数の個数を求めて'(_個数) :- count(( for(0,_奇数,2011), 1 is _奇数 mod 2), _個数). 項名付きで表示する(_項名,_単位,N) :- writef('%tは %t%t です\n',[_項名,N,_単位]). % 以下のサイトは # # 順列をリスト[a1,a2,・・・,an] で表すとき、その転倒数を計算しよう。 # 奇順列(_順列) :- 転倒数(_順列,_転倒数), 1 is _転倒数 is 2,!. 転倒数(_順列,_転倒数) :- findall(Count,( append(_,[N|R],_順列), count((append(_,[M|_],R),N > M),Count)), L), sum(L,_転倒数). % 以下のサイトは # # 順列をリスト[a1,a2,・・・,an] で表すとき、その転倒数を計算しよう。 # 偶順列(_順列) :- 転倒数(_順列,_転倒数), 0 is _転倒数 is 2,!. 転倒数(_順列,_転倒数) :- findall(Count,( append(_,[N|R],_順列), count((append(_,[M|_],R),N > M),Count)), L), sum(L,_転倒数). % 以下のサイトは # # 順列をリスト[a1,a2,・・・,an] で表すとき、その転倒数を計算しよう。 # 転倒数(_順列,_転倒数) :- findall(Count,( append(_,[N|R],_順列), count((append(_,[M|_],R),N > M),Count)), L), sum(L,_転倒数). sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. % 以下のサイトは # 出典:: 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). % 以下のサイトは # テーブル: # no comment id(テーブル名:テーブル) # 1 aaaaa 春 # 2 bbbbb 夏 # 3 ccccc 春 # 4 ddddd 春 # : # # 欲しい結果: # no comment id count(*) # 3 ccccc 春 2 # # # idが春のものの数を集計したく、 # select *,count(*) from baka group by id where id = '春'; # でそれは可能なんですが、selectで取れる他の結果(commentとか)は、noが3のものを表示したいんです # % 別々に計算するつもりで、定義する。 テーブル(1,aaaaa,春). テーブル(2,bbbbb,夏). テーブル(3,ccccc,春). テーブル(4,ddddd,春). 節を取得時に集約値を併記する(_no,_commnet,_id,_度数) :- テーブル(_no,_comment,_id), count(テーブル(_,_,_id)),_度数). count(P,C) :- findall(1,P,L), length(L,C). % 以下のサイトは # I am trying to write a procedure order(List,Result) that has a List # as input and returns a list Result of ordered pairs such that: # # the first element of the ordered pair is the position of the pair in the list, and # the second element of the ordered pair is the element # from List n the corresponding position. # Example: # # if List = [a,b,c,d], the procedure order(List,Result) # outputs the list: Result = [(1,a), (2,b),(3,c),(4,d)]. # # I am struggling with the counter for the position of the pair in the list. # I have made attempts such as: # # increment(Accum,Total):- # Total is Accum + 1. # order([],[]). # order([Head|Tail],Result):- # order(Tail, NewTail), # NewCount is Count + 1, # increment(NewCount,Count), # Result = [(Count,Head)|NewTail]. # Please help anyone? order(List,Result) :- findall((N,E),( append(L0,[E|_],List), length([_|L0],N)), Result). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/719 # # # (1)%で始まっていればコマンドに応じた処理ができるように分岐処理を書く # %Q:プログラムの終了 # %C:メモリ中に保持しているデータの登録数を出力 # %P:0~99番目までの100人分のデータが登録されている場合 # %P 8 …0番目→7番目の順で表示 # %P -10 …90番目→99番目の順で表示 # 出力例: # # ID : 100023 # Name : Tokyo # Date : 1900/1/1 # Addr : Tokyoto....... # Memo : aaeiou 1234566.... # # ID : 100048 # Name : Osaka # Date : 1900/2/2 # Addr : Osakafu....... # Memo : abcde 124816.... # # (2)%で始まっていなければデータを格納 # (3)ループするようにしておいて何行でも入力可能にする(%Qでプログラムを終了) # # # # 以下プログラムですが実行してもうまくいきません。 # とりあえずどういった感じで作っているか雰囲気だけでも分かってもらえればと思います。 # プログラム :- データまたはコマンドの入力(_データまたはコマンド行), コマンドループ(_データまたはコマンド行,_診断), _診断 = 終了. データまたはコマンドの入力(_データまたはコマンド行) :- get_line(_データまたはコマンド行). コマンドループ(_データまたはコマンド行,_診断) :- sub_atom(_データまたはコマンド行,0,1,_,'%'), split(_データまたはコマンド行,['%',' '],[_コマンド|_引数], コマンドの実行(_コマンド,_引数,_診断). コマンドループ(_データまたはコマンド行,_診断) :- \+(sub_atom(_データまたはコマンド行,0,1,_,'%')), データ入力(_データまたはコマンド行,_診断). コマンドループ(_,_診断) :- データまたはコマンドの入力(_データまたはコマンド行), コマンドループ(_データまたはコマンド行,_診断). コマンドの実行('Q',_,終了) :- コマンドの実行('C',_,true) :- count(clause(データ(_),_),_登録データ数), writef('登録データ数 = %t\n',[_登録データ数]). コマンドの実行('P',[N],true) :- N < 0, N >= -50, M1 is 100 + N, M2 is 0 - N - 1, for(M1,M,M2), データ(M,_データ), writef('%t\n',[_データ]), M = M2,!. コマンドの実行('P',[N],true) :- N >= 0, N =< 100, M1 is 0, M2 is N - 1, for(M1,M,M2), データ(M,_データ), writef('%t\n',[_データ]), M = M2,!. コマンドの実行(_,_,false). データ入力(_データ,true) :- findmax(N,データ(N,_),Max), Max2 is Max + 1, assertz(データ(Max2,_データ)),!. データ入力(_データ,true) :- assertz(データ(0,_データ)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/121 # # ●正規表現の使用環境 # Apache RewriteRule # # ●検索か置換か? # 検索 # # ●説明 # 1〜5つのカンマ区切りの単語を一致させたい # 連結数は不定 # # ●対象データ # apple # apple,orange,pineapple,grape,melon # orange,pineapple,melon # # ●希望する結果 # ○apple # ○orange,pineapple,melon # × ,apple # # 不定数連結されたパターンに悩んでいます # '1〜5つのカンマ区切りの単語を一致させたい'(_文字列,_前文字列,_適合文字列,_後文字列) :- 'カンマを0-4個含むアルファベット文字列'(_文字列,_前文字列,_適合文字列,_後文字列), カンマは独立して4個以内で先頭と末尾はカンマではない(_適合文字列). 'カンマを0-4個含むアルファベット文字列'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), アルファベットならび(L1,L2,L3). アルファベットならび([],L2,[]) :- 全ての要素がアルファベット(L2),!. アルファベットならび([],L2,[A|_]) :- 全ての要素がアルファベット(L2), \+(アルファベット(A)),!. アルファベットならび(L1,L2,L3) :- last(L1,A), L3 = [B|_], \+(アルファベット(A)), \+(アルファベット(B)), 全ての要素がアルファベット(L2),!. 全ての要素がアルファベット(L2) :- \+((append(_,[A|_],L2),アルファベット(A))). アルファベット(A) :- char_code(A,Code), Code > 32. カンマは独立して4個以内で先頭と末尾はカンマではない(_適合文字列) :- sPLIT(_適合文字列,[','],L), count(append(_,[','|_],L),N), N =< 4, カンマは独立して(L), 先頭はカンマでない(L), 末尾はカンマでない(L). カンマは独立して(L) :- \+(append(_,[',',','|_],L)),!. 先頭はカンマでない(L) :- \+([','|_]=L). 末尾はカンマでない(L) :- \+(append(_,[','],L)). % 以下のサイトは # Hi everyone, i'm having a bit of a problem with a prolog exercise. # # Assume i have a list of actors that have won oscars. Like this: # # (steven spielberg, steven spielberg, francis ford coppola, michael curtiz) # When a name appears two times, it means that the person won 2 oscars and so on. # What i need to do is to go trough this list and find every actor # that won N or more Oscars, with a predicate like # # wonMoreOscars(Number, Activity):- # Where the number is the N we have to compare with the list. # I already have a function that counts the person that occurs the more times # in a list and the activity the function that person has in the movie, # but is already covered. # # Can somebody help me, i have the code to find the person who has won more Oscars: # # occS([],_,_,_,_):- # write(0),nl, # write('+'),nl, !. # occS([H|T],_,_,_,_):- # occ([H|T],0,0,H,H). # occ([],_,Top,_,Nome):- # write(Nome),nl, # write(Top),nl, # write('+'),nl,!. # occ([H|T],Count,Top,El_corrente,_):- # compare(=,H,El_corrente), # C is Count + 1, # C>=Top, # occ(T,C,C,El_corrente,El_corrente), !. # occ([H|T],_,Top,El_corrente,Nome):- # not(compare(=,H,El_corrente)), # occ(T,1,Top,H,Nome),!. # occ([H|T],Count,Top,_,Nome):- # C is Count + 1, # occ(T,C,Top,H,Nome),!. # But now i'm having trouble with this case. Can somebody help me ? Thx in advance. 'Oscars'(['steven spielberg', 'steven spielberg', 'francis ford coppola', 'michael curtiz']). wonMoreOscars(Number, Activity):- 'Oscars'(L), setof(Name,member(Name,L),L1), findall([Name,Count],( append(_,[Name|_],L1), count(append(_,[Name|_],L),Count), Count >= Number), Activity). count(P,N) :- findall(1,P,L), length(L,N). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/300 # # 上手くいかないので質問させてください。 # ACCESS2007を使っています。 # 年フィールドと月フィールドを用いて「年度」の件数を抽出したいのですが、 # 以下のクエリでは月部分が干渉してか上手く抽出出来ません。 # # 22年4月〜23年3月 といった結果を出したいのですがどうしたらよいでしょうか? # # SELECT 年 FROM Table1 # WHERE (年>21 AND 月>3) AND (年<23 AND 月<4) # # '年フィールドと月フィールドを用いて「年度」の件数を抽出したい'(_テーブル,L) :- テーブル構造(_テーブル,年,M), テーブル構造(_テーブル,月,N), findmax(U,テーブル構造(_テーブル,_,U),Max), length(L1,Max), nth1(M,L1,_年), nth1(N,L1,_月), P =.. [_テーブル|L1], findall(_年度,( P, 年度のルール(_年,_月,_年度)), _年度ならび), findsetof(_年度,( append(_,[_年度|_],_年度ならび), L2), findall([_年度,_度数],( append(_,[_年度|_],L2), count(append(_,[_年度|_],_年度ならび),_度数)), L). 年度のルール(_年,_月,_年度) :- _月 >= 4, _年 = _年度,!. 年度のルール(_年,_月,_年度) :- _月 < 4, _年度 is _年 - 1,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/286 # # sql初心者で申し訳ありません。2つの要素でソートをしたい場合どのようにすればよいでしょうか? # point01(int)、point02(int)があります。point01でソートを行い、point01が同じ場合point02でさらにソートをしなければいけません。 # # '2つの要素でソートをしたい場合どのようにすればよいでしょうか?'(_テーブル,P) :- テーブル構造(_テーブル,point01,N1), テーブル構造(_テーブル,point02,N2), count(テーブル構造(_,_,_),Count), length(L,Count), nth1(N1,L,Point01), nth1(N2,L,Point02), P =.. [_テーブル|L], setof([Point01,Point02],P,L2), append(_,[[Point01,Point02]|R],L2), call(P). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/159 # # [1] 授業単元: プログラム # [2] 問題文(含コード&リンク): # 英語のテキストデータを入力とし、ファイル内に現れる「単語」(文字列)と # そのカウントをプリントするプログラムを作成せよ。同時に現れた「単語」の総数を # プリントすること。なお、ここで「単語」とはデリミタで区切られるアルファベットだけ # からなる文字列と定義する。「単語」は各データファイルにつき、総単語数は高々2,000単語 # しか現れないと仮定して良い。配列でプログラムする場合、1単語長の最大値を適当に固定して良い。 # # ヒント # デリミタとは、この課題では以下のASCII文字と定義する。 # (a) 制御文字 (iscntrl(c)が1となる文字c) # (b) 数字 (isdigit(c)が1となる文字c) # (c) アルファベット以外の印刷可能文字 (isprint(c)が1で、isalpha(c)が0となる文字c) # '英語のテキストデータを入力とし、ファイル内に現れる「単語」(文字列)とそのカウントをプリントする。同時に現れた「単語」の総数をプリントする'(_ファイル) :- get_chars(_ファイル,Chars), 単語を抽出する(Chars,[],_単語ならび), '「単語」(文字列)とそのカウント'(_単語ならび,_単語とそのカウントならび), 単語とそのカウントをプリントする(_単語とそのカウントならび), 単語の総数(_単語ならび,_単語の総数), 単語の総数をプリントする(_単語の総数). 単語を抽出する([],[],[]) :- !. 単語を抽出する([],L,[_単語]) :- concat_atom(L,_単語),!. 単語を抽出する([_文字|R1],[],R2) :- 'デリミタとは、この課題では以下のASCII文字と定義する'(_文字), 単語を抽出する(R1,[],R2),!. 単語を抽出する([_文字|R1],L1,R2) :- 'デリミタとは、この課題では以下のASCII文字と定義する'(_文字), concat_atom(L1,_単語), 単語を抽出する(R1,[],[_単語|R2]),!. 単語を抽出する([_文字|R1],L1,R2) :- append(L1,[_文字],L2), 単語を抽出する(R1,L2,R2),!. 'デリミタとは、この課題では以下のASCII文字と定義する'(_文字) :- 制御文字(_文字). 'デリミタとは、この課題では以下のASCII文字と定義する'(_文字) :- 数字(_文字). 'デリミタとは、この課題では以下のASCII文字と定義する'(_文字) :- アルファベット以外の印刷可能文字(_文字). 制御文字(_文字) :- char_code(_文字,Char_code), Char_code < 32,!. 数字(_文字) :- append(_,[_文字|_],['0','1','2','3','4','5','6','7','8','9']). アルファベット以外の印刷可能文字(_文字) :- アルファベット以外の(_文字), 印刷可能文字(_文字),!. アルファベット以外の(_文字) :- \+(アルファベット(_文字)). アルファベット(_文字) :- append(_[_文字|_],['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']),!. アルファベット(_文字) :- append(_,[_文字|_],[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]),!. 印刷可能文字(_文字) :- char_code(_文字,Char_code), Char_code >= 32,!. '「単語」(文字列)とそのカウント'(_単語ならび,_単語とそのカウントならび) :- setof(_単語,member(_単語,_単語ならび),_単語ならびのニ), length(_単語ならびのニ,_単語の総数), findall([_単語,_カウント],( append(_,[_単語|_],_単語ならびのニ), count(member(_単語,_単語ならび),_カウント)), _単語とそのカウントならび). 単語とそのカウントをプリントする(_単語とそのカウントならび) :- append(_,[[_単語,_カウント]|R],_単語とそのカウントならび), writef('%t %t\n',[_単語,_カウント]), R = []. 単語の総数(_単語ならび,_単語の総数) :- length(_単語ならび,_単語の総数),!. 単語の総数をプリントする(_単語の総数) :- writef('単語の総数は %t です\n',[_単語の総数]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/113 # # 【質問テンプレ】 # [1]Cプログラミング # [2]10人の身長(150cm〜180cm)を任意にキーボードから入力し、 #   160cm以上の人数と未満の人数、およびそれらの平均値を求めよ。 # '10人の身長(150cm〜180cm)を任意にキーボードから入力し、160cm以上の人数と未満の人数、およびそれらの平均値を求める'(_160cm以上の人数,_160cm未満の人数,_160cm以上の平均,_160cm未満の平均) :- length(_10人の身長ならび), '10人の身長(150cm〜180cm)を任意にキーボードから入力し'(_10人の身長ならび), '160cm以上の人数と未満の人数、およびそれらの平均値を求める'(_10人の身長ならび,_160cm以上の人数,_160cm未満の人数,_160cm以上の平均,_160cm未満の平均). '10人の身長(150cm〜180cm)を任意にキーボードから入力し'([]) :- !. '10人の身長(150cm〜180cm)を任意にキーボードから入力し'([_身長|R]) :- get_line(Line), '10人の身長(150cm〜180cm)を'(Line,_身長), '10人の身長(150cm〜180cm)を任意にキーボードから入力し'(R),!. '10人の身長(150cm〜180cm)を任意にキーボードから入力し'(L) :- '10人の身長(150cm〜180cm)を任意にキーボードから入力し'(L). '10人の身長(150cm〜180cm)を'(Line,_身長) :- atom_to_term(Line,_身長,_), integer(_身長), _身長 >= 150, _身長 =< 180. '160cm以上の人数と未満の人数、およびそれらの平均値を求める'(_10人の身長ならび,_160cm以上の人数,_160cm未満の人数,_160cm以上の平均,_160cm未満の平均) :- '160cm以上の人数'(_10人の身長ならび,_160cm以上の人数), '160cm未満の人数'(_10人の身長ならび,_160cm未満の人数), '160cm以上の平均'(_10人の身長ならび,_160cm以上の平均), '160cm未満の平均'(_10人の身長ならび,_160cm未満の平均). '160cm以上の人数'(_10人の身長ならび,_160cm以上の人数) :- count((append(_,[_身長|_],_10人の身長ならび),_身長 >= 160),_160cm以上の人数). '160cm未満の人数'(_10人の身長ならび,_160cm未満の人数) :- count((append(_,[_身長|_],_10人の身長ならび),_身長 < 160),_160cm未満の人数). '160cm以上の平均'(_10人の身長ならび,_160cm以上の人数) :- findavg(_身長,( append(_,[_身長|_],_10人の身長ならび), _身長 >= 160), _160cm以上の平均). '160cm未満の平均'(_10人の身長ならび,_160cm未満の人数) :- findavg(_身長,( append(_,[_身長|_],_10人の身長ならび), _身長 < 160), _160cm未満の人数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/12 # # [1]c言語 # [2]英文字を読み込み、その一つ一つの文字の個数を求めるプログラム。 # # 実行結果 # 英文字 BBACC # 変換後 B2A1C2 英文字を読み込み、その一つ一つの文字の個数を求める :- 英文字を読み込み(_英文字列), その一つ一つの文字の個数を求める(_英文字列,_その一つ一つの文字の個数), 表示する(その一つ一つの文字の個数). 英文字を読み込み(_英文字列) :- write('英文字列を入力してください : '), get_line(_英文字列), 英文字読み込み診断(_英文字列),!. 英文字を読み込み(_英文字列) :- 英文字を読み込み(_英文字列). 英文字読み込み診断(_英文字列) :- atom_chars(_英文字列,Chars), 全て英文字(Chars),!. 英文字読み込み診断(_文字列) :- writef('読み込まれた文字列 %t に英文字以外の文字が含まれています。\n再入力をお願いします\n',[_文字列]),fail. 全て英文字([]). 全て英文字([A|R]) :- member(A,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]), 全て英文字(R). その一つ一つの文字の個数を求める(_英文字列,_その一つ一つの文字の個数) :- atom_chars(_英文字列,Chars), setof(_文字,member(_文字,Chars),L1), findall(_文字の個数,( member(_文字,L1), count(member(_文字,Chars),Count), concat_atom([_文字,Count],_文字の個数)), L2), concat_atom(L2,_その一つ一つの文字の個数). 表示する(_その一つ一つの文字の個数) :- writef('%t\n',[_その一つ一つの文字の個数]). % 以下のサイトは # I'm trying to write a Prolog function that given a list returns the element(s) that repeats most times in that list, like: # # ['a', 'a', 'b', 'c', 'b'] should return ['a', 'b'] ['c', 'a', 'a', 'c', 'b', 'c', 'b'] should return ['c'] etc... # # I'm trying to do it with another function (that counts the number of times something exists on a list (countlist), but I'm not getting anywhere. A little help please? # # listMax(In, Out) :- # listMax(In, Out, 0). # # listMax([H | L], [H | O], Max) :- # countlist(H, [H | L], N), # N > Max, # listMax(L, [H | O], N). # # listMax([H | L], O, Max) :- # countlist(H, [H | L], N), # <=(Max, N), # listMax(L, O, Max). # # listMax([], [], _Max). # # listMax([], _O, _Max). listmax(In,Out) :- setof(A,member(A,In),L1), findall([Count,A],( member(A,L1), count(A,In,Count)), L2), max_1(L2,Max), findall(A,member([Max,A],L2),Out). count(A,[],0). count(A,[A|R],X) :- count(A,R,Y), X is Y + 1. count(A,[_|R],X) :- count(A,R,X). max_1(L,Max) :- findall(A,member([A|_],L),L1), max(L1,Max). % 以下のサイトは # Hello, I'm trying to make a prolog function (I know it's not a function # but I can't recall it's name) that given a list and a number N # returns a list with the elements that repeat at least N times. # # xpto(['a', 'a', 'a', 'b', 'b', 'c'], Out, 3) should return Out = ['a'] # # xpto(['a', 'a', 'a', 'b', 'b', 'c'], Out, 2) should return Out = ['a', 'b'] # # etc. # # I currently have: # # xpto([], _, _). # # xpto([H | L], O, Num) :- # count(H, [H | L], N), # N = Num, # xpto(L, [H | O], Num). # # xpto([H | L], O, Num) :- # count(H, [H | L], N), # N \= Num, # xpto(L, O, Num). # where in count(A, L, N) N is the number of times A repeats in L, however it doesn't work. I'm pretty sure my algorithm works on paper. # # Any help is appreciated :) xpro(L,Out,N) :- setof(M,member(M,L),L1), findall(A,( member(A,L1), count(member(A,L),Count), Count >= N), Out). % 以下のサイトは # Hi, I use swi prolog and my code like this. I read data predicate # from file and its arity count can change. How can I generalize it. # For example, If data(a1,b1,c1) writes in the file, how can I find solution? # Do you have any idea? # # > basla:-consult('test.pl'), # > answer(L1,L2,L3,L4,L5), # > list_to_set(L1, X), # > # > write(X). # > answer(L1,L2,L3,L4,L5):- # > findall(First, data(First,_,_,_,_),L1), # > findall(Second, data(_,Second,_,_,_),L2), # > findall(Third, data(_,_,Third,_,_),L3). basla(Predicate/Arity) :- consult('test.pl'), length(L,Arity), for(1,Nth,Arity), findall(A,( nth1(Nth,L,A), P =.. [Predicate|L], call(P)), LX), list_to_set(LX,U), writef('%t\n',[LX]), Nth = Arity. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/680 # # 1]授業単元:プログラミング # [2]問題文:自己参照型構造体を用いて、以下の処理をするプログラムを作成せよ。 # # 正の数入力→連結リストを辿り、初めて入力された数ならばカウンタを1増やす。同じ数が続けて入力されたらその数のカウンタをさらに1増やす。 # 負の数入力→負の数の絶対値と同じ回数入力された数のデータを削除(例えば、-3を入力し、それ以前に14が3回入力されていたら、それを削除) # 0を入力→データを出力して終了。 # # データ出力→終了の流れはどうにかなりましたが、それ以外で上手い発想が思いつきません。 # # http://ime.nu/codepad.org/yayuXIUa # # 期限は明日までです。 # # 正の数入力後連結リストを辿り、初めて入力された数ならばカウンタを1増やす。負の数入力後負の数の絶対値と同じ回数入力された数のデータを削除0を入力後データを出力して終了 :- 数入力(_数), 連結リストとカウンタを更新していく(_数,[],0,_連結リスト,_カウンタ), データを出力して終了(_連結リスト,_カウンタ),!. 連結リストとカウンタを更新していく(_数,L_1,_カウンタ_1,L,_カウンタ) :- 負の数が入力されたら負の数の絶対値と同じ回数入力された数のデータを削除して連結リストの最後に0を加える(_数,L_1,_カウンタ_1,L,_カウンタ),!. 連結リストとカウンタを更新していく(_数,L_1,_カウンタ_1,L,_カウンタ) :- 初めて入力された数ならばカウンタを1増やす(_数,L_1,_カウンタ_1,L_2,_カウンタ_2), 数入力(_数_2), 連結リストとカウンタを更新していく(_数_2,L_2,_カウンタ_3,L,_カウンタ). 連結リストとカウンタを更新していく(_数,L_1,_カウンタ_1,L,_カウンタ) :- \+(初めて入力された数ならばカウンタを1増やす(_数,L_1,_カウンタ_1,L,_カウンタ)), 数入力(_数_2), 連結リストの最後に数を追加(_数,L_1,L_2), 連結リストとカウンタを更新していく(_数_2,L_2,_カウンタ_1,L,_カウンタ). データを出力して終了(_連結リスト,_カウンタ) :- writef('実行後の連結リストは %t です\nその時点のカウンタは %t です\n',[_連結リスト,_カウンタ]),!. 負の数が入力されたら負の数の絶対値と同じ回数入力された数のデータを削除して連結リストの最後に0を加える(_負の数,L_1,_カウンタ_1,L_2,_カウンタ_2) :- _負の数 < 0, _負の数の絶対値 is abs(_負の数), 負の数の絶対値と同じ回数入力された数のデータを削除(_負の数の絶対値,L_1,L_3), 連結リストの最後に0を加える(L3,L2),!. 連結リストの最後に0を加える(L3,L2) :- append(L_3,[0],L_2),!. 負の数の絶対値と同じ回数入力された数のデータを削除(_負の数の絶対値,L_1,L_2) :- 既に入力された重複しない数ならびを得る(L_1,_数ならび), 削除する数を選択する(_負の数の絶対値,_数ならび,L_1,_削除する数候補), 連結リストからデータを削除(_削除する数候補,L_1,L_2). 既に入力された重複しない数ならびを得る(L_1,_数ならび) :- findsetof(_数,append(_,[_数|_],L_1),_数ならび),!. 削除する数を選択する(_負の数の絶対値,_数ならび,L_1,_削除する数候補) :- findall(_数,( append(_,[_数|_],_数ならび), 負の数の絶対値に要素数が一致する数(_負の数の絶対値,L_1,_数)), _削除する数候補),!. 負の数の絶対値に要素数が一致する数(_負の数の絶対値,L_1,_数) :- count(append(_,[_数|_],L_1),_負の数の絶対値)),!. 連結リストからデータを削除([],L,L) :- !. 連結リストからデータを削除([_数|R],L_1,L) :- ならびから削除(_数,L_1,L_2), 連結リストからデータを削除(R,L_2,L). ならびから削除(_,[],[]) :- !. ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび) :- ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!. ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび]) :- ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!. 初めて入力された数ならばカウンタを1増やす(_数,L_1,_カウンタ_1,L_2,_カウンタ_3) :- \+(append(_,[_数|_],L_1)), _カウンタ_2 is _カウンタ_1 + 1, 同じ数が続けて入力されたらその数のカウンタをさらに1増やす(_数,L_1,_カウンタ_2,_カウンタ_3), 連結リストの最後に数を追加(_数,L_1,L_2),!. 同じ数が続けて入力されたらその数のカウンタをさらに1増やす(_数,L_1,_カウンタ_1,_カウンタ_2) :- last(L_1,_数), _カウンタ_2 is _カウンタ_1 + 1,!. 同じ数が続けて入力されたらその数のカウンタをさらに1増やす(_,_,_カウンタ_1,_カウンタ_1). 連結リストの最後に数を追加(_数,L_1,L_2) :- append(L_1,[_数],L_2). 数入力(_数) :- write('数を入力してください : '), get_line(Line), 数入力診断(Line,_数),!. 数入力(_数) :- 数入力(_数). 数入力診断(Line,_数) :- atom_to_term(Line,_数,_), number(_数),!. 数入力診断(Line,_数) :- writef('入力された %t からは数値が得られません。再入力をお願いします\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/483 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # ttp://www.dotup.org/uploda/www.dotup.org1575096.jpg # 'ヒット&ブロー' :- コンピュータが四桁の整数を決める(_数字ならびの一), 遊び手が数字を入力する(_数字ならびのニ), 'ヒット&ブロー診断'(_数字ならびの一,_数字ならびのニ). コンピュータが四桁の整数を決める(_数字ならび) :- M is random mod 10000, number_chars(M,L), 頭部に零を詰める(L,_数字ならび). 頭部に零を詰める(L,_数字ならび) :- length(_数字ならび,4), append(L0,L,_数字ならび), all(L0,'0'). 遊び手が数字を入力する(_数字ならび) :- get_line(Line), findall(A,( append(_,[A|_],Line)), _数字ならび). 'ヒット&ブロー診断'(_数字ならびの一,_数字ならびのニ) :- ヒット数(_数字ならびの一,_数字ならびのニ,_ヒット数), ブロー数(_数字ならびの一,_数字ならびのニ,_ブロー数), 'ヒット&ブロー表示'(_ヒット数,_ブロー数),!. ヒット数(L1,L2,_ヒット数) :- count(( append(L0_1,[A|_],L1), append(L0_2,[A|_],L2), length(L0_1,N), length(L0_2,N)), _ヒット数). ブロー数(L1,L2,_ブロー数) :- count(( append(L0_1,[A|R_1],L1), append(L0_2,[A|R_2],L2), length(L0_1,N_1), length(L0_2,N_2), \+(N_1 == N_2)), _ブロー数). 'ヒット&ブロー表示'(4,_) :- writef('ゲームオーバー\n',[]),!. 'ヒット&ブロー表示'(_ヒット数,_ブロー数) :- writef('%tH%tB\n',[_ヒット数,_ブロー数]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/212 # # [1]C言語演習 # [2]問題文 # 次の形式のタブ区切りファイルがある。(行数は最大で1000万行とする) # 生徒ID クラス名 国語得点 数学得点 英語得点 # 生徒IDは8桁の0から9で構成される文字列 # クラス名は4桁の0から9で構成される文字列 # 国語得点、数学得点、英語得点は3桁の0から9で構成される文字列とする。 # # (1)各教科の得点の和が同じ生徒達のグループについて、そのグループが何人で何クラスの # 生徒から構成されているかを、得点和毎に表出力せよ # ただし0人で構成されるグループについては出力する必要がない。 # 形式例 # 得点:123 人数:5人 グループ数:4 # 得点:128 人数:3人 グループ数:3 # 得点:214 人数:11人 グループ数:9 # ............ # # (2)それぞれの教科の得点が所属しているクラスの各教科の平均点の大小関係と # 同じ生徒をリストアップせよ # ただしあるクラスの2つの教科の平均点が一致している場合はその2つの教科の得点の # 大小関係は不問として出力する。(3つが一致している場合はそのクラスの生徒全員 # がリストアップされることになる # [3] OSはLinux,言語はCです。(C++は不可) # [4] 4/30まで # [5] stdlib.h stdio.h string.hをincludeしても良いがそれ以外は不可だそうです # よろしくお願いします。 # # '各教科の得点の和が同じ生徒達のグループについて、そのグループが何人で何クラスの生徒から構成されているかを、得点和毎に表出力せよ'(_ファイル) :- get_split_lines(_ファイル,['\t'],LL), findall([_得点合計,_クラス名],( append(_,[[_生徒ID,_クラス名,_国語得点,_数学得点,_英語得点]|_],LL), _得点合計 is _国語得点,_数学得点,_英語得点), L1), findsetof(_得点合計,( append(_,[[_得点合計,_]|_,L1)), L2), findsetof([_得点合計,_クラス]( append(_,[[_得点合計,_クラス]|_,L1)), L3), findall([_得点合計,_グループ人数,_クラス数],( append(_,[_得点合計|_],L2), count(append(_,[[_得点合計,_]|_],L1),_グループ人数)), count(append(_,[[_得点合計,_]|_],L3),_クラス数)), _得点合計・グループ人数・クラス数集計ならび), 出力する(_得点合計・グループ人数・クラス数集計ならび). 出力する(_得点合計・グループ人数・クラス数集計ならび) :- append(_,[[_得点合計,_グループ人数,_クラス数]|R],_得点合計・グループ人数・クラス数集計ならび), write_formatted('得点:%t 人数:%t人 グループ数:%t\n',[_得点合計,_グループ人数,_クラス数]), R = [],!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/106 # # ストアドプロシージャについて質問させてください。 # # 簡単な結果を返すクエリ # SELECT A,B,C FROM TEST # # といったクエリの結果を戻り値として返すストアドを作成したいのですが # どのように書けば良いのかわかりません。 # # 単一の列のみを返す方法ならわかったのですが、複数列を返す方法が # 分からないといった状態です。 # テーブル構造('TEST',1,'A'). テーブル構造('TEST',2,'B'). テーブル構造('TEST',3,'C'). 簡単な結果を返すクエリ(_テーブル名,_選択項ならび,_値ならび) :- count(テーブル構造('TEST',_,_),Len), length(_値ならび,Len), findsetof(_,( テーブル構造(_テーブル名,Nth,_)), L), P =.. [_テーブル|_変数ならび], call(P), 選択項と値の結合(L,_選択項ならび,_値ならび). 選択項と値の結合(_テーブル名,L,[],[]) :- !. 選択項と値の結合(_テーブル名,L,[_選択項|R1],[_値|R2]) :- テーブル構造(_テーブル名,Nth,_選択項), list_nth(Nth,L,_値), 選択項と値の結合(_テーブル名,L,R1,R2). % 以下のサイトは 計画停電グループ所属(グループ1,西荻). 計画停電グループ所属(グループ1,所沢). 計画停電グループ所属(グループ1,横浜南). 計画停電グループ所属(グループ1,けやき台). 計画停電グループ所属(グループ1,狭山ヶ丘). 計画停電グループ所属(グループ1,大井). 計画停電グループ所属(グループ4,上野毛). 計画停電グループ所属(グループ4,大井). 計画停電グループ所属(グループ5,埼玉). 計画停電グループ所属(グループ5,熊谷). % *** user: '計画停電' / 1 *** 計画停電(_年月日) :- 計画停電(_年月日,L), 計画停電表示(L). 計画停電表示(L) :- append(L0,[_グループ|R],L), 表示形式の取得(L0,_表示形式), 営業所並び文字列の取得(_グループ,_営業所並び文字列), wr(_表示形式,[_グループ,_営業所並び文字列]), R = []. 表示形式の取得(L0,_表示形式) :- length(L0,Len), 表示形式(Len,_表示形式). 表示形式(0,' %t 6:20-10:00; 13:50-17:30; %s\n'). 表示形式(1,' %t 9:20-13:00; 16:50-20:30; %s\n'). 表示形式(2,' %t 12:20-16:00; %s\n'). 表示形式(3,' %t 15:20-19:00; %s\n'). 表示形式(4,' %t 17:20-22:00; %s\n'). 営業所並び文字列の取得(_グループ,_営業所並び文字列) :- findall(_営業所,計画停電グループ所属(_グループ,_営業所),_営業所ならび), concat_atom(_営業所ならび,',',_営業所並び文字列). /* 計画停電(_日文字列,L) :- atom(_日文字列), sub_atom(_日文字列,_,2,_,_日文字列), 今日(_今日), 年月日から年月取得(_今日,_年月), concat_atom([_年月,_日文字列],_年月日), 計画停電(_年月日,L),!. 計画停電(_日,L) :- integer(_日), _日 =< 31, 今日(_今日), 年月日から年月取得(_今日,_年月), 整数から文字列(2,_日,_日文字列), concat_atom([_年月,_日文字列],_年月日), 計画停電(_年月日,L),!. 計画停電(_月日文字列,L) :- atom(_月日文字列), _月日文字列 @>= '0101', _月日文字列 @=< '1231', 今日(_今日), 年月日から年取得(_今日,_年), concat_atom([_年,_月日文字列],_年月日), 計画停電(_年月日,L),!. 計画停電(_月日,L) :- integer(_月日), _月日 >= 101, _月日 =< 1231, 今日(_今日), 年月日から年取得(_今日,_年), 整数から文字列(4,_月日,_月日文字列), concat_atom([_年,_月日文字列],_年月日), 計画停電(_年月日,L),!. */ 計画停電(_年月日,L) :- atom(_年月日), atom_length(_年月日,8), count((日付の発生('20110317',_年月日_1,_年月日), _年月日_1 @>= '20110317' , _年月日_1 @=< _年月日),_経過日数), ならびの回転(左方向,_経過日数,[グループ4,グループ5,グループ1,グループ2,グルーブ3],L) . ならびの回転(左方向,0,L,L) :- !. ならびの回転(左方向,N,[A|R1],L) :- N_1 is N - 1, append(R1,[A],L2), ならびの回転(左方向,N_1,L2,L). 日付の発生(_日付,_日付,_日付上限) :- _日付 @> _日付上限,!,fail. 日付の発生(_日付,_日付,_日付上限). 日付の発生(_日付の一,_日付,_日付上限) :- 年・月・日に分解(_日付の一,_年の一,_月の一,_日の一), 翌日(_年の一,_月の一,_日の一,_翌日), 日付の発生(_翌日,_日付,_日付上限). 年・月・日に分解(_年月日,_年,_月,_日) :- sub_atom(_年月日,0,4,_,_年), sub_atom(_年月日,4,2,_,_月), sub_atom(_年月日,6,2,_,_日). 翌日(_年,'12','31',_翌日) :- 翌年(_年,_翌年), concat_atom([_翌年,'01','01'],_翌日),!. 翌日(_年,_月,'31',_翌日) :- append(_,[_月|_],['01','03','05','07','08','10','12']), 翌月(_月,_翌月), concat_atom([_年,_翌月,'01'],_翌日),!. 翌日(_年,_月,'30',_翌日) :- append(_,[_月|_],['04','06','09','11']), 翌月(_月,_翌月), concat_atom([_年,_翌月,'01'],_翌日). 翌日(_年,'02','29',_翌日) :- concat_atom([_年,'03','01'],_翌日),!. 翌日(_年,'02','28',_翌日) :- \+(うるう年(_年)), concat_atom([_年,'03','01'],_翌日),!. 翌日(_年,_月,_日,_翌日) :- 翌日(_日,_翌日の日), concat_atom([_年,_月,_翌日の日],_翌日). 翌月(_月,_翌月) :- atom_to_term(_月,M,_), M2 is M + 1, 整数から文字列(2,M2,_翌月). 翌年(_年,_翌年) :- atom_to_term(_年,Y,_), Y2 is Y + 1, 整数から文字列(4,Y2,_翌年). 翌日(_日,_翌日) :- atom_to_term(_日,D,_), D2 is D + 1, 整数から文字列(2,D2,_翌日). うるう年(_年文字列) :- 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/1200175247/927 # # n=12 # x=[2,6,20,15,8,21,8,22,15,20,1,15] # y=["Jan","Feb","Mar","Apr","Mey","Jun","Jul","Aug","Sep","Oct","Nov","Dec"] # sx=0 # upper=0 # middle=0 # lower=0 # xmax=0 # xmin=0 # best_x=0 # worst_x=0 # # for i in 0..n-1 # sx=sx+x[i] # end # xave=sx/n # print "Sipments:Total=",sx," Average=",xave,"\n" # puts # for i in 0..n-1 # if x[i] >= xave*1.5 then # upper = upper + 1 # elsif x[i] <= xave*1.5*0.5 # middle = middle + 1 # else x[i] <= xave/2 # lower = lower + 1 # end # end # print "Sales:Upper=",upper," Middle=",middle," Lower=",lower,"\n" # puts # xmax=x[0] # xmin=x[0] # for i in 0..n-1 # if xmax >= x[i] then # best_x = best_x + 1 # else xmin <= x[i] # worst_x = worst_x + 1 # end # end # print "Best Month:",best_x, " Worst Month:",worst_x,"\n" # puts # 出力結果 # Sipments:Total=153 Average=12 # Sales:Upper=4 Middle=5 Lower=3 # Best Month:2 Worst Month:10 # 本当はBest Month:Aug、Worst Month:Novとしたいんですけど、どうしたらいいですか? # やっぱり変数がおかしいんですか?それとも条件の書き方ですか?? 値([2,6,20,15,8,21,8,22,15,20,1,15]). 月表示(['Jan','Feb','Mar','Apr','Mey','Jun','Jul','Aug','Sep','Oct','Nov','Dec']). 月毎の売上分析 :- 値(_値ならび), 月表示(_月表示ならび), 値と月表示を対にする(_値ならび,_月表示ならび,_値・月表示ならび), sum(_値ならび,_合計値), avg(_値ならび,_平均値), 月値評価度数(_値ならび,_平均値,_上,_中の上,_中の下,_下), max(_値・月表示ならび,[_Max,_最良月]), min(_値・月表示ならび,[_Min,_最悪月]), writef('合計値=%t,平均値=%t\n',[_合計値,_平均値]), writef('上=%t,中の上=%t,中の下=%t,下=%t\n',[_上,_中の上,_中の下,_下]), writef('最良月=%t,最悪月=%t\n',[_最良月,_最悪月]),!. 値と月表示を対にする([],[],[]). 値と月表示を対にする([_値|R1],[_月表示|R2],[[_値,_月表示]|R3]) :- 値と月表示を対にする(R1,R2,R3). 月値評価度数(_値ならび,_平均値,_上,_中の上,_中の下,_下) :- count((append(_,[_値|_],_値ならび),_値 >= _平均値 * 1.5),_上), count((append(_,[_値|_],_値ならび),_値 >= _平均値 * 1.5 / 2,_値 < _平均値 * 1.5),_中の上), count((append(_,[_値|_],_値ならび),_値 >= _平均値 * 0.5,_値 < _平均値 * 1.5 / 2),_中の下), count((append(_,[_値|_],_値ならび),_値 < _平均値 * 0.5),_下). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/8 # # よくある質問3 # # (問) # ID HOGE # 01 A # 01 B # 01 C # 02 A # 03 B # # HOGEをAもBもCも持っている、ID:01だけ取り出すにはどうすればよかですか # # (答1) # SELECT id # FROM TableName # WHERE hoge in ('A','B','C') # GROUP BY id # HAVING count(DISTINCT hoge) = 3 # ; # # (答2) # select * # from TableName T1 # where not exists (select * #          from (values 'A', 'B', 'C') T2 (HOGE) #          where not exists (select * #                   from TableName T3 #                   where T1.ID = T3.ID #                   and T2.HOGE = T3.HOGE #                   ) #          ) # ; # ※valuesの部分(Table Value Constructor)はDBMSによって文法がかなり違うので注意 # # 'HOGEをAもBもCも持っている、ID:01だけ取り出す'(L,_ID) :- findsetof(_ID,'TableName'(_ID,_)), 関係の割り算(_ID,L). 関係の割り算(_,[]):- !. 関係の割り算(_ID,[_HOGE|R]) :- 'TableName'(_ID,_HOGE), 関係の割り算(_ID,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/7 # # よくある質問2 # # (問) # key   data # ---------------- # 1     a # 1     a # 1     b # 1     b # 1     a # 2     b # 2     a # 2     a # # というテーブルから # # key   a   b # -------------------- # 1    3   2 # 2    2   1 # # というExcelのピボットの様なデータを取得したいのですが、どういうSQLになりますか? # a,bというのは固定なので、仮にcというデータがあっても無視して構いません。 # # (答) # SELECT key, #     SUM(CASE data WHEN 'a' THEN 1 END) AS a, #     SUM(CASE data WHEN 'b' THEN 1 END) AS b # FROM table # GROUP BY key # ORDER BY key # ; # 'Excelのピボットの様なデータを取得したい' :- findsetof(_data,table(_,_data),L1), findsetof(_key,table(_key,_data),L2), append(_,[_key|R],L2), findall(Count, count((append(_,[_data|_],L1),table(_key,_data)),Count), L3), concat_atom([_key|L3],',',S), write_formatted('%t\n',[S]), R = []. % 以下のサイトは # 出典:: 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/349 # # [1] 授業単元: データの保存と表示 # [2] 問題文: http://ime.nu/codepad.org/2F3xiVeR # ↑で読み込むファイルに整数がいくつか表示されているので、それらの合計値とデータの中の1の個数を求める処理を追加する # '読み込むファイルに整数がいくつか表示されているので、それらの合計値とデータの中の1の個数を求める'(_ファイル,_合計値,_1の個数) :- get_chars(_ファイル,Chars), concat_atom(Chars,S), split(S,[' ','\n','\t'],L), sum(L,_合計値), count(append(_,[1|_],L),_1の個数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/873 # # ・DBバージョン # MySQL5.0.77 # # id|_regDate_| # --+----------+ # 1 |2010-10-10| # 2 |2010-10-10| # 3 |2010-10-10| # 4 |2010-10-11| # 5 |2010-10-11| # 6 |2010-10-11| # 7 |2010-10-11| # 8 |2010-10-12| # 9 |2010-10-12| # 10|2010-10-12| # 11|2010-10-12| # # ・欲しい結果 # 何件レコードがあったかを日別に出力したい。 # # 例として # _regDate__|件数 # ----------+- # 2010-10-10|3 # 2010-10-11|4 # 2010-10-12|4 # # こうなってるとうれしいです。 # # ・説明 # 自前でクリックカウンターを作っております。 # ほかにカラムとしてユーザーエージェントやリモートホストのアドレスを設置してありまして # 日別に集計して見れるようにしたいと思ったのですが、PHPでループを書いて出力するより # SQLの問い合わせ段階で、上記のように整形できないかなと思いました。 # # よろしくお願いいたします。 # # 何件レコードがあったかを日別に出力する :- write('-- 日付 --|件数\n'), findsetof(_日付,テーブル(_id,_日付),L), append(_,[_日付|R],L), count(テーブル(_id,_日付),_件数), write_formatted('%t|%t\n',[_日付,_件数]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/309 # # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): # ポインタstrが文字列の先頭文字を指している時その文字列に含まれる英字でない文字の個数を返す関数です。 # ただし、英小文字a〜z,英大文字A〜Zには、それぞれ昇順に連続した1バイトの整数が割り当てられています。 # # 次の<1>〜<5>の答えをうめてください。 # unsigned not_alpha_num(const char *str) # { # unsigned sum =0; # # while (*str) { # if((*str <1> 'a' || *str <2> z) <3> # # (*str <1> <4> || <2> <5>)) sum++; # # str++; # } # return(sum); # } # 文字列に含まれる英字でない文字の個数(_文字列,_英字でない文字の個数) :- count((sub_atom(_文字列,_,1,_,_文字),\+(英字(_文字))),_英字でない文字の個数). 英字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z',!. 英字(_文字) :- _文字 @>= 'a', _文字 @=< 'z',!. % 以下のサイトは # 出典:: 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/db/1274791771/846 # # ・DBMS名とバージョン #  Microsoft Access2000 # # ・テーブルデータ # 【ITEM_COUNT】 # item_id | year | month | count # --------------------------- # 00001  | 2010 |   1 |  150 # 00001  | 2010 |   1 |  400 # 00001  | 2010 |   2 |   20 #   (中略) # 00001  | 2010 |  11 |  120 # 00001  | 2010 |  11 |   50 # 00001  | 2010 |  11 |  200 # 00001  | 2010 |  12 |   30 # 00001  | 2011 |   1 |  500 # 00001  | 2011 |   1 |  100 # 00002  | 2010 |   1 |   10 # 00002  | 2010 |   2 |   30 # 00002  | 2010 |   2 |  100 #   (後略) # ※同じid, year, monthのデータが複数存在します。 # # # ・欲しい結果 # item_id | 1月 | 2月 | … | 11月 | 12月 | 13月 # -------------------------------------------- # 00001  | 550 |  20 | … | 370 |  30 | 610 # 00002  |  10 | 130 | … | (後略) # # ※2010/1〜2011/1の13ヶ月間を1月〜13月として(2011/1を13月として)それぞれ集計を求めたい # # # ・説明 # 現状は、 # ------------------------------------ # SELECT #  year, item_id # FROM #  ITEM_COUNT # WHERE #  year=2010 # GROUP BY #  item_id, year # PIVOT #  Format(month,"#0月") In ("1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"); # ------------------------------------ # 上のクエリを「集計1」、WHERE句を"year=2011"に変更したものを「集計2」とし、 # 次のクエリで結果を求めています。 # ------------------------------------ # SELECT #  集計1.item_id, 集計1.[1月], 集計1.[2月], … , 集計1.[12月],集計2.[1月] AS 13月 # FROM #  集計1 LEFT JOIN 集計2 ON 集計1.[item_id] = 集計2.[item_id] # ------------------------------------ # # しかしこれだと2011/1にのみデータがあるitem_idが集計から外れてしまいます。 # これを回避するにはどのように直したら良いでしょうか。 # # 年度を俣いで月合計を表示する :- findsetof([_item_id],( 'ITEM_COUNT'(_item_id,_year,_month,_count)), L1), findall([_item_id,_合計回数ならび],( append(_,[_item_id|_],L1), '2010年集計'(_2010年counts), '2011年集計'(_2011年counts), append(_2010年counts,_2011年counts,_合計回数ならび)), _集計ならび), 見出し表示, append(_,[[_itemp_id,_合計回数ならび]|R],_集計ならび), write_formatted(' %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d\n',_合計回数ならび), R = []. 見出し表示 :- append(_,[_月|R],['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月']), write_formatted(' %3s |',[_月]), R = [], write(' 13月\n'),!. '2010年集計'(_item_id,2010,_month,_合計回数) :- for(1,_month,12), findsum(_count,'ITEM_COUNT'(_item_id,2000,_month,_count),_合計回数). '2011年集計'(_item_id,2011,_month,_合計回数) :- findsum(_count,'ITEM_COUNT'(_item_id,2011,1,_count),_合計回数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/965 # # [1] 授業単元: cプログラム # [2] 問題文(含コード&リンク):100点満点の試験の得点データが学生の人数分ある。これを「不定個数のデータの読み込み」の #  どちらかの方法(最初にデータの個数を読み込むか、データの終わりを特別な値で知らせるか) #  で読み込み、10点刻みでの度数分布表を作成しなさい。 # '100点満点の試験の得点データが学生の人数分ある。これを「不定個数のデータの読み込み」のどちらかの方法(最初にデータの個数を読み込むか、データの終わりを特別な値で知らせるか)で読み込み、10点刻みでの度数分布表を作成する' :- 最初にデータの個数を読み込む(_データの個数), length(_得点ならび,_データの個数), 得点データを読み込む(_得点ならび), '10点刻みでの度数分布表を作成する'(_得点ならび,_度数分布ならび), 度数分布表の表示(_度数分布ならび). 最初にデータの個数を読み込む(_データの個数) :- write('データの個数を入力してください : '), get_line(Line), データの個数読み込み診断(Line,_データの個数),!. 最初にデータの個数を読み込む(_データの個数) :- 最初にデータの個数を読み込む(_データの個数). データの個数読み込み診断(Line,_データの個数) :- atom_to_term(Line,_データの個数,_), integer(_データの個数), _データの個数 > 0,!. データの個数読み込み診断(Line,_データの個数) :- write_formatted('入力された %t から正の整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. 得点データを読み込む(L) :- findall(_得点,( append(L0,[_得点|_]),L), 得点データを読み込む([_|L0],_得点)), L). 得点データを読み込む(Ln,_得点) :- length(Ln,Len), write_formatted('%t人目の得点を入力してください : ',[Len]), get_line(Line), 得点データ診断(Line,_得点),!. 得点データを読み込む(Ln,_得点) :- 得点データを読み込む(Ln,_得点). 得点データ診断(Line,_得点) :- atom_to_term(Line,_得点,_), integer(_得点), _得点 >= 0, _得点 =< 100,!. 得点データ診断(Line,_) :- write_formatted('入力された %t から0以上100以下の整数の得点は得られませんでした。\n再入力をお願いします\n',[Line]), fail. '10点刻みでの度数分布表を作成する'(L,_データの個数,_度数分布表) :- '10点刻みでの度数ならびを作成する'(L,[0,0,0,0,0,0,0,0,0,0,0],_度数ならび), findall(U,( append(_,[A|_],_度数ならび), U is truncate(floor((A * 100 / _データの個数) + 0.5))), _度数分布表). '10点刻みでの度数ならびを作成する'([],L,L) :- !. '10点刻みでの度数ならびを作成する'([A|R],L1,L) :- 度数ならびの更新(A,L1,L2), '10点刻みでの度数ならびを作成する'(R,L2,L). 度数ならびの更新(_得点,L1,L2) :- _位置 is _点数 // 10, append(L0,[_度数|R],L1), length(L0,_位置), _度数2 is _度数 + 1, append(L0,[_度数2|R],L2),!. 度数分布表の表示(_度数分布表) :- write('階級 , 度数\n'), 度数分布表の表示(0,_度数分布表). 度数分布表の表示(_,[]) :- !. 度数分布表の表示(100,[_度数|R]) :- write_formatted('%2d ,%3d\n',[N,N1,_度数]),!. 度数分布表の表示(N,[_度数|R]) :- N1 is N + 9, write_formatted('%2d-%2d,%3d\n',[N,N1,_度数]), N2 is N + 10, 度数分布表の表示(N2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/666 # # [1] 授業単元: # [2] 問題文: http://ime.nu/ux.getuploader.com/sanada1678/download/17/%E3%82%B3%E3%83%94%E3%83%BC+%EF%BD%9E+%E8%AA%B2%E9%A1%8C.csv # # ある駐車場が昼間20分100円の料金で駐車場を貸しています。 # 左のデータは入出庫のデータです。 # 駐車時間の長さの分類はおもに # 20分,40分,1時間,2時間,6時間,12時間,24時間以上 # です。これをもとに次の問題を解決せよ。 # # 毎時00分時点での(つまり1時間ごとの) # 駐車している駐車台数を自動計算するように表計算のプログラムを作成したい。 # # 1.1時間の間(たとえばその日の13時から14時)に入場してきた車の台数 #   その時間内に清算して出場して行った台数を自動計算するように表計算の #   プログラムを作成せよ。その結果として、00分時点での駐車台数が自動計算できる #   ようにプログラムを作成せよ。 # # 2.一定期間内(例えば1日や一週間と特定して)での #   駐車時間の長さで分類した台数 #   たとえば 30分以内,1H,2H,6H,12H,24H以上 #   が自動計算できるようにプログラムを作成せよ。 # # 3.とりあえず最初に駐車していた台数を0台として表を作成せよ。 #   それが出来たら最初に駐車していた台数を任意に設定することで #   その後の駐車している台数を自動計算できるように表を作成せよ。 # # 11月、12月などのデータを入力しても瞬時に計算できるようにしておく。 # 夜間の駐車料金などもデータから推測せよ。 # # 2010/10/31 20:38,2010/10/31 23:24,,300,300,,,,,,,,, # 2010/10/31 10:47,2010/10/31 22:12,,600,600,,,,,,,,, # 2010/10/31 12:25,2010/10/31 22:06,,600,600,,,,,,,,, # 2010/10/31 19:13,2010/10/31 21:52,,500,500,,,,,,,,, # 2010/10/31 18:49,2010/10/31 21:50,,600,600,,,,,,,,, # 2010/10/31 15:30,2010/10/31 21:45,,600,600,,,,,,,,, # 2010/10/31 10:06,2010/10/31 21:37,,600,600,,,,,,,,, # 2010/10/30 21:57,2010/10/31 21:32,,600,600,,,,,,,,, # 2010/10/31 13:02,2010/10/31 21:29,,600,600,,,,,,,,, # 2010/10/31 20:25,2010/10/31 21:16,,100,100,,,,,,,,, # 2010/10/30 21:19,2010/10/31 21:02,,600,600,,,20,,,,,, # 2010/10/31 9:43,2010/10/31 20:53,,600,600,,,,,,,,, # 2010/10/31 17:45,2010/10/31 20:43,,600,600,,,,,,,,, # 2010/10/31 18:38,2010/10/31 20:38,,600,600,,,00,,,,,, # 2010/10/29 6:53,2010/10/31 20:23,,1800,1800,,,,,,,,, # 2010/10/31 8:04,2010/10/31 19:53,,600,600,,,,,,,,, # 2010/10/31 5:32,2010/10/31 19:25,,600,600,,,,,,,,, # 2010/10/31 12:19,2010/10/31 19:15,,600,600,,,,,,,,, # 2010/10/31 5:53,2010/10/31 19:09,,600,600,,,00,,,,,, /* 'ある駐車場が昼間20分100円の料金で駐車場を貸しています。'. */ '左のデータは入出庫のデータです。'(_入出庫データファイル,_入出庫データならび) :- get_split_lines(_入出庫データファイル,[','],_入出庫データならび). /* '駐車時間の長さの分類はおもに20分,40分,1時間,2時間,6時間,12時間,24時間以上です。'(_駐車開始時刻,_駐車終了時刻,_駐車時間) :- 駐車時間は同一日である(_駐車開始時刻,_駐車終了時刻). '駐車時間の長さの分類はおもに20分,40分,1時間,2時間,6時間,12時間,24時間以上です。'(_駐車開始時刻,_駐車終了時刻,_駐車時間) :- \+(駐車時間は同一日である(_駐車開始時刻,_駐車終了時刻)). */ '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算する'(_毎時00分時点での駐車している駐車台数ならび) :- '左のデータは入出庫のデータです。'(_入出庫データファイル,_入出庫データならび), '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算するように表計算のプログラムを作成したい。'(_入出庫データならび,_毎時00分時点での駐車している駐車台数ならび). '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算する'(LL,LL2) :- findsetof([_年,_月,_日,_時],( append(_,[L|R1],LL), 発生した年・月・日・時(L,_年,_月,_日,_時)), LL1), findall([_年,_月,_日,_時,_駐車台数],( append(_,[[_年,_月,_日,_時]|_],LL1), '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数'(LL,_年,_月,_日,_時,_駐車台数)), LL2). 発生した年・月・日・時([_時刻|_],_年,_月,_日,_時) :- split(_時刻,[' ','/',':'],[_年,_月,_日,_時|_]). 発生した年・月・日・時([_,_時刻|_],_年,_月,_日,_時) :- split(_時刻,[' ','/',':'],[_年,_月,_日,_時|_]). '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数'(LL,_年,_月,_日,_時,_駐車台数) :- count(( member([A,B|_],LL), split(A,['/',' ',':'],LA), split(B,['/',' ',':'],LB), LA @=< [_年,_月,_日,_時,0], LB @>= [_年,_月,_日,_時,0]), _駐車台数),!. '1時間の間(たとえばその日の13時から14時)に入場してきた車の台数その時間内に清算して出場して行った台数を自動計算する'(LL,_年,_月,_日,_時,_入場車数,_出場車数) :- count(( member([A|_],LL), split(A,['/',' ',':'],LA), LA @>= [_年,_月,_日,_時,0], LA @=< [_年,_月,_日,_時,59]), _入場車数), count(( member([_,A|_],LL), split(A,['/',' ',':'],LA), LA @>= [_年,_月,_日,_時,0], LA @=< [_年,_月,_日,_時,59]), _出場車数),!. '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(LL,_時刻下限,_時刻上限,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(LL,_時刻下限,_時刻上限,0,0,0,0,0,0,0,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上). '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([],_時刻下限,_時刻上限,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- !. '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([[_入場時刻,_出場時刻|_]|R],_時刻下限,_時刻上限,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- split(_入場時刻,[' ','/',':'],[_年_1,_月_1,_日_1,_時_1,_分_1]), split(_出場時刻,[' ','/',':'],[_年_2,_月_2,_日_2,_時_2,_分_2]), [_年_1,_月_1,_日_1,_時_1,_分_1] @>= _時刻下限, [_年_2,_月_2,_日_2,_時_2,_分_2] @=< _時刻上限, 入場時刻と出場時刻の時間差分単位(_入場時刻,_出場時刻,_時間差分単位), 時間差単位(_時間差分単位,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_2,_2H_2,_2H_2,_6H_2,_22H_2,_24H_2,_24H以上_2), '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(R,_時刻下限,_時刻上限,_30分以内_2,_1H_2,_2H_2,_6H_2,_12H_2,_24H_2,_24H以上_2,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上). '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([_|R],_時刻下限,_時刻上限,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(R,_時刻下限,_時刻上限,_30分以内_1,_1H_1,_1H_1,_6H_1,_12H_1,_14H_1,_14H以上_1,_30分以内,_1H,_1H,_6H,_12H,_14H,_14H以上). 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_2,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 =< 30, _30分以内_2 is _30分以内_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_2,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 >= 30,_分 < 60, _1H_2 is _1H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_2,_6H_1,_12H_1,_24H_1,_24H以上_1) :- _分 >= 60,_分 < 120, _2H_2 is _2H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_2,_12H_1,_24H_1,_24H以上_1) :- _分 >= 120,_分 < 360, _6H_2 is _6H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_2,_24H_1,_24H以上_1) :- _分 >= 360,_分 < 720, _12H_2 is _12H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_2,_24H以上_1) :- _分 >= 720,_分 < 1440, _24H_2 is _24H_1 + 1,!. 時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_2) :- _分 >= 1440, _24H以上_2 is _24H以上_1 + 1,!. 'とりあえず最初に駐車していた台数を0台として表を作成せよ。それが出来たら最初に駐車していた台数を任意に設定することでその後の駐車している台数を自動計算できるように表を作成せよ。'. '11月、12月などのデータを入力しても瞬時に計算できるようにしておく。夜間の駐車料金などもデータから推測せよ。'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 入場時刻と出場時刻の時間差分単位(_入場時刻,_出場時刻,_時間差分単位) :- atom(_入場時刻), atom(_出場時刻), split(_入場時刻,['/',' ',':'],[_年_1,_月_1,_日_1,_時_1,_分_1]), split(_出場時刻,['/',' ',':'],[_年_2,_月_2,_日_2,_時_2,_分_2]), 出場時刻と入場時刻の時間差分単位([_年_1,_月_1,_日_1,_時_1,_分_1],[_年_2,_月_2,_日_2,_時_2,_分_2],_時間差分単位). 入場時刻と出場時刻の時間差分単位([_年,_月,_日,_時,_分_1],[_年,_月,_日,_時,_分_2],_時間差分単位) :- _時間差分単位 is _分2 - _分1,!. 入場時刻と出場時刻の時間差分単位([_年,_月,_日,_時_1,_分_1],[_年,_月,_日,_時_2,_分_2],_時間差分単位) :- _時間差分単位 is (60 * _時_2 + _分_2) - (60 * _時_1 + _分1),!. 入場時刻と出場時刻の時間差分単位([_年,_月,_日_1,_時_1,_分_1],[_年,_月,_日_2,_時_2,_分_2],_時間差分単位) :- _時間差分単位 is (1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _日_1 + 60 * _時_1 + _分1),!. 入場時刻と出場時刻の時間差分単位([_年,_月_1,_日_1,_時_1,_分_1],[_年,_月_2,_日_2,_時_2,_分_2],_時間差分単位) :- _月_2_1 is _月_2 - 1, findsum(_月日数,( for(_月_1,_月,_月_2_1), 月日数(_年_1,_月,_月日数)), _月日数合計の一), _月日数合計 is truncate(_月日数合計の一), _時間差分単位 is (1440 * _月日数合計 + 1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _日_1 + 60 * _時_1 + _分_1),!. 入場時刻と出場時刻の時間差分単位([_年_1,_月_1,_日_1,_時_1,_分_1],[_年_2,_月_2,_日_2,_時_2,_分_2],_時間差分単位) :- _年_2_1 is _年_2 - 1, findsum(_年日数,( for(_年_1,_年,_年_2_1), 年日数(_年,_年日数)), _年日数合計の一), _年日数合計 is truncate(_年日数合計の一), _月_1_1 is _月_1 - 1, findsum(_月日数,( for(0,_月,_月_1_1), 月日数(_年_1,_月,_月日数)), _月日数合計の一), _月日数合計_1 is truncate(_月日数合計の一), _月_2_1 is _月_2 - 1, findsum(_月日数,( for(0,_月,_月_2_1), 月日数(_年_2,_月,_月日数)), _月日数合計の二), _月日数合計_2 is truncate(_月日数合計の二), _時間差分単位 is (1440 * _年日数の合計 + 1440 * _月日数合計_2 + 1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _月日数合計_1 + 1440 * _日_1 + 60 * _時_1 + _分_1),!. 年日数(_年,366) :- うるう年(_年),!. 年日数(_年,365). 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,29) :- \+(うるう年(_年)),!. 月日数(_年,_月,31) :- append(_,[_月|_],[1,3,5,7,8,10,12]),!. 月日数(_年,_月,30) :- append(_,[_月|_],[4,6,9,11]),!. 月日数(_,0,0). うるう年(_年) :- 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/php/1168450843/494 # # 文字xが離散して10個以上であるか(連続している部分は数えない) '文字列の中に文字xが離散して10個以上であるか(連続している部分は数えない)'(_文字列) :- '文字列の中に文字が離散してn個以上であるか(連続している部分は数えない)'(x,10,_文字列). '文字列の中に文字が離散してn個以上であるか(連続している部分は数えない)'(_文字,_n個,_文字列) :- count(( sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[_文字],L3), \+((last(L1,_文字),L3=[_文字|_]))), Count), Count >= _n個,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/494 # # 文字xが離散して10個以上であるか(一箇所でも連続してはいけない) '文字列の中に文字xが離散して10個以上であるか(一箇所でも連続してはいけない)'(_文字列) :- '文字列の中に文字が離散してn個以上であるか(一箇所でも連続してはいけない)'(x,10,_文字列). '文字列の中に文字が離散してn個以上であるか(一箇所でも連続してはいけない)'(_文字,_n個,_文字列) :- \+(sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[_文字,_文字],L3)), count(sub_atom(_文字列,_,1,_,_文字),Count), Count >= _n個,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/972 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 5列5行の多次元配列(0または1が適当に並べられているもの)を用意し # 1がある配列の上下左右の配列のうち2または3個1が存在するならその配列を0に変更し # そうでない場合は1のままにする この操作を10回行った配列を求めるプログラムを作成する # またこの配列は上下左右繋がっていて1,1の配列の場合上は1,5、左は5.1である # % http://nojiriko.asia/prolog/c144_919.html から述語を借用する。 '5列5行の行列(0または1が適当に並べられているもの)を用意し1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにする。この操作を10回行う'(_ならび) :- '5列5行の行列(0または1が適当に並べられているもの)を用意し'(LL1), length(Ln,10), '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにするこの操作を10回行う'(Ln,LL1,LL2). '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにするこの操作を10回行う'([],LL,LL) :- !. '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにするこの操作を10回行う'([_|Ln],LL1,LL) :- '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにする'(LL1,LL2), '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにするこの操作を10回行う'(Ln,LL2,LL). '1があるマスの上下、左右のうち2または3個1が存在するならその行または列を0に変更しそうでない場合は1のままにする'(LL1,LL2) :- length(LL2,5), findall(_マス目の値2,( length(Line,5), append(L00,[Line|_],LL2), append(L01,[_マス目の値2|_],Line), length(L00,_行の一), length(L01,_列の一), _行 is _行の一 + 1, _列 is _列の一 + 1, マス目の周囲(LL1,_行,_列,_マス目の値1,_マス目の周辺), マス目の状態診断(_マス目の値1,_マス目の周辺,_マス目の値2)), LL2). '5列5行の行列(0または1が適当に並べられているもの)を用意し'(LL) :- length(LL,5), findall(L,( length(L,5), append(_,[A|_],L), A is random 2), LL). マス目の周囲(LL,1,_マス目の列,_マス目の値,_マス目の周辺ならび) :- append(LL0,[L],LL), append(LL,[L],LL1), マス目の周囲(LL,2,_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲(LL,5,_マス目の列,_マス目の値,_マス目の周辺ならび) :- LL = [L1|R], append(R,L1,LL2), マス目の周囲(LL,4,_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲(LL,_マス目の行,_マス目の列,_マス目の値,_マス目の周辺ならび) :- _マス目の行 >= 2, _マス目の行 =< 4, Nth1 is _マス目の行 - 2, length(L0,Nth1), append(L0,[Line1,Line2,Line3|_],LL), マス目の周囲([Line1,Line2,Line3],_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],1,_マス目の値,_マス目の周辺ならび),!. length(L0,4), findall(L,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,L1,Line), append(L1,L0,L)), LL), マス目の周囲(Line1,Line2,Line3,2,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],5,_マス目の値,_マス目の周辺ならび) :- length(L1,4), findall(L,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,L1,Line), append(L1,L0,L)), LL), マス目の周囲(Line1,Line2,Line3,4,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],_マス目の列,_マス目の値,[A2,A4,A6,A8]) :- _マス目の列 >= 2, _マス目の列 =< 4, Nth1 is _マス目の列 - 2, length(L0,Nth1), findall(U,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,[A,B,C|_],Line), append(_,[U|_],[A,B,C])), L), L = [A1,A2,A3,A4,_マス目の値,A6,A7,A8,A9],!. マス目の状態診断(_マス目の値,_マス目の周囲,0) :- '1のマス目の周囲に2つか3つの1のマス目があれば0に変更される'(_マス目の値,_マス目の周囲,'0'),!. マス目の状態診断(_マス目の値,_マス目の周囲,_マス目の値). '1のマス目の周囲に2つか3つの1のマス目があれば0に変更される'(1,_マス目の周囲) :- count((append(_,[1|_],_マス目の周囲),Count), Count >= 2, Count =< 3,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/919 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/ideone.com/v82fx # # 以下のパズルを解くプログラムを作りなさい. # 30x30の格子状のマス目を考える.各マス目はONまたはOFFのどちらかの状態をとる. # パズルの問題として30x30(すなわち900個)のマス目のON,OFFの状態が与えられる. # この初期状態から以下のルールを用いて各マス目のON,OFFの状態を変化させる. # ルール1: OFFのマス目の周囲に3つのONのマス目があれば次のステップではONになる. # ルール2: ONのマス目の周囲に2つか3つのONのマス目があれば次のステップでもONが維持される. # ルール3: 上以外の場合には次のステップではOFFになる. # 但し,ここでの周囲とはマスに接している8マスを指し,30x30のマスのうち上端と下端, 右端と左端は接続されているものとする. # # この変化を100回繰り替えした時の各マスの状態を求めよ 'パズルの問題として30x30(すなわち900個)のマス目のON,OFFの状態が与えられる. この初期状態から以下のルールを用いて各マス目のON,OFFの状態を変化させる.'(LL1,LL2) :- length(LL2,30), findall(_マス目の値2,( length(Line,30), append(L00,[Line|_],LL2), append(L01,[_マス目の値2|_],Line), length(L00,_行の一), length(L01,_列の一), _行 is _行の一 + 1, _列 is _列の一 + 1, マス目の周囲(LL1,_行,_列,_マス目の値1,_マス目の周辺), マス目の状態診断(_マス目の値1,_マス目の周辺,_マス目の値2)), LL2). マス目の周囲(LL,1,_マス目の列,_マス目の値,_マス目の周辺ならび) :- append(LL0,[L],LL), append(LL,[L],LL1), マス目の周囲(LL,2,_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲(LL,30,_マス目の列,_マス目の値,_マス目の周辺ならび) :- LL = [L1|R], append(R,L1,LL2), マス目の周囲(LL,29,_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲(LL,_マス目の行,_マス目の列,_マス目の値,_マス目の周辺ならび) :- _マス目の行 >= 2, _マス目の行 =< 29, Nth1 is _マス目の行 - 2, length(L0,Nth1), append(L0,[Line1,Line2,Line3|_],LL), マス目の周囲([Line1,Line2,Line3],_マス目の列,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],1,_マス目の値,_マス目の周辺ならび),!. length(L0,29), findall(L,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,L1,Line), append(L1,L0,L)), LL), マス目の周囲(Line1,Line2,Line3,2,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],30,_マス目の値,_マス目の周辺ならび) :- length(L1,29), findall(L,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,L1,Line), append(L1,L0,L)), LL), マス目の周囲(Line1,Line2,Line3,29,_マス目の値,_マス目の周辺ならび),!. マス目の周囲([Line1,Line2,Line3],_マス目の列,_マス目の値,[A1,A2,A3,A4,A6,A7,A8,A9]) :- _マス目の列 >= 2, _マス目の列 =< 29, Nth1 is _マス目の列 - 2, length(L0,Nth1), findall(U,( append(_,[Line|_],[Line1,Line2,Line3]), append(L0,[A,B,C|_],Line), append(_,[U|_],[A,B,C])), L), L = [A1,A2,A3,A4,_マス目の値,A6,A7,A8,A9],!. マス目の状態診断(_マス目の値,_マス目の周囲,'ON') :- 'OFFのマス目の周囲に3つのONのマス目があれば次のステップではONになる'(_マス目の値,_マス目の周囲,OFF). マス目の状態診断(_マス目の値,_マス目の周囲,'ON') :- 'ONのマス目の周囲に2つか3つのONのマス目があれば次のステップでもONが維持される'(_マス目の値,_マス目の周囲,'ON'),!. マス目の状態診断(_,_マス目の周囲,'OFF') :- 上以外の場合には次のステップではOFFになる. 上以外の場合には次のステップではOFFになる. 'OFFのマス目の周囲に3つのONのマス目があれば次のステップではONになる'('OFF',_マス目の周囲,'ON') :- count((append(_,['ON'|_],_マス目の周囲),2),!. 'ONのマス目の周囲に2つか3つのONのマス目があれば次のステップでもONが維持される'('ON',_マス目の周囲) :- count((append(_,['ON'|_],_マス目の周囲),Count), Count >= 2, Count =< 3,!. 'この変化を100回繰り替えした時の各マスの状態を求めよ'(LL1,LL2) :- length(Ln,100), 'この変化を100回繰り替えした時の各マスの状態を求めよ'(Ln,LL1,LL2). 'この変化を100回繰り替えした時の各マスの状態を求めよ'([],LL,LL) :- !. 'この変化を100回繰り替えした時の各マスの状態を求めよ'([_|Ln],LL1,LL2) :- 'パズルの問題として30x30(すなわち900個)のマス目のON,OFFの状態が与えられる. この初期状態から以下のルールを用いて各マス目のON,OFFの状態を変化させる.'(LL1,LL3), 'この変化を100回繰り替えした時の各マスの状態を求めよ'(Ln,LL3,LL2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/924 # # [1] 授業単元:C言語 関数 # [2] 問題文(含コード&リンク): http://ime.nu/www.dotup.org/uploda/www.dotup.org1330457.txt # # 8桁までの整数を表わす文字列(例: "-3246") を整数値(例:3246) に変換する関数を作りたい。 # # 1. 整数を表わす文字列はつぎの条件を全て同時に満たすと考えられる。 # (1) 文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である # (2) 文字列の2 文字目以降は’0’〜’9’ である # (3) 符号を除いた文字列の長さは1 以上8 以下である # # 文字列を引数とし、これらの条件を同時に満たす時に整数値1 を、一つでも満たさない時 # (整数として文字列にエラーがある場合)は0を戻り値として返す関数check() を作れ。 # # 2. 変換したい文字列を引数とし、正負を判断して値が正または0 の時には1 を、 # 負の時には-1を、整数として文字列にエラーがある場合には0 を返す関数sign() を作れ。 # # 3. 問1, 2 を利用し8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す関数 # myatoi() を作成せよ '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(_文字列,_整数値) :- '文字列を引数とし、これらの条件を同時に満たす時に整数値1 を、一つでも満たさない時は0を戻り値として返す'(_文字列,_診断値), '変換したい文字列を引数とし、正負を判断して値が正または0 の時には1 を、負の時には-1を、整数として文字列にエラーがある場合には0 を返す'(_文字列,_返り値), atom_chars(_文字列,Chars), '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(Chars,_診断値,_返り値,0,_整数値の一), _整数値 is _整数値の一 * _返り値. '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'([A],_診断値,_返り値,Y,X) :- 文字数値変換(A,N), X is 10 * Y + N,!. '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(['+'|R],_診断値,_返り値,Y,X) :- '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(R,_診断値,_返り値,Y,X),!. '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(['-'|R],_診断値,_返り値,Y,X) :- '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(R,_診断値,_返り値,Y,X),!. '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'([A|R],_診断値,_返り値,Y,X) :- 文字数値変換(A,N), Y2 is 10 * Y + N, '8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す'(R,_診断値,_返り値,Y2,X). '文字列を引数とし、これらの条件を同時に満たす時に整数値1 を、一つでも満たさない時は0を戻り値として返す'(_文字列,_診断値) :- sub_atom(_文字列,0,1,R,_符号), append(_,[_符号|_],['+','-']), \+(R = 0), count(( sub_atom(_文字列,St,1,_,A), St >= 1, \+(文字数値変換(A,_))),0), _診断値 = 1,!. '文字列を引数とし、これらの条件を同時に満たす時に整数値1 を、一つでも満たさない時は0を戻り値として返す'(_文字列,0). '変換したい文字列を引数とし、正負を判断して値が正または0 の時には1 を、負の時には-1を、整数として文字列にエラーがある場合には0 を返す'(_文字列,-1) :- sub_atom(_文字列,0,1,_,'-'),!. '変換したい文字列を引数とし、正負を判断して値が正または0 の時には1 を、負の時には-1を、整数として文字列にエラーがある場合には0 を返す'(_文字列,1). 文字数値変換('0',0). 文字数値変換('1',1). 文字数値変換('2',2). 文字数値変換('3',3). 文字数値変換('4',4). 文字数値変換('5',5). 文字数値変換('6',6). 文字数値変換('7',7). 文字数値変換('8',8). 文字数値変換('9',9). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/847 # # [1] 授業単元:C++ # [2] 問題文(含コード&リンク):1辺の長さが2の正方形の中に半径1の円形の標的がある。この板に向かってランダムに弾を撃って、標的に # が入ったか否かを調べることで円周率を求める(モンテカルロ法)プログラムを作りなさい。 # 撃った弾の数をx、命中した数をyとする。 # '1辺の長さが2の正方形の中に半径1の円形の標的がある。この板に向かってランダムに弾を撃って、標的にが入ったか否かを調べることで円周率を求める(モンテカルロ法)'(_円周率) :- count(( for(1,_,100000), _x is ((random mod 20001) - 10000) / 10000, _y is ((random mod 20001) - 10000) / 10000, 1.0 >= sqrt((_x ^ 2) + (_y ^ 2))), Count), _円周率 is (Count / 100000) * 4. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/798 # # [1] 授業単元:数値数理解析 # [2] 問題文(含コード&リンク): # リンク先の画像に問題文を載せています。 # ttp://www.dotup.org/uploda/www.dotup.org1315077.jpg # # 三次元空間で # x > 0, y > 0, 0 < z < 1, x^2 + y^2 < (1-z)^2 # を満たす領域は半径1,高さ1の直円錐の四分の一と同じになる. # 'x > 0, y > 0, 0 < z < 1, x^2 + y^2 < (1-z)^2を満たす領域は半径1,高さ1の直円錐の四分の一と同じになることをモンテカルロ法で示す'(_試行回数,_満足回数) :- count(( for(1,N,_試行回数), X is (random mod 10001) / 10000, Y is (random mod 10001) / 10000, Z is (random mod 10001) / 10000, 'x > 0, y > 0, 0 < z < 1, x^2 + y^2 < (1-z)^2を満たす'(X,Y,Z,U)), _満足回数). 'x > 0, y > 0, 0 < z < 1, x^2 + y^2 < (1-z)^2を満たす'(X,Y,Z,1) :- (X^2 + Y^2) < ((1 - Z) ^ 2),!. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/471 # # 【質問テンプレ】 # ・DBMS名とバージョン: SQLite 3 # ・テーブルデータ:長いため下記に記載 # ・欲しい結果:RSSリーダ(brief)のデータ(*.sqlite)から特定の記事データを削除したいです。 # ・説明:長いため下記に記載 # # ●テーブルデータ # ======================================================================================================================= # ■entries #  | id | feedID | primaryHash | secondaryHash | providerID | entryURL | date | read | updated | starred | deleted | bookmarkID | # ----------------------------------------------------------------------------------------------------------------------- # ■entries_text #  | title | content | authors | tags | # ----------------------------------------------------------------------------------------------------------------------- # ■entries_text_content #  | docid | c0title | c1content | c2authors | c3tags | # ----------------------------------------------------------------------------------------------------------------------- # ■sqlite_sequence #  | name | seq | # ======================================================================================================================= # # 1.【entries】テーブルの[deleted]フィールドが「 2 」の場合に、そのレコードを削除。 # # 2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した #   [id]フィールドと同じ値のレコードも削除。 # # 3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と #   同じレコード番号のレコードを削除。 ※idフィールドがない為 # # 4.その後、下記のフィールドの値を、1・2・3〜とリナンバリングしたい。 #   【entries】テーブルの[id]フィールド #   【entries_text_content】テーブルの[docid]フィールド # # 5.そして、1.2.3.の三つのテーブルのレコード数がどれも同じ数だけあるか確認。 # # 6.最後に、【sqlite_sequence】テーブルの[seq]フィールドに5.で確認したレコード数を #   設定したい。 # # お手数ですが、以上よろしくお願いします。 # # '1.【entries】テーブルの[deleted]フィールドが「 2 」の場合に、そのレコードを削除' :- findsetof(_id,( entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)), _deleted = '2'), L1), retract_all(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,'2',_bookmarkID)), findsetof(_docid,( member(_id,L1), entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags)), _docid = _id), L2), '2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した[id]フィールドと同じ値のレコードも削除。'(L2), '3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(L1),!. '2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した[id]フィールドと同じ値のレコードも削除。'(L2) :- member(_docid,L2), retract_all(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags)),!. '3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(L1) :- append(_,[Nth|R],L1), 節の定義位置指定による節の削除(L2,Nth), R = [],!. '3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(_). 節の定義位置指定による節の削除(L2,Nth) :- findall((Head :- Body),( clause(entries_text(_title,_content,_authors,_tags),Head,Body)), L2), list_nth(Nth,L2,P), retract(P),!. '4.その後、下記のフィールドの値を、1・2・3〜とリナンバリングしたい。 【entries】テーブルの[id]フィールド 【entries_text_content】テーブルの[docid]フィールド' :- findall(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID),( retract(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID))), L1), append(L01,[entries(_,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)|R1],L1), length([_|L0],Nth1), assertz(entries(Nth1,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)), R1 = [], findall(entries_text_contents(_,_c0title,_c1content,_c2authors,_c3tags),( retract(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags))), L2), append(L02,[entries_text_contents(_,_c0title,_c1content,_c2authors,_c3tags)|R2],L2), length([_|L02],Nth2), assertz(entries_text_contents(Nth2,_c0title,_c1content,_c2authors,_c3tags)), R2 = [],!. '5.そして、1.2.3.の三つのテーブルのレコード数がどれも同じ数だけあるか確認。'(Count) :- count(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID),Count), count(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags),Count), count(entries_text(_title,_content,_authors,_tags),Count). '6.最後に、【sqlite_sequence】テーブルの[seq]フィールドに5.で確認したレコード数を設定したい。'(Count) :- retract(sqlite_sequence(_name,_seq)), assertz(sqlite_sequence(_name,Count),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/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.2 # ch.net/test/read.cgi/tech/1267796762/657 # 【 課題 】 # (6)2,3,4,5,6の数が書かれたカードが1枚ずつ、合計5枚ある。これらのカードを無作為に横一列に並べたとき、どのi=1,2,3,4,5に対しても左からi番目のカードに書かれた数がi以上となる確率を求めるプログラム # # 【 形態 】http://ime.nu/www.javadrive.jp/install/jdk/で設定したのですが1でしょうか… # 【 期限 】12月16日です # 【 Ver  】1.6.0_22 # 【 補足 】ぎりぎりで丸投げですがよろしくお願いします! # # '2,3,4,5,6の数が書かれたカードが1枚ずつ、合計5枚ある。これらのカードを無作為に横一列に並べたとき、どのi=1,2,3,4,5に対しても左からi番目のカードに書かれた数がi以上となる確率を求める'(_確率) :- '左からi番目のカードに書かれた数がi以上の度数'(1,2,0,0,_分子,_分母), \+(_分母 = 0), _確率 is _分子 / _分母,!. '左からi番目のカードに書かれた数がi以上の度数'(5,_カード,X,Y,X,Y) :- _カード > 6,!. '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :- _カード > 6, _i2 is _i + 1, '左からi番目のカードに書かれた数がi以上の度数'(_i2,2,_分子2,_分母2,_分子,_分母),!. '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :- _カード >= _i, _分子2 is _分子1 + 1, _分母2 is _分母1 + 1, '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子2,_分母2,_分子,_分母),!. '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :- _カード >= _i, _分母2 is _分母1 + 1, '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母2,_分子,_分母),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/523 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/www.dotup.org/uploda/www.dotup.org1299230.jpg.html # 文字列に含まれている英字小文字の数を数える(_文字列,_英字小文字の数) :- count((sub_atom(_文字列,_,1,_,_文字),_文字 @>= 'a',_文字 @=< 'z'),_英字小文字の数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/604 # # 【 課題 】label5 に,もう一つのlabel を追加し,新しいラベルに # 正解数(累積で計算),および正解率(累積で計算) # をするように改造してみよう. # 【 形態 】1. Javaアプリケーション # 【 GUI  】1. AWTのみ # 【 期限 】明日午前中 # 【 Ver  】java version "1.5.0_09" # 【 補足 】正解数と正解率のlabelは作ってあります。 # ソースです # http://ime.nu/www.dotup.org/uploda/www.dotup.org1278921.zip.html # # eclipseを使って作っているのですが、 # わからないので急ですがよろしくお願いします。 # 問(1,'17+25=?',[37,43,47],3). 問(2,日本の都道府県の数は?,[37,43,47],3). 問(3,日本一大きな湖があるのは?,[千葉,滋賀,佐賀],2). すべての問題に解答して問題数、正解数、正解率を得る(_問題数,_正解数,_正解率) :- findcount(問(_,_,_),_問題数), findcount(( for(1,_問題番号,_問題数), 問題に答える(_問題番号,_問題文,_選択文ならび,_正解,_解答), 解答診断(_選択文ならび,_正解,_解答,正解)), _正解数), _正解率 is _正解数 / _問題率 * 100,!. 問題に答える(_問題番号,_問題文,_選択文ならび,_正解,_解答) :- 問(_問題番号,_問題文,_選択文ならび,_正解), write_formatted('問題 %t \n'), 解答番号を選択する(_選択文ならび,_解答). 解答番号を選択する(_選択文ならび,_解答) :- 選択文表示([_],_選択文ならび), write('答えは? '), get_Line(Line), 解答番号を選択診断(Line,_解答),!. 解答番号を選択する(_選択文ならび,_解答) :- 解答番号を選択する(_選択文ならび,_解答). 解答番号を選択診断(Line,_解答) :- atom_to_term(Line,_解答,_), integer(_解答),!, 解答番号の範囲診断(Line,_解答). 解答番号を選択診断(Line,_解答) :- write_formatted('入力された %t は整数ではありません。再入力をお願いします。\n',[Line]), fail. 解答番号の範囲診断(_解答) :- _解答 >= 1, _解答 =< 3,!. 解答番号の範囲診断(_解答) :- write_formatted('入力された解答%tは選択番号にありません。再入力が必要です。\n',[_解答]), fail. 選択文表示(Ln,[]) :- !. 選択文表示(Ln,[_文|R]) :- length(Ln,N), write_formatted('%t .. %t\n',[N,_文]), 選択文表示([_|Ln],R). 解答診断(_選択文ならび,_正解,_正解,正解) :- write('正解です!!!\n'),!. 解答診断(_選択文ならび,_正解,_解答,不正解) :- \+(_正解=_解答), list_nth(_正解,_選択文ならび,_正解文), write_formatted('不正解です!!! 正解は %t..%t でした。\n',[_正解,_正解文]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/280 # # 1] 授業単元: プログラミング # [2] 問題文 # #include <stdio.h> # #include <string.h> /*strlenのため */ # # void # main( void ) # { # char mojis[16]; /* 文字列を入れるための配列 */ # int i; # int n; /* 'e'の数 */ # # printf("文字列:"); # scanf("%15s", mojis ); # mojis[15] = '\0'; # # # for( i=0, n=0; mojis[i]; i++ ) /* ヌル字まで順に見ていく */ # { # if( mojis[i] == 'e' ) /* 文字と文字定数との比較 */ # { # n++; # } # } # printf( "文字数 %d のうち'e'は %d個", strlen(mojis ), n ); # return; } # このプログラミングを改造 # 1.strlenを使わずに文字数をカウントする。 # 特定文字が文字列の中に出現する度数を調べる(_特定文字,_文字列,_出現度数) :- count(sub_atom(_文字列,_,1,_,_特定文字),_出現度数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/280 # # 1] 授業単元: プログラミング # [2] 問題文 # #include <stdio.h> # #include <string.h> /*strlenのため */ # # void # main( void ) # { # char mojis[16]; /* 文字列を入れるための配列 */ # int i; # int n; /* 'e'の数 */ # # printf("文字列:"); # scanf("%15s", mojis ); # mojis[15] = '\0'; # # # for( i=0, n=0; mojis[i]; i++ ) /* ヌル字まで順に見ていく */ # { # if( mojis[i] == 'e' ) /* 文字と文字定数との比較 */ # { # n++; # } # } # printf( "文字数 %d のうち'e'は %d個", strlen(mojis ), n ); # return; } # このプログラミングを改造 # 1.strlenを使わずに文字数をカウントする。 # 特定文字が文字列の中に出現する度数を調べる(_特定文字,_文字列,_出現度数) :- atom_chars(_文字列,Chars), 特定文字が文字列の中に出現する度数を調べる([],_特定文字,Chars,_出現度数). 特定文字が文字列の中に出現する度数を調べる(Ln,_,[],_出現度数) :- length(Ln,_出現度数),!. 特定文字が文字列の中に出現する度数を調べる(Ln,_特定文字,[_特定文字|R],_出現度数) :- 特定文字が文字列の中に出現する度数を調べる([_|Ln],_特定文字,R,_出現度数),!. 特定文字が文字列の中に出現する度数を調べる(Ln,_特定文字,[_|R],_出現度数) :- 特定文字が文字列の中に出現する度数を調べる(Ln,_特定文字,R,_出現度数),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/273 # # [1] 授業単元:プログラミング # [2] 問題文 # 問題1.文字列を入力し、入力された文字列について、次の1~6のすべてを表示するプログラムを作 # 成しなさい。 # 1 全文字の合計文字数 # 2 数字の文字数 # 3 英大文字の文字数 # 4 英小文字の文字数 # 5 空白の文字数 # 6 その他の文字の文字数 # ただし、 # ・ 下記の実行結果のように、それらの数値を表示しなさい。 # ・ データの読み込みは getchar 関数を使うこと。 # '文字列を入力し、入力された文字列について、次の1~6のすべてを表示するプログラム' :- get_lilne(Line), '1 全文字の合計文字数'(Line), '2 数字の文字数'(Line), '3 英大文字の文字数'(Line), '4 英小文字の文字数'(Line), '5 空白の文字数'(Line), '6 その他の文字の文字数'(Line),!. '1 全文字の合計文字数'(Line) :- sub_atom(Line,_,Len,_,Line), write_formatted('全文字の合計文字数は %t 文字です\n',[Len]). '2 数字の文字数'(Line) :- count((sub_atom(Line,_,1,_,Char),Char @>= '0',Char @=< '9'),Count), write_formatted('数字の文字数は %t 文字です\n',[Count]). '3 英大文字の文字数'(Line) :- count((sub_atom(Line,_,1,_,Char),Char @>= 'A',Char @=< 'Z'),Count), write_formatted('英大文字の文字数は %t 文字です\n',[Count]). '4 英小文字の文字数'(Line) :- count((sub_atom(Line,_,1,_,Char),Char @>= 'a',Char @=< 'z'),Count), write_formatted('英個文字の文字数は %t 文字です\n',[Count]). '5 空白の文字数'(Line) :- count((sub_atom(Line,_,1,_,' ')),Count), write_formatted('空白文字の文字数は %t 文字です\n',[Count]). '6 その他の文字の文字数'(Line) :- count(( sub_atom(Line,_,1,_,Char), \+((Char @>= '0',Char @=< '9')), \+((Char @>= 'A',Char @=< 'Z')), \+((Char @>= 'a',Char @=< 'z')), \+(Char=' ')), Count), write_formatted('その他の文字の文字数は %t 文字です\n',[Count]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/152 # # [1] 授業単元:プログラミングC # [2] 問題文(含コード&リンク): # 無限ループを用い、1〜50までの数値を任意に10個入力し、その度数分布を求めよ。但し、度数分布は5等分(例;1〜10に4個, 11〜20に3個, 21〜30・・・41〜50に0個)して表示せよ。 # '無限ループを用い、1〜50までの数値を任意に10個入力し、その度数分布を求めよ。但し、度数分布は10等分(例;1〜10に4個, 11〜20に3個, 21〜30・・・41〜50に0個)して表示せよ。' :- length(L,10), '1〜50までの数値を得る'(N), 無限ループを用い、1〜50までの数値を任意に10個入力し、(N,[],L), 度数分布を求める(L,[1-10,11-20,21-30,31-40,41-50],_度数分布ならび), 度数分布の表示(_度数分布ならび). 無限ループを用い、1〜50までの数値を任意に10個入力し、(N,L1,[N|L1]). 無限ループを用い、1〜50までの数値を任意に10個入力し、(N,L1,L) :- '1〜50までの数値を得る'(N2), 無限ループを用い、1〜50までの数値を任意に10個入力し、(N2,[N|L1],L). '1〜50までの数値を得る'(N) :- write('1〜50までの数値を入力してください : '), get_line(Line), 数値入力診断(Line,N),!. '1〜50までの数値を得る'(N) :- '1〜50までの数値を得る'(N). 数値入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N), N >= 1,N =< 50,!. 数値入力診断(Line,N) :- write_formatted('入力された %t からは1〜50までの数値は得られませんでした。再入力をお願いします。\n',[Line]), fail. 度数分布を求める(L,[],[]) :- !. 度数分布を求める(L,[_階級下限-_階級上限|R1],[[_階級下限-_階級上限,_度数]|R2]) :- count((append(_,[N|_],L),N>=_階級下限,N=<_階級上限),_度数), 度数分布を求める(L,R1,R2). 度数分布の表示([]) :- !. 度数分布の表示([[_階級下限-_階級上限,_度数]|R]) :- write_formatted('%t~%t : %t\n,[_階級下限,_階級上限,_度数]), 度数分布の表示(R). % 以下のサイトは # 出典:: 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/1289913298/6 # # [1] 授業単元:C言語基礎 # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1254228.txt.html # # [3]小文字のアルファベットから成る英単語に含まれる母音('a', 'i', 'u', 'e', 'o')の数 # を数える関数 count_boin を作成せよ.ただし,引数として英単語と母音の文字列を受け取り, # 戻り値として母音の数を返すものとする.また,ポインタを使って簡潔かつ高速に文字列を # 操作すること.この関数内で配列を使用しないこと,意味のないポインタの使い方をしないこと。 # # # 下のmain 関数を用いて,正常な動作結果が得られることを確認せよ '小文字のアルファベットから成る英単語に含まれる母音(a,i,u,e,o)の数を数える'(_小文字のアルファベットから成る英単語,_母音の数) :- atom_chars(_小文字のアルファベットから成る英単語,Chars), count((append(_,[Char|_],Chars),append(_,[Char|_],[a,i,u,e,o])),_母音の数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/6 # # [1] 授業単元:C言語基礎 # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1254228.txt.html # # [1]呼び出された回数を表示する関数 count を作成せよ.ただし,呼び出された回数が 3 の # 倍数のときには回数の後に!を,5 の倍数のときには?を付けて表示すること.なお,プログラム中では # グローバル変数を使用しないものとする. # 下のmain関数で count を呼び出した場合,正しい動作結果が得られるか確認せよ # '呼び出された回数を表示する関数 count を作成せよ.ただし,呼び出された回数が 3 の倍数のときには回数の後に!を,5 の倍数のときには?を付けて表示する' :- assertz((count(1) :- fail)), assertz((count(N) :- retract((count(N) :- _)),Mod3 is N mod 3,Mod5 is N mod 5,count表示(N,Mod3,Mod5),N2 is N + 1,asserta((count(N2) :- fail)))). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(1) :- fail. count(N) :- retract((count(N) :- _)), Mod3 is N mod 3, Mod5 is N mod 5, count表示(N,Mod3,Mod5), N2 is N + 1, asserta((count(N2) :- fail)). count表示(N,0,0) :- write_formatted('%t!? ',[N]),!. count表示(N,0,_) :- write_formatted('%t! ',[N]),!. count表示(N,_,0) :- write_formatted('%t? ',[N]),!. count表示(N,_,_) :- write_formatted('%t ',[N]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/607 # # MySQLServer5.1(WinXP)です。 # # 下記のような3種類のテーブルがあります。 # これを集計して、指定したユーザーの指定月のアクセス日時と売上げ金額を表にしたいと思っています。 # # こんな感じに。 # # +--+--------+----------+-------+-----+ # | id | username| date   | access | sales | # +--+--------+----------+-------+-----+ # | 1 | admin | 2010-11-13 |   2 | 5000 | # | 1 | admin | 2010-11-14 |   2 | 5000 | # | 1 | admin | 2010-11-15 |  1 | 20000 | # +--+--------+----------+-------+-----+ # # # SELECT u.id AS id, u.username, DATE(a.created_at) AS date, COUNT(*) AS access, SUM(s.amount) AS sales # FROM sf_guard_user u INNER JOIN sales s ON u.username = s.user_id LEFT JOIN access_log a ON u.username = a.user_id # WHERE (u.username = 'admin' AND a.created_at > '2010-11-01 00:00:00' AND a.created_at < '2010-11-30 23:59:59') GROUP BY date ORDER BY a.created_at; # とやってみたのですがダメでした;; # # # ■ユーザー情報テーブル # mysql> select id,username from user; # +--+---------+ # | id | username | # +--+---------+ # | 1 | admin   | # +--+---------+ # # ■アクセスログテーブル # mysql> select * from access_log; # +--+-------+--------+------------------+ # | id | user_id | ip     | created_at      | # +--+-------+--------+------------------+ # | 1 | admin  | 127.0.0.1 | 2010-11-13 21:56:54 | # | 2 | admin  | 127.0.0.1 | 2010-11-13 21:56:54 | # | 3 | admin  | 127.0.0.1 | 2010-11-14 21:56:54 | # | 4 | admin  | 127.0.0.1 | 2010-11-14 21:56:54 | # | 5 | admin  | 127.0.0.1 | 2010-11-15 21:56:54 | # +--+-------+--------+------------------+ # # ■売上げ金額テーブル # mysql> select * from sales; # +--+-------+------+------------------+ # | id | user_id | amount| created_at      | # +--+-------+------+------------------+ # | 1 | admin  |  5000 | 2010-11-13 21:56:54 | # | 2 | admin  |  5000 | 2010-11-14 21:56:54 | # | 3 | admin  |  5000 | 2010-11-15 21:56:54 | # | 4 | admin  |  5000 | 2010-11-15 21:56:54 | # +--+-------+------+------------------+ # # '下記のような3種類のテーブルがあります。これを集計して、指定したユーザーの指定月のアクセス日時と売上げ金額を表にしたいと思っています。'(_username) :- user(_id,_username), アクセスログテーブル_date(_username,_アクセスログ_dateならび), 売上げ金額テーブル_date(_username,_売上金額テーブル_dateならび), 共通部分(_アクセスログ_dateならび,_売上金額テーブル_dateならび,_date_共通部分), write('+--+-------+--------+------------------+ \n'), write('| id | user_id | amount| created_at      | \n'), write('+--+-------+------+------------------+ \n), append(L0,[_date|R],_date_共通部分), length(L0,Len0), _id is Len0 + 1, count(( access_log(_,_user_id,_ip,_create_at), sub_atom(_create_at,0,10,_,_create_at)), _access), findsum(_amount,( sales(_,_user_id,_amount,_create_at), sub_atom(_create_at,0,10,_,_create_at)), _sales), write_formatted('| %t | %t | %t | %t | %t |\n',[_id,_username,_date,_access,_sales]), R = [], write('+--+-------+------+------------------+\n'). アクセスログテーブル_date(_user_id,_dateならび) :- findsetof(_date,( access_log(_,_user_id,_,_created_at), sub_atom(_create_at,0,10,_,_date)), _dateならび). 売上げ金額テーブル_date(_user_id,_dateならび) :- findsetof(_date,( sales(_,_user_id,_amount,_created_at), sub_atom(_create_at,0,10,_,_date)), _dateならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/572 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): #   5個の果物から3個取り出してかごに入れるときの入れ方は何通りあるか。 #   この組み合わせを計算するプログラムを作成せよ。 # '5個の果物'([りんご,みかん,ぶどう,桃,いちご]). '5個の果物から3個取り出してかごに入れるときの入れ方は何通りあるか。'(_何通り) :- '5個の果物'(_5個の果物), count(組み合わせ(_5個の果物,3,_組み合わせ),_何通り). 組み合わせ(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). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/592 # # ええと、たとえば名前の苗字と住所の一部が分かってるときとかに検索したい時に # 神奈川在住の千葉さんだとして # # 名前から「千葉」、住所から「神奈川」とやらなくても # 複数のフィールドに「千葉、神奈川」がある人を見つけたいんです # 全文検索みたいな感じでしょうか # この例だと、千葉と神奈川をひっくり返して試せばいいだけですが # 本当は項目がもっと多いので # 複数のフィールドに一つのキーワード検索が可能である組(_テーブル名,_検索語,_組) :- findall(_,テーブル定義(_テーブル名,_,_),_組), P =.. [_テーブル名|_組]), call(P), concat_atom(_組,S), count(sub_atom(S,_,_,_,_検索語),Count), Count > 1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/511 # # すみません、もう1つお願いします # 何度も申し訳ない # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 21 から1324 までの自然数n のうち、10 の位の数字が3 となる素数の個数を求めよ # # '21 から1324 までの自然数n のうち、10 の位の数字が3 となる素数の個数を求めよ'(_個数) :- findall(_自然数n,for(21,_自然数n,1324),L), 素数生成(L,_素数ならび), count(( append(_,[_素数|_],_素数ならび), M is _素数 mod 100, M >= 30, M < 39), _個数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/572 # # sqlite3です、PHPを使ってやりたいんですが、 # # データにある、ある項目が引用されたとき、 # そのデータにあるcntというカラムにカウンターみたいなのを付けたいんですが # 何か良い方法はありますか? # http://ime.nu/oku.edu.mie-u.ac.jp/~okumura/php/counter-sqlite.php # それっぽいのがあったんですけど 複数のcnt[カラム]ごとに取得したいんですよね # カウンタ付き参照(P) :- P =.. [_テーブル名,_id|L], 参照位置ならび(2,L,_条件項位置ならび,_変数位置ならび), call(P), 条件項カウンタの更新(_テーブル名,_id,_条件項位置ならび), 変数項カウンタの更新(_テーブル名,_id,_変数位置ならび). 参照位置ならび(_,[],[],[]) :- !. 参照位置ならび(N,[A|R1],[N|R2],R3) :- \+(var(A)), N2 is N + 1, 参照位置ならび(N2,R1,R2,R3). 参照位置ならび(N,[V|R1],R2,[N|R3]) :- var(V), N2 is N + 1, 参照位置ならび(N2,R1,R2,R3). 条件項カウンタの更新(_テーブル名,_id,_条件項位置ならび) :- append(_,[_位置|R],_条件項位置ならび), 条件項カウンタの更新(_テーブル名,_id,_位置), R = []. 条件項カウンタの更新(_テーブル名,_id,_位置) :- retract(条件項カウンタ(_テーブル名,_id,_位置,N)), N2 is N + 1, asserta(条件項カウンタ(_テーブル名,_id,_位置,N2)). 条件項カウンタの更新(_テーブル名,_id,_位置) :- \+(条件項カウンタ(_テーブル名,_id,_位置,_)), asserta(条件項カウンタ(_テーブル名,_id,_位置,1)). 変数項カウンタの更新(_テーブル名,_id,_位置) :- retract(変数による参照項カウンタ(_テーブル名,_id,_位置,N)), N2 is N + 1, asserta(変数による参照項カウンタ(_テーブル名,_id,_位置,N2)). 変数項カウンタの更新(_テーブル名,_id,_位置) :- \+(変数項カウンタ(_テーブル名,_id,_位置,_)), asserta(変数による参照項カウンタ(_テーブル名,_id,_位置,1)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/263 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # スタックを利用して、与えられたnに関するFarey数列の要素数を求めるプログラムを完成させよ。 # #include <stdio.h> # #include <stdlib.h> # #define MAX 100000 # main(){ # int count,n,top,x[MAX],y[MAX],w; # scanf("%d",&n); # x[0]=0; y[0]=1; # x[1]=1; y[1]=1; # count=2; # top=2; # while(top>1){ # # # # } # printf("%dに関するFarey数の個数:%d\n",n,count);} # 与えられたnに関するFarey数列の要素数を求める(_n,_要素数) :- findall(M,for(1,M,_n),L), count((組み合わせ(L,2,[A,B]), 最大公約数(A,B,1)),_1を除く要素数), _要素数 is 1 + _1を除く要素数. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/168 # # 【質問テンプレ】 # [1] 授業単元:プログラミング設計演習 # [2] 問題文(含コード&リンク): # 0 から 9 の数字から異なる n 個の数を取り出して合計が s となる組み合わせの数を出力して終了するプログラムを作成してください。 # n 個の数はおのおの 0 から 9 までとし、1つの組み合わせに同じ数字は使えません。 # たとえば、n が 3 で s が6 のとき、3 個の数字の合計が 6 になる組み合わせは、 # 1 + 2 + 3 = 6 # 0 + 1 + 5 = 6 # 0 + 2 + 4 = 6 # の 3 通りとなります。 # '0 から 9 の数字から異なる n 個の数を取り出して合計が s となる組み合わせの数を出力して終了する' :- count(( '0 から 9 の数字から異なる n 個の数を取り出して'(_n,L), sum(L,_s)), _組み合わせの数), write_formatted('組み合わせの数は%t通り\n',[_組み合わせの数]). '0 から 9 の数字から異なる n 個の数を取り出して'(_n,L) :- findall(N,for(0,N,9),L1), 組み合わせ(L1,_n,L). sum([],0) :- !. sum([M|R],X) :- sum(R,Y),X is M + Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/983 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # count をもつqueue(待ち行列)を実現せよ。 # 'count をもつqueue(待ち行列)を実現' :- true. 'New'([[]|X]-X). 'Enqueue'(_要素,[L|X]-[_要素|Y],[[_|L]|X]-Y,Count) :- length([_|L],Count). 'Dequeue'(_要素,[[_|L],_要素|X]-Y,[L|X]-Y,Count) :- length(L,Count). 'Empty'([[]|X]-Y) :- X == Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1272006124 # # <問題> # 全社員が売上を記録した日を求めよ。 これをPrologプログラムとして表現しなさい。 全社員が売上を記録した日を求めよ(_日) :- count(社員(_社員),_社員人数), findsetof(_日,売上(_社員,_日,_データ),L1), append(_,[_日|R],L1), findsetof(_社員,社員(_社員,_日,_データ),L2), length(L2,_社員人数). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), 加算(_値ならび,_合計値),!. findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). 加算(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). 加算_2([],[]) :- !. 加算_2([L|R],[S|R2]) :- 加算(L,S), 加算_2(R,R2). ならび加算([],L,L) :- !. ならび加算(L,[],L) :- !. ならび加算([A|R],[B|R1],[C|R2]) :- C is A + B, ならび加算(R,R1,R2). 加算の変数に零をおく([]) :- !. 加算の変数に零をおく([A|R]) :- 変数(A), A = 0.0e+00, 加算の変数に零をおく(R),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/269 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):int main(void) # #               { # #             char word[101],boin[5]={'a','i','u','e','o'}; #            int i,count[5]; # #            printf("アルファベットで文字列を入力してください>>>"); #            scanf("%s",word); # #            count[0]=0,count[1]=0,count[2]=0,count[3]=0,count[4]=0; # #            for(i=0; word[i]!='\0'; i++) # #         { #          if(word[i]==boin[0]) {count[0]++;} if(word[i]==boin[1]) {count[1]++;} #             if(word[i]==boin[2]) {count[2]++;} if(word[i]==boin[3]) {count[3]++;} if(word[i]==boin[4]) {count[4]++;} # } # # printf(" a>>>%d\n i>>>%d\n u>>%d\n e>>>%d\n o>>>%d\n",count[0],count[1],count[2],count[3],count[4]); # # return 0; # # } # アルファベット文字列の中から母音をカウントするプログラムなのですが、現在ソース中の配列は # 定数によって値が参照されています。これをboin[i] count[j]のように変数で値を参照するものに書き換えてください。 # [3]環境:linux コンパイラ:gcc  C言語 # [4] 期限:2010年10月19日10:00まで # [5] その他の制限:変数で配列要素の値を参照するときfor文と組み合わせること。 # どうか、よろしくお願いします # 母音([a,i,u,e,o]). アルファベット文字列の中から母音をカウントする(_アルファベット文字列,_母音の数) :- 母音(_母音ならび), findall(_,( sub_atom(_アルファベット文字列,_,1,_,_文字), member(_文字,_母音ならび)), L), length(L,_母音の数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/500 # # No-色 # レコード1 001,赤 # レコード2 002,赤 # レコード3 003,青 # レコード4 004,青 # レコード5, 005,赤 # レコード6, 006,黒 # # このデータで、 『select 色,count(色 from テーブル group by 色 』とした時 # 最大レコード数(この場合、赤の5)を取得したいのですが・・・ # 定義された節数のもっとも多い色は(_色,_度数) :- findsetof(_色,テーブル(_No,_色),L1), findall([_度数,_色],( member(_色,L1), count(テーブル(_,_色),度数)), L2), findmax(_度数,member([_度数,_],L2),_最大度数), append(_,[[_度数,_色]|R],L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/677 # # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク):角度と正弦と余弦の対応表を出力するプログラムを作成せよ。 # 角度は度数法と弧度法の両方を表示し、角度は0〜360度の範囲で15度刻みとする。 # 表はこんな感じです。 # # +-----+-----+-----+-----+ # | deg | rad | sin | cos | # +-----+-----+-----+-----+ # | 0 | 0.00| 0.00| 0.00| # | 15 | 0.26| 0.26| 0.97| #       略 # | 345 | 6.02|-0.62| 0.97| # | 360 | 6.28| 0.00| 1.00| # +-----+-----+-----+-----+ # # 角度と正弦と余弦の対応表を出力する :- M is 360 // 15, write('+-----+-----+-----+-----+\n'), write('| deg | rad | sin | cos | \n+-----+-----+-----+-----+\n'), for(0,N,M), _deg is N * 15, _rad is pi * _deg / 180, _sin is sin(_rad), _cos is cos(_rad), write_formatted('| %3d | %4.2f| %4.2f| %4.2f|\n',[_deg,_rad,_sin,_cos]), N = M, write('+-----+-----+-----+-----+\n'),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/619 # # [1] 授業単元:C++ベーシック # [2] 問題文(含コード&リンク): 1~1000の間のすべてのぞろ目を調べて、その数を表示するプログラムを作りなさい。 # '1~1000の間のすべてのぞろ目を調べて、その数を表示する' :- findcount(_ぞろ目,( for(1,_ぞろ目,1000), number_chars(_ぞろ目,L), ぞろ目(L) write_formatted('%t\n',[_ぞろ目])), _ぞろ目の数), write_formatted('ぞろ目の数は %t です\n',[_ぞろ目の数]). ぞろ目([A,A]) :- !. ぞろ目([A,A|R]) :- ぞろ目([A|R]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284079940/8 # # 【問題】(超初級) # 時間を入力すると時針と分針の角度を出力するプログラムを作れ。 # 角度は度数法(ラジアンでない)を用い、3時の方向を0度とする。 # 出力する角度Rは (0.0 <= R && R < 360.0) を満たすこと。 # # ■入力例 # 時刻を入力してください> 15:30 # # ■出力例 # 時針:345.0度 # 分針:270.0度 # # ■応用問題 # なんらかの方法で現在時刻の時針分針の角度を出力するオプションを追加せよ。 # 例えばプログラムの引数や、時刻入力に"*"と入力する、などで判定することができる。 # # '時間を入力すると時針と分針の角度を出力するプログラムを作れ。角度は度数法(ラジアンでない)を用い、3時の方向を0度とする。出力する角度Rは (0.0 <= R && R < 360.0) を満たすこと。' :- write('時刻を入力してください : '), 時・分を得る(_時,_分), _分針R is 360 * ((_分 + 45) mod 60) / 60, _時針R is 360 * ((_時 + 21) mod 12) / 12) + _分針R / 12, 時針と分針の角度を出力する(_分針R,_時針R). 時・分を得る(_時,_分) :- get_line(Line), 時・分を得る(Line,_時,_分),!. 時・分を得る(_時,_分) :- 時・分を得る(_時,_分). 時・分を得る('*',_時,_分) :- A is time, localtime(A,_,_,_,_,_,_時,_分,_),!. 時・分を得る(Line,_時,_分) :- \+(Line='*'), split(Line,[':',' '],[_時,_分]),!. 時・分を得る(Line,_,_) :- write_formatted('入力された"%t"から時:分を得ることができません。再入力をお願いします\n',[Line]), write('時:分 を入力してください : '), fail. 時針と分針の角度を出力する(_分針R,_時針R) :- _角度R is abs(_分針R - _時針R), write_formatted('時針:%5.1f\n分針:%5.1f\n時針と分針で作る角度は:%5.1f\n',[_時針R,_分針R,_角度R]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/408 # # よろしくお願いいたします。 # # ・DBMS名とバージョン #   HiRDB Ver8 # # ・テーブルデータ # <Aテーブル> # A1   A2   A3   A4   A5 # ------- ------- ------- ------- ---------- # XXXXXXX XX1   ABC 3 2009/05/08 # WWCWWCW WW2   CCB 1 2008/03/21 # DDDDDDD DD1   JPN 5 2007/08/08 # GGGGGGG GX9   SOX 2 1977/01/04 # FFFFFFF USJ   NPB 3 2001/09/11 # # # <Bテーブル> # B1   B2   B3   B4   B5 # ------- ------- ------- ------- ---------- # XXXXXXX XX1  ibicha  oshimu 2002/07/05 # XXXXXXX XX1  takeshi okada 2005/07/15 # XXXXXXX XX1  kamo shu 1857/09/25 # WWCWWCW WW2  wao wao 2008/10/22 # DDDDDDD DD1  ui hhh 2006/06/30 # DDDDDDD DD1  jojoj x5xx 1999/09/09 # DDDDDDD DD1  momo hara 2005/03/07 # DDDDDDD DD1  itai u- 2003/12/22 # DDDDDDD DD1  koma nogoal 2007/04/26 # GGGGGGG GX9   dame record 2009/11/14 # FFFFFFF USJ   iki tai 1995/08/15 # FFFFFFF USJ  sst ebuspi 2004/01/05 # FFFFFFF USJ  bb pp 2009/08/23 # # ・欲しい結果 # A1   A2   B1   B2   A4 B1andB2COUNT # ------- ------ ------- ------- ------- ------------ # GGGGGGG GX9 GGGGGGG GX9 2 1 # # # ・説明 # SQLで違うテーブルの値を比較して値に差があるレコードを抽出したいのですがヒントをいただけないでしょうか。 # A1とB1は、A2とB2は同じデータが基本です。 # Aテーブルの「A4」カラムにはBテーブルのレコード数を持っています。 # しかし、よくよく見るとAテーブルの「GGGGGGG」のA4には「2」のはずなのにBテーブルには実際にレコードは1つしかありません。 # こういう状態になってしまっているのを割り出したいのですがどのようにA4とBテーブルで数があってないものを抽出できるでしょうか。 # よろしくお願いいたします。 # # 集約値A4とBテーブルの組数が不整合であるか、Bテーブルに存在する組の集約がAテーブルにない :- findsetof([A1,A2],'Aテーブル'(A1,A2,_,_,_),L1), write('集約値A4とBテーブル組の不整合'), 集約値A4とBテーブル組の不整合(L1), findsetof([B1,B2],(Bテーブル'(B1,B2,_,_,_),L2), write('Bテーブルは存在するがAテーブルに集約されていない\n'), 'Bテーブルは存在するがAテーブルに集約されていない'(L2),!. 集約値A4とBテーブル組の不整合([]) :- !. 集約値A4とBテーブル組の不整合([[A1,A2]|R]) :- 'Aテーブル'(A1,A2,_,A4,_), count('Bテーブル'(A1,A2,_,_,_),Count), 診断(A1,A2,A4,Count), 集約値A4とBテーブル組の不整合(R). 診断(A1,A2,A4,0) :- write('対応するBテーブルの組がありません\n'),!. 診断(A1,A2,A4,Count) :- \+(A4=Count), write_formatted('Aテーブルのキー%t,%tの集約値A4=%tとBテーブルの同一キーのカウントが不整合です\n',[A1,A2,A4,Count]),!. 診断(_,_,_,_). 'Bテーブルは存在するがAテーブルに集約されていない'([]) :- !. 'Bテーブルは存在するがAテーブルに集約されていない'([[B1,B2]|R]) :- 'Aテーブル'(B1,B2,_,_,_), 'Bテーブルは存在するがAテーブルに集約されていない'(R),!. 'Bテーブルは存在するがAテーブルに集約されていない'([[B1,B2]|R]) :- 'Bテーブル'(B1,B2,B3,B4,B5), write_fromatted('Aテーブルに集約が存在しない組は%t,%tです\n',[B1,B2,B3,B4,B5]), 'Bテーブルは存在するがAテーブルに集約されていない'(R),!. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/609 # # postgres8.4を使ってます。 # レコード数が3件以上あるものを取得したいのですが # どう書けばよいでしょうか。 # # やりたいことのイメージはこんな感じです。 # select recordCD from Table where recordCD in (select recordCD from Table where count(recordCD) > 3); # % これだとrecodCDが件数分出力されてしまうので、一件のみの出力に変更した recordCDの位置を得る(_引数の数,_位置番号) :- 'テーブル構造'('Table',_引数の数,_位置番号,recordCD). レコード数が3件以上あるものを取得する(_recordCD) :- recordCDの位置を得る(_引数の数,_位置番号), functor(Q,'Table',_引数の数), arg(_位置番号,Q,_recordCD), findsetof(_recordCD,call(Q),L1), member(_recordCD,L1), count(Q,Count), Count >= 3. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/609 # # postgres8.4を使ってます。 # レコード数が3件以上あるものを取得したいのですが # どう書けばよいでしょうか。 # # やりたいことのイメージはこんな感じです。 # select recordCD from Table where recordCD in (select recordCD from Table where count(recordCD) > 3); # % これだとrecodCDが件数分出力されてしまうので、一件のみの出力に変更した recordCDの位置を得る(_引数の数,_位置番号) :- 'テーブル構造'('Table',_引数の数,_位置番号,recordCD). レコード数が3件以上あるものを取得する(_recordCD) :- recordCDの位置を得る(_引数の数,_位置番号), functor(Q,'Table',_引数の数), arg(_位置番号,Q,_recordCD), findsetof(_recordCD,call(Q),L1), member(_recordCD,L1), count(Q,Count), Count >= 3. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1279286575/74 # # 【質問テンプレ】 # [1] 授業単元:情報処理課題 # [2] 問題文(含コード&リンク):英語の文章で構成されるテキストファイルに対して、その中に含まれる総文字数と異なる文字ごとの出現回数とを数え上げよ。 # [3.3] 言語:C # [4] 期限:2010年07月19日00:00まで # [5] その他の制限:Xcodeを使用しています。読み込むファイルは"/Users/user/Desktop/data.txt"で。 # # 似たようなプログラムを作った時は「数列を入力し総文字数と数字ごとに出現回数とを数え上げグラフで表示」というような課題で # 数字だったので0〜9までを表示することが簡単に出来ましたがアルファベットなのでa-zをどう表示したものか # またstrlenだと半角空白も数えてしまうので総"文字"数とずれてくるのではないかと悩んでいます。 # よろしくお願いします。 # # 英語の文章で構成されるテキストファイルに対して、その中に含まれる総文字数と異なる文字ごとの出現回数とを数え上げる(_総文字数,_文字ごとの出現度数ならび) :- get_chars('/Users/user/Desktop/data.txt',Chars), length(Chars,_総文字数), findsetof(C,member(C,Chars),L1), findall([C,_出現度数],(member(C,L1),count(member(C,Chars),_出現度数)),_文字ごとの出現度数ならび). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/937 # # この問題ができません。誰かお願いします。 # # 入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントするプログラムを作成せよ. # 【実行例】 # # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントする' :- get_chars(Chars), count(member(t,Chars),_t), count(member(c,Chars),_c), count(member(a,Chars),_a), count(member(g,Chars),_g), write_formatted('Thymine (t) : %t \nCytosine (c) : %t \nAdenine (a) : %t \nGuanine (g) : %t \n',[_t,_c,_a,_g]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/920 # # [1] C言語プログラミング演習 # [2] 問題文(含コード&リンク # ATM(Automated Teller Machine; 現金自動預け払い機)システムを実現するプログラムを考える。 # # 氏名,口座番号,暗証番号,預金残高を要素とする構造体を宣言し, 512人分の口座が作成可能なようにせよ.また,初期値として次のように構造体の内容を設定せよ. # # 立命太郎の口座番号は1234で,預金残高を1,234,560円に設定する. # 野路花子の口座番号は5678で,預金残高を987,600円に設定する. # 衣笠一郎の口座番号は9012で,預金残高を538,600円に設定する. # 暗証番号は口座番号に1111を足して10000で割った余りに設定する. # ここで暗証番号は、口座番号を引数としてとり、それに1111を足して10000で # 割った余りを計算する関数を作成して設定すること. # 上記の方法で初期値を設定し、設定された3人の預金残高を画面へ出力する # プログラムを作成せよ.ただし、ひとり分の預金残高を表示する関数を作成して、 # これを繰り返し使って3人の預金残高を出力すること. # # % ./initAccount # 預金残高は次のとおりです. # 立命太郎 (1234) 1234560 円 # 野路花子 (5678) 987600 円 # 衣笠一郎 (9012) 538600 円 # % 預金口座の初期設定(_ファイル) :- w3c('http://pc12.2ch.net/test/read.cgi/tech/1276810079/920',Lines), append(_,[Line|R],Lines), split(Line,[の口座番号は,'で,貯金残高を,円に設定する.'],[_氏名,_口座番号,_預金残高]), assertz(預金口座(_氏名,_口座番号,_預金残高)), _暗証番号 is (_口座番号 + 1111) mod 10000, assertz(預金口座暗証番号(_口座番号,_暗証番号)), R = [],!. 預金口座の初期設定(_). 設定された3人の預金残高を画面へ出力する :- findsetof(_口座番号,預金口座(_,_口座番号,_),_口座番号ならび), write('預金残高は次のとおりです.\n'), append(_,[_口座番号|R],_口座番号ならび), ひとり分の預金残高を表示する(_口座番号), R = []. ひとり分の預金残高を表示する(_口座番号) :- 預金口座(_氏名,_口座番号,_預金残高), write_formatted('%t (%t) %t 円\n',[_氏名,_口座番号,_預金残高]),!. % 以下のサイトは # 出典:: 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://pc12.2ch.net/test/read.cgi/tech/1276810079/619 # # [1] 授業単元:Cプログラミング演習 # [2] 問題文(含コード&リンク): # 問題1. 10進数1234を2進数で表示するプログラムを作成せよ。 # 問題2. 変数の下位16ビット中の1のビット数を数える # '10進数1234を2進数で表示する' :- write('0b'), '10進数1234を2進数で表示する'(1234,[],L), append(_,[A|R],L), write_formatted('%t\n',[A]), R = []. '10進数1234を2進数で表示する'(_,L,L) :- !. '10進数1234を2進数で表示する'(N,L1,L) :- M is N mod 2, N1 is N // 2, '10進数1234を2進数で表示する'(N1,[M|L1],L). 変数の下位16ビット中の1のビット数を数える(_変数,_頻度) :- integer(_変数), M is _変数 mod 65536, 整数の下位16ビット中の1のビット数を数える(M,_頻度). 変数の下位16ビット中の1のビット数を数える(_変数,_頻度) :- atom(_変数), atom_codes(_変数,Codes), 'Codesの下位16ビット中の1のビット数を数える'(Codes,_頻度). 整数の下位16ビット中の1のビット数を数える(0,0) :- !. 整数の下位16ビット中の1のビット数を数える(N,X) :- 0 is N mod 2, N1 is N // 2, 整数の下位16ビット中の1のビット数を数える(N1,X). 整数の下位16ビット中の1のビット数を数える(N,X) :- 1 is N mod 2, N1 is N // 2, 整数の下位16ビット中の1のビット数を数える(N1,Y), X is Y + 1. 'Codesの下位16ビット中の1のビット数を数える'(Codes,_頻度) :- last(Codes,Code), Code >= 256, 整数の下位16ビット中の1のビット数を数える(N,_頻度),!. 'Codesの下位16ビット中の1のビット数を数える'(Codes,_頻度) :- last(Codes,Code), Code < 256, append(_,[A,B],Codes), N is (A * 256 + B) mod 65536, 整数の下位16ビット中の1のビット数を数える(N,_頻度),!. 'Codesの下位16ビット中の1のビット数を数える'([Code],_頻度) :- 整数の下位16ビット中の1のビット数を数える(Code,_頻度),!. % 以下のサイトは # 出典:: 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は同時に選ばない(両方選ばなくてもよい)。このような組合せを列挙する'(_),_何通り). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/421 # # [1] 授業単元: プログラム言語 # [2] 問題文(含コード&リンク): # 10 人の成績を入力し,その順位を成績と共に表示したい。以下の考え方に基づいた # プログラムを作成せよ。 # 1 ? # 2次元配列s[10][2] を用意する。 # 2 ? # i=0〜9 のfor 文を用いてs[i][0] に成績を入力する。 # 3 ? # s[0][0] とs[j][0],j=0〜9 を比較し,s[0][0] より大きい数値の個数n を数え #  る。その個数+1 が成績順位になるので,s[0][1] にn+1 を代入する。 # 4 ? # 同様の操作をs[i][0],i=0〜9 に対して行なえば,その成績順位がs[i][1] とし #  て求められるので,あとは成績と共に表示すればよい。 # # '10 人の成績を入力し,その順位を成績と共に表示する' :- '要素数10の変数ならびを二本用意する'(L1,L2), 'L1に成績を入力する'(L1), 'L1の先頭から順位を対応するL2の位置にセット'(1,10,L1,L2), 二本のならびを順に表示(L1,L2). '要素数10の変数ならびを二本用意する'(L1,L2) :- length(L1,10),length(L2,10). 'L1に成績を入力する'(L1) :- for(1,N,10),get_integer(_点数),list_nth(N,L1,_点数),N=10,!. 'L1の先頭から順位を対応するL2の位置にセット'(N,M,L1,L2) :- N > M,!. 'L1の先頭から順位を対応するL2の位置にセット'(N,M,L1,L2) :- list_nth(N,L1,_点数),list_nth(N,L2,_順位), count((member(_点数1,L1),_点数1 > _点数),_成績上位者数),_順位 is _成績上位者数 + 1, N2 is N + 1, 'L1の先頭から順位を対応するL2の位置にセット'(N2,M,L1,L2). 二本のならびを順に表示(L1,L2) :- for(1,N,10), list_nth(N,L1,A),list_nth(N,L2,B), write_formatted('%t,%t位\n',[A,B]), N=10. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1274791771/231 # # tbl1にnum1,num2,id1,id2,id3 # tbl2にid,name,ssというフィールドがあるとして # SELECT name, num1, num2, id1, id2, id3, time FROM tbl1, tbl2 # WHERE num1 = 1 # AND id1 = ( SELECT id FROM tbl2 WHERE ss = "monga") # 上記のようなSQLを # 特定のフィールドが他の行と重複してたら抜かすというのはどうやればいいでしょうか? # 単にdistinctつけるだけだとどれかひとつでも重複していなかったら抽出されますよね。 # id1,id2,id3が他のレコードのid1,id2,id3と重複してたら # 検索結果に入れないみたいな感じにしたいのですが。 # MYSQLです。 'id1,id2,id3が他のレコードのid1,id2,id3と重複してたら検索結果に入れない'([_name,_num1,_num2,_id1,_id2,_id3]) :- findall([_name,_num1,_num2,_id1,_id2,_id3],( tbl1(num1,_num2,_id1,_id2,_id3), num1 = 1, tbl2(id1,_name,monga)), L1), findsetof([_id1,_id2,_id3],member([_,_,_,_id1,_id2,_id3],L1),L2), findall([_id1,_id2,_id3],( count((member([_id1,_id2,_id3],L2),1)), L2), member([_name,_num1,_num2,_id1,_id2,_id3],L1), member([_id1,_id2,_id3],L2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/316 # # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10760.txt # # (1)複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力するプログラムを作成せよ. # # 【実行例】 # # 何個の文字列を入力しますか?:3 # 入力文字列[1]:B # 入力文字列[2]:A # 入力文字列[3]:C # # 繋ぎ合わせる順番を入力してください。 # 2 # 1 # 3 # # 結果 -> ABC # # (2)入力した文字配列中に,abcという並びがいくつあるか調べるプログラムを作成せよ. # # 【実行例】 # # 1abfaabcabc # gatagataabc # (ここで ^D を押す) # #ABC is 3 # 複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する :- 催促付き整数入力('文字列の個数を予約してください : ',N), findall(S,( for(1,_,N),write_formatted('入力文字列[%t] : ',[M]), get_line(S)), L1), write('繋ぎ合わせる順番を入力してください。\n'), findall(N2,(for(1,_,N),get_integer(N2)),L2), 文字列のならびの並べ替え(L1,L2,L), concat_atom(L,_繋ぎ合わされた文字列), write_formatted('%t\n',[_繋ぎ合わされた文字列]). 文字列のならびの並べ替え(L1,[],[]) :- !. 文字列のならびの並べ替え(L1,[N|R2],[L2|R3]) :- list_nth(N,L1,L2), 文字列のならびの並べ替え(L1,R2,R3). '入力した文字配列中に,abcという並びがいくつあるか調べる' :- get_chars(Chars), count(append(_,[a,b,c|_],Chars),Count), write_formatted('#abc = %t\n'[Count]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1267796762/199 # # 【 課題 】下記参照です。 # 【 形態 】1. Javaアプリケーション(main()で開始)/ # 【 期限 】6/29 # 【 Ver  】"1.6.0_20" # 【 補足 】丸投げです。よろしくお願いします。 # # キーボードから整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。 # 「!」の入力で処理を終了する。 # 数値の入力のたびにすべきこと: # 最大値と最小値の更新 # 入力の総和に加算 # 入力の個数を1増加 # # 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。' :- 'キーホ゛ート゛から整数(0-100)を入力し'(N), _度数1=0,_合計値1=0,_最大値1=N,_最小値1=N, 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N,_度数1,_合計値1,_最大値1,_最小値1). 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'((-1),_度数,_合計値,_最大値,_最小値) :- '終わった時点で、それらの最大値・最小値・平均を表示させよう。'(_度数1,_合計値1,_最大値1,_最小値1). 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N1,_度数1,_合計値1,_最大値1,_最小値1) :- N1 < _最小値1, _度数2 is _度数 + 1, _合計値2 is _合計値1 + N1, 'キーホ゛ート゛から整数(0-100)を入力し'(N2), 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N2,_度数2,_合計値2,_最大値1,N1),!. 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N1,_度数1,_合計値1,_最大値1,_最小値1) :- N1 > _最大値1, _度数2 is _度数 + 1, _合計値2 is _合計値1 + N1, 'キーホ゛ート゛から整数(0-100)を入力し'(N2), 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N2,_度数2,_合計値2,N1,_最小値1),!. 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N1,_度数1,_合計値1,_最大値1,_最小値1) :- _度数2 is _度数 + 1, _合計値2 is _合計値1 + N1, 'キーホ゛ート゛から整数(0-100)を入力し'(N2), 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N2,_度数2,_合計値2,_最大値1,_最小値1),!. '終わった時点で、それらの最大値・最小値・平均を表示させよう。'(_度数1,_合計値1,_最大値1,_最小値1) :- _平均値 is _合計値 / _度数, write_formatted('最大値=%t,最小値=%t,平均値=%t\n',[_最大値,_最小値,_平均値]),!. 'キーホ゛ート゛から整数(0-100)を入力し'(N) :- write('整数(0-100)を入力してください : ', get_line(Line), '「!」の入力で処理を終了する。'(Line,N). '「!」の入力で処理を終了する。'((!),(-1)) :- !. '「!」の入力で処理を終了する。'(Line,N) :- atom_to_term(Line,N,_). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1267796762/199 # # 【 課題 】下記参照です。 # 【 形態 】1. Javaアプリケーション(main()で開始)/ # 【 期限 】6/29 # 【 Ver  】"1.6.0_20" # 【 補足 】丸投げです。よろしくお願いします。 # # キーボードから整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。 # 「!」の入力で処理を終了する。 # 数値の入力のたびにすべきこと: # 最大値と最小値の更新 # 入力の総和に加算 # 入力の個数を1増加 # # 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。' :- 'キーホ゛ート゛から整数(0-100)を入力し'(N), _度数1=0,_合計値1=0,_最大値1=N,_最小値1=N, 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N,_度数1,_合計値1,_最大値1,_最小値1). 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'((-1),_度数,_合計値,_最大値,_最小値) :- '終わった時点で、それらの最大値・最小値・平均を表示させよう。'(_度数1,_合計値1,_最大値1,_最小値1). 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N1,_度数1,_合計値1,_最大値1,_最小値1) :- N1 < _最小値1, _度数2 is _度数 + 1, _合計値2 is _合計値1 + N1, 'キーホ゛ート゛から整数(0-100)を入力し'(N2), 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N2,_度数2,_合計値2,_最大値1,N1),!. 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N1,_度数1,_合計値1,_最大値1,_最小値1) :- N1 > _最大値1, _度数2 is _度数 + 1, _合計値2 is _合計値1 + N1, 'キーホ゛ート゛から整数(0-100)を入力し'(N2), 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N2,_度数2,_合計値2,N1,_最小値1),!. 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N1,_度数1,_合計値1,_最大値1,_最小値1) :- _度数2 is _度数 + 1, _合計値2 is _合計値1 + N1, 'キーホ゛ート゛から整数(0-100)を入力し'(N2), 'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N2,_度数2,_合計値2,_最大値1,_最小値1),!. '終わった時点で、それらの最大値・最小値・平均を表示させよう。'(_度数1,_合計値1,_最大値1,_最小値1) :- _平均値 is _合計値 / _度数, write_formatted('最大値=%t,最小値=%t,平均値=%t\n',[_最大値,_最小値,_平均値]),!. 'キーホ゛ート゛から整数(0-100)を入力し'(N) :- write('整数(0-100)を入力してください : ', get_line(Line), '「!」の入力で処理を終了する。'(Line,N). '「!」の入力で処理を終了する。'((!),(-1)) :- !. '「!」の入力で処理を終了する。'(Line,N) :- atom_to_term(Line,N,_). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/251 # # 【質問テンプレ】 # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): 入力した2つの整数の間 (入力した数も範囲に含める) にある #  「2の倍数でない」かつ「3の倍数でない」かつ「5の倍数でない」 # の条件を満たす整数を順に表示し,最後にその個数を表示するプログラムを作成せよ # '入力した2つの整数の間 (入力した数も範囲に含める) にある「2の倍数でない」かつ「3の倍数でない」かつ「5の倍数でない」の条件を満たす整数を順に表示し,最後にその個数を表示する' :- 入力した2つの整数(N1,N2), count((for(N1,N,N2),\+(0 is N mod 2),\+(0 is N mod 3),\+(0 is N mod 5),write_formatted('%t ',[N])),Count), write_formatted('\n個数 = %t\n',[Count]). 入力した2つの整数(N1,N2) :- 催促付き整数入力('開始整数を入力してください : ',N1), 催促付き整数入力('終了整数を入力してください : ',N2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1266565626/627 # # ずぶの素人なのですのでお手柔らかにお願いします # # 今2つのテキストファイルがあって、内容はおおよそ下のようです # # --------------テキストA------------------- # fcart1 -0.0000000000E+00 -0.0000000000E+00 1.0770536961E-04 # -0.0000000000E+00 -0.0000000000E+00 6.6543134784E-04 # -0.0000000000E+00 -0.0000000000E+00 -7.7313671745E-04 # getden1 0 # ------------------------------------------ # # --------------テキストB-------------------- # xred 0.0 0.0 0.047843858990 # 0.0 0.0 0.000434433306 # 1/3 2/3 -0.011730466739 # #Definition of the planewave basis set # ------------------------------------------ # テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足したいのですが # どのようにしたらいいでしょうか # ご教授お願いします # テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(_テキストA,_テキストB) :-     get_lines(_テキストA,LinesA),     get_lines(_テキストB,LinesB),     テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(LinesA,LinesB,LinesC),     put_lines(_テキストB,LineC). テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足す(LinesA,LinesB,LinesC) :-     テキストの一番右の列の数値を切り取る(LinesA,LA),     テキストの一番右の列の数値を切り取る(LinesB,LB),     加算([LA,LB],LC),         テキストBの最終数値要素を置換(LB,LC,LineC). テキスト一番右の列の数値を切り取る([],[]) :- !. テキスト一番右の列の数値を切り取る([Line|R1],[V|R2]) :-     split(Line,[ ],L),     数値要素が3個以上(L),     last(L,V),     テキストAの一番右の列の数値を切り取る(R1,R2). テキストBの最終数値要素を置換([],_,[]) :- !. テキストBの最終数値要素を置換([Line|R1],[V|R2],[LineC|R3]) :-     sPLIT(Line,[ ],L1),     数値要素が3個以上(L1),         length(L1,Len),     findmax(Nth,(            for(1,Nth,Len),            list_nth(Nth,L1,V1),number(V1)),         LastNth),     要素番号によるならびの置換(LastNth,V,L1,L3),     concat_atom(L3,LineC),     テキストBの最終数値要素を置換(R1,R2,R3),!. テキストBの最終数値要素を置換([Line|R1],L2,[Line|R3]) :-     テキストBの最終数値要素を置換(R1,L2,R3),!. 数値要素が3個以上(L1) :-     count((member(A,L1),number(A)),Count),     Count >= 3,!. % *** user: sPLIT / 3 *** sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,Y), findall(U,(member(U,Y) , not U = ''),L), L = X,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % *** user: 'SPLIT' / 3 *** 'SPLIT'(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Z), Z = X,!. % *** user: split_00 / 3 *** split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび),atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). % *** user: split_0 / 3 *** split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X) . % *** user: split_1 / 3 *** split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. % *** user: split_2 / 5 *** split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. % *** user: split / 3 *** split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,(member(U,Y) , not U = ''),L), L = X,!. % *** user: sPlit / 3 *** sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(member(U,_区切り符号ならび))), Z), Z = X,!. % *** user: put_lines / 2 *** put_lines(_,[]) :- !. put_lines(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), open(File_1,write,Output), put_lines(Output,L), close(Output),!. put_lines(Output,[Line|R]) :- is_stream(_,Output,_), write(Output,Line), write(Output,'\n'), put_lines(Output,R),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/190 # # モンテカルロ法で√2の近似値を求めたいのですが、 # ネット調べてみるとモンテカルロ法と言えばπの近似に関するばかりで・・・ # どなたか教えてくださいませ # # 'モンテカルロ法で√2の近似値を求める'(_試行回数,_除数,X) :- 度数((between(1,_試行回数,N),U is random(_除数) ^ 2,U =< _除数 * _除数 / 2),Y), X is Y / (_試行回数 / 2). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典: C/C++の宿題片付けます 136代目 #874 # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):モンテカルロ法で円周率を求めるプログラムを作れ。 # モンテカルロ法で円周率を求める(_試行数,_円周率) :- '正方形の中に適当に点を打つとき、その点が正方形の一辺を直径とする円の円内にある数'(_試行数,_円内にある数), _円周率 is (_円内にある数 * 4) / _試行数. '正方形の中に適当に点を打つとき、その点が正方形の一辺を直径とする円の円内にある数'(_試行数,_円内にある数) :- count((for(1,N,_試行数),落ちた点は円内にある),_円内にある数). 落ちた点は円内にある :- '落ちた点と原点の距離が辺の長さ(1.0)以内'. '落ちた点と原点の距離が辺の長さ(1.0)以内' :- X is ((random mod 2001) - 1000) / 1000, Y is ((random mod 2001) - 1000) / 1000, X * X + Y * Y =< 1.0,!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/754 # # [1] 授業単元:オブジェクト指向プログラミング # [2] 問題文(含コード&リンク):四則演算の記号を連続し入力すると、各々の文字列を入れると、 # 文字の個数を結果として表示するようにしなさい。 # # 実行例: # 文字列を入力 # ***-++/+-+/     <===四則演算の記号のみを入力する。 # 結果 # +: 4 # -: 2 # *: 3 # /: 2     <===入力した文字列中に/記号は2個 四則演算の記号を連続し入力すると、各々の文字列を入れると、文字の個数を結果として表示する :- write('文字列を入力\n'), get_line(Line), findall([A,C],(member(A,[+,-,*,/]),count(sub_atom(Line,_,1,_,A),C)),L), write('結果\n'), append(_,[[_四則演算記号,_頻度]|R],L), write_formatted('%t:%t\n',[_四則演算記号,_頻度]), R = []. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255277760/337 # # 問題: # ジョンにとって縁起のいい数字は4と7で, # 他はどうでもいい.ラッキーナンバーとは, # 縁起のいい数字を含んだ10進数である. # 整数aとbが与えられたとき,aとbの間にあるラッキーナンバーの個数を挙げよ. # # オブジェクトの定義: # クラス名 : TheLuckyNumbers # メソッド名 : count # 引数の型 : int,int # 返値の型 : int # メソッドの表記 : int count(ints,intb) # として,公的メソッドとせよ. # 注: # aの値は1から1,000,000,000まで # bの値は1から1,000,000,000まで # # TopCoderでグーグル先生に聞いたら出てきた問題を適当に張ってみる # # '整数aとbが与えられたとき,aとbの間にあるラッキーナンバーの個数'(_a,_b,_ラッキーナンバーの個数) :- _a > _b, '整数aとbが与えられたとき,aとbの間にあるラッキーナンバーの個数'(_b,_a,_ラッキーナンバーの個数). '整数aとbが与えられたとき,aとbの間にあるラッキーナンバーの個数'(_a,_b,_ラッキーナンバーの個数) :- _a =< _b, ラッキーナンバーの個数(_a,_b,0,_ラッキーナンバーの個数),!. ラッキーナンバーの個数(M,N,X,X) :- M > N,!. ラッキーナンバーの個数(M,N,Y,X) :- number_codes(M,L), (member(52,L);member(55,L)),!, Y2 is Y + 1, M2 is M + 1, ラッキーナンバーの個数(M2,N,Y2,X),!. ラッキーナンバーの個数(M,N,Y,X) :- M2 is M + 1, ラッキーナンバーの個数(M2,N,Y,X),!. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 136代目 #602 # 【質問テンプレ】 # [1] 授業単元:画像処理 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10665.txt # # <問題文> # 画像ファイルを読み込み、その画像の濃度ヒストグラムを作成しなさい。 # すべての画像サイズは256*256となっている。 # ヒストグラムは階調値0-255を32段階でカウントする。 # また、頻度の表示は100個ごとに表示する。 '画像ファイルを読み込み、その画像の濃度ヒストグラムを作成する' :- '画像ファイルを読み込み'(_画像ファイル,_,_データ部値ならび), 'ヒストグラムの作成'(_データ部値ならび,LL), 'ヒストグラムの表示'(LL). '画像ファイルを読み込み'(_画像ファイル,_,_データ部値ならび) :- 'すべての画像サイズは256*256となっている'(_データ部サイズ), open(_画像ファイル,read,Input), 画像ファイルヘッダの読み込み(_画像ファイル,Input,_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ), close(Input), 画像ファイルデータ部の読み込み(_画像ファイル,_画像ファイルヘッダバイトサイズ,_データ部サイズ,_データ部値ならび),!. 画像ファイルデータ部の読み込み(_画像ファイル,_画像ファイルヘッダバイトサイズ,_データ部サイズ,_データ部値ならび) :- open(_画像ファイル,read,Input2,[type(binary)]), between(1,_画像ファイルヘッダバイトサイズ,N), get_byte(Input2,_), N = _画像ファイルヘッダバイトサイズ, findall(X,( between(1,_データ部サイズ,N), get_byte(Input2,X)) _データ部値ならび), close(Input2). 'すべての画像サイズは256*256となっている'(_データ部サイズ) :- _データ部サイズ is 256 * 256 * 3. 'ヒストグラムの作成'(_データ部値ならび,L1,LL) :- 'ヒストグラムは階調値0-255を32段階でカウントする'(L1,L2), '頻度の表示は100個ごとに'(L2,LL). 'ヒストグラムは階調値0-255を32段階でカウントする'([],[]) :- !. 'ヒストグラムは階調値0-255を32段階でカウントする'([R,G,B|R1],[_階調|R2]) :- _階調 is ((R + G + B) // 3) // 8, 'ヒストグラムは階調値0-255を32段階でカウントする'(R1,R2). '頻度の表示は100個ごとに'(L2,LL) :- findall(L_2,( between(0,31,N), count((member(M,L2),M >= N,M =< N + 31),Count_1), Count is Count_1 // 100, length(L_2,Count)), LL). 'ヒストグラムの表示'(_,[]) :- !. 'ヒストグラムの表示'(N,[L|R]) :- all(L,'*'), atomic_list_concat(L,_星表示), _範囲下限 is N * 32, _範囲上限 is _範囲下限 + 31, writef('%w~%w: %w\n',[_範囲下限,_範囲上限,_星表示]), N2 is N + 1, 'ヒストグラムの表示'(N2,R). 画像ファイルヘッダの読み込み(_画像ファイル,Input,_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ) :- findall(Line,( nth1(N,_,_), get_line(Input,Line), ( Line = '\n',!,fail; true )), _画像ファイルヘッダ), 画像ファイルヘッダサイズを得る(_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ),!. 画像ファイルヘッダサイズを得る([],1) :- !. 画像ファイルヘッダサイズを得る([Line|R],Size) :- 行のバイトサイズ(Line,_行のバイトサイズ), 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 1. 行のバイトサイズ([],1) :- !. 行のバイトサイズ([A|R],Size) :- char_code(A,Code), Code > 255, 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 2,!. 行のバイトサイズ([A|R],Size) :- char_code(A,Code), Code < 256, 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 1,!. all([],_). all([V|R],V) :- all(R,V). get_line(Input,Line) :- read_line_to_codes(Input,Codes), atom_codes(Line,Codes). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 136代目 #602 # 【質問テンプレ】 # [1] 授業単元:画像処理 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10665.txt # # <問題文> # 画像ファイルを読み込み、その画像の濃度ヒストグラムを作成しなさい。 # すべての画像サイズは256*256となっている。 # ヒストグラムは階調値0-255を32段階でカウントする。 # また、頻度の表示は100個ごとに表示する。 '画像ファイルを読み込み、その画像の濃度ヒストグラムを作成する' :- '画像ファイルを読み込み'(_画像ファイル,_,_データ部値ならび), 'ヒストグラムの作成'(_データ部値ならび,LL), 'ヒストグラムの表示'(LL). '画像ファイルを読み込み'(_画像ファイル,_,_データ部値ならび) :- 'すべての画像サイズは256*256となっている'(_データ部サイズ), open(_画像ファイル,read,Input), 画像ファイルヘッダの読み込み(_画像ファイル,Input,_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ), close(Input), 画像ファイルデータ部の読み込み(_画像ファイル,_画像ファイルヘッダバイトサイズ,_データ部サイズ,_データ部値ならび),!. 画像ファイルデータ部の読み込み(_画像ファイル,_画像ファイルヘッダバイトサイズ,_データ部サイズ,_データ部値ならび) :- open(_画像ファイル,read,Input2,[type(binary)]), between(1,_画像ファイルヘッダバイトサイズ,N), get_byte(Input2,_), N = _画像ファイルヘッダバイトサイズ, findall(X,( between(1,_データ部サイズ,N), get_byte(Input2,X)) _データ部値ならび), close(Input2). 'すべての画像サイズは256*256となっている'(_データ部サイズ) :- _データ部サイズ is 256 * 256 * 3. 'ヒストグラムの作成'(_データ部値ならび,L1,LL) :- 'ヒストグラムは階調値0-255を32段階でカウントする'(L1,L2), '頻度の表示は100個ごとに'(L2,LL). 'ヒストグラムは階調値0-255を32段階でカウントする'([],[]) :- !. 'ヒストグラムは階調値0-255を32段階でカウントする'([R,G,B|R1],[_階調|R2]) :- _階調 is ((R + G + B) // 3) // 8, 'ヒストグラムは階調値0-255を32段階でカウントする'(R1,R2). '頻度の表示は100個ごとに'(L2,LL) :- findall(L_2,( between(0,31,N), count((member(M,L2),M >= N,M =< N + 31),Count_1), Count is Count_1 // 100, length(L_2,Count)), LL). 'ヒストグラムの表示'(_,[]) :- !. 'ヒストグラムの表示'(N,[L|R]) :- all(L,'*'), atomic_list_concat(L,_星表示), _範囲下限 is N * 32, _範囲上限 is _範囲下限 + 31, writef('%w~%w: %w\n',[_範囲下限,_範囲上限,_星表示]), N2 is N + 1, 'ヒストグラムの表示'(N2,R). 画像ファイルヘッダの読み込み(_画像ファイル,Input,_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ) :- findall(Line,( nth1(N,_,_), get_line(Input,Line), ( Line = '\n',!,fail; true )), _画像ファイルヘッダ), 画像ファイルヘッダサイズを得る(_画像ファイルヘッダ,_画像ファイルヘッダバイトサイズ),!. 画像ファイルヘッダサイズを得る([],1) :- !. 画像ファイルヘッダサイズを得る([Line|R],Size) :- 行のバイトサイズ(Line,_行のバイトサイズ), 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 1. 行のバイトサイズ([],1) :- !. 行のバイトサイズ([A|R],Size) :- char_code(A,Code), Code > 255, 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 2,!. 行のバイトサイズ([A|R],Size) :- char_code(A,Code), Code < 256, 画像ファイルヘッダサイズを得る(R,Size2), Size is Size2 + 1,!. all([],_). all([V|R],V) :- all(R,V). get_line(Input,Line) :- read_line_to_codes(Input,Codes), atom_codes(Line,Codes). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/578 # # 再び、お願いします(_ ) # # 【質問テンプレ】 # [1] 授業単元:C言語 演習問題4-14 # [2] 問題文(含コード&リンク):身長と標準体重を表示するプログラムを作成せよ。 #                なお、表示する身長の範囲(開始値、終了値、増分)は、整数値として読み込み、 #                標準体重は小数点以下2桁だけ表示すること。 # 身長と標準体重を表示する :- '身長の開始値・終了値と増分を入力する'(_開始値,_終了値,_増分), 身長の刻みごとに標準体重を表示する(_開始値,_終了値,_増分). '身長の開始値・終了値と増分を入力する'(_開始値,_終了値,_増分) :- 催促付き整数入力('身長(cm)の開始値(整数)を入力してください : ',_開始値), 催促付き整数入力('身長(cm)の終了値(整数)を入力してください : ',_終了値), 催促付き整数入力('増分(整数)を入力してください : ',_増分). 身長の刻みごとに標準体重を表示する(_開始値,_終了値,_増分) :- _分割数 is (_終了値 - _開始値) // _増分, between(0,_分割数,_刻み度数), 身長と標準体重を表示する(_刻み度数,_増分,_開始値,_終了値), _刻み度数 = _分割数. 身長と標準体重を表示する(_刻み度数,_増分,_開始値,_終了値) :- _身長 is _開始値 + _増分 * _刻み度数, _標準体重 is (_身長 / 100) ^ 2 * 1.2. writef('身長 = %tcm, ',[_身長]), format('標準体重 =~2f\n',[_標準体重]),!. % 以下のサイトは # 出典:: 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/479 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):オイラーの定理の仮証明 # # 互いに素なnとaについてオイラーの定理が成り立つか確かめる。 # とりあえずnは1以上5以下の数とし、aは1以上n以下とする。 # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10654.txt 互いに素なnとaについてオイラーの定理が成り立つか確かめる :- findall(_n,( for(1,_n,5), 互いに素なnとaについてオイラーの定理が成り立つか確かめる(_n)), L), length(L,5). 互いに素なnとaについてオイラーの定理が成り立つか確かめる(_n) :- findall(Mod,( 互いに素なnとa(_n,_a), オイラー関数(_n,Z), Mod is (_a ^ Z) mod _n), L), all(L,1),!. 互いに素なnとa(_n,_a) :- findall(M,for(1,M,_n-1),L), 組み合わせ(L,2,[_n,_a]), 最大公約数(_n,_a,1). オイラー関数(_n,Z) :- count((for(1,M,_n-1),\+(0 is _n mod M)),Z). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/229 # # [1] 授業単元:データベース論 # [2] 問題文(含コード&リンク):サンプルデータから情報を取りだしその情報をstudents.txtとして出力するプログラムを組め # Students.txtの例は以下の通り # 1 tanaka A # 2 sano B # 3 hori C # # サンプルデータから情報を取りだしその情報をstudents.txtとして出力する :- サンプルデータから情報を取りだし(_サンプル情報ならび), その情報をstudents.txtとして出力する(_サンプル情報ならび). サンプルデータから情報を取りだし(_サンプル情報ならび) :- count(サンプルデータ(_,_,_),_総情報数), _標本数 is _総情報数 // 20, findall([ID,_名前,_生徒情報],( for(1,N,_標本数), ID is (random mod _総情報数) + 1, サンプルデータ(ID,_名前,_生徒情報)), _サンプル情報ならび). その情報をstudents.txtとして出力する(_サンプル情報ならび) :- tell('students.txt'), append(_,[_サンプル情報|_残りならび],_サンプル情報ならび), 行表示文字列を構成して(_サンプル情報,_行表示文字列), 出力する(_行表示文字列), _残りならび = [], told. 行表示文字列を構成して(_値ならび,_行表示文字列) :- concat_atom(_値ならび,' ',_行表示文字列). 出力する(_行表示文字列) :- write_formatted('%t\n',[_行表示文字列]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1261057499/975 # # たしてちょうど15になる7個の自然数の組合せをすべて列挙するとともに、 # すべての組合せを表示し終えたら、それらの組合せが全部でいくつあるの # かも出力するプログラムを作成しなさい。 # # #include<stdio.h> # # int main(void) # { # int i,num; # # printf("自然数の組合せ\n"); # # num=0; # # for(i=1;num<=14;i++){ # num=num+i; # printf("%d\t",i); # # } # # printf("組み合わせは%d通り\n",num); # # return 0; # } # # 現在ここまで作りましたが、プログラムがわかりません。 # 誰か教えてください。 # # 言語はC++ # 環境はVisual です。 # # たしてちょうど15になる7個の自然数の組合せをすべて列挙する([A,B,C,D,E,F,G]) :- たしてちょうど15になる7個の自然数候補の最大値(M), '1からMまでのならび'(M,L1), 重複組合せ(L1,7,[A,B,C,D,E,F,G]), 15 is A + B + C + D + E + F + G. 組合せが全部でいくつあるのか(_いくつ) :- いくつ(たしてちょうど15になる7個の自然数の組合せをすべて列挙する(L),_いくつ). たしてちょうど15になる7個の自然数候補の最大値(N) :- for(14,N,1), M is 15 - N, '1からMまでのならび'(M,L1), 重複組合せ(L1,6,L2), 整数加算(L2,M),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1からMまでのならび'(M,L) :- findall(J,for(1,J,M),L). 重複組合せ(X,1,[A]) :- member(A,X). 重複組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 重複組合せ([A|Y],M,X). 重複組合せ([_|Y],N,A) :- N > 1, 重複組合せ(Y,N,A). 整数加算([],0) :- !. 整数加算([A|R],X) :- 整数加算(R,Y),X is A + Y. いくつ(_目標,_いくつ) :- count(_目標,_いくつ). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/5 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 以下の実行結果になるようおねがいします # # 文字列を入力してください # adlkjgeiakdalf # # 確認したい文字を入力してください # a # # 文字(a)の数は3文字です # 入力された文字列の中にある文字が何個含まれるか :- 文字列を入力してください(_文字列), 確認したい文字を入力してください(_文字), count(sub_atom(_文字列,_,1,_,_文字),_何個), 整数を全角文字表現に変換する(_何個,_何個の全角文字表現), write_formatted('文字(%t)の数は%t文字です\n',[_何個,_回数の全角文字表現]). 文字列を入力してください(_文字列) :- write('文字列を入力してください\n'), get_line(_文字列). 確認したい文字を入力してください(_文字) :- write('確認したい文字を入力してください\n'), get_line(_文字列), sub_atom(_文字列,0,1,_,_文字),!. 整数を全角文字表現に変換する(_整数,_整数の全角文字表現) :- number_chars(_整数,Chars), findall(_全角文字,( member(A,Chars), list_nth(N,['1','2','3','4','5','6','7','8','9','0'],A), list_nth(N,['1','2','3','4','5','6','7','8','9','0'],_全角文字)), L), concat_atom(L,_整数の全角表現). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/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://pc12.2ch.net/test/read.cgi/tech/1269438098/801 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # テストの点数を入力し合計点、平均点、受験者数、合格者数を表示するプログラムを作成しなさい。ただし、データの終わりの999(999点と表示しない)合格者は60点以上 # 実行例 # # 84         <--キーボードから点数入力 # 84点        <--入力した点数を表示 # 95 # 95点 # 48 # 48点 # 66 # 66点 # 80 # 80点 # 999     <--データの終わり(999点とは表示しない) # 合計点=373点 # 平均点=74.6点 # 受験者数=5名 # 合格者数=4名 # キーボードから点数入力 テストの点数を入力し合計点、平均点、受験者数、合格者数を表示するプログラムを作成しなさい。ただし、データの終わりの999(999点と表示しない)合格者は60点以上 :- 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数ならび), 合計点(_点数ならび,_合計点), 受験者数(_点数ならび,_受験者数), 合格者数(_点数ならび,_合格者数), 表示する('合計点=%t\n平均点=%t点\n受験者数=%t\n合格者数=%t\n',[_合計点,_平均点,_受験者数,合格者数]). 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数ならび) :- キーボードから点数入力('点数を入力してください(データの終わりの999) : ',_点数), 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数,_点数ならび). 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数,[]) :- 'ただし、データの終わりの999(999点と表示しない)'(_点数),!. 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数,[_点数|R]) :- 入力した点数を表示(_点数), キーボードから点数入力(_次の点数), 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_次の点数,R). キーボードから点数入力('点数を入力してください(データの終わりの999) : ',_点数) :- 催促付き整数入力('点数を入力してください(データの終わりの999) : ',_点数). キーボードから点数入力(_点数) :- get_integer(_点数). 入力した点数を表示(_点数) :- write_formatted('%t点\n',[_点数]). 'ただし、データの終わりの999(999点と表示しない)'(999). 合計点(_点数ならび,_合計点) :- 加算(_点数ならび,_合計点_浮動小数点),_合計点 is truncate(_合計点_浮動小数点数), 平均点(_点数ならび,_平均点) :- 平均(_点数ならび,_平均点). 受験者数(_点数ならび,_受験者数) :- length(_点数ならび,_受験者数). 合格者数(_点数ならび,_合格者数) :- 度数((member(_点数,_点数ならび),_点数>=60),_合格者数). 表示する(Format,_値ならび) :- write_formatted(Format,_値ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 加算(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 = 0,!. 加算([],L) :- \+(var(L)), 加算の変数に零をおく(L),!. 加算([L|R],SL) :- ならび(L), 転置([L|R],L1), 加算_2(L1,SL),!. 加算(X,S) :- 加算_1(X,0.0e+00,S). 全て整数([]) :- !. 全て整数([N|R]) :- integer(N),全て整数(R). 平均(L,Avg) :- list(L),findavg(A,member(A,L),Avg). 度数(A,[],0). 度数(A,[A|R],X) :- 度数(A,R,Y),X is Y + 1. 度数(A,[_|R],X) :- 度数(A,R,X). 度数(P,N) :- findsum(1,P,F),N is truncate(F). findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), 加算(_値ならび,_合計値), list_length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. 合計は原則として浮動小数点数. % 合計は原則として整数. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/877 # # T_USER T_HOGE T_MAG         T_USER # ID|NUM  ID      MAG             ID|NUM # --|---- --      --             --|---- # A | 100  A      100  .→→→    A | 300 # B | 100  A         update結果  B | 200 # C | 100  B                   C | 100 # # 「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果を # T_USER.NUMに対し加算するUPDATE文を書きたいのですが # どうすればよいでしょうか。IDはVARCHAR型です。 # DBMSはMySQL 5.1です。 # # '「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文' :- '「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文'(_), fail. '「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文'. '「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文'(ID) :- 'T_MAG'(MAG), retract('T_USER'(ID,NUM)), count('T_HOGE'(ID),Count), NUM2 is NUM + MAG * Count, assertz('T_USER'(ID,NUM2)). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/312 # # [1] 授業単元: Introduction to C++ # [2] 問題文: ユーザーにサイズN(最大で100000)を入力させ、そのサイズのArrayを1〜100までのランダムな数字で埋めた後、N個のランダムな数字を数字1、数字2、数字3・・・という具合にカウントするプログラムを書きなさい # (元の文が英文なのですが、約した際に何かしら抜け落ちている点が在るかもしれないので一応原文も記載しておきます) # Write a program that asks user to enter a size, N. (The maximum is 100000). Write a # function that generates random numbers in range of 1 ~ 100 and fill an array of size N. # You also need to count how many 1’s, 2’s, 3’s, # 4’s, 5’s, …, 100’s. If the random number function does it job perfectly, the distribution to # each number should be equal. But they might be slightly off. # ライン([A,B,C,2],[2,E,F,G],[G,H,B,1],[1,C,E,3]). '空いている○の中に4~12の数字を入れ、5つある線上の合計が等しくなるようにした場合、あまる数字は何と何か?なお、同じ数字は使えません。'(_あまる数字ならび) :- ライン(L1,L2,L3,L4), flat([L1,L2,L3,L4],L), 未知数はいくつあるか(L,[],_重複しない変数ならび,_未知数の数), findall(M,for(4,M,12),_候補数値ならび), 順列(_候補数値ならび,_未知数の数,_重複しない変数ならび), 加算(L1,X),加算(L2,X),加算(L3,X),加算(L4,X), 差集合(_候補数値ならび,VL,_あまる数字ならび). 未知数はいくつあるか([],L,L,N) :- length(L,N),!. 未知数はいくつあるか([V|R],L,VL,X) :- var(V), \+memberV(V,L), 未知数はいくつあるか(R,[V|L],VL,X),!. 未知数はいくつあるか([V|R],L,VL,X) :- var(V), memberV(V,L), 未知数はいくつあるか(R,L,VL,X),!. 未知数はいくつあるか([_|R],L,VL,X) :- 未知数はいくつあるか(R,L,VL,X),!. memberV(V1,[V2|R]) :- V1==V2,!. memberV(V,[_|R]) :- memberV(V,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/312 # # [1] 授業単元: Introduction to C++ # [2] 問題文: ユーザーにサイズN(最大で100000)を入力させ、そのサイズのArrayを1〜100までのランダムな数字で埋めた後、N個のランダムな数字を数字1、数字2、数字3・・・という具合にカウントするプログラムを書きなさい # (元の文が英文なのですが、約した際に何かしら抜け落ちている点が在るかもしれないので一応原文も記載しておきます) # Write a program that asks user to enter a size, N. (The maximum is 100000). Write a # function that generates random numbers in range of 1 ~ 100 and fill an array of size N. # You also need to count how many 1’s, 2’s, 3’s, # 4’s, 5’s, …, 100’s. If the random number function does it job perfectly, the distribution to # each number should be equal. But they might be slightly off. # 3] 環境 #  [3.1] OS:Vista #  [3.2] コンパイラ名とバージョン:Visual C++ 2008 #  [3.3] 言語:C++ # [4] 期限: 2010/04/30 # [5] その他の制限: なし # 'ユーザーにサイズN(最大で100000)を入力させ、そのサイズのArrayを1〜100までのランダムな数字で埋めた後、N個のランダムな数字を数字1、数字2、数字3・・・という具合にカウントする' :- 'ユーザーにサイズN(最大で100000)を入力させ'(N), そのサイズのArray(L,N), '1〜100までのランダムな数字で埋めた後'(L), 'N個のランダムな数字を数字1、数字2、数字3・・・という具合にカウントする'(L). 'ユーザーにサイズN(最大で100000)を入力させ'(N) :- 催促付き整数入力('サイズN(最大で100000)を入力してください :',N),!. 'そのサイズのArrayを1〜100までのランダムな数字で埋めた後'([]) :- !. 'そのサイズのArrayを1〜100までのランダムな数字で埋めた後'([M|R]) :- M is (random mod 100) + 1, 'そのサイズのArrayを1〜100までのランダムな数字で埋めた後'(R). 'N個のランダムな数字を数字1、数字2、数字3・・・という具合にカウントする'(L) :- for(1,N,100), count(member(N,L),Count), write_formatted('%tの度数=%t\n',[Count]), N=100. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/272 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 整数の入った配列中の、各整数の個数を出力せよ。 # 例えば、P[4]={1, 2, 3, 1} ならば出力は # 0 0 # 1 2 # 2 1 # 3 1 # 4 0 # となる。配列の要素数までの各整数の個数を出力すれば良い。 # # '整数の入った配列中の、各整数の個数を出力せよ。 \n例えば、P[4]={1, 2, 3, 1} ならば出力は\n0 0 \n1 2 \n2 1 \n3 1 \n4 0 \nとなる。配列の要素数までの各整数の個数を出力すれば良い。 ' (_数値ならび) :- 要素数を数える(_数値ならび,_数値ならびの要素数), for(0,N,_数値ならびの要素数), count(member(N,_数値ならび),_度数), write_formatted('%t %t\n',[N,_度数]), N = _数値ならびの要素数. % 以下のサイトは % *** user: '西暦和暦変換' / 2 *** '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_和暦年), \+(atomic(_西暦年)), atom_chars(_和暦年,L), '年漢字表現'(N,L2), append(L3,L2,L), concat_atom(L3,_元号), concat_atom(L2,_年), '西暦和暦表'(_西暦年,_元号,N,_). '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_西暦年), \+(atomic(_和暦年)), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- var(_西暦年), var(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- var(_西暦年), var(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). '西暦和暦変換'(_西暦年,_和暦年) :- atomic(_西暦年), atom(_和暦年), '西暦和暦表'(_西暦年,_元号,_年,_), '年漢字表現'(_年,_年漢字表現文字ならび), concat_atom(_年漢字表現文字ならび,_年漢字表現), concat_atom([_元号,_年漢字表現],_和暦年). 西暦和暦表(645,大化,1,[]). 西暦和暦表(646,大化,2,[]). 西暦和暦表(647,大化,3,[]). 西暦和暦表(648,大化,4,[]). 西暦和暦表(649,大化,5,[]). 西暦和暦表(650,大化,6,[]). 西暦和暦表(650,白雉,1,[]). 西暦和暦表(651,白雉,2,[]). 西暦和暦表(652,白雉,3,[]). 西暦和暦表(653,白雉,4,[]). 西暦和暦表(654,白雉,5,[]). 西暦和暦表(686,朱鳥,1,[]). 西暦和暦表(687,朱鳥,2,[]). 西暦和暦表(701,大宝,1,[]). 西暦和暦表(702,大宝,2,[]). 西暦和暦表(703,大宝,3,[]). 西暦和暦表(704,大宝,4,[]). 西暦和暦表(704,慶雲,1,[]). 西暦和暦表(705,慶雲,2,[]). 西暦和暦表(706,慶雲,3,[]). 西暦和暦表(707,慶雲,4,[]). 西暦和暦表(708,慶雲,5,[]). 西暦和暦表(708,和銅,1,[]). 西暦和暦表(709,和銅,2,[]). 西暦和暦表(710,和銅,3,[]). 西暦和暦表(711,和銅,4,[]). 西暦和暦表(712,和銅,5,[]). 西暦和暦表(713,和銅,6,[]). 西暦和暦表(714,和銅,7,[]). 西暦和暦表(715,和銅,8,[]). 西暦和暦表(715,霊亀,1,[]). 西暦和暦表(716,霊亀,2,[]). 西暦和暦表(717,霊亀,3,[]). 西暦和暦表(717,養老,1,[]). 西暦和暦表(718,養老,2,[]). 西暦和暦表(719,養老,3,[]). 西暦和暦表(720,養老,4,[]). 西暦和暦表(721,養老,5,[]). 西暦和暦表(722,養老,6,[]). 西暦和暦表(723,養老,7,[]). 西暦和暦表(724,養老,8,[]). 西暦和暦表(724,神亀,1,[]). 西暦和暦表(725,神亀,2,[]). 西暦和暦表(726,神亀,3,[]). 西暦和暦表(727,神亀,4,[]). 西暦和暦表(728,神亀,5,[]). 西暦和暦表(729,神亀,6,[]). 西暦和暦表(729,天平,1,[]). 西暦和暦表(730,天平,2,[]). 西暦和暦表(731,天平,3,[]). 西暦和暦表(732,天平,4,[]). 西暦和暦表(733,天平,5,[]). 西暦和暦表(734,天平,6,[]). 西暦和暦表(735,天平,7,[]). 西暦和暦表(736,天平,8,[]). 西暦和暦表(737,天平,9,[]). 西暦和暦表(738,天平,10,[]). 西暦和暦表(739,天平,11,[]). 西暦和暦表(740,天平,12,[]). 西暦和暦表(741,天平,13,[]). 西暦和暦表(742,天平,14,[]). 西暦和暦表(743,天平,15,[]). 西暦和暦表(744,天平,16,[]). 西暦和暦表(745,天平,17,[]). 西暦和暦表(746,天平,18,[]). 西暦和暦表(747,天平,19,[]). 西暦和暦表(748,天平,20,[]). 西暦和暦表(749,天平,21,[]). 西暦和暦表(749,天平感宝,1,[]). 西暦和暦表(749,天平勝宝,1,[]). 西暦和暦表(750,天平勝宝,2,[]). 西暦和暦表(751,天平勝宝,3,[]). 西暦和暦表(752,天平勝宝,4,[]). 西暦和暦表(753,天平勝宝,5,[]). 西暦和暦表(754,天平勝宝,6,[]). 西暦和暦表(755,天平勝宝,7,[]). 西暦和暦表(756,天平勝宝,8,[]). 西暦和暦表(757,天平勝宝,9,[]). 西暦和暦表(757,天平宝字,1,[]). 西暦和暦表(758,天平宝字,2,[]). 西暦和暦表(759,天平宝字,3,[]). 西暦和暦表(760,天平宝字,4,[]). 西暦和暦表(761,天平宝字,5,[]). 西暦和暦表(762,天平宝字,6,[]). 西暦和暦表(763,天平宝字,7,[]). 西暦和暦表(764,天平宝字,8,[]). 西暦和暦表(765,天平宝字,9,[]). 西暦和暦表(765,天平神護,1,[]). 西暦和暦表(766,天平神護,2,[]). 西暦和暦表(767,天平神護,3,[]). 西暦和暦表(767,神護景雲,1,[]). 西暦和暦表(768,神護景雲,2,[]). 西暦和暦表(769,神護景雲,3,[]). 西暦和暦表(770,神護景雲,4,[]). 西暦和暦表(770,宝亀,1,[]). 西暦和暦表(771,宝亀,2,[]). 西暦和暦表(772,宝亀,3,[]). 西暦和暦表(773,宝亀,4,[]). 西暦和暦表(774,宝亀,5,[]). 西暦和暦表(775,宝亀,6,[]). 西暦和暦表(776,宝亀,7,[]). 西暦和暦表(777,宝亀,8,[]). 西暦和暦表(778,宝亀,9,[]). 西暦和暦表(779,宝亀,10,[]). 西暦和暦表(780,宝亀,11,[]). 西暦和暦表(781,天応,1,[]). 西暦和暦表(782,天応,2,[]). 西暦和暦表(782,延暦,1,[]). 西暦和暦表(783,延暦,2,[]). 西暦和暦表(784,延暦,3,[]). 西暦和暦表(785,延暦,4,[]). 西暦和暦表(786,延暦,5,[]). 西暦和暦表(787,延暦,6,[]). 西暦和暦表(788,延暦,7,[]). 西暦和暦表(789,延暦,8,[]). 西暦和暦表(790,延暦,9,[]). 西暦和暦表(791,延暦,10,[]). 西暦和暦表(792,延暦,11,[]). 西暦和暦表(793,延暦,12,[]). 西暦和暦表(794,延暦,13,[]). 西暦和暦表(795,延暦,14,[]). 西暦和暦表(796,延暦,15,[]). 西暦和暦表(797,延暦,16,[]). 西暦和暦表(798,延暦,17,[]). 西暦和暦表(799,延暦,18,[]). 西暦和暦表(800,延暦,19,[]). 西暦和暦表(801,延暦,20,[]). 西暦和暦表(802,延暦,21,[]). 西暦和暦表(803,延暦,22,[]). 西暦和暦表(804,延暦,23,[]). 西暦和暦表(805,延暦,24,[]). 西暦和暦表(806,延暦,25,[]). 西暦和暦表(806,大同,1,[]). 西暦和暦表(807,大同,2,[]). 西暦和暦表(808,大同,3,[]). 西暦和暦表(809,大同,4,[]). 西暦和暦表(810,大同,5,[]). 西暦和暦表(810,弘仁,1,[]). 西暦和暦表(811,弘仁,2,[]). 西暦和暦表(812,弘仁,3,[]). 西暦和暦表(813,弘仁,4,[]). 西暦和暦表(814,弘仁,5,[]). 西暦和暦表(815,弘仁,6,[]). 西暦和暦表(816,弘仁,7,[]). 西暦和暦表(817,弘仁,8,[]). 西暦和暦表(818,弘仁,9,[]). 西暦和暦表(819,弘仁,10,[]). 西暦和暦表(820,弘仁,11,[]). 西暦和暦表(821,弘仁,12,[]). 西暦和暦表(822,弘仁,13,[]). 西暦和暦表(823,弘仁,14,[]). 西暦和暦表(824,弘仁,15,[]). 西暦和暦表(824,天長,1,[]). 西暦和暦表(825,天長,2,[]). 西暦和暦表(826,天長,3,[]). 西暦和暦表(827,天長,4,[]). 西暦和暦表(828,天長,5,[]). 西暦和暦表(829,天長,6,[]). 西暦和暦表(830,天長,7,[]). 西暦和暦表(831,天長,8,[]). 西暦和暦表(832,天長,9,[]). 西暦和暦表(833,天長,10,[]). 西暦和暦表(834,天長,11,[]). 西暦和暦表(834,承和,1,[]). 西暦和暦表(835,承和,2,[]). 西暦和暦表(836,承和,3,[]). 西暦和暦表(837,承和,4,[]). 西暦和暦表(838,承和,5,[]). 西暦和暦表(839,承和,6,[]). 西暦和暦表(840,承和,7,[]). 西暦和暦表(841,承和,8,[]). 西暦和暦表(842,承和,9,[]). 西暦和暦表(843,承和,10,[]). 西暦和暦表(844,承和,11,[]). 西暦和暦表(845,承和,12,[]). 西暦和暦表(846,承和,13,[]). 西暦和暦表(847,承和,14,[]). 西暦和暦表(848,承和,15,[]). 西暦和暦表(848,嘉祥,1,[]). 西暦和暦表(849,嘉祥,2,[]). 西暦和暦表(850,嘉祥,3,[]). 西暦和暦表(851,嘉祥,4,[]). 西暦和暦表(851,仁寿,1,[]). 西暦和暦表(852,仁寿,2,[]). 西暦和暦表(853,仁寿,3,[]). 西暦和暦表(854,仁寿,4,[]). 西暦和暦表(854,斉衡,1,[]). 西暦和暦表(855,斉衡,2,[]). 西暦和暦表(856,斉衡,3,[]). 西暦和暦表(857,斉衡,4,[]). 西暦和暦表(857,天安,1,[]). 西暦和暦表(858,天安,2,[]). 西暦和暦表(859,天安,3,[]). 西暦和暦表(859,貞観,1,[]). 西暦和暦表(860,貞観,2,[]). 西暦和暦表(861,貞観,3,[]). 西暦和暦表(862,貞観,4,[]). 西暦和暦表(863,貞観,5,[]). 西暦和暦表(864,貞観,6,[]). 西暦和暦表(865,貞観,7,[]). 西暦和暦表(866,貞観,8,[]). 西暦和暦表(867,貞観,9,[]). 西暦和暦表(868,貞観,10,[]). 西暦和暦表(869,貞観,11,[]). 西暦和暦表(870,貞観,12,[]). 西暦和暦表(871,貞観,13,[]). 西暦和暦表(872,貞観,14,[]). 西暦和暦表(873,貞観,15,[]). 西暦和暦表(874,貞観,16,[]). 西暦和暦表(875,貞観,17,[]). 西暦和暦表(876,貞観,18,[]). 西暦和暦表(877,貞観,19,[]). 西暦和暦表(877,元慶,1,[]). 西暦和暦表(878,元慶,2,[]). 西暦和暦表(879,元慶,3,[]). 西暦和暦表(880,元慶,4,[]). 西暦和暦表(881,元慶,5,[]). 西暦和暦表(882,元慶,6,[]). 西暦和暦表(883,元慶,7,[]). 西暦和暦表(884,元慶,8,[]). 西暦和暦表(885,元慶,9,[]). 西暦和暦表(885,仁和,1,[]). 西暦和暦表(886,仁和,2,[]). 西暦和暦表(887,仁和,3,[]). 西暦和暦表(888,仁和,4,[]). 西暦和暦表(889,仁和,5,[]). 西暦和暦表(889,寛平,1,[]). 西暦和暦表(890,寛平,2,[]). 西暦和暦表(891,寛平,3,[]). 西暦和暦表(892,寛平,4,[]). 西暦和暦表(893,寛平,5,[]). 西暦和暦表(894,寛平,6,[]). 西暦和暦表(895,寛平,7,[]). 西暦和暦表(896,寛平,8,[]). 西暦和暦表(897,寛平,9,[]). 西暦和暦表(898,寛平,10,[]). 西暦和暦表(898,昌泰,1,[]). 西暦和暦表(899,昌泰,2,[]). 西暦和暦表(900,昌泰,3,[]). 西暦和暦表(901,昌泰,4,[]). 西暦和暦表(901,延喜,1,[]). 西暦和暦表(902,延喜,2,[]). 西暦和暦表(903,延喜,3,[]). 西暦和暦表(904,延喜,4,[]). 西暦和暦表(905,延喜,5,[]). 西暦和暦表(906,延喜,6,[]). 西暦和暦表(907,延喜,7,[]). 西暦和暦表(908,延喜,8,[]). 西暦和暦表(909,延喜,9,[]). 西暦和暦表(910,延喜,10,[]). 西暦和暦表(911,延喜,11,[]). 西暦和暦表(912,延喜,12,[]). 西暦和暦表(913,延喜,13,[]). 西暦和暦表(914,延喜,14,[]). 西暦和暦表(915,延喜,15,[]). 西暦和暦表(916,延喜,16,[]). 西暦和暦表(917,延喜,17,[]). 西暦和暦表(918,延喜,18,[]). 西暦和暦表(919,延喜,19,[]). 西暦和暦表(920,延喜,20,[]). 西暦和暦表(921,延喜,21,[]). 西暦和暦表(922,延喜,22,[]). 西暦和暦表(923,延喜,23,[]). 西暦和暦表(923,延長,1,[]). 西暦和暦表(924,延長,2,[]). 西暦和暦表(925,延長,3,[]). 西暦和暦表(926,延長,4,[]). 西暦和暦表(927,延長,5,[]). 西暦和暦表(928,延長,6,[]). 西暦和暦表(929,延長,7,[]). 西暦和暦表(930,延長,8,[]). 西暦和暦表(931,延長,9,[]). 西暦和暦表(931,承平,1,[]). 西暦和暦表(932,承平,2,[]). 西暦和暦表(933,承平,3,[]). 西暦和暦表(934,承平,4,[]). 西暦和暦表(935,承平,5,[]). 西暦和暦表(936,承平,6,[]). 西暦和暦表(937,承平,7,[]). 西暦和暦表(938,承平,8,[]). 西暦和暦表(938,天慶,1,[]). 西暦和暦表(939,天慶,2,[]). 西暦和暦表(940,天慶,3,[]). 西暦和暦表(941,天慶,4,[]). 西暦和暦表(942,天慶,5,[]). 西暦和暦表(943,天慶,6,[]). 西暦和暦表(944,天慶,7,[]). 西暦和暦表(945,天慶,8,[]). 西暦和暦表(946,天慶,9,[]). 西暦和暦表(947,天慶,10,[]). 西暦和暦表(947,天暦,1,[]). 西暦和暦表(948,天暦,2,[]). 西暦和暦表(949,天暦,3,[]). 西暦和暦表(950,天暦,4,[]). 西暦和暦表(951,天暦,5,[]). 西暦和暦表(952,天暦,6,[]). 西暦和暦表(953,天暦,7,[]). 西暦和暦表(954,天暦,8,[]). 西暦和暦表(955,天暦,9,[]). 西暦和暦表(956,天暦,10,[]). 西暦和暦表(957,天暦,11,[]). 西暦和暦表(957,天徳,1,[]). 西暦和暦表(958,天徳,2,[]). 西暦和暦表(959,天徳,3,[]). 西暦和暦表(960,天徳,4,[]). 西暦和暦表(961,天徳,5,[]). 西暦和暦表(961,応和,1,[]). 西暦和暦表(962,応和,2,[]). 西暦和暦表(963,応和,3,[]). 西暦和暦表(964,応和,4,[]). 西暦和暦表(964,康保,1,[]). 西暦和暦表(965,康保,2,[]). 西暦和暦表(966,康保,3,[]). 西暦和暦表(967,康保,4,[]). 西暦和暦表(968,康保,5,[]). 西暦和暦表(968,安和,1,[]). 西暦和暦表(969,安和,2,[]). 西暦和暦表(970,安和,3,[]). 西暦和暦表(970,天禄,1,[]). 西暦和暦表(971,天禄,2,[]). 西暦和暦表(972,天禄,3,[]). 西暦和暦表(973,天禄,4,[]). 西暦和暦表(973,天延,1,[]). 西暦和暦表(974,天延,2,[]). 西暦和暦表(975,天延,3,[]). 西暦和暦表(976,天延,4,[]). 西暦和暦表(976,貞元,1,[]). 西暦和暦表(977,貞元,2,[]). 西暦和暦表(978,貞元,3,[]). 西暦和暦表(978,天元,1,[]). 西暦和暦表(979,天元,2,[]). 西暦和暦表(980,天元,3,[]). 西暦和暦表(981,天元,4,[]). 西暦和暦表(982,天元,5,[]). 西暦和暦表(983,天元,6,[]). 西暦和暦表(983,永観,1,[]). 西暦和暦表(984,永観,2,[]). 西暦和暦表(985,永観,3,[]). 西暦和暦表(985,寛和,1,[]). 西暦和暦表(986,寛和,2,[]). 西暦和暦表(987,寛和,3,[]). 西暦和暦表(987,永延,1,[]). 西暦和暦表(988,永延,2,[]). 西暦和暦表(989,永延,3,[]). 西暦和暦表(989,永祚,1,[]). 西暦和暦表(990,永祚,2,[]). 西暦和暦表(990,正暦,1,[]). 西暦和暦表(991,正暦,2,[]). 西暦和暦表(992,正暦,3,[]). 西暦和暦表(993,正暦,4,[]). 西暦和暦表(994,正暦,5,[]). 西暦和暦表(995,正暦,6,[]). 西暦和暦表(995,長徳,1,[]). 西暦和暦表(996,長徳,2,[]). 西暦和暦表(997,長徳,3,[]). 西暦和暦表(998,長徳,4,[]). 西暦和暦表(999,長徳,5,[]). 西暦和暦表(999,長保,1,[]). 西暦和暦表(1000,長保,2,[]). 西暦和暦表(1001,長保,3,[]). 西暦和暦表(1002,長保,4,[]). 西暦和暦表(1003,長保,5,[]). 西暦和暦表(1004,長保,6,[]). 西暦和暦表(1004,寛弘,1,[]). 西暦和暦表(1005,寛弘,2,[]). 西暦和暦表(1006,寛弘,3,[]). 西暦和暦表(1007,寛弘,4,[]). 西暦和暦表(1008,寛弘,5,[]). 西暦和暦表(1009,寛弘,6,[]). 西暦和暦表(1010,寛弘,7,[]). 西暦和暦表(1011,寛弘,8,[]). 西暦和暦表(1012,寛弘,9,[]). 西暦和暦表(1012,長和,1,[]). 西暦和暦表(1013,長和,2,[]). 西暦和暦表(1014,長和,3,[]). 西暦和暦表(1015,長和,4,[]). 西暦和暦表(1016,長和,5,[]). 西暦和暦表(1017,長和,6,[]). 西暦和暦表(1017,寛仁,1,[]). 西暦和暦表(1018,寛仁,2,[]). 西暦和暦表(1019,寛仁,3,[]). 西暦和暦表(1020,寛仁,4,[]). 西暦和暦表(1021,寛仁,5,[]). 西暦和暦表(1021,治安,1,[]). 西暦和暦表(1022,治安,2,[]). 西暦和暦表(1023,治安,3,[]). 西暦和暦表(1024,治安,4,[]). 西暦和暦表(1024,万寿,1,[]). 西暦和暦表(1025,万寿,2,[]). 西暦和暦表(1026,万寿,3,[]). 西暦和暦表(1027,万寿,4,[]). 西暦和暦表(1028,万寿,5,[]). 西暦和暦表(1028,長元,1,[]). 西暦和暦表(1029,長元,2,[]). 西暦和暦表(1030,長元,3,[]). 西暦和暦表(1031,長元,4,[]). 西暦和暦表(1032,長元,5,[]). 西暦和暦表(1033,長元,6,[]). 西暦和暦表(1034,長元,7,[]). 西暦和暦表(1035,長元,8,[]). 西暦和暦表(1036,長元,9,[]). 西暦和暦表(1037,長元,10,[]). 西暦和暦表(1037,長暦,1,[]). 西暦和暦表(1038,長暦,2,[]). 西暦和暦表(1039,長暦,3,[]). 西暦和暦表(1040,長暦,4,[]). 西暦和暦表(1040,長久,1,[]). 西暦和暦表(1041,長久,2,[]). 西暦和暦表(1042,長久,3,[]). 西暦和暦表(1043,長久,4,[]). 西暦和暦表(1044,長久,5,[]). 西暦和暦表(1044,寛徳,1,[]). 西暦和暦表(1045,寛徳,2,[]). 西暦和暦表(1046,寛徳,3,[]). 西暦和暦表(1046,永承,1,[]). 西暦和暦表(1047,永承,2,[]). 西暦和暦表(1048,永承,3,[]). 西暦和暦表(1049,永承,4,[]). 西暦和暦表(1050,永承,5,[]). 西暦和暦表(1051,永承,6,[]). 西暦和暦表(1052,永承,7,[]). 西暦和暦表(1053,永承,8,[]). 西暦和暦表(1053,天喜,1,[]). 西暦和暦表(1054,天喜,2,[]). 西暦和暦表(1055,天喜,3,[]). 西暦和暦表(1056,天喜,4,[]). 西暦和暦表(1057,天喜,5,[]). 西暦和暦表(1058,天喜,6,[]). 西暦和暦表(1058,康平,1,[]). 西暦和暦表(1059,康平,2,[]). 西暦和暦表(1060,康平,3,[]). 西暦和暦表(1061,康平,4,[]). 西暦和暦表(1062,康平,5,[]). 西暦和暦表(1063,康平,6,[]). 西暦和暦表(1064,康平,7,[]). 西暦和暦表(1065,康平,8,[]). 西暦和暦表(1065,治暦,1,[]). 西暦和暦表(1066,治暦,2,[]). 西暦和暦表(1067,治暦,3,[]). 西暦和暦表(1068,治暦,4,[]). 西暦和暦表(1069,治暦,5,[]). 西暦和暦表(1069,延久,1,[]). 西暦和暦表(1070,延久,2,[]). 西暦和暦表(1071,延久,3,[]). 西暦和暦表(1072,延久,4,[]). 西暦和暦表(1073,延久,5,[]). 西暦和暦表(1074,延久,6,[]). 西暦和暦表(1074,承保,1,[]). 西暦和暦表(1075,承保,2,[]). 西暦和暦表(1076,承保,3,[]). 西暦和暦表(1077,承保,4,[]). 西暦和暦表(1077,承暦,1,[]). 西暦和暦表(1078,承暦,2,[]). 西暦和暦表(1079,承暦,3,[]). 西暦和暦表(1080,承暦,4,[]). 西暦和暦表(1081,承暦,5,[]). 西暦和暦表(1081,永保,1,[]). 西暦和暦表(1082,永保,2,[]). 西暦和暦表(1083,永保,3,[]). 西暦和暦表(1084,永保,4,[]). 西暦和暦表(1084,応徳,1,[]). 西暦和暦表(1085,応徳,2,[]). 西暦和暦表(1086,応徳,3,[]). 西暦和暦表(1087,応徳,4,[]). 西暦和暦表(1087,寛治,1,[]). 西暦和暦表(1088,寛治,2,[]). 西暦和暦表(1089,寛治,3,[]). 西暦和暦表(1090,寛治,4,[]). 西暦和暦表(1091,寛治,5,[]). 西暦和暦表(1092,寛治,6,[]). 西暦和暦表(1093,寛治,7,[]). 西暦和暦表(1094,寛治,8,[]). 西暦和暦表(1094,嘉保,1,[]). 西暦和暦表(1095,嘉保,2,[]). 西暦和暦表(1096,嘉保,3,[]). 西暦和暦表(1096,永長,1,[]). 西暦和暦表(1097,永長,2,[]). 西暦和暦表(1097,承徳,1,[]). 西暦和暦表(1098,承徳,2,[]). 西暦和暦表(1099,承徳,3,[]). 西暦和暦表(1099,康和,1,[]). 西暦和暦表(1100,康和,2,[]). 西暦和暦表(1101,康和,3,[]). 西暦和暦表(1102,康和,4,[]). 西暦和暦表(1103,康和,5,[]). 西暦和暦表(1104,康和,6,[]). 西暦和暦表(1104,長治,1,[]). 西暦和暦表(1105,長治,2,[]). 西暦和暦表(1106,長治,3,[]). 西暦和暦表(1106,嘉承,1,[]). 西暦和暦表(1107,嘉承,2,[]). 西暦和暦表(1108,嘉承,3,[]). 西暦和暦表(1108,天仁,1,[]). 西暦和暦表(1109,天仁,2,[]). 西暦和暦表(1110,天仁,3,[]). 西暦和暦表(1110,天永,1,[]). 西暦和暦表(1111,天永,2,[]). 西暦和暦表(1112,天永,3,[]). 西暦和暦表(1113,天永,4,[]). 西暦和暦表(1113,永久,1,[]). 西暦和暦表(1114,永久,2,[]). 西暦和暦表(1115,永久,3,[]). 西暦和暦表(1116,永久,4,[]). 西暦和暦表(1117,永久,5,[]). 西暦和暦表(1118,永久,6,[]). 西暦和暦表(1118,元永,1,[]). 西暦和暦表(1119,元永,2,[]). 西暦和暦表(1120,元永,3,[]). 西暦和暦表(1120,保安,1,[]). 西暦和暦表(1121,保安,2,[]). 西暦和暦表(1122,保安,3,[]). 西暦和暦表(1123,保安,4,[]). 西暦和暦表(1124,保安,5,[]). 西暦和暦表(1124,天治,1,[]). 西暦和暦表(1125,天治,2,[]). 西暦和暦表(1126,天治,3,[]). 西暦和暦表(1126,大治,1,[]). 西暦和暦表(1127,大治,2,[]). 西暦和暦表(1128,大治,3,[]). 西暦和暦表(1129,大治,4,[]). 西暦和暦表(1130,大治,5,[]). 西暦和暦表(1131,大治,6,[]). 西暦和暦表(1131,天承,1,[]). 西暦和暦表(1132,天承,2,[]). 西暦和暦表(1132,長承,1,[]). 西暦和暦表(1133,長承,2,[]). 西暦和暦表(1134,長承,3,[]). 西暦和暦表(1135,長承,4,[]). 西暦和暦表(1135,保延,1,[]). 西暦和暦表(1136,保延,2,[]). 西暦和暦表(1137,保延,3,[]). 西暦和暦表(1138,保延,4,[]). 西暦和暦表(1139,保延,5,[]). 西暦和暦表(1140,保延,6,[]). 西暦和暦表(1141,保延,7,[]). 西暦和暦表(1141,永治,1,[]). 西暦和暦表(1142,永治,2,[]). 西暦和暦表(1142,康治,1,[]). 西暦和暦表(1143,康治,2,[]). 西暦和暦表(1144,康治,3,[]). 西暦和暦表(1144,天養,1,2 / 23). 西暦和暦表(1145,天養,2,[]). 西暦和暦表(1145,久安,1,7 / 22). 西暦和暦表(1146,久安,2,[]). 西暦和暦表(1147,久安,3,[]). 西暦和暦表(1148,久安,4,[]). 西暦和暦表(1149,久安,5,[]). 西暦和暦表(1150,久安,6,[]). 西暦和暦表(1151,久安,7,[]). 西暦和暦表(1151,仁平,1,1 / 26). 西暦和暦表(1152,仁平,2,[]). 西暦和暦表(1153,仁平,3,[]). 西暦和暦表(1154,仁平,4,[]). 西暦和暦表(1154,久寿,1,10 / 28). 西暦和暦表(1155,久寿,2,[]). 西暦和暦表(1156,久寿,3,[]). 西暦和暦表(1156,保元,1,4 / 27). 西暦和暦表(1157,保元,2,[]). 西暦和暦表(1158,保元,3,[]). 西暦和暦表(1159,保元,4,[]). 西暦和暦表(1159,平治,1,4 / 20). 西暦和暦表(1160,平治,2,[]). 西暦和暦表(1160,永暦,1,1 / 10). 西暦和暦表(1161,永暦,2,[]). 西暦和暦表(1161,応保,1,9 / 4). 西暦和暦表(1162,応保,2,[]). 西暦和暦表(1163,応保,3,[]). 西暦和暦表(1163,長寛,1,3 / 29). 西暦和暦表(1164,長寛,2,[]). 西暦和暦表(1165,長寛,3,[]). 西暦和暦表(1165,永万,1,6 / 5). 西暦和暦表(1166,永万,2,[]). 西暦和暦表(1166,仁安,1,8 / 27). 西暦和暦表(1167,仁安,2,[]). 西暦和暦表(1168,仁安,3,[]). 西暦和暦表(1169,仁安,4,[]). 西暦和暦表(1169,嘉応,1,4 / 8). 西暦和暦表(1170,嘉応,2,[]). 西暦和暦表(1171,嘉応,3,[]). 西暦和暦表(1171,承安,1,4 / 21). 西暦和暦表(1172,承安,2,[]). 西暦和暦表(1173,承安,3,[]). 西暦和暦表(1174,承安,4,[]). 西暦和暦表(1175,承安,5,[]). 西暦和暦表(1175,安元,1,7 / 28). 西暦和暦表(1176,安元,2,[]). 西暦和暦表(1177,安元,3,[]). 西暦和暦表(1177,治承,1,8 / 4). 西暦和暦表(1178,治承,2,[]). 西暦和暦表(1179,治承,3,[]). 西暦和暦表(1180,治承,4,[]). 西暦和暦表(1181,治承,5,[]). 西暦和暦表(1181,養和,1,7 / 14). 西暦和暦表(1182,養和,2,[]). 西暦和暦表(1182,寿永,1,5 / 27). 西暦和暦表(1183,寿永,2,[]). 西暦和暦表(1184,寿永,3,[]). 西暦和暦表(1185,寿永,4,[]). 西暦和暦表(1185,文治,1,8 / 14). 西暦和暦表(1186,文治,2,[]). 西暦和暦表(1187,文治,3,[]). 西暦和暦表(1188,文治,4,[]). 西暦和暦表(1189,文治,5,[]). 西暦和暦表(1190,文治,6,[]). 西暦和暦表(1190,建久,1,4 / 11). 西暦和暦表(1191,建久,2,[]). 西暦和暦表(1192,建久,3,[]). 西暦和暦表(1193,建久,4,[]). 西暦和暦表(1194,建久,5,[]). 西暦和暦表(1195,建久,6,[]). 西暦和暦表(1196,建久,7,[]). 西暦和暦表(1197,建久,8,[]). 西暦和暦表(1198,建久,9,[]). 西暦和暦表(1199,建久,10,[]). 西暦和暦表(1199,正治,1,4 / 27). 西暦和暦表(1200,正治,2,[]). 西暦和暦表(1201,正治,3,[]). 西暦和暦表(1201,建仁,1,2 / 13). 西暦和暦表(1202,建仁,2,[]). 西暦和暦表(1203,建仁,3,[]). 西暦和暦表(1204,建仁,4,[]). 西暦和暦表(1204,元久,1,2 / 20). 西暦和暦表(1205,元久,2,[]). 西暦和暦表(1206,元久,3,[]). 西暦和暦表(1206,建永,1,4 / 27). 西暦和暦表(1207,建永,2,[]). 西暦和暦表(1207,承元,1,10 / 25). 西暦和暦表(1208,承元,2,[]). 西暦和暦表(1209,承元,3,[]). 西暦和暦表(1210,承元,4,[]). 西暦和暦表(1211,承元,5,[]). 西暦和暦表(1211,建暦,1,3 / 9). 西暦和暦表(1212,建暦,2,[]). 西暦和暦表(1213,建暦,3,[]). 西暦和暦表(1213,建保,1,12 / 6). 西暦和暦表(1214,建保,2,[]). 西暦和暦表(1215,建保,3,[]). 西暦和暦表(1216,建保,4,[]). 西暦和暦表(1217,建保,5,[]). 西暦和暦表(1218,建保,6,[]). 西暦和暦表(1219,建保,7,[]). 西暦和暦表(1219,承久,1,4 / 12). 西暦和暦表(1220,承久,2,[]). 西暦和暦表(1221,承久,3,[]). 西暦和暦表(1222,承久,4,[]). 西暦和暦表(1222,貞応,1,4 / 13). 西暦和暦表(1223,貞応,2,[]). 西暦和暦表(1224,貞応,3,[]). 西暦和暦表(1224,元仁,1,11 / 20). 西暦和暦表(1225,元仁,2,[]). 西暦和暦表(1225,嘉祿,1,4 / 20). 西暦和暦表(1226,嘉祿,2,[]). 西暦和暦表(1227,嘉祿,3,[]). 西暦和暦表(1227,安貞,1,12 / 10). 西暦和暦表(1228,安貞,2,[]). 西暦和暦表(1229,安貞,3,[]). 西暦和暦表(1229,寛喜,1,3 / 5). 西暦和暦表(1230,寛喜,2,[]). 西暦和暦表(1231,寛喜,3,[]). 西暦和暦表(1232,寛喜,4,[]). 西暦和暦表(1232,貞永,1,4 / 2). 西暦和暦表(1233,貞永,2,[]). 西暦和暦表(1233,天福,1,4 / 15). 西暦和暦表(1234,天福,2,[]). 西暦和暦表(1234,文暦,1,11 / 5). 西暦和暦表(1235,文暦,2,[]). 西暦和暦表(1235,嘉禎,1,9 / 19). 西暦和暦表(1236,嘉禎,2,[]). 西暦和暦表(1237,嘉禎,3,[]). 西暦和暦表(1238,嘉禎,4,[]). 西暦和暦表(1238,暦仁,1,11 / 23). 西暦和暦表(1239,暦仁,2,[]). 西暦和暦表(1239,延応,1,2 / 7). 西暦和暦表(1240,延応,2,[]). 西暦和暦表(1240,仁治,1,7 / 16). 西暦和暦表(1241,仁治,2,[]). 西暦和暦表(1242,仁治,3,[]). 西暦和暦表(1243,仁治,4,[]). 西暦和暦表(1243,寛元,1,2 / 26). 西暦和暦表(1244,寛元,2,[]). 西暦和暦表(1245,寛元,3,[]). 西暦和暦表(1246,寛元,4,[]). 西暦和暦表(1247,寛元,5,[]). 西暦和暦表(1247,宝治,1,2 / 28). 西暦和暦表(1248,宝治,2,[]). 西暦和暦表(1249,宝治,3,[]). 西暦和暦表(1249,建長,1,3 / 18). 西暦和暦表(1250,建長,2,[]). 西暦和暦表(1251,建長,3,[]). 西暦和暦表(1252,建長,4,[]). 西暦和暦表(1253,建長,5,[]). 西暦和暦表(1254,建長,6,[]). 西暦和暦表(1255,建長,7,[]). 西暦和暦表(1256,建長,8,[]). 西暦和暦表(1256,康元,1,10 / 5). 西暦和暦表(1257,康元,2,[]). 西暦和暦表(1257,正嘉,1,3 / 14). 西暦和暦表(1258,正嘉,2,[]). 西暦和暦表(1259,正嘉,3,[]). 西暦和暦表(1259,正元,1,3 / 26). 西暦和暦表(1260,正元,2,[]). 西暦和暦表(1260,文応,1,4 / 23). 西暦和暦表(1261,文応,2,[]). 西暦和暦表(1261,弘長,1,2 / 20). 西暦和暦表(1262,弘長,2,[]). 西暦和暦表(1263,弘長,3,[]). 西暦和暦表(1264,弘長,4,[]). 西暦和暦表(1264,文永,1,2 / 28). 西暦和暦表(1265,文永,2,[]). 西暦和暦表(1266,文永,3,[]). 西暦和暦表(1267,文永,4,[]). 西暦和暦表(1268,文永,5,[]). 西暦和暦表(1269,文永,6,[]). 西暦和暦表(1270,文永,7,[]). 西暦和暦表(1271,文永,8,[]). 西暦和暦表(1272,文永,9,[]). 西暦和暦表(1273,文永,10,[]). 西暦和暦表(1274,文永,11,[]). 西暦和暦表(1275,文永,12,[]). 西暦和暦表(1275,建治,1,4 / 25). 西暦和暦表(1276,建治,2,[]). 西暦和暦表(1277,建治,3,[]). 西暦和暦表(1278,建治,4,[]). 西暦和暦表(1278,弘安,1,2 / 29). 西暦和暦表(1279,弘安,2,[]). 西暦和暦表(1280,弘安,3,[]). 西暦和暦表(1281,弘安,4,[]). 西暦和暦表(1282,弘安,5,[]). 西暦和暦表(1283,弘安,6,[]). 西暦和暦表(1284,弘安,7,[]). 西暦和暦表(1285,弘安,8,[]). 西暦和暦表(1286,弘安,9,[]). 西暦和暦表(1287,弘安,10,[]). 西暦和暦表(1288,弘安,11,[]). 西暦和暦表(1288,正応,1,4 / 28). 西暦和暦表(1289,正応,2,[]). 西暦和暦表(1290,正応,3,[]). 西暦和暦表(1291,正応,4,[]). 西暦和暦表(1292,正応,5,[]). 西暦和暦表(1293,正応,6,[]). 西暦和暦表(1293,永仁,1,8 / 5). 西暦和暦表(1294,永仁,2,[]). 西暦和暦表(1295,永仁,3,[]). 西暦和暦表(1296,永仁,4,[]). 西暦和暦表(1297,永仁,5,[]). 西暦和暦表(1298,永仁,6,[]). 西暦和暦表(1299,永仁,7,[]). 西暦和暦表(1299,正安,1,4 / 25). 西暦和暦表(1300,正安,2,[]). 西暦和暦表(1301,正安,3,[]). 西暦和暦表(1302,正安,4,[]). 西暦和暦表(1302,乾元,1,11 / 21). 西暦和暦表(1303,乾元,2,[]). 西暦和暦表(1303,嘉元,1,8 / 5). 西暦和暦表(1304,嘉元,2,[]). 西暦和暦表(1305,嘉元,3,[]). 西暦和暦表(1306,嘉元,4,[]). 西暦和暦表(1306,徳治,1,12 / 14). 西暦和暦表(1307,徳治,2,[]). 西暦和暦表(1308,徳治,3,[]). 西暦和暦表(1308,延慶,1,10 / 9). 西暦和暦表(1309,延慶,2,[]). 西暦和暦表(1310,延慶,3,[]). 西暦和暦表(1311,延慶,4,[]). 西暦和暦表(1311,応長,1,4 / 28). 西暦和暦表(1312,応長,2,[]). 西暦和暦表(1312,正和,1,3 / 20). 西暦和暦表(1313,正和,2,[]). 西暦和暦表(1314,正和,3,[]). 西暦和暦表(1315,正和,4,[]). 西暦和暦表(1316,正和,5,[]). 西暦和暦表(1317,正和,6,[]). 西暦和暦表(1317,文保,1,2 / 3). 西暦和暦表(1318,文保,2,[]). 西暦和暦表(1319,文保,3,[]). 西暦和暦表(1319,元応,1,4 / 28). 西暦和暦表(1320,元応,2,[]). 西暦和暦表(1321,元応,3,[]). 西暦和暦表(1321,元亨,1,2 / 23). 西暦和暦表(1322,元亨,2,[]). 西暦和暦表(1323,元亨,3,[]). 西暦和暦表(1324,元亨,4,[]). 西暦和暦表(1324,正中,1,12 / 9). 西暦和暦表(1325,正中,2,[]). 西暦和暦表(1326,正中,3,[]). 西暦和暦表(1326,嘉暦,1,4 / 26). 西暦和暦表(1327,嘉暦,2,[]). 西暦和暦表(1328,嘉暦,3,[]). 西暦和暦表(1329,嘉暦,4,[]). 西暦和暦表(1329,元徳,1,8 / 29). 西暦和暦表(1330,元徳,2,[]). 西暦和暦表(1331,元徳,3,[]). 西暦和暦表(1331,元弘,1,8 / 9). 西暦和暦表(1332,元弘,2,[]). 西暦和暦表(1332,正慶,1,4 / 28). 西暦和暦表(1333,正慶,2,[]). 西暦和暦表(1334,正慶,3,[]). 西暦和暦表(1334,建武,1,1 / 29). 西暦和暦表(1335,建武,2,[]). 西暦和暦表(1336,建武,3,[]). 西暦和暦表(1337,建武,4,[]). 西暦和暦表(1338,建武,5,[]). 西暦和暦表(1338,暦応,1,8 / 28). 西暦和暦表(1339,暦応,2,[]). 西暦和暦表(1340,暦応,3,[]). 西暦和暦表(1341,暦応,4,[]). 西暦和暦表(1342,暦応,5,[]). 西暦和暦表(1342,康永,1,4 / 27). 西暦和暦表(1343,康永,2,[]). 西暦和暦表(1344,康永,3,[]). 西暦和暦表(1345,康永,4,[]). 西暦和暦表(1345,貞和,1,10 / 21). 西暦和暦表(1346,貞和,2,[]). 西暦和暦表(1347,貞和,3,[]). 西暦和暦表(1348,貞和,4,[]). 西暦和暦表(1349,貞和,5,[]). 西暦和暦表(1350,貞和,6,[]). 西暦和暦表(1350,観応,1,2 / 27). 西暦和暦表(1351,観応,2,[]). 西暦和暦表(1352,観応,3,[]). 西暦和暦表(1352,文和,1,9 / 27). 西暦和暦表(1353,文和,2,[]). 西暦和暦表(1354,文和,3,[]). 西暦和暦表(1355,文和,4,[]). 西暦和暦表(1356,文和,5,[]). 西暦和暦表(1356,延文,1,3 / 28). 西暦和暦表(1357,延文,2,[]). 西暦和暦表(1358,延文,3,[]). 西暦和暦表(1359,延文,4,[]). 西暦和暦表(1360,延文,5,[]). 西暦和暦表(1361,延文,6,[]). 西暦和暦表(1361,康安,1,3 / 29). 西暦和暦表(1362,康安,2,[]). 西暦和暦表(1362,貞治,1,9 / 23). 西暦和暦表(1363,貞治,2,[]). 西暦和暦表(1364,貞治,3,[]). 西暦和暦表(1365,貞治,4,[]). 西暦和暦表(1366,貞治,5,[]). 西暦和暦表(1367,貞治,6,[]). 西暦和暦表(1368,貞治,7,[]). 西暦和暦表(1368,応安,1,2 / 18). 西暦和暦表(1369,応安,2,[]). 西暦和暦表(1370,応安,3,[]). 西暦和暦表(1371,応安,4,[]). 西暦和暦表(1372,応安,5,[]). 西暦和暦表(1373,応安,6,[]). 西暦和暦表(1374,応安,7,[]). 西暦和暦表(1375,応安,8,[]). 西暦和暦表(1375,永和,1,5 / 27). 西暦和暦表(1376,永和,2,[]). 西暦和暦表(1377,永和,3,[]). 西暦和暦表(1378,永和,4,[]). 西暦和暦表(1379,永和,5,[]). 西暦和暦表(1379,康暦,1,3 / 22). 西暦和暦表(1380,康暦,2,[]). 西暦和暦表(1381,康暦,3,[]). 西暦和暦表(1381,永徳,1,2 / 10). 西暦和暦表(1382,永徳,2,[]). 西暦和暦表(1383,永徳,3,[]). 西暦和暦表(1384,永徳,4,[]). 西暦和暦表(1384,至徳,1,4 / 28). 西暦和暦表(1385,至徳,2,[]). 西暦和暦表(1386,至徳,3,[]). 西暦和暦表(1387,至徳,4,[]). 西暦和暦表(1387,嘉慶,1,8 / 23). 西暦和暦表(1388,嘉慶,2,[]). 西暦和暦表(1389,嘉慶,3,[]). 西暦和暦表(1389,康応,1,2 / 9). 西暦和暦表(1390,康応,2,[]). 西暦和暦表(1390,明徳,1,3 / 26). 西暦和暦表(1391,明徳,2,[]). 西暦和暦表(1392,明徳,3,[]). 西暦和暦表(1393,明徳,4,[]). 西暦和暦表(1394,明徳,5,[]). 西暦和暦表(1394,応永,1,7 / 5). 西暦和暦表(1395,応永,2,[]). 西暦和暦表(1396,応永,3,[]). 西暦和暦表(1397,応永,4,[]). 西暦和暦表(1398,応永,5,[]). 西暦和暦表(1399,応永,6,[]). 西暦和暦表(1400,応永,7,[]). 西暦和暦表(1401,応永,8,[]). 西暦和暦表(1402,応永,9,[]). 西暦和暦表(1403,応永,10,[]). 西暦和暦表(1404,応永,11,[]). 西暦和暦表(1405,応永,12,[]). 西暦和暦表(1406,応永,13,[]). 西暦和暦表(1407,応永,14,[]). 西暦和暦表(1408,応永,15,[]). 西暦和暦表(1409,応永,16,[]). 西暦和暦表(1410,応永,17,[]). 西暦和暦表(1411,応永,18,[]). 西暦和暦表(1412,応永,19,[]). 西暦和暦表(1413,応永,20,[]). 西暦和暦表(1414,応永,21,[]). 西暦和暦表(1415,応永,22,[]). 西暦和暦表(1416,応永,23,[]). 西暦和暦表(1417,応永,24,[]). 西暦和暦表(1418,応永,25,[]). 西暦和暦表(1419,応永,26,[]). 西暦和暦表(1420,応永,27,[]). 西暦和暦表(1421,応永,28,[]). 西暦和暦表(1422,応永,29,[]). 西暦和暦表(1423,応永,30,[]). 西暦和暦表(1424,応永,31,[]). 西暦和暦表(1425,応永,32,[]). 西暦和暦表(1426,応永,33,[]). 西暦和暦表(1427,応永,34,[]). 西暦和暦表(1428,応永,35,[]). 西暦和暦表(1428,正長,1,4 / 27). 西暦和暦表(1429,正長,2,[]). 西暦和暦表(1429,永享,1,9 / 5). 西暦和暦表(1430,永享,2,[]). 西暦和暦表(1431,永享,3,[]). 西暦和暦表(1432,永享,4,[]). 西暦和暦表(1433,永享,5,[]). 西暦和暦表(1434,永享,6,[]). 西暦和暦表(1435,永享,7,[]). 西暦和暦表(1436,永享,8,[]). 西暦和暦表(1437,永享,9,[]). 西暦和暦表(1438,永享,10,[]). 西暦和暦表(1439,永享,11,[]). 西暦和暦表(1440,永享,12,[]). 西暦和暦表(1441,永享,13,[]). 西暦和暦表(1441,嘉吉,1,2 / 17). 西暦和暦表(1442,嘉吉,2,[]). 西暦和暦表(1443,嘉吉,3,[]). 西暦和暦表(1444,嘉吉,4,[]). 西暦和暦表(1444,文安,1,2 / 5). 西暦和暦表(1445,文安,2,[]). 西暦和暦表(1446,文安,3,[]). 西暦和暦表(1447,文安,4,[]). 西暦和暦表(1448,文安,5,[]). 西暦和暦表(1449,文安,6,[]). 西暦和暦表(1449,宝徳,1,7 / 28). 西暦和暦表(1450,宝徳,2,[]). 西暦和暦表(1451,宝徳,3,[]). 西暦和暦表(1452,宝徳,4,[]). 西暦和暦表(1452,享徳,1,7 / 25). 西暦和暦表(1453,享徳,2,[]). 西暦和暦表(1454,享徳,3,[]). 西暦和暦表(1455,享徳,4,[]). 西暦和暦表(1455,康正,1,7 / 25). 西暦和暦表(1456,康正,2,[]). 西暦和暦表(1457,康正,3,[]). 西暦和暦表(1457,長祿,1,9 / 28). 西暦和暦表(1458,長祿,2,[]). 西暦和暦表(1459,長祿,3,[]). 西暦和暦表(1460,長祿,4,[]). 西暦和暦表(1460,寛正,1,12 / 21). 西暦和暦表(1461,寛正,2,[]). 西暦和暦表(1462,寛正,3,[]). 西暦和暦表(1463,寛正,4,[]). 西暦和暦表(1464,寛正,5,[]). 西暦和暦表(1465,寛正,6,[]). 西暦和暦表(1466,寛正,7,[]). 西暦和暦表(1466,文正,1,2 / 28). 西暦和暦表(1467,文正,2,[]). 西暦和暦表(1467,応仁,1,3 / 5). 西暦和暦表(1468,応仁,2,[]). 西暦和暦表(1469,応仁,3,[]). 西暦和暦表(1469,文明,1,4 / 28). 西暦和暦表(1470,文明,2,[]). 西暦和暦表(1471,文明,3,[]). 西暦和暦表(1472,文明,4,[]). 西暦和暦表(1473,文明,5,[]). 西暦和暦表(1474,文明,6,[]). 西暦和暦表(1475,文明,7,[]). 西暦和暦表(1476,文明,8,[]). 西暦和暦表(1477,文明,9,[]). 西暦和暦表(1478,文明,10,[]). 西暦和暦表(1479,文明,11,[]). 西暦和暦表(1480,文明,12,[]). 西暦和暦表(1481,文明,13,[]). 西暦和暦表(1482,文明,14,[]). 西暦和暦表(1483,文明,15,[]). 西暦和暦表(1484,文明,16,[]). 西暦和暦表(1485,文明,17,[]). 西暦和暦表(1486,文明,18,[]). 西暦和暦表(1487,文明,19,[]). 西暦和暦表(1487,長享,1,7 / 20). 西暦和暦表(1488,長享,2,[]). 西暦和暦表(1489,長享,3,[]). 西暦和暦表(1489,延徳,1,8 / 21). 西暦和暦表(1490,延徳,2,[]). 西暦和暦表(1491,延徳,3,[]). 西暦和暦表(1492,延徳,4,[]). 西暦和暦表(1492,明応,1,7 / 19). 西暦和暦表(1493,明応,2,[]). 西暦和暦表(1494,明応,3,[]). 西暦和暦表(1495,明応,4,[]). 西暦和暦表(1496,明応,5,[]). 西暦和暦表(1497,明応,6,[]). 西暦和暦表(1498,明応,7,[]). 西暦和暦表(1499,明応,8,[]). 西暦和暦表(1500,明応,9,[]). 西暦和暦表(1501,明応,10,[]). 西暦和暦表(1501,文龜,1,2 / 29). 西暦和暦表(1502,文龜,2,[]). 西暦和暦表(1503,文龜,3,[]). 西暦和暦表(1504,文龜,4,[]). 西暦和暦表(1504,永正,1,2 / 30). 西暦和暦表(1505,永正,2,[]). 西暦和暦表(1506,永正,3,[]). 西暦和暦表(1507,永正,4,[]). 西暦和暦表(1508,永正,5,[]). 西暦和暦表(1509,永正,6,[]). 西暦和暦表(1510,永正,7,[]). 西暦和暦表(1511,永正,8,[]). 西暦和暦表(1512,永正,9,[]). 西暦和暦表(1513,永正,10,[]). 西暦和暦表(1514,永正,11,[]). 西暦和暦表(1515,永正,12,[]). 西暦和暦表(1516,永正,13,[]). 西暦和暦表(1517,永正,14,[]). 西暦和暦表(1518,永正,15,[]). 西暦和暦表(1519,永正,16,[]). 西暦和暦表(1520,永正,17,[]). 西暦和暦表(1521,永正,18,[]). 西暦和暦表(1521,大永,1,8 / 23). 西暦和暦表(1522,大永,2,[]). 西暦和暦表(1523,大永,3,[]). 西暦和暦表(1524,大永,4,[]). 西暦和暦表(1525,大永,5,[]). 西暦和暦表(1526,大永,6,[]). 西暦和暦表(1527,大永,7,[]). 西暦和暦表(1528,大永,8,[]). 西暦和暦表(1528,享祿,1,8 / 20). 西暦和暦表(1529,享祿,2,[]). 西暦和暦表(1530,享祿,3,[]). 西暦和暦表(1531,享祿,4,[]). 西暦和暦表(1532,享祿,5,[]). 西暦和暦表(1532,天文,1,7 / 29). 西暦和暦表(1533,天文,2,[]). 西暦和暦表(1534,天文,3,[]). 西暦和暦表(1535,天文,4,[]). 西暦和暦表(1536,天文,5,[]). 西暦和暦表(1537,天文,6,[]). 西暦和暦表(1538,天文,7,[]). 西暦和暦表(1539,天文,8,[]). 西暦和暦表(1540,天文,9,[]). 西暦和暦表(1541,天文,10,[]). 西暦和暦表(1542,天文,11,[]). 西暦和暦表(1543,天文,12,[]). 西暦和暦表(1544,天文,13,[]). 西暦和暦表(1545,天文,14,[]). 西暦和暦表(1546,天文,15,[]). 西暦和暦表(1547,天文,16,[]). 西暦和暦表(1548,天文,17,[]). 西暦和暦表(1549,天文,18,[]). 西暦和暦表(1550,天文,19,[]). 西暦和暦表(1551,天文,20,[]). 西暦和暦表(1552,天文,21,[]). 西暦和暦表(1553,天文,22,[]). 西暦和暦表(1554,天文,23,[]). 西暦和暦表(1555,天文,24,[]). 西暦和暦表(1555,弘治,1,10 / 23). 西暦和暦表(1556,弘治,2,[]). 西暦和暦表(1557,弘治,3,[]). 西暦和暦表(1558,弘治,4,[]). 西暦和暦表(1558,永祿,1,2 / 28). 西暦和暦表(1559,永祿,2,[]). 西暦和暦表(1560,永祿,3,[]). 西暦和暦表(1561,永祿,4,[]). 西暦和暦表(1562,永祿,5,[]). 西暦和暦表(1563,永祿,6,[]). 西暦和暦表(1564,永禄,7,[]). 西暦和暦表(1565,永禄,8,[]). 西暦和暦表(1566,永禄,9,[]). 西暦和暦表(1567,永禄,10,[]). 西暦和暦表(1568,永禄,11,[]). 西暦和暦表(1569,永禄,12,[]). 西暦和暦表(1570,永禄,13,[]). 西暦和暦表(1570,元龜,1,4 / 23). 西暦和暦表(1571,元龜,2,[]). 西暦和暦表(1572,元龜,3,[]). 西暦和暦表(1573,元龜,4,[]). 西暦和暦表(1573,天正,1,7 / 28). 西暦和暦表(1574,天正,2,[]). 西暦和暦表(1575,天正,3,[]). 西暦和暦表(1576,天正,4,[]). 西暦和暦表(1577,天正,5,[]). 西暦和暦表(1578,天正,6,[]). 西暦和暦表(1579,天正,7,[]). 西暦和暦表(1580,天正,8,[]). 西暦和暦表(1581,天正,9,[]). 西暦和暦表(1582,天正,10,[]). 西暦和暦表(1583,天正,11,[]). 西暦和暦表(1584,天正,12,[]). 西暦和暦表(1585,天正,13,[]). 西暦和暦表(1586,天正,14,[]). 西暦和暦表(1587,天正,15,[]). 西暦和暦表(1588,天正,16,[]). 西暦和暦表(1589,天正,17,[]). 西暦和暦表(1590,天正,18,[]). 西暦和暦表(1591,天正,19,[]). 西暦和暦表(1592,天正,20,[]). 西暦和暦表(1592,文禄,1,12 / 8). 西暦和暦表(1593,文禄,2,[]). 西暦和暦表(1594,文禄,3,[]). 西暦和暦表(1595,文禄,4,[]). 西暦和暦表(1596,文禄,5,[]). 西暦和暦表(1596,慶長,1,10 / 27). 西暦和暦表(1597,慶長,2,[]). 西暦和暦表(1598,慶長,3,[]). 西暦和暦表(1599,慶長,4,[]). 西暦和暦表(1600,慶長,5,[]). 西暦和暦表(1601,慶長,6,[]). 西暦和暦表(1602,慶長,7,[]). 西暦和暦表(1603,慶長,8,[]). 西暦和暦表(1604,慶長,9,[]). 西暦和暦表(1605,慶長,10,[]). 西暦和暦表(1606,慶長,11,[]). 西暦和暦表(1607,慶長,12,[]). 西暦和暦表(1608,慶長,13,[]). 西暦和暦表(1609,慶長,14,[]). 西暦和暦表(1610,慶長,15,[]). 西暦和暦表(1611,慶長,16,[]). 西暦和暦表(1612,慶長,17,[]). 西暦和暦表(1613,慶長,18,[]). 西暦和暦表(1614,慶長,19,[]). 西暦和暦表(1615,慶長,20,[]). 西暦和暦表(1615,元和,1,7 / 13). 西暦和暦表(1616,元和,2,[]). 西暦和暦表(1617,元和,3,[]). 西暦和暦表(1618,元和,4,[]). 西暦和暦表(1619,元和,5,[]). 西暦和暦表(1620,元和,6,[]). 西暦和暦表(1621,元和,7,[]). 西暦和暦表(1622,元和,8,[]). 西暦和暦表(1623,元和,9,[]). 西暦和暦表(1624,元和,10,[]). 西暦和暦表(1624,寛永,1,2 / 30). 西暦和暦表(1625,寛永,2,[]). 西暦和暦表(1626,寛永,3,[]). 西暦和暦表(1627,寛永,4,[]). 西暦和暦表(1628,寛永,5,[]). 西暦和暦表(1629,寛永,6,[]). 西暦和暦表(1630,寛永,7,[]). 西暦和暦表(1631,寛永,8,[]). 西暦和暦表(1632,寛永,9,[]). 西暦和暦表(1633,寛永,10,[]). 西暦和暦表(1634,寛永,11,[]). 西暦和暦表(1635,寛永,12,[]). 西暦和暦表(1636,寛永,13,[]). 西暦和暦表(1637,寛永,14,[]). 西暦和暦表(1638,寛永,15,[]). 西暦和暦表(1639,寛永,16,[]). 西暦和暦表(1640,寛永,17,[]). 西暦和暦表(1641,寛永,18,[]). 西暦和暦表(1642,寛永,19,[]). 西暦和暦表(1643,寛永,20,[]). 西暦和暦表(1644,寛永,21,[]). 西暦和暦表(1644,正保,1,12 / 16). 西暦和暦表(1645,正保,2,[]). 西暦和暦表(1646,正保,3,[]). 西暦和暦表(1647,正保,4,[]). 西暦和暦表(1648,正保,5,[]). 西暦和暦表(1648,慶安,1,2 / 15). 西暦和暦表(1649,慶安,2,[]). 西暦和暦表(1650,慶安,3,[]). 西暦和暦表(1651,慶安,4,[]). 西暦和暦表(1652,慶安,5,[]). 西暦和暦表(1652,承応,1,9 / 18). 西暦和暦表(1653,承応,2,[]). 西暦和暦表(1654,承応,3,[]). 西暦和暦表(1655,承応,4,[]). 西暦和暦表(1655,明暦,1,4 / 13). 西暦和暦表(1656,明暦,2,[]). 西暦和暦表(1657,明暦,3,[]). 西暦和暦表(1658,明暦,4,[]). 西暦和暦表(1658,万治,1,7 / 23). 西暦和暦表(1659,万治,2,[]). 西暦和暦表(1660,万治,3,[]). 西暦和暦表(1661,万治,4,[]). 西暦和暦表(1661,寛文,1,4 / 25). 西暦和暦表(1662,寛文,2,[]). 西暦和暦表(1663,寛文,3,[]). 西暦和暦表(1664,寛文,4,[]). 西暦和暦表(1665,寛文,5,[]). 西暦和暦表(1666,寛文,6,[]). 西暦和暦表(1667,寛文,7,[]). 西暦和暦表(1668,寛文,8,[]). 西暦和暦表(1669,寛文,9,[]). 西暦和暦表(1670,寛文,10,[]). 西暦和暦表(1671,寛文,11,[]). 西暦和暦表(1672,寛文,12,[]). 西暦和暦表(1673,寛文,13,[]). 西暦和暦表(1673,延宝,1,9 / 21). 西暦和暦表(1674,延宝,2,[]). 西暦和暦表(1675,延宝,3,[]). 西暦和暦表(1676,延宝,4,[]). 西暦和暦表(1677,延宝,5,[]). 西暦和暦表(1678,延宝,6,[]). 西暦和暦表(1679,延宝,7,[]). 西暦和暦表(1680,延宝,8,[]). 西暦和暦表(1681,延宝,9,[]). 西暦和暦表(1681,天和,1,9 / 29). 西暦和暦表(1682,天和,2,[]). 西暦和暦表(1683,天和,3,[]). 西暦和暦表(1684,天和,4,[]). 西暦和暦表(1684,貞享,1,2 / 21). 西暦和暦表(1685,貞享,2,[]). 西暦和暦表(1686,貞享,3,[]). 西暦和暦表(1687,貞享,4,[]). 西暦和暦表(1688,貞享,5,[]). 西暦和暦表(1688,元禄,1,9 / 30). 西暦和暦表(1689,元禄,2,[]). 西暦和暦表(1690,元禄,3,[]). 西暦和暦表(1691,元禄,4,[]). 西暦和暦表(1692,元禄,5,[]). 西暦和暦表(1693,元禄,6,[]). 西暦和暦表(1694,元禄,7,[]). 西暦和暦表(1695,元禄,8,[]). 西暦和暦表(1696,元禄,9,[]). 西暦和暦表(1697,元禄,10,[]). 西暦和暦表(1698,元禄,11,[]). 西暦和暦表(1699,元禄,12,[]). 西暦和暦表(1700,元禄,13,[]). 西暦和暦表(1701,元禄,14,[]). 西暦和暦表(1702,元禄,15,[]). 西暦和暦表(1703,元禄,16,[]). 西暦和暦表(1704,元禄,17,[]). 西暦和暦表(1704,宝永,1,3 / 13). 西暦和暦表(1705,宝永,2,[]). 西暦和暦表(1706,宝永,3,[]). 西暦和暦表(1707,宝永,4,[]). 西暦和暦表(1708,宝永,5,[]). 西暦和暦表(1709,宝永,6,[]). 西暦和暦表(1710,宝永,7,[]). 西暦和暦表(1711,宝永,8,[]). 西暦和暦表(1711,正徳,1,4 / 25). 西暦和暦表(1712,正徳,2,[]). 西暦和暦表(1713,正徳,3,[]). 西暦和暦表(1714,正徳,4,[]). 西暦和暦表(1715,正徳,5,[]). 西暦和暦表(1716,正徳,6,[]). 西暦和暦表(1716,享保,1,6 / 22). 西暦和暦表(1717,享保,2,[]). 西暦和暦表(1718,享保,3,[]). 西暦和暦表(1719,享保,4,[]). 西暦和暦表(1720,享保,5,[]). 西暦和暦表(1721,享保,6,[]). 西暦和暦表(1722,享保,7,[]). 西暦和暦表(1723,享保,8,[]). 西暦和暦表(1724,享保,9,[]). 西暦和暦表(1725,享保,10,[]). 西暦和暦表(1726,享保,11,[]). 西暦和暦表(1727,享保,12,[]). 西暦和暦表(1728,享保,13,[]). 西暦和暦表(1729,享保,14,[]). 西暦和暦表(1730,享保,15,[]). 西暦和暦表(1731,享保,16,[]). 西暦和暦表(1732,享保,17,[]). 西暦和暦表(1733,享保,18,[]). 西暦和暦表(1734,享保,19,[]). 西暦和暦表(1735,享保,20,[]). 西暦和暦表(1736,享保,21,[]). 西暦和暦表(1736,元文,1,4 / 28). 西暦和暦表(1737,元文,2,[]). 西暦和暦表(1738,元文,3,[]). 西暦和暦表(1739,元文,4,[]). 西暦和暦表(1740,元文,5,[]). 西暦和暦表(1741,元文,6,[]). 西暦和暦表(1741,寛保,1,2 / 27). 西暦和暦表(1742,寛保,2,[]). 西暦和暦表(1743,寛保,3,[]). 西暦和暦表(1744,寛保,4,[]). 西暦和暦表(1744,延享,1,2 / 21). 西暦和暦表(1745,延享,2,[]). 西暦和暦表(1746,延享,3,[]). 西暦和暦表(1747,延享,4,[]). 西暦和暦表(1748,延享,5,[]). 西暦和暦表(1748,寛延,1,7 / 12). 西暦和暦表(1749,寛延,2,[]). 西暦和暦表(1750,寛延,3,[]). 西暦和暦表(1751,寛延,4,[]). 西暦和暦表(1751,宝暦,1,10 / 27). 西暦和暦表(1752,宝暦,2,[]). 西暦和暦表(1753,宝暦,3,[]). 西暦和暦表(1754,宝暦,4,[]). 西暦和暦表(1755,宝暦,5,[]). 西暦和暦表(1756,宝暦,6,[]). 西暦和暦表(1757,宝暦,7,[]). 西暦和暦表(1758,宝暦,8,[]). 西暦和暦表(1759,宝暦,9,[]). 西暦和暦表(1760,宝暦,10,[]). 西暦和暦表(1761,宝暦,11,[]). 西暦和暦表(1762,宝暦,12,[]). 西暦和暦表(1763,宝暦,13,[]). 西暦和暦表(1764,宝暦,14,[]). 西暦和暦表(1764,明和,1,6 / 2). 西暦和暦表(1765,明和,2,[]). 西暦和暦表(1766,明和,3,[]). 西暦和暦表(1767,明和,4,[]). 西暦和暦表(1768,明和,5,[]). 西暦和暦表(1769,明和,6,[]). 西暦和暦表(1770,明和,7,[]). 西暦和暦表(1771,明和,8,[]). 西暦和暦表(1772,明和,9,[]). 西暦和暦表(1772,安永,1,11 / 16). 西暦和暦表(1773,安永,2,[]). 西暦和暦表(1774,安永,3,[]). 西暦和暦表(1775,安永,4,[]). 西暦和暦表(1776,安永,5,[]). 西暦和暦表(1777,安永,6,[]). 西暦和暦表(1778,安永,7,[]). 西暦和暦表(1779,安永,8,[]). 西暦和暦表(1780,安永,9,[]). 西暦和暦表(1781,安永,10,[]). 西暦和暦表(1781,天明,1,4 / 2). 西暦和暦表(1782,天明,2,[]). 西暦和暦表(1783,天明,3,[]). 西暦和暦表(1784,天明,4,[]). 西暦和暦表(1785,天明,5,[]). 西暦和暦表(1786,天明,6,[]). 西暦和暦表(1787,天明,7,[]). 西暦和暦表(1788,天明,8,[]). 西暦和暦表(1789,天明,9,[]). 西暦和暦表(1789,寛政,1,1 / 25). 西暦和暦表(1790,寛政,2,[]). 西暦和暦表(1791,寛政,3,[]). 西暦和暦表(1792,寛政,4,[]). 西暦和暦表(1793,寛政,5,[]). 西暦和暦表(1794,寛政,6,[]). 西暦和暦表(1795,寛政,7,[]). 西暦和暦表(1796,寛政,8,[]). 西暦和暦表(1797,寛政,9,[]). 西暦和暦表(1798,寛政,10,[]). 西暦和暦表(1799,寛政,11,[]). 西暦和暦表(1800,寛政,12,[]). 西暦和暦表(1801,寛政,13,[]). 西暦和暦表(1801,享和,1,2 / 5). 西暦和暦表(1802,享和,2,[]). 西暦和暦表(1803,享和,3,[]). 西暦和暦表(1804,享和,4,[]). 西暦和暦表(1804,文化,1,2 / 11). 西暦和暦表(1805,文化,2,[]). 西暦和暦表(1806,文化,3,[]). 西暦和暦表(1807,文化,4,[]). 西暦和暦表(1808,文化,5,[]). 西暦和暦表(1809,文化,6,[]). 西暦和暦表(1810,文化,7,[]). 西暦和暦表(1811,文化,8,[]). 西暦和暦表(1812,文化,9,[]). 西暦和暦表(1813,文化,10,[]). 西暦和暦表(1814,文化,11,[]). 西暦和暦表(1815,文化,12,[]). 西暦和暦表(1816,文化,13,[]). 西暦和暦表(1817,文化,14,[]). 西暦和暦表(1818,文化,15,[]). 西暦和暦表(1818,文政,1,4 / 22). 西暦和暦表(1819,文政,2,[]). 西暦和暦表(1820,文政,3,[]). 西暦和暦表(1821,文政,4,[]). 西暦和暦表(1822,文政,5,[]). 西暦和暦表(1823,文政,6,[]). 西暦和暦表(1824,文政,7,[]). 西暦和暦表(1825,文政,8,[]). 西暦和暦表(1826,文政,9,[]). 西暦和暦表(1827,文政,10,[]). 西暦和暦表(1828,文政,11,[]). 西暦和暦表(1829,文政,12,[]). 西暦和暦表(1830,文政,13,[]). 西暦和暦表(1830,天保,1,12 / 1). 西暦和暦表(1831,天保,2,[]). 西暦和暦表(1832,天保,3,[]). 西暦和暦表(1833,天保,4,[]). 西暦和暦表(1834,天保,5,[]). 西暦和暦表(1835,天保,6,[]). 西暦和暦表(1836,天保,7,[]). 西暦和暦表(1837,天保,8,[]). 西暦和暦表(1838,天保,9,[]). 西暦和暦表(1839,天保,10,[]). 西暦和暦表(1840,天保,11,[]). 西暦和暦表(1841,天保,12,[]). 西暦和暦表(1842,天保,13,[]). 西暦和暦表(1843,天保,14,[]). 西暦和暦表(1844,天保,15,[]). 西暦和暦表(1844,弘化,1,12 / 2). 西暦和暦表(1845,弘化,2,[]). 西暦和暦表(1846,弘化,3,[]). 西暦和暦表(1847,弘化,4,[]). 西暦和暦表(1848,弘化,5,[]). 西暦和暦表(1848,嘉永,1,2 / 28). 西暦和暦表(1849,嘉永,2,[]). 西暦和暦表(1850,嘉永,3,[]). 西暦和暦表(1851,嘉永,4,[]). 西暦和暦表(1852,嘉永,5,[]). 西暦和暦表(1853,嘉永,6,[]). 西暦和暦表(1854,嘉永,7,[]). 西暦和暦表(1854,安政,1,11 / 27). 西暦和暦表(1855,安政,2,[]). 西暦和暦表(1856,安政,3,[]). 西暦和暦表(1857,安政,4,[]). 西暦和暦表(1858,安政,5,[]). 西暦和暦表(1859,安政,6,[]). 西暦和暦表(1860,安政,7,[]). 西暦和暦表(1860,万延,1,3 / 18). 西暦和暦表(1861,万延,2,[]). 西暦和暦表(1861,文久,1,2 / 19). 西暦和暦表(1862,文久,2,[]). 西暦和暦表(1863,文久,3,[]). 西暦和暦表(1864,文久,4,[]). 西暦和暦表(1864,元治,1,2 / 20). 西暦和暦表(1865,元治,2,[]). 西暦和暦表(1865,慶応,1,4 / 8). 西暦和暦表(1866,慶応,2,[]). 西暦和暦表(1867,慶応,3,[]). 西暦和暦表(1868,慶応,4,[]). 西暦和暦表(1868,明治,1,9 / 8). 西暦和暦表(1869,明治,2,[]). 西暦和暦表(1870,明治,3,[]). 西暦和暦表(1871,明治,4,[]). 西暦和暦表(1872,明治,5,[]). 西暦和暦表(1873,明治,6,[]). 西暦和暦表(1874,明治,7,[]). 西暦和暦表(1875,明治,8,[]). 西暦和暦表(1876,明治,9,[]). 西暦和暦表(1877,明治,10,[]). 西暦和暦表(1878,明治,11,[]). 西暦和暦表(1879,明治,12,[]). 西暦和暦表(1880,明治,13,[]). 西暦和暦表(1881,明治,14,[]). 西暦和暦表(1882,明治,15,[]). 西暦和暦表(1883,明治,16,[]). 西暦和暦表(1884,明治,17,[]). 西暦和暦表(1885,明治,18,[]). 西暦和暦表(1886,明治,19,[]). 西暦和暦表(1887,明治,20,[]). 西暦和暦表(1888,明治,21,[]). 西暦和暦表(1889,明治,22,[]). 西暦和暦表(1890,明治,23,[]). 西暦和暦表(1891,明治,24,[]). 西暦和暦表(1892,明治,25,[]). 西暦和暦表(1893,明治,26,[]). 西暦和暦表(1894,明治,27,[]). 西暦和暦表(1895,明治,28,[]). 西暦和暦表(1896,明治,29,[]). 西暦和暦表(1897,明治,30,[]). 西暦和暦表(1898,明治,31,[]). 西暦和暦表(1899,明治,32,[]). 西暦和暦表(1900,明治,33,[]). 西暦和暦表(1901,明治,34,[]). 西暦和暦表(1902,明治,35,[]). 西暦和暦表(1903,明治,36,[]). 西暦和暦表(1904,明治,37,[]). 西暦和暦表(1905,明治,38,[]). 西暦和暦表(1906,明治,39,[]). 西暦和暦表(1907,明治,40,[]). 西暦和暦表(1908,明治,41,[]). 西暦和暦表(1909,明治,42,[]). 西暦和暦表(1910,明治,43,[]). 西暦和暦表(1911,明治,44,[]). 西暦和暦表(1912,明治,45,[]). 西暦和暦表(1912,大正,1,7 / 30). 西暦和暦表(1913,大正,2,[]). 西暦和暦表(1914,大正,3,[]). 西暦和暦表(1915,大正,4,[]). 西暦和暦表(1916,大正,5,[]). 西暦和暦表(1917,大正,6,[]). 西暦和暦表(1918,大正,7,[]). 西暦和暦表(1919,大正,8,[]). 西暦和暦表(1920,大正,9,[]). 西暦和暦表(1921,大正,10,[]). 西暦和暦表(1922,大正,11,[]). 西暦和暦表(1923,大正,12,[]). 西暦和暦表(1924,大正,13,[]). 西暦和暦表(1925,大正,14,[]). 西暦和暦表(1926,大正,15,[]). 西暦和暦表(1926,昭和,1,12 / 25). 西暦和暦表(1927,昭和,2,[]). 西暦和暦表(1928,昭和,3,[]). 西暦和暦表(1929,昭和,4,[]). 西暦和暦表(1930,昭和,5,[]). 西暦和暦表(1931,昭和,6,[]). 西暦和暦表(1932,昭和,7,[]). 西暦和暦表(1933,昭和,8,[]). 西暦和暦表(1934,昭和,9,[]). 西暦和暦表(1935,昭和,10,[]). 西暦和暦表(1936,昭和,11,[]). 西暦和暦表(1937,昭和,12,[]). 西暦和暦表(1938,昭和,13,[]). 西暦和暦表(1939,昭和,14,[]). 西暦和暦表(1940,昭和,15,[]). 西暦和暦表(1941,昭和,16,[]). 西暦和暦表(1942,昭和,17,[]). 西暦和暦表(1943,昭和,18,[]). 西暦和暦表(1944,昭和,19,[]). 西暦和暦表(1945,昭和,20,[]). 西暦和暦表(1946,昭和,21,[]). 西暦和暦表(1947,昭和,22,[]). 西暦和暦表(1948,昭和,23,[]). 西暦和暦表(1949,昭和,24,[]). 西暦和暦表(1950,昭和,25,[]). 西暦和暦表(1951,昭和,26,[]). 西暦和暦表(1952,昭和,27,[]). 西暦和暦表(1953,昭和,28,[]). 西暦和暦表(1954,昭和,29,[]). 西暦和暦表(1955,昭和,30,[]). 西暦和暦表(1956,昭和,31,[]). 西暦和暦表(1957,昭和,32,[]). 西暦和暦表(1958,昭和,33,[]). 西暦和暦表(1959,昭和,34,[]). 西暦和暦表(1960,昭和,35,[]). 西暦和暦表(1961,昭和,36,[]). 西暦和暦表(1962,昭和,37,[]). 西暦和暦表(1963,昭和,38,[]). 西暦和暦表(1964,昭和,39,[]). 西暦和暦表(1965,昭和,40,[]). 西暦和暦表(1966,昭和,41,[]). 西暦和暦表(1967,昭和,42,[]). 西暦和暦表(1968,昭和,43,[]). 西暦和暦表(1969,昭和,44,[]). 西暦和暦表(1970,昭和,45,[]). 西暦和暦表(1971,昭和,46,[]). 西暦和暦表(1972,昭和,47,[]). 西暦和暦表(1973,昭和,48,[]). 西暦和暦表(1974,昭和,49,[]). 西暦和暦表(1975,昭和,50,[]). 西暦和暦表(1976,昭和,51,[]). 西暦和暦表(1977,昭和,52,[]). 西暦和暦表(1978,昭和,53,[]). 西暦和暦表(1979,昭和,54,[]). 西暦和暦表(1980,昭和,55,[]). 西暦和暦表(1981,昭和,56,[]). 西暦和暦表(1982,昭和,57,[]). 西暦和暦表(1983,昭和,58,[]). 西暦和暦表(1984,昭和,59,[]). 西暦和暦表(1985,昭和,60,[]). 西暦和暦表(1986,昭和,61,[]). 西暦和暦表(1987,昭和,62,[]). 西暦和暦表(1988,昭和,63,[]). 西暦和暦表(1989,昭和,64,[]). 西暦和暦表(1989,平成,1,1 / 7). 西暦和暦表(1990,平成,2,[]). 西暦和暦表(1991,平成,3,[]). 西暦和暦表(1992,平成,4,[]). 西暦和暦表(1993,平成,5,[]). 西暦和暦表(1994,平成,6,[]). 西暦和暦表(1995,平成,7,[]). 西暦和暦表(1996,平成,8,[]). 西暦和暦表(1997,平成,9,[]). 西暦和暦表(1998,平成,10,[]). 西暦和暦表(1999,平成,11,[]). 西暦和暦表(2000,平成,12,[]). 西暦和暦表(2001,平成,13,[]). 西暦和暦表(2002,平成,14,[]). 西暦和暦表(2003,平成,15,[]). 西暦和暦表(2004,平成,16,[]). 西暦和暦表(2005,平成,17,[]). 西暦和暦表(2006,平成,18,[]). 西暦和暦表(2007,平成,19,[]). 西暦和暦表(2008,平成,20,[]). 西暦和暦表(2009,平成,21,[]). 西暦和暦表(2010,平成,22,[]). 西暦和暦表(2011,平成,23,[]). 西暦和暦表(2012,平成,24,[]). 西暦和暦表(2013,平成,25,[]). 西暦和暦表(2014,平成,26,[]). '年漢字表現'(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,['六','十','九','年']). '元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日) :-   write('元号の頭文字,年,月,日 :'),   get_split_line([','],[_元号年の元号の頭文字,_年,_月,_日]). '元号年の元号の頭文字,年,月および日で表記された日付を入力させ,その年の元日からその日付までの日数を計算し,結果を表示する' :-   '元号年の元号の頭文字,年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日),   元号の頭文字をローマ字変換した時にの最初の文字(_元号,_元号年の元号の頭文字),   元年の西暦は(_元号,_元年の西暦年),   _西暦年 is _元年の西暦年 + _年 - 1,   その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数),   write_formatted('その年の元旦からの日数は%t日です。\n',[_日数]). その年の元日からその日付までの日数を計算する(_西暦年,_月,_日,_日数) :-   年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数),   _日数 is _前月末日までの日数 + _日. 年初から前月末日までの日数(_西暦年,_月,_前月末日までの日数) :-   N is _月 - 1,   findsum(_日数,(for(1,M,N),月の日数(_西暦年,_月,_日数)),_前月末日までの日数). 元号の頭文字をローマ字変換した時にの最初の文字(明治,m). 元号の頭文字をローマ字変換した時にの最初の文字(大正,t). 元号の頭文字をローマ字変換した時にの最初の文字(昭和,s). 元号の頭文字をローマ字変換した時にの最初の文字(平成,h). 元年の西暦は(明治,1868). 元年の西暦は(大正,1912). 元年の西暦は(大正,1926). 元年の西暦は(昭和,1989). 月の日数(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). 月の日数(_,_月,30) :- member(_月,[4,6,8,10]). 月の日数(_年,2,29) :- うるう年(_年). 月の日数(_年,2,28) :- \+(うるう年(_年)). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4),fail. 月別日数ならび(平年,[31,28,31,30,31,30,31,31,30,31,30,31]). 月別日数ならび(うるう年,[31,29,31,30,31,30,31,31,30,31,30,31]). うるう年回数(_起点西暦年,_終点西暦年,_うるう年回数) :- count((for(_起点西暦年,N,_終点西暦年),うるう年(N)),_うるう年回数). 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- うるう年(_年), 月別日数ならび(うるう年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- \+(うるう年(_年)), 月別日数ならび(平年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- うるう年(_年), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 366 - _元旦から何日 + 1. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- \+(うるう年(_年)), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 365 - _元旦から何日 + 1. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/688 # # <生徒テーブル> # 生徒ID, 生徒名称, クラスID, 好きな教科ID, # 1, 鈴木, A, 1 # 2, 田中, B, 1 # 3, 佐藤, c, 2 # # <教科テーブル> # 教科ID, 教科名称 # 1, 国語 # 2, 数学 # 3, 理化 # # <クラステーブル> # クラスID, クラス名称 # a, Aクラス # b, Bクラス # c, Cクラス # # 上記2つのテーブルから、 # 各教科でクラス毎に何人が好きな教科としているか以下のような形で取得します。 # # 教科, Aクラス内での人数, B〜, C〜, … # 国語, 1, 1, 0, … # 数学, 0, 0, 1, … # 理化, 0, 0, 0, … # 各教科でクラス毎に何人が好きな教科としているか(_好きな教科の人数一覧) :-    findall(_クラスID,クラステーブル(_クラスID,_),_クラスIDならび),    findall(_教科ID,教科テーブル(_教科ID,_),_教科IDならび),    findall([_教科ID_2,_クラスID_2,_人数],           ( member(_教科ID_2,_教科IDならび),            member(_クラスID_2,_クラスIDならび),            count(生徒テーブル(_,_,_クラスID_2,_教科ID_2),_人数)),        _好きな教科表一覧). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/613 # # <ユーザ情報テーブル> # ID,氏名,住所 # 1,ユーザ1,青森県〜〜〜 # 2,ユーザ2,青森県〜〜〜 # 3,ユーザ3,北海道〜〜〜 # 4,ユーザ4,宮城県〜〜〜 # 5,ユーザ5,岩手県〜〜〜 # ・・・ # <都道府県テーブル> # ID,都道府県 # 1,北海道 # 2,青森県 # 3,岩手県 # 4,宮城県 # 5,秋田県 # ・・・ # この2つのテーブルから、クエリを使用して、都道府県別のユーザ数を取得(カウント)したいのですが、教えていただけませんでしょうか? 上記の5レコードで説明しますと、以下のような結果が望みです。 # 都道府県,人数 # 北海道,1 # 青森県,2 # 岩手県,1 # 宮城県,1 # 秋田県,0 都道府県別のユーザ数一覧 :- write('都道府県,人数\n'), 都道府県別のユーザ数を取得(_都道府県,_人数), write_formatted('%t,%t\n',[_都道府県,_人数]), fail. 都道府県別のユーザ数一覧. 都道府県別のユーザ数を取得(_都道府県,_人数) :- 都道府県(_,_都道府県), count((ユーザ情報(_,_,住所),sub_atom(_住所,0,_,_,_都道府県)),_人数). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/521 # # 販売集計処理について教えてください。 # 商品テーブル # 商品名 販売本数 # ─── ──── # お菓子 # お弁当 # 飲み物 # # 販売履歴テーブル # 商品名 # ─── # 商品テーブルの各商品が、販売履歴テーブルに何件ずつあるかを集計し、 # 商品テーブルの販売本数に記録させたいと思っております(日次処理)。 販売履歴(飲み物). 販売履歴(お菓子). 販売履歴(お弁当). 販売履歴(お菓子). 販売履歴(お菓子). 販売履歴(飲み物). 販売履歴(お弁当). 販売履歴(お弁当). 販売集計処理 :-   一意な商品名ならびを得る(L),   商品テーブルに追加(L). 一意な商品名ならびを得る(L) :- setof(_商品名,販売履歴(_商品名),L). 商品テーブルに追加([]) :- !. 商品テーブルに追加([_商品名|R]) :-   count(販売履歴(_商品名),_販売本数),   assertz(商品(_商品名,_販売本数)),   商品テーブルに追加(R). 販売履歴(飲み物). % 以下のサイトは # 出典:: 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. ○県、市別に男女の人数をクロス集計する(_性別). % 以下のサイトは ヒストグラム(_サンプルならび) :-    for(0,N,9),    count(member(N,_サンプルならび),_度数),    length(L,_度数),    要素はすべてアスタリスクである(L),    concat_atom(L,_星表示アトム),    write_formatted('%t %t\n',[N,_星表示アトム]),    N=9. 要素はすべてアスタリスクである(L) :- all(L,'*'). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/148 # # [1] 授業単元: ゼミ演習でのプログラミング # [2] 問題文(含コード&リンク): ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10566.zip # # [1] ヒストグラム # 0〜9の範囲内の整数を20個入力し、そのヒストグラムを求めて出力するプログラムを書きなさい# # '0〜9の範囲内の整数を20個入力し、そのヒストグラムを求めて出力する' :- 0〜9の範囲内の整数を20個入力し(1,_サンプルならび), ヒストグラム(_サンプルならび). ヒストグラム(_サンプルならび) :- 最初に縦棒の限界数を決めよう(_サンプルならび,_限界数), '次に度数表示を*のならびで表現して、0-9のならびを取る'(_サンプルならび,_限界数,_度数表示ならび), 転置(_度数表示ならび,_転置した度数表示ならび), ヒストグラム表示(_転置した度数表示ならび). 最初に縦棒の限界数を決めよう(_サンプルならび,_限界数) :- findmax(U,count(member(U,_サンプルならび)),_限界数). '次に度数表示を*のならびで表現して、0-9のならびを取る'(_サンプルならび,_限界数,_度数表示ならび) :- findall(_度数表示, (for(0,N,9),count(member(N,_サンプルならび),_度数), '空白が先に来るように反転した*ならびの生成'(_度数,1,_限界数,[],_度数表示)), _度数表示ならび). '空白が先に来るように反転した*ならびの生成'(_,N,_限界数,X,X) :- N > _限界数,!. '空白が先に来るように反転した*ならびの生成'(_度数,N,_限界数,Y,X) :- N > _度数, N2 is N + 1, '空白が先に来るように反転した*ならびの生成'(_度数,N2,_限界数,[' '|Y],X). '空白が先に来るように反転した*ならびの生成'(_度数,N,_限界数,Y,X) :- N =< _度数, N2 is N + 1, '空白が先に来るように反転した*ならびの生成'(_度数,N2,_限界数,['*'|Y],X). ヒストグラム表示([]) :- !. ヒストグラム表示([L|R]) :- concat_atom(L,A),write_formatted('%t\n',[A]),ヒストグラム表示(R). 0〜9の範囲内の整数を20個入力し(M,[]) :- M > 20,!. 0〜9の範囲内の整数を20個入力し(M,[N|R]) :- write_formatted('%t個目 : ',[M]), get_integer(N), N >= 0, N =< 9, M2 is M + 1, 0〜9の範囲内の整数を20個入力し(M2,R),!. 0〜9の範囲内の整数を20個入力し(M,L) :- write('0〜9の範囲内の整数を入力してください\n'), 0〜9の範囲内の整数を20個入力し(M,L). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/891 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): # 行列のrankを求める関数 rank( ) を実装せよ # (提示ソースコードは後記) # # include <iostream> # #include <cstdlib> # using namespace std; # # #define ROWS 5 # #define COLS 4 # # int rank( double array[ROWS][COLS] ) # { # # } # # int main( ) # { # srand( time(NULL) ); # # double array[ROWS][COLS]; # # for( int r=0; r<ROWS; ++r ){ # for( int c=0; c<COLS; ++c ){ # array[r][c] = rand( ); # } # } # # rank( array ); # # return 0; # } 行列の階数(_行列,_階数) :- ガウス行列に変形(_行列,_ガウス行列), count((member(L,_ガウス行列),\+('すべての要素が0か0.0'(L))),_階数). 'すべての要素が0か0.0'([]). 'すべての要素が0か0.0'([0|R]) :- 'すべての要素が0か0.0'(R). 'すべての要素が0か0.0'([0.0|R]) :- 'すべての要素が0か0.0'(R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/683 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): http://ime.nu/ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10530.zip # ポーカープログラム # # 1,二つのクラス(Card,Deck)が与えられていて、 # game1.hとgame1.cppのプラグラムを書け。 # このプログラムはデッキから5枚配る事を1回とし、 # その中に何回ペアまたはフラッシュ(同じ手札に同じマークが5枚揃う事)が # あるかの10000回の統計であり、以下を表示させること # # 何回の統計か # そのうち何個の手札がペアを持つか # そのうち何個の手札がフラッシュを持つか # ペアは全体の何%か # フラッシュは全体の何%か # # 無作為化する為に以下を必ず含める事 # stand(unsigned)time(NULL); # # #2,新しいクラスhand(hand.hとhand.cpp)と、これを実行させる為の # game2.hとgame2.cppを書け。 # これはカードの配布、ペア・フラッシュの確認、そしてデッキにカードを戻す為の # プログラムである。 # ペアまたはフラッシュの出現度数(_回数,_ペアの度数,_フラッシュの度数) :- findsum([M1,M2],(for(1,N,_回数),トランプの準備([A,B,C,D,E|R]),役([A,B,C,D,E],M1,M2)),[_ペアの度数,_フラッシュの度数]). 役(L,1,0) :- sort(L,L1),ペア(L1),!. 役([A|R],0,1) :- sub_atom(A,1,1,_,_種類),フラッシュ(_種類,R),!. ペア([A,B]) :- sub_atom(A,0,1,_,C),sub_atom(B,0,1,_,C),!. ペア([A,B,C|R]) :- sub_atom(A,0,1,_,E),sub_atom(B,0,1,_,E),sub_atom(C,0,1,_,E),ペア(R),!. ペア([A,B,C|R]) :- sub_atom(A,0,1,_,E),sub_atom(B,0,1,_,E),\+(sub_atom(C,0,1,_,E)),!. ペア([A|R]) :- ペア(R). フラッシュ(_,[]) :- !. フラッシュ(A,[B|R]) :- sub_atom(B,1,1,_,A),フラッシュ(A,R). トランプの準備(X) :- findall(U,(for(1,N,52),一枚のカードを作る(N,U)),_整列したカード), トランプを切るようにならびを切る(41,53,_整列したカード,X),!. 一枚のカードを作る(N,U) :- M is N mod 13, M2 is (N - 1) // 13, 数字カード・絵カード(M,U1), カードの種類(M2,U2), concat_atom([U1,U2],U),!. 数字カード・絵カード(1,'A') :- !. 数字カード・絵カード(10,'T') :- !. 数字カード・絵カード(11,'J') :- !. 数字カード・絵カード(12,'Q') :- !. 数字カード・絵カード(0,'K') :- !. 数字カード・絵カード(N,N). カードの種類(0,s) :- !. カードの種類(1,h) :- !. カードの種類(2,d) :- !. カードの種類(3,c) :- !. トランプを切るようにならびを切る(0,_要素数,L,L) :- !. トランプを切るようにならびを切る(N,_要素数,L,X) :- M1 is (random mod _要素数) + 1, M2 is (random mod _要素数) + 1, \+(M1=M2), swap_nth(M1,M2,L,L1), N2 is N - 1, トランプを切るようにならびを切る(N2,_要素数,L1,X),!. トランプを切るようにならびを切る(N,_要素数,L,X) :- トランプを切るようにならびを切る(N,_要素数,L,X),!. swap_nth(M,N,L1,L2) :- list_nth(M,L1,A), list_nth(N,L1,B), swap(A,B,L1,L2),!. swap(A,B,L,LX) :- append(L1,[A|L2],[B|L3],L), append(L1,[B|L2],[A|L3],LX),!. swap(A,B,L,LX) :- append(L1,[B|L2],[A|L3],L), append(L1,[A|L2],[B|L3],LX),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/307 # # [1] Cプログラミング入門: # [2] http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10460.txt # '4:配列 COM に含まれる配列 MAN の数字の個数 count を求めよ'(COM,MAN,Count) :- '配列 COM に含まれる配列 MAN の数字の個数 count を求めよ'(COM,MAN,L), findsum(M,member([_,M],L),Count),!. count([],0) :- !. count([_|R],Count) :- count(R,Count1),Count is Count1 + 1,!. count(P,Count) :- findsum(1,P,Count). '配列 COM に含まれる配列 MAN の数字の個数 count を求めよ'(COM,[],[]) :- !. '配列 COM に含まれる配列 MAN の数字の個数 count を求めよ'(COM,[N|R1],[[N,Count]|R2]) :- count(member(N,COM),Count), '配列 COM に含まれる配列 MAN の数字の個数 count を求めよ'(COM,R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/10 # # [1]単元 初等C言語 # [2]問題 コンソールから、年月日時分秒に対応する整数をそれぞれ個別に不正入力時には # 再入力を促しながら読み込み、それをyyyymmddhhmmss(準グレゴリオ暦)形式の時刻表 # 現と解釈する。この処理を2回行い2つの時刻表現を取得する。それぞれが正しいフォー # マットかどうかを調べ、共に正しい場合は、日付が新しいものの順に # yyyy年mm月dd日hh時mm分ss秒の書式で出力)しその時刻差を秒単位、分単位、時間単 # 位、日単位で出力するプログラム(小数点一位以下四捨五入) # 但し1900年1月1日0時0分0秒以前の時刻は与えられないとして良い。 # また9999年12月31日23時59分59秒以後の時刻も与えられないとする。 # うるう年は400の倍数か100の倍数でない4の倍数な年であるとし、2月の末日 # にうるう日が付与されるものとする。実際の暦体系では不定期に付与されるうるう秒 # は考慮しなくて良いものとする正しい日付でない場合はその旨出力し処理を中止する 二つの時刻の時間差を表示する :- 準グレゴリオ暦入力(_準グレゴリオ暦1,_年1,_月1,_日1,_時1,_分1,_秒1), 準グレゴリオ暦入力(_準グレゴリオ暦2,_年2,_月2,_日2,_時2,_分2,_秒2), 二つの時刻の時間差を計算する(_年1,_月1,_日1,_時1,_分1,_秒1,_年2,_月2,_日2,_時2,_分2,_秒2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数), 時間差を表示する(_準グレゴリオ暦1,_準グレゴリオ暦2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数). 二つの時刻の時間差を計算する(_年1,_月1,_日1,_時1,_分1,_秒1,_年2,_月2,_日2,_時2,_分2,_秒2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数) :- 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2,_何日1), 時・分・秒調整(_時1,_分1,_秒1,_時2,_分2,_秒2,_何日1,_何日2,_秒), _総秒数 is 38400 * _何日 + _秒, _分数 is _総秒数 // 60, _余り秒数 is _総秒数 mod 60, _時間数 is _分数 // 60, _余り分数 is _分数 mod 60, _余り時間数 is _時間 mod 38400,!. 時間差を表示する(_準グレゴリオ暦1,_準グレゴリオ暦2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数) :- writef('それぞれの時刻の準グレゴリオ暦表現は %t\n%t\n',[_準グレゴリオ暦1,_準グレゴリオ暦2]), writef('時刻差は秒差で%t秒\n',[_総秒差]), writef('分差で%t分と%t秒\n',[_分数,_余り秒数]), writef('時間差で%t時間と%分と%秒\n',[_時間,_余り分数,_余り秒数]), writef('日差は%t日と%t時間と%t分と%秒です\n',[_日数,_余り時間数,_余り分数,_余り秒数]),!. 準グレゴリオ暦入力(_準グレゴリオ暦,_年,_月,_日,_時,_分,_秒) :- repeat, 催促付き整数入力('西暦年 yyyy:',_年),整数から文字列(4,_年,_年文字列), 催促付き整数入力('月 mm:',_月),整数から文字列(2,_月,_月文字列), 催促付き整数入力('月 dd:',_日),整数から文字列(2,_日,_日文字列), 催促付き整数入力('月 hh:',_時),整数から文字列(2,_時,_時文字列), 催促付き整数入力('月 mi:',_分),整数から文字列(2,_分,_分文字列), 催促付き整数入力('月 ss:',_秒),整数から文字列(2,_秒,_秒文字列), その日付はありうるか(_年,_月,_日,_時,_分,_秒), concat_atom([_年文字列,_月文字列,_日文字列,_時文字列,_分文字列,_秒文字列],_準グレゴリオ歴),!. その日付はありうるか(_年,_月,_日,_時,_分,_秒) :- _年>=1900,_年=<9999, _時>=0,_時=<59, _分>=0,_分=<59, _秒>=0,_秒=<59, その日付はありうるか(_年,_月,_日),!. その日付はありうるか(_年,_月,_日,_時,_分,_秒) :- write('日付として不適切なものでした\n'),fail. その日付はありうるか(_年,2,_日) :- うるう年(_年), _日>=1,_日=<29,!. その日付はありうるか(_年,2,_日) :- \+(うるう年(_年)), _日>=1,_日=<29,!. その日付はありうるか(_年,_月,_日) :- member(_月,[1,3,5,7,8,10,12]), _日>=1,_日=<31,!. その日付はありうるか(_年,_月,_日) :- member(_月,[4,6,9,11]), _日>=1,_日=<30,!. 何日あるか(_年,_月1,_日1,_年,_月2,_日2,_何日あるか) :- 今日から大晦日まで何日あるか(_年,_月1,_日1,_何日), 今日は元旦から何日目(_年,_月2,_日2,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目 - 1,!. 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2) :- _年2 is _年 + 1, 今日から大晦日まで何日あるか(_年1,_月1,_日1,_何日), 今日は元旦から何日目(_年2,_月2,_日2,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目,!. 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2) :- _年11 is _年1 + 1, _年22 is _年2 - 1, うるう年回数(_年11,_年22,_うるう年回数), N is (_年22-_年11+1) * 365 + _うるう年回数, 今日から大晦日まで何日あるか(_年1,_月1,_日1,_何日), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目 + N,!. 時・分・秒調整(_時1,_分1,_秒1,_時2,_分2,_秒2,_何日1,_何日2,_秒) :- _時間1 is 3600 * _時1 + _分1 * 60 + _秒1, _時間2 is 3600 * _時2 + _分2 * 60 + _秒2, _秒3 is _時間2 - _時間1, ( _秒3 >= 0, _何日2 is _何日 - 1, _秒3 = _秒; _秒3 < 0, _何日2 is _何日 - 2, _秒2 is 3600*24-_秒3 ),!. 日・時変換(_日,_時) :- _時 is _日 * 24. 日・分変換(_日,_分) :- _分 is _日 * 24 * 60. 日・秒変換(_日,_秒) :- _秒 is _日 * 24 * 60 * 60. 催促付き整数入力('年 yyyy:',_年),_年>=1900,_年=<9999, 催促付き整数入力('月 mm:',_月), 催促付き整数入力('年 dd:',_日), うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4),fail. 月別日数ならび(平年,[31,28,31,30,31,30,31,31,30,31,30,31]). 月別日数ならび(うるう年,[31,29,31,30,31,30,31,31,30,31,30,31]). うるう年回数(_起点西暦年,_終点西暦年,_うるう年回数) :- count((between(_起点西暦年,_終点西暦年,N),うるう年(N)),_うるう年回数). 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- うるう年(_年), 月別日数ならび(うるう年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- \+(うるう年(_年)), 月別日数ならび(平年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- うるう年(_年), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 366 - _元旦から何日 + 1. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- \+(うるう年(_年)), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 365 - _元旦から何日 + 1. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/10 # # [1]単元 初等C言語 # [2]問題 コンソールから、年月日時分秒に対応する整数をそれぞれ個別に不正入力時には # 再入力を促しながら読み込み、それをyyyymmddhhmmss(準グレゴリオ暦)形式の時刻表 # 現と解釈する。この処理を2回行い2つの時刻表現を取得する。それぞれが正しいフォー # マットかどうかを調べ、共に正しい場合は、日付が新しいものの順に # yyyy年mm月dd日hh時mm分ss秒の書式で出力)しその時刻差を秒単位、分単位、時間単 # 位、日単位で出力するプログラム(小数点一位以下四捨五入) # 但し1900年1月1日0時0分0秒以前の時刻は与えられないとして良い。 # また9999年12月31日23時59分59秒以後の時刻も与えられないとする。 # うるう年は400の倍数か100の倍数でない4の倍数な年であるとし、2月の末日 # にうるう日が付与されるものとする。実際の暦体系では不定期に付与されるうるう秒 # は考慮しなくて良いものとする正しい日付でない場合はその旨出力し処理を中止する 二つの時刻の時間差を表示する :- 準グレゴリオ暦入力(_準グレゴリオ暦1,_年1,_月1,_日1,_時1,_分1,_秒1), 準グレゴリオ暦入力(_準グレゴリオ暦2,_年2,_月2,_日2,_時2,_分2,_秒2), 二つの時刻の時間差を計算する(_年1,_月1,_日1,_時1,_分1,_秒1,_年2,_月2,_日2,_時2,_分2,_秒2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数), 時間差を表示する(_準グレゴリオ暦1,_準グレゴリオ暦2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数). 二つの時刻の時間差を計算する(_年1,_月1,_日1,_時1,_分1,_秒1,_年2,_月2,_日2,_時2,_分2,_秒2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数) :- 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2,_何日1), 時・分・秒調整(_時1,_分1,_秒1,_時2,_分2,_秒2,_何日1,_何日2,_秒), _総秒数 is 38400 * _何日 + _秒, _分数 is _総秒数 // 60, _余り秒数 is _総秒数 mod 60, _時間数 is _分数 // 60, _余り分数 is _分数 mod 60, _余り時間数 is _時間 mod 38400,!. 時間差を表示する(_準グレゴリオ暦1,_準グレゴリオ暦2,_総秒差,_分数,_時間数,_分数,_余り秒数,_時間数,_余り分数,_日数,_余り時間数) :- writef('それぞれの時刻の準グレゴリオ暦表現は %t\n%t\n',[_準グレゴリオ暦1,_準グレゴリオ暦2]), writef('時刻差は秒差で%t秒\n',[_総秒差]), writef('分差で%t分と%t秒\n',[_分数,_余り秒数]), writef('時間差で%t時間と%分と%秒\n',[_時間,_余り分数,_余り秒数]), writef('日差は%t日と%t時間と%t分と%秒です\n',[_日数,_余り時間数,_余り分数,_余り秒数]),!. 準グレゴリオ暦入力(_準グレゴリオ暦,_年,_月,_日,_時,_分,_秒) :- repeat, 催促付き整数入力('西暦年 yyyy:',_年),整数から文字列(4,_年,_年文字列), 催促付き整数入力('月 mm:',_月),整数から文字列(2,_月,_月文字列), 催促付き整数入力('月 dd:',_日),整数から文字列(2,_日,_日文字列), 催促付き整数入力('月 hh:',_時),整数から文字列(2,_時,_時文字列), 催促付き整数入力('月 mi:',_分),整数から文字列(2,_分,_分文字列), 催促付き整数入力('月 ss:',_秒),整数から文字列(2,_秒,_秒文字列), その日付はありうるか(_年,_月,_日,_時,_分,_秒), concat_atom([_年文字列,_月文字列,_日文字列,_時文字列,_分文字列,_秒文字列],_準グレゴリオ歴),!. その日付はありうるか(_年,_月,_日,_時,_分,_秒) :- _年>=1900,_年=<9999, _時>=0,_時=<59, _分>=0,_分=<59, _秒>=0,_秒=<59, その日付はありうるか(_年,_月,_日),!. その日付はありうるか(_年,_月,_日,_時,_分,_秒) :- write('日付として不適切なものでした\n'),fail. その日付はありうるか(_年,2,_日) :- うるう年(_年), _日>=1,_日=<29,!. その日付はありうるか(_年,2,_日) :- \+(うるう年(_年)), _日>=1,_日=<29,!. その日付はありうるか(_年,_月,_日) :- member(_月,[1,3,5,7,8,10,12]), _日>=1,_日=<31,!. その日付はありうるか(_年,_月,_日) :- member(_月,[4,6,9,11]), _日>=1,_日=<30,!. 何日あるか(_年,_月1,_日1,_年,_月2,_日2,_何日あるか) :- 今日から大晦日まで何日あるか(_年,_月1,_日1,_何日), 今日は元旦から何日目(_年,_月2,_日2,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目 - 1,!. 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2) :- _年2 is _年 + 1, 今日から大晦日まで何日あるか(_年1,_月1,_日1,_何日), 今日は元旦から何日目(_年2,_月2,_日2,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目,!. 何日あるか(_年1,_月1,_日1,_年2,_月2,_日2) :- _年11 is _年1 + 1, _年22 is _年2 - 1, うるう年回数(_年11,_年22,_うるう年回数), N is (_年22-_年11+1) * 365 + _うるう年回数, 今日から大晦日まで何日あるか(_年1,_月1,_日1,_何日), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日あるか is _何日 + _元旦から何日目 + N,!. 時・分・秒調整(_時1,_分1,_秒1,_時2,_分2,_秒2,_何日1,_何日2,_秒) :- _時間1 is 3600 * _時1 + _分1 * 60 + _秒1, _時間2 is 3600 * _時2 + _分2 * 60 + _秒2, _秒3 is _時間2 - _時間1, ( _秒3 >= 0, _何日2 is _何日 - 1, _秒3 = _秒; _秒3 < 0, _何日2 is _何日 - 2, _秒2 is 3600*24-_秒3 ),!. 日・時変換(_日,_時) :- _時 is _日 * 24. 日・分変換(_日,_分) :- _分 is _日 * 24 * 60. 日・秒変換(_日,_秒) :- _秒 is _日 * 24 * 60 * 60. 催促付き整数入力('年 yyyy:',_年),_年>=1900,_年=<9999, 催促付き整数入力('月 mm:',_月), 催促付き整数入力('年 dd:',_日), うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4),fail. 月別日数ならび(平年,[31,28,31,30,31,30,31,31,30,31,30,31]). 月別日数ならび(うるう年,[31,29,31,30,31,30,31,31,30,31,30,31]). うるう年回数(_起点西暦年,_終点西暦年,_うるう年回数) :- count((between(_起点西暦年,_終点西暦年,N),うるう年(N)),_うるう年回数). 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- うるう年(_年), 月別日数ならび(うるう年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日は元旦から何日目(_年,_月,_日,_元旦から何日目) :- \+(うるう年(_年)), 月別日数ならび(平年,_月別日数ならび), N1 is _月-1, append(L1,_,_月別日数ならび), length(L1,N1), sum(L1,_前月までの合計日数), _元旦から何日目 is _前月までの合計日数 + _日,!. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- うるう年(_年), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 366 - _元旦から何日 + 1. 今日から大晦日まで何日あるか(_年,_月,_日,_何日) :- \+(うるう年(_年)), 今日は元旦から何日目(_年,_月,_日,_元旦から何日目), _何日 is 365 - _元旦から何日 + 1. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/904 # # [1] 授業単元: forとかwhileとか # [2] 問題文(含コード&リンク): ある整数を入力し,その約数をすべてと約数の個数を表示するプログラムを作成しなさい. # ある整数を入力し,その約数をすべてと約数の個数を表示する :- get_integer(N), count((for(1,M,N),0 is N mod M,write_formatted('%t ',[M])),Count), write_formatted('\n約数の個数は%tです\n',[Count]). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/119 # # mysql 5.1.37 # # (問) # [groupテーブル] # group_id   | group_name # ---------+----------- # g1      | グループ1 # g2      | グループ2 # g3      | グループ3 # # [belongテーブル] # group_id  | user_id   | status # ---------+---------+------ # g1      | u1     | 1 # g2      | u2     | 0 # g2      | u3     | 1 # g2      | u4     | 1 # # このようなテーブルから、下記のように # group_name | user_count # -----------+----------- # グループ1  | 1 # グループ2  | 2 # グループ3  | 0 # 各グループ毎の「belong.status = 1」の所属ユーザ数を取得したいです。 # group(g1,グループ1). group(g2,グループ2). group(g3,グループ3). belong(g1,u1,1). belong(g2,u2,0). belong(g2,u3,1). belong(g2,u4,1). ?- group(_group_id,_group_name), count(belong(_group_id,_,1),Sum), write_formatted('%t | %t\n',[_group_name,Sum]), fail; true. % 以下のサイトは # 出典:: 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(索引(_文名,_)),!. 現在定義されている索引は削除(_). % 以下のサイトは # [1]授業単元 プログラム演習 # [2]問題文:一行に「文字列」,「文字列」,「文字列」,「整数」 # というふうに4つの属性がそれぞれコンマで区切られたファイルを構造体に読み込み # (ここまでは出来ました)、その2番目の属性に現れる全ての相異なる単語の出現頻度を求め、標準出力に書き出す。 # ここで単語は出現した順に並べる。また大文字は小文字に読み替え、区別しない。また単語のうちa,the,by,for,in,on,of,to,withは除外し、カウントしない。 '2番目の属性に現れる全ての相異なる単語の出現頻度'(_ファイル) :- get_split_lines(_ファイル,[','],L), 出現頻度を求める(L,[],_出現頻度ならび), member([_出現頻度,_単語],_出現頻度ならび), write_formatted('%t,%t\n',[_単語,_出現頻度]), fail. '2番目の属性に現れる全ての相異なる単語の出現頻度'(_). 出現頻度を求める([],X,X). 出現頻度を求める([[_,W,_,_]|R],Y,X) :- to_lower(W,W1), \+(member(W1,[a,the,by,for,in,on,of,to,with])), 出現頻度の更新(W1,Y,Y2), 出現頻度を求める(R,Y2,X). 出現頻度を求める([[_,W,_,_]|R],Y,X) :- to_lower(W,W1), member(W1,[a,the,by,for,in,on,of,to,with]), 出現頻度を求める(R,Y,X). 出現頻度の更新(W,[],[[1,W]]). 出現頻度の更新(W,[[S,W]|R],[[S2,W]|R]) :- S2 is S + 1,!. 出現頻度の更新(W,[L|R1],[L|R2]) :- 出現頻度の更新(W,R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/330 # # [1] 授業単元:プログラム # [2]問題文 # 次の要領でテストの点数を入力し、それぞれの点数代の人数が何人いるか求めるプログラム # 1.テストの点数を入力するガイダンスを用いて次のように出力 :点数の入力 終了条件:eあるいはE # 2.fgets()を用いて、テストの点数を文字列として入力 # 3.2で入力した文字列が'e'または'E'ならば処理2〜5の処理を終了して6の処理を行う # 4.文字列で入力した点数をint型変数に変換(atoiを使用する) # 5.4で変換したint型の点数が0点以上100点以下なら、それぞれの点数代の人数を数える。 # 6.5の結果の表示 テストの点数を入力し、それぞれの点数代の人数が何人いるか求める :-   write(':点数の入力 終了条件:eあるいはE '),get_line(Line),   テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(Line,[0,0,0,0,0,0,0,0,0,0],_10点ごと出現頻度ならび),   for(1,N,10),   list_nth(N,_10点ごと出現頻度ならび,M),   write_formatted('%t~%t %t人\n',[(N-1) * 10,N * 10 - 1,M]),   N = 10. テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(e,L,L) :- !. テストの点数を入力し、それぞれの点数代の人数が何人いるか求める('E',L,L) :- !. テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(Line,L1,L) :-   atom_to_term(Line,N,_),N >= 0,N =< 100,   M is (N // 10) + 1,   出現頻度ならびをカウントアップ(N,L1,L2),   write(':点数の入力 終了条件:eあるいはE '),get_line(Line2),   テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(Line2,L2,L). 出現頻度ならびをカウントアップ(C,[],[1,C]) :- !. 出現頻度ならびをカウントアップ(C,[[N,C]|R1],[[N2,C]|R1]) :- N2 is N + 1,!. 出現頻度ならびをカウントアップ(C,[[N,C1]|R1],[[N,C1]|R2]) :- 出現頻度ならびをカウントアップ(C,R1,R2). % 以下のサイトは # 出典:: 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/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/1200175247/745 # # # [1] 授業単元:プログラミング初歩 # # [2] 問題文(含コード&リンク): # # ・文字列を,a ならば z,b ならば y,c ならば x のように,小文字も大文字もアルファベットの逆順の出現文字に置き換えるプログラムを作りなさい. # ・文字列が与えられたとき,アルファベットを大文字,小文字を区別せずに出現頻度順に小文字で並べた文字列を返すプログラムを作りなさい. # '文字列を,a ならば z,b ならば y,c ならば x のように,小文字も大文字もアルファベットの逆順の出現文字に置き換える'(_文字列,_アルファベットの逆順に変換された文字列) :- atom_chars(_文字列,_文字ならび), アルファベット逆順変換(_文字ならび,_アルファベットの逆順に変換された文字ならび), atom_chars(_アルファベットの逆順に変換された文字列,_アルファベットの逆順に変換された文字ならび). アルファベット逆順変換([],[]). アルファベット逆順変換([A|R1],[B|R2]) :- 逆順アルファベット探索(A,B), アルファベット逆順変換(R1,R2). 逆順アルファベット探索(A,B) :- アルファベットと逆順アルファベット(_,L1,L2), append(L0,[A|_],L1), length(L0,Len), length(L3,Len), append(L3,[B|_],L2). アルファベットと逆順アルファベット(小文字,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],[z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a]). アルファベットと逆順アルファベット(大文字,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'], ['Z','Y','X','W','V','U','T','S','R','Q','P','O','N','M','L','K','J','I','H','G','F','E','D','C','B','A']). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/76 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 問題1 # # 次の文章をプログラム中に文字列として与える. # # The metropolitan government and the Tokyo 2016 Bid Committee had a budget of 15 billion yen to campaign to host the Games, of which 10 billion yen was shouldered by the metropolitan government. # # アルファベット(ピリオド含む,大文字,小文字は区別しない),数字がそれぞれ何回出現したかをカウントして出力するプログラムを作成せよ # 文章('The metropolitan government and the Tokyo 2016 Bid Committee had a budget of 15 billion yen to campaign to host the Games, of which 10 billion yen was shouldered by the metropolitan government.'). 'アルファベット(ピリオド含む,大文字,小文字は区別しない),数字がそれぞれ何回出現したかをカウントして出力する'(_アルファベットの出現度数,_数字の出現度数) :- 文章(_文章), atom_chars(_文章,_文字ならび), アルファベット(_アルファベット), 数字(_数字ならび), 'アルファベット(ピリオド含む,大文字,小文字は区別しない),数字がそれぞれ何回出現したかをカウントして'(_文字ならび,_アルファベット,_数字ならび,0,_アルファベットの出現度数,0,_数字の出現度数), write_formatted('アルファベット出現度数 ... %t\n'), write_formatted('数字出現度数 ... %t\n'), 'アルファベット(ピリオド含む,大文字,小文字は区別しない),数字がそれぞれ何回出現したかをカウントして'([],_,_,[C_アルファベットの出現度数,字ならび,0,_アルファベットの出現度数,0,_数字の出現度数). 'アルファベット(ピリオド含む,大文字,小文字は区別しない),数字がそれぞれ何回出現したかをカウントして'([],_,_,_アルファベットの出現度数,_アルファベットの出現度数,_数字の出現度数,_数字の出現度数) :- !. 'アルファベット(ピリオド含む,大文字,小文字は区別しない),数字がそれぞれ何回出現したかをカウントして'([A|R],_アルファベット,_数字ならび,_アルファベット出現度数1,_アルファベットの出現度数,_数字出現度数1,_数字の出現度数) :- アルファベットカウンター([A|R],_アルファベット,_アルファベット出現度数1,_更新されたアルファベット出現度数), 数字カウンター([A|R],_数字ならび,_数字出現度数1,_更新された数字出現度数), 'アルファベット(ピリオド含む,大文字,小文字は区別しない),数字がそれぞれ何回出現したかをカウントして'(R,_アルファベット,_数字ならび,_更新されたアルファベット出現度数,_アルファベットの出現度数,_更新された数字の出現度数,_数字の出現度数). アルファベットカウンター([A|R],_アルファベット,_カウンター,_更新されたカウンター) :- member(A,_アルファベット), _更新されたカウンター is _カウンター + 1,!. アルファベットカウンター([A|R],_アルファベット,_カウンター,_カウンター) :- \+(member(A,_アルファベット)),!. 数字カウンター([A|R],_数字ならび,_カウンター,_更新されたカウンター) :- member(A,_数字ならび), _更新されたカウンター is _カウンター + 1,!. 数字カウンター([A|R],_数字ならび,_カウンター,_カウンター) :- \+(member(A,_数字ならび)),!. アルファベット(['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,'.']). 数字(['0','1','2','3','4','5','6','7','8','9']). % 以下のサイトは # 出典 :: 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/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://yomi.mobi/read.cgi/pc11/pc11_tech_1215986178 (レス番号146) # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # キーボードから100点満点のテストの点数を入力し(-1で終了)、 # 10点ごとの人数を int型の配列 count[11]に数えるプログラムを # 作成せよ。 テストは100点満点とし、それ以外の入力はエラーとし # て無視する。ただし -1 はデータの終了を表すものとする。 点数 # の入力が終了したら、度数分布を画面に出力して終了する。出力は # 人数と,*(アスタリスク)によるグラフとする。 t904 :- write('点数(整数)をカンマで区切って入力してください : '), get_line(Line), split(Line,[','],_成績ならび), findall(U,(member(V,_成績ならび),'10点ごとの丸め'(V,U)),_丸めた成績ならび), 分布ならびを得る(_丸めた成績ならび,[0,10,20,30,40,50,60,70,80,90,100],[[],[],[],[],[],[],[],[],[],[],[]],L1), アスタリスクによる棒グラフ([0,10,20,30,40,50,60,70,80,90,100],L1). '10点ごとの丸め'(_点数,_10点ごとに丸めた点数) :- _10点ごとに丸めた点数 is (_点数 // 10) * 10. 分布ならびを得る([],_,L,L) :- !. 分布ならびを得る([V|R],L1,L2,L3) :- list_nth(N,L1,V), list_nth(N,L2,W), 要素番号によるならびの置換(N,[*|W],L2,L4), 分布ならびを得る(R,L1,L4,L3). アスタリスクによる棒グラフ([A|R1],[L|R2]) :- atom_chars(B,L), write_formatted('%3d %t\n',[A,B]), アスタリスクによる棒グラフ(R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/131 # # C++です。 # #   x[0] = rand()%6; #   x[1] = rand()%6; #   x[2] = rand()%6; #   y =x[0] + x[1] + x[2]; #   z[y] = z[y]+1; # # 変数がわかりにくくてすみません。 # xの配列に0〜5の値を保存して合計してyに入れます。 # それからzの配列(15こぶん)に入れたいのですが、うまくできません。 '1-15の乱数ごとに出現度数を取る'(_試行回数,_z) :- !. length(_z_1,15), all(_z_1,0), '1-15の乱数ごとに出現度数を取る'(_試行回数,_z_1,_z). '1-15の乱数ごとに出現度数を取る'(0,_z,_z) :- !. '1-15の乱数ごとに出現度数を取る'(_n,_z_1,_z) :- 'xの配列に0〜5の値を保存して合計してyに入れます。'(_n,_n_1,_y), 'それからzの配列(15こぶん)に入れたい。'(_y,_z_1,_z_2), '1-15の乱数ごとに出現度数を取る'(_n_1,_z_2,_z). 'xの配列に0〜5の値を保存して合計してyに入れます。'(_n,_n_1,_y) :- _n_1 is _n - 1, X_0 is random(6), X_1 is random(6), X_2 is random(6), _y is X_0 + X_1 + X_2 + 1. 'それからzの配列(15こぶん)に入れたい。'(_y,_z_1,_z_2) :- nth1(_y,_z_1,_yの度数_1), _yの度数_2 is _yの度数_1 + 1, ならびの位置指定置換(_y,_yの度数_2,_z_1,_z_2). ならびの位置指定置換(1,A,[_|R],[A|R]) :- !. ならびの位置指定置換(N,A,[B|R1],[B|R2]) :- N1 is N - 1, ならびの位置指定置換(N1,A,R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/770 # # [1] 授業単元:プログラミング演習2 # [2] 問題文(含コード&リンク): # テキストファイルを読み込み、 # 文字コード表を利用して種類ごとに文字を分類し、それぞれをカウントするプログラムを作れ # 分類は以下の通りとする。 # 1.半角英数 # 2.半角カナ # 3.半角記号 # 4.全角かな # 5.全角記号 # 6.漢字 # 以上のように分類した上で「半角英数:XX字、半角カナ:XX字・・・」というように結果をファイルに出力せよ。 # 使用する文字コード表は自由だが一般に使われているものを選択せよとのことでした。 # コード内にコメントで使用した文字コードを注釈として記載するようにとの連絡がありました。 eucコード分類(半角英数,0x30,0x39). eucコード分類(半角英数,0x51,0x5a). eucコード分類(半角英数,0x61,0x6a). eucコード分類(全角数字,0xa3b0,0xa3b9). eucコード分類(半角カナ,0x8ea1,0x8ed6). eucコード分類(全角カナ,0xa5a1,0xa5f6). eucコード分類(全角かな,0xa4a1,0xa4f3). eucコード分類(全角記号,0xa101,0xa2fe). eucコード分類(全角漢字,0xb0a1,0xfcee). 文字コード分類(_テキスト,_分類ならび) :- atom_codes(_テキスト,Codes), 文字コード分類(Codes,[],_分類ならび). 文字コード分類([],_分類ならび,_分類ならび). 文字コード分類([A|R1],_分類ならびの一,_分類ならび) :- eucコード分類(_分類,_コード下限,_コード上限), A >= _コード下限, A =< _コード上限, 分類ならびの更新(_分類ならびの一,_分類,_分類ならびの二), 文字コード分類(R1,_分類ならびの二,_分類ならび),!. 文字コード分類([_|R1],_分類ならびの一,_分類ならび) :- 文字コード分類(R1,_分類ならびの一,_分類ならび). 分類ならびの更新([],_分類,[[_分類,1]]) :- !. 分類ならびの更新([[_分類,_頻度の一]|R],_分類,[[_分類,_頻度の二]|R]) :- _頻度の二 is _頻度の一 + 1,!. 分類ならびの更新([U|R1],_分類,[U|R2]) :- 分類ならびの更新(R1,_分類,R2). 分類文字数(_分類文字数ならび) :- findall([_分類,_文字数],(eucコード分類(_分類,S,E),分類文字数計算(_分類,S,E,_文字数)), _分類文字数ならび). 分類文字数計算(_分類,S,E,_文字数) :- sub_atom(_分類,1,2,_,半角), _文字数 is E - S + 1. 分類文字数計算(_分類,S,E,_文字数) :- sub_atom(_分類,1,2,_,半角), _文字数 is (E - S) // 2 + 1. 分類文字のN字目(_分類,N,_文字コード) :- sub_atom(_分類1,2,_,半角), eucコード分類(_分類,S,E), _文字コード is S + N - 1. 分類文字のN字目(_分類,N,_文字コード) :- sub_atom(_分類1,2,_,全角), eucコード分類(_分類,S,_), _文字コード is (S + (N - 1) * 2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/964 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9898.txt # 課題: # 文字数・単語数・行数を数えるプログラム # 内容: # 指定されたファイルに含まれる、 # ・行数 # ・文字数 # ・文字毎の出現回数 # ・単語数 # ・単語毎の出現回数 # を判定し、ディスプレイ表示させる。 # # 単語については、1単語をどのように判定するかの定義付けをし、 # その定義に従って単語を取り出す。 # 指定ファイル: http://nojiriko.asia/data/You_Raise_Me_Up.txt にコピーさせてもらいました。 t631 :- wc(File,_行数,_文字数,_頻度と文字のならび,_単語数,_頻度と語彙のならび), write_formatted('行数 = %t,文字数 = %t\n',[_行数,_文字数]), 頻度付き文字ならびの表示(_頻度と文字のならび), write_formatted('単語数 = %t,\n',[_単語数]), 頻度付き語彙ならびの表示(_頻度付き語彙ならび),!. wc(File,_行数,_文字数,_頻度と文字のならび,_単語数,_頻度と語彙のならび) :- 行と語彙数の計測(File,_行数,_単語数,_頻度と語彙のならび), 文字数の計測(File,_小文字語ならび,_文字数,_頻度と文字のならび). 行と語彙数の計測(File,_行数,_単語数,_頻度と語彙のならび) :- get_split_lines(File,[' ',':','?','.',',','(',')'],Lines), flat(Lines,Words), to_lowers(Words,Words2), 二分木作成(Words2), 二分木から頻度と値を取り出す(1,_頻度付き語彙ならび), length(Lines,_行数), length(_頻度付き語彙ならび,_単語数),!. 文字数の計測(File,_小文字語ならび,_文字数,_頻度と文字のならび) :- get_chars(File,Chars), length(Chars,文字数), 二分木作成(Chars), 二分木から頻度と値を取り出す(1,_頻度付き文字ならび),!. 頻度付き文字ならびの表示([[_頻度,_文字|R]) :- write_formatted('%t (%t),\n',[_文字,_頻度]), 頻度付き文字ならびの表示(R). 頻度付き語彙ならびの表示([[_頻度,_語彙|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, _頻度3 is _頻度2 + 1, retract(節(_節,_下,_右,_頻度2,_値2)), assertz(節(_節,_下,_右,_頻度3,_値2)),!. 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_下,_右,_,_値2), _値 @> _値2, 節作成(_値,_下,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_下,_右,_,_値2), _値 @< _値2 , 節作成(_値,_右,_受取節番号,_次の節番号). 二分木から値と頻度を取り出す(_木の根,_頻度と値ならび) :- findall([_頻度,_値],二分木から値と頻度を取り出す(_木の根,_,頻度,_,_値),_頻度と値ならび). 二分木から頻度と値を取り出す(_木の根,_頻度1,_頻度,_値1,_値) :- 根(_木の根,_下,_,_頻度2,_値2), 二分木から頻度と値を取り出す(_下,_頻度2,_頻度,_値2,_値). 二分木から頻度と値を取り出す(_木の根,_頻度1,_頻度,_値1,_値) :- 根(_木の根,_,_右,_頻度2,_値2), 二分木から頻度と値を取り出す(_右,_,頻度,_,_値). 二分木から頻度と値を取り出す(_木の根,_頻度1,_頻度,_値1,_値) :- not(var(_値1)), not(var(_頻度1)), _頻度1=_頻度, _値1=_値. to_lowers([],[]) :- !. to_lowers([A|R1],[B|R2]) :- to_lower(A,B), to_lowers(R1,R2). flat([],[]) :- ! . flat([A|R],L) :- list(A),!, flat(A,L1), flat(R,L2), append(L1,L2,L). flat([A|R],[A|R1]) :- flat(R,R1). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 153代目 #624 # [1] 授業単元:リスト構造体 # [2] 問題文(含コード&リンク): # enqueue()とdequeue()を用いて実行結果が # # Please input E(登録) or D(削除): E # Input number and name: 8 Nakamura # Please input E(登録) or D(削除): E # Input number and name: 3 Saito # Please input E(登録) or D(削除): D # Number=8 Name=Nakamura # Please input E(登録) or D(削除): D # Number=3 Name=Saito # Please input E(登録) or D(削除): D # No Data! # Please input E(登録) or D(削除): E # ・ # ・ # ・ # のように動作するプログラムを作成せよ # '入力された英字文字列(a~z,A-Z)に、どの文字がいくつ入っているかを 調べるプログラムcount_char.cを作成せよ。 実行例 String: cbbbAcAccZ A: ** Z: * b: *** c: ****' :- '入力された英字文字列(a~z,A-Z)に'(_文字列), count_char(_文字列). '入力された英字文字列(a~z,A-Z)に'(_文字列) :- get_line(_文字列), '診断::入力された英字文字列(a~z,A-Z)'(_文字列),!. '入力された英字文字列(a~z,A-Z)に'(_文字列) :- '入力された英字文字列(a~z,A-Z)に'(_文字列). '診断::入力された英字文字列(a~z,A-Z)'(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),英字文字(_文字)). 英字文字(_文字) :- 英小文字(_文字). 英字文字(_文字) :- 英大文字(_文字). 英小文字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 英大文字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. count_char(_文字列) :- atom_chars(_文字列,Chars), count_char_1(Chars,[],QL), キューを表示する(QL). count_char_1([],X,X). count_char_1([A|R],QL,X) :- count_char_2(A,QL,QL2), count_char_1(R,QL2,X). count_char_2(A,[],[[A,QA]]) :- 新しいキューを作る(Q), キューに要素を追加する('*',Q,QA),!. count_char_2(A,[[A,QA]|R],[[A,QB],R]) :- キューに要素を追加する('*',QA,QB),!. count_char_2(A,[U|R1],[U|R2]) :- count_char_2(A,R1,R2). 新しいキューを作る(X-X). キューは空である(X-Y) :- X == Y. キューに要素を追加する(_要素,X-[_要素|Y],X-Y). キューを表示する(QL) :- forall(( member([U,Q-[]],QL), atomic_list_concat(Q,S)), writef('%w: %w\n',[U,S])). get_line(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). % % キューは引数内の論理変数として重リストを使って定義し、 % それを更新しながら持ちまわるのが普通だが、 % ここでは愚直に、キューを述語としてassertし、reatract/assertを % 繰り返して値を出入りさせる述語群を定義してみた。 % % 以下のサイトは # 課題 ttp://uploaders.ddo.jp/upload/1mb/count.cgi?1up6511.zip # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】7月21日  # 【 Ver  】1.6.0_11 # # zipフォルダに詳細ファイルを入れました # 丸投げで申し訳ないですが、よろしくお願いします rev_str(X,Y) :- reverse_atom(X,Y). reverse_atom(X,Y) :- atom_chars(X,L), reverse(L,L2), atom_chars(Y,L2) . % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/550 # # [1] 授業単元: Ruby演習 [2] 問題文、http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9426.txt # Rubyの問題がわかりません 助けてください # # (1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい # # p wday["sunday"] #=> "日曜日" # p wday["monday"] #=> "月曜日" # p wday["saturday"] #=> "土曜日" # # (2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい # # (3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてくださ い。 # 「sunday」は日曜日のことです。 # 「monday」は月曜日のことです。 # # (4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行(正 規表現で定義するなら「/\uff3cs+/」)で区切られた文字列をハッシュに変換するメソ ッドstr2hashを定義してください。 # # p str2hash("bule 青 white 白\uff3cnred赤"); # #=> {"bule"=>"青", "white"=>"白", "red"=>"赤"} :- op(450,xfx,(=>)). % (1) wday({ "sunday" => "日曜日","monday" => "月曜日","saturday" #=> "土曜日"}). % (2) hash_count(Hashname,Count) :- functor(P,Hashname,1), call(P), arg(1,P,H), count(H,Count). count(','(A,B),Count) :- count(B,Count2), Count is Count2 + 1. count(A,1). % (3) ?- each(wday.A=>B),write_formatted('「%t」は%tのことです。\n',[A,B]),fail;true. each(Hashname.Key=>Value) :- functor(P,Hashname,1), arg(1,P,V), each(V,Key=>Value). each(','(Key=>Value,B),Key=>Value). each(','(_,B),Key=>Value) :- each(B,Key=>Value). each(Key=>Value,Key=>Value). % (4) str2hash(Atom,Hash) :- split(Atom,[' ','\t','\n'],L), findall(U,n個組(2,L,U),L2), hashを成長させる(L2,Hash). hashを成長させる([A,B],{ A=>B }) :- !. hashを成長させる([[A,B]|R], { (A=>B,R2) }) :- hashを成長させる(R,{ R2 }). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/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). % 以下のサイトは # 出典:: C/C++の宿題片付けます 127代目 #413 # # 演習 # 今日は友引の火曜日である。今日からN日後までに仏滅ではない日曜日が何日あるか求めるプログラムを作成せよ。 # 六曜:先勝,友引,先負,仏滅,大安,赤口 六曜連鎖(先勝,友引). 六曜連鎖(友引,先負). 六曜連鎖(先負,仏滅). 六曜連鎖(仏滅,大安). 六曜連鎖(大安,赤口). 六曜連鎖(赤口,先勝). 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). '今日は大安の木曜日である。今日からN日後までに仏滅ではない日曜日が何日あるか求める。'(_N日後,_何日) :- 仏滅ではない日曜日が何日あるか(0,_N日後,大安,木曜,0,_何日). 仏滅ではない日曜日が何日あるか(_日数_1,_日数限度,_,_,_度数,_度数) :- _日数_1 > _日数限度,!. 仏滅ではない日曜日が何日あるか(_日数_1,_日数限度,_六曜_1,_曜日_1,_度数_1,_度数) :- '_日数_1が_日数限度以下の間の、仏滅ではない日曜日の度数'(_日数_1,_日数限度,_六曜_1,_曜日_1,_度数_1,_度数). '_日数_1が_日数限度以下の間の、仏滅ではない日曜日の度数'(_日数_1,_日数限度,_六曜_1,_曜日_1,_度数_1,_度数) :- '仏滅ではない日曜日の場合だけ、度数を加える'(_六曜_1,_曜日_1,_度数_1,_度数_2), 次の日(_日数_1,_六曜_1,_曜日_1,_日数_2,_六曜_2,_曜日_2), 仏滅ではない日曜日が何日あるか(_日数_2,_日数限度,_六曜_2,_曜日_2,_度数_2,_度数). 次の日(_日数_1,_六曜_1,_曜日_1,_日数_2,_六曜_2,_曜日_2) :- succ(_日数_1,_日数_2), 六曜連鎖(_六曜_1,_六曜_2), 曜日連鎖(_曜日_1,_曜日_2). '仏滅ではない日曜日の場合だけ、度数を加える'(_六曜,日曜,_度数_1,_度数_2) :- \+(_六曜 = 仏滅), succ(_度数_1,_度数_2),!. '仏滅ではない日曜日の場合だけ、度数を加える'(_,_,_度数_1,_度数_1). % 以下のサイトは % 課題1 ターミナルから日本円の金額を読み込み,これをドルとユーロに変換して表示するプログラムを作成しなさい.  %    作成にあたっては,下図の構造体を用い,為替レートは図に示された初期値を用いなさい. % % struct rate { // 外国為替レート % double to_yen; // 対円 % double to_dollar; // 対ドル % double to_euro; // 対ユーロ % }; % % struct rate yen = {1.0, 0.0104, 0.007347,}; % /* 1$=96.15円, 1EURO=136.11円の場合の,各国通貨に対する円の為替レート */ % % % % 課題2 ターミナルから一文字を読み込み,それが'e'の場合は英語の国名を出力し,'f'の場合はフランス語で国名を出力する %    プログラムを作成しなさい.ただし,国名を格納した変数は下図に示すものを用いること. % % #define SLENGTH 20 % #define COUNTRIES 5 % % struct nation { % char en[SLENGTH]; /* 国名(英語) */ % char fr[SLENGTH]; /* 国名(仏語) */ % }; % % struct nation country[COUNTRIES] = { /* 国名の初期化 */ % {"Japan", "Japon", }, // 日本 % {"France", "France",}, // フランス % {"Germany", "Allemagne",}, // ドイツ % {"Spain", "Espagne",}, // スペイン % {"Italy", "Italie",}, // イタリア % }; % % % 課題3 氏名,身長,体重を収めるリストを構造体で作成し,BMI指数により標準体型と見なされる人の氏名とBMI指数を出力する %    プログラムを作成せよ. % %     ・登録できる人数の上限を16人とし,登録者数を入力してから,各人のデータを入力する. %     ・構造体の各要素は,name(氏名),height(身長),weight(体重)とする. %     ・氏名は,30文字以内とし,スペースを含まない. %     ・身長の単位は[cm],体重の単位は[Kg]とする. %     ・各項目は<スペース>で区切られて入力される. %     ・各項目は<スペース>で区切られて出力される. % % 課題1 対円レート(1.0, 0.0104, 0.007347). 外国為替レート(_円,_ドル,_ユーロ) :- 対円レート(_, _対ドル, _対ユーロ), not(var(_円)), _ドル is _円 * _対ドル, _ユーロ is _円 * _対ユーロ. % 課題2 課題2 :- read(X), 課題2_1(X). 課題2_1(e) :- country(L), member([Country,_],L), write(Country),nl, fail. 課題2_1(f) :- country(L), member([_,Country],L), write(Country),nl, fail. 課題2_1(_). country([['Japan', 'Japon'], % 日本 ['France', 'France'], % フランス ['Germany', 'Allemagne'], % ドイツ ['Spain', 'Espagne'], % スペイン ['Italy', 'Italie']]). % イタリア % 課題3 データ入力 :- abolish(個人データ/0), 構造体生成(_構造体1), read(X), split(X,[' '],[_名前,_身長,_体重]), データ入力(_名前,_身長,_体重,_構造体1,_構造体2), assertz(個人データ(_構造体2)), 'BMI標準メンバーの表示. 'BMI標準メンバーの表示' :- 個人データ(_構造体), member([_名前1,_身長1,_体重1],_構造体), 'BMI判定'(_身長1,_体重1,BMI,普通です), wr('%t %t %t %t\n',[_名前1,_身長1,_体重1,BMI]), fail; true. データ入力(end_of_file,_構造体,_構造体) :- !. データ入力(_入力行,_構造体1,_構造体) :- split(_入力行,[' '],[_名前,_身長,_体重]), sub_atom(_名前,0,30,_,_名前1), 構造体更新(_氏名,_身長1,_体重,_構造体1,_構造体2), read(X), データ入力(X,_構造体2,_構造体). 構造体生成([]). 構造体更新(_名前,_身長,_体重,_更新前,_更新後) :- length(_更新前,Len), Len < 16, _更新後=[[名前(_名前),身長(_身長),体重(_体重)]|_更新前]. 構造体更新(_名前,_身長,_体重,_,_) :- write('登録者がすでに16名います\n追加できません\n'). 'BMI判定'(_身長,_体重,BMI,_判定) :- BMI is _体重/_身長/_身長*10000, 'BMI判定'(BMI,_判定). 'BMI判定'(BMI,やせてます) :- BMI =< 18.5. 'BMI判定'(BMI,普通です) :- BMI > 18.5,BMI < 25.0. 'BMI判定'(BMI,レッツエクササイズ!) :- BMI >= 25.0. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/547 # #[1] 授業単元: プログラミング初歩 #[2] 問題文(含コード&リンク):(文字列を与えられた時、アルファベットを大文字小文字区別せずに出現頻度順 #に小文字で並べた文字列を返すプログラムを作りなさい。) #[3] 環境 # [3.1] OS: (WindowsXP) # [3.2] バージョン: (Ruby 1.8.6 ) # [3.3] 言語: (Ruby #[4] 期限: ([2009年06月01日21:00まで] #[5] その他の制限: 配列などの初歩的な概念まで '文字列を与えられた時、アルファベットを大文字小文字区別せずに出現頻度順に小文字で並べた文字列を返すプログラムを作りなさい。'(_文字列,_アルファベットを大文字小文字区別せずに出現頻度順に小文字で並べた文字列) :- アルファベットを大文字小文字区別せずに(_文字列,_大文字を小文字に変換した文字列), 出現頻度順に小文字で並べた文字列を返す(_大文字を小文字に変換した文字列,_アルファベットを大文字小文字区別せずに出現頻度順に小文字で並べた文字列). アルファベットを大文字小文字区別せずに(_文字列,_大文字を小文字に変換した文字列) :- 文字列を小文字に変換する(_文字列,_大文字を小文字に変換した文字列). 文字列を小文字に変換する(_文字列,_大文字を小文字に変換した文字列) :- to_lower(_文字列,_大文字を小文字に変換した文字列). 出現頻度順に小文字で並べた文字列を返す(_大文字を小文字に変換した文字列,_アルファベットを大文字小文字区別せずに出現頻度順に小文字で並べた文字列) :- atom_chars(_大文字を小文字に変換した文字列,_大文字を小文字に変換した文字列), 降順に整列(_大文字を小文字に変換した文字列,_降順に整列した大文字を小文字に変換した文字ならび), atom_chars(_アルファベットを大文字小文字区別せずに出現頻度順に小文字で並べた文字列,_降順に整列した大文字を小文字に変換した文字ならび). 降順に整列(L1,L2) :- sort(L1,L3), reverse(L3,L2). % 以下のサイトは % % http://pc12.2ch.net/test/read.cgi/tech/1242655611/809 % % <問題>> % http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9353.txt % %  バックトラッキング法 % % 問題を解く過程が段階的に分かれており、各段階で次に進む選択肢が複数あるという問題は多々ある。各段階で判定を下すときは、 % 適当に選びずっと先の段階まで行って、その時の選択が間違っていたことが判って時点で、この段階まで逆戻りして異なる選択をする。 % 囲碁将棋の「待った」である。このような方法で正しい解を見つけるやり方をバックトラッキング法 % という。この解決の実装にはスタックが用いられることが多い。 % % そこで今回は2題問題を挙げる。 % % 題1 騎士の巡回問題 %     %    西洋のチェスは8×8枡の盤にいろいろな駒が置かれている。騎士の駒は日本の将棋の斜め前に進む桂馬に似ているが、斜め後ろにも %    戻れるところは異なっている。盤のKの位置に騎士いるときに、次に進むことができる位置は、図の0のところどれでも良い。 % % % %     %        +−−+−−+−−+−−+−−+−−+−−+−−+ %        |  |  |  |  |  |  |  |  | %        +−−+−−+−−+−−+−−+−−+−−+−−+ %        |  |  | O |  | O |  |  |  | %        +−−+−−+−−+−−+−−+−−+−−+−−+ %        |  | O |  |  |  | O |  |  | %        +−−+−−+−−+−−+−−+−−+−−+−−+ %        |  |  |  | K |  |  |  |  | %        +−−+−−+−−+−−+−−+−−+−−+−−+ %        |  | O |  |  |  | O |  |  | %        +−−+−−+−−+−−+−−+−−+−−+−−+ %        |  |  | O |  | O |  |  |  | %        +−−+−−+−−+−−+−−+−−+−−+−−+ %        |  |  |  |  |  |  |  |  | %        +−−+−−+−−+−−+−−+−−+−−+−−+ %         % 問題はある位置から出発してすべての位置を一回だけ訪れる方法が何種類あるかを求めること。つまり、一筆書きで全ての升目を通る方法が何回あるか。 % %    この問題を8×8枡でやると解がとてつもなくあるので盤を5×5枡に制限し、最初の位置をAとします。 % % % % %        +−−+−−+−−+−−+−−+ %        | A |  |  |  |  | %        +−−+−−+−−+−−+−−+ %        |  |  |  |  |  |  %        +−−+−−+−−+−−+−−+ %        |  |  |  |  |  | %        +−−+−−+−−+−−+−−+ %        |  |  |  |  |  | %        +−−+−−+−−+−−+−−+ %        |  |  |  |  |  | %        +−−+−−+−−+−−+−−+ % % 最後に求まった盤の状況(訪れた順に番号を入れる)を印字し、全部の解答数を報告すること。 % % % % %  題2 再帰法による解法 %      おなじ問題をスタックを用いずに再帰プログラムで書きなさい。 % % 可能経路数(_桝,_開始点_X,_開始点_Y,_経路の数) :- 開始点は桝の中にある(_桝,_開始点_X,_開始点_Y), 度数(駒の動き(_桝,_開始点_X,_開始点_Y,_),_経路の数). 開始点は桝の中にある(_桝,_開始点_X,_開始点_Y) :- between(1,_桝,_開始点_X), between(1,_桝,_開始点_Y). 駒の動き(_桝,_開始点_X,_開始点_Y,_経路) :- 駒の動き(_桝,_開始点_X,_開始点_Y,[[_開始点_X,_開始点_Y]],_経路). 駒の動き(_桝,X,Y,L,_経路) :- 移動可能点(_桝,X,Y,X2,Y2), \+(member([X2,Y2],L)), 駒の動き(_桝,X2,Y2,[[X2,Y2]|L],_経路). 駒の動き(_桝,X,Y,L,_経路) :- 全ての升目を通過した(_桝,L,_経路). 変位(2,1). 変位(1,2). 変位(-1,2). 変位(-2,1). 変位(-2,-1). 変位(-1,-2). 変位(1,-2). 変位(2,-1). 移動可能点(_桝,I,J,X,Y) :- 変位(U,W), X is I+U, Y is J+W, 'X,Yは盤面上'(X,Y,_桝). 'X,Yは盤面上'(X,Y,_桝) :- X > 0, X =< _桝, Y > 0, Y =< _桝. 全ての升目を通過した(_桝,L,_経路) :- _桝2 is _桝 * _桝, length(L,_桝2), reverse(L,_経路). 度数(_副目標,_度数) :- findall(1,_副目標,L), length(L,_度数). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1242655611/792 # #[1] 授業単元: プログラミング演習 #[2] 問題文(含コード&リンク): 1~100の任意のN個の整数値を一次元配列に読み込み、そ の合計値と平均値を求め、 #               80~100,70~79,60~69,59以下の個数をそれぞれ出力する #プログラムを作りなさい。 #               (1)入力データ数(Nは10以上とする) #               (2)入力データ値(配列より読み出し、同じ値は使わない) #               (3)入力データの合計値、平均値 #               (4)入力データについて各ランクの個数 # #               (1)~(3)まではできたのですが、(4)がわかりません。 # #               http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9352.txt #               ↑これの続きにお願いします! '1~100の任意のN個の整数値を一次元配列に読み込み、その合計値と平均値を求め、80~100,70~79,60~69,59以下の個数をそれぞれ出力する' :- '1~100の任意のN個の整数値を一次元配列に読み込み、その合計値と平均値を求め、80~100,70~79,60~69,59以下の個数をそれぞれ出力する'(_合計,_平均,_データランクリスト), 集計項目の表示(_合計,_平均,_データランクリスト). '1~100の任意のN個の整数値を一次元配列に読み込み、その合計値と平均値を求め、80~100,70~79,60~69,59以下の個数をそれぞれ出力する'(_合計,_平均,_データランクリスト) :- 入力データ数を読み込む(_入力データ数), '1~100の任意の整数を読み込む'(_入力データ数,[],_入力データ値リスト), 入力データの集計(_入力データ値リスト,_入力データ数,[0,0,0,0],_データランクリスト,0,_合計,_平均). 集計項目の表示(_合計,_平均,_データランクリスト) :- writef('合計: %t\n平均: %t\n',[_合計,_平均]), list_length(_データランクリスト,_ランクの数), 入力データについて各ランクの個数(_ランク数,_データランクリスト). 入力データについて各ランクの個数(_ランク数,データランクリスト) :- for(1,N,_ランク数), データランク(_,N,_ランク表示), list_nth(N,_データランクリスト,_ランク集計値). writef('%t: %t\n',[_ランク表示,_ランク集計値]), N=_ランクの数. データランク(N,1,'80~100') :- N>=80,N=<100. データランク(N,2,'70~79') :- N>=70,N=<79. データランク(N,3,'60~69') :- N>=60,N=<69. データランク(N,4,'59以下') :- N<=59. 入力データの集計([],_入力データ数,_ランクL,_ランクL,_合計,_合計,_平均) :- _平均 is _合計 / _入力データ数,!. 入力データの集計([N|R],_入力データ数,_ランクL1,_ランクL,_合計_1,_合計,_平均) :- データランク(N,_位置,_), 位置要素に加算(_位置,1,_ランクL1,_ランクL2), 入力データの集計(R,_入力データ数,_ランクL2,_ランクL,_合計2,_合計,_平均). 位置要素に加算(1,N,[A|R],[B|R]) :- B is A+N,!. 位置要素に加算(P,N,[A|R1],[A|R2]) :- P2 is P-1,位置要素に加算(P2,N,R1,R2). 入力データ数を読み込む(_入力データ数) :- write('入力データ数を設定してください : '), get_line(Line), 入力データ数診断(Line,_入力データ数),!. 入力データ数を読み込み(_入力データ数) :- 入力データ数を読み込み(_入力データ数). 入力データ数診断(Line,_入力データ数) :- atom_to_term(Line,_入力データ数,_), integer(_入力データ数), _入力データ数 >= 10,!. 入力データ数診断(Line,_入力データ数) :- writef('入力された%tからは適切なデータ数が得られませんでした!\n10以上の整数を指定してください\n',[Line]), fail. '1~100の任意の整数を読み込む'(0,L,[]) :- !. '1~100の任意の整数を読み込む'(P,L,[N|R]) :- write('整数を入れてください(1~100) : '), get_line(Line), '1~100の任意の整数入力検査'(Line,N), P2 is P-1, '1~100の任意の整数を読み込む'(P2,[N|L],R),!. '1~100の任意の整数を読み込む'(P,L,X) :- '1~100の任意の整数を読み込む'(P,L,X). '1~100の任意の整数入力検査'(Line,N) :- atom_to_term(Line,N,_), integer(N), N >= 1, N =< 100,!. % 以下のサイトは 度数(_副目標,_度数) :- findall(1,_副目標,L), length(L,_度数). % *** user: count / 3 *** count(A,[],0). count(A,[A|R],X) :- count(A,R,Y), X is Y + 1. count(A,[_|R],X) :- count(A,R,X). % *** user: count / 2 *** count(P,Count) :- findall(1,P,L), length(L,N). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0). sum([A|R],Sum) :- sum(R,Sum2), Sum is A + Sum2.