このディレクトリの索引

% 以下のサイトは # p=1231, q=4567を選びます。 # eに65537 # e^-1=d mod φ(n) のdを計算して求めます。 #     d=3988493 # となります。 # # 暗号化と複合化の手順 # 公開鍵:N = 1231 * 4567 # E = 65537 # d = 3988493 # 文字コード:「a〜z」=01〜26、「A〜Z」=27〜52、空白=53 # 文書:This Anser p(1231). % 素数1 q(4567). % 素数2 法とする数(5621977). % 法とする数 公開鍵(65537). % 公開鍵 秘密鍵(3988493). % 秘密鍵 'RSA暗号化'(_文書,_暗号文字コードならび) :- 文書を文字コードで数値化します(_文書,_文字コードならび), 'RSA方式によるコード暗号化'(_文字コードならび,_暗号文字コードならび). 'RSA復号化'(_暗号文字コードならび,_文書) :- 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび), 文字コードならびから文書を復元します(_文字コードならび,_文書). 'RSA方式によるコード暗号化'(_文字コードならび,_暗号コードならび) :- 公開鍵(_公開鍵), 法とする数(_法とする数), findall(_暗号コード,( '_文字コードを_暗号コードに変換'(_文字コードならび,_公開鍵,_法とする数,_暗号コード)),_暗号コードならび). '_文字コードを_暗号コードに変換'(_文字コードならび,_公開鍵,_法とする数,_暗号コード) :- member(_文字コード,_文字コードならび), _暗号コード is _文字コード ^ _公開鍵 mod _法とする数. 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび) :- 秘密鍵(_秘密鍵), 法とする数(_法とする数), findall(_文字コード,( '_暗号文字コードを_文字コードに復号する'(_暗号文字コードならび,_秘密鍵,_法とする数,_文字コード)),_文字コードならび). '_暗号文字コードを_文字コードに復号する'(_暗号文字コードならび,_秘密鍵,_法とする数,_文字コード) :- member(_暗号文字コード,_暗号文字コードならび), _文字コード is _暗号文字コード ^ _秘密鍵 mod _法とする数. 文書を文字コードで数値化します(_文書,_文字コードならび) :- findall(_文字コード,( sub_atom(_文書,_,1,_,_文字), 文字コード(_文字,_文字コード)), _文字コードならび). 暗号コードを暗号文に変換(_暗号コードならび,_暗号文) :- findall(_暗号文字,( member(_暗号コード,_暗号コードならび), 文字コード(_暗号文字,_暗号コード)),_暗号文字ならび), atom_chars(_暗号文,_暗号文字ならび). 文字コードならびから文書を復元します(_文字コードならび,_文書) :- findall(_文字,( member(_文字コード,_文字コードならび), 文字コード(_文字,_文字コード)),_文字ならび), atom_chars(_文書,_文字ならび). 文字コード(_文字,_コード) :- char_code(_文字,_コード). '秘密鍵の候補'(_素数p,_素数q,_公開鍵,_秘密鍵) :- '_素数p_1と_素数q_1の最小公倍数'(_素数p,_素数q,_素数p_1と_素数q_1の最小公倍数), '((_素数p_1と_素数q_1の最小公倍数 * N + 1) / _公開鍵) が整数となる秘密鍵候補を得る'(_素数p_1と_素数q_1の最小公倍数,_公開鍵,_秘密鍵). '((_素数p_1と_素数q_1の最小公倍数 * N + 1) / _公開鍵) が整数となる秘密鍵候補を得る'(_素数p_1と_素数q_1の最小公倍数,_公開鍵,_秘密鍵) :- between(1,9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999,N), 0 is (_素数p_1と_素数q_1の最小公倍数 * N + 1) mod _公開鍵, _秘密鍵 is (_素数p_1と_素数q_1の最小公倍数 * N + 1) // _公開鍵. '_素数p_1と_素数q_1の最小公倍数'(_素数p,_素数q,_素数p_1と_素数q_1の最小公倍数) :- succ(_素数p_1,_素数p), succ(_素数q_1,_素数q), 最小公倍数(_素数p_1,_素数q_1,_素数p_1と_素数q_1の最小公倍数). 最小公倍数(_m,_n,_最小公倍数) :- Y is _m * _n, ユークリッドの互除法により最大公約数を得る(_m,_n,_最大公約数), _最小公倍数 is ( _m * _n ) // _最大公約数. 'ユークリッドの互除法により最大公約数を得る'(_m,_m,_m). 'ユークリッドの互除法により最大公約数を得る'(_m,_n,_最大公約数) :- _m > _n, _剰余 is _m mod _n, ユークリッドの互除法により最大公約数を得る(_m,_n,_剰余,_最大公約数). 'ユークリッドの互除法により最大公約数を得る'(_m,_n,_最大公約数) :- _m < _n, ユークリッドの互除法により最大公約数を得る(_n,_m,_最大公約数). ユークリッドの互除法により最大公約数を得る(_,_最大公約数,0,_最大公約数) :- !. ユークリッドの互除法により最大公約数を得る(_m,_n,_剰余,_最大公約数) :- 'ユークリッドの互除法により最大公約数を得る'(_n,_剰余,_最大公約数). % 以下のサイトは # 出典 :: 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(_ヘッドゼロサプライ数値表現,_ヘッドゼロサプライされたリスト). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #48 # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/5oepZpDW # #include # double heikin(int a[]); # # int main(void) # { # int data[5],i; # double ave; # for (i=0;i<=4;i++) # { # printf("data[%d]= ",i); # scanf("%d",&data[i]); # } # ave=heikin(data); # printf("heikin=%f \n",ave); # return 0; # } # # double heikin(int a[]) # { # int i,k=0; # for(i=0;i<=4;i++) # { # k=k+a[i]; # } # return((double)k/5); # } # 上記のプログラムに5人の得点(10点満点)を受け取ると、合格者数を戻すgoukaku関数を追加せよ、但し6点以上で合格とする。 # そして5人のテストの得点を整数型配列data[5]の要素にそれぞれ入力すると # 5人の平均点に加えて合格者数も出力するプログラムをheikin関数およびgoukaku関数を利用して作成しなさい。 # '5人の得点(10点満点)を受け取ると、合格者数を戻す述語を定義する。但し6点以上で合格とする。そして5人のテストの得点を入力すると5人の平均点に加えて合格者数も出力する。' :- '5人の得点(10点満点)を受け取ると'(_5人の得点ならび), 平均点を出力する(_5人の得点ならび), '6点以上を取った合格者数を出力する'(_5人の得点ならび). 平均点を出力する(_5人の得点ならび) :- 平均点を戻す(_5人の得点ならび,_平均点), writef('平均点 = %w 点\n',[_平均点]). 平均点を戻す(_5人の得点ならび,_平均点) :- sum_list(_5人の得点ならび,_合計点), _平均点 is _合計点 / 5. '6点以上を取った合格者数を出力する'(_5人の得点ならび) :- '6点以上を取った合格者数を戻す'(_5人の得点ならび,_合格者数), writef('合格者数 = %w 人\n',[_合格者数]). '5人の得点(10点満点)を受け取ると'(_5人の得点ならび) :- findall(_得点,( between(1,5,_), 得点を受け取る(_得点)),_5人の得点ならび). 得点を受け取る(_得点) :- 行入力(_行), '診断: 得点を受け取る'(_行,_得点),!. 得点を受け取る(_得点) :- 得点を受け取る(_得点). '診断: 得点を受け取る'(_行,_得点) :- 行文字列を解析して0から10の範囲の得点を得る(_行,_得点),!. '診断: 得点を受け取る'(_行,_得点) :- writef('入力された %w からは適切な得点が得られません。再入力をお願いします。\n',[_行]), fail. 行文字列を解析して0から10の範囲の得点を得る(_行,_得点) :- 行文字列を解析して(_行,_得点), '0から10の範囲の得点を得る'(_得点). 行文字列を解析して(_行,_得点) :- read_term_from_atom(_行,_得点,[]). '0から10の範囲の得点を得る'(_得点) :- integer(_得点), member(_得点,[0,1,2,3,4,5,6,7,8,9,10]). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). '6点以上を取った合格者数を戻す'(_5人の得点ならび,_合格者数) :- findall(_,( '6点以上で合格とする'(_5人の得点ならび)),L), length(L,_合格者数). '6点以上で合格とする'(_5人の得点ならび) :- member(_得点,_5人の得点ならび), _得点 >= 6. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/282 # お題:1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 # のこりの数からとりのぞいた2個の数を求める。 # 例 # 3,1,2,6 -> 4,5 # # '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 のこりの数からとりのぞいた2個の数を求める。'(_n,_とりのぞいた数_1,_とりのぞいた数_2) :- '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_1からnまでのn個の連続した整数,_2個をとりのぞいたのこりの数), 'のこりの数からとりのぞいた2個の数を求める。'(_1からnまでのn個の連続した整数,_2個をとりのぞいたのこりの数,[],[_とりのぞいた数_1,_とりのぞいた数_2]). '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_1からnまでのn個の連続した整数,_2個をとりのぞいたのこりの数) :- '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数), シャッフルして(_n,_1からnのn個の連続した整数,_シャッフルした1からnのn個の連続した整数), '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数). '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数) :- findall(M,between(1,_n,M),_1からnのn個の連続した整数). シャッフルして(_n,L1,L2) :- シャッフルして(1000,_n,L1,L2),!. シャッフルして(0,_,L,L). シャッフルして(M,_n,L1,L) :- R is random(_n) + 1, select(R,L1,L2), M_1 is M - 1, シャッフルして(M_1,_n,[R|L2],L). '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :- _シャッフルした1からnのn個の連続した整数=[_,_|_2個をとりのぞいたのこりの数]. 'のこりの数からとりのぞいた2個の数を求める。'(_1からnのn個の連続した整数,_2個をとりのぞいたのこりの数,X) :- sort(_2個をとりのぞいたのこりの数,_整列した2個をとりのぞいたのこりの数), 欠番を2個求める(_1からnのn個の連続した整数,_整列した2個をとりのぞいたのこりの数,[],X). 欠番を2個求める(_,_,[X1,X2],[X1,X2]) :- !. 欠番を2個求める(L1,L2,Y,X) :- 欠番を2個見つけるまで探索する(L1,L2,Y,Z). 欠番を2個見つけるまで探索する([A|R1],[A|R2],Y,Z) :- 欠番を2個求める(R1,R2,Y,X). 欠番を2個見つけるまで探索する([A|R1],[B|R2],Y,X) :- A\==B, 欠番を2個求める(R1,[B|R2],[A|Y],X). % 以下のサイトは # 出典 :: プログラミングのお題スレ Part8?2ch.net # お題:nで始まる最小の素数を求める # n=4 -> 41 # n=777 -> 77711 # n=403 -> 40343 nで始まる最小の素数を求める(_n,_nで始める最小の素数) :- nで始まる最小の素数を求める(_n,0,_nで始める最小の素数),!. nで始まる最小の素数を求める(_n,_m,_nで始める最小の素数) :- 探索範囲を定めその中に素数が現れたら停止する(_n,_m,_nで始める最小の素数). nで始まる最小の素数を求める(_n,_m,_nで始める最小の素数) :- 下位桁を増やしながらnで始まる最小の素数を求める(_n,_m,_nで始める最小の素数). 探索範囲を定めその中に素数が現れたら停止する(_n,_m,_nで始める最小の素数) :- 探索範囲を求める(_n,_m,_n_1,_n_2), 非決定性の素数生成(_n_2,_nで始める最小の素数), _nで始める最小の素数 >= _n_1. 探索範囲を求める(_n,_m,_n_1,_n_2) :- _n_1 is _n * 10 ^ _m, _n_2 is ( _n + 1 ) * 10 ^ _m - 1. 下位桁を増やしながらnで始まる最小の素数を求める(_n,_m,_nで始める最小の素数) :- succ(_m,_m_2), nで始まる最小の素数を求める(_n,_m_2,_nで始める最小の素数). 非決定性の素数生成(_限界値,_素数) :- findall(N,between(2,_限界値,N),L), 非決定性のエラトステネスの篩(L,_素数). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|L1],_素数) :- 先頭の素数を網として篩に掛けて行く(L1,_要素,'_要素はNで割り切れる'(_要素,N),_素数). 先頭の素数を網として篩に掛けて行く(L1,_要素,_副目標,_素数) :- 'L1の要素で_副目標を真とするものを篩に掛ける'(L1,_要素,_副目標,L2), 非決定性のエラトステネスの篩(L2,_素数). 'L1の要素で_副目標を真とするものを篩に掛ける'(L1,_要素,_副目標,L2) :- findall(_要素,( 'L1の要素で'(L1,_要素), '_副目標を真とするものを篩に掛ける'(_副目標)),L2). 'L1の要素で'(L1,_要素) :- member(_要素,L1). '_副目標を真とするものを篩に掛ける'(_副目標) :- \+(_副目標). '_要素はNで割り切れる'(_要素,N) :- 0 is _要素 mod N. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 137代目 #936 # お手上げです。頑張ったのですが、できませんでした。 # 申し訳ないですけどお願いします。 # # 問題 # # 複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力するプログラムを作成せよ. # # 【実行例】 # # 何個の文字列を入力しますか?:4 # 入力文字列[1]:Computer # 入力文字列[2]:Science # 入力文字列[3]:Tarou # 入力文字列[4]:Tanaka # # 繋ぎ合わせる順番: # 2 # 4 # 3 # 1 # # 結果:ScienceTanakaTarouComputer # '複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する' :- '複数の文字列を読み込み,'(_複数の,_入力文字列ならび), 'さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する'(_複数の,_入力文字列ならび). '複数の文字列を読み込み,'(_複数の,_入力文字列ならび) :- 複数の(_複数の), findall(_行,( 文字列を読み込み(_複数の,_行)),_入力文字列ならび). 複数の(_複数の) :- 整数を得る('何個の文字列を入力しますか?: ',true,_複数の), writef('文字列を%w行連続して入力してください\n',[_複数の]). 文字列を読み込み(_複数の,_行) :- between(1,_複数の,_), 行入力(_行). 'さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する'(_複数の,_入力文字列ならび) :- 'さらに,それらの文字列を繋ぎ合わせる順番を入力し'(_複数の,_取り出し順ならび), 結果を出力する(_入力文字列ならび,_取り出し順ならび). 'さらに,それらの文字列を繋ぎ合わせる順番を入力し'(_複数の,_取り出し順ならび) :- write('入力した文字列を繋ぎ合わせる順番を入力してください\n'), それらの文字列を繋ぎ合わせる順番を入力し(_複数の,_取り出し順ならび). それらの文字列を繋ぎ合わせる順番を入力し(_複数の,_取り出し順ならび) :- findall(_番目,( 順番を入力し(_複数の,_番目)),_取り出し順ならび). 順番を入力し(_複数の,_番目) :- between(1,_複数の,_), 整数を得る(_番目). 整数を得る(_番目) :- 整数を得る('',true,_番目). 結果を出力する(_入力文字列ならび,_取り出し順ならび) :- 結果を(_入力文字列ならび,_取り出し順ならび,_指定した順番の文字列ならび), 出力する(_指定した順番の文字列ならび). 結果を(_入力文字列ならび,_取り出し順ならび,_指定した順番の文字列ならび) :- findall(_文字列,( 指定順に取り出す(_入力文字列ならび,_取り出し順ならび,_文字列)),_指定した順番の文字列ならび). 指定順に取り出す(_入力文字列ならび,_取り出し順ならび,_文字列) :- member(_番目,_取り出し順ならび), nth1(_番目,_入力文字列ならび,_文字列). 出力する(_指定した順番の文字列ならび) :- 文字列を指定した順番に繋ぎ合わせて(_指定した順番の文字列ならび,_表示文字列), writef('繋ぎ合わせた文字列は: %w\n',[_表示文字列]). 文字列を指定した順番に繋ぎ合わせて(_指定した順番の文字列ならび,_表示文字列) :- atomic_list_concat(_指定した順番の文字列ならび,_表示文字列). 整数を得る(_催促文,_条件,_整数) :- 以下の入力に失敗した場合は再入力する, '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 以下の入力に失敗した場合は再入力する :- repeat. '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- call(_条件). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは 'a-zを50回繰り返し、その文字列のn番目のnが素数かつその数値文字列の中に3を含まないものは、大文字に変換する'(_目標文字列) :- '小文字のa-zを50回繰り返したならびと大文字のA-Zを50回繰り返したならび'(_小文字ならび,_大文字ならび), 'エラトステネスの篩の変形'(_大文字ならび,Lx), 第二引数のならびの変数を第一引数の同一位置要素で埋めて文字列に変換する(_小文字ならび,Lx,_目標文字列). 第二引数のならびの変数を第一引数の同一位置要素で埋めて文字列に変換する(_小文字ならび,Lx,_目標文字列) :- 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く(_小文字ならび,Lx), atom_chars(_目標文字列,Lx). 第二引数のならびの変数を第一引数の同一位置要素で埋める([],[]). 第二引数のならびの変数を第一引数の同一位置要素で埋める(L1,L2) :- 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く(L1,L2). 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く([A|R1],[B|R2]) :- 第二引数が変数の時は第一引数と単一化(A,B), 第二引数のならびの変数を第一引数の同一位置要素で埋める(R1,R2). 第二引数が変数の時は第一引数と単一化(A,A) :- !. 第二引数が変数の時は第一引数と単一化(A,B). '小文字のa-zを50回繰り返したならびと大文字のA-Zを50回繰り返したならび'(L1,L2) :- '小文字のa-zを50回繰り返したならびと'(L1), '大文字のA-Zを50回繰り返したならび'(L2). '小文字のa-zを50回繰り返したならびと'(L1) :- findall(A,( between(1,50,_), sub_atom(abcdefghijklmnopqrstuvwxyz,_,1,_,A)),L1). '大文字のA-Zを50回繰り返したならび'(L2) :- findall(A,( between(1,50,_), sub_atom('ABCDEFGHIJKLMNOPQRSTRVWXYZ',_,1,_,A)),L2). 素数でその数値文字列に3を含まない時大文字で挿入する(_大文字ならび,L) :- findall(N,between(2,1300,N),_篩候補), length(L,1300), '素数でその数値文字列に3を含まない時大文字で挿入する'(_篩候補,_大文字ならび,L). '素数でその数値文字列に3を含まない時大文字で挿入する'([],_大文字ならび,L) :- !. '素数でその数値文字列に3を含まない時大文字で挿入する'([A|R1],_大文字ならび,L) :- '数字列に3を含まない時は大文字を素数の位置に挿入'(A,_大文字ならび,L), '素数でその数値文字列に3を含まない時大文字で挿入する'(A,R1,R2,_大文字ならび,L), '素数でその数値文字列に3を含まない時大文字で挿入する'(R2,_大文字ならび,L). '素数でその数値文字列に3を含まない時大文字で挿入する'(_,[],[],_大文字ならび,L) :- !. '素数でその数値文字列に3を含まない時大文字で挿入する'(N,[A|R1],R,_大文字ならび,L) :- 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L). 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L) :- 'AがNで割り切れたらそのまま篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L). 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L) :- 'AがNで割り切れなかったら篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L). 'AがNで割り切れたらそのまま篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L) :- 0 is A mod N, '素数でその数値文字列に3を含まない時大文字で挿入する'(N,R1,R,_大文字ならび,L),!. 'AがNで割り切れなかったら篩を掛け続ける'(N,[A|R1],[A|R2],_大文字ならび,L) :- '素数でその数値文字列に3を含まない時大文字で挿入する'(N,R1,R2,_大文字ならび,L). '数字列に3を含まない時は大文字を素数の位置に挿入'(N,_大文字ならび,L) :- 数字列に3を含まない時は(N,_大文字ならび), 大文字を素数の位置に挿入(N,_大文字ならび,L),!. '数字列に3を含まない時は大文字を素数の位置に挿入'(_,_,L). 数字列に3を含まない時は(N,_大文字ならび) :- number_chars(N,Chars), \+(member('3',Chars)). 大文字を素数の位置に挿入(N,_大文字ならび,L) :- nth1(N,_大文字ならび,A), nth1(N,L,A). % 以下のサイトは 行の部分二乗和(_行列,_何行目,_列起点,_列終点,_部分列の二乗和) :- nth1(_何行目,_行列,_行), findsum(_値の二乗,( 値を取り出し二乗する(_行,_列起点,_列終点,_値の二乗)),_部分列の二乗和). 値を取り出し二乗する(_行,_列起点,_列終点,_値の二乗) :- between(_列起点,_列終点,_何列目), 何列目の値の二乗(_行,_何列目,_値の二乗). 何列目の値の二乗(_行,_何列目,_値の二乗) :- nth1(_何列目,_行,_値), _値の二乗 is _値 ^ 2. findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは 列の部分二乗和(_行列,_行起点,_行終点,_何列目,_部分列の二乗和) :- findsum(_値の二乗,( 列の部分から値を取り出し二乗する(_行列,_行起点,_行終点,_何列目,_値の二乗)),_部分列の二乗和). 列の部分から値を取り出し二乗する(_行列,_行起点,_行終点,_何列目,_値の二乗) :- between(_行起点,_行終点,_何行目), 何行目の値の二乗(_行列,_何行目,_何列目,_値の二乗),_値の二乗). 何行目の値の二乗(_行列,_何行目,_何列目,_値の二乗) :- nth1(_何行目,_行列,_行), nth1(_何列目,_行,_値), _値の二乗 is _値 ^ 2. findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは 連続日(_前の日の年/_前の日の月/_前の日の日,_後の日の年/_後の日の月/_後の日の日) :- 月日生成(_前の日の年,_前の日の月,_前の日の日,_後の日の年,_後の日の月,_後の日の日), 翌日(_前の日の年,_前の日の月,_前の日の日,_後の日の年,_後の日の月,_後の日の日), 日付成立検査(_前の日の年,_前の日の月,_前の日の日,_後の日の年,_後の日の月,_後の日の日). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- succ(_月,_翌日の月),月末日(_年,_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). 月末日(_年,2,29) :- うるう年(_年),!. 月末日(_年,2,28) :- \+(うるう年(_年)),!. 月末日(_年,_月,30) :- \+(_月 = 2), 小の月(_月). 月末日(_年,_月,31) :- 大の月(_月). 小の月(2). 小の月(4). 小の月(6). 小の月(9). 小の月(11). 大の月(1). 大の月(3). 大の月(5). 大の月(7). 大の月(8). 大の月(10). 大の月(12). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 月日生成(_前の日の年,_前の日の月,_前の日の日,_後の日の年,_後の日の月,_後の日の日) :- 月生成(_前の日の月), 日生成(_前の日の日), 月生成(_後の日の月), 日生成(_後の日の日). 月生成(_月) :- between(1,12,_月). 日生成(_日) :- between(1,31,_日). 日付成立検査(_年,2,_日,_,2,_) :- '二月の日はうるう年が29以下、うるう年でなければ28以下'(_年,_日),!. 日付成立検査(_年,2,_日,_年,3,_) :- '二月の日はうるう年が29以下、うるう年でなければ28以下'(_年,_日),!. 日付成立検査(_年,_月,_日,_,_,_) :- '二月以外の日は月は大の月が31以下、小の月は30以下'(_月,_日). '二月以外の日は月は大の月が31以下、小の月は30以下'(_月,_日) :- 大の月(_月), _日 =< 31. '二月以外の日は月は大の月が31以下、小の月は30以下'(_月,_日) :- \+(_月 = 2), 小の月(_月), _日 =< 30. '二月の日はうるう年が29以下、うるう年でなければ28以下'(_年,_日) :- うるう年(_年), _日 =< 29. '二月の日はうるう年が29以下、うるう年でなければ28以下'(_年,_日) :- \+(うるう年(_年)), _日 =< 28. % 以下のサイトは 連続日(_前の日の年/_前の日の月/_前の日の日,_後の日の年/_後の日の月/_後の日の日) :- 月生成(_前の日の月), 日生成(_前の日の日), 月生成(_後の日の月), 日生成(_後の日の日), 翌日(_前の日の年,_前の日の月,_前の日の日,_後の日の年,_後の日の月,_後の日の日), 日付成立検査(_前の日の年,_前の日の月,_前の日の日). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- succ(_月,_翌日の月),月末日(_年,_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). 月末日(_年,2,29) :- うるう年(_年),!. 月末日(_年,2,28) :- \+(うるう年(_年)),!. 月末日(_年,_月,30) :- 小の月(_月). 月末日(_年,_月,31) :- 大の月(_月). 小の月(2). 小の月(4). 小の月(6). 小の月(9). 小の月(11). 大の月(1). 大の月(3). 大の月(5). 大の月(7). 大の月(8). 大の月(10). 大の月(12). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 月生成(_月) :- between(1,12,_月). 日生成(_日) :- between(1,31,_日). 日付成立検査(_年,2,_日) :- うるう年(_年), _日 =< 29,!. 日付成立検査(_年,2,_日) :- \+(うるう年(_年)), _日 =< 28,!. 日付成立検査(_年,_月,_日) :- 大の月(_月), _日 =< 31. 日付成立検査(_年,_月,_日) :- \+(_月=2), 小の月(_月), _日 =< 30. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/887 # # (1)c言語(2)問題:ベースを基にビットを左に回転させるleft_rottate関数を追加しプログラムを完成させよ。 # 実行結果: # 数値f0f0のビット状態 # 1111000011110000 # 3ビット回転させました # 数値8787のビット状態 # 1000011110000111 # ベース # #include <stdio.h> # void print_bit(unsigned short int x); //プロトタイプ宣言 # int main(){ # unsigned short int usi; # usi = 0xf0f0 ; # print_bit(usi); # return 0; //システムに値0を返す # } # void print_bit(unsigned short int x){ # int length , i , mask ; # mask = 1; # length = sizeof(x) *8; # mask =mask << (length -1); # printf("数値%xのビット状態\n",x); # for(i = 1;i<= length ; i++){ # if(x & mask){ # printf("1"); # }else{ # printf("0"); # } # mask =mask >> 1; # } # printf("\n"); # } # # '2進ならびの左回転'(_ベース桁数,_数,_Nビット回転) :- 'ベース桁数を確保して数2進数変換'(_ベース桁数,_数,_2進数ならび), '2進数を_Nビット左回転して、それを16進数と2進数で表示する'(_ベース桁数,_Nビット回転,_2進数ならび),!. 'ベース桁数を確保して数2進数変換'(_ベース桁数,_数,_ベース桁数で規定された2進数ならび) :- 数2進数変換(_数,_2進数ならび), ベース桁数付き二進数(_ベース桁数,_2進数ならび,_ベース桁数で規定された2進数ならび). '数2進数変換'(_数,_2進数ならび) :- '数2進数変換'(_数,[],_2進数ならび). '数2進数変換'(0,_2進数ならび,_2進数ならび). '数2進数変換'(N,L,_2進数ならび) :- '数2進数変換して行く'(N,L,_2進数ならび). '数2進数変換して行く'(N,L,_2進数ならび) :- M is N mod 2, N_1 is N // 2, '数2進数変換'(N_1,[M|L],_2進数ならび). '2進数を_Nビット左回転して、それを16進数と2進数で表示する'(_ベース桁数,_Nビット回転,_2進数ならび) :- '2進数を_Nビット左回転して、'(_Nビット回転,_2進数ならび,L,_2進表示), それを16進数と2進数で表示する(_Nビット回転,L,_2進表示). '2進数を_Nビット左回転して、'(_Nビット回転,_ベース桁数2進数ならび,L,_2進表示) :- ならびの左回転(1,_Nビット回転,_ベース桁数2進数ならび,L), atomic_list_concat(L,_2進表示). ベース桁数付き二進数(_ベース桁数,_2進数ならび,_ベース桁数で規定された2進数ならび) :- length(_2進数ならび,_桁), _0を付加するべき数 is _ベース桁数 - _桁, 頭部に0を付加する(_0を付加するべき数,_2進数ならび,_ベース桁数で規定された2進数ならび). 頭部に0を付加する(0,_ベース桁数で規定された2進数ならび,_ベース桁数で規定された2進数ならび). 頭部に0を付加する(N,_2進数ならび,_ベース桁数で規定された2進数ならび) :- N \== 0, 'N桁の0ならび'(N,_N桁の0ならび), append(_N桁の0ならび,_2進数ならび,_ベース桁数で規定された2進数ならび). 'N桁の0ならび'(N,_N桁の0ならび) :- length(_N桁の0ならび,N), all(_N桁の0ならび,0). all([],_). all([N|R],N) :- all(R,N). ならびの左回転(N,N,[A|R],L) :- append(R,[A],L),!. ならびの左回転(M,N,[A|R],L) :- append(R,[A],L1), M2 is M + 1, ならびの左回転(M2,N,L1,L). それを16進数と2進数で表示する(_Nビット回転,L,_2進表示) :- writef('%wビット回転しました\n数値 ',[_Nビット回転]), '16進数で表示する'(L), '2進数で表示する'(_2進表示). '16進数で表示する'(_2進ならび) :- '桁数が4の倍数になるように頭部を整形'(_2進ならび,_整形された2進ならび), '2進数16進数表示'(_整形された2進ならび). '桁数が4の倍数になるように頭部を整形'(_2進ならび,_整形された2進ならび) :- length(_2進ならび,_桁), _余り is _桁 mod 4, '頭部に0を付加する'(_余り,_2進ならび,_整形された2進ならび). '頭部に0を付加する'(0,L,L). '頭部に0を付加する'(1,L,[0,0,0|L]). '頭部に0を付加する'(2,L,[0,0|L]). '頭部に0を付加する'(3,L,[0|L]). '2進数で表示する'(_2進表示) :- write('のビット状態\n'), writef('%w\n',[_2進表示]). '2進数16進数表示'([]) :- write('\n'),!. '2進数16進数表示'([_b1,_b2,_b3,_b4|R]) :- '4ビット数ならび16進表記'([_b1,_b2,_b3,_b4],_16進表記), writef('%w',[_16進表記]), '2進数16進数表示'(R). '4ビット数ならび16進表記'([0,0,0,0],'0'). '4ビット数ならび16進表記'([0,0,0,1],'1'). '4ビット数ならび16進表記'([0,0,1,0],'2'). '4ビット数ならび16進表記'([0,0,1,1],'3'). '4ビット数ならび16進表記'([0,1,0,0],'4'). '4ビット数ならび16進表記'([0,1,0,1],'5'). '4ビット数ならび16進表記'([0,1,1,0],'6'). '4ビット数ならび16進表記'([0,1,1,1],'7'). '4ビット数ならび16進表記'([1,0,0,0],'8'). '4ビット数ならび16進表記'([1,0,0,1],'9'). '4ビット数ならび16進表記'([1,0,1,0],'a'). '4ビット数ならび16進表記'([1,0,1,1],'b'). '4ビット数ならび16進表記'([1,1,0,0],'c'). '4ビット数ならび16進表記'([1,1,0,1],'d'). '4ビット数ならび16進表記'([1,1,1,0],'e'). '4ビット数ならび16進表記'([1,1,1,1],'f'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/887 # # (1)c言語(2)問題:ベースを基にビットを左に回転させるleft_rottate関数を追加しプログラムを完成させよ。 # 実行結果: # 数値f0f0のビット状態 # 1111000011110000 # 3ビット回転させました # 数値8787のビット状態 # 1000011110000111 # ベース # #include <stdio.h> # void print_bit(unsigned short int x); //プロトタイプ宣言 # int main(){ # unsigned short int usi; # usi = 0xf0f0 ; # print_bit(usi); # return 0; //システムに値0を返す # } # void print_bit(unsigned short int x){ # int length , i , mask ; # mask = 1; # length = sizeof(x) *8; # mask =mask << (length -1); # printf("数値%xのビット状態\n",x); # for(i = 1;i<= length ; i++){ # if(x & mask){ # printf("1"); # }else{ # printf("0"); # } # mask =mask >> 1; # } # printf("\n"); # } # # '2進ならびの左回転'(_ベース桁数,_数,_Nビット回転) :- 'ベース桁数を確保して数2進数変換'(_ベース桁数,_数,_2進数ならび), '2進数を_Nビット左回転して、それを16進数と2進数で表示する'(_ベース桁数,_Nビット回転,_2進数ならび),!. 'ベース桁数を確保して数2進数変換'(_ベース桁数,_数,_ベース桁数で規定された2進数ならび) :- 数2進数変換(_数,_2進数ならび), ベース桁数付き二進数(_ベース桁数,_2進数ならび,_ベース桁数で規定された2進数ならび). '数2進数変換'(_数,_2進数ならび) :- '数2進数変換'(_数,[],_2進数ならび). '数2進数変換'(0,_2進数ならび,_2進数ならび). '数2進数変換'(N,L,_2進数ならび) :- '数2進数変換して行く'(N,L,_2進数ならび). '数2進数変換して行く'(N,L,_2進数ならび) :- M is N mod 2, N_1 is N // 2, '数2進数変換'(N_1,[M|L],_2進数ならび). '2進数を_Nビット左回転して、それを16進数と2進数で表示する'(_ベース桁数,_Nビット回転,_2進数ならび) :- '2進数を_Nビット左回転して、'(_Nビット回転,_2進数ならび,L,_2進表示), それを16進数と2進数で表示する(_Nビット回転,L,_2進表示). '2進数を_Nビット左回転して、'(_Nビット回転,_ベース桁数2進数ならび,L,_2進表示) :- ならびの左回転(1,_Nビット回転,_ベース桁数2進数ならび,L), atomic_list_concat(L,_2進表示). ベース桁数付き二進数(_ベース桁数,_2進数ならび,_ベース桁数で規定された2進数ならび) :- length(_2進数ならび,_桁), _0を付加するべき数 is _ベース桁数 - _桁, 頭部に0を付加する(_0を付加するべき数,_2進数ならび,_ベース桁数で規定された2進数ならび). 頭部に0を付加する(0,_ベース桁数で規定された2進数ならび,_ベース桁数で規定された2進数ならび). 頭部に0を付加する(N,_2進数ならび,_ベース桁数で規定された2進数ならび) :- N \== 0, 'N桁の0ならび'(N,_N桁の0ならび), append(_N桁の0ならび,_2進数ならび,_ベース桁数で規定された2進数ならび). 'N桁の0ならび'(N,_N桁の0ならび) :- length(_N桁の0ならび,N), all(_N桁の0ならび,0). all([],_). all([N|R],N) :- all(R,N). ならびの左回転(N,N,[A|R],L) :- append(R,[A],L),!. ならびの左回転(M,N,[A|R],L) :- append(R,[A],L1), M2 is M + 1, ならびの左回転(M2,N,L1,L). それを16進数と2進数で表示する(_Nビット回転,L,_2進表示) :- writef('%wビット回転しました\n数値 ',[_Nビット回転]), '16進数で表示する'(L), '2進数で表示する'(_2進表示). '16進数で表示する'(_2進ならび) :- '桁数が4の倍数になるように頭部を整形'(_2進ならび,_整形された2進ならび), '2進数16進数表示'(_整形された2進ならび). '桁数が4の倍数になるように頭部を整形'(_2進ならび,_整形された2進ならび) :- length(_2進ならび,_桁), _余り is _桁 mod 4, '頭部に0を付加する'(_余り,_2進ならび,_整形された2進ならび). '頭部に0を付加する'(0,L,L). '頭部に0を付加する'(1,L,[0,0,0|L]). '頭部に0を付加する'(2,L,[0,0|L]). '頭部に0を付加する'(3,L,[0|L]). '2進数で表示する'(_2進表示) :- write('のビット状態\n'), writef('%w\n',[_2進表示]). '2進数16進数表示'([]) :- write('\n'),!. '2進数16進数表示'([_b1,_b2,_b3,_b4|R]) :- '4ビット数ならび16進表記'([_b1,_b2,_b3,_b4],_16進表記), writef('%w',[_16進表記]), '2進数16進数表示'(R). '4ビット数ならび16進表記'([0,0,0,0],'0'). '4ビット数ならび16進表記'([0,0,0,1],'1'). '4ビット数ならび16進表記'([0,0,1,0],'2'). '4ビット数ならび16進表記'([0,0,1,1],'3'). '4ビット数ならび16進表記'([0,1,0,0],'4'). '4ビット数ならび16進表記'([0,1,0,1],'5'). '4ビット数ならび16進表記'([0,1,1,0],'6'). '4ビット数ならび16進表記'([0,1,1,1],'7'). '4ビット数ならび16進表記'([1,0,0,0],'8'). '4ビット数ならび16進表記'([1,0,0,1],'9'). '4ビット数ならび16進表記'([1,0,1,0],'a'). '4ビット数ならび16進表記'([1,0,1,1],'b'). '4ビット数ならび16進表記'([1,1,0,0],'c'). '4ビット数ならび16進表記'([1,1,0,1],'d'). '4ビット数ならび16進表記'([1,1,1,0],'e'). '4ビット数ならび16進表記'([1,1,1,1],'f'). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 145代目 #749 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):ー由に文字列を定義して、その文字列のn番目の文字を表示するプログラムを作れ。 #                ⊆由に文字列を定義して、n番目以降の文字をすべて表示するプログラムを作れ。 #                自由に文字列を定義して、n番目からo番目(n<=o)の文字を表示するプログラムを作れ。 # '自由に文字列を定義して、その文字列のn番目の文字を表示する'(_文字列,_n番目) :- succ(_変位,_n番目), sub_atom(_文字列,_変位,1,_,_文字), writef('%w',[_文字]). '自由に文字列を定義して、n番目以降の文字をすべて表示する'(_文字列,_n番目) :- succ(_変位,_n番目), sub_atom(_文字列,_変位,_,0,_副文字列), writef('%w',[_副文字列]). '自由に文字列を定義して、n番目からo番目(n<=o)の文字を表示する'(_文字列,_n番目,_o番目) :- 'n番目からo番目(n<=o)の文字を'(_文字列,_n番目,_o番目,_文字ならび), 表示する(_文字ならび). 'n番目からo番目(n<=o)の文字を'(_文字列,_n番目,_o番目,_文字ならび) :- findall(_文字,( '変位Mの文字を取り出す'(_文字列,_n番目,_o番目,_変位M,_文字)),_文字ならび). '変位Mの文字を取り出す'(_文字列,_n番目,_o番目,_変位_M,_文字) :- 変位に変換(_n番目,_o番目,_変位_n番目,_変位_o番目), between(_変位_n番目,_変位_o番目,_変位_M), sub_atom(_文字列,_変位_M,1,_,_文字). 変位に変換(_n番目,_o番目,_変位_n番目,_変位_o番目) :- succ(_変位_n番目,_n番目), succ(_変位_o番目,_o番目). 表示する(_文字ならび) :- atomic_list_concat(_文字ならび,_副文字列), writef('%w',[_副文字列]). /* for(S,S,S) :- !. for(S,S,E). for(S,N,E) :- succ(S,E,S1), for(S1,N,E). succ(S,E,S1) :- S =< E, succ(S,S1),!. succ(S,E,S1) :- S > E, succ(S1,S). */ % 以下のサイトは 九九表([ [1,2,3,3,4,6,7,8,9], [2,4,6,8,10,12,14,16,18], [3,6,9,12,15,18,21,24,27], [4,8,12,16,20,24,28,32,36], [5,10,15,20,25,30,35,40,45], [6,12,18,24,30,36,42,48,54], [7,14,21,28,35,42,49,56,63], [8,16,24,32,40,48,56,64,72], [9,18,27,36,45,54,63,72,81]]). '「21÷7 の計算は、九九表をどのように辿れば答えがえられますか?」ならば全然問題がないように思いますが。'(_答え,_段) :- 九九表(_九九表), 表の中から21を捜す(_九九表,_段,_列,_答え). 表の中から21を捜す(_九九表,_段,_列,_答え) :- 段と列の候補を挙げる(_段,_列), '21を得る'(_九九表,_段,_列), 答えは(_段,_列,_答え). 段と列の候補を挙げる(_段,_列) :- between(1,9,_段), between(1,9,_列). '21を得る'(_九九表,_段,_列) :- nth1(_段,_九九表,_九九表の行), nth1(_列,_九九表の行,21). 答えは(7,_列,_列) :- !. 答えは(_段,7,_段). % 以下のサイトは 九九表([ [1,2,3,3,4,6,7,8,9], [2,4,6,8,10,12,14,16,18], [3,6,9,12,15,18,21,24,27], [4,8,12,16,20,24,28,32,36], [5,10,15,20,25,30,35,40,45], [6,12,18,24,30,36,42,48,54], [7,14,21,28,35,42,49,56,63], [8,16,24,32,40,48,56,64,72], [9,18,27,36,45,54,63,72,81]]). '「21÷7 の計算は、九九表をどのように辿れば答えがえられますか?」ならば全然問題がないように思いますが。'(_答え,_段) :- 九九表(_九九表), 表の中から21を捜す(_九九表,_段,_列,_答え). 表の中から21を捜す(_九九表,_段,_列,_答え) :- 段と列の候補を挙げる(_段,_列), '21を得る'(_九九表,_段,_列), 答えは(_段,_列,_答え). 段と列の候補を挙げる(_段,_列) :- between(1,9,_段), between(1,9,_列). '21を得る'(_九九表,_段,_列) :- nth1(_段,_九九表,_九九表の行), nth1(_列,_九九表の行,21). 答えは(7,_列,_列) :- !. 答えは(_段,7,_段). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #880 # [1]授業単元:C言語 # [2]問題文 # マインスイーパのような爆弾ゲームプログラムを作成する。 # 1. マス目を8× 8に設定する。 # 2. 爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)。 # 3.まだ指定していないマス目には数字の0の代わりに記号'-'を表示する。 # 4.爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を # 表示する(最小で0、最大で8)。 # 5. 爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字 # の'x'を表示し、"Bomb!"と表示して終了する。 # # [3]環境 # [3.1]windows7 # [3.2]gcc # [3.3]C/C++ # [4]7月20日 # よろしくお願いします。 # マインスイーパ :- 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面). 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面) :- 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面), '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(_平坦なならびで表現された盤面). マインスイーパ(_平坦なならびで表現された盤面) :- 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面),!. マインスイーパ(_平坦なならびで表現された盤面) :- マインスイーパを継続する(_平坦なならびで表現された盤面). 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面) :- 度数((member(A,_平坦なならびで表現された盤面),atom(A)),64), write('あなたの勝ちです。\n'). マインスイーパを継続する(_平坦なならびで表現された盤面) :- '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置), マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置) :- 爆弾を隠して盤面を表示する(_平坦なならびで表現された盤面), マス目を選択させる(_行位置,_列位置). マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面),!. マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面), 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面) :- 平坦化した位置に変換(_行位置,_列位置,_nth1), nth1(_nth1,_平坦なならびで表現された盤面,0). 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面) :- 爆弾は周囲にいくつあるか(_nth1,_平坦なならびで表現された盤面,_個数), writef('周囲に爆弾は %w 個あります\n',[_個数]),!. '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面) :- 得点は(_平坦なならびで表現された盤面,_得点), 爆弾が置かれたすべてのマス目に小文字のxを表示し(_平坦なならびで表現された盤面), writef('\n Bomb! \n\n\n あなたの得点は %t です\n',[_得点]). 得点は(_平坦なならびで表現された盤面,_得点) :- 度数((member(A,_平坦なならびで表現された盤面),\+(var(A)),A==0),_得点). 爆弾が置かれたすべてのマス目に小文字のxを表示し([]) :- !. 爆弾が置かれたすべてのマス目に小文字のxを表示し(L) :- 爆弾が置かれたすべてのマス目に小文字のxを表示して行く(L). 爆弾が置かれたすべてのマス目に小文字のxを表示して行く([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾が置かれたすべてのマス目に小文字のxを表示し(R). 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 行末まで表示する(A,R). 行末まで表示する(A,R) :- 爆弾を含むマス目表示文字(A,_表示文字), 爆弾を含むマス目表示(R,_表示文字). 爆弾を含むマス目表示(R,_表示文字) :- writef('%w',[_表示文字]), R = [], write('\n'). マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R) :- append(_,[A|R],[_1,_2,_3,_4,_5,_6,_7,_8]). 爆弾を含むマス目表示文字(V,'-') :- var(V),!. 爆弾を含むマス目表示文字('x','x') :- !. 爆弾を含むマス目表示文字(_,0). 爆弾を隠して盤面を表示する([]). 爆弾を隠して盤面を表示する([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾を隠して盤面を表示する(R). 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 爆弾を隠して行末まで表示する(A,R). 爆弾を隠して行末まで表示する(A,R) :- 爆弾を隠すマス目表示文字(A,_表示文字), 爆弾を隠すマス目表示(_表示文字,R). 爆弾を隠すマス目表示(_表示文字,R) :- writef('%w',[_表示文字]), R = [], write('\n'). 爆弾を隠すマス目表示文字(V,'-') :- var(V),!. 爆弾を隠すマス目表示文字('x','-') :- !. 爆弾を隠すマス目表示文字(_,0). 平坦化した位置に変換(_行位置,_列位置,_nth1) :- _nth1 is (_行位置-1) * 8 + _列位置. 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面) :- length(_平坦なならびで表現された盤面,64). '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(L) :- 爆弾は10個にし(Lp), 同じマス目に重ならないようにランだけに配置する(Lp,L). 爆弾は10個にし(Lp) :- length(Lp,10). 同じマス目に重ならないようにランだけに配置する([],L) :- !. 同じマス目に重ならないようにランだけに配置する([_|R1],L) :- 同じマス目に重ならないようにランダムに一個爆弾を設置する(L), 同じマス目に重ならないようにランだけに配置する(R1,L). 同じマス目に重ならないようにランダムに一個爆弾を設置する(L) :- ランダムに(L,_nth0), 同じマス目に重ならないように一個爆弾を設置する(_nth0,L),!. ランダムに(L,_nth0) :- repeat, _nth0 is random(64). 同じマス目に重ならないように一個爆弾を設置する(_nth0,L) :- 同じマス目に重ならないように(_nth0,L,V), 一個爆弾を設置する(V). 同じマス目に重ならないように(_nth0,L,V) :- nth0(_nth0,L,V), var(V). 一個爆弾を設置する(x). 爆弾は周囲にいくつあるか(N,L,_個数) :- 度数(周囲の八箇所の中で爆弾があるのは(N,L),_個数). 周囲の八箇所の中で爆弾があるのは(N,L) :- 周辺の八箇所の中で(N,_nth1), '_nth1には爆弾がある'(_nth1,L). 周辺の八箇所の中で(N,_nth1) :- member(_式,[N-9,N-8,N-7,N-1,N,N+1,N+7,N+8,N+9]), _nth1 is _式. '_nth1には爆弾がある'(_nth1,L) :- nth1(_nth1,L,V), 変数ではなく爆弾がある(V). 変数ではなく爆弾がある(V) :- 変数ではなく(V), V = x. 変数ではなく(V) :- \+(var(V)). マス目を選択させる(_行位置,_桁位置) :- 整数を得る('マス目の行位置(1-8) ',between(1,8,_行位置),_行位置), 整数を得る('マス目の桁位置(1-8) ',between(1,8,_桁位置),_桁位置),!. 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から(_催促文,_行), 行を条件付きで整数に変換する(_行,_条件,_整数),!. 催促文付き行入力から(_催促文,_行) :- writef('%w',[_催促文]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_chars(_行,Codes). 行を条件付きで整数に変換する(_行,_条件,_整数) :- 行を整数に変換する(_行,_整数), 整数入力条件検査(_条件). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査(_整数). 整数検査(_整数) :- integer(_整数),!. 整数検査(_項) :- 整数検査再入力要請(_項). 整数検査再入力要請(_項) :- writef('入力された項 %w は整数になりません。再入力をお願いします。\n',[_項]), fail. 整数入力条件検査(_条件) :- catch(_条件,E,fail),!. 整数入力条件検査(_条件) :- 整数入力条件検査再入力要請(_条件). 整数入力条件検査再入力要請(_条件) :- writef('入力された %w は成立しません。再入力をお願いします。\n',[_条件]), fail. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #104 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): #   100以下までの素数を求め、その表示をするプログラムを作成せよ。 #   ただし、求める素数の量は引数として関数側に渡して求めることとする。 # #   【関数仕様】 #   戻り値:なし #   関数名:prime #   引数:int n # '100以下までの素数を求め、その表示をするプログラムを作成せよ。ただし、求める素数の量は引数として関数側に渡して求めることとする。'(_n) :- '100以下までの素数をn個求め'(_n,_n個の素数ならび), その表示をする(_n個の素数ならび). '100以下までの素数をn個求め'(_n,_n個の素数ならび) :- findnsols(_n,_素数,'100以下までの素数を求め'(_素数),_n個の素数ならび),!. '100以下までの素数を求め'(_素数) :- '100以下までの'(_素数候補), 素数を求め(_素数候補,_素数). '100以下までの'(_素数候補) :- findall(N,between(2,100,N),_素数候補). 素数を求め(_素数候補,_素数) :- エラトステネスの篩(_素数候補,_素数). エラトステネスの篩([A|R1],X) :- 篩(A,R1,L), エラトステネスの篩(A,L,X). エラトステネスの篩(A,_,A). エラトステネスの篩(A,L,X) :- エラトステネスの篩(L,X). 篩(_,[],[]) :- !. 篩(N,L,R2) :- 'Nで割り切れるものを篩に掛ける'(N,L,R2). 'Nで割り切れるものを篩に掛ける'(N,[A|R1],L) :- 'Nで割り切れるものを取り除く'(N,A,R1,L,R2), 篩(N,R1,R2). 'Nで割り切れるものを取り除く'(N,A,R1,R2,R2) :- 'Nで割り切れるものを'(A,N). 'Nで割り切れるものを取り除く'(N,A,R1,[A|R2],R2) :- 'Nで割り切れないものは取り除かない'(A,N). 'Nで割り切れるものを'(A,N) :- 0 is A mod N. 'Nで割り切れないものは取り除かない'(A,N) :- \+(0 is A mod N). その表示をする(_n個の素数ならび) :- atomic_list_concat(_n個の素数ならび,' ',_n個の素数文字列), writef('%w\n',[_n個の素数文字列]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #104 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): #   100以下までの素数を求め、その表示をするプログラムを作成せよ。 #   ただし、求める素数の量は引数として関数側に渡して求めることとする。 # #   【関数仕様】 #   戻り値:なし #   関数名:prime #   引数:int n # '100以下までの素数を求め、その表示をするプログラムを作成せよ。ただし、求める素数の量は引数として関数側に渡して求めることとする。'(_n) :- '100以下までの素数をn個求め'(_n,_n個の素数ならび), その表示をする(_n個の素数ならび). '100以下までの素数をn個求め'(_n,_n個の素数ならび) :- findnsols(_n,_素数,'100以下までの素数を求め'(_素数),_n個の素数ならび),!. '100以下までの素数を求め'(_素数) :- '100以下までの'(_素数候補), 素数を求め(_素数候補,_素数). '100以下までの'(_素数候補) :- findall(N,between(2,100,N),_素数候補). 素数を求め(_素数候補,_素数) :- エラトステネスの篩(_素数候補,_素数). エラトステネスの篩([A|R1],X) :- 篩(A,R1,L), エラトステネスの篩(A,L,X). エラトステネスの篩(A,_,A). エラトステネスの篩(A,L,X) :- エラトステネスの篩(L,X). 篩(_,[],[]) :- !. 篩(N,L,R2) :- 'Nで割り切れるものを篩に掛ける'(N,L,R2). 'Nで割り切れるものを篩に掛ける'(N,[A|R1],L) :- 'Nで割り切れるものを取り除く'(N,A,R1,L,R2), 篩(N,R1,R2). 'Nで割り切れるものを取り除く'(N,A,R1,R2,R2) :- 'Nで割り切れるものを'(A,N). 'Nで割り切れるものを取り除く'(N,A,R1,[A|R2],R2) :- 'Nで割り切れないものは取り除かない'(A,N). 'Nで割り切れるものを'(A,N) :- 0 is A mod N. 'Nで割り切れないものは取り除かない'(A,N) :- \+(0 is A mod N). その表示をする(_n個の素数ならび) :- atomic_list_concat(_n個の素数ならび,' ',_n個の素数文字列), writef('%w\n',[_n個の素数文字列]). % 以下のサイトは # 最大の利益 # FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、(108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 # # ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。 # # 入力 # 最初の行に整数 N が与えられる。 # # 続くN行に整数 R[t] (t=1,2,,,N) が順番に与えられる。 # # 出力 # 最大値を1行に出力せよ。 # # 制約 # 2?N?200000 # 1?R[t]?109 # 入力例 1 # 6 # 2 # 3 # 1 # 3 # 4 # 3 # 入力例 1 に対する出力 # 3 # 入力例 2 # 4 # 4 # 1 # 2 # 1 # 入力例 2 に対する出力 # 1 'FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。 例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、 (108円 - 100円) × 1000ドル = 8000円の利益を得ることができます。 ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、 価格の差 R[j]-R[i] (ただし、j>i とする) の最大値を求めてください。' :- 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび), 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび) :- 時系列数を得る(_時系列数), 時刻tに於ける価格ならびを得る(_時系列数,_時刻tに於ける価格ならび). 時刻tに於ける価格ならびを得る(_時系列数,_時刻tに於ける価格ならび) :- findall(_価格,( 時刻tに於ける価格(_時系列数,_価格)),_時刻tに於ける価格ならび). 時刻tに於ける価格(_時系列数,_価格) :- between(1,_時系列数,_t), 価格を得る(_価格). 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大価格差,( 為替差の利益(_時刻tに於ける価格ならび,_時刻tの投資に対する最大価格差)),_最大の為替差の利益). 為替差の利益(_時刻tに於ける価格ならび,_時刻tの投資に対する最大価格差) :- append(_,[_時刻tの価格|_その後の価格ならび],_時刻tに於ける価格ならび), 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差). 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差) :- findmax(_時刻tの価格との価格差,( 時刻tの投資に対する価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差)),_時刻tの投資に対する最大価格差). 時刻tの投資に対する価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差) :- member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格. 時系列数を得る(_時系列数) :- 数を得る(_時系列数). 価格を得る(_価格) :- 数を得る(_価格). 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). 数を得る(_数) :- 行入力(_行), 数入力検査(_行,_数). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). 数入力検査(_行,_数) :- read_term_from_atom(_行,_数,[]), number(_数). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは body {line-height: 158%;} --> # 出典 :: twitter_by_@pytoninfo_20160130 # # 深さ優先探索で躓いているpython初心者です。 # 部分和問題を深さ優先探索で解くことを考えています。 # 質問したいことはソースコードの部分で、アルゴリズムに対しての理解が足りないのか、 # pythonにたいしての理解が足りないのか、ネットに乗っているpythonのソースコードを見てもなにをやっているのかさっぱりわかりません。 # # 解きたい問題→a=[1.2.4.7]の中からいくつかの和でk=13が作れるかどうか判定しろ。 '[1,2,4,7]の部分和が13になる組合せがあるかどうか深さ優先で解く'(_組合せ) :- 組合せ数を1から4までの範囲で試行する(_組合せ数), 深さ優先で部分和が13になる組合せを取り出す([1,2,4,7],_組合せ数,_組合せ). 組合せ数を1から4までの範囲で試行する(_組合せ数) :- between(1,4,_組合せ数). 深さ優先で部分和が13になる組合せを取り出す(_候補ならび,_組合せ数,_組合せ) :- 深さ優先で組合せを取り出す(_候補ならび,_組合せ数,_組合せ), 部分和が13になる(_組合せ). 深さ優先で組合せを取り出す(_候補ならび,1,[_種]) :- '組合せ数の指定が1の時、候補ならびから1要素ずつ取り出し組合せの種にする'(_候補ならび,_種). 深さ優先で組合せを取り出す(_候補ならび,_組合せ数,_組合せ) :- '組合せ数の指定が1より大きいならば、候補ならびの各要素にそれより後の要素の組合せを付加していく'(_候補ならび,_組合せ数,_組合せ). '組合せ数の指定が1の時、候補ならびから1要素ずつ取り出し組合せの種にする'(_候補ならび,_種) :- member(_種,_候補ならび). '組合せ数の指定が1より大きいならば、候補ならびの各要素にそれより後の要素の組合せを付加していく'(_候補ならび,_組合せ数,_組合せ) :- _組合せ数 > 1, '候補ならびの各要素にそれより後の要素の組合せを付加していく'(_候補ならび,_組合せ数,_組合せ). '候補ならびの各要素にそれより後の要素の組合せを付加していく'(_候補ならび,_組合せ数,_組合せ) :- '先頭要素をそれより後の数字列を組合せたものと結合する'(_候補ならび,_組合せ数,_組合せ). '候補ならびの各要素にそれより後の要素の組合せを付加していく'([_|_残り候補ならび],_組合せ数,_組合せ) :- 深さ優先で組合せを取り出す(_残り候補ならび,_組合せ数,_組合せ),!. '先頭要素をそれより後の数字列を組合せたものと結合する'([_先頭要素|_残り候補ならび],_組合せ数,[_先頭要素|_残り組合せ]) :- succ(_減らした組合せ数,_組合せ数), 深さ優先で組合せを取り出す(_残り候補ならび,_減らした組合せ数,_残り組合せ). 部分和が13になる(_組合せ) :- sum_list(_組合せ,13). % 以下のサイトは body {line-height: 158%;} --> # 出典 :: twitter_by_@pytoninfo_20160130 # # 深さ優先探索で躓いているpython初心者です。 # 部分和問題を深さ優先探索で解くことを考えています。 # 質問したいことはソースコードの部分で、アルゴリズムに対しての理解が足りないのか、 # pythonにたいしての理解が足りないのか、ネットに乗っているpythonのソースコードを見てもなにをやっているのかさっぱりわかりません。 # # 解きたい問題→a=[1.2.4.7]の中からいくつかの和でk=13が作れるかどうか判定しろ。 '[1,2,4,7]の部分和が13になる組合せがあるかどうか深さ優先で解く'(_組合せ) :- 組合せ数を1から4までの範囲で試行する(_組合せ数), 深さ優先で部分和が13になる組合せを取り出す([1,2,4,7],_組合せ数,_組合せ). 組合せ数を1から4までの範囲で試行する(_組合せ数) :- between(1,4,_組合せ数). 深さ優先で部分和が13になる組合せを取り出す(L,_組合せ数,_組合せ) :- 深さ優先で組合せを取り出す(L,_組合せ数,_組合せ), 部分和が13になる(_組合せ). 深さ優先で組合せを取り出す(L,1,[A]) :- '取り出し数の指定が1の時、Lから1要素ずつ取り出し組合せの種にする'(L,A). 深さ優先で組合せを取り出す(L1,N,L2) :- N > 1, 深さ優先で組合せる(L1,N,L2). '取り出し数の指定が1の時、Lから1要素ずつ取り出し組合せの種にする'(L,A) :- member(A,L). 深さ優先で組合せる([A|R1],N,[A|R2]) :- succ(N_1,N), 深さ優先で組合せを取り出す(R1,N_1,R2). 深さ優先で組合せる([_|R1],N,R2) :- 深さ優先で組合せを取り出す(R1,N,R2). 部分和が13になる(_組合せ) :- sum_list(_組合せ,13). % 以下のサイトは body {line-height: 158%;} --> # 出典 :: twitter_by_@pytoninfo_20160130 # # 深さ優先探索で躓いているpython初心者です。 # 部分和問題を深さ優先探索で解くことを考えています。 # 質問したいことはソースコードの部分で、アルゴリズムに対しての理解が足りないのか、 # pythonにたいしての理解が足りないのか、ネットに乗っているpythonのソースコードを見てもなにをやっているのかさっぱりわかりません。 # # 解きたい問題→a=[1.2.4.7]の中からいくつかの和でk=13が作れるかどうか判定しろ。 '[1,2,4,7]の部分和が13になる組合せがあるかどうか深さ優先で解く'(_組合せ) :- 組合せ数を1から4までの範囲で試行する(_組合せ数), 深さ優先で部分和が13になる組合せを取り出す([1,2,4,7],_組合せ数,_組合せ). 組合せ数を1から4までの範囲で試行する(_組合せ数) :- between(1,4,_組合せ数). 深さ優先で部分和が13になる組合せを取り出す(L,_組合せ数,_組合せ) :- 深さ優先で組合せを取り出す(L,_組合せ数,_組合せ), 部分和が13になる(_組合せ). 深さ優先で組合せを取り出す(L,1,[A]) :- '取り出し数の指定が1の時、Lから1要素ずつ取り出し組合せの種にする'(L,A). 深さ優先で組合せを取り出す(L1,N,L2) :- N > 1, 深さ優先で組合せる(L1,N,L2). '取り出し数の指定が1の時、Lから1要素ずつ取り出し組合せの種にする'(L,A) :- member(A,L). 深さ優先で組合せる([A|R1],N,[A|R2]) :- succ(N_1,N), 深さ優先で組合せを取り出す(R1,N_1,R2). 深さ優先で組合せる([_|R1],N,R2) :- 深さ優先で組合せを取り出す(R1,N,R2). 部分和が13になる(_組合せ) :- sum_list(_組合せ,13). % 以下のサイトは '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,_度数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/7 # # [1] 授業単元:プログラミング # [2] 問題文 # ・キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示するプログラムを作成しなさい。 # ただし、文字を大文字に変換する関数を作成し、それを利用すること。 # 'キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示する' :- キーボードから入力した文字列を(_文字コードならび), 'すべて大文字に変換して(小文字は大文字に、大文字はそのままに)'(_文字コードならび,_大文字に変換された文字コードならび), 表示する(_大文字に変換された文字コードならび). キーボードから入力した文字列を(_文字コードならび) :- write('文字列を入力してください : '), read_line_to_codes(user_input,_文字コードならび). 'すべて大文字に変換して(小文字は大文字に、大文字はそのままに)'(_文字コードならび,_大文字に変換された文字コードならび) :- findall(_変換されたコード,( member(_文字コード,_文字コードならび), '小文字は大文字に、大文字はその(_文字コード,_変換された文字コード)),_大文字に変換された文字コードならび). '小文字は大文字に、大文字はそのままに'(_文字コード,_変換された文字コード) :- 小文字は大文字に(_文字コード,_変換された文字コード). '小文字は大文字に、大文字はそのままに'(_文字コード,_文字コード) :- 大文字はそのままに(_文字コード). 小文字は大文字に(_文字コード,_変換された文字コード) :- 小文字の場合は(_文字コード), 大文字に変換して(_文字コード,_変換されたコード). 大文字はそのままに(_文字コード) :- \+(小文字の場合は(_文字コード)). 小文字の場合は(_文字コード) :- between(97,121,_文字コード). 大文字に変換して(_文字コード,_変換されたコード) :- _大文字コード is _文字コード - 32. 表示する(_大文字に変換された文字コードならび) :- atom_codes(_文字列,_大文字に変換された文字コードならび), writef('%w\n',[_文字列]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/7 # # [1] 授業単元:プログラミング # [2] 問題文 # ・キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示するプログラムを作成しなさい。 # ただし、文字を大文字に変換する関数を作成し、それを利用すること。 # 'キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示する' :- キーボードから入力した文字列を(_文字コードならび), すべて大文字に変換して(_文字コードならび,_大文字に変換された文字コードならび), 表示する(_大文字に変換された文字コードならび). キーボードから入力した文字列を(_文字コードならび) :- write('文字列を入力してください : '), read_line_to_codes(user_input,_文字コードならび). すべて大文字に変換して([],[]). すべて大文字に変換して(L1,L2) :- 小文字場合は大文字に変換する(L1,L2). 小文字場合は大文字に変換する([_文字コード|R1],[_変換されたコード|R2]) :- 小文字の場合は大文字に変換して(_文字コード,_変換されたコード), すべて大文字に変換して(R1,R2). 小文字の場合は大文字に変換して(_文字コード,_変換されたコード) :- 小文字の場合は(_文字コード), 大文字に変換して(_文字コード,_変換されたコード). 小文字の場合は大文字に変換して(_文字コード,_文字コード) :- 小文字でない場合は変換せずに(_文字コード). 小文字の場合は(_文字コード) :- between(97,121,_文字コード). 大文字に変換して(_文字コード,_変換されたコード) :- _大文字コード is _文字コード - 32. 小文字でない場合は変換せずに(_文字コード) :- \+(小文字の場合は(_文字コード)). 表示する(_大文字に変換された文字コードならび) :- atom_codes(_文字列,_大文字に変換された文字コードならび), writef('%w\n',[_文字列]). % 以下のサイトは # 出典::プログラミングのお題スレ Part5 #644 # # お題:硬貨がn枚あり、合計金額がk円のとき、その内訳を求める。 # 硬貨の種類は500円玉、100円玉、50円玉、10円玉、5円玉、1円玉である。 # 内訳は各硬貨の枚数を並べたものとする。 # 複数の解がある場合はすべてを求める。 # 例 # 11枚で1082円のとき # 2 0 1 0 6 2 # # 12枚で777円のとき # 1 0 5 1 3 2 # 1 1 3 0 5 2 # # 25枚で4999円のとき # 9 2 5 4 1 4 # 9 3 3 3 3 4 # 9 4 1 2 5 4 '硬貨がn枚あり、合計金額がk円のとき、その内訳を求める。 硬貨の種類は500円玉、100円玉、50円玉、10円玉、5円玉、1円玉である。 内訳は各硬貨の枚数を並べたものとする。 複数の解がある場合はすべてを求める。'(_n,_k,_500,_100,_50,_10,_5,_1) :- '硬貨がn枚あり、'(_n,_硬貨ならび), 'その内訳を求める。'(_硬貨ならび,_500,_100,_50,_10,_5,_1), '合計金額がk円のとき、'(_k,_500,_100,_50,_10,_5,_1). '硬貨がn枚あり、'(_n,_硬貨ならび) :- findall(_,between(1,_n,_),_硬貨ならび). 'その内訳を求める。'(_硬貨ならび,_500,_100,_50,_10,_5,_1) :- '6種類に分割された'(_硬貨ならび,L1,L2,L3,L4,L5,L6), '6種類に分割された硬貨の内訳'([L1,L2,L3,L4,L5,L6],[_500,_100,_50,_10,_5,_1]). '6種類に分割された'(_硬貨ならび,L1,L2,L3,L4,L5,L6) :- append([L1,L2,L3,L4,L5,L6],_硬貨ならび). '6種類に分割された硬貨の内訳'([],[]). '6種類に分割された硬貨の内訳'([L|R1],[_枚数|R2]) :- length(L,_枚数), '6種類に分割された硬貨の内訳'(R1,R2). '合計金額がk円のとき、'(_k,_500,_100,_50,_10,_5,_1) :- _k is 500 * _500 + 100 * _100 + 50 * _50 + 10 * _10 + 5 * _5 + 1 * _1. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/905 # # [1]c++ # [2]2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。 # また、対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。 # ただし、対角要素は左上隅から右下隅への対角線上の要素とする。次の図は実行例であ る。 # --- (2)配列nの内容 --- # # 100000000 # 010000000 # 001000000 # 000100000 # 000010000 # 000001000 # 000000100 # 000000010 # 000000001 '2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。' :- '2次元配列n[10][10]のすべての要素に1を代入してから'(LL), 'その内容を表示しなさい。'(LL). '2次元配列n[10][10]のすべての要素に1を代入してから'(LL) :- findall(_行,( '10行ある', '10要素の行のすべての要素に1を代入'(_行)),LL). '10行ある' :- between(1,10,_). '10要素の行のすべての要素に1を代入'(_行) :- '10要素の行の'(_行), すべての要素に1を代入(_行). '10要素の行の'(_行) :- length(_行,10). すべての要素に1を代入([]). すべての要素に1を代入([1|R]) :- すべての要素に1を代入(R). 'その内容を表示しなさい。'(LL) :- 表示しなさい(LL). 表示しなさい(LL) :- forall(行を表示文字列に変換する(LL,_表示文字列),writef('%w\n',[_表示文字列])). 行を表示文字列に変換する(LL,_表示文字列) :- member(_行,LL), atomic_list_concat(_行,' ',_表示文字列). '対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。' :- 対角要素だけ1を代入しほかは全て0を代入してから(LL), 表示しなさい(LL). 対角要素だけ1を代入しほかは全て0を代入してから(LL) :- findall(L,( between(1,10,_n), 対角要素だけ1を代入しほかは全て0を代入(_n,L)),LL). 対角要素だけ1を代入しほかは全て0を代入(_n,L) :- 対角要素だけ1を代入し(_n,L), 他の全ての変数要素は0に(L). 対角要素だけ1を代入し(_n,L) :- length(L,10), reverse(L,RL), 対角要素だけ1を代入し(_n,RL,L). 対角要素だけ1を代入し(_n,RL,L) :- nth1(_n,L,1), nth1(_n,RL,1). 他の全ての変数要素は0に(L) :- findall(N,( member(N,L), 変数要素は0に(N)),L). 変数要素は0に(0) :- !. 変数要素は0に(N). % 以下のサイトは 非決定性の素数生成(_限界値,_素数) :- findall(N,between(2,_限界値,N),L), 非決定性のエラトステネスの篩(L,_素数). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|R1],_素数) :- 篩に掛ける(R1,_要素,'_要素はNで割り切れる'(_要素,N),R2), 非決定性のエラトステネスの篩(R2,_素数). 篩に掛ける(L1,_要素,_副目標,L2) :- 'L1の要素で_副目標を真とするものを篩に掛ける'(L1,_要素,_副目標,L2). 'L1の要素で_副目標を真とするものを篩に掛ける'(L1,_要素,_副目標,L2) :- findall(_要素,( 'L1の要素で'(L1,_要素), '_副目標を真とするものを篩に掛ける'(_副目標)),L2). 'L1の要素で'(L1,_要素) :- member(_要素,L1). '_副目標を真とするものを篩に掛ける'(_副目標) :- \+(_副目標). '_要素はNで割り切れる'(_要素,N) :- 0 is _要素 mod N. % 以下のサイトは 非決定性の素数生成(_限界値,_素数) :- findall(N,between(2,_限界値,N),L), 非決定性のエラトステネスの篩(L,_素数). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|L1],_素数) :- 先頭の素数を網として篩に掛けて行く(L1,_要素,'_要素はNで割り切れる'(_要素,N),_素数). 先頭の素数を網として篩に掛けて行く(L1,_要素,_副目標,_素数) :- 'L1の要素で_副目標を真とするものを篩に掛ける'(L1,_要素,_副目標,L2), 非決定性のエラトステネスの篩(L2,_素数). 'L1の要素で_副目標を真とするものを篩に掛ける'(L1,_要素,_副目標,L2) :- findall(_要素,( 'L1の要素で'(L1,_要素), '_副目標を真とするものを篩に掛ける'(_副目標)),L2). 'L1の要素で'(L1,_要素) :- member(_要素,L1). '_副目標を真とするものを篩に掛ける'(_副目標) :- \+(_副目標). '_要素はNで割り切れる'(_要素,N) :- 0 is _要素 mod N. % 以下のサイトは 非決定性の素数生成(_限界値,_素数) :- findall(N,between(2,_限界値,N),L), 非決定性のエラトステネスの篩(L,_素数). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|R1],_素数) :- エラトステネスの篩(N,R1,R2), 非決定性のエラトステネスの篩(R2,_素数). エラトステネスの篩(_,[],[]). エラトステネスの篩(N,[A|R1],L2) :- エラトステネスの篩(N,A,R2,L2), エラトステネスの篩(N,R1,R2). エラトステネスの篩(N,A,R2,R2) :- 0 is A mod N. エラトステネスの篩(N,A,R2,[A|R2]) :- \+(0 is A mod N). % 以下のサイトは 非決定性の素数生成(_限界値,_素数) :- findall(N,between(2,_限界値,N),L), 非決定性のエラトステネスの篩(L,_素数). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|R1],_素数) :- 篩に掛ける(R1,_要素,'_要素はNで割り切れる'(_要素,N),R2), 非決定性のエラトステネスの篩(R2,_素数). 篩に掛ける(L1,_要素,_副目標,L2) :- findall(_要素,( member(_要素,L1), \+(_副目標)),L2). '_要素はNで割り切れる'(_要素,N) :- 0 is _要素 mod N. % 以下のサイトは ナップサック問題(N,_許容最大重量,_重さならび,_詰め方,_詰めることのできる最大重量) :- 許容最大重量内の全ての詰め方の組合せを得る(N,_許容最大重量,_重さならび,LL), 詰めることのできる最大重量を得る(LL,_詰めることのできる最大重量), 選択位置ならびから詰め方を得る(_重さならび,LL,_詰めることのできる最大重量,_詰め方). 許容最大重量内の全ての詰め方の組合せを得る(N,_許容最大重量,_重さならび,LL) :- findall([_詰め方,_選択位置ならび],詰め物の作成(N,_許容最大重量,_重さならび,_選択位置ならび,_詰めた重さ),LL). 詰め物の作成(N,_許容最大重量,_重さならび,_選択位置ならび,_詰めた重さ) :- findall(M,between(1,N,M),L), 冪集合(L,_冪集合), 許容最大重量内の詰め方と詰めた重さ(_許容最大重量,_重さならび,_冪集合,_選択位置ならび,_詰めた重さ). 許容最大重量内の詰め方と詰めた重さ(_許容最大重量,_重さならび,_冪集合,_選択位置ならび,_詰めた重さ) :- 許容最大重量内の選択位置ならび(_許容最大重量,_重さならび,_冪集合,_選択位置ならび,_詰めた重さ). 許容最大重量内の選択位置ならび(_許容最大重量,_重さならび,_冪集合,_選択位置ならび,詰めた重さ) :- member(_集合,_冪集合), '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_選択位置ならび,_詰めた重さ). '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_選択位置ならび,_詰めた重さ) :- '集合の重量合計は'(_選択位置ならび,_重さならび,_詰めた重さ), _詰めた重さ =< _許容最大重量. '集合の重量合計は'(_選択位置ならび,_重さならび,_合計重量) :- findsum(Wi,( member(_要素,_選択位置ならび), nth1(_要素,_重さならび,Wi)),_合計重量). 詰めることのできる最大重量を得る(LL,_詰めることのできる最大重量) :- findmax(_詰めた重さ,member([_,_詰めた重さ],LL),_詰めることのできる最大重量). 選択位置ならびから詰め方を得る(_重さならび,LL,_詰めることのできる最大重量,_詰め方) :- member([_選択位置ならび,_詰めることのできる最大重量],LL), findall(_重さ,( member(_位置,_選択位置ならび), nth1(_位置,_重さならび,_重さ)),_詰め方). 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)),_冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは ナップサック問題(N,_許容最大重量,_重さならび,_価格ならび,_詰めることのできる最高合計金額) :- findmax(_合計価格,詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_,_合計価格),_詰めることのできる最高合計金額). 詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_選択位置ならび,_合計価格) :- findall(M,between(1,N,M),L), 冪集合(L,_冪集合), 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_選択位置ならび,_合計価格). 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_選択位置ならび,_合計価格) :- 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_選択位置ならび), 集合の合計価格(_選択位置ならび,_価格ならび,_合計価格). 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_選択位置ならび) :- member(_選択位置ならび,_冪集合), '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_選択位置ならび). '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_選択位置ならび) :- '集合の重量合計は'(_選択位置ならび,_重さならび,_合計重量), _合計重量 =< _許容最大重量. '集合の重量合計は'(_選択位置ならび,_重さならび,_合計重量) :- findsum(Wi,( member(_要素,_選択位置ならび), nth1(_要素,_重さならび,Wi)),_合計重量). 集合の合計価格(_集合,_価格ならび,_合計価格) :- findsum(Pi,( member(_要素,_集合), nth1(_要素,_価格ならび,Pi)),_合計価格). 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)),_冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/170 # お題:分母が自然数m以下の既約分数で0より大きく1より小さいものを小さい順にならべる。 # m=3 -> 1/3,1/2,2/3 # m=5 -> 1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4/5 # # '分母が自然数m以下の既約分数で0より大きく1より小さいものを小さい順にならべる。'(_m,_整列した分数ならび) :- findall(_分子 rdiv _分母,分母ごとの既約分数(_m,_分母,_分子),_分数ならび), sort(_分数ならび,_整列した分数ならび). 分母ごとの既約分数(_m,_分母,_分子) :- between(2,_m,_分母), 分子候補を篩に掛ける(2,_分母,_篩に掛けられた分子ならび), member(_分子,_篩に掛けられた分子ならび). 分子候補を篩に掛ける(M,_分母,_篩に掛けられた分子ならび) :- 分子候補を生成(_分母,_数ならび), 分子候補を篩に掛ける(M,_分母,_数ならび,_篩に掛けられた分子ならび). 分子候補を生成(_分母,_数ならび) :- succ(_分母_1,_分母), findall(N,between(1,_分母_1,N),_数ならび). 分子候補を篩に掛ける(_分母,_分母,_篩に掛けられた分子ならび,_篩に掛けられた分子ならび) :- !. 分子候補を篩に掛ける(M,_分母,_数ならび_1,_篩に掛けられた分子ならび) :- 'Mが2から分母になるまで分子候補を篩に掛ける'(M,_分母,_数ならび_1,_篩に掛けられた分子ならび). 'Mが2から分母になるまで分子候補を篩に掛ける'(M,_分母,_数ならび_1,_篩に掛けられた分子ならび) :- 'Mの篩'(M,_分母,_数ならび_1,_数ならび_2), succ(M,M_2), 分子候補を篩に掛ける(M_2,_分母,_数ならび_2,_篩に掛けられた分子ならび). 'Mの篩'(M,_分母,_数ならび_1,_数ならび_2) :- findall(_分子候補,分子候補(M,_分母,_数ならび_1,_分子候補),_数ならび_2). 分子候補(M,_分母,_数ならび_1,_分子候補) :- member(_分子候補,_数ならび_1), 約分できない(M,_分母,_分子候補). 約分できない(M,_分母,_分子候補) :- \+(約分できる(M,_分母,_分子候補)). 約分できる(M,_分母,_分子候補) :- 0 is _分母 mod M, 0 is _分子候補 mod M. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/456 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10195.txt # # 今回はナップサック問題について考えプログラムを作成する。N個の荷物があって、個々の荷物の重さをWi、値段をPiとする。但しiは1からNの整数を意味する。 # 袋には最大Wの重さまで入れられるとすると、最大でいくら分を入れることができるか?という問題。 # データファイルは、始めの一行に荷物の個数Nが書かれており、次に重さが整数でN行分書かれている。その次の行からN行分、それぞれの荷物の価値が書かれているとする。 # 下のデータファイルの場合は、3個の荷物があり、重みは10、20、13、で # それぞれの値段は23、23、10という状況を表す。 # ------------------- # 3 # 10 # 20 # 13 # 23 # 23 # 10 # ------------------- # 荷物の重みと値段はともに、1から100までの乱数で与えることとする。 # void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている # ファイル名のファイルを開き、そこにデータを記録する。void_read_data_file(char*file)という関数を呼ぶと、文字列変数fileによって名前が指定されたファイルを開き、大域変数の荷物の重み配列W[]と値段配列[]\\\\\にデータを入力する。 '荷物の重みと値段はともに、1から100までの乱数で与えることとする。 void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている ファイル名のファイルを開き、そこにデータを記録する。'(_ファイル名,N) :- ファイル名のファイルを開き(_ファイル名), 'そこにデータを記録する。'(N), ファイルを閉じる. ファイル名のファイルを開き(_ファイル名) :- tell(_ファイル名). 'そこにデータを記録する。'(N) :- writef('%w\n',[N]), forall((between(1,N,_),X is random(100) + 1),writef('%w\n',[X])), forall((between(1,N,_),Y is random(100) + 1),writef('%w\n',[Y])). ファイルを閉じる :- told. ナップサック問題(_ファイル名,N,_許容最大重量,_詰めることのできる最高合計金額) :- データファイルから重さならびと価格ならびを得る(_ファイル名,N,_重さならび,_価格ならび), findmax(_合計価格,詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_,_合計価格),_詰めることのできる最高合計金額). データファイルから重さならびと価格ならびを得る(_ファイル名,N,_重さならび,_価格ならび) :- データファイルから読み出す(_ファイル名,N,_整数ならび), 重さならびと価格ならびに分離(N,_整数ならび,_重さならび,_価格ならび). データファイルから読み出す(_ファイル名,N,L1) :- see(_ファイル名), get_integer(N), get_integers(L1), seen. 重さならびと価格ならびに分離(N,_整数ならび,_重さならび,_価格ならび) :- length(_重さならび,N), length(_価格ならび,N), append(_重さならび,_価格ならび,_整数ならび). 詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_集合,_合計価格) :- findall(M,between(1,N,M),L), 冪集合(L,_冪集合), 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_集合,_合計価格). 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_集合,_合計価格) :- 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_集合), 集合の合計価格(_集合,_価格ならび,_合計価格). 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_集合) :- member(_集合,_冪集合), '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_集合). '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_集合) :- '集合の重量合計は'(_集合,_重さならび,_合計重量), _合計重量 =< _許容最大重量. '集合の重量合計は'(_集合,_重さならび,_合計重量) :- findsum(Wi,( member(_要素,_集合), nth1(_要素,_重さならび,Wi)),_合計重量). 集合の合計価格(_集合,_価格ならび,_合計価格) :- findsum(Pi,( member(_要素,_集合), nth1(_要素,_価格ならび,Pi)),_合計価格). get_integers(L) :- findall(I,(repeat,get_line(Line),(Line=end_of_file,!,fail;read_term_from_atom(Line,I,[]))),L),!. 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)),_冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). get_integer(N) :- get_line(Line), read_term_from_atom(Line,N,[]). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは # 出典::C/C++の宿題片付けます 127代目 #650 # [1] 授業単元: C # [2] 問題文(含コード&リンク):キーボードから入力された1以上の整数nについて、 # 次の例に示すように行番号と*を表示するプログラムを作成せよ。 # なお、*の数は、1行目はn個とし、1行毎に1ずつへっていくこととする。 # 表示結果の例 # 正の整数:7 # 1******* # 2****** # 3***** # 4**** # 5*** # 6** # 7* # のように作れとのことです。 # # [3] 環境 # [3.1]linux # [3.2] gcc # [3.3]C # [4]6月20日 # [5]繰り返しまでです、関数まではいっていません、お願いします 'キーボードから入力された1以上の整数nについて、 次の例に示すように行番号と*を表示するプログラムを作成せよ。 なお、*の数は、1行目はn個とし、1行毎に1ずつへっていくこととする。 また、0や負の数が入力された場合はプログラムが終了するようにせよ。 表示結果の例 正の整数:7 1******* 2****** 3***** 4**** 5*** 6** 7* のように作れとのことです。' :- 'キーボードから入力された1以上の整数nについて、例に示すように行番号と星を表示する'. 'キーボードから入力された1以上の整数nについて、例に示すように行番号と星を表示する' :- 'キーボードから入力された1以上の整数nによって、n個の星ならびを用意する'(_n個の星ならび), '行番号と星文字列を表示する'(_n個の星ならび). 'キーボードから入力された1以上の整数nによって、n個の星ならびを用意する'(_n個の星ならび) :- 'キーボードから入力された1以上の整数nによって(_n), n個の星ならびを用意する(_n,_n個の星ならび). 'キーボードから入力された1以上の整数nによって(_n) :- 整数を得る('1以上の整数n',_n >= 1,_n). n個の星ならびを用意する(_n,_n個の星ならび) :- findall(*,between(1,_n,_),_n個の星ならび). '行番号と星文字列を表示する'(_n個の星ならび) :- forall('行番号と星文字列を'(_n個の星ならび,_行番号と星文字列),表示する(_行番号と星文字列)). '行番号と星文字列を'(_n個の星ならび,_行番号と星文字列) :- append(L1,[_星ならびの最初の要素|_星ならびの残りの要素],_n個の星ならび), length([_|L1],_行番号), 行番号と星ならびを文字列(_行番号,[_星ならびの最初の要素|_星ならびの残りの要素],_行番号と星文字列). 行番号と星ならびを文字列(_行番号,_星ならび,_行番号と星文字列) :- atomic_list_concat([_行番号|_星ならび],_行番号と星文字列). 表示する(_行番号と星文字列) :- writef('%w\n',[_行番号と星文字列]). % 整数を得る/3 % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- '1+2+3+....+nが'(_n,_合計), '1000になる直前の変数nの値'(_合計,_n),!. '1+2+3+....+nが'(_n,_合計) :- nth1(_n,_,_), '1+2+3+....+n'(_n,_合計). '1+2+3+....+n'(_n,_合計) :- findall(_整数,between(1,_n,_整数),_1からnまでの整数ならび), sum_list(_1からnまでの整数ならび,_合計). '1000になる直前の変数nの値'(_合計,_n) :- _合計 + _n + 1 >= 1000. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364009659/540 # # 540 :デフォルトの名無しさん :2013/06/09(日) 20:07:42.82 (p)ID:FF7F/XIY(6)! # 質問ばっかでゴメンナサイ。 # [1..4] > [(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)] # みたいに出力したい。 # pairUp :: [a] -> [(a, a)] # pairUp list = case (list) of # [] -> [] # [x, y] -> [(x, y)] # (x:y:xs) -> (x, y) : pairUp (x:xs)だと # [(1,2),(1,3),(1,4)]までしか出ない。 # (x:y:xs) -> (x, y) : pairUp (x:xs) ++ pairUp (y:xs) # やると出力カオス # # 541 :デフォルトの名無しさん :sage :2013/06/09(日) 20:22:05.24 # pairUp :: [a] -> [(a, a)] # pairUp [] = [] # pairUp (x:xs) = map ((,) x) xs ++ pairUp xs # pairUp(_m,_n,L) :- findall(N,between(_m,_n,N),L1), pairUp(L1,L). pairUp([],[]). pairUp([X|R1],R2) :- pairUp(X,R1,R2,R3), pairUp(R1,R3). pairUp(X,[],R,R). pairUp(X,[Y|R1],[(X,Y)|R2],R) :- pairUp(X,R1,R2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364009659/540 # # 540 :デフォルトの名無しさん :2013/06/09(日) 20:07:42.82 (p)ID:FF7F/XIY(6)! # 質問ばっかでゴメンナサイ。 # [1..4] > [(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)] # みたいに出力したい。 # pairUp :: [a] -> [(a, a)] # pairUp list = case (list) of # [] -> [] # [x, y] -> [(x, y)] # (x:y:xs) -> (x, y) : pairUp (x:xs)だと # [(1,2),(1,3),(1,4)]までしか出ない。 # (x:y:xs) -> (x, y) : pairUp (x:xs) ++ pairUp (y:xs) # やると出力カオス # # 541 :デフォルトの名無しさん :sage :2013/06/09(日) 20:22:05.24 # pairUp :: [a] -> [(a, a)] # pairUp [] = [] # pairUp (x:xs) = map ((,) x) xs ++ pairUp xs # pairUp(_m,_n,L) :- findall(N,between(_m,_n,N),L1), pairUp(L1,L). pairUp([],[]). pairUp([X|R1],R2) :- pairUp(X,R1,R2,R3), pairUp(R1,R3). pairUp(X,[],R,R). pairUp(X,[Y|R1],[(X,Y)|R2],R) :- pairUp(X,R1,R2,R). % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- between(1,1000,_n), findall(M,between(1,_n,M),L), sum_list(L,Sum), Sum + _n + 1 >= 1000. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #104 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): #   100以下までの素数を求め、その表示をするプログラムを作成せよ。 #   ただし、求める素数の量は引数として関数側に渡して求めることとする。 # #   【関数仕様】 #   戻り値:なし #   関数名:prime #   引数:int n # '100以下までの素数を求め、その表示をするプログラムを作成せよ。ただし、求める素数の量は引数として関数側に渡して求めることとする。'(_n) :- '100以下までの素数をn個求め'(_n,_n個の素数ならび), その表示をする(_n個の素数ならび). '100以下までの素数をn個求め'(_n,_n個の素数ならび) :- findnsols(_n,_素数,'100以下までの素数を求め'(_素数),_n個の素数ならび),!. '100以下までの素数を求め'(_素数) :- '100以下までの'(_素数候補), 素数を求め(_素数候補,_素数). '100以下までの'(_素数候補) :- findall(N,between(2,100,N),_素数候補). 素数を求め(_素数候補,_素数) :- エラトステネスの篩(_素数候補,_素数). エラトステネスの篩([A|R1],X) :- 篩(A,R1,L), エラトステネスの篩(A,L,X). エラトステネスの篩(A,_,A). エラトステネスの篩(A,L,X) :- エラトステネスの篩(L,X). 篩(_,[],[]) :- !. 篩(N,L,R2) :- 'Nで割り切れるものを篩に掛ける'(N,L,R2). 'Nで割り切れるものを篩に掛ける'(N,[A|R1],L) :- 'Nで割り切れるものを取り除く'(N,A,R1,L,R2), 篩(N,R1,R2). 'Nで割り切れるものを取り除く'(N,A,R1,R2,R2) :- 'Nで割り切れるものを'(A,N). 'Nで割り切れるものを取り除く'(N,A,R1,[A|R2],R2) :- 'Nで割り切れないものは取り除かない'(A,N). 'Nで割り切れるものを'(A,N) :- 0 is A mod N. 'Nで割り切れないものは取り除かない'(A,N) :- \+(0 is A mod N). その表示をする(_n個の素数ならび) :- atomic_list_concat(_n個の素数ならび,' ',_n個の素数文字列), writef('%w\n',[_n個の素数文字列]). % 以下のサイトは # # 出典::パスワード向け文字列検査 # 半角英数字8文字以上100文字以下(_文字列) :- '8文字以上100文字以下'(_文字列), forall(sub_atom(_文字列,_,1,_,_文字),半角英数(_文字)). 半角英数字をそれぞれ1種類以上含む8文字以上100文字以下(_文字列) :- '8文字以上100文字以下'(_文字列), forall(sub_atom(_文字列,_,1,_,_文字),半角英数(_文字)), 半角英字が一文字はある(_文字列), 半角数字が一文字はある(_文字列). 半角英小文字大文字数字をそれぞれ1種類以上含む8文字以上100文字以下(_文字列) :- '8文字以上100文字以下'(_文字列), forall(sub_atom(_文字列,_,1,_,_文字),半角英数(_文字)), 半角英大文字が一文字はある(_文字列), 半角英小文字が一文字はある(_文字列), 半角数字が一文字はある(_文字列). 半角英数字記号をそれぞれ1種類以上含む8文字以上100文字以下(_文字列) :- '8文字以上100文字以下'(_文字列), forall(sub_atom(_文字列,_,1,_,_文字),半角英数字記号(_文字)), 半角英大文字が一文字はある(_文字列), 半角英小文字が一文字はある(_文字列), 半角数字が一文字はある(_文字列), 半角英記号が一文字はある(_文字列). '8文字以上100文字以下'(_文字列) :- atom_length(_文字列,_文字列の長さ), between(8,100,_文字列の長さ),!. 半角英字が一文字はある(_文字列) :- sub_atom(_文字列,_,1,_,_半角英字), 半角英字(_半角英字),!. 半角数字が一文字はある(_文字列) :- sub_atom(_文字列,_,1,_,_半角数字), 半角英字(_半角数字). 半角英大文字が一文字はある(_文字列) :- sub_atom(_文字列,_,1,_,_半角英大文字), 半角英大文字(_半角英大文字),!. 半角英小文字が一文字はある(_文字列) :- sub_atom(_文字列,_,1,_,_半角英小文字), 半角英小文字(_半角英小文字),!. 半角英記号が一文字はある(_文字列) :- sub_atom(_文字列,_,1,_,_半角英記号), 半角英記号(_半角英記号),!. 半角英数(_文字) :- 半角英字(_半角英字). 半角英数(_数字) :- 半角数字(_半角数字). 半角英数字記号(_半角英数) :- 半角英数(_半角英数). 半角英数字記号(_半角英記号) :- 半角英記号(_半角英記号). 半角英字(_半角英小英字) :- 半角英小文字(_半角英小文字). 半角英字(_半角英大文字) :- 半角英大文字(_半角英大文字). 半角英小文字(_半角英小文字) :- _半角英小文字 @>= a, _半角英小文字 @=< z. 半角英大文字(_半角英大文字) :- _半角英大文字 @>= 'A', _半角英大文字 @=< 'Z'. 半角数字(_半角数字) :- _半角数字 @>= '0', _半角数字 @=< '9'. 半角英記号(_半角英記号) :- member(_半角英記号,['!','"','#','$','%','&','\'','(',')','=','-','~','^','|','\\','@','[','}',']','+','*',';',':','<',',','>','.','?','/','_','\']). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #520 # お題: nをmで割って余りを切り上げる関数を作れ! # n個の埴輪をm個入りの蔵に全て入れるには蔵を少なくとも幾つ用意すればよいか? # nは0または自然数、mは自然数とする。 # 10 3 -> 4 'n個の埴輪をm個入りの蔵に全て入れるには蔵を少なくとも幾つ用意すればよいか?'(_n,_m,_幾つ) :- 'n個の埴輪をm個入りの蔵に全て入れるには蔵を'(_n,_m,_蔵ならび,_蔵の可能性), once('少なくとも幾つ用意すればよいか?'(_蔵ならび,_蔵ならびの可能性,_幾つ)). 'n個の埴輪をm個入りの蔵に全て入れるには蔵を'(_n,_m,_蔵ならび,_蔵ならびの可能性) :- findall(_蔵,findnsols(_m,_埴輪,between(1,_n,_),_蔵),_蔵ならび,_蔵ならびの可能性). '少なくとも幾つ用意すればよいか?'(_蔵ならび,_蔵ならびの可能性,_幾つ) :- _蔵ならびの可能性 = [], length(_蔵ならび,_幾つ). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #520 # お題: nをmで割って余りを切り上げる関数を作れ! # n個の埴輪をm個入りの蔵に全て入れるには蔵を少なくとも幾つ用意すればよいか? # nは0または自然数、mは自然数とする。 # 10 3 -> 4 'n個の埴輪をm個入りの蔵に全て入れるには蔵を少なくとも幾つ用意すればよいか?'(_n,_m,_幾つ) :- findall(_蔵,findnsols(_m,_埴輪,between(1,_n,_),_蔵),_蔵ならび), length(_蔵ならび,_幾つ). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #520 # お題: nをmで割って余りを切り上げる関数を作れ! # n個の埴輪をm個入りの蔵に全て入れるには蔵を少なくとも幾つ用意すればよいか? # nは0または自然数、mは自然数とする。 # 10 3 -> 4 'n個の埴輪をm個入りの蔵に全て入れるには蔵を少なくとも幾つ用意すればよいか?'(_n,_m,_幾つ) :- findall(_蔵,findnsols(_m,_埴輪,between(1,_n,_埴輪),_蔵),_蔵ならび), length(_蔵ならび,_幾つ). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/493 # SQLServer2008R2です. # テーブルデータはDATE(YYYYMMの6けたのint型),CODE(varchar型),VALUE(float型) # の3カラムからなります.各DATEの各CODEに対して過去3か月分の総和を算出したいと思います. # 元テーブル # DATE, CODE, VALUE # .... # 200101, AAA, 1 # 200102, AAA, 2 # 200103, AAA, 3 # 200104, AAA, 4 # 200101, BBB, 1 # .... # # 欲しい結果 # 200103, AAA, 6 # 200104, AAA, 9 # ....... # # 下記のようなSQLを書いたのですが,同じ結果の行が12か月分でてきます. # 何処を修正すればよろしいでしょうか?もしくは全然違うSQLでしょうか? # # SELECT A.DATE, A.CODE, SUM(B.VALUE) OVER (PARTITION BY B.DATE, B.CODE) # FROM TABLE A, TABLE B # WHERE A.CODE=B.CODE AND B.DATE>=A.DATE AND B.DATE>=(A.DATEの3か月前←計算式が長いので省略です) # ORDER BY A.DATE, A.CODE # # よろしくお願いいたします. # 'A'(200101,'AAA',1). 'A'(200102,'AAA',2). 'A'(200103,'AAA',3). 'A'(200104,'AAA',4). 'A'(200101,'BBB',1). 過去三ヶ月の集計(_過去三ヶ月の集計ならび) :- '_DATE,_CODEを鍵として、過去三ヶ月の_VALUEの集計'(_過去三ヶ月の集計ならび). '_DATE,_CODEを鍵として、過去三ヶ月の_VALUEの集計'(_過去三ヶ月の集計ならび) :- '_DATE,_CODEを鍵とする'(_DATE_CODEならび), findall([_DATE,_CODE,_集計],( '過去三ヶ月の全ての_DATE,_CODEに対して、_VALUEを集約する'(_DATE,_CODE,_DATE_CODEならび,_集計)),_過去三ヶ月の集計ならび). '_DATE,_CODEを鍵とする'(_DATE_CODEならび) :- setof([_DATE,_CODE],[_DATE,_CODE,_VALUE] ^ 'A'(_DATE,_CODE,_VALUE),_DATE_CODEならび). '過去三ヶ月の全ての_DATE,_CODEに対して、_VALUEを集約する'(_DATE,_CODE,_DATE_CODEならび,_集計) :- member([_DATE,_CODE],_DATE_CODEならび), '過去三ヶ月の_DATE,_CODEで_VAULEを集約'(_DATE,_CODE,_集計). '過去三ヶ月の_DATE,_CODEで_VAULEを集約'(_DATE,_CODE,_集計) :- '3ヶ月前の起点月'(_DATE,_3ヶ月前の起点月), findsum(_VALUE,( テーブルデータは過去三ヶ月の範囲内(_DATE,_CODE,_3ヶ月前の起点月,_VALUE)),_集計). テーブルデータは過去三ヶ月の範囲内(_DATE,_CODE,_3ヶ月前の起点月,_VALUE) :- 'A'(_DATE_1,_CODE,_VALUE), between(_3ヶ月前の起点月,_DATE,_DATE_1). '3ヶ月前の起点月'(_今月,_3ヶ月前の起点年月) :- 今月が1月から3月の範囲では前年となる(_今月,_3ヶ月前の起点年月),!. '3ヶ月前の起点月'(_今月,_3ヶ月前の起点年月) :- 今月が4月から12月の範囲では今年となる(_今月,_3ヶ月前の起点年月). 今月が1月から3月の範囲では前年となる(_今月,_3ヶ月前の起点月) :- M is _今月 mod 100, M =< 3, _3ヶ月前の起点月 is _今月 - 100 + 9. 今月が4月から12月の範囲では今年となる(_今月,_3ヶ月前の起点月) :- _3ヶ月前の起点月 is _今月 - 3. findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは 切ったトランプを用意する(_切ったトランプ) :- '52枚の整列したカード'(_52枚の整列したカード), シャッフル(_52枚の整列したカード,_切ったトランプ). '52枚の整列したカード'(_52枚の整列したカード) :- findall([_数,_スート], 'カードを数・スート順に生成する'(_数,_スート),_52枚の整列したカード). 'カードを数・スート順に生成する'(_数,_スート) :- between(1,13,_数), member(_スート,[スペード,ハート,ダイヤ,クラブ]). シャッフル([],[]) :- !. シャッフル(L,[A|R2]) :- 位置を示す乱数を使い一枚ずつ取り出して行くことによりシャッフルする(L,A,R2). 位置を示す乱数を使い一枚ずつ取り出して行くことによりシャッフルする(L,A,R2) :- 位置を示す乱数を使い一枚ずつ取り出して行く(L,A,R2), select(A,L,R1), シャッフル(R1,R2). 位置を示す乱数を使い一枚ずつ取り出して行く(L1,A,R2):- length(L1,Len), _乱数 is random(Len), nth0(_乱数,L1,A). % 以下のサイトは % % カレンダーの形式(何曜日から始まるか)と % 月日数と1日の曜日が分かっている時 % カレンダーをならびに得る。 % 第一週と最終週を変数で補正した曜日起点月カレンダー補正(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー_1), 第一週と最終週を変数で補正した(_カレンダー_1,_カレンダー). 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- findall(N,between(1,_月日数,N),_日ならび), 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号), 曜日番号からカレンダーを作成する(_起点曜日番号,_日ならび,_カレンダー). 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号) :- 曜日番号(_曜日番号_1,_起点曜日形式), 曜日番号(_曜日番号,_1日の曜日), _起点曜日番号 is (7 - (_曜日番号 - _曜日番号_1)) mod 7. 曜日番号からカレンダーを作成する(0,_日ならび,_カレンダー) :- 'N個組'(7,_日ならび,_カレンダー),!. 曜日番号からカレンダーを作成する(_曜日番号,_日ならび,_カレンダー) :- 先頭に変数日を付加して曜日番号からカレンダーを作成する(_曜日番号,_日ならび,_カレンダー). 先頭に変数日を付加して曜日番号からカレンダーを作成する(_曜日番号,_日ならび,[L0|LL]) :- length(L0,_曜日番号), append(L0,L1,_日ならび), 'N個組'(7,L1,LL). 曜日番号(0,日曜) :- !. 曜日番号(1,月曜) :- !. 曜日番号(2,火曜) :- !. 曜日番号(3,水曜) :- !. 曜日番号(4,木曜) :- !. 曜日番号(5,金曜) :- !. 曜日番号(6,土曜) :- !. 'N個組'(_,[],[]) :- !. 'N個組'(N,L,[U|R]) :- 先頭からN個(N,L,U,R1), 'N個組'(N,R1,R). 先頭からN個(N,L1,L2,R) :- 'L1の要素数はN個以上'(N,L1,L2,R),!. 先頭からN個(_,L,L,[]). 'L1の要素数はN個以上'(N,L1,L2,R) :- length(L2,N), append(L2,R,L1). 第一週と最終週を変数で補正した([L|LL1],[[_1,_2,_3,_4,_5,_6,_7]|LL2]) :- 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]), 最終週を変数で補正(LL1,LL2). 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]) :- append(_,L,[_1,_2,_3,_4,_5,_6,_7]). 最終週を変数で補正(LL1,LL2) :- append(LL1_1,[L_2],LL1), append(L_2,_,[_11,_12,_13,_14,_15,_16,_17]), append(LL1_1,[[_11,_12,_13,_14,_15,_16,_17]],LL2). 変数だけ値を詰める([],_). 変数だけ値を詰める([A|R],V) :- 変数だけ値を詰める(A,R,V). 変数だけ値を詰める(A,R,V) :- '_1が変数の場合は_2になる'(A,V), 変数だけ値を詰める(R,V). '_1が変数の場合は_2になる'(V,V) :- !. '_1が変数の場合は_2になる'(_,_). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 165代目 #321 # 総当りをする関数を作成して下さい # # VC++2010 # Windows Vista Home SP2 # # 例 # 第1引数 総当りの初めの文字 # 第2引数 総当りの最後の文字 # 第3引数 総当りする桁数 # func('a', 'z', 3); # とした時の動作は # aaa〜zzz、aa〜zz、a〜z # の全てを出力するようにしたいです # # よろしくお願いします # # 総当り(_総当りの初めの文字,_総当りの最後の文字,_総当りする桁数,_総当り) :- 文字ならびを確定する(_総当りの初めの文字,_総当りの最後の文字,_文字ならび), 総当り(_総当りする桁数,_文字ならび,_総当り). 総当り(1,_文字ならび,_文字ならび). 総当り(_桁数,_文字ならび,_総当り) :- 桁数を減じて(_桁数,_桁数_1), 低位桁から総当りを成長させる(_桁数_1,_文字ならび,_総当り). 桁数を減じて(_桁数,_桁数_1) :- _桁数 > 1, succ(_桁数_1,_桁数). 低位桁から総当りを成長させる(_桁数_1,_文字ならび,_総当り) :- 総当り(_桁数_1,_文字ならび,_総当り_2), 総当り_1(_文字ならび,_総当り_2,_総当り_1), append(_総当り_1,_総当り_2,_総当り). 総当り_1(_文字ならび,_総当り_2,_総当り_1) :- findall(_文字列,( 文字列の先頭文字は文字ならび中の一文字(_文字ならび,_総当り_2,_文字列)),_総当り_1). 文字列の先頭文字は文字ならび中の一文字(_文字ならび,_総当り_2,_文字列) :- member(_文字_1,_文字ならび), member(_文字列_2,_総当り_2), atom_concat(_文字_1,_文字列_2,_文字列). 文字ならびを確定する(_総当りの初めの文字,_総当りの最後の文字,_文字ならび) :- 文字範囲を文字コード範囲に変換(_総当りの初めの文字,_総当りの最後の文字,_総当りの初めの文字コード,_総当りの最後の文字コード), findall(_文字,( 一文字を得る(_総当りの初めの文字コード,_総当りの最後の文字コード,_文字)),_文字ならび). 文字範囲を文字コード範囲に変換(_総当りの初めの文字,_総当りの最後の文字,_総当りの初めの文字コード,_総当りの最後の文字コード) :- char_code(_総当りの初めの文字,_総当りの初めの文字コード), char_code(_総当りの最後の文字,_総当りの最後の文字コード). 一文字を得る(_総当りの初めの文字コード,_総当りの最後の文字コード,_文字) :- between(_総当りの初めの文字コード,_総当りの最後の文字コード,_文字コード), char_code(_文字,_文字コード). % 以下のサイトは # # ガリ夫くん:スマ子さん、最近実は数字萌えに目覚めたんです! # # スマ子さん: 藪から棒にアブノーマル宣言をされても困るのだけれども……。 # # ガリ夫くん:特に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のならび,_度数). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 164代目 #833 # お願いします。 # [1] 情報処理演習 # [2] 自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力するプログラムを作 # 成せよ. #  [3.1] Linux #  [3.2] コンパイラ名とバージョン:visual studio 2010 #  [3.3] C言語 # [4] 指定なし # [5] 特になし # # '自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力する' :- '自然数n > 0 を入力として,'(_n), 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数),!. '自然数n > 0 を入力として,'(_n) :- 整数を得る('0より大きい自然数',_n > 0,_n). 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数), 出力する(_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を'(_n,L), 一つ(L,_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を'(_n,L) :- findall(_その自明でない約数,'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数),L). 'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数) :- _n_1 is _n - 1, between(2,_n_1,_その自明でない約数), 0 is _n mod _その自明でない約数. 一つ([H|T],_その自明でない約数) :- length([H|T],Len), _乱数 is random(Len), nth0(_乱数,[H|T],_その自明でない約数). 出力する(_その自明でない約数) :- writef('%t\n',[_その自明でない約数]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 164代目 #833 # お願いします。 # [1] 情報処理演習 # [2] 自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力するプログラムを作 # 成せよ. #  [3.1] Linux #  [3.2] コンパイラ名とバージョン:visual studio 2010 #  [3.3] C言語 # [4] 指定なし # [5] 特になし # # '自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力する' :- '自然数n > 0 を入力として,'(_n), 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数),!. '自然数n > 0 を入力として,'(_n) :- 整数を得る('0より大きい自然数',_n > 0,_n). 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数), 出力する(_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を'(_n,L), 一つ(L,_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を'(_n,L) :- findall(_その自明でない約数,'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数),L). 'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数) :- _n_1 is _n - 1, between(2,_n_1,_その自明でない約数), 0 is _n mod _その自明でない約数. 一つ([H|T],_その自明でない約数) :- length([H|T],Len), _乱数 is random(Len), nth0(_乱数,[H|T],_その自明でない約数). 出力する(_その自明でない約数) :- writef('%t\n',[_その自明でない約数]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #33 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):1から15の数字から5個の数字を取って同じ数字が # 使われない並びの通りをすべて表示させなさい。 # 例:1 2 3 4 5 # 1 3 2 4 5 # 11 12 10 9 8 # :- op(750,xfx,すべて). '1から15の数字から5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる' :- '1から15の数字から'(_1から15の数字), '5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる'(_1から15の数字). '1から15の数字から'(_1から15の数字) :- findall(N,between(1,15,N),_1から15の数字). '5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる'(_1から15の数字) :- 同じ数字が使われない並びの通りを(_1から15の数字,5,_同じ数字が使われない並び) すべて 表示させる(_同じ数字が使われない並び). 同じ数字が使われない並びの通りを(_1から15の数字,5,_同じ数字が使われない並び) :- 順列(_1から15の数字,5,_同じ数字が使われない並び). 表示させる(_同じ数字が使われない並び) :- atomic_list_concat(_同じ数字が使われない並び,' ',_表示文字列), writef('%w\n',[_表示文字列]). P すべて Q :- forall(P,Q). 順列(_,0,[]). 順列(L1,N,[A|L2]) :- select(A,L1,R), succ(M,N), 順列(R,M,L2). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #33 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):1から15の数字から5個の数字を取って同じ数字が # 使われない並びの通りをすべて表示させなさい。 # 例:1 2 3 4 5 # 1 3 2 4 5 # 11 12 10 9 8 # :- op(750,xfx,すべて). '1から15の数字から5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる' :- '1から15の数字から'(_1から15の数字), '5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる'(_1から15の数字). '1から15の数字から'(_1から15の数字) :- findall(N,between(1,15,N),_1から15の数字). '5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる'(_1から15の数字) :- 同じ数字が使われない並びの通りを(_1から15の数字,5,_同じ数字が使われない並び) すべて 表示させる(_同じ数字が使われない並び). 同じ数字が使われない並びの通りを(_,0,[]). 同じ数字が使われない並びの通りを(L1,N,[_数字|L2]) :- select(_数字,L1,R), succ(M,N), 同じ数字が使われない並びの通りを(R,M,L2). 表示させる(_同じ数字が使われない並び) :- atomic_list_concat(_同じ数字が使われない並び,' ',_表示文字列), writef('%w\n',[_表示文字列]). P すべて Q :- forall(P,Q). % 以下のサイトは # 出典 :: twitter_by_horiesiniti_20150901_2 # 晴れの翌日はそれぞれ1/3ずつの確率で晴れ 曇り 雨 # 曇りの翌日はそれぞれ1/2の確立で曇り 雨 # 雨の翌日はそれぞれ1/2の確立で晴れか曇り # 初日を晴れとしてn日間の間の晴れ曇り雨の割合を答えよ。 翌日の天気確率(晴れ,晴れ,1 rdiv 3). 翌日の天気確率(晴れ,曇り,1 rdiv 3). 翌日の天気確率(晴れ,雨,1 rdiv 3). 翌日の天気確率(曇り,曇り,1 rdiv 2). 翌日の天気確率(曇り,雨,1 rdiv 2). 翌日の天気確率(雨,晴れ,1 rdiv 2). 翌日の天気確率(雨,曇り,1 rdiv 2). '初日を晴れとしてn日間の間の晴れ曇り雨の割合'(_n日間,_m日目,_天気,_確率) :- findall([_m日目,_天気,_確率],( '全ての天気節点の確率'(_n日間,_m日目,_天気の変遷,_天気,_確率)),_天気節点の確率ならび), 'n日間の天気の確率を得る'(_n日間,_天気節点の確率ならび,_m日目,_天気,_確率). '全ての天気節点の確率'(_n日間,_m日目,_天気の変遷,_天気,_確率) :- '天気節点での確率'(_n日間,1,_m日目,晴れ,1,[晴れ],_天気の変遷,_天気,_確率). '天気節点での確率'(_n日間,_m日目,_m日目,_天気,_確率,_天気の変遷,_天気の変遷,_天気,_確率). '天気節点での確率'(_n日間,_m_1日目,_m日目,_天気_1,_確率_1,_天気の変遷_1,_天気の変遷,_天気,_確率) :- 深さ優先で天気節点の確率を探索する(_n日間,_m_1日目,_m日目,_天気_1,_確率_1,_天気の変遷_1,_天気の変遷,_天気,_確率). 深さ優先で天気節点の確率を探索する(_n日間,_m_1日目,_m日目,_天気_1,_確率_1,_天気の変遷_1,_天気の変遷,_天気,_確率) :- _m_1日目 < _n日間, 翌日の天気確率を計算する(_天気_1,_確率_1,_翌日の天気,_確率_3), succ(_m_1日目,_m_2日目), '天気節点での確率'(_n日間,_m_2日目,_m日目,_翌日の天気,_確率_3,[_翌日の天気|_天気の変遷_1],_天気の変遷,_天気,_確率). 翌日の天気確率を計算する(_天気_1,_確率_1,_翌日の天気,_確率_3) :- 翌日の天気確率(_天気_1,_翌日の天気,_確率_2), _確率_3 is _確率_1 * _確率_2. 'n日間の天気の確率を得る'(_n日間,_天気節点の確率ならび,_m日目,_天気,_確率) :- between(1,_n日間,_m日目), member(_天気,[晴れ,曇り,雨]), findsum(_確率_1,member([_m日目,_天気,_確率_1],_天気節点の確率ならび),_確率). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは 整数から頭部零文字列(_桁,_整数,_数値を表す文字列) :- 整数を数字ならびに変換してその桁数を得る(_整数,_数字ならび,_数字部分の桁), 頭部の零ならびを作り数字ならびを追加した頭部零数字ならびを作る(_桁,_数字ならび,_数字部分の桁,_頭部零数字ならび), 頭部零数字ならびを数値を表す文字列に変換する(_頭部零数字ならび,_数値を表す文字列). 整数を数字ならびに変換してその桁数を得る(_整数,_数字ならび,_数字部分の桁) :- number_chars(_整数,_数字ならび), length(_数字ならび,_数字部分の桁). 頭部の零ならびを作り数字ならびを追加した頭部零数字ならびを作る(_桁,_数字ならび,_数字部分の桁,_頭部零数字ならび) :- _頭部零の桁 is _桁 - _数字部分の桁, findall('0',between(1,_頭部零の桁,_),_頭部零数字ならび,_数字ならび). 頭部零数字ならびを数値を表す文字列に変換する(_頭部零数字ならび,_数値を表す文字列) :- atom_chars(_数値を表す文字列,_頭部零数字ならび). % 以下のサイトは シャッフル(L1,L2) :- length(L1,Len), findall(N,between(1,Len,N),L), シャッフル(Len,L,L1,L2). シャッフル(0,_,_,[]) :- !. シャッフル(Len,L,L1,[_値|R]) :- 'L1からランダムに取り出して新たなリストを構成する'(Len,L,L1,_値,R). 'L1からランダムに取り出して新たなリストを構成する'(Len,L,L1,_値,R) :- 得られた乱数の位置にあるL1の値を取り出す(Len,L,L1,L_1,_値), succ(Len_1,Len), シャッフル(Len_1,L_1,L1,R). 得られた乱数の位置にあるL1の値を取り出す(Len,L,L1,L_1,_値) :- 得られた乱数の位置にある(Len,L,M), 'L1の値を取り出す'(L,L1,M,L_1,_値). 得られた乱数の位置にある(Len,L,M) :- N is random(Len) + 1, nth1(N,L,M). 'L1の値を取り出す'(L,L1,M,L_1,_値) :- nth1(M,L1,_値), select(M,L,L_1). % 以下のサイトは 'Σ'(_n_1,_n_2,_k,_目標の集約値,_目標,_集約合計) :- findsum(_目標の集約値,( between(_n_1,_n_2,_k),_目標),_集約合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '最小二乗法を用いて、1次関数 ax+b をモデルとして近似し、係数a,bを決定する。 最小二乗法とは、測定で得られた数値の組を、適当なモデルから想定される 想定する関数が測定値に対してよい近似となるように、残差の二乗和を最小と するような係数を決定する方法。'(_測定で得られた数値の組,_a,_b) :- length(_測定で得られた数値の組,_標本数), '測定で得られた数値の組をLx,Lyに分解する'(_測定で得られた数値の組,Lx,Ly), '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b). '測定で得られた数値の組をLx,Lyに分解する'([],[],[]). '測定で得られた数値の組をLx,Lyに分解する'([(X,Y)|R],[X|Rx],[Y|Ry]) :- '測定で得られた数値の組をLx,Lyに分解する'(R,Rx,Ry). '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- 係数aの式の分子(_標本数,Lx,Ly,_分子), 係数aの式の分母(_標本数,Lx,Ly,_分母), _a is _分子 / _分母. 係数aの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_3), _分子 is _標本数 * _合計_1 - _合計_2 * _合計_3. 係数aの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. 係数b(_標本数,Lx,Ly,_b) :- 係数bの式の分子(_標本数,Lx,Ly,_分子), 係数bの式の分母(_標本数,Lx,Ly,_分母), _b is _分子 / _分母. 係数bの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_2), 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_3), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_4), _分子 is _合計_1 * _合計_2 - _合計_3 * _合計_4. 係数bの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. % 以下のサイトは 'Σ'(_n_1,_n_2,_k,_目標の集約値,_目標,_集約合計) :- findsum(_目標の集約値,( between(_n_1,_n_2,_k),_目標),_集約合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '最小二乗法を用いて、1次関数 ax+b をモデルとして近似し、係数a,bを決定する。 最小二乗法とは、測定で得られた数値の組を、適当なモデルから想定される 想定する関数が測定値に対してよい近似となるように、残差の二乗和を最小と するような係数を決定する方法。'(_測定で得られた数値の組,_a,_b) :- length(_測定で得られた数値の組,_標本数), '測定で得られた数値の組をLx,Lyに分解する'(_測定で得られた数値の組,Lx,Ly), '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b). '測定で得られた数値の組をLx,Lyに分解する'([],[],[]). '測定で得られた数値の組をLx,Lyに分解する'([(X,Y)|R],[X|Rx],[Y|Ry]) :- '測定で得られた数値の組をLx,Lyに分解する'(R,Rx,Ry). '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- 係数aの式の分子(_標本数,Lx,Ly,_分子), 係数aの式の分母(_標本数,Lx,Ly,_分母), _a is _分子 / _分母. 係数aの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_3), _分子 is _標本数 * _合計_1 - _合計_2 * _合計_3. 係数aの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. 係数b(_標本数,Lx,Ly,_b) :- 係数bの式の分子(_標本数,Lx,Ly,_分子), 係数bの式の分母(_標本数,Lx,Ly,_分母), _b is _分子 / _分母. 係数bの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_2), 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_3), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_4), _分子 is _合計_1 * _合計_2 - _合計_3 * _合計_4. 係数bの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. % 以下のサイトは Σ(_n_1,_n_2,_k,_目標の集約値,_目標,_集約合計) :- findsum(_目標の集約値,( between(_n_1,_n_2,_k), call(_目標)),_集約合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '一次方程式 y=ax+b の係数_a,_bを最小二乗法を使って得る'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_1), Σ(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), Σ(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_3), Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_4), Σ(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_5), _a is (_標本数 * _合計_1 - _合計_2 * _合計_3) / ( _標本数 * _合計_4 - _合計_5 ^ 2). 係数b(_標本数,Lx,Ly,_b) :- Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), Σ(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_2), Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_3), Σ(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_4), Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_5), Σ(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_6), _b is (_合計_1 * _合計_2 - _合計_3 * _合計_4) / ( _標本数 * _合計_5 - _合計_6 ^ 2). % 以下のサイトは sigma(_n_1,_n_2,_k,S,P,_合計) :- findsum(S,( between(_n_1,_n_2,_k), call(P)),_合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '一次方程式 y=ax+b の係数_a,_bを最小二乗法を使って得る'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_1), sigma(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), sigma(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_3), sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_4), sigma(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_5), _a is (_標本数 * _合計_1 - _合計_2 * _合計_3) / ( _標本数 * _合計_4 - _合計_5 ^ 2). 係数b(_標本数,Lx,Ly,_b) :- sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), sigma(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_2), sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_3), sigma(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_4), sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_5), sigma(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_6), _b is (_合計_1 * _合計_2 - _合計_3 * _合計_4) / ( _標本数 * _合計_5 - _合計_6 ^ 2). % 以下のサイトは # 出典 :: CodeIQ q1533 # # 中学数学のひとつの山ともいえる、因数分解。 # 数学を嫌いになるきっかけとなってしまった人も多いのではないでしょうか? # そんな因数分解を、プログラミングで解いてみましょう! # # ■問題 # 二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 # これを(ax+b)(cx+d)の形に因数分解し、a, b, c, dの値を出力してください。 # # # ■例 # 【入力】 # 4, -23, 15 # 【出力】 # 4, -3, 1, -5 # # つまり、4x2-23x+15=(4x-3)(x-5)という因数分解を行った結果を出力するプログラムです。 # (出力は、順番を入れ替えた1, -5, 4, -3でも正解となりますが、いずれか一方を出力するものとします。) # なお、α、β、γとして与えられる数字は互いに素な整数であるものとします。 # ※出力エラーの表記は、エラーとわかる何らかの出力で構いません。(※2015年4月20日13:30追記) # # # 最低限、以下のテストデータで正しい出力が得られることを確認してください。 # # 【テストデータ1:入力】 # 3, 10, 3 # 【出力】 # 1, 3, 3, 1 または 3, 1, 1, 3 # # 【テストデータ2:入力】 # 6, -1, -15 # 【出力】 # 2, 3, 3, -5 または 3, -5, 2, 3 # # 【テストデータ3:入力】 # 12, -1, -6 # 【出力】 # 3, 2, 4, -3 または 4, -3, 3, 2 # # 【テストデータ4:入力】 # 3, -8, 4 # 【出力】 # 1, -2, 3, -2 または 3, -2, 1, -2 # # 【テストデータ5:入力】 # 3, 5, 7 # 【出力】 # エラー # '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、a, b, c, dの値を出力してください。'(_α,_β,_γ,_a,_b,_c,_d) :- findall([_a,_b,_c,_d], '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、'(_α,_β,_γ,_a,_b,_c,_d),_解ならび), 重複解を取り除く(_解ならび,_a,_b,_c,_d). '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、'(_α,_β,_γ,_a,_b,_c,_d) :- '_a,_b,_c,_dの候補を得る'(_α,_γ,_a,_b,_c,_d), _β is _a * _d + _b * _c. '_a,_b,_c,_dの候補を得る'(_α,_γ,_a,_b,_c,_d) :- '_a,_c候補'(_α,_a,_c), '_b,_d候補'(_γ,_b,_d). '_a,_c候補'(_α,_a,_c) :- 因数に分解する(_α,_a,_c) . '_b,_d候補'(_γ,_b,_d) :- 因数に分解する(_γ,_b,_d) . 因数に分解する(A,B,C) :- 'Aの絶対値からB_1候補を得る'(A,_正のA,B_1), '因数B_1,C_1を得る'(_正のA,B_1,C_1), 符号の組合せ(A,B_1,C_1,B,C). 'Aの絶対値からB_1候補を得る'(A,_正のA,B_1) :- _正のA is abs(A), between(1,_正のA,B_1). '因数B_1,C_1を得る'(_正のA,B_1,C_1) :- 0 is _正のA mod B_1, C_1 is _正のA // B_1. 符号の組合せ(A,B_1,C_1,B,C) :- 'Aが正の時は二数の符号は同じになる'(A,B_1,C_1,B,C). 符号の組合せ(A,B_1,C_1,B,C) :- 'Aが負の時は二数の符号は異なる'(A,B_1,C_1,B,C). 'Aが正の時は二数の符号は同じになる'(A,B_1,C_1,B,C) :- A > 0, 二数の符号は同じになる(A,B_1,C_1,B,C). 二数の符号は同じになる(A,B,C,B,C). 二数の符号は同じになる(A,B_1,C_1,B,C) :- B is B_1 * -1, C is C_1 * -1. 'Aが負の時は二数の符号は異なる'(A,B_1,C_1,B,C) :- A < 0, 二数の符号は異なる(A,B_1,C_1,B,C). 二数の符号は異なる(A,B_1,C,B,C) :- B is B_1 * -1. 二数の符号は異なる(A,B,C_1,B,C) :- C is C_1 * -1. 重複解を取り除く(_解ならび,_a,_b,_c,_d) :- append(L0,[[_a,_b,_c,_d]|_],_解ならび), \+(member([_c,_d,_a,_b],L0)). % 以下のサイトは # 出典 :: CodeIQ q1533 # # 中学数学のひとつの山ともいえる、因数分解。 # 数学を嫌いになるきっかけとなってしまった人も多いのではないでしょうか? # そんな因数分解を、プログラミングで解いてみましょう! # # ■問題 # 二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 # これを(ax+b)(cx+d)の形に因数分解し、a, b, c, dの値を出力してください。 # # # ■例 # 【入力】 # 4, -23, 15 # 【出力】 # 4, -3, 1, -5 # # つまり、4x2-23x+15=(4x-3)(x-5)という因数分解を行った結果を出力するプログラムです。 # (出力は、順番を入れ替えた1, -5, 4, -3でも正解となりますが、いずれか一方を出力するものとします。) # なお、α、β、γとして与えられる数字は互いに素な整数であるものとします。 # ※出力エラーの表記は、エラーとわかる何らかの出力で構いません。(※2015年4月20日13:30追記) # # # 最低限、以下のテストデータで正しい出力が得られることを確認してください。 # # 【テストデータ1:入力】 # 3, 10, 3 # 【出力】 # 1, 3, 3, 1 または 3, 1, 1, 3 # # 【テストデータ2:入力】 # 6, -1, -15 # 【出力】 # 2, 3, 3, -5 または 3, -5, 2, 3 # # 【テストデータ3:入力】 # 12, -1, -6 # 【出力】 # 3, 2, 4, -3 または 4, -3, 3, 2 # # 【テストデータ4:入力】 # 3, -8, 4 # 【出力】 # 1, -2, 3, -2 または 3, -2, 1, -2 # # 【テストデータ5:入力】 # 3, 5, 7 # 【出力】 # エラー # '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、a, b, c, dの値を出力してください。'(_α,_β,_γ,_a,_b,_c,_d) :- findall([_a,_b,_c,_d], '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、'(_α,_β,_γ,_a,_b,_c,_d),_解ならび), 重複解を取り除く(_解ならび,_a,_b,_c,_d). '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、'(_α,_β,_γ,_a,_b,_c,_d) :- 検査範囲の確定(_α,_γ,S_1,E_1,S_2,E_2), '_a,_b,_c,_dの候補を得る'(_α,_γ,S_1,E_1,S_2,E_2,_a,_b,_c,_d), _β is _a * _d + _c * _b. '_a,_b,_c,_dの候補を得る'(_α,_γ,S_1,E_1,S_2,E_2,_a,_b,_c,_d) :- '_a,_c候補'(_α,S_1,E_1,_a,_c), '_b,_d候補'(_γ,S_2,E_2,_b,_d). '_a,_c候補'(_α,S_1,E_1,_a,_c) :- between(S_1,E_1,_a), between(S_1,E_1,_c), _α is _a * _c. '_b,_d候補'(_γ,S_2,E_2,_b,_d) :- between(S_2,E_2,_b), between(S_2,E_2,_d), _γ is _b * _d. 検査範囲の確定(_α,_γ,S_1,E_1,S_2,E_2) :- '_αの検査範囲'(_α,S_1,E_1), '_γの検査範囲'(_γ,S_2,E_2). '_αの検査範囲'(_α,S_1,E_1) :- E_1 is abs(_α), S_1 is -1 * E_1. '_γの検査範囲'(_γ,S_2,E_2) :- E_2 is abs(_γ), S_2 is -1 * E_2. 重複解を取り除く(_解ならび,_a,_b,_c,_d) :- append(L0,[[_a,_b,_c,_d]|_],_解ならび), \+(member([_c,_d,_a,_b],L0)), '_a,_cと_b,_dにそれぞれ-1を掛ける'(_a,_b,_c,_d,_a_1,_b_1,_c_1,_d_1), \+(member([_a_1,_b_1,_c_1,_d_1],L0)). '_a,_cと_b,_dにそれぞれ-1を掛ける'(_a,_b,_c,_d,_a_1,_b_1,_c_1,_d_1) :- _a_1 is _a * -1, _b_1 is _b * -1, _c_1 is _c * -1, _d_1 is _d * -1. % 以下のサイトは # 出典 :: 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(_ヘッドゼロサプライ数値表現,_ヘッドゼロサプライされたリスト). % 以下のサイトは 検索した用語の医療用語である確信度(_文字列,_検索した用語,_変位,_文字数,_医療用語,_医療用語文字数,_確信度) :- 最も長い医療用語(_最も長い医療用語文字数), 検索した用語(_文字列,_最も長い医療用語文字数,_変位,_文字数,_検索した用語), 検索した用語は医療用語でありその確信度は(_検索した用語,_文字数,_医療用語,_医療用語文字数,_確信度). 最も長い医療用語文字数(_最も長い医療用語文字数) :- findmax(_文字数,( 医療用語集(_医療用語), sub_atom(_医療用語,0,_文字数,0,_医療用語)),_最も長い医療用語文字数). 検索した用語(_文字列,_最も長い医療用語文字数,_変位,_文字数,_検索した用語) :- sub_atom(_文字列,_変位,_文字数,_,_検索した用語), between(1,_最も長い医療用語文字数,_文字数). 検索した用語は医療用語の一部を構成する(_検索した用語,_文字数,_医療用語,_医療用語文字数) :- 医療用語集(_医療用語), sub_atom(_医療用語,0,_医療用語の文字数,0,_医療用語), sub_atom(_医療用語,_,_文字数,_,_検索した用語). 検索した用語は医療用語でありその確信度は(_検索した用語,_文字数,_医療用語,_医療用語文字数,_確信度) :- 検索した用語は医療用語の一部を構成する(_検索した用語,_文字数,_医療用語,_医療用語文字数), _確信度 is _文字数 / _医療用語の文字数. % 以下のサイトは 小の月(_小の月) :- '十二ヶ月の中で定められた月末日が31日の月を大の月といい、この大の月でない月を小の月という'(_小の月). '十二ヶ月の中で定められた月末日が31日の月を大の月といい、この大の月でない月を小の月という'(_小の月) :- 十二ヶ月の中で(_小の月), '定められた月末日が31日の月を大の月といい、この大の月でない月を小の月という'(_小の月). 十二ヶ月の中で(_月) :- between(1,12,_月). '定められた月末日が31日の月を大の月といい、この大の月でない月を小の月という'(_小の月) :- '定められた月末日が31日の月を大の月といい、'(_大の月), この大の月でない月を小の月という(_大の月,_小の月). '定められた月末日が31日の月を大の月といい、'(_大の月) :- 定められた月末日が31日の月(_大の月). 大の月(_大の月) :- '定められた月末日が31日の月を大の月といい、'(_大の月). 定められた月末日が31日の月(1). 定められた月末日が31日の月(3). 定められた月末日が31日の月(5). 定められた月末日が31日の月(7). 定められた月末日が31日の月(8). 定められた月末日が31日の月(10). 定められた月末日が31日の月(12). この大の月でない月を小の月という(_大の月,_小の月) :- \+(_大の月 = _小の月). % 以下のサイトは 小の月(_小の月) :- 十二ヶ月の中で定められた月末日が31日ではない月を小の月という(_小の月). 十二ヶ月の中で定められた月末日が31日ではない月を小の月という(_小の月) :- 十二ヶ月の中で(_小の月), 定められた月末日が31日ではない月を(_小の月). 十二ヶ月の中で(_月) :- between(1,12,_月). 定められた月末日が31日ではない月を(_小の月) :- \+((月末日が31日の月(_月末日が31日の月ならび),member(_小の月,_月末日が31日の月ならび)). 月末日が31日の月([1,3,5,7,8,10,12]). % 以下のサイトは 小の月(_小の月) :- 十二ヶ月の中で定められた月末日が31日ではない月を小の月という(_小の月). 十二ヶ月の中で定められた月末日が31日ではない月を小の月という(_小の月) :- 十二ヶ月の中で(_小の月), 定められた月末日が31日ではない月を(_小の月). 十二ヶ月の中で(_月) :- between(1,12,_月). 定められた月末日が31日ではない月を(_小の月) :- \+(月末日が31日の月(_小の月)). 月末日が31日の月(1). 月末日が31日の月(3). 月末日が31日の月(5). 月末日が31日の月(7). 月末日が31日の月(8). 月末日が31日の月(10). 月末日が31日の月(12). % 以下のサイトは 小の月(_小の月) :- '十二ヶ月の中で定められた月末日が31日の月を大の月といい、この大の月でない月を小の月という'(_小の月). '十二ヶ月の中で定められた月末日が31日の月を大の月といい、この大の月でない月を小の月という'(_小の月) :- 十二ヶ月の中で(_小の月), 定められた月末日が31日ではない月を(_小の月). 十二ヶ月の中で(_月) :- between(1,12,_月). 定められた月末日が31日ではない月を(_小の月) :- \+(月末日が31日の月(_小の月)). 月末日が31日の月(1). 月末日が31日の月(3). 月末日が31日の月(5). 月末日が31日の月(7). 月末日が31日の月(8). 月末日が31日の月(10). 月末日が31日の月(12). % 以下のサイトは # 出典 :: CodeIQ q1385 言語不問:通分と約分を実装しよう # # 小学生が分数を学ぶときに、最初に躓くのが「通分」です。 # # 分母の異なる分数の足し算や引き算を行うとき、先に通分を行っておく必要があります。 # # また、計算した結果、「約分」できる場合は、可能な限り簡単な分数にしないと正解になりません。 # # 【問題】 # # では、入力される二つの分数について足し算を行った時に、 # # 正しい答えを出力するプログラムを作り、 # # 問1〜問5の標準入力に対して、出力内容を答えてください。 # # ※分母が1の時には整数として出力してください。 # # ■例 # # 例1) # # 【標準入力】 # # 5/6 # # 1/10 # # 【標準出力】 # # 14/15 # # 例2) # # 【標準入力】 # # 1/3 # # 2/3 # # 【標準出力】 # # 1 # # ■問1〜5 # # 問1) # # 1/3 # # 2/7 # # 問2) # # 2/8 # # 3/5 # # 問3) # # 3/10 # # 1/6 # # 問4) # # 3/4 # # 5/8 # # 問5) # # 2/5 # # 2/3 # # 【解答方法】 # # 解答用テキストファイルanswer_q1385.txtをダウンロードし、必要事項をご記入ください。 # # 必須事項がすべて記入されていることをご確認いただいた後、テキストファイルのままアップロードしてください。 # # 【注意】 # # ・ご提出いただいたプログラムは個別に実行テストを行いますので、 # #  解答用テキストファイルに書かれた解答が正解していても最高評価になるとは限りません。 # # ・プログラミング言語は不問ですが、古すぎる実行環境・特殊な設備を要する実行環境では採点できない場合がございます。 # # ・使用する言語は1解答につき必ず1種類でお願いします。 # #  どうしても複数の言語を用いる場合は、解答に「メインの言語名」を明記してください。 # '問1〜問5の標準入力に対して、出力内容を答えてください。 ■問1〜5 問1) 1/3 2/7 問2) 2/8 3/5 問3) 3/10 1/6 問4) 3/4 5/8 問5) 2/5 2/3' :- between(1,5,N), '入力される二つの分数について足し算を行った時に、正しい答えを出力する', N = 5. '入力される二つの分数について足し算を行った時に、正しい答えを出力する' :- 入力される二つの分数(_分子_1 / _分母_1,_分子_2 / _分母_2), 分数の加算(_分子_1 / _分母_1,_分子_2 / _分母_2,_加算された分子 / _加算された分母), 約分(_加算された分子 / _加算された分母,_約分された分子 / _約分された分母), 答えを出力する(_約分された分子 / _約分された分母). 分数の加算(_分子_1 / _分母_1,_分子_2 / _分母_2,_加算された分子 / _通分された分母) :- 通分(_分子_1 / _分母_1,_分子_2 / _分母_2,_通分された分子_1 / _通分された分母,_通分された分子_2 / _通分された分母), _加算された分子 is _通分された分子_1 + _通分された分子_2,!. 入力される二つの分数(_分子_1 / _分母_1,_分子_2 / _分母_2) :- 入力される分数(_分子_1 / _分母_1), 入力される分数(_分子_2 / _分母_2). 入力される分数(_分子 / _分母) :- 行入力(_行), read_term_from_atom(_行,_分子 / _分母,[]). 行入力(_行) :- get_char(_先読み文字), 行ならびを得る(_先読み文字,_行ならび), atom_chars(_行,_行ならび). 行ならびを得る('\n',[]) :- !. 行ならびを得る(_先読み文字,[_先読み文字|R]) :- get_char(_次の文字), 行ならびを得る(_次の文字,R). 答えを出力する(_約分された分子 / _約分された分母) :- writef('%t\n',[_約分された分子 / _約分された分母]). 約分(_分子 / _分母,X) :- 最大公約数で分子分母を割って約分する(_分子,_分母,_分子_1,_分母_1), 負数の場合のマイナス符号は分子側に付ける(_分子_1,_分母_1,_分子_2,_分母_2), 分母が1の時は整数に変形(_分子_2,_分母_2,X). 最大公約数で分子分母を割って約分する(_分子_1,_分母_1,_分子,_分母) :- 最大公約数(_分子_1,_分母_1,_最大公約数), _分子 is _分子_1 // _最大公約数, _分母 is _分母_1 // _最大公約数. 負数の場合のマイナス符号は分子側に付ける(_分子_1,_分母_1,_分子,_分母) :- 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母),!. 負数の場合のマイナス符号は分子側に付ける(_分子,_分母,_分子,_分母). 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母) :- _分母_1 =< 0, _分子 is _分子_1 * -1, _分母 is _分母_1 * -1. 分母が1の時は整数に変形(_分子,1,_分子) :- !. 分母が1の時は整数に変形(_分子,1.0,_分子) :- !. 分母が1の時は整数に変形(_分子,_分母,_分子 / _分母). 通分(_分子_1 / _分母_1,_分子_2 / _分母_2,_通分された分子_1 / _最小公倍数,_通分された分子_2 / _最小公倍数) :- 最小公倍数([_分母_1,_分母_2],_最小公倍数), _通分された分子_1 is _分子_1 * (_最小公倍数 // _分母_1), _通分された分子_2 is _分子_2 * (_最小公倍数 // _分母_2). 最大公約数([_整数],_整数). 最大公約数([_整数|R],_最大公約数) :- 最大公約数(R,_最大公約数_2), 二つの整数の最大公約数(_整数,_最大公約数_2,_最大公約数). 二つの整数の最大公約数(M,N,X) :- 二つの整数の絶対値をとる(M,N,M_2,N_2), 最大公約数をユークリッドの互除法で求める(M_2,N_2,Y), 負数解の可能性も探る(M,M_2,N,N_2,Y,X). 負数解の可能性も探る(M,M_2,N,N_2,Y,X) :- setof(X,[M,M_2,N,N_2,Y,X] ^ 負数解の可能性(M,M_2,N,N_2,Y,X),L), member(X,L). 負数解の可能性(M,M_2,_,_,Y,X) :- X is Y * (M // M_2). 負数解の可能性(_,_,N,N_2,Y,X) :- X is Y * (N // N_2). 二つの整数の絶対値をとる(M,N,M_2,N_2) :- M_2 is abs(M), N_2 is abs(N). 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 最小公倍数(_整数_1,_整数_2,_最小公倍数) :- 二つの整数の最小公倍数(_整数_1,_整数_2,_最小公倍数). 最小公倍数(_整数ならび,_最小公倍数) :- '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'(_整数ならび,_最小公倍数). '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'([_整数],_整数). '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'([_整数|R],_最小公倍数) :- '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'(R,_最小公倍数_1), 二つの整数の最小公倍数(_整数,_最小公倍数_1,_最小公倍数). 二つの整数の最小公倍数(A,B,X) :- 二つの整数の最大公約数(A,B,_最大公約数), X is A * B // _最大公約数. % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # 横書文書を縦書文書に変形する(_横書文書,_縦書文書) :- 横書文書を縦書文書に変形する(_横書文書,0,_縦書文書). 横書文書を縦書文書に変形する(_横書文書,_列間隔文字数,_縦書文書) :- 改行を区切りに行ならびに変形する(_横書文書,_行ならび), 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書). 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書) :- 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび), 行ならびを転置する(_矩形ならび,_転置した矩形ならび), 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書). 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書) :- 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび), 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 改行を区切りに行ならびに変形する(_横書文書,[_前文字列|R]) :- 改行を区切りに(_横書文書,_前文字列,_後文字列), 改行を区切りに行ならびに変形する(_後文字列,R). 改行を区切りに行ならびに変形する(_文字列,R) :- 改行が存在しない場合停止する(_文字列,R). 改行が存在しない場合停止する('',[]) :- !. 改行が存在しない場合停止する(_文書,[_文書]). 改行を区切りに(_横書文書,_前文字列,_後文字列) :- sub_atom(_横書文書,S,1,R,'\n'), sub_atom(_横書文書,0,S,_,_前文字列), sub_atom(_横書文書,_,R,0,_後文字列),!. 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび) :- 最大文字列長を調べ(_行ならび,_最大文字列長), その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび). 最大文字列長を調べ(_行ならび,_最大文字列長) :- findmax(_文字数,( member(_行,_行ならび), atom_length(_行,_文字数)),_最大文字列長). その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび) :- findall(_空白を付加した文字列,( member(_行,_行ならび), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列)),_矩形ならび). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列) :- atom_length(_行,_文字列長), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列) :- 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列), atom_concat(_行,_空白文字列,_空白を付加した文字列). 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列) :- _nth1 is _最大文字列長 - _文字列長, findall(' ',( between(1,_nth1,_)),_空白文字ならび), 文字ならびを文字列に変換する(_空白文字列,_空白文字ならび). 行ならびを転置する(_矩形ならび,_転置された矩形ならび) :- 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび), 転置(_矩形文字ならび,_転置された矩形文字ならび), 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび). 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび) :- findall(_文字ならび,( member(_行,_矩形ならび), 文字列を文字ならびに変換する(_行,_文字ならび)),_矩形文字ならび). 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび) :- findall(_文字列,( member(_文字ならび,_転置された矩形文字ならび), 文字ならびを文字列に変換する(_文字列,_文字ならび)),_転置された矩形ならび). 転置した矩形ならびの各行文字列を反転する(_転置した矩形ならび,_反転した行文字列) :- member(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列). 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび) :- findall(_反転した行文字列,( member(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列)),_要素が反転した転置した矩形ならび). 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 列間隔文字を挟んで縦書文書に変形する(_矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで(_矩形ならび,_列間隔文字数,_矩形ならび_1), 縦書文書に変形する(_矩形ならび_1,_縦書文書). 列間隔文字を挟んで(_矩形ならび_1,_列間隔文字数,_矩形ならび_2) :- 列間隔文字(_列間隔文字数,_列間隔文字), findall(_行,( 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行)),_矩形ならび_2). 列間隔文字(_列間隔文字数,_列間隔文字) :- findall(' ',( between(1,_列間隔文字数,_)),_列間隔文字ならび), atomic_list_concat(_列間隔文字ならび,_列間隔文字). 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行) :- member(_行_1,_矩形ならび_1), 文字列を文字ならびに変換する(_行_1,_文字ならび), atomic_list_concat(_文字ならび,_列間隔文字,_行). 縦書文書に変形する(_矩形ならび_1,_縦書文書) :- atomic_list_concat(_矩形ならび_1,'\n',_縦書文書). 文字列の反転(_文字列,_反転した文字列) :- 文字列を文字ならびに変換する(_文字列,_文字ならび), 文字ならびを反転する(_文字ならび,_反転した文字ならび), 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を文字ならびに変換する(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 文字ならびを反転する(_文字ならび,_反転した文字ならび) :- reverse(_文字ならび,_反転した文字ならび). 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび) :- atom_chars(_反転した文字列,_反転した文字ならび). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). findmax(A,P,_最大値) :- findall(A,P,L), max_list(L,_最大値). % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # :- op(700,xfx,は). 横書文書を縦書文書に変形する(_横書文書,_縦書文書) :- 横書文書を縦書文書に変形する(_横書文書,0,_縦書文書). 横書文書を縦書文書に変形する(_横書文書,_列間隔文字数,_縦書文書) :- 改行を区切りに行ならびに変形する(_横書文書,_行ならび), 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書). 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書) :- 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび), 行ならびを転置する(_矩形ならび,_転置した矩形ならび), 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書). 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書) :- 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび), 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 改行を区切りに行ならびに変形する(_横書文書,[_前文字列|R]) :- 改行を区切りに(_横書文書,_前文字列,_後文字列), 改行を区切りに行ならびに変形する(_後文字列,R). 改行を区切りに行ならびに変形する(_文字列,R) :- 改行が存在しない場合停止する(_文字列,R). 改行が存在しない場合停止する('',[]) :- !. 改行が存在しない場合停止する(_文書,[_文書]). 改行を区切りに(_横書文書,_前文字列,_後文字列) :- 副文字列(_横書文書,_先頭からの変位,1,_末尾からの変位,'\n'), 副文字列(_横書文書,0,_先頭からの変位,_,_前文字列), 副文字列(_横書文書,_,_末尾からの変位,0,_後文字列),!. 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび) :- 最大文字列長を調べ(_行ならび,_最大文字列長), その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび). 最大文字列長を調べ(_行ならび,_最大文字列長) :- 解の最大値(_文字数,( 行ならびから行を取り出す(_行,_行ならび), 文字列長(_行,_文字数)),_最大文字列長). その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび) :- 解を集める(_空白を付加した文字列,( 行ならびから行を取り出す(_行,_行ならび), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列)),_矩形ならび). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列) :- 文字列長(_行,_文字列長), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列) :- 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列), 二つの文字列を結合する(_行,_空白文字列,_空白を付加した文字列). 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列) :- _最大文字列長と文字列長の差 は _最大文字列長 - _文字列長, 解を集める(' ',( 整数を順に生成する(1,_最大文字列長と文字列長の差,_)),_空白文字ならび), 文字ならびを文字列に変換する(_空白文字列,_空白文字ならび). 行ならびを転置する(_矩形ならび,_転置された矩形ならび) :- 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび), 転置(_矩形文字ならび,_転置された矩形文字ならび), 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび). 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび) :- 解を集める(_文字ならび,( 矩形ならびから行を取り出す(_行,_矩形ならび), 文字列を文字ならびに変換する(_行,_文字ならび)),_矩形文字ならび). 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび) :- 解を集める(_文字列,( 矩形文字ならびから文字ならびを取り出す(_文字ならび,_転置された矩形文字ならび), 文字ならびを文字列に変換する(_文字列,_文字ならび)),_転置された矩形ならび). 転置した矩形ならびの各行文字列を反転する(_転置した矩形ならび,_反転した行文字列) :- 要素の取り出し(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列). 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび) :- 解を集める(_反転した行文字列,( 矩形ならびから行を取り出す(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列)),_要素が反転した転置した矩形ならび). 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 列間隔文字を挟んで縦書文書に変形する(_矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで(_矩形ならび,_列間隔文字数,_矩形ならび_1), 縦書文書に変形する(_矩形ならび_1,_縦書文書). 列間隔文字を挟んで(_矩形ならび_1,_列間隔文字数,_矩形ならび_2) :- 列間隔文字(_列間隔文字数,_列間隔文字), 解を集める(_行,( 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行)),_矩形ならび_2). 列間隔文字(_列間隔文字数,_列間隔文字) :- 解を集める(' ',( 整数を順に生成する(1,_列間隔文字数,_)),_列間隔文字ならび), 文字列を結合する(_列間隔文字ならび,_列間隔文字). 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行) :- 矩形ならびから行を取り出す(_行_1,_矩形ならび_1), 文字列を文字ならびに変換する(_行_1,_文字ならび), 文字列を結合する(_文字ならび,_列間隔文字,_行). 縦書文書に変形する(_矩形ならび_1,_縦書文書) :- 文字列を結合する(_矩形ならび_1,'\n',_縦書文書). 文字列の反転(_文字列,_反転した文字列) :- 文字列を文字ならびに変換する(_文字列,_文字ならび), 文字ならびを反転する(_文字ならび,_反転した文字ならび), 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 副文字列(_文字列,_開始位置,_長さ,_残り文字数,_副文字列) :- sub_atom(_文字列,_開始位置,_長さ,_残り文字数,_副文字列). 矩形ならびから行を取り出す(_行,_矩形ならび) :- member(_行,_矩形ならび). 矩形文字ならびから文字ならびを取り出す(_文字ならび,_転置された矩形文字ならび) :- member(_文字ならび,_転置された矩形文字ならび). 行ならびから行を取り出す(_行,_行ならび) :- member(_行,_行ならび). 二つの文字列を結合する(_文字列_1,_文字列_2,_結合した文字列) :- atom_concat(_文字列_1,_文字列_2,_結合した文字列). 文字列を結合する(_文字列ならび,_挿入文字,_結合した文字列) :- atomic_list_concat(_文字列ならび,_挿入文字,_結合した文字列). 文字列を結合する(_文字列ならび,_結合した文字列) :- atomic_list_concat(_文字列ならび,_結合した文字列). 文字列を文字ならびに変換する(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 文字ならびを反転する(_文字ならび,_反転した文字ならび) :- reverse(_文字ならび,_反転した文字ならび). 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび) :- atom_chars(_反転した文字列,_反転した文字ならび). 文字列長(_文字列,_文字列長) :- atom_length(_文字列,_文字列長). 整数を順に生成する(1,_列間隔文字数,_) :- between(1,_列間隔文字数,_). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 解を集める(_候補項,_目標,_解ならび) :- findall(_候補項,_目標,_解ならび). 解の最大値(_候補項,_目標,_解の最大値) :- findall(_候補項,_目標,_解ならび), 最大値(_解ならび,_解の最大値). 最大値(_ならび,_最大値) :- select(_最大値,_ならび,_残りならび), forall(member(_値,_残りならび),_最大値 @>= _値). 解の最小値(_候補項,_目標,_解の最小値) :- findall(_候補項,_目標,_解ならび), 最小値(_解ならび,_解の最小値). 最小値(_ならび,_最小値) :- select(_最小値,_ならび,_残りならび), forall(member(_値,_残りならび),_最小値 @=< _値). _値 は _式 :- _値 is _式. % 以下のサイトは 'PGMファイルの読み取り'(_入力ファイル) :- abolish(画像構造/2), raw_read_pgm(_入力ファイル). raw_read_pgm(_入力ファイル,_画像構造ならび) :- headerを読み取る(_入力ファイル,_headerの文字数), 画像データの読み込み(_入力ファイル,_headerの文字数,_画像データ), assertz(画像構造(画像データ,_画像データ)). headerを読み取る(_入力ファイル,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- open(_入力ファイル,read,Input), '型・矩形サイズ・色の深さを得る'(Input,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数), close(Input). '型・矩形サイズ・色の深さを得る'(Input,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- get_line(Input,Line), '型・矩形サイズ・色の深さを得る'(Input,Line,[],0,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数), '型・矩形サイズ・色の深さを定義する'(_型,_矩形サイズ,_色の深さ). '型・矩形サイズ・色の深さを得る'(Input,Line,[_色の深さ,_矩形サイズ,_型],_ヘッダの文字数,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- !. '型・矩形サイズ・色の深さを得る'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- 'コメント行は無視して、_ヘッダの文字数だけ更新'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数),!. '型・矩形サイズ・色の深さを得る'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- '型・矩形サイズ・色の深さを埋めていく'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). 'コメント行は無視して、_ヘッダの文字数だけ更新'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- sub_atom(Line,0,1,_,'#'), '改行を含むコメント行の文字数を求めて_ヘッダ文字数を更新する'(Line,_ヘッダ文字数_1,_ヘッダ文字数_2), get_line(Input,Line2), '型・矩形サイズ・色の深さを得る'(Input,Line2,L1,_ヘッダの文字数_2,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). '改行を含むコメント行の文字数を求めて_ヘッダ文字数を更新する'(Line,_ヘッダ文字数_1,_ヘッダ文字数_2) :- atom_length(Line,Length), _ヘッダの文字数_2 is _ヘッダの文字数 + Length + 1. '型・矩形サイズ・色の深さを埋めていく'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- get_line(Input,Line2), atom_length(Line,Length), _ヘッダの文字数_2 is _ヘッダの文字数_1 + Length + 1, '型・矩形サイズ・色の深さを得る'(Input,Line2,_ヘッダの文字数_2,[Line|L1],_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). '型・矩形サイズ・色の深さを定義する'(_型,_矩形サイズ,_色の深さ) :- assertz(画像構造(型,_型)), assertz(画像構造(矩形サイズ,_矩形サイズ)), assertz(画像構造(色の深さ,_色の深さ)). 画像データの読み込み(_入力ファイル,_ヘッダの文字数,_画像データ) :- open(_入力ファイル,read,Input,[type(binary)]), ヘッダ部分を空読み(Input,_ヘッダの文字数), 画像データ部分の読み取り(Input,_画像データ), close(input). ヘッダ部分を空読み(Input,_ヘッダの文字数) :- between(1,_ヘッダの文字数,N), get_byte(Input,_), N = _ヘッダの文字数,!. 画像データ部分の読み取り(Input,_画像データ) :- findall(C,(repeat,get_byte(Input,C),(C = -1,!,fail;true)),_画像データ). get_line(Input,Line) :- get_char(Input,A), get_line(Input,A,L), atom_chars(Line,L). get_line(Input,'\n',[]) :- !. get_line(Input,A,[A|R]) :- get_char(Input,B), get_line(Input,B,R). % 以下のサイトは # 出典 :: CodeIQ q1347 # # 3人の几帳面な男たちがいました。 # ジェシー「みかんをたくさん頂いたんだ。みんなで分けようYO!」 # ダニエル「イイネ!…ええと、みかんは全部で30個あるみたいだから、ひとり10個ずつならきちんと分けられるNE!」 # ジョゼフ「それだけじゃダメだYO!みかんは一つひとつ大きさが違うんだから、その辺も考えてきっちり分けNIGHT!」 # # # 【問題】 # # 30個のみかんがあります。3人で10個ずつ分けようと思いますが、不公平にならないよう、みかんの重さの合計が均一になるように分けてください。たとえば、次のような重さのみかん6個 # 101g # 103g # 110g # 105g # 114g # 112g # # を、3人で2つずつ分ける場合、重さの合計が等しくなるように分けると # (101g, 114g) # (103g, 112g) # (105g, 110g) # # のように、合計が215グラムになるように分けることができます。 # # みかんの重さのデータを標準入力から読み込み、それを重さの合計・個数ともに3等分するプログラムを書いてください。 # # # 【入力】 # # 入力はテキストファイルで用意されています。これを標準入力から読み込んでください。 # 入力ファイルの1行目には、みかんの個数Nが与えられます。 # 2行目以降のN行分が、みかんの重さ(正の整数)です。 # # # 【出力】 # # 標準出力に、3等分したみかんのグループを出力してください。 # 1行につき1グループ、計3行を出力します。それ以外は出力しないでください。 # 分け方が複数ある場合、その中の1種類だけを出力してください。 # # # 【入出力例】 # # - sample1.in.txt # 6 # 101 # 103 # 110 # 105 # 114 # 112 # # - sample1.out.txt # (101, 114) # (103, 112) # (105, 110) # # # # - sample2.in.txt # 12 # 147 # 105 # 99 # 116 # 105 # 119 # 93 # 132 # 123 # 95 # 101 # 82 # # - sample2.out.txt # (82, 105, 105, 147) # (93, 95, 119, 132) # (99, 101, 116, 123) '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル) :- '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計), 配分した候補を得て(_みかんの重さならび,_一人あたりの重さ合計,_重複を許す配分した候補), 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補). '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計) :- 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび), sum_list(_みかんの重さならび,_みかんの重さの合計), _一人あたりの重さ合計 is _みかんの重さの合計 // 3. 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび) :- see(_入力ファイル), 先頭行から行数を得る(_みかんの個数), 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび), seen. 先頭行から行数を得る(_行数) :- 整数入力(_行数). 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび) :- findall(_みかんの重さ,( between(1,_みかんの個数,_), 整数入力(_みかんの重さ)),_みかんの重さならび). 配分した候補を得て(_みかんの重さならび,_合計目標,_重複を許す配分した候補) :- findall(LL,同量に配分する(_みかんの重さならび,_合計目標,[],LL),_重複を許す配分した候補). 同量に配分する([],_,LL,LL). 同量に配分する(_みかんの重さならび,_合計目標,LL1,LL) :- 組み合計を得る(_みかんの重さならび,_合計目標,[],L,_残りみかんの重さならび), forall(member(L1,LL1),L1 @>= L), 同量に配分する(_残りみかんの重さならび,_合計目標,[L|LL1],LL). 組み合計を得る(_残りみかんの重さならび,_合計目標,L,L,_残りみかんの重さならび) :- sum_list(L,_合計目標). 組み合計を得る(_みかんの重さならび_1,_合計目標,L1,L,_残りみかんの重さならび) :- select(_一個,_みかんの重さならび_1,_残りみかんの重さならび_2), forall(member(A,L1),A @>= _一個), 組み合計を得る(_残りみかんの重さならび_2,_合計目標,[_一個|L1],L,_残りみかんの重さならび). 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補) :- 重複なく昇順に整列する(_重複を許す配分した候補,_候補リスト), 一行ずつ出力する(_出力ファイル,_候補リスト). 重複なく昇順に整列する(L1,L2) :- 重複なく昇順に整列する(L1,[],L2). 重複なく昇順に整列する([],L,L). 重複なく昇順に整列する([_軸要素|L1],L2,L3) :- 重複のない昇順分割(_軸要素,L1,LS,LB), 重複なく昇順に整列する(LS,[_軸要素|L3_2],L3), 重複なく昇順に整列する(LB,L2,L3_2). 重複のない昇順分割(_,[],[],[]). 重複のない昇順分割(_軸要素,[A|R1],[A|R2],R3) :- A @< _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[A|R1],R2,[A|R3]) :- A @> _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[_軸要素|R1],R2,R3) :- 重複のない昇順分割(_軸要素,R1,R2,R3). 一行ずつ出力する(_出力ファイル,_候補リスト) :- tell(_出力ファイル), forall(member(_三人分のみかんの重さならび,_候補リスト),配分候補ならびを三行で出力する(_三人分のみかんの重さならび)), told. 配分候補ならびを三行で出力する(_三人分のみかんの重さならび) :- forall(member(_みかんの重さならび,_三人分のみかんの重さならび),( 表示パターンのつくり(_みかんの重さならび,_表示パターン), writef(_表示パターン,_みかんの重さならび))). 表示パターンのつくり(_みかんの重さならび,_表示パターン) :- length(_みかんの重さならび,_要素数), findall('%t',between(1,_要素数,_),_表示パターンならび), atomic_list_concat(_表示パターンならび,',',_表示パターン_1), atomic_list_concat(['(',_表示パターン_1,')\n'],_表示パターン). 整数入力(_整数) :- 行入力(_行), read_term_from_atom(_行,_整数,[]). 行入力(_行) :- get_char(_文字), 行の文字ならび(_文字,_行の文字ならび), atom_chars(_行,_行の文字ならび). 行の文字ならび(end_of_file,[]) :- !. 行の文字ならび('\n',[]) :- !. 行の文字ならび(_文字,[_文字|R]) :- get_char(_次の文字), 行の文字ならび(_次の文字,R). ユーザパラメータならび(_ユーザパラメータならび) :- current_prolog_flag(argv,_ユーザパラメータならび). program :- ユーザパラメータならび([_入力ファイル,_出力ファイル]), '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル). :- program,halt. % 以下のサイトは # 出典 :: CodeIQ q1346 # # あるとき、マシューは美人な双子と出会った。お姉さん、妹さん、実に美しいのだ!この2人、双子でありつつ、とても仲が良い。仲が良すぎて、同じタイミングで話すという特技がある。 # # 姉&妹 「あ。マシューだ。」 # マシュー「いかにもマシューだ。」 # 姉&妹 「双子ならではのクイズを出してもいい?」 # マシュー「え、あ、いいよ。」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # マシュー「・・・え?」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # # なんだかとんでもないクイズに巻き込まれてしまった!プログラムを書いて答えてほしい。 # # 解き方だが、 (3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力して欲しい。 # '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する' :- '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび), '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび). '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび) :- findall(M,between(2,1000,M),_小さい順に並んだ2から1000までの整数ならび), '1000以下の素数ならびを小さい順に得る'(_小さい順に並んだ2から1000までの整数ならび,_1000以下の素数ならび). '1000以下の素数ならびを小さい順に得る'([],[]) :- !. '1000以下の素数ならびを小さい順に得る'([_確定した素数|R1],[_確定した素数|R2]) :- 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2). 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2) :- 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび), '1000以下の素数ならびを小さい順に得る'(_残ったならび,R2). 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび) :- findall(_確定した素数で割り切れないもの,'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの),_残ったならび). 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの) :- member(_確定した素数で割り切れないもの,R1), \+(0 is _確定した素数で割り切れないもの mod _確定した素数). '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび) :- '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび), '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび). '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび) :- findall([_1,_2],'1000以下の双子素数の'(_1000以下の素数ならび,_1,_2),_1000以下の双子素数ならび). '1000以下の双子素数の'(_1000以下の素数ならび,_1,_2) :- append(_,[_1,_2|_],_1000以下の素数ならび), 2 is _2 - _1. '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび) :- 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R), 'カンマ区切りで標準出力する'(R,_1,_2), R = []. 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R) :- append(_,[[_1,_2]|R],_1000以下の双子素数ならび). 'カンマ区切りで標準出力する'(R,_1,_2) :- 'Rが[]の時は_1,_2出力後カンマは省略して改行する'(R,_1,_2). 'カンマ区切りで標準出力する'(R,_1,_2) :- 'Rが[]でない時は_1,_2出力後カンマを出力する'(R,_1,_2). 'Rが[]の時は_1,_2出力後カンマは省略して改行する'([],_1,_2) :- writef('(%t,%t)\n',[_1,_2]). 'Rが[]でない時は_1,_2出力後カンマを出力する'([_|_],_1,_2) :- writef('(%t,%t), ',[_1,_2]). :- '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する',halt. % 以下のサイトは # 出典 :: CodeIQ q1346 # # あるとき、マシューは美人な双子と出会った。お姉さん、妹さん、実に美しいのだ!この2人、双子でありつつ、とても仲が良い。仲が良すぎて、同じタイミングで話すという特技がある。 # # 姉&妹 「あ。マシューだ。」 # マシュー「いかにもマシューだ。」 # 姉&妹 「双子ならではのクイズを出してもいい?」 # マシュー「え、あ、いいよ。」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # マシュー「・・・え?」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # # なんだかとんでもないクイズに巻き込まれてしまった!プログラムを書いて答えてほしい。 # # 解き方だが、 (3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力して欲しい。 # '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する' :- '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび), '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび). '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび) :- findall(M,between(2,1000,M),_小さい順に並んだ2から1000までの整数ならび), エラトステネスの篩(_小さい順に並んだ2から1000までの整数ならび,_1000以下の素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([_確定した素数|R1],[_確定した素数|R2]) :- 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2). 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2) :- 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび), エラトステネスの篩(_残ったならび,R2). 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび) :- findall(_確定した素数で割り切れないもの,( 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの)),_残ったならび). 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの) :- member(_確定した素数で割り切れないもの,R1), \+(0 is _確定した素数で割り切れないもの mod _確定した素数). '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび) :- '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび), '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび). '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび) :- findall([_1,_2],'1000以下の双子素数の'(_1000以下の素数ならび,_1,_2),_1000以下の双子素数ならび). '1000以下の双子素数の'(_1000以下の素数ならび,_1,_2) :- append(_,[_1,_2|_],_1000以下の素数ならび), 2 is _2 - _1. '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび) :- 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R), 'カンマ区切りで標準出力する'(R,_1,_2), R = []. 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R) :- append(_,[[_1,_2]|R],_1000以下の双子素数ならび). 'カンマ区切りで標準出力する'(R,_1,_2) :- 'Rが[]の時は_1,_2出力後カンマは省略して改行して終わる'(R,_1,_2),!. 'カンマ区切りで標準出力する'(_,_1,_2) :- writef('(%t,%t), ',[_1,_2]). 'Rが[]の時は_1,_2出力後カンマは省略して改行して終わる'([],_1,_2) :- writef('(%t,%t)\n',[_1,_2]). :- '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する',halt. % 以下のサイトは # 出典 :: twitter_by_@a_hisame_20150219 # # "aがn回以上続いた直後にbがn回続く"ことを(拡張)正規表現で有限長で表現できるんでしたっけ? (nは0以上の任意の整数) # 'aがn回以上続いた直後にbがn回続く(nは0以上の任意の整数)'(_文字列,_n,_前文字列,_適合文字列,_後文字列) :- 'aがn回以上続いた'(_n,_文字列,_前文字列,L2,L3), '直後にbがn回続く'(_n,L2,L3,L2_2,L3_2), atom_chars(_適合文字列,L2_2), atom_chars(_後文字列,L3_2). 'aがn回以上続いた'(_n,_文字列,_前文字列,L2,L3) :- sub_atom(_文字列,_前文字列,_適合文字列_1,_後文字列_1,L1,L2,L3), all(L2,a), \+(last(L1,a)), \+(L3 = [a|_]), length(L2,Len_1), Len_1 >= _n. '直後にbがn回続く'(_n,L2,L3,L2_2,L3_2) :- findall(b,between(1,_n,_),L), append(L,L3_2,L3), \+(L3_2 = [b|_]), append(L2,L,L2_2). all([],A). all([A|R],A) :- all(R,A). sub_atom(A,H,X,T,HL,XL,TL) :- atomic(X), atom_chars(A,L), atom_chars(X,XL), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,H,X,T,HL,XL,TL) :- var(X), atom_chars(A,L), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), \+(XL = []), atom_chars(T,TL). % 以下のサイトは 250 ToastXToast 要約  何種類かのパンがあり,種類ごとにちょうどよい焼き時間が決まっている.その焼き時間より短ければ生焼けで,長ければ焦げてしまう.またどの種類のパンかは見た目にはわからない.生焼けのパンと焦げたパンがいくつか与えられていて.それぞれのパンの焼いた時間がわかっている.また,それぞれの種類で生焼けのパンと焦げたパンが少なくとも1枚ずつある事もわかっている.パンの種類として考えられるもののうち最小値を求めよ.  生焼けのパンの数と焦げたパンの数は1以上50以下,それぞれのパンの焼いた時間は1以上1000000以下.同じ時間だけ焼いたパンは2枚以上存在しない事は保証されている. 方針 生焼けのパンを○,焦げたパンを●で表し,焼き時間を横軸で表すと,一般的な状況では ○○ー○○○○○○ーーーー○○ーー○ー○○○ーー ーー●ーーーーーー●●●●ーー●●ー●ーーー●● の用になっている.この場合, ○○ー○○○○○○ーーーー○○ーー○ー○○○ーー ーーーーーーーーーーーーーーーーーーーーーー●● と ○○ーーーーーーーーーーーーーーーーーーーーーー ーー●ーーーーーー●●●●ーー●●ー●ーーーーー とわけることができ,答えは2種類とわかる.あとはこの状況にならないのはいつかを考えればよい. コード例 #include #include #include #include #include using namespace std; class ToastXToast { public: int bake(vector under, vector over) { sort(under.begin(), under.end()); sort(over.begin(), over.end()); if(over[0] <= under[0] ) return -1; if(under[under.size()-1] >= over[over.size()-1]) return -1; if(over[0] > under[under.size()-1]) return 1; else return 2; } }; 500 KingdomXCitiesandVillage 要約  座標平面上の格子点に町がいくつかと村がいくつか配置されている.次のアルゴリズムで,すべての村をいずれかの町と道路でつなぐ. はじめ,すべての村は町につながっていない 町につながっていない村をランダムに一つ選ぶ (それを sv(selected village) とする) 町 or「既に町につながっている村」のなかで sv に(ユークリッド距離で)最も近いものを選び,その2つを道路でつなぐ.最も近いものが複数ある場合はランダムに選ぶ. sv を「既に町につながっている村」に昇格させる. これをすべての村がつながるまで繰り返す.  道路の総距離の期待値を答えよ.町と村の数はそれぞれ1以上50以下,それぞれの町,村の座標は0以上1000000以下.同じ箇所に複数の町や村はない事は保証されている. 方針  まず期待値の加法性から,各々の村から延ばす道路の距離の期待値を合計すればよいので,一つの村に注目する(以降その村をvとし,その村から最も近い町をcとする).v とつながる可能性のある村は,v との距離が vc 間より短いもののみである.まずそれだけを取り出し v との距離が短い順に v[1], v[2], ・・・, v[k] とする.v と c がつながるのは,v が v[1], v[2], ・・・v[k] のいずれよりも先に選ばれたときなので,その確率は 1/(k+1).v と v[j] がつながるのは「 v[j]が vより先に選ばれ,かつvが v[1], v[2], ・・・, v[j-1]より先に選ばれる」ときである(前者が満たされないとv[j]は村とつながっていないのでそもそも候補に入らず,また後者が満たされないとvはv[1]・・・v[j-1]のいずれかとつながってしまう).v[j+1]・・・v[k]には制限がないので考慮しなくても良い.j+1個の球を横一列に並べる事を考えると,条件を満たすのは最左にv[j], その隣に v ,残りj-1個にv[1]・・・v[j-1]を自由に並べかえるものなので,その場合の数は(j - 1)!,全事象は(j + 1)! なので,求める確率は(j-1)! / (j+1)! = 1/ ( j * (j + 1) ) . #include #include #include #include #include #include using namespace std; typedef long long ll; ll dist2(int ax, int ay, int bx, int by){ return (ll)(ax - bx) * (ax - bx) + (ll)(ay - by) * (ay - by) ; } class KingdomXCitiesandVillages { public: double determineLength(vector cx, vector cy, vector vx, vector vy) { int n = cx.size(); int m = vx.size(); double ans = 0; for(int i = 0;i kouho; for(int j = 0;j% 以下のサイトは ペア数の実装(0,0). ペア数の実装(X,Y) :- nth1(N,_,_), 'Nを1から増加しながら0-Nの内2要素を取り2項の合計がNであるような重複順列を生成'(N,X,Y). 'Nを1から増加しながら0-Nの内2要素を取り2項の合計がNであるような重複順列を生成'(N,X,Y) :- findall(M,between(0,N,M),L), 重複順列(L,2,[X,Y]), N is X + Y. 重複順列(L,0,[]). 重複順列(L,N,[A|R3]) :- N > 0, member(A,L), N_1 is N - 1, 重複順列(L,N_1,R3). % 以下のサイトは ペア数の実装(0,0). ペア数の実装(X,Y) :- nth1(N,_,_), findall(M,between(0,N,M),L), 重複順列(L,2,[X,Y]), N is X + Y. 重複順列(L,0,[]). 重複順列(L,N,[A|R3]) :- N > 0, member(A,L), N_1 is N - 1, 重複順列(L,N_1,R3). % 以下のサイトは ペア数の実装(0,0). ペア数の実装(X,Y) :- nth1(N,_,_), findall(M,between(0,N,M),L), 重複順列(L,2,[X,Y]), N is X + Y. 重複順列(L,0,[]). 重複順列(L,N,[A|R3]) :- N > 0, member(A,L), N_1 is N - 1, 重複順列(L,N_1,R3). %%%%%%%%%%%%%%%%%%%% ?- ペア数の実装(X,Y). X = Y, Y = 0 ; X = 0, Y = 1 ; X = 1, Y = 0 ; X = 0, Y = 2 ; X = Y, Y = 1 ; X = 2, Y = 0 ; X = 0, Y = 3 ; X = 1, Y = 2 ; X = 2, Y = 1 ; X = 3, Y = 0 ; X = 0, Y = 4 ; X = 1, Y = 3 ; X = Y, Y = 2 ; X = 3, Y = 1 ; X = 4, Y = 0 ; X = 0, Y = 5, ・・・ % 以下のサイトは 親(為義). 親(頼朝). 親(範頼). 子(頼朝). 子(範頼). 子(公暁). 親子テーブル候補(_親子テーブル候補) :- 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補). 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補) :- 属性集合である親と子の直積上の(_属性集合_親_と_属性集合_子の直積), 部分集合候補(_属性集合_親_と_属性集合_子の直積,_親子テーブル候補). 属性集合である親と子の直積上の(_親と子の直積) :- 属性集合_親(_属性集合_親), 属性集合_子(_属性集合_子), 直積([_属性集合_親,_属性集合_子],_親と子の直積). 属性集合_親(_属性集合_親) :- setof(_親,親(_親),_属性集合_親). 属性集合_子(_属性集合_子) :- setof(_子,子(_子),_属性集合_子). 直積(_集合ならび,_直積集合) :- member項の生成(_集合ならび,_member項,_要素変数ならび), findall(_要素変数ならび,_member項,_直積集合). member項の生成([_集合],member(_要素変数,_集合),[_要素変数]). member項の生成([_集合|R1],(member(_要素変数,_集合),U),[_要素変数|R2]) :- member項の生成(R1,U,R2). 冪集合(_集合,_冪集合) :- findall(L,部分集合(_集合,L),_冪集合). 部分集合(_,[]). 部分集合(A,B) :- length(A,C), between(1,C,D), 組合せ(A,D,B) . 組合せ(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). 部分集合候補(_属性集合_親_と_属性集合_子の直積,_親子テーブル候補) :- 冪集合(_属性集合_親_と_属性集合_子の直積,_冪集合), member(_親子テーブル候補,_冪集合). % 以下のサイトは 親(為義). 親(頼朝). 親(載家). 子(頼朝). 子(載家). 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補) :- 属性集合親(_属性集合親), 属性集合子(_属性集合子), 直積(_属性集合親,_属性集合子,_親と子の直積), member(_直積上の部分集合の組,_親と子の直積), 冪集合(_親と子の直積,_冪集合), member(_親子テーブル候補,_冪集合). 属性集合親(_属性集合親) :- setof(_親,親(_親),_属性集合親). 属性集合子(_属性集合子) :- setof(_子,子(_子),_属性集合子). 直積(L1,L2,LL) :- findall([A,B],( member(A,L1), member(B,L2)),LL). '冪集合'(_集合,_冪集合) :- findall(L,部分集合(_集合,L),_冪集合). '部分集合'(_,[]). '部分集合'(A,B) :- length(A,C), between(1,C,D), 組合せ(A,D,B) . 組合せ(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). % 以下のサイトは % [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(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは % % SWI-Prolog のコマンド引数の内、ユーザパラメータ部分をリストに得る。 % user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/348 # # [1] C言語演習 # # [2] argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 # 但し、第一引数だけは別の配列(ary)に格納はしないこと。 # 例)argv:./test a b c d e f # 例)ary :./test b c d e f # # [3.1] redhat # [3.3] C言語 # [4] 本日中 # [5] 制限:なし # わかる方どうかよろしくお願いします。 # # 'argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 但し、第一引数だけは別の配列(ary)に格納はしないこと'(UserParameterList) :- user_parameters([_|UserParameterList]),!. user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/425 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 与えた文字列を指定した回数繰り返す文字列に変換するプログラムを作成しなさい。 # ただし、main関数を以下のように宣言し、実行時に引数をとれるようにする。 # 第一引数は繰り返し回数とし、第二引数は繰り返される文字列とする。 # すなわち、./prog 3 "ABC"と実行した場合は、ABCABCABCとなる文字列が作られる。 # 作られた文字列は、表示すること。必要に応じて、数字を数値に変換する関数atoi()を使用してもよい。 # その際は、#include<stdlib.h>を加えること。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc,char*argv[]){ # /** argc:引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:引数**/ # x=atoi(argv[1]);/*atoiの使用例*/ # return(0); # } # program :- 与えた文字列を指定した回数繰り返す文字列に変換する. 与えた文字列を指定した回数繰り返す文字列に変換する :- user_parameters([_回数文字列,_文字列]), atom_to_term(_回数文字列,_回数,_), length(Ln,_回数), append(_,[_|R],Ln), write(_文字列), R = []. user_parameters(A) :- current_prolog_flag(argv, B), append(_, [--|A], B). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/639 # # [1] C言語演習 # [2] argvで入力された引数 "123:456:78:90" の様な文字列を ":" 区切りで # 別の配列へ順に格納せよ。(strchr関数を使いなさい) # 上記の例では、[0]=123,[1]=456,[2]=78,[3]=90となる。 # 尚、::の連続もありで、"12:34::90" は [0]=12,[1]=34,[2]=null,[3]=90となる。 # # 下の様に処理しているが、スマートに行きません。。。 # p = NULL; # p = strchr(str, ':'); # while (p != NULL) { # printf("length %d\n", strlen(str)-strlen(p)); # p++; # p = strchr(p, ':'); # } # 'argvで入力された引数 "123:456:78:90" の様な文字列を ":" で区切り、プログラム引数述語のリスト引数とする' :- user_parameters([_引数文字列]), split(_引数文字列,[':'],L), assertz(プログラム引数(L)). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/682 # # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(0,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,1,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,0,1,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,1,0,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,0,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(0,1,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,1,1,'NG') :- !. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/699 # # ../test/read.cgi/tech/1311089619/682について内容が不足していたので再投稿します。 # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # [3] フラグ・判定にビット演算を使用してください。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する。判定はビット演算を使う' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'OK') :- 0 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'NG') :- 1 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/453 # # 【 課題 】コマンドラインから入力された点数を集計するプログラムを作成。 #       ソースファイルにコードを追加して、以下の実行結果になるように。 # # 実行結果  #       java CalcMain 69 88 70 45 95 33 #       高得点順: 95点 , 88点 , 70点 , 69点 , 45点 , 33点 #       科目数:6科目 #       合計点:400点 #       平均点: 66.666664点 #        CalcMainクラスはmain()メソッドを持つ。 #        Calculationクラスは、合計点の計算をするgetTotal()メソッド、平均点の計算をするgetAve()メソッド、並び替え処理を行うsort()メソッドを持つ。 #        コマンドライン引数から受け取った不特定数の数値(点数)について、降順並び替え表示、科目数、合計点、平均点の表示を行う。 #        sort()メソッドの並び替え処理には「バブルソート」を使用する # # #       ソースファイル #       http://ime.nu/www.dotup.org/uploda/www.dotup.org2249012.java.html # # http://ime.nu/www.dotup.org/uploda/www.dotup.org2249060.java # # # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11月14日まで # 【 Ver  】java version "1.6.0_22" # 【 用語 】 # 【 補足 】よろしくお願いします。 # # 'コマンドラインから入力された点数を集計するプログラムを作成。ソースファイルにコードを追加して、以下の実行結果になるように。' :- コマンドラインから入力された点数(_コマンドラインから入力された点数ならび), 高得点順に表示(_コマンドラインから入力された点数ならび), 科目数と合計点と平均点の表示(_コマンドラインから入力された点数ならび). コマンドラインから入力された点数(_コマンドラインから入力された点数ならび) :- current_prolog_flag(argv,_コマンドライン), append(_,['--'|_コマンドラインから入力された点数ならび],_コマンドライン]). 高得点順に表示(L) :- バブルソート降順(L,L2), concat_atom(L2,',',_表示文字列), writef('高得点順: %t\n',[_表示文字列]). 科目数の表示(L,_科目数) :- length(L,_科目数), writef('科目数: %t\n',[_科目数]), 科目数と合計点と平均点の表示(L) :- length(L,_科目数), sum(L,_合計点), _平均点 is _合計点 / _科目数. writef('科目数: %t\n合計点: %t\n平均点: %t\n',[_科目数,_合計点,_平均点]). バブルソート降順(_対象ならび,_整列済みならび) :- 降順交換(_対象ならび,_対象ならびの一), !, バブルソート降順(_対象ならびの一,_整列済みならび). バブルソート降順(_整列済みならび,_整列済みならび). 降順交換([],[]) :- !,fail. 降順交換([A,B|R],[B,A|R]) :- A @< B,!. 降順交換([A|R1],[A|R2]) :- 降順交換(R1,R2). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/670 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # #include<stdio.h> # int main(void) # { # int i=0; # char *ptr; # char str[128]; # # ptr = str; # # scanf("%s",&str); # # while(*ptr++){ # i++; # } # # printf("%d\n",i); # } # # 上記の入力したテキストの文字数を表示するプログラムの読み込み部分をファイル処理に変更せよ。 # fgetc() 関数を使用し、コマンドラインにファイル名が指定できるようにすること。 # ただし、ファイル名を指定しない場合は標準入力とする。 # ファイルが見つからなかった時はエラーメッセージを出し、プログラムを終了する。 # 'length系組込述語を使わず入力したテキストの文字数を表示する' :- get_chars(_文字ならび), ならびの文字数を数える(_文字ならび,_文字数), writef('文字数は %t文字です\n',[_文字数]). ならびの文字数を数える([],0). ならびの文字数を数える([_|R],_文字数) :- ならびの文字数を数える(R,_文字数_1), _文字数 is _文字数_1 + 1. 読み込み部分をファイル処理に変更する :- コマンドラインからファイル名を取り出す(_ファイル名), 読み込み部分をファイル処理に変更する(_ファイル名). 読み込み部分をファイル処理に変更する(user_input,_文字数) :- ファイルから読み出しながら文字数を数える(user_input,_文字数). 読み込み部分をファイル処理に変更する(_ファイル名,_文字数) :- open(_ファイル名,read,Instream), ファイルから読み出しながら文字数を数える(Instream,_文字数), close(Instream). ファイルから読み出しながら文字数を数える(Instream,0) :- at_end_of_stream(Instream),!. ファイルから読み出しながら文字数を数える(Instream,_文字数) :- get_char(Instream,_), ファイルから読み出しながら文字数を数える(Instream,_文字数_1), _文字数 is _文字数_1 + 1. コマンドラインからファイル名を取り出す(_ファイル名) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList), ParameterList = [_ファイル名|_],!. コマンドラインからファイル名を取り出す(user_input). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/613 # # 明日までの課題です。 # まったくわかりません。 # # キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力するプログラムを書きなさい。 # なお、プログラムは次の要件を満たすこと。 # # 1.キーボードからの入力は、Enter(return)キーを2回連続して入力すると終了する # 2.入力終了後、画面に入力した行数を表示する # 3.コマンドラインからプログラムを起動後、入力する文字列に各自の氏名(ローマ字表記)を含めた場合、入力処理終了後、各自の氏名を含む行は何行目にあり、その行の文字列が何であるか表示する。 # 氏名が入力データに含まれていない場合には、含まれていなかったことを表示する # # よろしくお願いします。 # # program :- 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する' :- user_parameters([_ファイル名]), open(_ファイル名,write,Outstream), get_line(Line), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,[]), close(Outstream). 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,'',Ln) :- length(Ln,_行数), writef('行数は %t です\n',[_行数]),!. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,Ln) :- writef(Outstream,'%t\n',[Line]), get_line(Line_2), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line_2,[_|Ln] user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/59 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): # main関数を以下のように宣言し、実行時に引数を取れるようにする。 # 引数がすべて得点であるとして、その平均値を # 求めるプログラムを作成しなさい。 # すなわち、 # ./prog 50 70 90 と実行した場合は、70と表示される。 # 必要に応じて、数字を数値に変換する関数atoi()や # atof()を使用してもよい。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc, char *argv[] ) { # /** argc: 引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:実数 **/ # x = atof( argv[1] ); /* atofの使用例 */ # return(0); # } # # ※ 配列のサイズなど、定数は必ず#defineを利用すること. # ※ 表示や入力を目的とする関数以外では、 # 関数の中で標準入力や標準出力への入出力は行わないこと. # # #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語: c言語 # [4] 期限: 6月15日 # よろしくお願いします! # # program :- user_parameters(_ユーザパラメータならび), プログラム引数を整数ならびに変換(_ユーザパラメータならび,_整数ならび), avg(整数ならび,_相加平均), writef('%t\n',[_相加平均]). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). プログラム引数を整数ならびに変換([],[]). プログラム引数を整数ならびに変換([A|R1],[N|R2]) :- atom_to_term(A,N,_), integer(N), プログラム引数を整数ならびに変換(R1,R2). プログラム引数を整数ならびに変換([_|R1],R2) :- プログラム引数を整数ならびに変換(R1,R2). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/642 # # [1] 授業単元:C言語演習 # [2] 問題文: # 実行ファイル名をmultiとして、multiに続いて2つの正の整数を入力すると、小さい方の整数から大きい方の整数までの積を出力するプログラムを作成せよ。 # 但し、入力時には小さい方の整数、大きいほうの整数の順で入力されるものとする。 # <入力例>$./multi 3 6 # <計算結果>360 # program :- user_parameters([_引数1,_引数2]), 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2), user_parameters(ParametersList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2) :- atom_number(_引数1,N1), atom_number(_引数2,N2), 小さい方の整数と大きい方の整数(N1,N2,_小さい方の整数,_大きい方の整数), 小さい方の整数から大きい方の整数までの積を(_小さい方の整数,_大きい方の整数,_積), 出力する(_積). 小さい方の整数と大きい方の整数(N1,N2,N1,N2) :- N1 =< N2. 小さい方の整数と大きい方の整数(N1,N2,N2,N1) :- N1 > N2. 小さい方の整数から大きい方の整数までの積を(N,N,N). 小さい方の整数から大きい方の整数までの積を(N,_大きい方の整数,_積) :- N < _大きい方の整数, N1_2 is N1 + 1, 小さい方の整数から大きい方の整数までの積を(N_2,_大きい方の整数,_積_2), _積 is _積_2 * N. 出力する(_積) :- writef('%t\n',[N]). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/786 # # C言語 # gcc # Linux # 問題:cat関数を作りなさい。ただし、fgets,fputsを用いること。です。 # # 明日のお昼までにお願いします。 # # cat :- user_parameters([]), get_code(user_input,Code), ストリームから読み取り書き出す(user_input,Code),!. cat :- user_parameters(L), append(_,[File|R],L), ファイルを書き出す(File), R = [],!. ファイルを書き出す(File) :- open(File,read,Instream), get_code(Instream,Code), ストリームから読み取り書き出す(Instream,Code), close(Instream). ストリームから読み取り書き出す(_,-1) :- !. ストリームから読み取り書き出す(Instream,Code_1) :- put_code(Code_1), get_code(Instream,Code_2), ストリームから読み取り書き出す(Instream,Code_2). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). % % SWI-Prologの起動は % # swipl -t cat -f プログラムファイル名 -- ファイル1 ファイル名2 ... % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/907 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 以下のようにmain関数を定義し、mainの引数を合計するプログラムsumを作成せよ。ただし、引数の数は未定であり、実行時に決定されるものとする。 # int main(int argc, char *argv[]) # main :- 利用者引数ならび(_利用者引数ならび), findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値ならび), sum(_数値ならび,_合計), writef('%t\n',[_合計]). sum([],0). sum([_数値|R],_合計) :- sum(R,_合計_1), _合計 is _数値 + _合計_1. 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). % % # swipl --quiet -f c161_907.html -g main -- 33.0 25.1 38.4 % 96.5 % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/957 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク): # コマンド行から複数の数値を受け取りその平均値を出力するプログラムを # 作成し、プログラムリストと実行結果を示せ。ヒント:受け取った文字列を # double型に変換するには、関数double atof(const char *nPtr)を使う。 # この関数を使うには<stdlib.h>のインクルードが必要である。 # #include <stdio.h> # #include <stdlib.h> # int main(void) # { # char str[]="1.41421356"; # double x; # x = atof(str); # } # 'コマンド行から複数の数値を受け取りその平均値を出力する' :- 利用者引数ならび(_利用者引数ならび), 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび), 相加平均(_数値引数ならび,_相加平均), writef('平均値は %t です\n',[_相加平均]). 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび) :- findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値引数ならび). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0e+00,M). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/142 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ # input関数とshow関数を作ること # コマンド引数にテキストファイルの名前を入れること # 'テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ。コマンド引数にテキストファイルの名前を入れること' :- コマンド引数からテキストファイルの名前を得る(_テキストファイル), テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル). コマンド引数からテキストファイルの名前を得る(_テキストファイル) :- current_prolog_flag(argv,ParameterList), append(_,['--'|[_テキストファイル]],ParameterList). テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル) :- テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル,Outstream), そのテキストファイルの中身を出力せよ(_テキストファイル). テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル) :- open(_テキストファイル,write,Outstream). そのなかに整数5個数字を入れる(Outstream), close(Outstream). そのなかに整数5個数字を入れる(Outstream) :- between(1,5,_何番目), 整数を得る(_整数), writef(Outstream,'%t\n',[_整数]), _何番目 = 5. そのテキストファイルの中身を出力せよ(_テキストファイル) :- open(_テキストファイル,read,Instream), copy_stream_data(Instream,user_output), close(Instream). % % ここではズルをして組込述語 copy_stream_data/2 を使って見た。 % % 本来ならget_lines/2とput_lines/2の組合せでコピーを表現するところ。 % % そのテキストファイルの中身を出力せよ(_テキストファイル) :- % get_lines(_テキストファイル,_行ならび), % put_lines(user_output,_行ならび). % % get_lines(_ファイル名,_行ならび) :- % open(_ファイル名,read,Instream), % findall(_行,( % repeat, % ( at_end_of_stream(Instream),!,fail; % get_line(Instream,_行))), % _行ならび), % close(Instream). % % put_lines(_ファイル名,_行ならび) :- % open(_ファイル名,write,Outstream), % forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), % close(Outstream). % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/177 # # # [2]下記の九九の表を作るプログラムを作れ # # 1 # 2 4 # 3 6 9 # ....... # 8 16 24...64 # 9 18 27...72 # 変則的な九九の表を作る :- '_列が_行を超えない範囲で、積を生成する'(_行,_列,_積), '生成された積を表示する。ただし、最後の9行9列の積は表示しない。'(_行,_列,_積), _行 = 9. '_列が_行を超えない範囲で、積を生成する'(_行,_列,_積) :- '_列が_行を超えない範囲で、'(_行,_列), 積を生成する(_行,_列,_積). '_列が_行を超えない範囲で、'(_行,_列) :- between(1,9,_行), between(1,_行,_列). 積を生成する(_行,_列,_積) :- _積 is _行 * _列. '生成された積を表示する。ただし、最後の9行9列の積は表示しない。'(_行,_列,_) :- 'ただし、最後の9行9列の積は表示しない。'(_行,_列),!. '生成された積を表示する。ただし、最後の9行9列の積は表示しない。'(_行,_列,_積) :- '基本的に積を表示するが、_行=_列の場合改行する'(_行,_列,_積). 'ただし、最後の9行9列の積は表示しない。'(9,9). '基本的に積を表示するが、_行=_列の場合改行する'(_行,_列,_積) :- '基本的に積を表示するが、'(_積), '_行=_列の場合改行する'(_行,_列). '基本的に積を表示するが、'(_積) :- writef('%3r ',[_積]). '_行=_列の場合改行する'(_行,_列) :- _行 = _列, nl. % 以下のサイトは # 指数表記を使わずに整数を素因数分解することを考えます。 # つまり、「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. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/576 # 西暦何年かを入力するとその年に月曜日が何回あるか数え # 52回なら1を、53回なら0を出力するプログラムお願いします… # # 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします # (0を入力したら終わりです) # # 入力できるのは1989〜5000です # # '西暦何年かを入力するとその年に月曜日が何回あるか数え 52回なら1を、53回なら0を出力するプログラムお願いします… 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします (0を入力したら終わりです) 入力できるのは1989〜5000です' :- '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_西暦ならび). '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび) :- findall(_西暦,( '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('西暦(1989~5000)を入力して下さい',_西暦), ( _西暦=0,!,fail;true)),_西暦ならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([]). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([_西暦|_残りならび]) :- 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_1または0), 出力する(_西暦,_1または0), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_残りならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- 'その年に月曜日が何回あるか数え'(_西暦,_月曜日の回数), '52回なら1を、53回なら0を'(_月曜日の回数,_0または1). 'その年に月曜日が何回あるか数え'(_西暦,_月曜日の回数) :- findall(1,( 日付と曜日の生成(_西暦,1,1,_年,_月,_日,月曜), ( \+(_年 = _西暦),!,fail;true)),L), length(L,_月曜日の回数). '52回なら1を、53回なら0を'(52,1). '52回なら1を、53回なら0を'(53,0). 出力する(_西暦,_1または0) :- writef('%t年 %t\n',[_西暦,_1または0]). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- writef('%t ',[_催促文]), get_line(_入力行), '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦). '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('0',0) :- !. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦) :- read_term_from_atom(_入力行,_西暦,[]), integer(_西暦), between(1889,5000,_西暦),!. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_) :- writef('入力された文字列"%t"から1899年から5000年範囲の西暦が得られませんでした\n再入力をお願いします\n',[_入力行]), fail. get_line(Line) :- read_line_to_codes(user_input,Codes), atom_codes(Line,Codes). '日付と曜日の生成'(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). '日付と曜日の生成'(_起点年月日文字列,_年月日文字列,_曜日) :- 年月日文字列から整数年月日を得る(_起点年月日文字列,_起点年,_起点月,_起点日), '日付と曜日の生成'(_起点年,_起点月,_起点日,_年,_月,_日,_曜日), 整数から文字列(4,_年,_年文字列), 整数から文字列(2,_月,_月文字列), 整数から文字列(2,_日,_日文字列), atomic_list_concat([_年文字列,_月文字列,_日文字列],_年月日文字列). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- _翌日の月 is _月 + 1, '十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月),!. '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(_月) :- member(_月,[2,4,6,9,11]). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは :- dynamic(下三桁フィボナッチ数/2). 下三桁の足し算の定義節の生成 :- between(0,999,M), between(0,999,N), S is ( M + N ) mod 1000, assertz((下三桁の足し算(M,N,S) :- !)), N = 999, M = 999. 下三桁フィボナッチ数(0,1) :- !. 下三桁フィボナッチ数(1,1) :- !. 下三桁フィボナッチ数(N,X) :- 隣り合う2つの数を加える(N,X), asserta((下三桁フィボナッチ数(N,X) :- !)). 隣り合う2つの数を加える(N,X) :- N_1 is N - 1, N_2 is N - 2, 下三桁フィボナッチ数(N_1,Y), 下三桁フィボナッチ数(N_2,Z), 下三桁の足し算(Y,Z,X). :- 下三桁の足し算の定義節の生成. % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(0,[0]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(1,[0,1]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(N,_フィボナッチ数列) :- 初期化(N,L), 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N), findall(_フィボナッチ数,フィボナッチ数(_,_フィボナッチ数),_フィボナッチ数列). 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C), L1=[],!. フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C) :- フィボナッチ数(B,_一つ前のフィボナッチ数), フィボナッチ数(C,_二つ前のフィボナッチ数), _フィボナッチ数 is _一つ前のフィボナッチ数 + _二つ前のフィボナッチ数, フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数). フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数) :- \+(フィボナッチ数(A,_)), assertz(フィボナッチ数(A,_フィボナッチ数)). 初期化(N,L) :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)), 'Nから0までの逆順リストを用意する'(N,L). 'Nから0までの逆順リストを用意する'(N,L) :- findall(M,between(0,N,M),L1), reverse(L1,L). % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(0,[0]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(1,[0,1]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(N,_) :- 初期化(N,L), 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N). 'repeat-failループでのフィボナッチ数列の計算'(_,_フィボナッチ数列) :- findall(M,フィボナッチ数(_,M),_フィボナッチ数列). 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C), (L1=[],!,fail;fail). フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C) :- フィボナッチ数(B,_一つ前のフィボナッチ数), フィボナッチ数(C,_二つ前のフィボナッチ数), _フィボナッチ数 is _一つ前のフィボナッチ数 + _二つ前のフィボナッチ数, フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数). フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数) :- \+(フィボナッチ数(A,_)), assertz(フィボナッチ数(A,_フィボナッチ数)). 初期化(N,L) :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)), 'Nから0までの逆順リストを用意する'(L). 'Nから0までの逆順リストを用意する'(N,L) :- findall(M,between(0,N,M),L1), reverse(L1,L). % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(N,_) :- 初期化, findall(M,between(0,N,M),L1), reverse(L1,L2), フィボナッチ数の解決(L2,N). 'repeat-failループでのフィボナッチ数列の計算'(_,_フィボナッチ数列) :- findall(M,フィボナッチ数(_,M),_フィボナッチ数列). 初期化 :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)). フィボナッチ数の解決(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数(B,V_1), フィボナッチ数(C,V_2), V is V_1 + V_2, \+(フィボナッチ数(A,V)), assertz(フィボナッチ数(A,V)), (L1=[],!,fail;fail). % 以下のサイトは :- dynamic(フィボナッチ数/2). :- dynamic(id/1). 'repeat-failループでのフィボナッチ数列の計算'(N,_フィボナッチ数) :- フィボナッチ数プログラムの初期化(N), フィボナッチ数の解決(N). 'repeat-failループでのフィボナッチ数列の計算'(N,_フィボナッチ数) :- フィボナッチ数(N,_フィボナッチ数). フィボナッチ数プログラムの初期化(N) :- フィボナッチ数とidをabolish, フィボナッチ数0番目と1番目の定義, フィボナッチ数構造の定義(N). フィボナッチ数とidをabolish :- abolish(フィボナッチ数/2), abolish(id/1). フィボナッチ数0番目と1番目の定義 :- assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)). フィボナッチ数構造の定義(N) :- between(2,N,M), asserta(id(M)), asserta(フィボナッチ数(M,V)), N = M. フィボナッチ数の解決(N) :- 先頭のidから順にMとVを得る(M,V), (idの先頭データのフィボナッチ数が解決済みならば(M,N,V),!,fail; 'Vが未解決の時は、フィボナッチ数を二つ前と一つ前のフィボナッチ数の和に更新する'(M,V)). 先頭のidから順にMとVを得る(M,V) :- 先頭のidから順にMと(M), 'Vを得る'(M,V). 先頭のidから順にMと(M) :- repeat, id(M). 'Vを得る'(M,V) :- フィボナッチ数(M,V). idの先頭データのフィボナッチ数が解決済みならば(M,N,V) :- M = N, integer(V). 'Vが未解決の時は、フィボナッチ数を二つ前と一つ前のフィボナッチ数の和に更新する'(M,V) :- 'Vが未解決の時は'(V), 二つ前のフィボナッチ数と一つ前のフィボナッチ数を得る(M,V_1,V_2), 'V_1とV_2が共に整数の時はVはV_1とV_2の和である'(V_1,V_2,V), フィボナッチ数の更新(M,V), fail. 'Vが未解決の時は'(V) :- \+(integer(V)). 二つ前のフィボナッチ数と一つ前のフィボナッチ数を得る(M,V_1,V_2) :- 二つ前のフィボナッチ数と(M,V_2), 一つ前のフィボナッチ数を得る(M,V_1). 二つ前のフィボナッチ数と(M,V_2) :- M_2 is M - 2, フィボナッチ数(M_2,V_2). 一つ前のフィボナッチ数を得る(M,V_1) :- succ(M_1,M), フィボナッチ数(M_1,V_1). 'V_1とV_2が共に整数の時はVはV_1とV_2の和である'(V_1,V_2,V) :- integer(V_1), integer(V_2), V is V_1 + V_2. フィボナッチ数の更新(M,V) :- retract(フィボナッチ数(M,_)), assertz(フィボナッチ数(M,V)). % 以下のサイトは 整数除算(_実,_法,_商,_剰余) :- 整数(_実), 整数除算(_実,_法,true,_商,_剰余). 整数除算(_実,_法,_商,_剰余) :- 変数(_実), 整数(_法), 法として合同(_法,_実,_商,_剰余). 法として合同(_n,_nを法として合同,_m,_剰余) :- 整数(_n), nth0(_m,_,_), succ(_n_1,_n), between(0,_n_1,_剰余), _nを法として合同 is _m * _n + _剰余. 整数除算(_実,_法,_制約,_商,_剰余) :- '整数は実と法'(_実,_法,_商,_剰余). 整数除算(_実,_法,_制約,_商,_剰余) :- '整数は実と商と剰余、変数は法'(_実,_法,_制約,_商,_剰余). 整数除算(_実,_法,_制約,_商,_剰余) :- '整数は実、変数は法と商'(_実,_法,_商,_剰余). 整数除算(_実,_法,_制約,_商,_剰余) :- '変数は実'(_実,_法,_制約,_商,_剰余). 法として合同(_n,_nを法として合同,_制約,_m,_剰余) :- 'm乃ち商と剰余を生成'(_n,_m,_剰余), _nを法として合同 is _m * _n + _剰余, (\+(_制約),!,fail;true). 'm乃ち商と剰余を生成'(_n,_m,_剰余) :- 整数(_n), nth0(_m,_,_), succ(_n_1,_n), between(0,_n_1,_剰余). 整数は実と法(_実,_法,_商,_剰余) :- 整数は実と法(_実,_法), _商 is _実 // _法, _剰余 is _実 mod _法. 整数は実と法(_実,_法) :- 整数(_実), 整数(_法). '整数は実と商と剰余、変数は法'(_実,_法,_制約,_商,_剰余) :- '整数は実と商と剰余、変数は法'(_実,_法,_商,_剰余), _法 is (_実 - _剰余) // _商, _剰余 is _実 mod _法, _制約. '整数は実と商と剰余、変数は法'(_実,_法,_商,_剰余) :- 整数(_実), 変数(_法), 整数(_商), 整数(_剰余). '整数は実と商、変数は法と剰余'(_実,_法,_商,_剰余) :- 整数(_実), 変数(_法), 整数(_商), 変数(_剰余), succ(_商_1,_商), between(0,_商_1,_剰余). '整数は実,変数は法と商'(_実,_法,_商,_剰余) :- 整数(_実), 変数(_法), 変数(_商), between(1,_実,_法), 整数除算(_実,_法,_制約,_商,_剰余). '変数は実'(_実,_法,_制約,_商,_剰余) :- 変数(_実), 法として合同(_法,_実,_制約,_商,_剰余). '整数は実、変数は法と商'(_実,_法,_商,_剰余) :- 整数(_実), 変数(_法), 変数(_商), between(1,_実,_法), _商 is _実 // _法, _剰余 is _実 mod _法. 整数(_整数) :- integer(_整数). 変数(_変数) :- var(_変数). % 以下のサイトは # # ガリ夫くん:スマ子さん、最近実は数字萌えに目覚めたんです! # # スマ子さん: 藪から棒にアブノーマル宣言をされても困るのだけれども……。 # # ガリ夫くん:特に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のならび,_度数). % 以下のサイトは 日曜起点カレンダー(_一日の曜日,_末日整数,_カレンダー) :- findall(_日,between(1,_末日整数,_日),_日付ならび), 第一週の整形(_一日の曜日,_日付ならび,_第一週,_第二週以後), '第二週以後(最終週の整形)'(_第二週以後,_最終週を整形された第二週以後), _カレンダー = [_第一週|_最終週を整形された第二週以後]. 第一週の整形(日曜,[_1,_2,_3,_4,_5,_6,_7|R],[_1,_2,_3,_4,_5,_6,_7],R). 第一週の整形(月曜,[_1,_2,_3,_4,_5,_6|R],[_,_1,_2,_3,_4,_5,_6],R). 第一週の整形(火曜,[_1,_2,_3,_4,_5|R],[_,_,_1,_2,_3,_4,_5],R). 第一週の整形(水曜,[_1,_2,_3,_4|R],[_,_,_,_1,_2,_3,_4],R). 第一週の整形(木曜,[_1,_2,_3|R],[_,_,_,_,_1,_2,_3],R). 第一週の整形(金曜,[_1,_2|R],[_,_,_,_,_,_1,_2],R). 第一週の整形(土曜,[_1|R],[_,_,_,_,_,_,_1],R). '第二週以後(最終週の整形)'([],[]) :- !. '第二週以後(最終週の整形)'([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- '第二週以後(最終週の整形)'(R1,R2),!. '第二週以後(最終週の整形)'(L1,[_最終週]) :- 一週間は七日だ(_最終週), append(L1,_,_最終週). 一週間は七日だ([_,_,_,_,_,_,_]). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- M is _第何行_2 - _第何行_1, '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1), '_第何行_2まで切り取る'(R1,M,A,B,R3), append(L1,[B|R3],_2つの行を交換した行列). '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1) :- append(L1,[A|R1],_行列), length([_|L1],_第何行_1). '_第何行_2まで切り取る'(R1,M,A,B,R3) :- append(L2,[B|R2],R1), length([_|L2],M), append(L2,[A|R2],R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,M,_n_2,[A|R1],A,B,[B|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,M,_n_2,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,M,[B|R1],A,B,[A|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,M,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,_n_2,[U|R1],A,B,[U|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,_n_1,_n_2,[C|R1],A,B,[D|R2]) :- 交換の選択(M,_n_1,_n_2,C,A,B,D), succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). 交換の選択(M,M,_n_2,A,A,B,B) :- !. 交換の選択(M,_n_1,M,B,A,B,A) :- !. 交換の選択(M,_n_1,_n_2,U,A,B,U). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- M is _第何行_2 - _第何行_1, '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1), '_第何行_2まで切り取る'(R1,M,A,B,R3), append(L1,[B|R3],_2つの行を交換した行列). '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1) :- append(L1,[A|R1],_行列), length([_|L1],_第何行_1). '_第何行_2まで切り取る'(R1,M,A,B,R3) :- append(L2,[B|R2],R1), length([_|L2],M), append(L2,[A|R2],R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,M,_n_2,[A|R1],A,B,[B|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,M,_n_2,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,M,[B|R1],A,B,[A|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,M,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,_n_2,[U|R1],A,B,[U|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,_n_1,_n_2,[C|R1],A,B,[D|R2]) :- 交換の選択(M,_n_1,_n_2,C,A,B,D), succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). 交換の選択(M,M,_n_2,A,A,B,B) :- !. 交換の選択(M,_n_1,M,B,A,B,A) :- !. 交換の選択(M,_n_1,_n_2,U,A,B,U). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_2つの行を交換した行列), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_2つの行を交換した行列), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは # 出典::プログラミングのお題スレ Part5 #644 # # お題:硬貨がn枚あり、合計金額がk円のとき、その内訳を求める。 # 硬貨の種類は500円玉、100円玉、50円玉、10円玉、5円玉、1円玉である。 # 内訳は各硬貨の枚数を並べたものとする。 # 複数の解がある場合はすべてを求める。 # 例 # 11枚で1082円のとき # 2 0 1 0 6 2 # # 12枚で777円のとき # 1 0 5 1 3 2 # 1 1 3 0 5 2 # # 25枚で4999円のとき # 9 2 5 4 1 4 # 9 3 3 3 3 4 # 9 4 1 2 5 4 '硬貨がn枚あり、合計金額がk円のとき、その内訳を求める。 硬貨の種類は500円玉、100円玉、50円玉、10円玉、5円玉、1円玉である。 内訳は各硬貨の枚数を並べたものとする。 複数の解がある場合はすべてを求める。'(_n,_k,_500,_100,_50,_10,_5,_1) :- '硬貨がn枚あり、'(_n,L), '合計金額がk円のとき、その内訳を求める。'(L,_k,_500,_100,_50,_10,_5,_1). '硬貨がn枚あり、'(_n,L) :- findall(_,between(1,_n,_),L). '合計金額がk円のとき、その内訳を求める。'(L,_k,_500,_100,_50,_10,_5,_1) :- append([L1,L2,L3,L4,L5,L6],L), 硬貨の枚数([L1,L2,L3,L4,L5,L6],[_500,_100,_50,_10,_5,_1]), _k is 500 * _500 + 100 * _100 + 50 * _50 + 10 * _10 + 5 * _5 + 1 * _1. 硬貨の枚数([],[]). 硬貨の枚数(L1,L2) :- 硬貨ごとの枚数を数え上げる(L1,L2). 硬貨ごとの枚数を数え上げる([L|R1],[_枚数|R2]) :- length(L,_枚数), 硬貨の枚数(R1,R2). % 以下のサイトは # # append/1 は append/4-n をabolishした後に定義する。 # ただし、_nはappend/1の引数の要素数。 # # ?- append([[1,2],[3,4],[a],[b,c,d],X]). # X = [1,2,3,4,a,b,c,d]. # # ?- append([X,[3,4],[a],Y],[1,2,3,4,a,b,c,d]]). # X = [1,2], # Y = [b,c,d]. # append(LL) :- length(LL,_n), abolish_append_n(_n), append_n_の定義(_n), P =.. [append|LL], call(P). abolish_append_n(_n) :- between(4,_n,M), abolish(append/M), _n = M. append_n_の定義(3) :- !. append_n_の定義(_n) :- succ(_n_1,_n), append_n_の定義(_n_1), append_n_の第一節定義(_n_1), append_n_の第二節定義(_n). append_n_の第一節定義(_n_1) :- findall(_,between(1,_n_1,_),L1), P_1 =.. [append,[]|L1], P_1_1 =.. [append|L1], assertz((P_1 :- P_1_1)). append_n_の第二節定義(_n) :- findall(_,between(1,_n,_),_本体引数ならび), append_n_の第二節頭部引数(_本体引数ならび,_頭部引数ならび), _頭部 =.. [append|_頭部引数ならび], _本体 =.. [append|_本体引数ならび], assertz((_頭部 :- _本体)). append_n_の第二節頭部引数([V|R1],[[U|V]|R2]) :- append_n_の第二節頭部引数(R1,U,R2). append_n_の第二節頭部引数([V],U,[[U|V]]) :- !. append_n_の第二節頭部引数([V|R1],U,[V|R2]) :- append_n_の第二節頭部引数(R1,U,R2). % 以下のサイトは # 最大の利益 # FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、(108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 # # ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。 # # 入力 # 最初の行に整数 N が与えられる。 # # 続くN行に整数 R[t] (t=1,2,,,N) が順番に与えられる。 # # 出力 # 最大値を1行に出力せよ。 # # 制約 # 2?N?200000 # 1?R[t]?109 # 入力例 1 # 6 # 2 # 3 # 1 # 3 # 4 # 3 # 入力例 1 に対する出力 # 3 # 入力例 2 # 4 # 4 # 1 # 2 # 1 # 入力例 2 に対する出力 # 1 'FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。 例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、 (108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、 価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。' :- ある通貨の時系列為替価格ならびを得る(_ある通貨の時系列為替価格ならび), 最大の為替差の利益(_ある通貨の時系列為替価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). ある通貨の時系列為替価格ならびを得る(_ある通貨の時系列価格ならび) :- 時系列数を得る(_時系列数), findall(_価格,( 価格を得る(_時系列数,_価格)), _ある通貨の時系列価格ならび). 時系列数を得る(_時系列数) :- 整数を得る(_時系列数). 価格を得る(_時系列数,_価格) :- between(1,_時系列数,_t), 整数を得る(_価格). 最大の為替差の利益(_ある通貨の時系列価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大利益,( 時刻tの投資に対する最大利益(_ある通貨の時系列価格ならび,_時刻tの投資に対する最大利益)), _最大の為替差の利益). 時刻tの投資に対する最大利益(_ある通貨の時系列価格ならび,_時刻tの投資に対する最大利益) :- append(_,[_時刻tの価格|_その後の価格ならび],_ある通貨の時系列価格ならび), 時刻tの投資に対する最大利益(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大利益). 時刻tの投資に対する最大利益(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大利益) :- findmax(_時刻tの価格との価格差,( 時刻tの価格との価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差)), _時刻tの投資に対する最大利益). 時刻tの価格との価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差) :- member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格. 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % % 整数を入力する場合の一般型 % 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 最大の利益 # FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、(108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 # # ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。 # # 入力 # 最初の行に整数 N が与えられる。 # # 続くN行に整数 R[t] (t=1,2,,,N) が順番に与えられる。 # # 出力 # 最大値を1行に出力せよ。 # # 制約 # 2?N?200000 # 1?R[t]?109 # 入力例 1 # 6 # 2 # 3 # 1 # 3 # 4 # 3 # 入力例 1 に対する出力 # 3 # 入力例 2 # 4 # 4 # 1 # 2 # 1 # 入力例 2 に対する出力 # 1 'FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。 例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、 (108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、 価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。' :- 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび), 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび) :- 時系列数を得る(_時系列数), findall(_価格,( between(1,_時系列数,_t), 価格を得る(_価格)), _時刻tに於ける価格ならび). 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大価格差,( append(_,[_時刻tの価格|_その後価格ならび],_時刻tに於ける価格ならび), 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差)), _最大の為替差の利益). 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差) :- findmax(_時刻tの価格との価格差,( member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格), _時刻tの投資に対する最大価格差). 時系列数を得る(_時系列数) :- 整数を得る(_時系列数). 価格を得る(_価格) :- 整数を得る(_価格). 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). % 以下のサイトは 日曜起点カレンダー(_年,_月) :- 一日の曜日(_年,_月,_一日の曜日), 月末日の曜日(_年,_月,_月末日,_), 日曜起点カレンダー(_一日の曜日,_月末日,_カレンダー), カレンダー表示(_カレンダー). 日曜起点カレンダー(_一日の曜日,_月末日,_カレンダー) :- findall(_日,between(1,_月末日,_日),_日付ならび), 第一週の整形(_一日の曜日,_日付ならび,_第一週,_第二週以後), 最終週の整形(_第二週以後,_最終週を整形された第二週以後), _カレンダー = [_第一週|_最終週を整形された第二週以後]. 第一週の整形(日曜,[_1,_2,_3,_4,_5,_6,_7|R],[_1,_2,_3,_4,_5,_6,_7],R). 第一週の整形(月曜,[_1,_2,_3,_4,_5,_6|R],[_,_1,_2,_3,_4,_5,_6],R). 第一週の整形(火曜,[_1,_2,_3,_4,_5|R],[_,_,_1,_2,_3,_4,_5],R). 第一週の整形(水曜,[_1,_2,_3,_4|R],[_,_,_,_1,_2,_3,_4],R). 第一週の整形(木曜,[_1,_2,_3|R],[_,_,_,_,_1,_2,_3],R). 第一週の整形(金曜,[_1,_2|R],[_,_,_,_,_,_1,_2],R). 第一週の整形(土曜,[_1|R],[_,_,_,_,_,_,_1],R). 最終週の整形([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- 最終週の整形(R1,R2),!. 最終週の整形([],[]) :- !. 最終週の整形(L1,[L2]) :- length(L2,7), append(L1,_,L2). カレンダー表示([]). カレンダー表示([_週|R]) :- カレンダー週表示(_週), カレンダー表示(R). カレンダー週表示([]) :- write('\n'). カレンダー週表示([A|R]) :- 表示項(A,_表示項), writef('%3R',[_表示項]), カレンダー週表示(R). 表示項(' ',' ') :- !. 表示項(N,N). 一日の曜日(1970,1,木曜). 一日の曜日(1970,2,日曜). 一日の曜日(1970,3,日曜). 一日の曜日(1970,4,水曜). 一日の曜日(1970,5,金曜). 一日の曜日(1970,6,月曜). 一日の曜日(1970,7,水曜). 一日の曜日(1970,8,土曜). 一日の曜日(1970,9,火曜). 一日の曜日(1970,10,木曜). 一日の曜日(1970,11,日曜). 一日の曜日(1970,12,火曜). 一日の曜日(1971,1,金曜). 一日の曜日(1971,2,月曜). 一日の曜日(1971,3,月曜). 一日の曜日(1971,4,木曜). 一日の曜日(1971,5,土曜). 一日の曜日(1971,6,火曜). 一日の曜日(1971,7,木曜). 一日の曜日(1971,8,日曜). 一日の曜日(1971,9,水曜). 一日の曜日(1971,10,金曜). 一日の曜日(1971,11,月曜). 一日の曜日(1971,12,水曜). 一日の曜日(1972,1,土曜). 一日の曜日(1972,2,火曜). 一日の曜日(1972,3,水曜). 一日の曜日(1972,4,土曜). 一日の曜日(1972,5,月曜). 一日の曜日(1972,6,木曜). 一日の曜日(1972,7,土曜). 一日の曜日(1972,8,火曜). 一日の曜日(1972,9,金曜). 一日の曜日(1972,10,日曜). 一日の曜日(1972,11,水曜). 一日の曜日(1972,12,金曜). 一日の曜日(1973,1,月曜). 一日の曜日(1973,2,木曜). 一日の曜日(1973,3,木曜). 一日の曜日(1973,4,日曜). 一日の曜日(1973,5,火曜). 一日の曜日(1973,6,金曜). 一日の曜日(1973,7,日曜). 一日の曜日(1973,8,水曜). 一日の曜日(1973,9,土曜). 一日の曜日(1973,10,月曜). 一日の曜日(1973,11,木曜). 一日の曜日(1973,12,土曜). 一日の曜日(1974,1,火曜). 一日の曜日(1974,2,金曜). 一日の曜日(1974,3,金曜). 一日の曜日(1974,4,月曜). 一日の曜日(1974,5,水曜). 一日の曜日(1974,6,土曜). 一日の曜日(1974,7,月曜). 一日の曜日(1974,8,木曜). 一日の曜日(1974,9,日曜). 一日の曜日(1974,10,火曜). 一日の曜日(1974,11,金曜). 一日の曜日(1974,12,日曜). 一日の曜日(1975,1,水曜). 一日の曜日(1975,2,土曜). 一日の曜日(1975,3,土曜). 一日の曜日(1975,4,火曜). 一日の曜日(1975,5,木曜). 一日の曜日(1975,6,日曜). 一日の曜日(1975,7,火曜). 一日の曜日(1975,8,金曜). 一日の曜日(1975,9,月曜). 一日の曜日(1975,10,水曜). 一日の曜日(1975,11,土曜). 一日の曜日(1975,12,月曜). 一日の曜日(1976,1,木曜). 一日の曜日(1976,2,日曜). 一日の曜日(1976,3,月曜). 一日の曜日(1976,4,木曜). 一日の曜日(1976,5,土曜). 一日の曜日(1976,6,火曜). 一日の曜日(1976,7,木曜). 一日の曜日(1976,8,日曜). 一日の曜日(1976,9,水曜). 一日の曜日(1976,10,金曜). 一日の曜日(1976,11,月曜). 一日の曜日(1976,12,水曜). 一日の曜日(1977,1,土曜). 一日の曜日(1977,2,火曜). 一日の曜日(1977,3,火曜). 一日の曜日(1977,4,金曜). 一日の曜日(1977,5,日曜). 一日の曜日(1977,6,水曜). 一日の曜日(1977,7,金曜). 一日の曜日(1977,8,月曜). 一日の曜日(1977,9,木曜). 一日の曜日(1977,10,土曜). 一日の曜日(1977,11,火曜). 一日の曜日(1977,12,木曜). 一日の曜日(1978,1,日曜). 一日の曜日(1978,2,水曜). 一日の曜日(1978,3,水曜). 一日の曜日(1978,4,土曜). 一日の曜日(1978,5,月曜). 一日の曜日(1978,6,木曜). 一日の曜日(1978,7,土曜). 一日の曜日(1978,8,火曜). 一日の曜日(1978,9,金曜). 一日の曜日(1978,10,日曜). 一日の曜日(1978,11,水曜). 一日の曜日(1978,12,金曜). 一日の曜日(1979,1,月曜). 一日の曜日(1979,2,木曜). 一日の曜日(1979,3,木曜). 一日の曜日(1979,4,日曜). 一日の曜日(1979,5,火曜). 一日の曜日(1979,6,金曜). 一日の曜日(1979,7,日曜). 一日の曜日(1979,8,水曜). 一日の曜日(1979,9,土曜). 一日の曜日(1979,10,月曜). 一日の曜日(1979,11,木曜). 一日の曜日(1979,12,土曜). 一日の曜日(1980,1,火曜). 一日の曜日(1980,2,金曜). 一日の曜日(1980,3,土曜). 一日の曜日(1980,4,火曜). 一日の曜日(1980,5,木曜). 一日の曜日(1980,6,日曜). 一日の曜日(1980,7,火曜). 一日の曜日(1980,8,金曜). 一日の曜日(1980,9,月曜). 一日の曜日(1980,10,水曜). 一日の曜日(1980,11,土曜). 一日の曜日(1980,12,月曜). 一日の曜日(1981,1,木曜). 一日の曜日(1981,2,日曜). 一日の曜日(1981,3,日曜). 一日の曜日(1981,4,水曜). 一日の曜日(1981,5,金曜). 一日の曜日(1981,6,月曜). 一日の曜日(1981,7,水曜). 一日の曜日(1981,8,土曜). 一日の曜日(1981,9,火曜). 一日の曜日(1981,10,木曜). 一日の曜日(1981,11,日曜). 一日の曜日(1981,12,火曜). 一日の曜日(1982,1,金曜). 一日の曜日(1982,2,月曜). 一日の曜日(1982,3,月曜). 一日の曜日(1982,4,木曜). 一日の曜日(1982,5,土曜). 一日の曜日(1982,6,火曜). 一日の曜日(1982,7,木曜). 一日の曜日(1982,8,日曜). 一日の曜日(1982,9,水曜). 一日の曜日(1982,10,金曜). 一日の曜日(1982,11,月曜). 一日の曜日(1982,12,水曜). 一日の曜日(1983,1,土曜). 一日の曜日(1983,2,火曜). 一日の曜日(1983,3,火曜). 一日の曜日(1983,4,金曜). 一日の曜日(1983,5,日曜). 一日の曜日(1983,6,水曜). 一日の曜日(1983,7,金曜). 一日の曜日(1983,8,月曜). 一日の曜日(1983,9,木曜). 一日の曜日(1983,10,土曜). 一日の曜日(1983,11,火曜). 一日の曜日(1983,12,木曜). 一日の曜日(1984,1,日曜). 一日の曜日(1984,2,水曜). 一日の曜日(1984,3,木曜). 一日の曜日(1984,4,日曜). 一日の曜日(1984,5,火曜). 一日の曜日(1984,6,金曜). 一日の曜日(1984,7,日曜). 一日の曜日(1984,8,水曜). 一日の曜日(1984,9,土曜). 一日の曜日(1984,10,月曜). 一日の曜日(1984,11,木曜). 一日の曜日(1984,12,土曜). 一日の曜日(1985,1,火曜). 一日の曜日(1985,2,金曜). 一日の曜日(1985,3,金曜). 一日の曜日(1985,4,月曜). 一日の曜日(1985,5,水曜). 一日の曜日(1985,6,土曜). 一日の曜日(1985,7,月曜). 一日の曜日(1985,8,木曜). 一日の曜日(1985,9,日曜). 一日の曜日(1985,10,火曜). 一日の曜日(1985,11,金曜). 一日の曜日(1985,12,日曜). 一日の曜日(1986,1,水曜). 一日の曜日(1986,2,土曜). 一日の曜日(1986,3,土曜). 一日の曜日(1986,4,火曜). 一日の曜日(1986,5,木曜). 一日の曜日(1986,6,日曜). 一日の曜日(1986,7,火曜). 一日の曜日(1986,8,金曜). 一日の曜日(1986,9,月曜). 一日の曜日(1986,10,水曜). 一日の曜日(1986,11,土曜). 一日の曜日(1986,12,月曜). 一日の曜日(1987,1,木曜). 一日の曜日(1987,2,日曜). 一日の曜日(1987,3,日曜). 一日の曜日(1987,4,水曜). 一日の曜日(1987,5,金曜). 一日の曜日(1987,6,月曜). 一日の曜日(1987,7,水曜). 一日の曜日(1987,8,土曜). 一日の曜日(1987,9,火曜). 一日の曜日(1987,10,木曜). 一日の曜日(1987,11,日曜). 一日の曜日(1987,12,火曜). 一日の曜日(1988,1,金曜). 一日の曜日(1988,2,月曜). 一日の曜日(1988,3,火曜). 一日の曜日(1988,4,金曜). 一日の曜日(1988,5,日曜). 一日の曜日(1988,6,水曜). 一日の曜日(1988,7,金曜). 一日の曜日(1988,8,月曜). 一日の曜日(1988,9,木曜). 一日の曜日(1988,10,土曜). 一日の曜日(1988,11,火曜). 一日の曜日(1988,12,木曜). 一日の曜日(1989,1,日曜). 一日の曜日(1989,2,水曜). 一日の曜日(1989,3,水曜). 一日の曜日(1989,4,土曜). 一日の曜日(1989,5,月曜). 一日の曜日(1989,6,木曜). 一日の曜日(1989,7,土曜). 一日の曜日(1989,8,火曜). 一日の曜日(1989,9,金曜). 一日の曜日(1989,10,日曜). 一日の曜日(1989,11,水曜). 一日の曜日(1989,12,金曜). 一日の曜日(1990,1,月曜). 一日の曜日(1990,2,木曜). 一日の曜日(1990,3,木曜). 一日の曜日(1990,4,日曜). 一日の曜日(1990,5,火曜). 一日の曜日(1990,6,金曜). 一日の曜日(1990,7,日曜). 一日の曜日(1990,8,水曜). 一日の曜日(1990,9,土曜). 一日の曜日(1990,10,月曜). 一日の曜日(1990,11,木曜). 一日の曜日(1990,12,土曜). 一日の曜日(1991,1,火曜). 一日の曜日(1991,2,金曜). 一日の曜日(1991,3,金曜). 一日の曜日(1991,4,月曜). 一日の曜日(1991,5,水曜). 一日の曜日(1991,6,土曜). 一日の曜日(1991,7,月曜). 一日の曜日(1991,8,木曜). 一日の曜日(1991,9,日曜). 一日の曜日(1991,10,火曜). 一日の曜日(1991,11,金曜). 一日の曜日(1991,12,日曜). 一日の曜日(1992,1,水曜). 一日の曜日(1992,2,土曜). 一日の曜日(1992,3,日曜). 一日の曜日(1992,4,水曜). 一日の曜日(1992,5,金曜). 一日の曜日(1992,6,月曜). 一日の曜日(1992,7,水曜). 一日の曜日(1992,8,土曜). 一日の曜日(1992,9,火曜). 一日の曜日(1992,10,木曜). 一日の曜日(1992,11,日曜). 一日の曜日(1992,12,火曜). 一日の曜日(1993,1,金曜). 一日の曜日(1993,2,月曜). 一日の曜日(1993,3,月曜). 一日の曜日(1993,4,木曜). 一日の曜日(1993,5,土曜). 一日の曜日(1993,6,火曜). 一日の曜日(1993,7,木曜). 一日の曜日(1993,8,日曜). 一日の曜日(1993,9,水曜). 一日の曜日(1993,10,金曜). 一日の曜日(1993,11,月曜). 一日の曜日(1993,12,水曜). 一日の曜日(1994,1,土曜). 一日の曜日(1994,2,火曜). 一日の曜日(1994,3,火曜). 一日の曜日(1994,4,金曜). 一日の曜日(1994,5,日曜). 一日の曜日(1994,6,水曜). 一日の曜日(1994,7,金曜). 一日の曜日(1994,8,月曜). 一日の曜日(1994,9,木曜). 一日の曜日(1994,10,土曜). 一日の曜日(1994,11,火曜). 一日の曜日(1994,12,木曜). 一日の曜日(1995,1,日曜). 一日の曜日(1995,2,水曜). 一日の曜日(1995,3,水曜). 一日の曜日(1995,4,土曜). 一日の曜日(1995,5,月曜). 一日の曜日(1995,6,木曜). 一日の曜日(1995,7,土曜). 一日の曜日(1995,8,火曜). 一日の曜日(1995,9,金曜). 一日の曜日(1995,10,日曜). 一日の曜日(1995,11,水曜). 一日の曜日(1995,12,金曜). 一日の曜日(1996,1,月曜). 一日の曜日(1996,2,木曜). 一日の曜日(1996,3,金曜). 一日の曜日(1996,4,月曜). 一日の曜日(1996,5,水曜). 一日の曜日(1996,6,土曜). 一日の曜日(1996,7,月曜). 一日の曜日(1996,8,木曜). 一日の曜日(1996,9,日曜). 一日の曜日(1996,10,火曜). 一日の曜日(1996,11,金曜). 一日の曜日(1996,12,日曜). 一日の曜日(1997,1,水曜). 一日の曜日(1997,2,土曜). 一日の曜日(1997,3,土曜). 一日の曜日(1997,4,火曜). 一日の曜日(1997,5,木曜). 一日の曜日(1997,6,日曜). 一日の曜日(1997,7,火曜). 一日の曜日(1997,8,金曜). 一日の曜日(1997,9,月曜). 一日の曜日(1997,10,水曜). 一日の曜日(1997,11,土曜). 一日の曜日(1997,12,月曜). 一日の曜日(1998,1,木曜). 一日の曜日(1998,2,日曜). 一日の曜日(1998,3,日曜). 一日の曜日(1998,4,水曜). 一日の曜日(1998,5,金曜). 一日の曜日(1998,6,月曜). 一日の曜日(1998,7,水曜). 一日の曜日(1998,8,土曜). 一日の曜日(1998,9,火曜). 一日の曜日(1998,10,木曜). 一日の曜日(1998,11,日曜). 一日の曜日(1998,12,火曜). 一日の曜日(1999,1,金曜). 一日の曜日(1999,2,月曜). 一日の曜日(1999,3,月曜). 一日の曜日(1999,4,木曜). 一日の曜日(1999,5,土曜). 一日の曜日(1999,6,火曜). 一日の曜日(1999,7,木曜). 一日の曜日(1999,8,日曜). 一日の曜日(1999,9,水曜). 一日の曜日(1999,10,金曜). 一日の曜日(1999,11,月曜). 一日の曜日(1999,12,水曜). 一日の曜日(2000,1,土曜). 一日の曜日(2000,2,火曜). 一日の曜日(2000,3,水曜). 一日の曜日(2000,4,土曜). 一日の曜日(2000,5,月曜). 一日の曜日(2000,6,木曜). 一日の曜日(2000,7,土曜). 一日の曜日(2000,8,火曜). 一日の曜日(2000,9,金曜). 一日の曜日(2000,10,日曜). 一日の曜日(2000,11,水曜). 一日の曜日(2000,12,金曜). 一日の曜日(2001,1,月曜). 一日の曜日(2001,2,木曜). 一日の曜日(2001,3,木曜). 一日の曜日(2001,4,日曜). 一日の曜日(2001,5,火曜). 一日の曜日(2001,6,金曜). 一日の曜日(2001,7,日曜). 一日の曜日(2001,8,水曜). 一日の曜日(2001,9,土曜). 一日の曜日(2001,10,月曜). 一日の曜日(2001,11,木曜). 一日の曜日(2001,12,土曜). 一日の曜日(2002,1,火曜). 一日の曜日(2002,2,金曜). 一日の曜日(2002,3,金曜). 一日の曜日(2002,4,月曜). 一日の曜日(2002,5,水曜). 一日の曜日(2002,6,土曜). 一日の曜日(2002,7,月曜). 一日の曜日(2002,8,木曜). 一日の曜日(2002,9,日曜). 一日の曜日(2002,10,火曜). 一日の曜日(2002,11,金曜). 一日の曜日(2002,12,日曜). 一日の曜日(2003,1,水曜). 一日の曜日(2003,2,土曜). 一日の曜日(2003,3,土曜). 一日の曜日(2003,4,火曜). 一日の曜日(2003,5,木曜). 一日の曜日(2003,6,日曜). 一日の曜日(2003,7,火曜). 一日の曜日(2003,8,金曜). 一日の曜日(2003,9,月曜). 一日の曜日(2003,10,水曜). 一日の曜日(2003,11,土曜). 一日の曜日(2003,12,月曜). 一日の曜日(2004,1,木曜). 一日の曜日(2004,2,日曜). 一日の曜日(2004,3,月曜). 一日の曜日(2004,4,木曜). 一日の曜日(2004,5,土曜). 一日の曜日(2004,6,火曜). 一日の曜日(2004,7,木曜). 一日の曜日(2004,8,日曜). 一日の曜日(2004,9,水曜). 一日の曜日(2004,10,金曜). 一日の曜日(2004,11,月曜). 一日の曜日(2004,12,水曜). 一日の曜日(2005,1,土曜). 一日の曜日(2005,2,火曜). 一日の曜日(2005,3,火曜). 一日の曜日(2005,4,金曜). 一日の曜日(2005,5,日曜). 一日の曜日(2005,6,水曜). 一日の曜日(2005,7,金曜). 一日の曜日(2005,8,月曜). 一日の曜日(2005,9,木曜). 一日の曜日(2005,10,土曜). 一日の曜日(2005,11,火曜). 一日の曜日(2005,12,木曜). 一日の曜日(2006,1,日曜). 一日の曜日(2006,2,水曜). 一日の曜日(2006,3,水曜). 一日の曜日(2006,4,土曜). 一日の曜日(2006,5,月曜). 一日の曜日(2006,6,木曜). 一日の曜日(2006,7,土曜). 一日の曜日(2006,8,火曜). 一日の曜日(2006,9,金曜). 一日の曜日(2006,10,日曜). 一日の曜日(2006,11,水曜). 一日の曜日(2006,12,金曜). 一日の曜日(2007,1,月曜). 一日の曜日(2007,2,木曜). 一日の曜日(2007,3,木曜). 一日の曜日(2007,4,日曜). 一日の曜日(2007,5,火曜). 一日の曜日(2007,6,金曜). 一日の曜日(2007,7,日曜). 一日の曜日(2007,8,水曜). 一日の曜日(2007,9,土曜). 一日の曜日(2007,10,月曜). 一日の曜日(2007,11,木曜). 一日の曜日(2007,12,土曜). 一日の曜日(2008,1,火曜). 一日の曜日(2008,2,金曜). 一日の曜日(2008,3,土曜). 一日の曜日(2008,4,火曜). 一日の曜日(2008,5,木曜). 一日の曜日(2008,6,日曜). 一日の曜日(2008,7,火曜). 一日の曜日(2008,8,金曜). 一日の曜日(2008,9,月曜). 一日の曜日(2008,10,水曜). 一日の曜日(2008,11,土曜). 一日の曜日(2008,12,月曜). 一日の曜日(2009,1,木曜). 一日の曜日(2009,2,日曜). 一日の曜日(2009,3,日曜). 一日の曜日(2009,4,水曜). 一日の曜日(2009,5,金曜). 一日の曜日(2009,6,月曜). 一日の曜日(2009,7,水曜). 一日の曜日(2009,8,土曜). 一日の曜日(2009,9,火曜). 一日の曜日(2009,10,木曜). 一日の曜日(2009,11,日曜). 一日の曜日(2009,12,火曜). 一日の曜日(2010,1,金曜). 一日の曜日(2010,2,月曜). 一日の曜日(2010,3,月曜). 一日の曜日(2010,4,木曜). 一日の曜日(2010,5,土曜). 一日の曜日(2010,6,火曜). 一日の曜日(2010,7,木曜). 一日の曜日(2010,8,日曜). 一日の曜日(2010,9,水曜). 一日の曜日(2010,10,金曜). 一日の曜日(2010,11,月曜). 一日の曜日(2010,12,水曜). 一日の曜日(2011,1,土曜). 一日の曜日(2011,2,火曜). 一日の曜日(2011,3,火曜). 一日の曜日(2011,4,金曜). 一日の曜日(2011,5,日曜). 一日の曜日(2011,6,水曜). 一日の曜日(2011,7,金曜). 一日の曜日(2011,8,月曜). 一日の曜日(2011,9,木曜). 一日の曜日(2011,10,土曜). 一日の曜日(2011,11,火曜). 一日の曜日(2011,12,木曜). 一日の曜日(2012,1,日曜). 一日の曜日(2012,2,水曜). 一日の曜日(2012,3,木曜). 一日の曜日(2012,4,日曜). 一日の曜日(2012,5,火曜). 一日の曜日(2012,6,金曜). 一日の曜日(2012,7,日曜). 一日の曜日(2012,8,水曜). 一日の曜日(2012,9,土曜). 一日の曜日(2012,10,月曜). 一日の曜日(2012,11,木曜). 一日の曜日(2012,12,土曜). 一日の曜日(2013,1,火曜). 一日の曜日(2013,2,金曜). 一日の曜日(2013,3,金曜). 一日の曜日(2013,4,月曜). 一日の曜日(2013,5,水曜). 一日の曜日(2013,6,土曜). 一日の曜日(2013,7,月曜). 一日の曜日(2013,8,木曜). 一日の曜日(2013,9,日曜). 一日の曜日(2013,10,火曜). 一日の曜日(2013,11,金曜). 一日の曜日(2013,12,日曜). 一日の曜日(2014,1,水曜). 一日の曜日(2014,2,土曜). 一日の曜日(2014,3,土曜). 一日の曜日(2014,4,火曜). 一日の曜日(2014,5,木曜). 一日の曜日(2014,6,日曜). 一日の曜日(2014,7,火曜). 一日の曜日(2014,8,金曜). 一日の曜日(2014,9,月曜). 一日の曜日(2014,10,水曜). 一日の曜日(2014,11,土曜). 一日の曜日(2014,12,月曜). 一日の曜日(2015,1,木曜). 一日の曜日(2015,2,日曜). 一日の曜日(2015,3,日曜). 一日の曜日(2015,4,水曜). 一日の曜日(2015,5,金曜). 一日の曜日(2015,6,月曜). 一日の曜日(2015,7,水曜). 一日の曜日(2015,8,土曜). 一日の曜日(2015,9,火曜). 一日の曜日(2015,10,木曜). 一日の曜日(2015,11,日曜). 一日の曜日(2015,12,火曜). 一日の曜日(2016,1,金曜). 一日の曜日(2016,2,月曜). 一日の曜日(2016,3,火曜). 一日の曜日(2016,4,金曜). 一日の曜日(2016,5,日曜). 一日の曜日(2016,6,水曜). 一日の曜日(2016,7,金曜). 一日の曜日(2016,8,月曜). 一日の曜日(2016,9,木曜). 一日の曜日(2016,10,土曜). 一日の曜日(2016,11,火曜). 一日の曜日(2016,12,木曜). 一日の曜日(2017,1,日曜). 一日の曜日(2017,2,水曜). 一日の曜日(2017,3,水曜). 一日の曜日(2017,4,土曜). 一日の曜日(2017,5,月曜). 一日の曜日(2017,6,木曜). 一日の曜日(2017,7,土曜). 一日の曜日(2017,8,火曜). 一日の曜日(2017,9,金曜). 一日の曜日(2017,10,日曜). 一日の曜日(2017,11,水曜). 一日の曜日(2017,12,金曜). 一日の曜日(2018,1,月曜). 一日の曜日(2018,2,木曜). 一日の曜日(2018,3,木曜). 一日の曜日(2018,4,日曜). 一日の曜日(2018,5,火曜). 一日の曜日(2018,6,金曜). 一日の曜日(2018,7,日曜). 一日の曜日(2018,8,水曜). 一日の曜日(2018,9,土曜). 一日の曜日(2018,10,月曜). 一日の曜日(2018,11,木曜). 一日の曜日(2018,12,土曜). 一日の曜日(2019,1,火曜). 一日の曜日(2019,2,金曜). 一日の曜日(2019,3,金曜). 一日の曜日(2019,4,月曜). 一日の曜日(2019,5,水曜). 一日の曜日(2019,6,土曜). 一日の曜日(2019,7,月曜). 一日の曜日(2019,8,木曜). 一日の曜日(2019,9,日曜). 一日の曜日(2019,10,火曜). 一日の曜日(2019,11,金曜). 一日の曜日(2019,12,日曜). 一日の曜日(2020,1,水曜). 一日の曜日(2020,2,土曜). 一日の曜日(2020,3,日曜). 一日の曜日(2020,4,水曜). 一日の曜日(2020,5,金曜). 一日の曜日(2020,6,月曜). 一日の曜日(2020,7,水曜). 一日の曜日(2020,8,土曜). 一日の曜日(2020,9,火曜). 一日の曜日(2020,10,木曜). 一日の曜日(2020,11,日曜). 一日の曜日(2020,12,火曜). 月末日の曜日(1970,1,31,土曜). 月末日の曜日(1970,2,28,土曜). 月末日の曜日(1970,3,31,火曜). 月末日の曜日(1970,4,30,木曜). 月末日の曜日(1970,5,31,日曜). 月末日の曜日(1970,6,30,火曜). 月末日の曜日(1970,7,31,金曜). 月末日の曜日(1970,8,31,月曜). 月末日の曜日(1970,9,30,水曜). 月末日の曜日(1970,10,31,土曜). 月末日の曜日(1970,11,30,月曜). 月末日の曜日(1970,12,31,木曜). 月末日の曜日(1971,1,31,日曜). 月末日の曜日(1971,2,28,日曜). 月末日の曜日(1971,3,31,水曜). 月末日の曜日(1971,4,30,金曜). 月末日の曜日(1971,5,31,月曜). 月末日の曜日(1971,6,30,水曜). 月末日の曜日(1971,7,31,土曜). 月末日の曜日(1971,8,31,火曜). 月末日の曜日(1971,9,30,木曜). 月末日の曜日(1971,10,31,日曜). 月末日の曜日(1971,11,30,火曜). 月末日の曜日(1971,12,31,金曜). 月末日の曜日(1972,1,31,月曜). 月末日の曜日(1972,2,29,火曜). 月末日の曜日(1972,3,31,金曜). 月末日の曜日(1972,4,30,日曜). 月末日の曜日(1972,5,31,水曜). 月末日の曜日(1972,6,30,金曜). 月末日の曜日(1972,7,31,月曜). 月末日の曜日(1972,8,31,木曜). 月末日の曜日(1972,9,30,土曜). 月末日の曜日(1972,10,31,火曜). 月末日の曜日(1972,11,30,木曜). 月末日の曜日(1972,12,31,日曜). 月末日の曜日(1973,1,31,水曜). 月末日の曜日(1973,2,28,水曜). 月末日の曜日(1973,3,31,土曜). 月末日の曜日(1973,4,30,月曜). 月末日の曜日(1973,5,31,木曜). 月末日の曜日(1973,6,30,土曜). 月末日の曜日(1973,7,31,火曜). 月末日の曜日(1973,8,31,金曜). 月末日の曜日(1973,9,30,日曜). 月末日の曜日(1973,10,31,水曜). 月末日の曜日(1973,11,30,金曜). 月末日の曜日(1973,12,31,月曜). 月末日の曜日(1974,1,31,木曜). 月末日の曜日(1974,2,28,木曜). 月末日の曜日(1974,3,31,日曜). 月末日の曜日(1974,4,30,火曜). 月末日の曜日(1974,5,31,金曜). 月末日の曜日(1974,6,30,日曜). 月末日の曜日(1974,7,31,水曜). 月末日の曜日(1974,8,31,土曜). 月末日の曜日(1974,9,30,月曜). 月末日の曜日(1974,10,31,木曜). 月末日の曜日(1974,11,30,土曜). 月末日の曜日(1974,12,31,火曜). 月末日の曜日(1975,1,31,金曜). 月末日の曜日(1975,2,28,金曜). 月末日の曜日(1975,3,31,月曜). 月末日の曜日(1975,4,30,水曜). 月末日の曜日(1975,5,31,土曜). 月末日の曜日(1975,6,30,月曜). 月末日の曜日(1975,7,31,木曜). 月末日の曜日(1975,8,31,日曜). 月末日の曜日(1975,9,30,火曜). 月末日の曜日(1975,10,31,金曜). 月末日の曜日(1975,11,30,日曜). 月末日の曜日(1975,12,31,水曜). 月末日の曜日(1976,1,31,土曜). 月末日の曜日(1976,2,29,日曜). 月末日の曜日(1976,3,31,水曜). 月末日の曜日(1976,4,30,金曜). 月末日の曜日(1976,5,31,月曜). 月末日の曜日(1976,6,30,水曜). 月末日の曜日(1976,7,31,土曜). 月末日の曜日(1976,8,31,火曜). 月末日の曜日(1976,9,30,木曜). 月末日の曜日(1976,10,31,日曜). 月末日の曜日(1976,11,30,火曜). 月末日の曜日(1976,12,31,金曜). 月末日の曜日(1977,1,31,月曜). 月末日の曜日(1977,2,28,月曜). 月末日の曜日(1977,3,31,木曜). 月末日の曜日(1977,4,30,土曜). 月末日の曜日(1977,5,31,火曜). 月末日の曜日(1977,6,30,木曜). 月末日の曜日(1977,7,31,日曜). 月末日の曜日(1977,8,31,水曜). 月末日の曜日(1977,9,30,金曜). 月末日の曜日(1977,10,31,月曜). 月末日の曜日(1977,11,30,水曜). 月末日の曜日(1977,12,31,土曜). 月末日の曜日(1978,1,31,火曜). 月末日の曜日(1978,2,28,火曜). 月末日の曜日(1978,3,31,金曜). 月末日の曜日(1978,4,30,日曜). 月末日の曜日(1978,5,31,水曜). 月末日の曜日(1978,6,30,金曜). 月末日の曜日(1978,7,31,月曜). 月末日の曜日(1978,8,31,木曜). 月末日の曜日(1978,9,30,土曜). 月末日の曜日(1978,10,31,火曜). 月末日の曜日(1978,11,30,木曜). 月末日の曜日(1978,12,31,日曜). 月末日の曜日(1979,1,31,水曜). 月末日の曜日(1979,2,28,水曜). 月末日の曜日(1979,3,31,土曜). 月末日の曜日(1979,4,30,月曜). 月末日の曜日(1979,5,31,木曜). 月末日の曜日(1979,6,30,土曜). 月末日の曜日(1979,7,31,火曜). 月末日の曜日(1979,8,31,金曜). 月末日の曜日(1979,9,30,日曜). 月末日の曜日(1979,10,31,水曜). 月末日の曜日(1979,11,30,金曜). 月末日の曜日(1979,12,31,月曜). 月末日の曜日(1980,1,31,木曜). 月末日の曜日(1980,2,29,金曜). 月末日の曜日(1980,3,31,月曜). 月末日の曜日(1980,4,30,水曜). 月末日の曜日(1980,5,31,土曜). 月末日の曜日(1980,6,30,月曜). 月末日の曜日(1980,7,31,木曜). 月末日の曜日(1980,8,31,日曜). 月末日の曜日(1980,9,30,火曜). 月末日の曜日(1980,10,31,金曜). 月末日の曜日(1980,11,30,日曜). 月末日の曜日(1980,12,31,水曜). 月末日の曜日(1981,1,31,土曜). 月末日の曜日(1981,2,28,土曜). 月末日の曜日(1981,3,31,火曜). 月末日の曜日(1981,4,30,木曜). 月末日の曜日(1981,5,31,日曜). 月末日の曜日(1981,6,30,火曜). 月末日の曜日(1981,7,31,金曜). 月末日の曜日(1981,8,31,月曜). 月末日の曜日(1981,9,30,水曜). 月末日の曜日(1981,10,31,土曜). 月末日の曜日(1981,11,30,月曜). 月末日の曜日(1981,12,31,木曜). 月末日の曜日(1982,1,31,日曜). 月末日の曜日(1982,2,28,日曜). 月末日の曜日(1982,3,31,水曜). 月末日の曜日(1982,4,30,金曜). 月末日の曜日(1982,5,31,月曜). 月末日の曜日(1982,6,30,水曜). 月末日の曜日(1982,7,31,土曜). 月末日の曜日(1982,8,31,火曜). 月末日の曜日(1982,9,30,木曜). 月末日の曜日(1982,10,31,日曜). 月末日の曜日(1982,11,30,火曜). 月末日の曜日(1982,12,31,金曜). 月末日の曜日(1983,1,31,月曜). 月末日の曜日(1983,2,28,月曜). 月末日の曜日(1983,3,31,木曜). 月末日の曜日(1983,4,30,土曜). 月末日の曜日(1983,5,31,火曜). 月末日の曜日(1983,6,30,木曜). 月末日の曜日(1983,7,31,日曜). 月末日の曜日(1983,8,31,水曜). 月末日の曜日(1983,9,30,金曜). 月末日の曜日(1983,10,31,月曜). 月末日の曜日(1983,11,30,水曜). 月末日の曜日(1983,12,31,土曜). 月末日の曜日(1984,1,31,火曜). 月末日の曜日(1984,2,29,水曜). 月末日の曜日(1984,3,31,土曜). 月末日の曜日(1984,4,30,月曜). 月末日の曜日(1984,5,31,木曜). 月末日の曜日(1984,6,30,土曜). 月末日の曜日(1984,7,31,火曜). 月末日の曜日(1984,8,31,金曜). 月末日の曜日(1984,9,30,日曜). 月末日の曜日(1984,10,31,水曜). 月末日の曜日(1984,11,30,金曜). 月末日の曜日(1984,12,31,月曜). 月末日の曜日(1985,1,31,木曜). 月末日の曜日(1985,2,28,木曜). 月末日の曜日(1985,3,31,日曜). 月末日の曜日(1985,4,30,火曜). 月末日の曜日(1985,5,31,金曜). 月末日の曜日(1985,6,30,日曜). 月末日の曜日(1985,7,31,水曜). 月末日の曜日(1985,8,31,土曜). 月末日の曜日(1985,9,30,月曜). 月末日の曜日(1985,10,31,木曜). 月末日の曜日(1985,11,30,土曜). 月末日の曜日(1985,12,31,火曜). 月末日の曜日(1986,1,31,金曜). 月末日の曜日(1986,2,28,金曜). 月末日の曜日(1986,3,31,月曜). 月末日の曜日(1986,4,30,水曜). 月末日の曜日(1986,5,31,土曜). 月末日の曜日(1986,6,30,月曜). 月末日の曜日(1986,7,31,木曜). 月末日の曜日(1986,8,31,日曜). 月末日の曜日(1986,9,30,火曜). 月末日の曜日(1986,10,31,金曜). 月末日の曜日(1986,11,30,日曜). 月末日の曜日(1986,12,31,水曜). 月末日の曜日(1987,1,31,土曜). 月末日の曜日(1987,2,28,土曜). 月末日の曜日(1987,3,31,火曜). 月末日の曜日(1987,4,30,木曜). 月末日の曜日(1987,5,31,日曜). 月末日の曜日(1987,6,30,火曜). 月末日の曜日(1987,7,31,金曜). 月末日の曜日(1987,8,31,月曜). 月末日の曜日(1987,9,30,水曜). 月末日の曜日(1987,10,31,土曜). 月末日の曜日(1987,11,30,月曜). 月末日の曜日(1987,12,31,木曜). 月末日の曜日(1988,1,31,日曜). 月末日の曜日(1988,2,29,月曜). 月末日の曜日(1988,3,31,木曜). 月末日の曜日(1988,4,30,土曜). 月末日の曜日(1988,5,31,火曜). 月末日の曜日(1988,6,30,木曜). 月末日の曜日(1988,7,31,日曜). 月末日の曜日(1988,8,31,水曜). 月末日の曜日(1988,9,30,金曜). 月末日の曜日(1988,10,31,月曜). 月末日の曜日(1988,11,30,水曜). 月末日の曜日(1988,12,31,土曜). 月末日の曜日(1989,1,31,火曜). 月末日の曜日(1989,2,28,火曜). 月末日の曜日(1989,3,31,金曜). 月末日の曜日(1989,4,30,日曜). 月末日の曜日(1989,5,31,水曜). 月末日の曜日(1989,6,30,金曜). 月末日の曜日(1989,7,31,月曜). 月末日の曜日(1989,8,31,木曜). 月末日の曜日(1989,9,30,土曜). 月末日の曜日(1989,10,31,火曜). 月末日の曜日(1989,11,30,木曜). 月末日の曜日(1989,12,31,日曜). 月末日の曜日(1990,1,31,水曜). 月末日の曜日(1990,2,28,水曜). 月末日の曜日(1990,3,31,土曜). 月末日の曜日(1990,4,30,月曜). 月末日の曜日(1990,5,31,木曜). 月末日の曜日(1990,6,30,土曜). 月末日の曜日(1990,7,31,火曜). 月末日の曜日(1990,8,31,金曜). 月末日の曜日(1990,9,30,日曜). 月末日の曜日(1990,10,31,水曜). 月末日の曜日(1990,11,30,金曜). 月末日の曜日(1990,12,31,月曜). 月末日の曜日(1991,1,31,木曜). 月末日の曜日(1991,2,28,木曜). 月末日の曜日(1991,3,31,日曜). 月末日の曜日(1991,4,30,火曜). 月末日の曜日(1991,5,31,金曜). 月末日の曜日(1991,6,30,日曜). 月末日の曜日(1991,7,31,水曜). 月末日の曜日(1991,8,31,土曜). 月末日の曜日(1991,9,30,月曜). 月末日の曜日(1991,10,31,木曜). 月末日の曜日(1991,11,30,土曜). 月末日の曜日(1991,12,31,火曜). 月末日の曜日(1992,1,31,金曜). 月末日の曜日(1992,2,29,土曜). 月末日の曜日(1992,3,31,火曜). 月末日の曜日(1992,4,30,木曜). 月末日の曜日(1992,5,31,日曜). 月末日の曜日(1992,6,30,火曜). 月末日の曜日(1992,7,31,金曜). 月末日の曜日(1992,8,31,月曜). 月末日の曜日(1992,9,30,水曜). 月末日の曜日(1992,10,31,土曜). 月末日の曜日(1992,11,30,月曜). 月末日の曜日(1992,12,31,木曜). 月末日の曜日(1993,1,31,日曜). 月末日の曜日(1993,2,28,日曜). 月末日の曜日(1993,3,31,水曜). 月末日の曜日(1993,4,30,金曜). 月末日の曜日(1993,5,31,月曜). 月末日の曜日(1993,6,30,水曜). 月末日の曜日(1993,7,31,土曜). 月末日の曜日(1993,8,31,火曜). 月末日の曜日(1993,9,30,木曜). 月末日の曜日(1993,10,31,日曜). 月末日の曜日(1993,11,30,火曜). 月末日の曜日(1993,12,31,金曜). 月末日の曜日(1994,1,31,月曜). 月末日の曜日(1994,2,28,月曜). 月末日の曜日(1994,3,31,木曜). 月末日の曜日(1994,4,30,土曜). 月末日の曜日(1994,5,31,火曜). 月末日の曜日(1994,6,30,木曜). 月末日の曜日(1994,7,31,日曜). 月末日の曜日(1994,8,31,水曜). 月末日の曜日(1994,9,30,金曜). 月末日の曜日(1994,10,31,月曜). 月末日の曜日(1994,11,30,水曜). 月末日の曜日(1994,12,31,土曜). 月末日の曜日(1995,1,31,火曜). 月末日の曜日(1995,2,28,火曜). 月末日の曜日(1995,3,31,金曜). 月末日の曜日(1995,4,30,日曜). 月末日の曜日(1995,5,31,水曜). 月末日の曜日(1995,6,30,金曜). 月末日の曜日(1995,7,31,月曜). 月末日の曜日(1995,8,31,木曜). 月末日の曜日(1995,9,30,土曜). 月末日の曜日(1995,10,31,火曜). 月末日の曜日(1995,11,30,木曜). 月末日の曜日(1995,12,31,日曜). 月末日の曜日(1996,1,31,水曜). 月末日の曜日(1996,2,29,木曜). 月末日の曜日(1996,3,31,日曜). 月末日の曜日(1996,4,30,火曜). 月末日の曜日(1996,5,31,金曜). 月末日の曜日(1996,6,30,日曜). 月末日の曜日(1996,7,31,水曜). 月末日の曜日(1996,8,31,土曜). 月末日の曜日(1996,9,30,月曜). 月末日の曜日(1996,10,31,木曜). 月末日の曜日(1996,11,30,土曜). 月末日の曜日(1996,12,31,火曜). 月末日の曜日(1997,1,31,金曜). 月末日の曜日(1997,2,28,金曜). 月末日の曜日(1997,3,31,月曜). 月末日の曜日(1997,4,30,水曜). 月末日の曜日(1997,5,31,土曜). 月末日の曜日(1997,6,30,月曜). 月末日の曜日(1997,7,31,木曜). 月末日の曜日(1997,8,31,日曜). 月末日の曜日(1997,9,30,火曜). 月末日の曜日(1997,10,31,金曜). 月末日の曜日(1997,11,30,日曜). 月末日の曜日(1997,12,31,水曜). 月末日の曜日(1998,1,31,土曜). 月末日の曜日(1998,2,28,土曜). 月末日の曜日(1998,3,31,火曜). 月末日の曜日(1998,4,30,木曜). 月末日の曜日(1998,5,31,日曜). 月末日の曜日(1998,6,30,火曜). 月末日の曜日(1998,7,31,金曜). 月末日の曜日(1998,8,31,月曜). 月末日の曜日(1998,9,30,水曜). 月末日の曜日(1998,10,31,土曜). 月末日の曜日(1998,11,30,月曜). 月末日の曜日(1998,12,31,木曜). 月末日の曜日(1999,1,31,日曜). 月末日の曜日(1999,2,28,日曜). 月末日の曜日(1999,3,31,水曜). 月末日の曜日(1999,4,30,金曜). 月末日の曜日(1999,5,31,月曜). 月末日の曜日(1999,6,30,水曜). 月末日の曜日(1999,7,31,土曜). 月末日の曜日(1999,8,31,火曜). 月末日の曜日(1999,9,30,木曜). 月末日の曜日(1999,10,31,日曜). 月末日の曜日(1999,11,30,火曜). 月末日の曜日(1999,12,31,金曜). 月末日の曜日(2000,1,31,月曜). 月末日の曜日(2000,2,29,火曜). 月末日の曜日(2000,3,31,金曜). 月末日の曜日(2000,4,30,日曜). 月末日の曜日(2000,5,31,水曜). 月末日の曜日(2000,6,30,金曜). 月末日の曜日(2000,7,31,月曜). 月末日の曜日(2000,8,31,木曜). 月末日の曜日(2000,9,30,土曜). 月末日の曜日(2000,10,31,火曜). 月末日の曜日(2000,11,30,木曜). 月末日の曜日(2000,12,31,日曜). 月末日の曜日(2001,1,31,水曜). 月末日の曜日(2001,2,28,水曜). 月末日の曜日(2001,3,31,土曜). 月末日の曜日(2001,4,30,月曜). 月末日の曜日(2001,5,31,木曜). 月末日の曜日(2001,6,30,土曜). 月末日の曜日(2001,7,31,火曜). 月末日の曜日(2001,8,31,金曜). 月末日の曜日(2001,9,30,日曜). 月末日の曜日(2001,10,31,水曜). 月末日の曜日(2001,11,30,金曜). 月末日の曜日(2001,12,31,月曜). 月末日の曜日(2002,1,31,木曜). 月末日の曜日(2002,2,28,木曜). 月末日の曜日(2002,3,31,日曜). 月末日の曜日(2002,4,30,火曜). 月末日の曜日(2002,5,31,金曜). 月末日の曜日(2002,6,30,日曜). 月末日の曜日(2002,7,31,水曜). 月末日の曜日(2002,8,31,土曜). 月末日の曜日(2002,9,30,月曜). 月末日の曜日(2002,10,31,木曜). 月末日の曜日(2002,11,30,土曜). 月末日の曜日(2002,12,31,火曜). 月末日の曜日(2003,1,31,金曜). 月末日の曜日(2003,2,28,金曜). 月末日の曜日(2003,3,31,月曜). 月末日の曜日(2003,4,30,水曜). 月末日の曜日(2003,5,31,土曜). 月末日の曜日(2003,6,30,月曜). 月末日の曜日(2003,7,31,木曜). 月末日の曜日(2003,8,31,日曜). 月末日の曜日(2003,9,30,火曜). 月末日の曜日(2003,10,31,金曜). 月末日の曜日(2003,11,30,日曜). 月末日の曜日(2003,12,31,水曜). 月末日の曜日(2004,1,31,土曜). 月末日の曜日(2004,2,29,日曜). 月末日の曜日(2004,3,31,水曜). 月末日の曜日(2004,4,30,金曜). 月末日の曜日(2004,5,31,月曜). 月末日の曜日(2004,6,30,水曜). 月末日の曜日(2004,7,31,土曜). 月末日の曜日(2004,8,31,火曜). 月末日の曜日(2004,9,30,木曜). 月末日の曜日(2004,10,31,日曜). 月末日の曜日(2004,11,30,火曜). 月末日の曜日(2004,12,31,金曜). 月末日の曜日(2005,1,31,月曜). 月末日の曜日(2005,2,28,月曜). 月末日の曜日(2005,3,31,木曜). 月末日の曜日(2005,4,30,土曜). 月末日の曜日(2005,5,31,火曜). 月末日の曜日(2005,6,30,木曜). 月末日の曜日(2005,7,31,日曜). 月末日の曜日(2005,8,31,水曜). 月末日の曜日(2005,9,30,金曜). 月末日の曜日(2005,10,31,月曜). 月末日の曜日(2005,11,30,水曜). 月末日の曜日(2005,12,31,土曜). 月末日の曜日(2006,1,31,火曜). 月末日の曜日(2006,2,28,火曜). 月末日の曜日(2006,3,31,金曜). 月末日の曜日(2006,4,30,日曜). 月末日の曜日(2006,5,31,水曜). 月末日の曜日(2006,6,30,金曜). 月末日の曜日(2006,7,31,月曜). 月末日の曜日(2006,8,31,木曜). 月末日の曜日(2006,9,30,土曜). 月末日の曜日(2006,10,31,火曜). 月末日の曜日(2006,11,30,木曜). 月末日の曜日(2006,12,31,日曜). 月末日の曜日(2007,1,31,水曜). 月末日の曜日(2007,2,28,水曜). 月末日の曜日(2007,3,31,土曜). 月末日の曜日(2007,4,30,月曜). 月末日の曜日(2007,5,31,木曜). 月末日の曜日(2007,6,30,土曜). 月末日の曜日(2007,7,31,火曜). 月末日の曜日(2007,8,31,金曜). 月末日の曜日(2007,9,30,日曜). 月末日の曜日(2007,10,31,水曜). 月末日の曜日(2007,11,30,金曜). 月末日の曜日(2007,12,31,月曜). 月末日の曜日(2008,1,31,木曜). 月末日の曜日(2008,2,29,金曜). 月末日の曜日(2008,3,31,月曜). 月末日の曜日(2008,4,30,水曜). 月末日の曜日(2008,5,31,土曜). 月末日の曜日(2008,6,30,月曜). 月末日の曜日(2008,7,31,木曜). 月末日の曜日(2008,8,31,日曜). 月末日の曜日(2008,9,30,火曜). 月末日の曜日(2008,10,31,金曜). 月末日の曜日(2008,11,30,日曜). 月末日の曜日(2008,12,31,水曜). 月末日の曜日(2009,1,31,土曜). 月末日の曜日(2009,2,28,土曜). 月末日の曜日(2009,3,31,火曜). 月末日の曜日(2009,4,30,木曜). 月末日の曜日(2009,5,31,日曜). 月末日の曜日(2009,6,30,火曜). 月末日の曜日(2009,7,31,金曜). 月末日の曜日(2009,8,31,月曜). 月末日の曜日(2009,9,30,水曜). 月末日の曜日(2009,10,31,土曜). 月末日の曜日(2009,11,30,月曜). 月末日の曜日(2009,12,31,木曜). 月末日の曜日(2010,1,31,日曜). 月末日の曜日(2010,2,28,日曜). 月末日の曜日(2010,3,31,水曜). 月末日の曜日(2010,4,30,金曜). 月末日の曜日(2010,5,31,月曜). 月末日の曜日(2010,6,30,水曜). 月末日の曜日(2010,7,31,土曜). 月末日の曜日(2010,8,31,火曜). 月末日の曜日(2010,9,30,木曜). 月末日の曜日(2010,10,31,日曜). 月末日の曜日(2010,11,30,火曜). 月末日の曜日(2010,12,31,金曜). 月末日の曜日(2011,1,31,月曜). 月末日の曜日(2011,2,28,月曜). 月末日の曜日(2011,3,31,木曜). 月末日の曜日(2011,4,30,土曜). 月末日の曜日(2011,5,31,火曜). 月末日の曜日(2011,6,30,木曜). 月末日の曜日(2011,7,31,日曜). 月末日の曜日(2011,8,31,水曜). 月末日の曜日(2011,9,30,金曜). 月末日の曜日(2011,10,31,月曜). 月末日の曜日(2011,11,30,水曜). 月末日の曜日(2011,12,31,土曜). 月末日の曜日(2012,1,31,火曜). 月末日の曜日(2012,2,29,水曜). 月末日の曜日(2012,3,31,土曜). 月末日の曜日(2012,4,30,月曜). 月末日の曜日(2012,5,31,木曜). 月末日の曜日(2012,6,30,土曜). 月末日の曜日(2012,7,31,火曜). 月末日の曜日(2012,8,31,金曜). 月末日の曜日(2012,9,30,日曜). 月末日の曜日(2012,10,31,水曜). 月末日の曜日(2012,11,30,金曜). 月末日の曜日(2012,12,31,月曜). 月末日の曜日(2013,1,31,木曜). 月末日の曜日(2013,2,28,木曜). 月末日の曜日(2013,3,31,日曜). 月末日の曜日(2013,4,30,火曜). 月末日の曜日(2013,5,31,金曜). 月末日の曜日(2013,6,30,日曜). 月末日の曜日(2013,7,31,水曜). 月末日の曜日(2013,8,31,土曜). 月末日の曜日(2013,9,30,月曜). 月末日の曜日(2013,10,31,木曜). 月末日の曜日(2013,11,30,土曜). 月末日の曜日(2013,12,31,火曜). 月末日の曜日(2014,1,31,金曜). 月末日の曜日(2014,2,28,金曜). 月末日の曜日(2014,3,31,月曜). 月末日の曜日(2014,4,30,水曜). 月末日の曜日(2014,5,31,土曜). 月末日の曜日(2014,6,30,月曜). 月末日の曜日(2014,7,31,木曜). 月末日の曜日(2014,8,31,日曜). 月末日の曜日(2014,9,30,火曜). 月末日の曜日(2014,10,31,金曜). 月末日の曜日(2014,11,30,日曜). 月末日の曜日(2014,12,31,水曜). 月末日の曜日(2015,1,31,土曜). 月末日の曜日(2015,2,28,土曜). 月末日の曜日(2015,3,31,火曜). 月末日の曜日(2015,4,30,木曜). 月末日の曜日(2015,5,31,日曜). 月末日の曜日(2015,6,30,火曜). 月末日の曜日(2015,7,31,金曜). 月末日の曜日(2015,8,31,月曜). 月末日の曜日(2015,9,30,水曜). 月末日の曜日(2015,10,31,土曜). 月末日の曜日(2015,11,30,月曜). 月末日の曜日(2015,12,31,木曜). 月末日の曜日(2016,1,31,日曜). 月末日の曜日(2016,2,29,月曜). 月末日の曜日(2016,3,31,木曜). 月末日の曜日(2016,4,30,土曜). 月末日の曜日(2016,5,31,火曜). 月末日の曜日(2016,6,30,木曜). 月末日の曜日(2016,7,31,日曜). 月末日の曜日(2016,8,31,水曜). 月末日の曜日(2016,9,30,金曜). 月末日の曜日(2016,10,31,月曜). 月末日の曜日(2016,11,30,水曜). 月末日の曜日(2016,12,31,土曜). 月末日の曜日(2017,1,31,火曜). 月末日の曜日(2017,2,28,火曜). 月末日の曜日(2017,3,31,金曜). 月末日の曜日(2017,4,30,日曜). 月末日の曜日(2017,5,31,水曜). 月末日の曜日(2017,6,30,金曜). 月末日の曜日(2017,7,31,月曜). 月末日の曜日(2017,8,31,木曜). 月末日の曜日(2017,9,30,土曜). 月末日の曜日(2017,10,31,火曜). 月末日の曜日(2017,11,30,木曜). 月末日の曜日(2017,12,31,日曜). 月末日の曜日(2018,1,31,水曜). 月末日の曜日(2018,2,28,水曜). 月末日の曜日(2018,3,31,土曜). 月末日の曜日(2018,4,30,月曜). 月末日の曜日(2018,5,31,木曜). 月末日の曜日(2018,6,30,土曜). 月末日の曜日(2018,7,31,火曜). 月末日の曜日(2018,8,31,金曜). 月末日の曜日(2018,9,30,日曜). 月末日の曜日(2018,10,31,水曜). 月末日の曜日(2018,11,30,金曜). 月末日の曜日(2018,12,31,月曜). 月末日の曜日(2019,1,31,木曜). 月末日の曜日(2019,2,28,木曜). 月末日の曜日(2019,3,31,日曜). 月末日の曜日(2019,4,30,火曜). 月末日の曜日(2019,5,31,金曜). 月末日の曜日(2019,6,30,日曜). 月末日の曜日(2019,7,31,水曜). 月末日の曜日(2019,8,31,土曜). 月末日の曜日(2019,9,30,月曜). 月末日の曜日(2019,10,31,木曜). 月末日の曜日(2019,11,30,土曜). 月末日の曜日(2019,12,31,火曜). 月末日の曜日(2020,1,31,金曜). 月末日の曜日(2020,2,29,土曜). 月末日の曜日(2020,3,31,火曜). 月末日の曜日(2020,4,30,木曜). 月末日の曜日(2020,5,31,日曜). 月末日の曜日(2020,6,30,火曜). 月末日の曜日(2020,7,31,金曜). 月末日の曜日(2020,8,31,月曜). 月末日の曜日(2020,9,30,水曜). 月末日の曜日(2020,10,31,土曜). 月末日の曜日(2020,11,30,月曜). 月末日の曜日(2020,12,31,木曜). % 以下のサイトは % % 年、月が与えられた時、日曜日から始まるカレンダーを表示する。 % 日曜起点カレンダー(_年,_月) :- 月末日(_年,_月,_月末日), 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,1,_曜日を表す値,_曜日), 日曜起点カレンダー(_曜日,_月末日,_カレンダー), カレンダー表示(_カレンダー). 日曜起点カレンダー(_一日の曜日,_月末日,_カレンダー) :- findall(_日,between(1,_月末日,_日),_日付ならび), 第一週の整形(_一日の曜日,_日付ならび,_第一週,_第二週以後), 最終週の整形(_第二週以後,_最終週を整形された第二週以後), _カレンダー = [_第一週|_最終週を整形された第二週以後]. 第一週の整形(日曜,[_1,_2,_3,_4,_5,_6,_7|R],[_1,_2,_3,_4,_5,_6,_7],R). 第一週の整形(月曜,[_1,_2,_3,_4,_5,_6|R],[_,_1,_2,_3,_4,_5,_6],R). 第一週の整形(火曜,[_1,_2,_3,_4,_5|R],[_,_,_1,_2,_3,_4,_5],R). 第一週の整形(水曜,[_1,_2,_3,_4|R],[_,_,_,_1,_2,_3,_4],R). 第一週の整形(木曜,[_1,_2,_3|R],[_,_,_,_,_1,_2,_3],R). 第一週の整形(金曜,[_1,_2|R],[_,_,_,_,_,_1,_2],R). 第一週の整形(土曜,[_1|R],[_,_,_,_,_,_,_1],R). 最終週の整形([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- 最終週の整形(R1,R2),!. 最終週の整形([],[]) :- !. 最終週の整形(L1,[L2]) :- length(L2,7), append(L1,_,L2). 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, 'Zellerの公式'(_年,_月,_日,_曜日を表す値), 'Zellerの公式で曜日を表す値と曜日'(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 'Zellerの公式'(_年,_月,_日,_曜日を表す値) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7. 'Zellerの公式で曜日を表す値と曜日'(0,日曜). 'Zellerの公式で曜日を表す値と曜日'(1,月曜). 'Zellerの公式で曜日を表す値と曜日'(2,火曜). 'Zellerの公式で曜日を表す値と曜日'(3,水曜). 'Zellerの公式で曜日を表す値と曜日'(4,木曜). 'Zellerの公式で曜日を表す値と曜日'(5,金曜). 'Zellerの公式で曜日を表す値と曜日'(6,土曜). 月末日(_年,2,29) :- うるう年(_年),!. 月末日(_年,2,28) :- !. 月末日(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). 月末日(_,_月,30) :- member(_月,[4,6,9,11]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. カレンダー表示([]). カレンダー表示([_週|R]) :- カレンダー週表示(_週), カレンダー表示(R). カレンダー週表示([]) :- write('\n'). カレンダー週表示([A|R]) :- 表示項(A,_表示項), writef('%3R',[_表示項]), カレンダー週表示(R). 表示項(' ',' ') :- !. 表示項(N,N). % 以下のサイトは 日曜起点カレンダー(_一日の曜日,_末日整数,_カレンダー) :- findall(_日,between(1,_末日整数,_日),_日付ならび), 第一週の整形(_一日の曜日,_日付ならび,_第一週,_第二週以後), 最終週の整形(_第二週以後,_最終週を整形された第二週以後), _カレンダー = [_第一週|_最終週を整形された第二週以後]. 第一週の整形(日曜,[_1,_2,_3,_4,_5,_6,_7|R],[_1,_2,_3,_4,_5,_6,_7],R). 第一週の整形(月曜,[_1,_2,_3,_4,_5,_6|R],[_,_1,_2,_3,_4,_5,_6],R). 第一週の整形(火曜,[_1,_2,_3,_4,_5|R],[_,_,_1,_2,_3,_4,_5],R). 第一週の整形(水曜,[_1,_2,_3,_4|R],[_,_,_,_1,_2,_3,_4],R). 第一週の整形(木曜,[_1,_2,_3|R],[_,_,_,_,_1,_2,_3],R). 第一週の整形(金曜,[_1,_2|R],[_,_,_,_,_,_1,_2],R). 第一週の整形(土曜,[_1|R],[_,_,_,_,_,_,_1],R). 最終週の整形([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- 最終週の整形(R1,R2),!. 最終週の整形(L1,[L2]) :- length(L2,7), append(L1,_,L2). % 以下のサイトは # 出題場所 :: 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,_度数). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/89 # 0と1のみでランダムに生成した文字列Sがある # 長さは2<=S<=1000である # 11001010110100011001011011111111111111000000000010111000000 # # 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX # 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN # としたときのMXとMNを求めよ # 見当たらない場合はFALSEを出力しろ # # S=110001010100 # MX=3 (000が一番長い) # MN=2 (11または00が二番目に長い) # # S=111111 # MX=3 (111111が一番長い) # MN=FALSE (2番目に短いものが存在しない) # # S=10 # MX=FALSE (1番長いのが存在しない) # MX=FALSE (2番目に短いものが存在しない) # # '0と1のみでランダムに生成した文字列Sがある 長さは2<=S<=1000である 11001010110100011001011011111111111111000000000010111000000 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ' :- '0と1のみでランダムに生成した文字列Sがある'(_文字列), forall('同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ'(_文字列,_最長文字列,_短い方から二番目の文字列), write('S=%t\nMX=%t,MN=%t\n',[_文字列,_最長文字列,_短い方から二番目の文字列])),!. '0と1のみでランダムに生成した文字列Sがある 長さは2<=S<=1000である 11001010110100011001011011111111111111000000000010111000000 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ' :- write('FALSE\n'). '0と1のみでランダムに生成した文字列Sがある'(_文字列) :- R is random(999) + 2, findall(_0または1,( between(2,R,_), _0または1 is random(3341) mod 2), _0または1ならび), atomic_list_concat(_0または1ならび,_文字列). '同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ'(_文字列,_最長文字列,_短い方から二番目の文字列) :- 連続した文字列と文字数ならびを得る(_文字列,_連続した文字列と文字数ならび), 最長文字列と短い方から二番目の文字列(_連続した文字列と文字数ならび,_最長文字列,_短い方から二番目の文字列). 連続した文字列と文字数ならびを得る(_文字列,_連続した文字列と文字数ならび) :- findall([_連続した文字列,_文字数],( 連続した文字列と文字数(_文字列,_連続した文字列,_文字数)), _連続した文字列_文字数ならび). 連続した文字列と文字数(_文字列,_連続した文字列,_文字数) :- '0の連続したの文字列'(_文字列,_連続した文字列,_文字数). 連続した文字列と文字数(_文字列,_連続した文字列,_文字数) :- '1の連続したの文字列と文字数'(_文字列,_連続した文字列,_文字数). '0の連続したの文字列'(_文字列,_連続した文字列,_文字数) :- sub_atom(_文字列,_開始点,_文字数,_残り文字数,_連続した文字列), 前後に0の文字がない(_文字列,_開始点,_文字数,_残り文字数), forall(sub_atom(_連続した文字列,_,1,_,_文字),_文字='0'). '1の連続したの文字列'(_文字列,_連続した文字列,_文字数) :- sub_atom(_文字列,_開始点,_文字数,_残り文字数,_連続した文字列), 前後に0の文字がない(_文字列,_開始点,_文字数,_残り文字数), forall(sub_atom(_連続した文字列,_,1,_,_文字),_文字='1'). 前後に0の文字がない(_文字列,_開始点,_文字数) :- succ(_開始点_1,_開始点), _開始点_2 is _開始点 + _文字数, \+(sub_atom(_文字列,_開始点_1,1,_,'0')), \+(sub_atom(_文字列,_開始点_2,1,_,'0')). 前後に1の文字がない(_文字列,_開始点,_文字数) :- succ(_開始点_1,_開始点), _開始点_2 is _開始点 + _文字数, \+(sub_atom(_文字列,_開始点_1,1,_,'1')), \+(sub_atom(_文字列,_開始点_2,1,_,'1')). 最長文字列と短い方から二番目の文字列(_連続した文字列と文字数ならび,_最長文字列,_短い方から二番目の文字列) :- 最長文字数と短い方から二番目に短い文字数(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数), 最長文字数と短い方から二番目に短い文字列(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数,_最長文字列,_短い方から二番目に短い文字列). 最長文字数と短い方から二番目に短い文字数(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数) :- 文字列長ならび(_連続した文字列と文字数ならび,_文字列長ならび), sort(_文字列長ならび,_整列した文字列長ならび), nth1(2,_整列した文字列長ならび,_短い方から二番目に短い文字数), append(_,[_最長文字数],_整列した文字列長ならび). 文字数ならび(_連続した文字列と文字数ならび,_文字数ならび) :- findall(_文字数,( member([_,_文字数],_連続した文字列と文字列数ならび)), _文字数ならび). 最長文字数と短い方から二番目に短い文字列(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数,_最長文字列,_短い方から二番目に短い文字列) :- member([_最長文字列,_最長文字数],_連続した文字列と文字数ならび), member([_短い方から二番目に短い文字列,_短い方から二番目に短い文字数],_連続した文字列と文字数ならび). % 以下のサイトは # プログラミングのお題スレ Part5 #27 # # nこの角砂糖でできる直方体は何種類あるか? # 'nこの角砂糖でできる直方体は何種類あるか?'(_n,_何種類) :- 'nこの角砂糖でできる直方体は'(_n,_直方体ならび), length(_直方体ならび,_何種類). 'nこの角砂糖でできる直方体は'(_n,_直方体ならび) :- findall(M,between(1,_n,M),L), findall([_辺1,_辺2,_辺3],( 直方体(L,_n,_辺1,_辺2,_辺3)),_直方体ならび). 直方体(L,_n,_辺1,_辺2,_辺3) :- '_辺1,_辺2,_辺3を選択'(L,_辺1,_辺2,_辺3), '_辺1,_辺2,_辺3は昇順'(_辺1,_辺2,_辺3), _n is _辺1 * _辺2 + _辺3. '_辺1,_辺2,_辺3を選択'(L,_辺1,_辺2,_辺3) :- select(_辺1,L,R1), select(_辺2,L,R2), select(_辺3,L,R3). '_辺1,_辺2,_辺3は昇順'(_辺1,_辺2,_辺3) :- _辺1 =< _辺2, _辺2 =< _辺3. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/18 # 優先順位が文脈として矛盾・混乱しているようだ、優先度の高い順に # # 5で割り切れる場合は何も出力するな # 出力ごとに改行も入れろ # 4と6で割り切れる場合はFizzBuzzを出力しろ # 4で割り切れる場合はFizzを出力しろ # 6で割り切れる場合はBuzzを出力しろ # それ以外は数字を出力しろ # # ということか? # '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを' :- between(1,100,_数字), '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを出力しろ それ以外は数字を出力しろ'(_数字), _数字 = 100. '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを出力しろ それ以外は数字を出力しろ'(_数字) :- '5で割り切れた時は何も出力するな'(_数字,_表示), '5では割り切れず、Fizz、Buzz、またはFizzBuzzを表示するのは4または6で割り切れる時'(_数字,_表示), 'それ以外は数字を'(_数字,_表示), '出力しろ(出力ごとに改行も入れろ)'(_表示). '5で割り切れた時は何も出力するな'(_数字,'') :- '5で割り切れた'(_数字),!. '5で割り切れた時は何も出力するな'(_,_). '5では割り切れず、Fizz、Buzz、またはFizzBuzzを表示するのは4または6で割り切れる時'(_数字,_表示) :- '5では割り切れず、4と6で割り切れる場合はFizzBuzzを'(_数字,_表示),!. '5では割り切れず、Fizz、Buzz、またはFizzBuzzを表示するのは4または6で割り切れる時'(_数字,_表示) :- '5では割り切れず、4で割り切れる場合はFizzを'(_数字,_表示),!. '5では割り切れず、Fizz、Buzz、またはFizzBuzzを表示するのは4または6で割り切れる時'(_数字,_表示) :- '5では割り切れず、6で割り切れる場合はBuzzを'(_数字,_表示),!. '5では割り切れず、Fizz、Buzz、またはFizzBuzzを表示するのは4または6で割り切れる時'(_,_). '5では割り切れず、4と6で割り切れる場合はFizzBuzzを'(_数字,'FizzBuzz') :- '5では割り切れず'(_数字), '4と6で割り切れる'(_数字),!. '5では割り切れず、4で割り切れる場合はFizzを'(_数字,'Fizz') :- '5では割り切れず、4で割り切れる'(_数字). '5では割り切れず、6で割り切れる場合はBuzzを'(_数字,'Buzz') :- '5では割り切れず、6で割り切れる'(_数字). '5では割り切れず、4で割り切れる'(_数字) :- '5では割り切れず'(_数字), '4で割り切れる'(_数字), \+('6で割り切れる'(_数字)). '5では割り切れず、6で割り切れる'(_数字) :- '5では割り切れず'(_数字), '6で割り切れる'(_数字), \+('4で割り切れる'(_数字)). '5で割り切れた'(_数字) :- 0 is _数字 mod 5. '5では割り切れず'(_数字) :- \+(0 is _数字 mod 5). '4と6で割り切れる'(_数字) :- '4で割り切れる'(_数字), '6で割り切れる'(_数字). '4で割り切れる'(_数字) :- 0 is _数字 mod 4. '6で割り切れる'(_数字) :- 0 is _数字 mod 6. 'それ以外は数字を'(_数字,V) :- var(V), _数字=V,!. 'それ以外は数字を'(_,_). '出力しろ(出力ごとに改行も入れろ)'('') :- !. '出力しろ(出力ごとに改行も入れろ)'(_表示) :- writef('%t\n',[_表示]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/884 # 最小値Nから最大値Mまでの約数の総和を出力せよ # # 最小値Nから最大値Mまでの約数の総和を出力せよ(N,M) :- 最小値Nから最大値Mまでの約数の総和を(N,M,_最小値Nから最大値Mまでの約数の総和), 出力せよ(_最小値Nから最大値Mまでの約数の総和). 最小値Nから最大値Mまでの約数の総和を(N,M,_最小値Nから最大値Mまでの約数の総和) :- 総和を(_約数,( 最小値Nから最大値Mまでの(N,M,_整数), 約数の(_整数,_約数)),_最小値Nから最大値Mまでの約数の総和). 最小値Nから最大値Mまでの(N,M,_整数) :- between(N,M,_整数). 約数の(_整数,_約数) :- between(1,_整数,_約数), 0 is _整数 mod _約数. 総和を(A,B,C) :- findsum(A,B,C). 出力せよ(_約数の総和) :- writef('%t\n',[_約数の総和]). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/884 # 最小値Nから最大値Mまでの約数の総和を出力せよ # # 最小値Nから最大値Mまでの約数の総和を出力せよ(N,M) :- 最小値Nから最大値Mまでの約数の総和を(N,M,_約数の総和), 出力せよ(_約数の総和). 最小値Nから最大値Mまでの約数の総和を(N,M,_約数の総和) :- 最小値Nから最大値Mまでの約数の(N,M,_約数の), 総和を(_約数の,_約数の総和). 最小値Nから最大値Mまでの約数の(N,M,_約数の) :- findall(_約数,最小値Nから最大値Mまでの約数(N,M,_約数),_約数の). 最小値Nから最大値Mまでの約数(N,M,_約数) :- 最小値Nから最大値Mまでの(N,M,_整数), 約数(_整数,_約数). 最小値Nから最大値Mまでの(N,M,_整数) :- between(N,M,_整数). 約数(_整数,_約数) :- between(1,_整数,_約数), 0 is _整数 mod _約数. 総和を(_約数の,_約数の総和) :- sum_list(_約数の,_約数の総和). 出力せよ(_約数の総和) :- writef('%t\n',[_約数の総和]). % 以下のサイトは # 問題文 # 高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k−1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 # # 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べたいと思いました。 # # 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # N # A1 # A2 # : # AN # 1 行目には、硬貨の種類数 N(1≦N≦50) が、1 行で与えられる。 # 2 行目から N 行では、高橋君が各硬貨を何枚持っているかが与えられる。 このうち i(1≦i≦N) 行目では、 i 番目の硬貨を、高橋君が何枚持っているかを表す整数 Ai(0≦Ai≦50000)が与えられる。 # 出力 # 高橋君が払える金額の種類数を、 1000000007 で割った余りを 1 行で出力せよ。出力の末尾は改行をいれること。 # # 入力例1 # 2 # 2 # 1 # 出力例1 # 5 # 払える金額は、1 円, 2 円, 10 円, 11 円, 12 円の 5 通りとなります。 # # 0 円は含まないことに注意してください。 # # 入力例2 # 2 # 32 # 3 # 出力例2 # 62 # 1 円から 62 円の 62 通りの金額を支払うことが出来ます。 # # 入力例3 # 4 # 12 # 3 # 7 # 34 # 出力例3 # 12039 # 入力例4 # 10 # 1234 # 2 # 857 # 3858 # 1 # 5000 # 32 # 4 # 1 # 857 # 出力例4 # 969347336 # 1000000007 で割った余りを出力してください。 # '高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k‐1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べた いと思いました。 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるた め、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。' :- 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_種類別枚数ならび), 最大何通り(_種類別枚数ならび,_最大何通り), 最大可能性から重複を差し引く(_種類別枚数ならび,_最大何通り,_何通り), '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り). 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび) :- 標準入力から整数を得る(_何種類), findall([M,_整数],( between(1,_何種類,N), succ(M,N), 標準入力から整数を得る(_整数)), _枚数ならび). 最大何通り(_種類別枚数ならび,_最大何通り) :- 最大何通り(_種類別枚数ならび,1,_最大何通り). 最大何通り([],_最大何通り,_最大何通り). 最大何通り([[_,0]|R]],_最大何通り,_最大何通り) :- 最大何通り(R,_最大何通り,_最大何通り),!. 最大何通り([[A,B]|R],N,_最大何通り) :- N_2 is B * N, 最大何通り(R,N_2,_最大何通り). 最大可能性から重複を差し引く(_種類別枚数ならび,_最大何通り,_何通り) :- findsum(_差し引き数,( append(L1,[[_種類,_枚数]|L2],_種類別枚数ならび), 差し引き数(_種類,_枚数,L1,_差し引き数)), _重複差し引き数), _何通り is _最大何通り - _重複差し引き数. 差し引き数(_種類_1,_枚数_1,L1,_差し引き数)) :- findsum(_差し引き数_3,( member([_種類,_枚数],L1), _差し引き数_1 is _枚数_1 // (_種類_1 // _種類), _差し引き数_2 is _枚数 // (_種類_1 // _種類), 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_3)), _差し引き数). 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_1) :- _差し引き数_1 =< _差し引き数_2,!. 差し引き数選択(_差し引き数_1,_差し引き数_2,_差し引き数_2). '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り),!. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- writef('%t何通り\n',[_何通り]). '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り) :- _何通り >= 1000000007, _何通りを1000000007で割った余り is _何通り mod 1000000007, writef('%t何通り\n',[_何通りを1000000007で割った余り]). 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 問題文 # 高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k−1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 # # 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べたいと思いました。 # # 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # N # A1 # A2 # : # AN # 1 行目には、硬貨の種類数 N(1≦N≦50) が、1 行で与えられる。 # 2 行目から N 行では、高橋君が各硬貨を何枚持っているかが与えられる。 このうち i(1≦i≦N) 行目では、 i 番目の硬貨を、高橋君が何枚持っているかを表す整数 Ai(0≦Ai≦50000)が与えられる。 # 出力 # 高橋君が払える金額の種類数を、 1000000007 で割った余りを 1 行で出力せよ。出力の末尾は改行をいれること。 # # 入力例1 # 2 # 2 # 1 # 出力例1 # 5 # 払える金額は、1 円, 2 円, 10 円, 11 円, 12 円の 5 通りとなります。 # # 0 円は含まないことに注意してください。 # # 入力例2 # 2 # 32 # 3 # 出力例2 # 62 # 1 円から 62 円の 62 通りの金額を支払うことが出来ます。 # # 入力例3 # 4 # 12 # 3 # 7 # 34 # 出力例3 # 12039 # 入力例4 # 10 # 1234 # 2 # 857 # 3858 # 1 # 5000 # 32 # 4 # 1 # 857 # 出力例4 # 969347336 # 1000000007 で割った余りを出力してください。 # '高橋君の国では、N 種類の硬貨が使われています。 1 番目の硬貨の価値は 1 円です。 k 番目の硬貨の価値は、k‐1 番目の硬貨の 10 倍あります。 つまり、2 番目の硬貨は 10 円の価値があり、5 番目の硬貨は 10000 円の価値があります。 高橋君は、お釣りが嫌いです。なので、出来るだけぴったりの金額で買い物がしたいと思っています。 そこで高橋君は、今持っている硬貨で、何種類の金額が払えるかを調べた いと思いました。 高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるた め、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。' :- 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび), 硬貨の合計金額種類(_枚数ならび,_何通り), '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_何通り). 何種類かとそれぞれの硬貨の枚数を得る(_何種類,_枚数ならび) :- 標準入力から整数を得る(_何種類), findall(_整数,( between(1,_何種類,_), 標準入力から整数を得る(_整数)), _枚数ならび). 硬貨の合計金額種類(_枚数ならび,_何通り) :- findall(_合計金額,合計金額(0,_枚数ならび,0,_合計金額),L1), sort(L1,L2), length(L2,_何通り). 合計金額(N,[],_合計金額,_合計金額). 合計金額(N,[_枚数|R],_合計金額_1,_合計金額) :- '1から枚数分を増やして合計金額を非決定性に計算していく'(N,_枚数,_ご金額金額_1,_合計金額_2), succ(N,N_2), 合計金額(N_2,R,_合計金額_2,_合計金額). '1から枚数分を増やして合計金額を非決定的に計算していく'(N,_枚数,_合計金額_1,_合計金額_2) :- between(1,_枚数,M), _合計金額_2 is _合計金額_1 + 10 ^ N * M. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類),!. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- writef('%t種類\n',[_種類]). '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- _種類 >= 1000000007, _種類を1000000007で割った余り is _種類 mod 1000000007, writef('%t種類\n',[_種類を1000000007で割った余り]). 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 問題文 # (21:13 追記) |A|=|B|=1のケースがテスト中に一つ含まれていましたので、リジャッジを行います。なお、このケースでNOを出力するプログラムに影響はありません。 # # 文字列 A の文字をちょうど 3 回スワップすることにより、文字列 B に変換できるとき、二つの文字列 A, B を、仲良し文字列と呼ぶことにします。 # # スワップとは、文字列に含まれる 2 つの文字を、入れ替えることを指します。 例えば、abcという文字列であれば、aとcを入れ替えて、cbaのように変換することが出来ます。 # # aaのような文字列に対し、 1 文字目のaと、 2 文字目のaを入れ替えることは許されていますが、同じ場所の文字を指定することはできません。 # # 文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # B # 1 行目には、文字列 A(2≦|A|≦1000) が与えられる。 # 2 行目には、文字列 B(|B|=|A|) が与えられる。 # A, B 共に、小文字アルファベットのみで構成されていることが保障されている。 # 出力 # 与えられた 2 つの文字列が、仲良し文字列であればYES、そうでなければNOを出力せよ。 出力の末尾には改行をいれること。 # # 入力例1 # abcdef # fedcba # 出力例1 # YES # まず、文字列 A のabcdefのaとfをスワップし、fbcdeaとします。 # # 次に、bとeをスワップし、fecdbaとします。 # # 最後に、cとdをスワップし、fedcbaとすると、文字列 B と一致します。 # # よって、この 2 つの文字列は、仲良し文字列となるため、YESと出力します。 # # 入力例2 # abababab # babababa # 出力例2 # NO # 使っている文字数が同じでも、 3 回のスワップでは同じ文字列にできないパターンも存在します。 # # 入力例3 # nt # nt # 出力例3 # NO # スワップの仕方が 1 通りしかなく、 3 回のスワップを繰り返すと、tnになってしまいます。 よって、同じ 2 つの文字列ですが、仲良し文字列ではありません。 # # 入力例4 # pqqq # pqqq # 出力例4 # YES # まず、 1 番目の文字と 2 番目の文字を入れ替え、qpqqとします。 次に、 3 番目の文字と 4 番目の文字を入れ替え、qpqqとします。この際、同じ文字を選んでいますが、場所が違うので問題ありません。 最後に、1番目の文字と、2番目の文字を入れ替え、pqqqとします。 # # 入力例5 # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyzw # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz # 出力例5 # YES # 長い文字列が与えらえれることがあることにも注意してください。 # # 入力例6 # abcdef # ghijkl # 出力例6 # NO '文字列 A(2≦|A|≦100))、B(|B|=|A|) が与えられるので、仲良し文字列になっているかどうかを判定しなさい。' :- '文字列 A(2≦|A|≦100)'(_A), '文字列 B(|B|=|A|)'(_A,_B), 文字列と仲良し文字列(_A,_B). '文字列 A(2≦|A|≦100)'(_A) :- 行入力(_A), '(2≦|A|≦100)'(_A). 行入力(_行) :- read_line_to_codes(_Codes), atom_codes(_行,_Codes). '(2≦|A|≦100)'(_A) :- atom_length(_A,_長さ), between(2,100,_長さ). '文字列 B(|B|=|A|)'(_A,_B) :- 行入力(_B), '(|B|=|A|)'(_A,_B). '(|B|=|A|)'(_A,_B) :- atom_length(_A,_長さ), atom_length(_B,_長さ). 文字列と仲良し文字列(_文字列,_仲良し文字列) :- atom_chars(_文字列,L1), 文字列中の文字の三回スワップ(L1,[],L2), atom_chars(_仲良し文字列,L2). 文字列中の文字の三回スワップ(X,[_,_,_,_,_,_],X). 文字列中の文字の三回スワップ(L1,_履歴,X) :- スワップ(L1,_履歴,_nth0_1,_nth0_2,L2), 文字列中の文字の三回スワップ(L2,[_nth0_1,_nth0_2|_履歴],X). スワップ(L1,_履歴,_何番目_1,_何番目_2,L2) :- 交換する候補を得る(L1,_履歴,_何番目_1,_何番目_2,A,B), 交換する(L1,_何番目_1,_何番目_2,A,B,L2). 交換する候補を得る(L1,_履歴,_何番目_1,_何番目_2,_交換要素_1,_交換要素_2) :- 'まだ交換していない位置の要素を取り出す'(_何番目_1,L1,_履歴,_交換要素_1), 'まだ交換していない位置の要素を取り出す'(_何番目_2,L1,[_何番目_1|_履歴],_交換要素_2). 'まだ交換していない位置の要素を取り出す'(_何番目,L,_履歴,_交換要素) :- nth1(_何番目,L,_交換要素), \+(member(_何番目,_履歴)). 交換する(L1,_何番目_1,_何番目_2,A,B,L2) :- 'L2を生成する'(L1,L2), '交換する値をL2に埋める'(_何番目_1,_何番目_2,A,B,L2), 変数として残った要素を埋める(L1,L2). 'L2を生成する'(L1,L2) :- length(L1,Len), length(L2,Len). '交換する値をL2に埋める'(_何番目_1,_何番目_2,A,B,L2) :- nth1(_何番目_1,L2,B), nth1(_何番目_2,L2,A). 変数として残った要素を埋める([],[]). 変数として残った要素を埋める([A|R1],[A|R2]) :- 変数として残った要素を埋める(R1,R2),!. 変数として残った要素を埋める([_|R1],[A|R2]) :- 変数として残った要素を埋める(R1,R2). % 以下のサイトは # サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 # # 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 # # この対面にある、底面に書かれた数字を出力してください。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # 1 行目には、サイコロの上の面に書かれている数字を表す 1 つの整数 A(1≦A≦6) が与えられる。 # 出力 # サイコロの底の面に書かれている数字を 1 行で出力せよ。出力の末尾には改行をいれること。 # # 入力例1 # 6 # 出力例1 # 1 # 6 の裏に書かれている数字は 1 です。 # # 入力例2 # 3 # 出力例2 # 4 # :- dynamic(対面にある数字/2). 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 この対面にある、底面に書かれた数字を出力してください。' :- 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。', '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A), 'この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字), 出力してください(_対面にある底面に書かれた数字). 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。' :- ' 1 から 6 までの数字が一つずつ書かれており、'(_1から6までの数字), 対面の和が 7 になるように作られています。'(_1から6までの数字). ' 1 から 6 までの数字が一つずつ書かれており、'(_1から6までの数字) :- between(1,6,_1から6までの数字). '対面の和が 7 になるように作られています。'(_1から6までの数字) :- '対面の和が 7 に'(_1から6までの数字,_対面にある数字), 'なるように作られています。'(_1から6までの数字,_対面にある数字). '対面の和が 7 に'(_1から6までの数字,_対面にある数字) :- length(L1,_1から6までの数字), length(_対面の和を表すならび,7), append(L1,L2,_対面の和を表すならび), length(L2,_対面にある数字). 'なるように作られています。'(_1から6までの数字,_対面にある数字) :- assertz(対面にある数字(_1から6までの数字,_対面にある数字)). '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A) :- 標準入力から整数を得る(_A). 'この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字) :- 対面にある数字(_A,_対面にある底面に書かれた数字). 出力してください(_対面にある底面に書かれた数字) :- writef('%t\n',[_対面にある底面に書かれた数字]). 標準入力から整数を得る(_A) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # 問題文 # 天下一王国では整数は辞書順比較で表します。入国したばかりのダイキ君はとりあえず 1000 までの整数を書き出すことにしました。 # # 1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力してください。 # # 辞書順比較について # 文字列 A に対して、 Ai で i 番目の文字を表し、 |A| で文字列 A の文字数を表すことにすると、文字列 A と文字列 B を辞書順比較で比較するとは、 # # Ai≠Bi となる最小の i (1?i?min(|A|, |B|))に対して # AiBi であれば、文字列 A は文字列 B より大きい # そのような i が存在しなければ、文字数が少ない方を小さいとする # として文字列 A と文字列 B の大小関係を決めることである。 # # 例えば、 1, 2, 11, 12, 21 を辞書順比較で昇順にソートすると 1, 11, 12, 2, 21 となる。 # # 入力 # この問題では入力は与えられない。 # # # 出力 # 1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力せよ。 # # なお、行の終端には改行が必要である。 '1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力してください。' :- '1 以上 1000 以下のすべての整数を十進数で表した文字列を'(_十進文字列ならび), '辞書順比較で昇順にソートして、'(_十進文字列ならび,_辞書順比較で昇順にソートされた文字列ならび), '1 行ずつ出力してください。'(_辞書順比較で昇順にソートされた文字列ならび). '1 以上 1000 以下のすべての整数を十進数で表した文字列を'(_十進文字列ならび) :- findall(_十進文字列,'1 以上 1000 以下のすべての整数を十進数で表した'(_十進数文字列),_十進文字列ならび). '1 以上 1000 以下のすべての整数を十進数で表した'(_十進数文字列) :- '1 以上 1000 以下のすべての整数を'(_整数), 十進数で表した(_整数,_十進数で表した). '1 以上 1000 以下のすべての整数を'(_整数) :- between(1,1000,_整数). 十進数で表した文字列を(_整数,_十進数で表した文字列) :- number_chars(_整数,Chars), atom_chars(_十進数で表した文字列,Chars). '辞書順比較で昇順にソートして、'([],[]). '辞書順比較で昇順にソートして、'([_軸要素|L1],L2) :- '辞書順比較で軸要素との大小で分割'(_軸要素,L1,L1_1,L1_2), '辞書順比較で昇順にソートして、'(L1_1,L1_1_2), '辞書順比較で昇順にソートして、'(L1_2,L1_2_2), append(L1_1_2,[_軸要素|L1_2_2],L2). '辞書順比較で軸要素との大小で分割'(_,[],[],[]). '辞書順比較で軸要素との大小で分割'(_軸要素,[A|R2],[A|R3],R4) :- '辞書順に小さい'(A,_軸要素),!, '辞書順比較で軸要素との大小で分割'(_軸要素,R2,R3,R4). '辞書順比較で軸要素との大小で分割'(_軸要素,[A|R2],R3,[A|R4]) :- '辞書順比較で軸要素との大小で分割'(_軸要素,R2,R3,R4). '辞書順に小さい'(_文字列_1,_文字列_2) :- '文字列_1に小さい文字が先に出現した'(_文字列_1,_文字列_2),!. '辞書順に小さい'(_文字列_1,_文字列_2) :- 文字列の差分が文字列_2にある(_文字列_1,_文字列_2). '文字列_1に小さい文字が先に出現した'(_文字列_1,_文字列_2) :- 先頭から同一位置の文字を比較して(_文字列_1,_文字列_2,_文字_1,_文字_2), \+(_文字_1 = _文字_2),!, _文字_1 @< _文字_2. 先頭から同一位置の文字を比較して(_文字列_1,_文字列_2,_文字_1,_文字_2) :- sub_atom(_文字列_1,_同一位置,1,_,_文字_1), sub_atom(_文字列_2,_同一位置,1,_,_文字_2). '文字列の差分が文字列_2にある'(_文字列_1,_文字列_2) :- sub_atom(_文字列_2,0,_文字列_1の長さ,_差分文字数,_文字列_1), _差分文字数 > 0. '1 行ずつ出力してください。'(L2) :- forall(member(M,L2),writef('%t\n',[M])). % 以下のサイトは 攪乱順列(_n,_撹乱順列) :- 完全順列(_n,_撹乱順列). 完全順列(_n,_完全順列) :- findall(_m,between(1,_n,_m),L), 完全順列(L,[_],_完全順列). 完全順列([],_,[]). 完全順列(L,Lm,[N|R]) :- select(N,L,L2), \+(length(Lm,N)), 完全順列(L2,[_|Lm],R). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/754 # お題:与えられた文字列を正方形にして出力 # 縦横の字数が等しければ正方形とします # 字数が足りない場合は'*'で埋めること # 余る場合は余計な文字を捨ててかまいません # ただし与えられた字数により近い正方形にすること # 例:http://jump.2ch.net/?ideone.com/mA41q6 # 1, 2=1x1 # 3, 4, 5, 6=2x2 # 7, 8, 9, 10, 11, 12=3x3 # 13, 14, 15, 16=4x4 # 最終行が*だけにならないようにすること。 # '与えられた文字列を正方形にして出力 縦横の字数が等しければ正方形とします 字数が足りない場合は'*'で埋めること 余る場合は余計な文字を捨ててかまいません ただし与えられた字数により近い正方形にすること 例:http://jump.2ch.net/?ideone.com/mA41q6 1, 2=1x1 3, 4, 5, 6=2x2 7, 8, 9, 10, 11, 12=3x3 13, 14, 15, 16=4x4 最終行が*だけにならないようにすること。'(_与えられた文字列,_正方形の文字列) :- 縦横の字数(_与えられた文字列,_縦横の字数), '与えられた文字列を正方形にして出力 縦横の字数が等しければ正方形とします 字数が足りない場合は'*'で埋めること 余る場合は余計な文字を捨ててかまいません'(_与えられた文字列,_縦横の字数,_正方形の文字列). 縦横の字数(_文字列ならび,_縦横の字数) :- sub_atom(_与えられた文字列,0,_文字列の長さ,1,_与えられた文字列), _縦横の字数_1 is floor(sqrt(_文字列の長さ)), _縦横の字数_2 is ceiling(sqrt(_文字列の長さ)), 縦横の字数の選択(_文字列の長さ,_縦横の字数_1,_縦横の字数_2,_縦横の字数). 縦横の字数の選択(_文字列の長さ,_縦横の字数_1,_縦横の字数_2,_縦横の字数_1) :- abs(_縦横の字数_1 ^ 2 - _文字列の長さ) =< abs(_縦横の字数_2 ^ 2 - _文字列の長さ),!. 縦横の字数の選択(_文字列の長さ,_縦横の字数_1,_縦横の字数_2,_縦横の字数_2). '与えられた文字列を正方形にして出力 縦横の字数が等しければ正方形とします 字数が足りない場合は * で埋めること 余る場合は余計な文字を捨ててかまいません'(_文字列,_縦横の字数,_正方形の文字列) :- findall(_行,( sub_atom(_文字列,_変位,_縦横の字数,_残り文字数,_行), 0 is _変位 mod _縦横の字数, (_行=_行_1;_残り文字数 < _縦横の字数,'字数が足りない場合は * で埋めること'(_文字列,_縦横の字数,_残り文字数,_行),!,fail)), _正方形の文字列). '字数が足りない場合は * で埋めること'(_文字列,_縦横の字数,_残り文字数,_行) :- atom_length(_文字列,_文字数), _星の時数 is _縦横の字数 - _残り文字数, 星文字列(_星の字数,_星文字列), sub_atom(_文字列,_,_残り文字数,0,_副文字列), atom_concat(_副文字列,_星文字列,_行). 星文字列(_字数,_星文字列) :- findall(*,between(1,_字数,_),_星ならび), atomic_list_concat(_星ならび,_星文字列). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/861 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # (Run Length圧縮) # 文字列が連続した場合、ある規則で文字を置き換え、 # 文字列を短くすることができます。 # 例えば、AAAAという文字列の場合、@4Aと表現すれば # 1文字分圧縮されます。 # この規則で圧縮された文字列を入力して # もとの文字列に復元して終了するプログラムを # 作成してください。 # ただし、復元した文字列に@文字は出現しないものとします。 # # 原文の文字列は半角の英大文字、英小文字、数字、記号であり100文字以内、連続する文字は9文字以内です。 # # 実行例) # ab@5C1@8050 入力 # abCCCCC10000000050 出力 # @99+1=1@90 入力 # 999999999+1=1000000000 出力 # '文字列が連続した場合、ある規則で文字を置き換え、 文字列を短くすることができます。 例えば、AAAAという文字列の場合、@4Aと表現すれば 1文字分圧縮されます。 この規則で圧縮された文字列を入力して もとの文字列に復元して終了するプログラムを 作成してください。 ただし、復元した文字列に@文字は出現しないものとします。 原文の文字列は半角の英大文字、英小文字、数字、記号であり100文字以内、連続する文字は9文字以内です。 実行例) ab@5C1@8050 入力 abCCCCC10000000050 出力 @99+1=1@90 入力 999999999+1=1000000000 出力' :- '文字列が連続した場合、ある規則で文字を置き換え、 文字列を短くすることができます。 例えば、AAAAという文字列の場合、@4Aと表現すれば 1文字分圧縮されます。 この規則で圧縮された文字列を入力して もとの文字列に復元して終了する'. '文字列が連続した場合、ある規則で文字を置き換え、 文字列を短くすることができます。 例えば、AAAAという文字列の場合、@4Aと表現すれば 1文字分圧縮されます。 この規則で圧縮された文字列を入力して もとの文字列に復元して終了する' :- 圧縮された文字列を入力し(_圧縮された文字列), もとの文字列に復元して(_圧縮された文字列,_復元された文字列), 終了する(_復元された文字列). 圧縮された文字列を入力し(_圧縮された文字列) :- get_line(_圧縮された文字列). もとの文字列に復元して(_圧縮された文字列,_復元された文字列) :- '前文字列、圧縮部の復元された数字列,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部の復元された数字列,_後文字列), もとの文字列に復元して(_後文字列,_復元された文字列_2), atomic_list_concat([_前文字列,_数字列,_復元された文字列_2],_復元された文字列),!. もとの文字列に復元して(_文字列,_文字列). '前文字列、圧縮部の復元された数字列,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部の復元された数字列,_後文字列) :- '前文字列、圧縮部,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部,_後文字列), 圧縮部を復元する(_圧縮部,_圧縮部の復元された数字列). '前文字列、圧縮部,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部,_後文字列) :- sub_atom(_圧縮された文字列,S,3,R,_圧縮部), sub_atom(_圧縮部,0,1,2,'@'), sub_atom(_圧縮された文字列,0,S,_,_前文字列), sub_atom(_圧縮された文字列,_,R,0,_後文字列). 圧縮部を復元する(_圧縮部,_圧縮部の復元された数字列) :- sub_atom(_圧縮部,1,1,_,_繰り返し回数文字), sub_atom(_圧縮部,2,1,_,_繰り返される数文字), atom_numbers(_繰り返し回数文字,[_繰り返し回数]), findall(_繰り返される数字,between(1,_繰り返し回数数,_),_圧縮部の復元された数字列). 終了する(_復元された文字列) :- writef('%t\n',[_復元された文字列]). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #674 # あなた(霧島京子) は20万人月の巨大なプロジェクトを一ヶ月で終わらせるために無数の下請け会社から人員をかき集める仕事をすることになりました。 # プロジェクトを終わらせるのに必要な人員数 m 名 と、発注可能な下請け会社の数 n 社、各下請け会社のアサイン可能なエンジニア人員数 q_i 名 と、発注に必要な費用 r_i 万円が与えられます。 # # 各下請け会社の人員は、一部を使うなどは出来ず全員を使わなくてはいけません。 # プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、最も安くすむ合計金額(単位:万円)を出力してください。 # 各下請け会社の人員数の合計はプロジェクトの規模 m 人月以上になるものとします。 # ヒントを見る # ※ 実際のプロジェクトではこの様には行きませんので、人員を増やす場合は慎重に検討する事をお勧めいたします。 # ※この物語はフィクションであり、実在の人物・団体とは一切関係ありません # # # # 入力される値 # 入力は以下のフォーマットで与えられます。 # # m (プロジェクトに必要な人員数) # n (下請け会社の数) # q_1 r_1 (1番目の下請け会社の人員数 発注に必要な費用[単位:万円]) # q_2 r_2 (2番目の下請け会社の人員数 発注に必要な費用[単位:万円]) # ・・・ # q_i r_i (n 番目の下請け会社の人員数 発注に必要な費用[単位:万円]) # 条件 # 1 ≦ m ≦ 200000(プロジェクトに必要な人数:最大20万人) # 1 ≦ n ≦ 50(下請け会社数:最大50社) # 1 ≦ q_i ≦ 10000(各下請け会社の人員数:最大1万人) # 1 ≦ r_i ≦ 5000000(各下請け会社のへの発注費用[単位:万円]:1万円〜最大500億円) # m ≦ q_1 + q_2 + q_3 ... + q_i(各下請け会社の人員数の合計はプロジェクトに必要な人数 m 人以上になる) # 期待する出力 # 最もコストが安くなる組み合わせの総コストを出力して下さい。 # 最後は改行し、余計な文字、空行を含んではいけません。 # 入力例1 # 60 # 3 # 40 4300 # 30 2300 # 20 2400 # # # 出力例1 # 6600 # 入力例2 # 250 # 5 # 35 3640 # 33 2706 # 98 9810 # 57 5472 # 95 7790 # 出力例2 # 23072 'あなた(霧島京子) は20万人月の巨大なプロジェクトを一ヶ月で終わらせるために 無数の下請け会社から人員をかき集める仕事をすることになりました。 プロジェクトを終わらせるのに必要な人員数 m 名 と、発注可能な下請け会社の数 n 社、 各下請け会社のアサイン可能なエンジニア人員数 q_i 名 と、発注に必要な費用 r_i 万円が与えられます。 各下請け会社の人員は、一部を使うなどは出来ず全員を使わなくてはいけません。 プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を出力してください。 各下請け会社の人員数の合計はプロジェクトの規模 m 人月以上になるものとします。' :- 'プロジェクトを終わらせるのに必要な人員数 m 名 と、発注可能な下請け会社の数 n 社、 各下請け会社のアサイン可能なエンジニア人員数 q_i 名 と、発注に必要な費用 r_i 万円が与えられます。'(_m,_n,_下請け人数_費用ならび), findmin(_合計金額,( 'プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を'(_m,_n,_下請け人数_費用ならび,0,0,_合計人数,_合計金額)),_最も安くすむ合計金額), '出力してください。'(_最も安くすむ合計金額). 'プロジェクトを終わらせるのに必要な人員数 m 名 と、発注可能な下請け会社の数 n 社、 各下請け会社のアサイン可能なエンジニア人員数 q_i 名 と、発注に必要な費用 r_i 万円が与えられます。'(_m,_n,_下請け人数_費用ならび) :- get_split_line([' ',','],[_m,_n]), findall([_下請け人数,_費用],( between(1,_n,_), get_split_line([' ',','],[_下請け人数,_費用])),_下請け人数_費用ならび). 'プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を'(_m,_n,_下請け人数_費用ならび,_合計人数,_合計金額,_合計人数,_合計金額) :- _合計人数 >= _m,!. 'プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を'(_m,_n,_下請け人数_費用ならび,_合計人数_1,_合計金額_1,_合計人数,_合計金額) :- ひとつ下請け人数と費用を取り出す(_下請け人数_費用ならび,_合計人数_1,_合計金額_1,_合計人数_2,_合計金額_2,_残りならび), 'プロジェクトに必要な人員数 m 以上を満たせる組み合わせで、 最も安くすむ合計金額(単位:万円)を'(_m,_n,_残りならび,_合計人数_2,_合計金額_2,_合計人数,_合計金額). ひとつ下請け人数と費用を取り出す(_下請け人数_費用ならび,_合計人数_1,_合計金額_1,_合計人数_2,_合計金額_2,_残りならび) :- select([_下請け人数_1,_費用_1],_下請け人数_費用ならび,_残りならび), _合計金額_2 is _合計金額_1 + _費用_1, _合計人数_2 is _合計人数_1 + _下請け人数_1. '出力してください。'(_最も安くすむ合計金額) :- writef('%t万円\n',[_最も安くすむ合計金額]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/851 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 入力された数字まで、1から順に # 表示すること # (入力される数字の最小は、1) # (入力される数字の最大は、20) # # 実行例 # 5 入力 # 1 2 3 4 5 出力 # 11 入力 # 1 2 3 4 5 6 7 8 9 10 11 出力 # 1 入力 # 1 出力 # # '入力された数字まで、1から順に 表示すること (入力される数字の最小は、1) (入力される数字の最大は、20)' :- '入力された数字まで、(入力される数字の最小は、1最大は、20)'(_入力された数字), '1から順に表示すること'(_入力された数字). '1から順に表示すること'(_入力された数字) :- findall(_整数,between(1,_入力された数字,_整数),L), atomic_list_concat(L,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/788 # [1] 授業単元:プログラミング1 # [2] 問題文 # 正の整数を読み込み、その整数より小さい3の倍数を # 全て表示するプログラムを作る # # '正の整数を読み込み、その整数より小さい3の倍数を 全て表示するプログラムを作る' :- '正の整数を読み込み、'(_正の整数), その整数より小さい3の倍数を全て表示する(_正の整数). '正の整数を読み込み、'(_正の整数) :- 整数を得る(_正の整数,_正の整数 >= 0,_正の整数). その整数より小さい3の倍数を全て表示する(_正の整数) :- forall(その整数より小さい3の倍数を(_正の整数,_その整数より小さい3の倍数),全て表示する(_その整数より小さい3の倍数)). その整数より小さい3の倍数を(_正の整数,_その整数より小さい3の倍数) :- between(1,_正の整数,_その整数より小さい3の倍数), _その整数より小さい3の倍数 < _正の整数, 0 is _その整数より小さい3の倍数 mod 3. 全て表示する(_その整数より小さい3の倍数) :- writef('%t\n',[_その整数より小さい3の倍数]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/771 # [1] 授業単元:プログラミング # [2] 問題文 # 10人の学生の点数を読み込み、配布を図のように表示するプログラムを作成せよ # #     100: * # 90 - 99: ** # 80 - 89: *** #    (中略) # 0 -  9: * # # 点数は100点満点とし、人数分だけ * を出力すること #  [3.1] OS: Windows8 #  [3.3] 言語: C # よろしくお願いします。 # # '10人の学生の点数を読み込み、配布を図のように表示するプログラムを作成せよ     100: * 90 - 99: ** 80 - 89: ***    (中略) 0 -  9: * 点数は100点満点とし、人数分だけ * を出力すること' '点数は100点満点とし、10人の学生の点数を読み込み、'(_10人の学生の点数), '配布を図のように表示するプログラムを作成せよ     100: * 90 - 99: ** 80 - 89: ***    (中略) 0 -  9: * 点数は100点満点とし、人数分だけ * を出力すること'(_10人の学生の点数). '点数は100点満点とし、10人の学生の点数を読み込み、'(_10人の学生の点数) :- findall(_学生の点数,( between(1,10,_), 整数を得る(学生の点数,'点数は100点満点とし、'(_学生の点数),_学生の点数)), _10人の学生の点数). '点数は100点満点とし、'(_学生の点数) :- _学生の点数 >= 0, _学生の点数 =< 100. '配布を図のように表示するプログラムを作成せよ     100: * 90 - 99: ** 80 - 89: ***    (中略) 0 -  9: * 点数は100点満点とし、人数分だけ * を出力すること'(_10人の学生の点数) :- 表示は100点だけ特別(_10人の学生点数), '100点以外の10クラスの表示'(_10人の学生の点数). 表示は100点だけ特別(_10人の学生の点数) :- クラスの学生の人数(_10人の学生の点数,100,100,_100点の学生の人数), sub_atom('**********',0,_100点の学生の人数,_,_100点の学生の人数表示), writef(' 100: %t\n',[_100点の学生の人数表示]),!. '100点以外の10クラスの表示'(_10人の学生の点数) :- クラスの学生の人数(_クラス,_10人の学生の点数,_クラスの下限の点数,_クラスの上限の点数,_クラスの学生の人数), sub_atom('**********',0,_クラスの学生の人数,_,_クラスの学生の人数表示), writef('%3R-%3R: %t\n',[_クラスの下限の点数,_クラスの上限の点数,_クラスの学生の人数表示]), _クラス = 0. クラスの学生の人数(_クラス,_10人の学生の点数,_クラスの下限の点数,_クラスの上限の点数,_クラスの学生の人数) :- member(_クラス,[9,8,7,6,5,4,3,2,1,0]), 'クラスの下限の点数、上限の点数'(_クラスの下限の点数,_クラスの上限の点数), クラスの学生の人数(_10人の学生の点数,_クラスの下限の点数,_クラスの上限の点数,_クラスの学生の人数). 'クラスの下限の点数、上限の点数'(_クラスの下限の点数,_クラスの上限の点数) :- _クラスの下限の点数 is _クラス * 10, _クラスの上限の点数 is _クラス * 10 + 9. クラスの学生の人数(_10人の学生の点数,_クラスの下限の点数,_クラスの上限の点数,_クラスの学生の人数) :- finsum(1,( member(_学生の点数,_10人の学生の点数), _学生の点数 >= _クラスの下限の点数, _学生の点数 =< _クラスの上限の点数)), _クラスの学生の人数). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/769 # [1] 授業単元:プログラミング # [2] 問題文 # 6人の学生の点数を読み込み、最高点を表示するプログラムを作成せよ # '6人の学生の点数を読み込み、最高点を表示するプログラムを作成せよ' :- '6人の学生の点数を読み込み、最高点を表示する'. '6人の学生の点数を読み込み、最高点を表示する' :- '6人の学生の点数を読み込み、'(_6人の学生の点数), 最高点を表示する(_6人の学生の点数). '6人の学生の点数を読み込み、'(_6人の学生の点数) :- '6人の学生の'(_6人の学生の点数), 点数を読み込み(_6人の学生の点数). '6人の学生の点数を読み込み、'(_6人の学生の点数) :- findall(_学生の点数,( between(1,6,_), 整数を得る(学生の点数,true,_学生の点数)), _6人の学生の点数). 最高点を表示する(_6人の学生の点数) :- 最高点を(_6人の学生の点数,_最高点), 表示する(_6人の学生の点数,_最高点). 最高点を(_6人の学生の点数,_最高点) :- append(L1,[_最高点|L2],_6人の学生の点数), \+((member(A,L1),A > _最高点)), \+((member(A,L2),A > _最高点)). 表示する(_6人の学生の点数,_最高点) :- writef('6人の学生の点数 = %t,%t,%t,%t,%t,%t\n',_6人の学生の点数), writef('最高点 = %t\n',[_最高点]). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/765 # [1] 授業単元:プログラミング1 # [2] 問題文:n人分の試験の得点の和と平均を求めるプログラムを作成せよ。 # 始めに処理するデータの人数nを読み込み、次にn人分の得点を読み込む。 # そして、和と平均を求め出力する。 # 次に、s(90以上)、a(80〜89)、b(70〜79)、c(60〜69)、f(それ以外) # の人数を求めるプログラムを、if else文を使い作成せよ。 # # ここからが本題なのですが # # 上記問題のs、a、b、c、fの人数を # 関数を使用して*で表すヒストグラムにせよ。 # # 'n人分の試験の得点の和と平均を求めるプログラムを作成せよ。 始めに処理するデータの人数nを読み込み、次にn人分の得点を読み込む。 そして、和と平均を求め出力する。 次に、s(90以上)、a(80〜89)、b(70〜79)、c(60〜69)、f(それ以外) の人数を求めるプログラムを、if else文を使い作成せよ。 ここからが本題なのですが 上記問題のs、a、b、c、fの人数を 関数を使用して*で表すヒストグラムにせよ。'(_ヒストグラム) :- 'n人分の試験の得点の和と平均を求めるプログラムを作成せよ。 始めに処理するデータの人数nを読み込み、次にn人分の得点を読み込む。 そして、和と平均を求め'(_n,_n人分の得点ならび,_得点の和,_平均), 出力する(_得点の和,_平均), '次に、s(90以上)、a(80〜89)、b(70〜79)、c(60〜69)、f(それ以外) の人数を求めるプログラムを、if else文を使い作成せよ。'(_n人分の得点ならび,_クラス_人数ならび), '上記問題のs、a、b、c、fの人数を 関数を使用して*で表すヒストグラムにせよ。'(_n,_クラス_人数ならび,_ヒストグラム). 'n人分の試験の得点の和と平均を求めるプログラムを作成せよ。 始めに処理するデータの人数nを読み込み、次にn人分の得点を読み込む。 そして、和と平均を求め'(_n,_n人分の得点ならび,_得点の和,_平均) :- '始めに処理するデータの人数nを読み込み、'(_n), '次にn人分の得点を読み込む。'(_n,_n人分の得点ならび), 'n人分の試験の得点の和と平均を求める'(_n,_n人分の得点ならび,_得点の和,_平均). '始めに処理するデータの人数nを読み込み、'(_n) :- 整数を得る(人数,true,_人数). '次にn人分の得点を読み込む。'(_n,_n人分の得点ならび) :- findall(_得点,( between(1,_n,_), 整数を得る(得点,true,_得点)), _n人分の得点ならび). 'n人分の試験の得点の和と平均を求める'(_n,_n人分の得点ならび,_得点の和,_平均) :- sum_list(_n人分の得点ならび,_得点の和), _平均 is _得点の和 / _n. 出力する(_得点の和,_平均) :- writef('得点の和 = %t\n平均 = %t\n',[_得点の和,_平均]). '次に、s(90以上)、a(80〜89)、b(70〜79)、c(60〜69)、f(それ以外) の人数を求めるプログラムを、if else文を使い作成せよ。'(_n人分の得点ならび,_クラス_人数ならび) :- findall([_クラス,_人数],( member(_クラス,[s,a,b,c,f]), クラスの人数(_クラス,_n人分の得点ならび,_人数)), _クラス_人数_ならび). クラスの人数(_クラス,_n人分の得点ならび,_人数) :- findall(1,( member(_得点,_n人分の得点ならび), クラス(_クラス,_得点)), L), sum_list(L,_人数). クラス(s,_得点) :- _得点 >= 90. クラス(a,_得点) :- between(80,89,_得点). クラス(b,_得点) :- between(70,79,_得点). クラス(c,_得点) :- between(60,69,_得点). クラス(f,_得点) :- クラス_f(_得点). クラス_f(_得点) :- \+(_得点 >= 60). '上記問題のs、a、b、c、fの人数を 関数を使用して*で表すヒストグラムにせよ。'(_n,_クラス_人数ならび,_ヒストグラム) :- length(_クラス_人数ならび,_クラスの数), ヒストグラムの生成(_n,_クラスの数,_クラス_人数ならび,_ヒストグラム). ヒストグラムの生成(_n,_クラスの数,_クラス_人数ならび,_ヒストグラム) :- findall([_クラス,_星文字列],( member([_クラス,_人数],_クラス_人数ならび), _星の数 is _人数 // (_n // _クラスの数 // 5), 星文字列(_星の数,_星文字列)), _ヒストグラム). 星文字列(_星の数,_星文字列) :- findall('*',between(1,_星の数,_),L), atomic_list_concat(L,_星文字列). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/740 # [1] 授業単元: プログラミング基礎 # [2] 問題文、ブラックジャックの判定処理を行う # 1人目の数字列を入力(1個〜10個まで) # 2人目の数字列を入力(1個〜10個まで) # 数字は、1から13。 # 合計が21を超えたら点数は、0点。 # 1は、1点または、11点として使える。 # 11以上は10点として数える。 # それ以外は、数字がそのまま点数。 # 勝った方を番号で表示(1 or 2) # 引き分けは、2の勝ちとする # 実行例) # 1 5 8 入力1(14) # 5 7 4 入力2(16) # 2 出力 # 13 1 入力1(21) # 12 10 入力2(20) # 1 出力 # 13 8 入力1(18) # 1 9 入力2(20) # 2 出力 # 1 1 8 入力1(20) # 3 4 7 入力2(14) # 1 出力 # 10 8 7 入力1(25) # 3 5 8 入力2(16) # 2 出力 # 'ブラックジャックの判定処理を行う 合計が21を超えたら点数は、0点。 1は、1点または、11点として使える。 11以上は10点として数える。 それ以外は、数字がそのまま点数。 勝った方を番号で表示(1 or 2) 引き分けは、2の勝ちとする' :- ブラックジャックの札を配る(_1人目の数字ならび,_2人目の数字ならび), '合計が21を超えたら点数は、0点。 1は、1点または、11点として使える。 11以上は10点として数える。 それ以外は、数字がそのまま点数。'(_1人目の数字ならび,_2人目の数字ならび,_点数_1,_点数_2), ブラックジャックの判定(_点数_1,_点数_2,_勝者), 勝った方を番号で表示(_勝者). ブラックジャックの札を配る(_1人目の数字ならび,_2人目の数字ならび) :- カードの準備(_配り札_1), ブラックジャックの札を配る(_配り札_1,[],_1人目の数字ならび,_配り札_2), ブラックジャックの札を配る(_配り札_2,[],_2人目の数字ならび,_),!. カードの準備(_配り札) :- findall(N,( between(1,13,N), between(1,4,_)), _配り札). ブラックジャックの札を配る(_配り札,_数字ならび,_数字ならび,_配り札) :- 合計点の最高(_数字ならび,_合計点の最高), between(14,21,_合計点の最高),!. ブラックジャックの札を配る(_配り札_1,_現在までの数字ならび,_数字ならび,_残り配り札) :- 一枚配る(_配り札_1,_数字,_配り札_2), ブラックジャックの札を配る(_配り札_2,[_数字|_現在までの数字ならび],_数字ならび,_残り配り札). 一枚配る(_配り札_1,_数字,_配り札_2) :- length(_配り札_1,_配り札の枚数), _抜き位置 is random(_配り札の枚数), length(L1,_抜き位置), append(L1,[_数字|L2],_配り札_1), append(L1,L2,_配り札_2). '合計が21を超えたら点数は、0点。 1は、1点または、11点として使える。 11以上は10点として数える。 それ以外は、数字がそのまま点数。'(_1人目の数字ならび,_2人目の数字ならび,_点数_1,_点数_2) :- 合計点の最高(_1人目の数字ならび,_点数_1), 合計点の最高(_2人目の数字ならび,_点数_2). 合計点の最高(_数字ならび,_合計点の最高) :- findall(_合計点,( 合計点(_数字ならび,_合計点)), _合計点ならび), findmax(_合計点,( member(_合計点,_合計点ならび), _合計点 =< 21), _合計点の最高),!. 合計点の最高(_,0). 合計点([],0). 合計点([N|R],S) :- 合計点(R,S_2), 点数の数え方(N,N_2), S is N_2 + S_2. 点数の数え方(1,1). 点数の数え方(1,11). 点数の数え方(11,10). 点数の数え方(12,10). 点数の数え方(13,10). 点数の数え方(N,N) :- between(2,10,N). ブラックジャックの判定(_点数_1,_点数_2,2) :- _点数_2 >= _点数_1,!. ブラックジャックの判定(_,_,1). 勝った方を番号で表示(_勝者) :- writef('勝ったのは %t です\n',[_勝者]). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/736 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 以下のプログラムを作成しなさい. # 文字列を5つ入力し、その中の # 一番小さい文字列を表示 # (英数字のみ) # (文字列は、50文字以内) # (英字の大文字と小文字は、 #  特に考慮しないで、そのまま比較 #  して良いこととする) # # 実行例) # abc 入力1 # aaaa 入力2 # wsdd 入力3 # gfd 入力4 # xxxd 入力5 # aaaa 出力 # 19dfc 入力1 # xuw29 入力2 # 12k2 入力3 # mnnn 入力4 # bccd1 入力5 # 12k2 出力 # '文字列を5つ入力し、その中の一番小さい文字列を表示 (英数字のみ)(文字列は、50文字以内)(英字の大文字と小文字は、特に考慮しないで、そのまま比較して良いこととする)' :- '文字列を5つ入力し、'(_文字列ならび), 一番小さい文字列を表示(_文字列ならび). '文字列を5つ入力し、'(_文字列ならび) :- findall(_文字列,( between(1,5,_), get_line(_文字列)), _文字列ならび). 一番小さい文字列を表示([_文字列|_残り文字列ならび],_一番小さい文字列) :- 一番小さい文字列を(_残り文字列ならび],_文字列,_一番小さい文字列), 表示(_一番小さい文字列). 一番小さい文字列を([],_一番小さい文字列,_一番小さい文字列). 一番小さい文字列を([_文字列|_残り文字列ならび],_現時点で一番小さい文字列,_一番小さい文字列) :- _文字列 @< _現時点で一番小さい文字列, 一番小さい文字列を(_残り文字列ならび,_文字列,_一番小さい文字列). 一番小さい文字列を([_文字列|_残り文字列ならび],_現時点で一番小さい文字列,_一番小さい文字列) :- _文字列 @>= _現時点で一番小さい文字列, 一番小さい文字列を(_残り文字列ならび,_現時点で一番小さい文字列,_一番小さい文字列). 表示(_一番小さい文字列) :- writef('%t\n',[_一番小さい文字列]). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは % % tic-tac-toe検査 % 'tic-tac-toe検査'(LL) :- member([A,A,A],LL). 'tic-tac-toe検査'(LL) :- between(1,3,_nth1), findall(A,( member(L,LL), nth1(_nth1,L,A)), [A,A,A]). 'tic-tac-toe検査'(LL) :- 'tic-tac-toe角行検査'(LL,[1,2,3]). 'tic-tac-toe検査'(LL) :- 'tic-tac-toe角行検査'(LL,[3,2,1]). 'tic-tac-toe角行検査'(LL,_順序ならび) :- findall(L,( member(_nth1,_順序ならび), nth1(_nth1,LL,L), nth1(_nth1,L,A)), [A,A,A]). % 以下のサイトは 魔方陣(_魔方陣) :- 魔方陣の構成要素を得る(_魔方陣,Ln1,Ln2,_数ならび), 魔方陣を構成してみる(Ln1,Ln2,_数ならび,_行_列_合計,_魔方陣), 魔方陣列検査(_魔方陣,_行_列_合計). 魔方陣の構成要素を得る(_魔方陣,Ln1,Ln2,_数ならび) :- length(_魔方陣,_n), length(Ln1,_n), length(Ln2,_n), _n掛けるn is _n * _n, findall(M,between(1,_n掛けるn,M),_数ならび). 魔方陣を構成してみる([],Ln2,_,_行の合計,[]). 魔方陣を構成してみる([_|Ln1],Ln2,_数ならび_1,_行の合計,[L|R]) :- 魔方陣の一行を得る(Ln2,_数ならび_1,L,_数ならび_2), sum_list(L,_行の合計), 魔方陣を構成してみる(Ln1,Ln2,_数ならび_2,_行の合計,R). 魔方陣の一行を得る([],_残り数ならび,[],_残り数ならび). 魔方陣の一行を得る([_|Ln],_数ならび_1,[_n|R4],_残り数ならび) :- select(_n,_数ならび_1,_数ならび_2), 魔方陣の一行を得る(Ln,_数ならび_2,R4,_残り数ならび). 魔方陣列検査(_行列,_行_列の合計) :- 転置(_行列,_転置行列), 行の合計が全て一致する(_転置行列,_行_列の合計). 行の合計が全て一致する([],_). 行の合計が全て一致する([L|R],S) :- sum_list(L,S), 行の合計が全て一致する(R,S). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # # 寿命が縮むとは、ある原因となる事由があって、本来の余命の減少を上回って余命が減少することだ。 # あのジジイの(尾崎隆大,65,15). ある原因となる事由(_). あのジジイの寿命が縮む(_あのジジイ,_現在の年齢,_現在の余命,_n年後,_年齢,_余命) :- あのジジイの(_あのジジイ,_現在の年齢,_現在の余命), 寿命が縮む(_あのジジイ,_現在の年齢,_現在の余命,_n年後,_年齢,_余命). 寿命が縮む(_あのジジイ,_年齢_1,_現在の余命,_n年後,_年齢,_余命) :- '寿命が縮むとは、ある原因となる事由があって、本来の余命の減少を上回って余命が減少することである'(_年齢_1,_現在の余命,_n年後,_年齢,_余命,_本来の余命の減少,_余命の減少). '寿命が縮むとは、ある原因となる事由があって、本来の余命の減少を上回って余命が減少することである'(_現在の年齢,_現在の余命,_n年後,_年齢,_余命,_本来の余命の減少,_余命の減少) :- ある原因となる事由(_ある原因となる事由), 本来の余命の減少を上回って余命が減少することである(_現在の年齢,_n年後,_年齢,_余命,_本来の余命の減少,_余命の減少). 本来の余命の減少を上回って余命が減少することである(_現在の年齢,_n年後,_年齢,_余命,_本来の余命の減少,_余命の減少) :- 本来の余命の減少(_n年後,_本来の余命の減少), 余命の減少(_現在の余命,_余命,_余命の減少), _余命の減少 > _本来の余命の減少, _年齢 is _現在の年齢 + _n年後. 本来の余命の減少(_本来の余命の減少,_本来の余命の減少). 余命の減少(_現在の余命,_余命,_余命の減少) :- between(1,_現在の余命,_余命), _余命の減少 is _現在の余命 - _余命. % 以下のサイトは # 出典: 問題 # 詳細な問題文 # 私のツイート(1) # 私のツイート(2) # 私のツイート(3) # Dは前に二人いると言っているから3人以上の部屋にいる。 # 部屋は4人1部屋か、3人と1人の二つの可能性しかない。 # 自分が前から2人目を主張するCは必然的に4人または3人の部屋にいる # この部屋のCの主張から先頭が白で、Dの主張から1人目2人目は白か黒のどちらだから2人目のCは黒とわかる # 'Dは前に二人いると言っているから3人以上の部屋にいる。部屋は4人1部屋か、3人と1人のふた部屋の、二つの可能性しかない'(LL) :- length([_,_,D|_],N), findall(L,'3人以上の部屋がある'(L),LL). '3人以上の部屋にいる'(L) :- 総組合せ([1,2,3,4],L), sum_list(L,4), member(M,L), M >= 3. 総組合せ([],_). 総組合せ(L1,L2) :- length(L1,N), between(1,N,D), 重複組合せ(L1,D,L2). 重複組合せ(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). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #353 # # 素数pと素数qから(p-1)と(q-1)の最小公倍数を求める。 # 最大p*qまでの数で、n*最小公倍数+1の集合を求める。 # この集合の中から、eで割り切れる数を探す。 # 例:p=5,q=7:(5-1)と(7-1)つまり4と6の最小公倍数は12。 # 例:p*q=35なので12+1,24+1,36+1(>35)つまり13と25。 # 例:25/5=5=dとなる。eは割り切れる数があらかじめ入力される。 '素数pと素数qから(p-1)と(q-1)の最小公倍数を求める。 最大p*qまでの数で、n*最小公倍数+1の集合を求める。 この集合の中から、eで割り切れる数を探す。'(_p,_q,_e,X) :- _n is _p * _q, '素数pと素数qから(p-1)と(q-1)の最小公倍数を求める。'(_p,_q,_最小公倍数), '最大p*qまでの数で、n*最小公倍数+1の集合を求める。'(_n,_最小公倍数,_集合), 'この集合の中から、eで割り切れる数を探す。'(_集合,_e,X). '素数pと素数qから(p-1)と(q-1)の最小公倍数を求める。'(_p,_q,_最小公倍数) :- _p_1 is _p - 1, _q_1 is _q - 1, 最小公倍数(_p_1,_q_1,_最小公倍数). '最大p*qまでの数で、n*最小公倍数+1の集合を求める。'(_n,_最小公倍数,_集合) :- findall(_s,( between(1,_n,_), _s is _n * _最小公倍数 + 1), _集合). 'この集合の中から、eで割り切れる数を探す。'(_集合,_e,X) :- member(X,_集合), 0 is X mod _e. 最小公倍数(A,B,X) :- 最大公約数をユークリッドの互除法で求める(A,B,C), X is A * B // C. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). % 以下のサイトは # S(1≦S≦10) # L(100≦L≦100) # 標準入力から以下の形式で与えられる # S L # # 例を参考にoとxを配置せよ # # 例 # 3 2 # oooxxx # oooxxx # oooxxx # xxxooo # xxxooo # xxxooo # # 2 3 # ooxxoo # ooxxoo # xxooxx # xxooxx # ooxxoo # ooxxoo # # 1 1 # o # # 2 1 # oo # :- dynamic(行パターン,1). 白(白). 黒(黒). '_行数 is S * L, S(1≦S≦10) L(100≦L≦100) 標準入力から以下の形式で与えられる S L' :- 'S Lを得る'(_s,_l), 表示パターンの形成(_s,_l,LL1), 出力する(LL1). 表示パターンの形成(_s,_l,_表示パターン) :- 行パターンの定義(_s,_l), 表の形成(_s,_l,_表示パターン), 転置して具体値を埋める(_表示パターン). 行パターンの定義(_s,_l) :- 白(_白), 黒(_黒), 行パターンの生成(_白,_黒,_s,_l), 行パターンの生成(_黒,_白,_s,_l). 行パターンの生成(_文字_1,_文字_2,_s,_l) :- length(Ln,_l), findall(文字,( 同一文字列トグル(Ln,_s,_文字_1,_文字_2,_文字)), _行パターン), assertz(行パターン(_行パターン)). 同一文字列トグル([_|_],_s,_文字,_,_文字) :- between(1,_s,_). 同一文字列トグル([_|Ln],_s,_文字_1,_文字_2,_文字) :- 同一文字列トグル(Ln,_s,_文字_2,_文字_1,_文字). 転置して具体値を埋める([L1|R]) :- 転置([L1|R],LL2), findall(L,( member(L,LL2), 行パターン(L)), LL2). 表の形成(_s,_l,[_行パターン|LL]) :- 行パターン(_行パターン),!, findall(L,( between(2,_l,_), length(L,_s)), LL). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 'S Lを得る'(S,L) :- get_line(Line), split(Line,[' '],[S,L]). 出力する(LL) :- flatten(LL,L), forall(member(A,L),format('~w\n',[A])). % 以下のサイトは # S(1≦S≦10) # L(100≦L≦100) # 標準入力から以下の形式で与えられる # S L # # 例を参考にoとxを配置せよ # # 例 # 3 2 # oooxxx # oooxxx # oooxxx # xxxooo # xxxooo # xxxooo # # 2 3 # ooxxoo # ooxxoo # xxooxx # xxooxx # ooxxoo # ooxxoo # # 1 1 # o # # 2 1 # oo # '_行数 is S * L, S(1≦S≦10) L(100≦L≦100) 標準入力から以下の形式で与えられる S L' :- 'S Lを得る'(S,L), 行パターンABを得る(S,L,A,B), findall(AorB,( between(1,L,N), 'AorB'(N,A,B,AorB)), X), 出力する(X). 'S Lを得る'(S,L) :- get_line(Line), split(Line,[' '],[S,L]). 出力する(LL) :- flatten(LL,L), forall(member(A,L),format('~w\n',[A])). 'AorB'(N,A,_,A) :- 1 is N mod 2. 'AorB'(N,_,B,B) :- 0 is N mod 2. 行パターンABを得る(S,L,A,B) :- 合計L行(L,白,黒,S,L,A), 合計L行(L,黒,白,S,L,B). 合計L行(0,_,_,_,_,[]) :- !. 合計L行(L_2,_文字_1,_文字_2,S,L,[_行文字列|R]) :- 行文字列(_文字_1,_文字_2,S,L,_行文字列), succ(L_1,L_2), 合計L行(L_1,_文字_1,_文字_2,S,L,R). 行文字列(_,_,_,0,'') :- !. 行文字列(_文字_1,_文字_2,S,L,_文字列) :- 連続文字列(_文字_1,S,_連続文字列), succ(L_1,L), 行文字列(_文字_2,_文字_1,S,L_1,_連続文字列_1), atom_concat(_連続文字列,_連続文字列_1,_文字列). 連続文字列(_文字,S,_連続文字列) :- findall(_文字,between(1,S,_),L), atom_chars(_連続文字列,L). % 以下のサイトは # # append/4からappend/nまでを一気に定義してしまう、 'append/4から/nの定義'/1 。 # append/nの定義、 'append/nの定義'/1 。 # 'append/4からappend/nの定義'(_n) :- between(4,_n,M), 'abolish_append/n'(M), 'append/nの定義'(M), _n = M. 'append/nの定義'(_n) :- 'L2からLnまで'(_n,_L2_Ln), 'L2からLn_1まで'(_n,_L2_Ln_1), 'L1からLnまで'(_n,_L1_Ln), 'append/nの定義'(_n,_L2_Ln,_L2_Ln_1,_L1_Ln). 'append/nの定義'(_n,_L2_Ln,_L2_Ln_1,_L1_Ln) :- 'append/nの第一節の定義'(_n,_L2_Ln), 'append/nの第二節の定義'(_n,_L2_Ln_1,_L1_Ln). 'append/nの第一節の定義'(_n,_L2_Ln) :- format(atom(S1),'append([],~w) :-~n append(~p).~n',[_L2_Ln,_L2_Ln]), read_term_from_atom(S1,Clause_1,[variables(_変数ならび),variable_names(_変数名ならび)]), assertz(Clause_1). 'append/nの第二節の定義'(_n,_L2_Ln_1,_L1_Ln) :- format(atom(S2),'append([U|L1],~w,[U|L~p]) :-~n append(~w).\n',[_L2_Ln_1,_n,_L1_Ln]), read_term_from_atom(S2,Clause_2,[variables(_変数ならび),variable_names(_変数名ならび)]), assertz(Clause_2). 'L2からLnまで'(_n,_L2_Ln) :- findall(A,( between(2,_n,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L2_Ln). 'L2からLn_1まで'(_n,_L2_Ln_1) :- _m is _n - 1, findall(A,( between(2,_m,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L2_Ln_1). 'L1からLnまで'(_n,_L1_Ln) :- findall(A,( between(1,_n,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L1_Ln). 'abolish_append/n'(_n) :- abolish(append,_n). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #224 # # お題:自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。10000以下でこの操作の繰り返し回数が最大となる自然数nを求める。 # '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。10000以下でこの操作の繰り返し回数が最大となる自然数nを求める。'(_自然数n) :- findall([_繰り返し回数,_自然数n],( between(1,10000,_自然数n), '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(_自然数n,_繰り返し回数)), _繰り返し数_自然数nならび), 繰り返し数が最大の自然数nを得る(_繰り返し数_自然数nならび,_自然数n). '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(_n,_繰り返し回数) :- '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(_n,0,_繰り返し回数). '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(3,_繰り返し回数,_繰り返し回数) :- !. '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(_n,_繰り返し回数_1,_繰り返し回数) :- '偶数なら2で割り、奇数なら1を足して3を掛ける操作を'(_n,_n_2), succ(_繰り返し回数_1,_繰り返し回数_2), '自然数nが偶数なら2で割り、奇数なら1を足して3を掛ける操作を値が3になるまで繰り返す。'(_n_2,_繰り返し回数_2,_繰り返し回数). '偶数なら2で割り、奇数なら1を足して3を掛ける操作を'(_n,_n_2) :- 偶数(_n), _n_2 is _n // 2,!. '偶数なら2で割り、奇数なら1を足して3を掛ける操作を'(_n,_n_2) :- 奇数(_n), _n_2 is (_n + 1) * 3. 繰り返し数が最大の自然数nを得る(_繰り返し数_自然数nならび,_自然数n) :- findmax(_繰り返し回数,( member([_繰り返し回数,_],_繰り返し数_自然数nならび)), _最大繰り返し回数), member([_最大繰り返し回数,_自然数n],_繰り返し数_自然数nならび). 偶数(_n) :- 0 is _n mod 2. 奇数(_n) :- 1 is _n mod 2. findmax(A,P,Max) :- findall(A,P,L), 最大値(L,Max). 最大値(L,_最大値) :- L = [A|R], 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値([A|R],_これまでの最大値,_最大値) :- _これまでの最大値 @>= A, 最大値(R,_これまでの最大値,_最大値),!. 最大値([A|R],_,_最大値) :- 最大値(R,A,_最大値). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #935 # # W=横の長さ、H=縦の長さ # 2<=W<=1000、2<=H<=1000 # 箱の枠は「+」、箱の中は「@」で出力しなさい # # 入力は以下の形式で標準入力から与えられます # W H # # 例 # --------------------- # 2 2 # ++ # ++ # --------------------- # 10 4 # ++++++++++ # +@@@@@@@@+ # +@@@@@@@@+ # ++++++++++ '# W=横の長さ、H=縦の長さ 2<=W<=1000、2<=H<=1000 箱の枠は「+」、箱の中は「@」で出力しなさい 入力は以下の形式で標準入力から与えられます W H' :- 標準入力からWとHを得る(W,H), 描画する(W,H). 標準入力からWとHを得る(W,H) :- get_split_line([' '],[W,Y]). 描画する(W,H) :- between(1,H,N), 一行の像(N,W,H,_一行の像), 描画する(_一行の像), N = H. 一行の像(N,W,H,_一行の像) :- length(L,W), 一行分の文字ならび(N,H,_一行分の文字ならび), atomic_list_concat(_一行分の文字ならび,_一行の像). 一行分の文字ならび(1,H,_一行分の文字ならび) :- '最初と最後の行は行全体が+'(N,_一行分の文字ならび),!. 一行分の文字ならび(N,H,_一行分の文字ならび) :- '最初と最後の行以外は、行の先頭と最後が+,それ以外は@'(N,H,_一行分の文字ならび). '最初と最後の行は行全体が+'(1,_,_一行分の文字ならび) :- all(_一行分の文字ならび,'+'). '最初と最後の行は行全体が+'(H,H,_一行分の文字ならび) :- all(_一行分の文字ならび,'+'). '最初と最後の行以外は、行の先頭と最後が+,それ以外は@'(N,H,_一行分の文字ならび) :- \+(N = H), append(['*'],L2,['*'],_一行分の文字ならび), all(L2,'@'). 描画する(_一行の像) :- writef('%t\n',[_一行の像]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all([]). all([A|R],A) :- all(R,A). append([],L2,L3,L4) :- append(L2,L3,L4). append([A|L1],L2,L3,[A|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #935 # # W=横の長さ、H=縦の長さ # 2<=W<=1000、2<=H<=1000 # 箱の枠は「+」、箱の中は「@」で出力しなさい # # 入力は以下の形式で標準入力から与えられます # W H # # 例 # --------------------- # 2 2 # ++ # ++ # --------------------- # 10 4 # ++++++++++ # +@@@@@@@@+ # +@@@@@@@@+ # ++++++++++ '# W=横の長さ、H=縦の長さ 2<=W<=1000、2<=H<=1000 箱の枠は「+」、箱の中は「@」で出力しなさい 入力は以下の形式で標準入力から与えられます W H' :- 標準入力からWとHを得る(W,H), split(Line,[' '],[W,H]), 全体像(W,H,_全体像), 全体像を描画する(_全体像). 標準入力からWとHを得る(W,H) :- read_line_to_codes(Codes,[]), 中間の32を一個のの44に置き換える(Codes,Codes2), string_to_atom(Codes2,Atom), read_term_from_atom(Atom,(W,H,[]). 中間の32を一個のカンマに置き換える(Codes,Codes2) :- append(L1,L2,L3,Codes), all(L2,32), \+(member(32,L1)), \+(member(32,L2)), append(L1,[44|L3],Codes2). 全体像(W,H,_全体像) :- findall(L,( between(1,H,_), findall(_,( between(1,W,_)), L)), _全体像), 全体像(_全体像). 全体像(_全体像) :- append([_第一行],_中間行ならび,[_最終行],_全体像), all(_第一行,'+'), all(_最終行,'+'), '内側は先頭要素と最後の要素が+、中間要素は@となる'(_中間行ならび). '内側は先頭要素と最後の要素が+、中間要素は@となる'([]). '内側は先頭要素と最後の要素が+、中間要素は@となる'([L|R]) :- '先頭要素と最後の要素が+、中間要素は@となる'(L), '内側は先頭要素と最後の要素が+、中間要素は@となる'(R). '先頭要素と最後の要素が+、中間要素は@となる'(L) :- append(['+'],L2,['+'],L), all(L2,'@'),!. 全体像を描画する([]). 全体像を描画する([L|R]) :- atom_chars(_行表示,L), writef('%t\n',[_行表示]), 全体像を描画する(R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all([]). all([A|R],A) :- all(R,A). append([],L2,L3,L4) :- append(L2,L3,L4). append([A|L1],L2,L3,[A|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは % 出典: twitter_by_@wakamesoba98_20140605 丸ノ内線の時刻表は何度見ても面白い(_丸ノ内線の時刻表) :- findall([N,L],( 丸ノ内線新宿駅池袋方面標準時刻表(N,L)), _丸ノ内線の時刻表). 丸ノ内線新宿駅池袋方面標準時刻表(5,[00,15,28,35,41,48,54]). 丸ノ内線新宿駅池袋方面標準時刻表(6,[00,05,09,14,24,27,30,35,38,41,44,48,51,55,58]). 丸ノ内線新宿駅池袋方面標準時刻表(7,[01,04,07,10,13,16,19,21,23,26,29,31,33,36,38,41,43,45,48,50,52,55,57,59]). 丸ノ内線新宿駅池袋方面標準時刻表(8,[01,03,05,08,09,11,13,15,18,19,21,24,26,28,30,32,35,37,39,41,44,46,48,50,53, 54,57,59]). 丸ノ内線新宿駅池袋方面標準時刻表(9,[01,04,06,08,10,12,15,17,19,22,26,29,32,34,36,39,42,45,47,49,52,54,58]). 丸ノ内線新宿駅池袋方面標準時刻表(10,[01,04,08,12,16,20,24,28,32,36,40,44,48,52,56]). 丸ノ内線新宿駅池袋方面標準時刻表(11,[01,04,06,13,16,20,25,28,32,37,40,44,49,52,56]). 丸ノ内線新宿駅池袋方面標準時刻表(12,[01,04,08,13,16,20,25,28,32,37,40,44,49,52,56]). 丸ノ内線新宿駅池袋方面標準時刻表(13,[01,04,08,13,16,20,25,28,32,37,40,44,49,52,56]). 丸ノ内線新宿駅池袋方面標準時刻表(14,[01,04,08,13,16,20,25,28,32,37,40,44,49,52,56]). '11時から14時の丸ノ内線新宿駅池袋方面標準時刻表の生成規則'(_何時,_時刻ならび) :- between(11,14,_何時), '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(1,[3,4,5],_時刻ならび). '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N,[],L) :- '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N,[3,4,5],L). '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N,[M|R2],[]) :- N > 59,!. '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N,[M|R2],[N|R3]) :- N2 is N + M, '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N2,R2,R3). % 以下のサイトは % 出典: twitter_by_@wakamesoba98_20140605 丸ノ内線の時刻表は何度見ても面白い(_丸ノ内線の時刻表) :- findall([N,L],( 丸ノ内線新宿駅池袋方面標準時刻表(N,L)), _丸ノ内線の時刻表). 丸ノ内線新宿駅池袋方面標準時刻表(5,[00,15,28,35,41,48,54]). 丸ノ内線新宿駅池袋方面標準時刻表(6,[00,05,09,14,24,27,30,35,38,41,44,48,51,55,58]). 丸ノ内線新宿駅池袋方面標準時刻表(7,[01,04,07,10,13,16,19,21,23,26,29,31,33,36,38,41,43,45,48,50,52,55,57,59]). 丸ノ内線新宿駅池袋方面標準時刻表(8,[01,03,05,08,09,11,13,15,18,19,21,24,26,28,30,32,35,37,39,41,44,46,48,50,53, 54,57,59]). 丸ノ内線新宿駅池袋方面標準時刻表(9,[01,04,06,08,10,12,15,17,19,22,26,29,32,34,36,39,42,45,47,49,52,54,58]). 丸ノ内線新宿駅池袋方面標準時刻表(10,[01,04,08,12,16,20,24,28,32,36,40,44,48,52,56]). 丸ノ内線新宿駅池袋方面標準時刻表(_何時,_時刻ならび) :- between(11,14,_何時), '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(1,[3,4,5],_時刻ならび). '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N,[],L) :- '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N,[3,4,5],L). '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N,[M|R2],[]) :- N > 59,!. '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N,[M|R2],[N|R3]) :- N2 is N + M, '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N2,R2,R3). % 以下のサイトは % 出典: twitter_by_@wakamesoba98_20140605 丸ノ内線の時刻表は何度見ても面白い(_丸ノ内線の時刻表) :- findall([N,L],( 丸ノ内線新宿駅池袋方面標準時刻表(N,L)), _丸ノ内線の時刻表). 丸ノ内線新宿駅池袋方面標準時刻表(5,[00,15,28,35,41,48,54]). 丸ノ内線新宿駅池袋方面標準時刻表(6,[00,05,09,14,24,27,30,35,38,41,44,48,51,55,58]). 丸ノ内線新宿駅池袋方面標準時刻表(7,[01,04,07,10,13,16,19,21,23,26,29,31,33,36,38,41,43,45,48,50,52,55,57,59]). 丸ノ内線新宿駅池袋方面標準時刻表(8,[01,03,05,08,09,11,13,15,18,19,21,24,26,28,30,32,35,37,39,41,44,46,48,50,53, 54,57,59]). 丸ノ内線新宿駅池袋方面標準時刻表(9,[01,04,06,08,10,12,15,17,19,22,26,29,32,34,36,39,42,45,47,49,52,54,58]). 丸ノ内線新宿駅池袋方面標準時刻表(10,[01,04,08,12,16,20,24,28,32,36,40,44,48,52,56]). % 丸ノ内線新宿駅池袋方面標準時刻表(11,[01,04,06,13,16,20,25,28,32,37,40,44,49,52,56]). % 丸ノ内線新宿駅池袋方面標準時刻表(12,[01,04,08,13,16,20,25,28,32,37,40,44,49,52,56]). % 丸ノ内線新宿駅池袋方面標準時刻表(13,[01,04,08,13,16,20,25,28,32,37,40,44,49,52,56]). % 丸ノ内線新宿駅池袋方面標準時刻表(14,[01,04,08,13,16,20,25,28,32,37,40,44,49,52,56]). 丸ノ内線新宿駅池袋方面標準時刻表(_何時,_時刻ならび) :- between(11,14,_何時), '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(1,[3,4,5],_時刻ならび). '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N,[],L) :- '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N,[3,4,5],L). '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N,[M|R2],[]) :- N > 59,!. '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N,[M|R2],[N|R3]) :- N2 is N + M, '11時から14時までの時刻ならびは3分,4分,5分の順刻みを繰り返す'(N2,R2,R3). % 以下のサイトは % 出典: twitter_by_@wakamesoba98_20140605 丸ノ内線の時刻表は何度見ても面白い(_丸ノ内線の時刻表) :- findall([N,L],( 丸ノ内線新宿駅池袋方面標準時刻表(N,L)), _丸ノ内線の時刻表). 丸ノ内線新宿駅池袋方面標準時刻表(5,[00,15,28,35,41,48,54]). 丸ノ内線新宿駅池袋方面標準時刻表(6,[00,05,09,14,24,27,30,35,38,41,44,48,51,55,58]). 丸ノ内線新宿駅池袋方面標準時刻表(7,[01,04,07,10,13,16,19,21,23,26,29,31,33,36,38,41,43,45,48,50,52,55,57,59]). 丸ノ内線新宿駅池袋方面標準時刻表(8,[01,03,05,08,09,11,13,15,18,19,21,24,26,28,30,32,35,37,39,41,44,46,48,50,53, 54,57,59]). 丸ノ内線新宿駅池袋方面標準時刻表(9,[01,04,06,08,10,12,15,17,19,22,26,29,32,34,36,39,42,45,47,49,52,54,58]). 丸ノ内線新宿駅池袋方面標準時刻表(10,[01,04,08,12,16,20,24,28,32,36,40,44,48,52,56]). % 丸ノ内線新宿駅池袋方面標準時刻表(11,[01,04,06,13,16,20,25,28,32,37,40,44,49,52,56]). % 丸ノ内線新宿駅池袋方面標準時刻表(12,[01,04,08,13,16,20,25,28,32,37,40,44,49,52,56]). % 丸ノ内線新宿駅池袋方面標準時刻表(13,[01,04,08,13,16,20,25,28,32,37,40,44,49,52,56]). % 丸ノ内線新宿駅池袋方面標準時刻表(14,[01,04,08,13,16,20,25,28,32,37,40,44,49,52,56]). 丸ノ内線新宿駅池袋方面標準時刻表(_何時,_時刻ならび) :- between(11,14,_何時), '11時から14時までの時刻ならび'(1,[3,4,5],_時刻ならび). '11時から14時までの時刻ならび'(N,[],L) :- '11時から14時までの時刻ならび'(N,[3,4,5],L). '11時から14時までの時刻ならび'(N,[M|R2],[]) :- N > 59,!. '11時から14時までの時刻ならび'(N,[M|R2],[N|R3]) :- N2 is N + M, '11時から14時までの時刻ならび'(N2,R2,R3). % 以下のサイトは 'UTF8文字のバイト数'(_第一文字の文字コード,1) :- (between(0x00,0x1f,_第一文字の文字コード);_第一文字の文字コード=0x7f),!. 'UTF8文字のバイト数'(_第一文字の文字コード,1) :- between(0x20,0xbf,_第一文字の文字コード),\+(_第一文字のコード=0x7f),!. 'UTF8文字のバイト数'(_第一文字の文字コード,2) :- between(0xc0,0xdf,_第一文字の文字コード). 'UTF8文字のバイト数'(_第一文字の文字コード,3) :- between(0xe0,0xef,_第一文字の文字コード). 'UTF8文字のバイト数'(_第一文字の文字コード,4) :- between(0xf0,0xf7,_第一文字の文字コード). 'UTF8文字のバイト数'(_第一文字の文字コード,5) :- between(0xf8,0xfb,_第一文字の文字コード). 'UTF8文字のバイト数'(_第一文字の文字コード,6) :- between(0xfc,0xff,_第一文字の文字コード). % 以下のサイトは # # 出典: sandy* ?@vecchio_ciao 5月15日 小3次男の割り算テスト。学校だけに任せておくと大変なことになるよ # :- op(400,yfx,×). 九九のだん(1,[1 × 1 = 1,1 × 2 = 2,1 × 3 = 3,1 × 4 = 4,1 × 5 = 5,1 × 6 = 6,1 × 7 = 7,1 × 8 = 8,1 × 9 = 9]). 九九のだん(2,[2 × 1 = 2,2 × 2 = 4,2 × 3 = 6,2 × 4 = 8,2 × 5 = 10,2 × 6 = 12,2 × 7 = 14,2 × 8 = 16,2 × 9 = 18]). 九九のだん(3,[3 × 1 = 3,3 × 2 = 6,3 × 3 = 9,3 × 4 = 12,3 × 5 = 15,3 × 6 = 18,3 × 7 = 21,3 × 8 = 24,3 × 9 = 27]). 九九のだん(4,[4 × 1 = 4,4 × 2 = 8,4 × 3 = 12,4 × 4 = 16,4 × 5 = 20,4 × 6 = 24,4 × 7 = 28,4 × 8 = 32,4 × 9 = 36]). 九九のだん(5,[5 × 1 = 5,5 × 2 = 10,5 × 3 = 15,5 × 4 = 20,5 × 5 = 25,5 × 6 = 30,5 × 7 = 35,5 × 8 = 40,5 × 9 = 45]). 九九のだん(6,[6 × 1 = 6,6 × 2 = 12,6 × 3 = 18,6 × 4 = 24,6 × 5 = 30,6 × 6 = 36,6 × 7 = 42,6 × 8 = 48,6 × 9 = 54]). 九九のだん(7,[7 × 1 = 7,7 × 2 = 14,7 × 3 = 21,7 × 4 = 28,7 × 5 = 35,7 × 6 = 42,7 × 7 = 49,7 × 8 = 56,7 × 9 = 63]). 九九のだん(8,[8 × 1 = 8,8 × 2 = 16,8 × 3 = 24,8 × 4 = 32,8 × 5 = 40,8 × 6 = 48,8 × 7 = 56,8 × 8 = 64,8 × 9 = 72]). 九九のだん(9,[9 × 1 = 9,9 × 2 = 18,9 × 3 = 27,9 × 4 = 36,9 × 5 = 45,9 × 6 = 54,9 × 7 = 63,9 × 8 = 72,9 × 9 = 81]). '次のわり算の答えは,何のだんの九九を使ってもとめればよいですか。 (1) 21 ÷ 7'(_何のだん,_わり算の答え) :- between(1,9,_何のだん), 九九のだん(_何のだん,_だんの式ならび), member(_何のだん × _わり算の答え = 21,_だんの式ならび). % 以下のサイトは # お題:[B下の端に一本だけ当たりが付いているあみだくじについて、 # 当たりくじを引く手を求めよ。橋と橋の交差はないと仮定する。 # 入力データ:くじの本数num。左から数えた当たりくじの位置mark。各橋の両端のくじの位置(left,right)を上から並べたリスト。 # 'お題:下の端に一本だけ当たりが付いているあみだくじについて、 当たりくじを引く手を求めよ。橋と橋の交差はないと仮定する。 入力データ:くじの本数num。左から数えた当たりくじの位置mark。各橋の両端のくじの位置(left,right)を上から並べたリスト。'(_くじの本数,_当たり) :- あみだくじ(_くじの本数,_当たり). 経路((1,1),(1,2)). 経路((1,2),(1,3)). 経路((1,2),(2,3)). 経路((2,1),(2,2)). 経路((2,2),(2,3)). 経路((2,3),(2,4)). 経路((2,2),(3,2)). 経路((3,1),(3,2)). 経路((3,2),(3,3)). ゴール((1,3)). ゴール((2,4)). ゴール((3,3)). 当たりくじ((2,4)). あみだくじ(_くじの本数,_当たり) :- between(1,_くじの本数,_当たり), 経路((_当たり,1),_次の点), あみだくじ(_次の点). あみだくじ(_現在点) :- ゴール(_現在点),!. あみだくじ(_現在点) :- 次の点(_現在点,_次の点), あみだくじ(_現在点). 次の点(_現在点,_次の点) :- 左から右へ橋を渡る(_現在点,_次の点),!. 次の点(_現在点,_次の点) :- 右から左へ橋を渡る(_現在点,_次の点),!. 次の点(_現在点,_次の点) :- 下方へ移動する(_現在点,_次の点). 左から右へ橋を渡る((X,Y),(X_2,Y_2)) :- 経路((X,Y),(X_2,Y_2)), \+(X = X_2),!. 右から左へ橋を渡る((X,Y),(X_2,Y_2)) :- 経路((X_2,Y_2),(X,Y)), \+(X = X_2),!. 下方へ移動する((X,Y),(X,Y_2)) :- 経路((X,Y),(X,Y_2)), Y_2 > Y. % 以下のサイトは 覆面算(kadokawa+dwango+kada=kandouii,N1+N2+N3=N4,_文字と数字の対応) :- 覆面(kadokawa+dwango+kada=kandouii,L0_1,L0_2,L0_3,L1,L2,L3,L4), 覆面算(L0_3,L0_2), 覆面算計算(L1,L2,L3,L4,N1,N2,N3,N4), 文字と数字の対応(L0_1,L0_2,_文字と数字の対応). 覆面(A_1+A_2+A_3=A_4,L0_1,L0_2,L0_3,L1,L2,L3,L4) :- 文字出現順の決定([A_1,A_2,A_3,A_4],L0_1), findall(N,between(1,9,_),L0_2), L0_3 = ['1','2','3','4','5','6','7','8','9','0'], 覆面文字と変数の対応付け(L0_1,L0_2,A_1,A_2,A_3,A_4,L1,L2,L3,L4). 文字出現順の決定(L,L0_1) :- atomic_list_concat(L,A), atom_chars(A,Chars), 唯一の文字ならびを得る(Chars,L0_1). 要素に重複のない文字ならび(_文字ならび,_要素に重複のない文字ならび) :- findall(_文字,( append(L1,[_文字|_],_文字ならび), \+(member(_文字,L1))), _要素に重複のない文字ならび). 数式の対応付け(L0_1,L0_2,A_1,A_2,A_3,A_4,L1,L2,L3,L4) :- 数式の対応付け(L0_1,L0_2,A_1,L1), 数式の対応付け(L0_1,L0_2,A_2,L2), 数式の対応付け(L0_1,L0_2,A_3,L3), 数式の対応付け(L0_1,L0_2,A_4,L4). 覆面文字と変数の対応付け(L0_1,L0_2,_覆面文字列,_変数ならび) :- atom_chars(_覆面文字列,_覆面文字ならび), findall(V,( nth1(_nth1,_覆面文字ならび,_文字), nth1(_nth1,L0_1,_文字), nth1(_nth1,L0_2,V)), _変数ならび). 覆面算計算(L1,L2,L3,L4,N1,N2,N3,N4) :- number_chars(N1,L1), number_chars(N2,L2), number_chars(N3,L3), number_chars(N4,L4), N1 + N2 + N3 =:= N4. 覆面算(_,[]). 覆面算(L,[A|R2]) :- select(A,L,R), 覆面算(R,R2). 文字と数字の対応(L0_1,L0_2,_文字と数字の対応) :- findall(A=B,( nth1(_nth1,L0_1,A), nth1(_nth1,L0_2,B)), _文字と数字の対応). 唯一の文字ならびを得る([],[]). 唯一の文字ならびを得る([A|R1],[A|R2]) :- \+(member(A,R1)), 唯一の文字ならびを得る(R1,R2). 唯一の文字ならびを得る([A|R1],R2) :- member(A,R1), 唯一の文字ならびを得る(R1,R2). % 以下のサイトは # 出典 :: スレ立てるまでもない質問はここで 135匹目 #894 # # 鶴と亀合わせて頭数にして100いました # 足の数が全部で285ありました # 鶴と亀はそれぞれいくらずついましたか # p.s.全盛期の王貞治が打つ構えだったらしいです # 一本脚の鶴のまじった鶴亀算(_全部の足の数,_鶴と亀合わせて頭数,_鶴の数,_亀の数) :- 全部を亀だと考えよう(_鶴と亀合わせて頭数,_全部亀だとしての足の数), 実際の足の数との差が(_全部亀だとしての足の数,_全部の足の数,_実際の足の数との差), '鶴がまじっていることによって生じた差だから、 一匹一羽の亀と鶴の足数の差で割れば良いのだが、 ここでは一本足の鶴もいる想定だから、 足の差を2と3の組み合せで考える'(_鶴と亀合わせて頭数,_実際の足の数との差,_鶴の数,_亀の数). 全部を亀だと考えよう(_鶴と亀合わせて頭数,_全部亀だとしての足の数) :- _全部亀だとしての足の数 is 4 * _鶴と亀合わせて頭数. 実際の足の数との差が(_全部亀だとしての足の数,_全部の足の数,_実際の足の数との差) :- _実際の足の数との差 is abs(_全部亀だとしての足の数 - _全部の足の数). '鶴がまじっていることによって生じた差だから、 一匹一羽の亀と鶴の足数の差で割れば良いのだが、 ここでは一本足の鶴もいる想定だから、 足の差を2と3の組み合せで考える'(_鶴と亀合わせて頭数,_実際の足の数との差,_鶴の数,_亀の数) :- 二本足と一本足の鶴の数候補を得る(_鶴と亀合わせて頭数,_二本足の鶴の数,_一本足の鶴の数), '実際の足の数との差と一致したら、 鶴の数、亀の数が決まる'(_鶴と亀合わせて頭数,_実際の足の数との差,_二本足の鶴の数,_一本足の鶴の数,_鶴の数,_亀の数). 二本足と一本足の鶴の数候補を得る(_鶴と亀合わせて頭数,_二本足の鶴の数,_一本足の鶴の数) :- between(0,_鶴と亀合わせて頭数,_二本足の鶴の数), between(0,_鶴と亀合わせて頭数,_一本足の鶴の数). '実際の足の数との差と一致したら、 鶴の数、亀の数が決まる'(_鶴と亀合わせて頭数,_実際の足の数との差,_二本足の鶴の数,_一本足の鶴の数,_鶴の数,_亀の数) :- _実際の足の数との差 is (4 - 2) * _二本足の鶴の数 + (4 - 1) * _一本足の鶴の数, _鶴の数 is _二本足の鶴の数 + _一本足の鶴の数, _亀の数 is _鶴と亀合わせて頭数 - _鶴の数. % 以下のサイトは # 出典 :: スレ立てるまでもない質問はここで 135匹目 #894 # # 鶴と亀合わせて頭数にして100いました # 足の数が全部で285ありました # 鶴と亀はそれぞれいくらずついましたか # p.s.全盛期の王貞治が打つ構えだったらしいです # 一本脚の鶴のまじった鶴亀算(_全部の足の数,_鶴と亀合わせて頭数,_鶴の数,_亀の数) :- 全部を亀だと考えよう(_鶴と亀合わせて頭数,_全部亀だとしての足の数), 実際の足の数との差が(_全部亀だとしての足の数,_全部の足の数,_実際の足の数との差), '鶴がまじっていることによって生じた差だから、 一匹一羽の亀と鶴の足数の差で割れば良いのだが、 ここでは一本足の鶴もいる想定だから、 足の差を2と3の組み合せで考える'(_鶴と亀合わせて頭数,_実際の足の数との差,_鶴の数,_亀の数). 全部を亀だと考えよう(_鶴と亀合わせて頭数,_全部亀だとしての足の数) :- _全部亀だとしての足の数 is 4 * _鶴と亀合わせて頭数. 実際の足の数との差が(_全部亀だとしての足の数,_全部の足の数,_実際の足の数との差) :- _実際の足の数との差 is abs(_全部亀だとしての足の数 - _全部の足の数). '鶴がまじっていることによって生じた差だから、 一匹一羽の亀と鶴の足数の差で割れば良いのだが、 ここでは一本足の鶴もいる想定だから、 足の差を2と3の組み合せで考える'(_鶴と亀合わせて頭数,_実際の足の数との差,_鶴の数,_亀の数) :- between(0,_鶴と亀合わせて頭数,_二本足の鶴の数), between(0,_鶴と亀合わせて頭数,_一本足の鶴の数), _実際の足の数との差 is (4 - 2) * _二本足の鶴の数 + (4 - 1) * _一本足の鶴の数, _鶴の数 is _二本足の鶴の数 + _一本足の鶴の数, _亀の数 is _鶴と亀合わせて頭数 - _鶴の数. % 以下のサイトは 'FizzBuzzはやさしい課題です。やさしいからこそどのプログラム言語でも 書けますし、それぞれの言語の特長が微妙に表れます。それで最近好まれる課題です。 課題としてのFizzBuzzは、整数を1からある数まで数え上げて、その数が、 3で割り切れたらFizzを5で割り切れたらBuzzをどちらでも割り切れない時はその数を 表示します。3と5の両数で割り切れる場合はFizzBuzzと続けて表示することになります。 ひとつの数を表示したら改行し、ある数まで表示し終わったら終了します。'(_ある数) :- '整数を1からある数まで数え上げて'(_ある数,_数), '数が、3で割り切れたらFizzを 5で割り切れたらBuzzを どちらでも割り切れない時はその数を'(_数,_Fizzの表示枠,_Buzzの表示枠,_数の表示枠), '表示します。ひとつの数を表示したら改行し、'(_Fizzの表示枠,_Buzzの表示枠,_数の表示枠), 'ある数まで表示し終わったら終了します。'(_ある数,_数). '整数を1からある数まで数え上げて'(_ある数,_数) :- between(1,_ある数,_数). '数が、3で割り切れたらFizzを 5で割り切れたらBuzzを どちらでも割り切れない時はその数を'(_数,_Fizzの表示枠,_Buzzの表示枠,_数の表示枠) :- '数が、3で割り切れたらFizzを'(_数,_Fizzの表示枠), '数が、5で割り切れたらBuzzを'(_数,_Buzzの表示枠), 'どちらでも割り切れない時はその数を'(_数,_数の表示枠). '数が、3で割り切れたらFizzを'(_数,'Fizz') :- 0 is _数 mod 3,!. '数が、3で割り切れたらFizzを'(_,''). '数が、5で割り切れたらBuzzを'(_数,'Buzz') :- 0 is _数 mod 5,!. '数が、5で割り切れたらBuzzを'(_,''). 'どちらでも割り切れない時はその数を'(_数,_数の表示枠) :- \+(0 is _数 mod 3), \+(0 is _数 mod 5), swritef(_数の表示枠,'%t',[_数]),!. 'どちらでも割り切れない時はその数を'(_,''). '表示します。ひとつの数を表示したら改行し、'(_Fizzの表示枠,_Buzzの表示枠,_数の表示枠) :- writef('%w%w%w',[_Fizzの表示枠,_Buzzの表示枠,_数の表示枠]), nl. 'ある数まで表示し終わったら終了します。'(_数,_数). % 以下のサイトは # 出典 :: スレ立てるまでもない質問はここで135匹目 #794" # 100という整数があります # これを25から40の範囲の整数として3等分します # 例 # 30, 30, 40 # 35, 35, 30 # 25, 40, 35 '100という整数があります。これを25から40の範囲の整数として3分割します。'(N1,N2,N3) :- findall(N,between(25,40,N),L), 重複順列(L,3,[N1,N2,N3]), 100 is N1 + N2 + N3. 重複順列(L,0,[]). 重複順列(L,N,[A|R3]) :- N > 0, member(A,L), N_1 is N - 1, 重複順列(L,N_1,R3) . % 以下のサイトは # 出典 :: スレ立てるまでもない質問はここで135匹目 #794" # 100という整数があります # これを25から40の範囲の整数として3等分します # 例 # 30, 30, 40 # 35, 35, 30 # 25, 40, 35 '100という整数があります。これを25から40の範囲の整数として3等分します。'(N1,N2,N3) :- findall(N,between(25,40,N),L), 重複組合せ(L,3,[N1,N2,N3]), 100 is N1 + N2 + N3. 重複組合せ(_候補ならび,1,[A]) :- 要素数が1の場合は候補ならびから順にAを生成して行きます(_候補ならび,A). 重複組合せ([A|_候補ならび],_要素数,[A|_重複組合せ]) :- '候補ならびは変更せずに(重複の所以)生成要素数を減らしながら重複組合せを組み立てます'([A|_候補ならび],_要素数,_重複組合せ). 重複組合せ([_|_候補ならび],_要素数,_重複組合せ) :- 'バックトラックして来たら、候補ならびをひとつずつ減らしながら重複組合せを生成します'(_候補ならび,_要素数,_重複組合せ). 要素数が1の場合は候補ならびから順にAを生成して行きます(_候補ならび,A) :- member(A,_候補ならび). '候補ならびは変更せずに(重複の所以)生成要素数を減らしながら重複組合せを組み立てます'([A|_候補ならび],_要素数,_重複組合せ) :- _要素数 > 1, _要素数_1 is _要素数 - 1, 重複組合せ([A|_候補ならび],_要素数_1,_重複組合せ). 'バックトラックして来たら、候補ならびをひとつずつ減らしながら重複組合せを生成します'(_候補ならび,_要素数,_重複組合せ) :- _要素数 > 1, 重複組合せ(_候補ならび,_要素数,_重複組合せ). % 以下のサイトは # 出典 :: スレ立てるまでもない質問はここで135匹目 #794" # 100という整数があります # これを25から40の範囲の整数として3等分します # 例 # 30, 30, 40 # 35, 35, 30 # 25, 40, 35 '100という整数があります。これを25から40の範囲の整数として3等分します。'(N1,N2,N3) :- findall(N,between(25,40,N),L), 重複組合せ(L,3,[N1,N2,N3]), 100 is N1 + N2 + N3. 重複組合せ(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). % 以下のサイトは # # [1] 授業単元:プログラミングII # [2] 問題文(含コード&リンク): # 課題: #   #include < stdio.h > # int main (void){ # int i; # float taiju[10]={58.6,65.2,74.4,46.0,52.8,62.4,55.0,51.2,54.8,48.4}; # float total,average; # total=0; # # for(i=0;i<10;i++){ # total+=taiju[i]; # } # average=total/10; # printf("Total=%.1f\n",total); # printf("Average=%.1f\n",average); # return 0; # このプログラムを関数にするにはどこをどうしたらいいですか? # } # これをPrologの全く異なったプログラムに作り変えなさい。 # 標本体重(58.6). 標本体重(65.2). 標本体重(74.4). 標本体重(46.0). 標本体重(52.8). 標本体重(62.4). 標本体重(55.0). 標本体重(51.2). 標本体重(54.8). 標本体重(48.4). 標本の体重の合計と相加平均を求める(_標本体重の合計,_標本体重の相加平均) :- 標本体重の合計(_標本体重の合計), 標本体重の相加平均(_標本体重の相加平均). 標本体重の合計(_標本体重の合計) :- 目標から合計値を得る(_体重,標本体重(_体重),_標本体重の合計). 標本体重の相加平均(_標本体重の相加平均) :- 目標から相加平均を得る(_体重,標本体重(_体重),_標本体重の相加平均). 目標から合計値を得る(_集約対象項,_目標,_合計値) :- findall(_集約対象項,_目標,_値ならび), sum_list(_値ならび,_合計値). 目標から相加平均を得る(_集約対象項,_目標,_相加平均) :- findall(_集約対象項,_目標,_値ならび), 相加平均(_値ならび,_相加平均). 相加平均(_値ならび,_相加平均) :- sum_list(_値ならび,_合計値), length(_値ならび,_要素数), _相加平均 is _合計値 / _要素数. % 以下のサイトは # 出典 :: プログラミングのお題スレ part3 #573 # # お題:自然数nが与えられたとき、n桁の自然数で各桁の数のn乗の和が元の数と等しくなるもの(たとえばn=3のとき 370 = 3^3 + 7^3 + 0^3 = 27 + 343 + 0)をすべて求める。 # 例 # n=4 -> 1634 8208 9474 # n=5 -> 54748 92727 93084 # n=8 -> 24678050 24678051 88593477 # '自然数nが与えられたとき、n桁の自然数で各桁の数のn乗の和が元の数と等しくなるもの(たとえばn=3のとき 370 = 3^3 + 7^3 + 0^3 = 27 + 343 + 0)をすべて求める。'(_n,_自然数nが与えられたときn桁の自然数で各桁の数のn乗の和が元の数と等しくなるものをすべて) :- findall(_n桁の自然数,( n桁の自然数で各桁の数のn乗の和と等しくなる(_n,_n桁の自然数)), _自然数nが与えられたときn桁の自然数で各桁の数のn乗の和が元の数と等しくなるものをすべて). n桁の自然数で各桁の数のn乗の和と等しくなるもの(_n,_n桁の自然数) :- n桁の自然数で(_n,_n桁の自然数), 各桁の数のn乗の和と等しくなるもの(_n,_n桁の自然数). n桁の自然数で(_n,_n桁の自然数) :- n桁の自然数の下限と上限(_n,_n桁の自然数下限,_n桁の自然数上限), between(_n桁の自然数下限,_n桁の自然数上限,_n桁の自然数). n桁の自然数の下限と上限(_n,_n桁の自然数下限,_n桁の自然数上限) :- _n桁の自然数下限 is 10 ^ (_n - 1), _n桁の自然数上限 is 10 ^ _n - 1. 各桁の数のn乗の和と等しくなるもの(_n,_n桁の自然数), 各桁の数のn乗の(_n,_n桁の自然数,[],_各桁の数のn乗のならび), 和(_各桁の数のn乗のならび,_n桁の自然数). 和(_数ならび,_和) :- sum_list(_数ならび,_和). 各桁の数のn乗の(_n,0,_各桁の数のn乗のならび,_各桁の数のn乗のならび) :- !. 各桁の数のn乗の(_n,N,L1,_各桁の数のn乗のならび) :- _各桁の数のn乗 is (N mod 10) ^ _n, N_1 is N // 10, 各桁の数のn乗の(_n,N,[_各桁の数のn乗|L1],_各桁の数のn乗のならび) :- % 以下のサイトは # 出典 :: プログラミングのお題スレ part3 #573 # # お題:自然数nが与えられたとき、n桁の自然数で各桁の数のn乗の和が元の数と等しくなるもの(たとえばn=3のとき 370 = 3^3 + 7^3 + 0^3 = 27 + 343 + 0)をすべて求める。 # 例 # n=4 -> 1634 8208 9474 # n=5 -> 54748 92727 93084 # n=8 -> 24678050 24678051 88593477 # '自然数nが与えられたとき、n桁の自然数で各桁の数のn乗の和が元の数と等しくなるもの(たとえばn=3のとき 370 = 3^3 + 7^3 + 0^3 = 27 + 343 + 0)をすべて求める。'(_n,_自然数nが与えられたときn桁の自然数で各桁の数のn乗の和が元の数と等しくなるものをすべて) :- findall(_n桁の自然数,( n桁の自然数で各桁の数のn乗の和と等しくなる(_n,_n桁の自然数)), _自然数nが与えられたときn桁の自然数で各桁の数のn乗の和が元の数と等しくなるものをすべて). n桁の自然数で各桁の数のn乗の和と等しくなるもの(_n,_n桁の自然数) :- n桁の自然数で(_n,_n桁の自然数), 各桁の数のn乗の和と等しくなるもの(_n,_n桁の自然数). n桁の自然数で(_n,_n桁の自然数) :- n桁の自然数の下限と上限(_n,_n桁の自然数下限,_n桁の自然数上限), between(_n桁の自然数下限,_n桁の自然数上限,_n桁の自然数). n桁の自然数の下限と上限(_n,_n桁の自然数下限,_n桁の自然数上限) :- _n桁の自然数下限 is 10 ^ (_n - 1), _n桁の自然数上限 is 10 ^ _n - 1. 各桁の数のn乗の和と等しくなるもの(_n,_n桁の自然数) :- findsum(_各桁の数のn乗,( 各桁の数(_n桁の自然数,_各桁の数), _各桁の数のn乗 is _各桁の数 ^ _n), _n桁の自然数). 各桁の数(N,_各桁の数) :- N > 0, _各桁の数 is N mod 10. 各桁の数(N,_各桁の数) :- N > 0, N_1 is N // 10, 各桁の数(N_1,_各桁の数). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum_list(_値ならび,_合計値). % 以下のサイトは # 出典 :: プログラミングのお題スレ part3 #573 # # お題:自然数nが与えられたとき、n桁の自然数で各桁の数のn乗の和が元の数と等しくなるもの(たとえばn=3のとき 370 = 3^3 + 7^3 + 0^3 = 27 + 343 + 0)をすべて求める。 # 例 # n=4 -> 1634 8208 9474 # n=5 -> 54748 92727 93084 # n=8 -> 24678050 24678051 88593477 # '自然数nが与えられたとき、n桁の自然数で各桁の数のn乗の和が元の数と等しくなるもの(たとえばn=3のとき 370 = 3^3 + 7^3 + 0^3 = 27 + 343 + 0)をすべて求める。'(_n,_自然数nが与えられたときn桁の自然数で各桁の数のn乗の和が元の数と等しくなるものをすべて) :- n桁の自然数の下限と上限(_n,_自然数下限,_自然数上限), findall(_自然数,( between(_自然数下限,_自然数上限,_自然数), n桁の自然数で各桁の数のn乗の和と等しくなる(_n,_自然数)), _自然数nが与えられたときn桁の自然数で各桁の数のn乗の和が元の数と等しくなるものをすべて). n桁の自然数の下限と上限(_n,_n桁の自然数下限,_n桁の自然数上限) :- _n桁の自然数下限 is 10 ^ (_n - 1), _n桁の自然数上限 is 10 ^ _n - 1. n桁の自然数で各桁の数のn乗の和と等しくなる(_n,_自然数) :- findsum(_各桁の数のn乗,( 各桁の数(_自然数,_各桁の数), _各桁の数のn乗 is _各桁の数 ^ _n), _自然数). 各桁の数(N,_各桁の数) :- N > 0, _各桁の数 is N mod 10. 各桁の数(N,_各桁の数) :- N > 0, N_1 is N // 10, 各桁の数(N_1,_各桁の数). % 以下のサイトは # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): # 10000以下の自然数のうち素因数分解を行ったときにその因子の数が最多となる数を求め,その数,因子の数,素因数分解の結果を表示するプログラムを作成して下さい. # # 出力形 # 8192 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 # 因子数:13 # # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C # [4] 期限: 3月30日まで # [5] その他の制限: # ヒントを教授に聞きに行ったら自分で考えろと一蹴されました # よろしくお願いします '10000以下の自然数のうち素因数分解を行ったときにその因子の数が最多となる数を求め,その数,因子の数,素因数分解の結果を表示するプログラムを作成して下さい.' :- '10000以下の素数を求める'(_10000以下の素数ならび), '10000以下の自然数のうち素因数分解を行ったときに'(_10000以下の自然数,_10000以下の素数ならび,_素因子分解ならび), 'その因子の数が最多となる数を求め、'(_素因子分解ならび,_最多因子数), 'その数,因子の数,素因数分解の結果を表示する'(_素因子分解ならび,_最多因子数). '10000以下の自然数のうち素因数分解を行ったときに'(_10000以下の自然数,_10000以下の素数ならび,_素因子分解ならび) :- findall([_10000以下の自然数,_10000の素因子の数,_素因子ならび],( between(1,10000,_10000以下の自然数), '10000の素因子分解'(_10000以下の素数ならび,_素因子ならび), length(_素因子ならび,_10000の素因子の数)), _素因子分解ならび). '10000以下の素数を求める'(_10000以下の素数ならび) :- エラトステネスの篩によって10000以下の素数を求める(_10000以下の素数ならび). エラトステネスの篩によって10000以下の素数を求める(_10000以下の素数ならび) :- findall(N,between(1,10000,N),_10000以下の自然数ならび), エラトステネスの篩(_10000以下の自然数ならび,_10000以下の素数ならび). '10000以下の自然数のうち素因数分解を行ったときに'(_,[],[]) :- !. '10000以下の自然数のうち素因数分解を行ったときに'(M,[N|R1],[N|R2]) :- 0 is M mod N, M_1 is M // N, '10000以下の自然数のうち素因数分解を行ったときに'(M_1,[N|R1],R2). '10000以下の自然数のうち素因数分解を行ったときに'(M,[_|R1],R2) :- '10000以下の自然数のうち素因数分解を行ったときに'(M,R1,R2). 'その因子の数が最多となる数を求め、'(_素因子分解ならび,_最多因子数) :- findmax(_素因子の数,( member([_,_因子の数,_],_素因子分解ならび)), _最多因子数). 'その数,因子の数,素因子分解の結果を表示する'(_素因子分解ならび,_最多因子数) :- forall( member([_数,_最多因子数,_素因子分解の結果],_素因子分解ならび), writef('%t,%t,%t\n',[_数,_最多因子数,_素因子分解の結果])). findmax(_選択項,_評価項,_最大値) :- findall(_選択項,_評価項,_評価ならび), 最大値(_評価ならび,_最大値). 最大値(_ならび,_最大値) :- append(L1,[_最大値|L2],_ならび), ならび要素に最大値を超えるものはない(L1,_最大値), ならび要素に最大値を超えるものはない(L2,_最大値). ならびの要素に最大値を超えるものはない(_ならび,_最大値) :- \+((member(_要素,_ならび),_要素 @> _最大値)). エラトステネスの篩([],[]) :- !. エラトステネスの篩([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://pc12.2ch.net/test/read.cgi/tech/1136994325/954 # pascal pcpad # 1個の自然数nを適当に決めて、nチームが参加する # リーグ戦の全試合を表示するプログラムを書きなさい。 '1個の自然数nを適当に決めて、nチームが参加するリーグ戦の全試合を表示する' :- '1個の自然数nを適当に決めて、'(_n), 'nチームが参加するリーグ戦の全試合を表示する'(_n). '1個の自然数nを適当に決めて、'(_n) :- _n is random(16) + 3. 'nチームが参加するリーグ戦の全試合を表示する'(_n) :- 'nチームが参加する'(_n,_nチームが参加する), forall( リーグ戦の全試合を(_nチームが参加する,_チーム番号_1,_チーム番号_2), 表示する(_チーム番号_1,_チーム番号_2)). 'nチームが参加する'(_n,_nチームが参加する) :- findall(M,between(1,_n,M),_nチームが参加する). リーグ戦の全試合を(_nチームが参加する,_チーム番号_1,_チーム番号_2) :- 組合せ(_nチームが参加する,2,[_チーム番号_1,_チーム番号_2]). 組合せ(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). 表示する(_チーム番号_1,_チーム番号_2) :- チーム(_チーム番号_1,_チーム名_1), チーム(_チーム番号_2,_チーム名_2), writef('%t-%t\n',[_チーム名_1,_チーム名_2]). チーム(1,サンフレッチェ広島). チーム(2,'横浜F・マリノス'). チーム(3,川崎フロンターレ). チーム(4,セレッソ大阪). チーム(5,鹿島アントラーズ). チーム(6,浦和レッズ). チーム(7,アルビレックス新潟). チーム(8,'FC東京'). チーム(9,清水エスパルス). チーム(10,柏レイソル). チーム(11,名古屋グランパス). チーム(12,サガン鳥栖). チーム(13,ベガルタ仙台). チーム(14,大宮アルディージャ). チーム(15,ヴァンフォーレ甲府). チーム(16,湘南ベルマーレ). チーム(17,ジュビロ磐田). チーム(18,大分トリニータ). % 以下のサイトは mecab(文,_文,LL) :- tmpnam(TMPNAM), tell(TMPNAM), writef('%t\n',[_文]), told, mecab(TMPNAM,LL). mecab(_ファイル,LL) :- atomic_list_concat(['cat ',_ファイル,' | mecab'],S), sh(S,LL_1), findall([S1,S3],( member([U|_],LL_1), sub_atom(U,_,_,_,S1,'\t',S3,_,_,_)), LL). 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). 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). mecab(_ファイル,LL) :- atomic_list_concat(['cat ',_ファイル,' | mecab'],S), sh(S,LL_1), findall([S1,S3],( member([U|_],LL_1), sub_atom(U,S1,'\t',S3)), LL). sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y), split(V,[' ',','],U)), X). split(_文字列,_区切り文字ならび,L) :- atom_chars(_文字列,_文字ならび), split_list(_文字ならび,_区切り文字ならび,L). split_list([],_,[]). split_list(L1,_区切り文字ならび,[_文字列|R]) :- split_list_2(_区切り文字ならび,L1,_文字列), split_list(L3,_区切り文字ならび,R),!. split_list(L1,_区切り文字ならび,[_文字列]) :- atom_chars(_文字列,L1). split_list_2(_区切り文字ならび,L,_文字列,L3) :- append(L1,L2,L3,L), member(_区切り文字,_区切り文字ならび), split_list_3(_区切り文字,L1,L2,L3), atom_chars(_文字列,L1),!. split_list_3(_区切り文字,L1,L2,L3) :- all(L2,_区切り文字), \+(append(_,[_区切り文字],L1)), \+(L3 = [_区切り文字|_]),!. tmpnam(TMPNAM) :- 'TMPNAM'(TMPNAM), \+(exist_file(TMPNAM)),!. tmpnam(TMPNAM) :- tmpnam(TMPNAM). 'TMPNAM'(TMPNAM) :- '英小文字大文字数字からなる6要素の文字ならび'(_6要素の文字ならび), atomic_list_concat(['/tmp/file'|_6要素の文字ならび],TMPNAM). '英小文字大文字数字からなる6要素の文字ならび'(_6要素の文字ならび) :- findall(_任意の文字,( between(1,6,_), '英小文字大文字数字から任意の文字'(_任意の文字)), _6要素の文字ならび). '英小文字大文字数字から任意の文字'(_任意の文字) :- _文字コード is random(75) + 48, '文字コード48-122の範囲で記号のコードではない'(_文字コード), char_code(_任意の文字,_文字コード),!. '英小文字大文字数字から任意の文字'(_任意の文字) :- '英小文字大文字数字から任意の文字'(_任意の文字). '文字コード48-122の範囲で記号のコードではない'(_文字コード) :- '文字コード範囲58-64ではない'(_文字コード), '文字コード範囲91-96ではない'(_文字コード). '文字コード範囲58-64ではない'(_文字コード) :- \+((_文字コード>=58,_文字コード=<64)). '文字コード範囲91-96ではない'(_文字コード) :- \+((_文字コード>=91,_文字コード=<96)). sub_atom(A,H,X,T) :- atom(A), sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), sub_atom(A,_,R,0,T). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1392388003/270 # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):入力した1桁の整数を行数と解釈し、その後、その行数分だけキーボードから入力された # 文字をディスプレイに出力する。 # [条件1]整数(行数)入力にはgetchar関数を使用する。 # [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。 # [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。 # [3] 環境 #  [3.1] OS:Windows7 #  [3.2] コンパイラ名とバージョン:gcc 3.4 #  [3.3] 言語: C # [4] 期限:2014/03/30 '入力した1桁の整数を行数と解釈し、その後、その行数分だけキーボードから入力された文字をディスプレイに出力する。 [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。' :- '入力した1桁の整数を行数と解釈し、 [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_行数), 'その後、', 'その行数分だけキーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。'(_行数),!. '入力した1桁の整数を行数と解釈し、 [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_行数) :- '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数), 行数と解釈し(_入力した1桁の整数,_行数). '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数) :- '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。'(_入力した1桁の整数),!. '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数) :- write('Input error 再入力をお願いします\n'), '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。 [条件3]入力された整数(行数)が、不正(整数でないまたは2桁以上の整数)の場合は、"Input error"と表示する。'(_入力した1桁の整数). '入力した1桁の整数を [条件1]整数(行数)入力にはgetchar関数を使用する。'(_入力した1桁の整数) :- 行入力(_行文字列), get_term_from_atom(_行文字列,_入力した1桁の整数,[]), integer(_入力した1桁の整数), number_chars(_入力した1桁の整数,[_]),!. 行数と解釈し(_入力した1桁の整数,_行数) :- _入力した1桁の整数 = _行数. 'その後、'. 'その行数分だけキーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。'(_行数) :- reawmode, between(1,_行数,_行目), 'キーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。', _行目 = _行数, norawmode. 'キーボードから入力された文字をディスプレイに出力する。 [条件2]行数入力後の文字入出力にはgetchar関数とputchar関数を使用する。' :- repeat, get_char(_文字), put_char(_文字), _文字 = '\n',!. 行入力(_行文字列) :- get_char(_文字), 行文字ならび(_文字,_行文字ならび), atom_chars(_行文字列,_行文字ならび). 行文字ならび(end_of_file,[]) :- !. 行文字ならび('\n',[]) :- !. 行文字ならび(_文字,[_文字|R]) :- get_char(_次の文字), 行文字ならび(_次の文字,R). rawmode :- shell('stty raw -echo',_). norawmode :- shell('stty -raw echo',_). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/300 # お題:次のような規則の配列でインデックス番号iの配列の値を求める。 # ・インデックス番号1の配列の値A(1)は1である。 # ・配列の値は昇順である。 # ・インデックス番号iの配列の値A(i)は配列内のiの個数である。 # 例 # A(10) -> 4 # A(100) -> 14 # A(1000) -> 45 # '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_i,X) :- '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'([],2,_i,2,_a), nth1(_i,_a,X). '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_a,_インデッスク,_i,_繰り返し数_1,_a) :- _インデックス > _i,!. '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_a_1,_インデッスク,_i,_繰り返し数_1,_a) :- 繰り返し数_1から繰り返し個数を求めてインデックス列を登録する(_a_1,_インデックス,_繰り返し数_1,_次のインデックス,_繰り返し数_2,_a_2), '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_a_2,_次のインデックス,_i,_繰り返し数_2,_a). 繰り返し数_1から繰り返し数を求めてインデックス列を登録する(_a_1,_インデックス,_繰り返し数_1,_次のインデックス,_繰り返し数_2,_a) :- 繰り返し個数を得る(_a_1,_繰り返し数_1,_繰り返し数), _次のインデックス is _インデックス + _繰り返し数, インデッスク列の生成(_インデックス,_繰り返し数,L), _繰り返し数_2 is _繰り返し数_1 + 1, append(_a_1,L,_a),!. 繰り返し数を得る(_a,N,M) :- nth1(N,_a,M),!. 繰り返し数を得る(_,N,N). インデッスク列の生成(_インデックス,_繰り返し数,L) :- _インデックス_2 is _インデックス + _繰り返し数 - 1, findall(N,( between(_インデックス,_インデックス_2,N)), L). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/300 # お題:次のような規則の配列でインデックス番号iの配列の値を求める。 # ・インデックス番号1の配列の値A(1)は1である。 # ・配列の値は昇順である。 # ・インデックス番号iの配列の値A(i)は配列内のiの個数である。 # 例 # A(10) -> 4 # A(100) -> 14 # A(1000) -> 45 # :- dynamic(a/2). a(1,1). '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_i,X) :- '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(2,_i,2), a(_i,X). '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_インデッスク,_i,_繰り返し数_1) :- _インデックス > _i,!. '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_インデッスク,_i,_繰り返し数_1) :- 繰り返し数_1から繰り返し個数を求めてインデックス列を登録する(_インデックス,_繰り返し数_1,_次のインデックス,_繰り返し数_2), '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_次のインデックス,_i,_繰り返し数_2). 繰り返し数_1から繰り返し数を求めてインデックス列を登録する(_インデックス,_繰り返し数_1,_次のインデックス,_繰り返し数_2) :- 繰り返し個数を得る(_繰り返し数_1,_繰り返し数), _次のインデックス is _インデックス + _繰り返し数, インデッスク列の生成(_インデックス,_繰り返し数), _繰り返し数_2 is _繰り返し数_1 + 1. 繰り返し数を得る(N,M) :- a(N,M),!. 繰り返し数を得る(N,N). インデッスク列の生成(_インデックス,_繰り返し数) :- _インデックス_2 is _インデックス + _繰り返し数 - 1, forall(between(_インデックス,_インデックス_2,N),assertz(a(N,_繰り返し数))). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/282 # お題:1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 # のこりの数からとりのぞいた2個の数を求める。 # 例 # 3,1,2,6 -> 4,5 # # '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 のこりの数からとりのぞいた2個の数を求める。'(_n,_とりのぞいた数_1,_とりのぞいた数_2) :- '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数), 'のこりの数からとりのぞいた2個の数を求める。'(1,_2個をとりのぞいたのこりの数,[],[_とりのぞいた数_1,_とりのぞいた数_2]). '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数) :- '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数), シャッフルして(_n,_1からnのn個の連続した整数,_シャッフルした1からnのn個の連続した整数), '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数). '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数) :- findall(M,between(1,_n,M),_1からnのn個の連続した整数). シャッフルして(_n,L1,L2) :- シャッフルして(1000,_n,L1,L2),!. シャッフルして(0,_,L,L). シャッフルして(M,_n,L1,L) :- R is random(_n) + 1, select(R,L1,L2), M_1 is M - 1, シャッフルして(M_1,_n,[R|L2],L). '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :- _シャッフルした1からnのn個の連続した整数=[_,_|_2個をとりのぞいたのこりの数]. 'のこりの数からとりのぞいた2個の数を求める。'(_,_,L,L) :- length(L,2),!. 'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :- select(_n,L1,L1_2),!, _n_2 is _n + 1, 'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1_2,L2,L). 'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :- _n_2 is _n + 1, 'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1,[_n|L2],L). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/282 # お題:1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 # のこりの数からとりのぞいた2個の数を求める。 # 例 # 3,1,2,6 -> 4,5 # # '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 のこりの数からとりのぞいた2個の数を求める。'(_n,_とりのぞいた数_1,_とりのぞいた数_2) :- '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数), 'のこりの数からとりのぞいた2個の数を求める。'(1,_2個をとりのぞいたのこりの数,[],[_とりのぞいた数_1,_とりのぞいた数_2]). '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数) :- '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数), シャッフルして(_n,_1からnのn個の連続した整数,_シャッフルした1からnのn個の連続した整数), '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数). '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数) :- findall(M,between(1,_n,M),_1からnのn個の連続した整数). シャッフルして(_n,L1,L2) :- シャッフルして(1000,_n,L1,L2),!. シャッフルして(0,_,L,L). シャッフルして(M,_n,L1,L) :- R is random(_n) + 1, select(R,L1,L2), M_1 is M - 1, シャッフルして(M_1,_n,[R|L2],L). '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :- 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[],[_数_1,_数_2]), 'とりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数). 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[A,B],[A,B]) :- !. 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,L1,L) :- 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数), 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[_適当に選んだ数|L1],L). 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数) :- length(_シャッフルした1からnのn個の連続した整数,Len), R1 is random(Len), nth0(R1,_シャッフルした1からnのn個の連続した整数,_適当に選んだ数), \+(member(_適当に選んだ数,L1)),!. 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数) :- 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数). 'とりのぞく。'(_数_1,_数_2,_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :- select(_数_1,_シャッフルした1からnのn個の連続した整数,L1), select(_数_2,L1,_2個をとりのぞいたのこりの数). 'のこりの数からとりのぞいた2個の数を求める。'(_,_,L,L) :- length(L,2),!. 'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :- select(_n,L1,L1_2),!, _n_2 is _n + 1, 'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1_2,L2,L). 'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :- _n_2 is _n + 1, 'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1,[_n|L2],L). % 以下のサイトは 横向きに星のピラミッドを描く(_ピラミッドの頂点の高さ) :- 横向きに星のピラミッドを描く(1,_ピラミッドの頂点の高さ). 横向きに星のピラミッドを描く(_ピラミッドの頂点の高さ,_ピラミッドの頂点の高さ) :- 星で行表示する(_ビラミッドの頂点の高さ),!. 横向きに星のピラミッドを描く(N,_ピラミッドの頂点の高さ) :- 星で行表示する(N), N_2 is N + 1, 横向きに星のピラミッドを描く(N_2,_ピラミッドの頂点の高さ), 星で行表示する(N). 星で行表示する(_表示する星の数) :- findall(*,between(1,_表示する星の数,_),L), atomic_list_concat(L,A), writef('%t\n',[A]). % 以下のサイトは 'for/3を使って横向きに星のピラミッドを描く'(_ピラミッドの頂点の高さ) :- for(1,_表示する星の数,_ピラミッドの頂点の高さ), 星で行表示する(_表示する星の数), fail. 'for/3を使って横向きに星のピラミッドを描く'(_ピラミッドの頂点の高さ) :- for(_ピラミッドの頂点の高さ-1,_表示する星の数,1), 星で行表示する(_表示する星の数), _ピラミッドの頂点の高さ = 1. 星で行表示する(_表示する星の数) :- for(1,M,_表示する星の数), 星を一個表示する, M = _表示する星の数, 改行する. 星を一個表示する :- put_char(*). 改行する :- nl. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % for ループ % % ?- for(1,N,3),writef('%t\n',[N]),N=3. % 1 % 2 % 3 % for(S,N,E) :- E >= S, for_2(S,N,E). for(S,N,E) :- E < S, for_1(S,N,E). for_1(S,_,E) :- S < E,!,fail. for_1(N,N,E). for_1(S,N,E) :- S1 is S - 1, for_1(S1,N,E). for_2(S,_,E) :- S > E,!,fail. for_2(N,N,E). for_2(S,N,E) :- S1 is S + 1, for_2(S1,N,E). % 以下のサイトは 'for/3を使って横向きに星のピラミッドを描く'(_ピラミッドの頂点の高さ) :- ビラミッドの頂点までを描く(_ピラミッドの頂点の高さ), ピラミッドの頂点から後を描く(_ピラミッドの頂点の高さ). ビラミッドの頂点までを描く(_ピラミッドの頂点の高さ) :- for(1,_表示する星の数,_ピラミッドの頂点の高さ), 星で行表示する(_表示する星の数), _表示する星の数 = _ピラミッドの頂点の高さ. ピラミッドの頂点から後を描く(_ビラミッドの頂点の高さ) :- for(_ピラミッドの頂点の高さ-1,_表示する星の数,1), 星で行表示する(_表示する星の数), _表示する星の数 = 1. 星で行表示する(_表示する星の数) :- for(1,M,_表示する星の数), 星を一個表示する, M = _表示する星の数, 改行する. 星を一個表示する :- put_char(*). 改行する :- nl. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % for ループ % % ?- for(1,N,3),writef('%t\n',[N]),N=3. % 1 % 2 % 3 % for(S,N,E) :- E >= S, for_2(S,N,E). for(S,N,E) :- E < S, for_1(S,N,E). for_1(S,_,E) :- S < E,!,fail. for_1(N,N,E). for_1(S,N,E) :- S1 is S - 1, for_1(S1,N,E). for_2(S,_,E) :- S > E,!,fail. for_2(N,N,E). for_2(S,N,E) :- S1 is S + 1, for_2(S1,N,E). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1392388003/31 # [1] プログラミング言語 入門 # [2] 変数を入力して、入力された値と以下の条件を満たした値を表示する # # 1 : 6の倍数なら2で割った値 # 2 : 3の倍数なら二乗した値 # 3: 2の倍数なら2で割った値 # 4: 上記以外の倍数は、二乗した値から元の値を引いた値 # ☆ 複数の条件が合致した場合は大きい倍数の条件のみとする # ☆ 自作で関数を1つは作成する # # なにとぞよろしくお願いします。 # # '変数を入力して、入力された値と以下の条件を満たした値を表示する 1 : 6の倍数なら2で割った値 2 : 3の倍数なら二乗した値 3: 2の倍数なら2で割った値 4: 上記以外の倍数は、二乗した値から元の値を引いた値 ☆ 複数の条件が合致した場合は大きい倍数の条件のみとする'(_入力された値) :- findall([_倍数,_条件を満たした値候補],'変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,_倍数,_条件を満たした値候補),LL), '☆ 複数の条件が合致した場合は大きい倍数の条件のみとする'(LL,_条件を満した値), 表示する(_入力された値,_条件を満たした値). '変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,6,_6の倍数なら2で割った値) :- '1 : 6の倍数なら2で割った値'(_入力された値,_6の倍数なら2で割った値). '変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,3,_3の倍数なら二乗した値) :- 2 : 3の倍数なら二乗した値'(_入力された値,_3の倍数なら二乗した値). '変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,2,_2の倍数なら2で割った値) :- '3: 2の倍数なら2で割った値'(_入力された値,_2の倍数なら2で割った値). '変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,_倍数,_二乗した値から元の値を引いた値) :- '4: 上記以外の倍数は、二乗した値から元の値を引いた値'(_入力された値,_倍数,_二乗した値から元の値を引いた値). '1 : 6の倍数なら2で割った値'(_入力された値,_2で割った値) :- '6の倍数なら'(_入力された値), '2で割った値'(_入力された値,_2で割った値). '6の倍数なら'(_入力された値) :- 0 is _入力された値 mod 6. '2で割った値'(_入力された値,_2で割った値) :- _2で割った値 is _入力された値 // 2. '2 : 3の倍数なら二乗した値'(_入力された値,_二乗した値) :- '3の倍数なら'(_入力された値), 二乗した値(_入力された値,_二乗した値). '3の倍数なら'(_入力された値) :- 0 is _入力された値 mod 3. 二乗した値(_入力された値,_二乗した値) :- _二乗した値 is _入力された値 ^ 2. '3: 2の倍数なら2で割った値'(_入力された値,_2で割った値) :- '2の倍数なら'(_入力された値), '2で割った数'(_入力された値,_2で割った値). '2の倍数なら'(_入力された値) :- 0 is _入力された値 mod 2. '2で割った値'(_入力された値,_2で割った値) :- _2で割った値 is _入力された値 // 2. '4: 上記以外の倍数は、二乗した値から元の値を引いた値'(_入力された値,_倍数,_二乗した値から元の値を引いた値) :- '上記以外の倍数は、'(_入力された値,_倍数), 二乗した値から元の値を引いた値(_入力された値,_二乗した値から元の値を引いた値). '上記以外の倍数は、'(_入力された値,_倍数) :- between(1,_入力された値,_倍数), \+(0 is _倍数 mod 6), \+(0 is _倍数 mod 3), \+(0 is _倍数 mod 2), 0 is _入力された値 mod _倍数. 二乗した値から元の値を引いた値'(_入力された値,_二乗した値から元の値を引いた値) :- _二乗した値から元の値を引いた値 is _入力された値 ^ 2 - _入力された値. '☆ 複数の条件が合致した場合は大きい倍数の条件のみとする'(LL,_条件を満たした値) :- 最大値(LL,[_最も大きい倍数,_条件を満たした値]). 表示する(_入力された値,_条件を満たした値) :- writef('入力された値=%t,条件を満たした値=%t\n',[_入力された値,_条件を満たした値]). 最大値([A|R],_最大値) :- 最大値([A|R],A,_最大値),!. 最大値([],_最大値,_最大値). 最大値([A|R],B,_最大値) :- A @> B, 最大値(R,A,_最大値). 最大値([A|R],B,_最大値) :- A @=< B, 最大値(R,B,_最大値). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/170 # お題:分母が自然数m以下の既約分数で0より大きく1より小さいものを小さい順にならべる。 # m=3 -> 1/3,1/2,2/3 # m=5 -> 1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4/5 # # '分母が自然数m以下の既約分数で0より大きく1より小さいものを小さい順にならべる。'(_m,_整列した分数ならび) :- findall(_分子 rdiv _分母,分母ごとの既約分数(_m,_分母,_分子),_分数ならび), sort(_分数ならび,_整列した分数ならび). 分母ごとの既約分数(_m,_分母,_分子) :- between(2,_m,_分母), 分子候補を篩に掛ける(2,_分母,_篩に掛けられた分子ならび), member(_分子,_篩に掛けられた分子ならび). 分子候補を篩に掛ける(M,_分母,_篩に掛けられた分子ならび) :- 分子候補を生成(_分母,_数ならび), 分子候補を篩に掛ける(M,_分母,_数ならび,_篩に掛けられた分子ならび). 分子候補を生成(_分母,_数ならび) :- succ(_分母_1,_分母), findall(N,between(1,_分母_1,N),_数ならび). 分子候補を篩に掛ける(_分母,_分母,_篩に掛けられた分子ならび,_篩に掛けられた分子ならび) :- !. 分子候補を篩に掛ける(M,_分母,_数ならび_1,_篩に掛けられた分子ならび) :- 'Mが2から分母になるまで分子候補を篩に掛ける'(M,_分母,_数ならび_1,_篩に掛けられた分子ならび). 'Mが2から分母になるまで分子候補を篩に掛ける'(M,_分母,_数ならび_1,_篩に掛けられた分子ならび) :- 'Mの篩'(M,_分母,_数ならび_1,_数ならび_2), succ(M,M_2), 分子候補を篩に掛ける(M_2,_分母,_数ならび_2,_篩に掛けられた分子ならび). 'Mの篩'(M,_分母,_数ならび_1,_数ならび_2) :- findall(_分子候補,分子候補(M,_分母,_数ならび_1,_分子候補),_数ならび_2). 分子候補(M,_分母,_数ならび_1,_分子候補) :- member(_分子候補,_数ならび_1), 約分できない(M,_分母,_分子候補). 約分できない(M,_分母,_分子候補) :- \+(約分できる(M,_分母,_分子候補)). 約分できる(M,_分母,_分子候補) :- 0 is _分母 mod M, 0 is _分子候補 mod M. % 以下のサイトは % % カレンダー矩形/3 % '年カレンダー'(_年) :- 横並びカレンダーを表示する(_年,[1,2,3]), 横並びカレンダーを表示する(_年,[4,5,6]), 横並びカレンダーを表示する(_年,[7,8,9]), 横並びカレンダーを表示する(_年,[10,11,12]). 横並びカレンダーを表示する(_年,_月ならび) :- 月カレンダーを直列する(_年,_月ならび,LL1), 見出し表示(_年,_月ならび), カレンダー行の表示(LL2). 月カレンダーを直列する(_,[],[]). 月カレンダーを直列する(_年,[_月|R],LL) :- カレンダー矩形(_年,_月,LL1), 月カレンダーを直列する(_年,R,LL2), append(LL1,LL2,LL). 見出し表示(_年,_月ならび) :- write('\n'), forall(member(_月,_月ならび),writef('%6c%4r年 %2r月%8c')), write('\n\n'). カレンダー行の表示(_月カレンダー矩形ならび) :- between(1,7,_行), forall(member(_月カレンダー矩形,_月カレンダー矩形ならび), 週表示(_行,_月カレンダー矩形)), write('\n'), _行 = 7,!. 週表示(_行,_月カレンダー矩形) :- nth1(_行,_月カレンダー矩形,[_1,_2,_3,_4,_5,_6,_7]), writef('%3r%3r%3r%3r%3r%3r%3r ',[_1,_2,_3,_4,_5,_6,_7]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/103 # お題:与えられた年月のカレンダーを表示せよ。 # '与えられた年月のカレンダーを表示せよ。'(_年,_月) :- カレンダー矩形(_年,_月,_カレンダー矩形), カレンダーを表示する(_年,_月,_カレンダー矩形). カレンダー矩形(_年,_月,_カレンダー矩形) :- '1日の曜日を表す値'(_年,_月,_1日の曜日を表す値), 月末日(_年,_月,_月末日), 日付を埋めて週カレンダーならびを作る(_1日の曜日を表す値,_月末日,_カレンダー矩形). '1日の曜日を表す値'(_年,_月,_曜日を表す値) :- 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,1,_曜日を表す値,_). 'Zellerの公式'(_年,_月,_日,_曜日を表す値) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7. 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, 'Zellerの公式'(_年,_月,_日,_曜日を表す値), 'Zellerの公式で曜日を表す値と曜日'(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 'Zellerの公式で曜日を表す値と曜日'(0,日曜). 'Zellerの公式で曜日を表す値と曜日'(1,月曜). 'Zellerの公式で曜日を表す値と曜日'(2,火曜). 'Zellerの公式で曜日を表す値と曜日'(3,水曜). 'Zellerの公式で曜日を表す値と曜日'(4,木曜). 'Zellerの公式で曜日を表す値と曜日'(5,金曜). 'Zellerの公式で曜日を表す値と曜日'(6,土曜). 月末日(_年,2,29) :- うるう年(_年),!. 月末日(_年,2,28) :- !. 月末日(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). 月末日(_,_月,30) :- member(_月,[4,6,9,11]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- \+(0 is _年 mod 100),!. うるう年(_年) :- 0 is _年 mod 4. 日付を埋めて週カレンダーならびを作る(_1日の曜日を表す値,_月末日,_週カレンダーならび) :- 日付を埋める(_1日の曜日を表す値,_月末日,_42日分の日枠), 週ごとに折り返す(_42日分の日枠,_週カレンダーならび). 日付を埋める(_1日の曜日を表す値,_月末日,_42日分の日枠) :- findall(A,( between(1,42,N), _日付 is N - _1日の曜日を表す値, 日付か空白を選択(_日付,_月末日,A)), _42日分の日枠). 日付か空白を選択(_日付,_月末日,' ') :- _日付 < 0,!. 日付か空白を選択(_日付,_月末日,' ') :- _日付 > _月末日,!. 日付か空白を選択(_日付,_月末日,_日付). 週ごとに折り返す([],[]). 週ごとに折り返す([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- 週ごとに折り返す(R1,R2). カレンダーを表示する(_年,_月,_週カレンダーならび) :- カレンダーの年月を表示する(_年,_月), カレンダーの日付部を表示する(_週カレンダーならび). カレンダーの年月を表示する(_年,_月) :- writef('\n%10R年%3R月 \n\n',[_年,_月]). カレンダーの日付部を表示する([]) :- !. カレンダーの日付部を表示する([_週カレンダー|R]) :- writef('%3R%3R%3R%3R%3R%3R%3R\n',_週カレンダー), カレンダーの日付部を表示する(R). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 # お題: # n=1のとき # 01 # 10 # # n=2のとき # 0011 # 0011 # 1100 # 1100 # # n=3のとき # 000111 # 000111 # 000111 # 111000 # 111000 # 111000 # # を表示する。 'n=1のとき 01 10 n=2のとき 0011 0011 1100 1100 n=3のとき 000111 000111 000111 111000 111000 111000 を表示する。'(_n) :- 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n). 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n) :- 'n個の数字0の後、n個の数字1を一行としてn行表示し、'(_n). 'n個の数字1の後、n個の数字0を一行としてn行表示する'(_n). 'n個の数字0の後、n個の数字1を一行としてn行表示し、'(_n) :- n個の数字0で構成されたアトム(_n,_0), n個の数字1で構成されたアトム(_n,_1), n行表示する(_n,_0,_1). 'n個の数字1の後、n個の数字0を一行としてn行表示する'(_n) :- n個の数字0で構成されたアトム(_n,_0), n個の数字1で構成されたアトム(_n,_1), n行表示する(_n,_1,_0). n個の数字0で構成されたアトム(_n,_0) :- length(L,_n), ならびの構成要素は全て数字0である(L), atomic_list_concat(L,_0). ならびの構成要素は全て数字0である([]). ならびの構成要素は全て数字0である(['0'|R]) :- ならびの構成要素は全て数字0である(R). n個の数字1で構成されたアトム(_n,_1) :- length(L,_n), ならびの構成要素は全て数字1である(L), atomic_list_concat(L,_1). ならびの構成要素は全て数字1である([]). ならびの構成要素は全て数字1である(['1'|R]) :- ならびの構成要素は全て数字1である(R). n行表示する(_n,A,B) :- forall(between(1,_n,_),writef('%t%t\n',[A,B])). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 # お題: # n=1のとき # 01 # 10 # # n=2のとき # 0011 # 0011 # 1100 # 1100 # # n=3のとき # 000111 # 000111 # 000111 # 111000 # 111000 # 111000 # # を表示する。 'n=1のとき 01 10 n=2のとき 0011 0011 1100 1100 n=3のとき 000111 000111 000111 111000 111000 111000 を表示する。'(_n) :- 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n). 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n) :- 'n個の数字0で構成されたアトム'(_n,_0), 'n個の数字1で構成されたアトム'(_n,_1), 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n,_0,_1). 'n個の数字0で構成されたアトム'(_n,_0) :- length(L,_n), ならびの構成要素は全て数字0である(L), atomic_list_concat(L,_0). ならびの構成要素は全て数字0である([]). ならびの構成要素は全て数字0である(['0'|R]) :- ならびの構成要素は全て数字0である(R). 'n個の数字1で構成されたアトム'(_n,_1) :- length(L,_n), ならびの構成要素は全て数字1である(L), atomic_list_concat(L,_1). ならびの構成要素は全て数字1である([]). ならびの構成要素は全て数字1である(['1'|R]) :- ならびの構成要素は全て数字1である(R). 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n,_0,_1) :- 'n個の数字0の後、n個の数字1を一行としてn行表示し、'(_n,_0,_1), 'n個の数字1の後、n個の数字0を一行としてn行表示する'(_n,_0,_1). 'n個の数字0の後、n個の数字1を一行としてn行表示し、'(_n,_0,_1) :- forall(between(1,_n,_),writef('%t%t\n',[_0,_1])). 'n個の数字1の後、n個の数字0を一行としてn行表示する'(_n,_0,_1) :- forall(between(1,_n,_),writef('%t%t\n',[_1,_0])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/69 # お題: # n=1のとき # 01 # 10 # # n=2のとき # 0011 # 0011 # 1100 # 1100 # # n=3のとき # 000111 # 000111 # 000111 # 111000 # 111000 # 111000 # # を表示する。 # # ブロックを表示する(_n,LL) :- '_n * _n のブロックを生成する'(_n,0,1,LL1), '_n * _n のブロックを生成する'(_n,1,0,LL2), 表示する(LL1,LL2). '_n * _n のブロックを生成する'(_n,A,B,LL) :- findall(L,( all(_n,L1,A), all(_n,L2,B), between(1,_n,_), append(L1,L2,L)), LL). all(0,[],_) :- !. all(N,[A|R],A) :- N_1 is N - 1, all(N_1,R,A). 表示する(LL1,LL2) :- forall(member(L1,LL1),(atomic_list_concat(L1,A),writef('%t\n',[A]))), forall(member(L2,LL2),(atomic_list_concat(L2,B),writef('%t\n',[B]))), % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/990 # お題:円周率の歴史の長さからみれば出来立てほやほやのBBPの式を使って # 円周率を小数点以下15桁まで求める。 #   ∞ # π=Σ(4/(8*k+1)-1/(4*k+2)-1/(8*k+5)-1/(8*k+6))/(16^k) #   k=0 # # '円周率の歴史の長さからみれば出来立てほやほやのBBPの式を使って円周率を小数点以下15桁まで求める。'(_円周率) :- 'BBPの式'(_円周率_1), sformat(S,'~15f',[_円周率_1]), read_term_from_atom(S,_円周率,[]). 'BBPの式'(_円周率) :- findsum(A,( between(0,20,_k), A is (4/(8*_k+1)-1/(4*_k+2)-1/(8*_k+5)-1/(8*_k+6))/(16^_k)), _円周率). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/955 # お題:自然数nの階乗の素因数2の個数を求める。(2014年センター試験) # n=5 -> 3 # n=13 -> 10 # # '自然数nの階乗の素因数2の個数を求める。(2014年センター試験)'(_n,_自然数nの階乗の素因数2の個数) :- findsum(_素因数2の個数,( between(1,_n,N), findsum(1,( nth1(_nth1,_,_), (\+(0 is N mod (2 ^ _nth1)),!,fail;true)), _素因数2の個数)), _自然数nの階乗の素因数2の個数). findsum(A,B,C) :- findall(A,B,L), sumlist(L,C). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/955 # お題:自然数nの階乗の素因数2の個数を求める。(2014年センター試験) # n=5 -> 3 # n=13 -> 10 # # '自然数nの階乗の素因数2の個数を求める。(2014年センター試験)'(_自然数n,_自然数nの階乗の素因数2の個数) :- findsum(_ある自然数の素因数2の個数,( between(1,_自然数n,_ある自然数), ある自然数の素因数2の個数を求める(_ある自然数,_ある自然数の素因数2の個数)), _自然数nの階乗の素因数2の個数). ある自然数の素因数2の個数を求める(_ある自然数,_ある自然数の素因数2の個数) :- nth0(_ある自然数の素因数2の個数,_,_), \+(0 is _ある自然数 mod (2 ^ (_ある自然数の素因数2の個数 + 1))),!. findsum(_選択項,_副目標,_合計) :- findall(_選択項,_副目標,_選択項ならび), sumlist(_選択項ならび,_合計). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/929 # お題:3次元の配列を連番で初期化する。 # Jの場合 # a=:i.2 3 4 # a # 0 1 2 3 # 4 5 6 7 # 8 9 10 11 # # 12 13 14 15 # 16 17 18 19 # 20 21 22 23 # # (<1;2;3){a # 23 # # '3次元のならびを連番で初期化する。'(_3次元のならび,_初期化された3次元のならび) :- ならびの構造(_3次元のならび,_1,_2,_3), findall(_初期化された2次元ならび,( nth0(N1,_3次元のならび,_), findall(_初期化された1次元ならび,( nth0(N2,_2次元ならび,_), findall(N,( U is _1 * _2, U_2 is U + _3 - 1, between(U,U_2,N)), _初期化された1次元ならび)), _初期化された2次元ならび)), _初期化された3次元ならび). ならびの構造(LLL,_1,_2,_3) :- length(_3次元のならび,_1), _3次元のならび = [_2次元のならび|_], length(_2次元のならび,_2), _2次元のならび = [_1次元のならび|_], length(_1次元のならび,_3). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/493 # SQLServer2008R2です. # テーブルデータはDATE(YYYYMMの6けたのint型),CODE(varchar型),VALUE(float型) # の3カラムからなります.各DATEの各CODEに対して過去3か月分の総和を算出したいと思います. # 元テーブル # DATE, CODE, VALUE # .... # 200101, AAA, 1 # 200102, AAA, 2 # 200103, AAA, 3 # 200104, AAA, 4 # 200101, BBB, 1 # .... # # 欲しい結果 # 200103, AAA, 6 # 200104, AAA, 9 # ....... # # 下記のようなSQLを書いたのですが,同じ結果の行が12か月分でてきます. # 何処を修正すればよろしいでしょうか?もしくは全然違うSQLでしょうか? # # SELECT A.DATE, A.CODE, SUM(B.VALUE) OVER (PARTITION BY B.DATE, B.CODE) # FROM TABLE A, TABLE B # WHERE A.CODE=B.CODE AND B.DATE>=A.DATE AND B.DATE>=(A.DATEの3か月前←計算式が長いので省略です) # ORDER BY A.DATE, A.CODE # # よろしくお願いいたします. # 'A'(200101,'AAA',1). 'A'(200102,'AAA',2). 'A'(200103,'AAA',3). 'A'(200104,'AAA',4). 'A'(200101,'BBB',1). 過去三ヶ月の集計(_過去三ヶ月の集計ならび) :- '_DATE,_CODEを鍵として、過去三ヶ月の_VALUEの集計'(_過去三ヶ月の集計ならび). '_DATE,_CODEを鍵として、過去三ヶ月の_VALUEの集計'(_過去三ヶ月の集計ならび) :- '_DATE,_CODEを鍵とする'(_DATE_CODEならび), findall([_DATE,_CODE,_集計],( '過去三ヶ月の全ての_DATE,_CODEに対して、_VALUEを集約する'(_DATE,_CODE,_DATE_CODEならび,_集計)),_過去三ヶ月の集計ならび). '_DATE,_CODEを鍵とする'(_DATE_CODEならび) :- setof([_DATE,_CODE],[_DATE,_CODE,_VALUE] ^ 'A'(_DATE,_CODE,_VALUE),_DATE_CODEならび). '過去三ヶ月の全ての_DATE,_CODEに対して、_VALUEを集約する'(_DATE,_CODE,_DATE_CODEならび,_集計) :- member([_DATE,_CODE],_DATE_CODEならび), '過去三ヶ月の_DATE,_CODEで_VAULEを集約'(_DATE,_CODE,_集計). '過去三ヶ月の_DATE,_CODEで_VAULEを集約'(_DATE,_CODE,_集計) :- '3ヶ月前の起点月'(_DATE,_3ヶ月前の起点月), findsum(_VALUE,( テーブルデータは過去三ヶ月の範囲内(_DATE,_CODE,_3ヶ月前の起点月,_VALUE)),_集計). テーブルデータは過去三ヶ月の範囲内(_DATE,_CODE,_3ヶ月前の起点月,_VALUE) :- 'A'(_DATE_1,_CODE,_VALUE), between(_3ヶ月前の起点月,_DATE,_DATE_1). '3ヶ月前の起点月'(_今月,_3ヶ月前の起点年月) :- 今月が1月から3月の範囲では前年となる(_今月,_3ヶ月前の起点年月),!. '3ヶ月前の起点月'(_今月,_3ヶ月前の起点年月) :- 今月が4月から12月の範囲では今年となる(_今月,_3ヶ月前の起点年月). 今月が1月から3月の範囲では前年となる(_今月,_3ヶ月前の起点月) :- M is _今月 mod 100, M =< 3, _3ヶ月前の起点月 is _今月 - 100 + 9. 今月が4月から12月の範囲では今年となる(_今月,_3ヶ月前の起点月) :- _3ヶ月前の起点月 is _今月 - 3. findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/789 # お題:1000以下の自然数で各桁がすべて奇数のものを求める。 # 例 # 121 -> ng //偶数の桁がある # 357 -> ok # # '1000以下の自然数で各桁がすべて奇数のものを求める。'(_1000以下の自然数で各桁がすべて奇数のもの) :- between(1,1000,_1000以下の自然数), number_chars(_1000以下の自然数,_数字ならび), forall(member(_数字,_数字ならび),member(_数字,['1','3','5','7','9'])), _1000以下の自然数 = _1000以下の自然数で各桁がすべて奇数のもの. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/789 # お題:1000以下の自然数で各桁がすべて奇数のものを求める。 # 例 # 121 -> ng //偶数の桁がある # 357 -> ok # # '1000以下の自然数で各桁がすべて奇数のものを求める。'(_1000以下の自然数で各桁がすべて奇数のもの) :- '1000以下の自然数で'(_1000以下の自然数), '各桁がすべて奇数のものを求める。'(_1000以下の自然数,_1000以下の自然数で各桁がすべて奇数のもの). '1000以下の自然数で'(_1000以下の自然数) :- between(1,1000,_1000以下の自然数). '各桁がすべて奇数のものを求める。'(_整数,_整数で各桁がすべて奇数のもの) :- forall(各桁が(_整数,_各桁),奇数(_各桁)), _整数 = _整数で各桁がすべて奇数のもの. 各桁が(_整数,_各桁) :- _整数 > 0, _各桁 is _整数 mod 10. 各桁が(_整数,_各桁) :- _整数 > 0, _整数_1 is _整数 // 10, 各桁が(_整数_1,_各桁). 奇数(_各桁) :- 1 is _各桁 mod 2. % 以下のサイトは % % SWI-Prolog の readln/1 では % ?- readln(X). % :| abc,def % X = [abc,',',def] が期待される。 % ところが漢字を用いると % ?- readln(X). % :| 尾崎,隆大 % X = [尾,崎,',',隆,大] となって漢字の部分を語と認識しない。 % この問題を回避する為の一時凌ぎが以下の述語である。 % 予め、アトムを構成する文字コードのリストを utf16_code/1 で定義して置く。 % :- findall(X,between(12288,40959,X),L1), findall(Y,between(65280,65299,Y),L2), append(L1,L2,L), assertz(utf16_code(L)). readln(X) :- utf16_code(U), readln(X,_,_,U,_). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/726 # お題:連続した自然数の和が2014になるものをすべて求める。 # # '連続した自然数の和が2014になるものをすべて求める。'(_和が2014になる連続した自然数) :- N_1 is 2014 // 2, findall(N,between(1,N_1,N),L), append(L1,L2,L), 和が2014になる連続した自然数(L2,_和が2014になる連続した自然数). 和が2014になる連続した自然数(L2,_和が2014になる連続した自然数) :- 和が2014以上になる連続した自然数(L2,_和が2014になる連続した自然数,2014). 和が2014以上になる連続した自然数(L2,_和が2014以上になる連続した自然数,_和) :- append(_和が2014を以上の連続した自然数,_,L2), sumlist(_和が2014を以上の連続した自然数,_和), _和 >= 2014,!. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/726 # お題:連続した自然数の和が2014になるものをすべて求める。 # # '連続した自然数の和が2014になるものをすべて求める。'(_和が2014になる連続した自然数) :- N_1 is 2014 // 2, findall(N,between(1,N_1,N),L), append(L1,L2,L), 和が2014になる連続した自然数(L2,_和が2014になる連続した自然数). 和が2014になる連続した自然数(L2,_和が2014になる連続した自然数) :- 和が2014以上になる連続した自然数(L2,_和が2014以上になる連続した自然数,_和), _和 = 2014, _和が2014以上になる連続した自然数 = _和が2014になる連続した自然数. 和が2014以上になる連続した自然数(L2,_和が2014以上になる連続した自然数,_和) :- append(_和が2014を以上の連続した自然数,_,L2), sumlist(_和が2014を以上の連続した自然数,_和), _和 >= 2014,!. % 以下のサイトは # 出題場所 http://twitter.com/genkuroki/statuses/416777263229575168" # @genkuroki # #掛算 たとえば「かけざん」のテストで常に掛算以外の方法で解く問題を # 混ぜておくとか、問題文中に無駄な数値を混ぜておいて答えを出すために # 必要な情報を文中から抜き出せるかを見るとか、すでに様々な手段が提案され、 # 自分の子の理解度を測るために実行している保護者もいる 'たとえば「かけざん」のテストで常に掛算以外の方法で解く問題を 混ぜておくとか、問題文中に無駄な数値を混ぜておいて答えを出すために 必要な情報を文中から抜き出せるかを見るとか、すでに様々な手段が提案され、 自分の子の理解度を測るために実行している保護者もいる'(A,B,C) :- findall(1,( between(1,A,_), between(1,B,_)),L), length(L,C). % 以下のサイトは # 出題場所 http://twitter.com/genkuroki/statuses/416777263229575168" # @genkuroki # #掛算 たとえば「かけざん」のテストで常に掛算以外の方法で解く問題を # 混ぜておくとか、問題文中に無駄な数値を混ぜておいて答えを出すために # 必要な情報を文中から抜き出せるかを見るとか、すでに様々な手段が提案され、 # 自分の子の理解度を測るために実行している保護者もいる 'たとえば「かけざん」のテストで常に掛算以外の方法で解く問題を 混ぜておくとか、問題文中に無駄な数値を混ぜておいて答えを出すために 必要な情報を文中から抜き出せるかを見るとか、すでに様々な手段が提案され、 自分の子の理解度を測るために実行している保護者もいる'(A,B,C) :- length(L1,A), findall(L1,between(1,B,_),LL), flatten(LL,L2), length(L2,C). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/576 # 西暦何年かを入力するとその年に月曜日が何回あるか数え # 52回なら1を、53回なら0を出力するプログラムお願いします… # # 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします # (0を入力したら終わりです) # # 入力できるのは1989〜5000です # # '西暦何年かを入力するとその年に月曜日が何回あるか数え 52回なら1を、53回なら0を出力するプログラムお願いします… 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします (0を入力したら終わりです) 入力できるのは1989〜5000です' :- '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_西暦ならび). '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび) :- findall(_西暦,( '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('西暦(1989~5000)を入力して下さい',_西暦),( _西暦=0,!,fail;true)),_西暦ならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([]). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([_西暦|_残りならび]) :- 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1), writef('%t年 %t\n',[_西暦,_0または1]), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_残りならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,_0または1). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,_0または1). うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,0) :- うるう年(_西暦), '1月1日が日曜か月曜の時は'(_西暦),!. うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,1) :- うるう年(_西暦). '1月1日が日曜か月曜の時は'(_西暦) :- 'Zellerの公式を用いて曜日を得る'(_西暦,1,1,_曜日を表す値,_曜日), member(_曜日,[日曜,月曜]). うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,0) :- \+(うるう年(_西暦)), 'Zellerの公式を用いて曜日を得る'(_西暦,1,1,_曜日を表す値,月曜),!. うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,1) :- \+(うるう年(_西暦)). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- writef('%t ',[_催促文]), get_line(_入力行), '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦). '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('0',0) :- !. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦) :- read_term_from_atom(_入力行,_西暦,[]), integer(_西暦), between(1989,5000,_西暦),!. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_) :- writef('入力された文字列"%t"から1899年から5000年範囲の西暦が得られませんでした\n再入力をお願いします\n',[_入力行]), fail. get_line(Line) :- get_line(user_input,Line). get_line(Instream,Line) :- get_char(Instream,C), get_line_1(Instream,C,Chars), atom_chars(Line,Chars) . get_line_1(_,'\n',[]) :- !. get_line_1(_,end_of_file,[]) :- !. get_line_1(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_1(Instream,C2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/684 # お題: ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ # # 出力: http://ime.nu/codepad.org/9Qm1zRxy # # 一番上の「☆」と土台の「||」は固定でよい # 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する # # 解答例: http://ime.nu/codepad.org/aR7eI9F2 # # ☆ # || # ☆ # ** # || # ☆ # b* # *i*o # || # ☆ # ** # **** # ****** # || # ☆ # *b # **** # i**%*J # *Ni***** # || # ☆ # ** # *%** # *****i # **JX**** # ********** # || # ☆ # %* # **%* # *i***o # ******** # ****%***** # **o%****oi*b # || 葉と飾り(20,[*,*,*,*,*,*,*,*,*,*,*,*,*,'N','i','X','J',o,'%',b]). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ 出力: http://ime.nu/codepad.org/9Qm1zRxy 一番上の「☆」と土台の「||」は固定でよい 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する' :- forall((between(2,8,_何段), 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_何段,_クリスマスツリー)), クリスマスツリーの表示(_クリスマスツリー)). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_何段,_クリスマスツリー) :- length(_クリスマスツリー,_何段), append([☆|L1],['||'],_クリスマスツリー), findall(_段,( nth1(_段目,_クリスマスツリー,_段), 一段生成(_段目,_段)), _クリスマスツリー). 一段生成(_段目,_飾りを含む葉) :- var(_飾りを含む葉), length(_段,_段目), 飾りを含む葉の生成(_段,_飾りを含む葉),!. 一段生成(_,_既に存在するもの) :- \+(var(_既に存在するもの)). 飾りを含む葉の生成(_段,_一段の葉飾り) :- 葉と飾り(_基数,_葉と飾りならび), findall(_葉または飾り,( 葉または飾りの選択(_段,_基数,_葉と飾りならび,_葉または飾り)), _葉または飾りならび), atomic_list_concat(_葉または飾りならび,_一段の葉飾り),!. 葉または飾りの選択(_段,_基数,_葉と飾りならび,_葉または飾り) :- member(_葉または飾り,_段), _乱数 is random(_基数), nth0(_乱数,_葉と飾りならび,_葉または飾り). クリスマスツリーの表示(_クリスマスツリー) :- forall(member(_段,_クリスマスツリー), writef('%t\n',[_段])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/684 # お題: ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ # # 出力: http://ime.nu/codepad.org/9Qm1zRxy # # 一番上の「☆」と土台の「||」は固定でよい # 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する # # 解答例: http://ime.nu/codepad.org/aR7eI9F2 # # ☆ # || # ☆ # ** # || # ☆ # b* # *i*o # || # ☆ # ** # **** # ****** # || # ☆ # *b # **** # i**%*J # *Ni***** # || # ☆ # ** # *%** # *****i # **JX**** # ********** # || # ☆ # %* # **%* # *i***o # ******** # ****%***** # **o%****oi*b # || 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ 出力: http://ime.nu/codepad.org/9Qm1zRxy 一番上の「☆」と土台の「||」は固定でよい 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する' :- forall((between(2,8,_段), 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_段,_クリスマスツリー)), クリスマスツリーの表示(_クリスマスツリー)). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_段,_クリスマスツリー) :- length(L,_段), append([☆|L1],['||'],L), findall(A,( nth1(_nth1,L,A), '一段生成'(_nth1,A)), L). '一段生成'(_nth1,A) :- var(A), length(L,_nth1), 飾りを含む葉の生成(L,A),!. '一段生成'(_,A) :- \+(var(A)). 飾りを含む葉の生成(L,A) :- findall(B,( member(B,L), _乱数 is random(20), nth0(_乱数,[*,*,*,*,*,*,*,*,*,*,*,*,*,'N','i','X','J',o,'%',b],B)), L), atomic_list_concat(L,A),!. クリスマスツリーの表示(_クリスマスツリー) :- forall(member(A,_クリスマスツリー), writef('%t\n',[A])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/658 # 任意精度整数モジュールを使ってバグ修正したかったが、 # 諸事情でそれもできなかったので出題の意図を縮小して訂正。 # # お題:1から10000までの整をすべて足せ。 # すべて足したら、その合計を表示せよ。 # # 回答例: Objective Caml version 3.08.1 # let sum1to n = # let rec f sum n = # if n = 0 then sum # else f (sum + n) (n - 1) in # f 0 n;; # print_int (sum1to 10000);; # ↓ # 50005000 # # '1から10000までの整数をすべて足せ。すべて足したら、その合計を表示せよ。' :- findsum(N,between(1,10000,N),_合計), writef('その合計は%t\n',[_合計]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/658 # 任意精度整数モジュールを使ってバグ修正したかったが、 # 諸事情でそれもできなかったので出題の意図を縮小して訂正。 # # お題:1から10000までの整をすべて足せ。 # すべて足したら、その合計を表示せよ。 # # 回答例: Objective Caml version 3.08.1 # let sum1to n = # let rec f sum n = # if n = 0 then sum # else f (sum + n) (n - 1) in # f 0 n;; # print_int (sum1to 10000);; # ↓ # 50005000 # # '1から10000までの整数をすべて足せ。すべて足したら、その合計を表示せよ。' :- findsum(N,between(1,10000,N),_合計), 'すべて足したら、その合計を表示せよ。'(_合計). 'すべて足したら、その合計を表示せよ。'(_合計) :- writef('その合計は%t\n',[_合計]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/658 # 任意精度整数モジュールを使ってバグ修正したかったが、 # 諸事情でそれもできなかったので出題の意図を縮小して訂正。 # # お題:1から10000までの整をすべて足せ。 # すべて足したら、その合計を表示せよ。 # # 回答例: Objective Caml version 3.08.1 # let sum1to n = # let rec f sum n = # if n = 0 then sum # else f (sum + n) (n - 1) in # f 0 n;; # print_int (sum1to 10000);; # ↓ # 50005000 # # '1から10000までの整数をすべて足せ。すべて足したら、その合計を表示せよ。' :- '1から10000までの整数をすべて足せ。'(_合計), 'すべて足したら、その合計を表示せよ。'(_合計). '1から10000までの整数をすべて足せ。'(_合計) :- '1から10000までの整数を'(_1から10000までの整数ならび), 'すべて足せ。'(_1から10000までの整数ならび,_合計). '1から10000までの整数を'(_1から10000までの整数ならび) :- findall(_1から10000までの整数,'1から10000までの'(_1から10000までの整数),_1から10000までの整数ならび). '1から10000までの'(_1から10000までの整数) :- between(1,10000,_1から10000までの整数). 'すべて足せ。'(_1から10000までの整数ならび,_合計) :- sum_list(_1から10000までの整数ならび,_合計). 'すべて足したら、その合計を表示せよ。'(_合計) :- writef('その合計は%w\n',[_合計]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/658 # 任意精度整数モジュールを使ってバグ修正したかったが、 # 諸事情でそれもできなかったので出題の意図を縮小して訂正。 # # お題:1から10000までの整をすべて足せ。 # すべて足したら、その合計を表示せよ。 # # 回答例: Objective Caml version 3.08.1 # let sum1to n = # let rec f sum n = # if n = 0 then sum # else f (sum + n) (n - 1) in # f 0 n;; # print_int (sum1to 10000);; # ↓ # 50005000 # # '1から10000までの整数をすべて足せ。すべて足したら、その合計を表示せよ。' :- '1から10000までの整数をすべて足せ。'(_合計), 'すべて足したら、その合計を表示せよ。'(_合計). '1から10000までの整数をすべて足せ。'(_合計) :- findall(N,between(1,10000,N),_1から10000までのならび), atomic_list_concat(_1から10000までのならび,'+',_式文字列), read_term_from_atom(_式文字列,_式,[]), _合計 is _式. 'すべて足したら、その合計を表示せよ。'(_合計) :- writef('その合計は%t\n',[_合計]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/658 # 任意精度整数モジュールを使ってバグ修正したかったが、 # 諸事情でそれもできなかったので出題の意図を縮小して訂正。 # # お題:1から10000までの整をすべて足せ。 # すべて足したら、その合計を表示せよ。 # # 回答例: Objective Caml version 3.08.1 # let sum1to n = # let rec f sum n = # if n = 0 then sum # else f (sum + n) (n - 1) in # f 0 n;; # print_int (sum1to 10000);; # ↓ # 50005000 # # '1から10000までの整数をすべて足せ。すべて足したら、その合計を表示せよ。' :- '1から10000までの整数をすべて足せ。'(_合計), 'すべて足したら、その合計を表示せよ。'(_合計). '1から10000までの整数をすべて足せ。'(_合計) :- findall(N,between(1,10000,N),L), sumlist(L,_合計). 'すべて足したら、その合計を表示せよ。'(_合計) :- writef('その合計は%t\n',[_合計]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/658 # 任意精度整数モジュールを使ってバグ修正したかったが、 # 諸事情でそれもできなかったので出題の意図を縮小して訂正。 # # お題:1から10000までの整をすべて足せ。 # すべて足したら、その合計を表示せよ。 # # 回答例: Objective Caml version 3.08.1 # let sum1to n = # let rec f sum n = # if n = 0 then sum # else f (sum + n) (n - 1) in # f 0 n;; # print_int (sum1to 10000);; # ↓ # 50005000 # # '1から10000までの整数をすべて足せ。すべて足したら、その合計を表示せよ。' :- '1から10000までの整数をすべて足せ。'(_合計), 'すべて足したら、その合計を表示せよ。'(_合計). '1から10000までの整数をすべて足せ。'(_合計) :- findall(N,between(1,10000,N),L), sumlist(L,_合計). 'すべて足したら、その合計を表示せよ。'(_合計) :- writef('合計は %t\n',[_合計]). % 以下のサイトは # 出題場所 :: 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). % 以下のサイトは # prologについてです。 # 2乗和のプログラムが書けなくて困っています。1からXまでの2乗和Yを計算するプログラムssq(X,Y)を”一切isを用いず”に作成していただけないでしょうか?よろしくお願いします。 '2乗和のプログラムが書けなくて困っています。 1からXまでの2乗和Yを計算するプログラムssq(X,Y)を”一切isを用いず”に作成していただけないでしょうか? よろしくお願いします。'(X,Y) :- ssq(X,Y). ssq(X,Y) :- '1からXまでの2乗和Yを"一切isを用いず"に計算する'(X,Y). '1からXまでの2乗和Yを"一切isを用いず"に計算する'(X,_2乗和Y) :- '2乗和をリストとして表現する(ただしリストは平坦化されていない)'(X,_2乗和リスト表現), リストを平坦化してその要素数を数える(_2乗和リスト表現,_2乗和Y). '2乗和をリストとして表現する(ただしリストは平坦化されていない)'(X,_2乗和リスト表現) :- findall(LL,( '1からXまでの整数を要素数とするリストLを生成する'(X,L), リストによって2乗を表現する(L,LL)), _2乗和リスト表現). '1からXまでの整数を要素数とするリストLを生成する'(X,L) :- between(1,X,N), length(L,N). リストによって2乗を表現する(L1,LL) :- findall(L1,nth1(_,L1,_),LL). リストを平坦化してその要素数を数える(LL,_要素数) :- flatten(LL,L), length(L,_要素数). % 以下のサイトは # prologについてです。 # 2乗和のプログラムが書けなくて困っています。1からXまでの2乗和Yを計算するプログラムssq(X,Y)を”一切isを用いず”に作成していただけないでしょうか?よろしくお願いします。 ssq(X,Y) :- findall(LL,( between(1,X,M), length(L,M), findall(L,nth1(_,L,_),LL)), LL2), flatten(LL2,L2), length(L2,Y). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/449 # お題:与えられた配列をなるべくN等分せよ。 # 要素の順番は入れ替えず、配列の配列として返す。 # Nは1以上とする。 # データ構造は、リスト、ベクタ、タプルなどでも可。 # # 回答例およびチェック用出力例: ruby 1.8.6 # def narudiv(a, n) # d, m = a.size.divmod(n) # (1..n).map {|i| a.slice!(0, d + (i <= m ? 1 : 0))} # end # p narudiv((1..10).to_a, 3) # p narudiv((1..15).to_a, 4) # ↓ # [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]] # [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15]] # # '与えられた配列をなるべくN等分せよ。 要素の順番は入れ替えず、配列の配列として返す。 Nは1以上とする。 データ構造は、リスト、ベクタ、タプルなどでも可。'(_N,_ならび,_N等文されたならび) :- length(_ならび,_要素数), _D is _要素数 // _N, _M is _要素数 mod N, '_Mを各_Dに割り振る'(_D,_M,_N,_N等分されたならび), flatten(_N等分されたならび,_ならび). '_Mを各_Dに割り振る'(_D,_M,_N,_N等分されたならび) :- length(_N等分されたならび,_N), findall(_n,between(1,_N,_n),L1), 組合せ(L1,_M,_組合せ), '_N等分されたならびを充実させる'(_D,_組合せ,_N等分されたならび). '_N等分されたならびを充実させる'(_D,_組合せ,_N等分されたならび) :- findall(L2,( nth1(_nth1,_N等分されたならび,L), length(L,_D), '_nth1が_組合せに存在するときには枠を追加する'(_nth1,L,_組合せ,L2)), _N等分されたならび). '_nth1が_組合せに存在するときには枠を追加する'(_nth1,L,_組合せ,[_|L]) :- member(_nth1,_組合せ),!. '_nth1が_組合せに存在するときには枠を追加する'(_,L,_組合せ,L). 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R3]) :- N > 1, M is N - 1, 組合せ(R1,M,R3). 組合せ([_|R1],N,L) :- N > 1, 組合せ(R1,N,L). % 以下のサイトは # 出題場所:: http://toro.2ch.net/test/read.cgi/tech/1357191974/435 # お題:1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は # 元のデータの順に)表示する。 '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)表示する。' :- '1から100までのチャンパーノウン定数'(_チャンパーノウン定数), '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_チャンパーノウン定数,_整列した_開始位置_数値定数ならび), 表示する(_整列した_開始位置_数値定数ならび). '1から100までのチャンパーノウン定数'(_チャンパーノウン定数) :- findall(_数値定数,( between(1,100,_数値), atom_number(_数値定数,_数値)), _数値定数ならび), atomic_list_concat(['0.'|_数値定数ならび],_チャンパーノウン定数). '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_チャンパーノウン定数,_整列した_開始位置_数値ならび) :- findall([_開始位置,_数値],( between(1,100,_数値), atom_number(_数値定数,_数値), sub_atom(_チャンパーノウン定数,_開始位置,_,_,_数値定数)), _開始位置_数値ならび), sort(_開始位置_数値ならび,_整列した_開始位置_数値ならび). 表示する(_整列した_開始位置_数値ならび) :- forall(member(_数値,_整列した_開始位置_数値ならび),writef('%t\n',[_数値])). % 以下のサイトは # 出題場所:: http://toro.2ch.net/test/read.cgi/tech/1357191974/435 # お題:1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は # 元のデータの順に)表示する。 '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)表示する。' :- '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_整列した_開始位置_数値定数ならび), 表示する(_整列した_開始位置_数値定数ならび). '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_整列した_開始位置_数値ならび) :- findall([_開始位置,_数値],( between(1,100,_数値), atom_number(_数値定数,_数値), チャンパーノウン定数に出現(_数値定数,_開始位置)), _開始位置_数値ならび), sort(_開始位置_数値ならび,_整列した_開始位置_数値ならび). チャンパーノウン定数に出現(_数値定数,_開始位置) :- チャンパーノウン定数の生成(1,'0.1',_チャンパーノウン定数), sub_atom(_チャンパーノウン定数,_開始位置,_,_,_数値定数),!. チャンパーノウン定数の生成(_数値,_チャンパーノウン定数,_チャンパーノウン定数). チャンパーノウン定数の生成(_数値_1,_チャンパーノウン定数_1,_チャンパーノウン定数) :- _数値_2 is _数値_1 + 1, atom_number(_数値定数,_数値_2), atom_concat(_チャンパーノウン定数_1,_数値定数,_チャンパーノウン定数_2), チャンパーノウン定数の生成(_数値_2,_チャンパーノウン定数_2,_チャンパーノウン定数). 表示する(_整列した_開始位置_数値ならび) :- forall(member([_,_数値],_整列した_開始位置_数値ならび),writef('%t\n',[_数値])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1337692704/944 # for文を使って6の500乗の答えがでるプログラムを教えてください。 # # for(_何乗,_答え) :- for(1,6,_何乗,_答え). for(_何乗,_答え,_何乗,_答え). for(_何乗_1,_6の何乗_1,_何乗,_答え) :- _6の何乗_2 is _6の何乗_1 * 6, _何乗_2 is _何乗_1 + 1, for(_何乗_2,_6の何乗_2,_何乗,_答え). % 以下のサイトは # お題:ふたつの自然数の公約数をすべて求める。 'ふたつの自然数の公約数をすべて求める。'(_ひとつめの自然数,_ふたつ目の自然数) :- _ひとつめの自然数 > _ふたつ目の自然数, 'ふたつの自然数の公約数をすべて求める。'(_ふたつ目の自然数,_ひとつめの自然数). 'ふたつの自然数の公約数をすべて求める。'(_ひとつめの自然数,_ふたつ目の自然数) :- forall((between(1,_ひとつめの自然数,_公約数),0 is _ひとつめの自然数 mod _公約数,0 is _ふたつ目の自然数 mod _公約数),writef('%t ',[_公約数])). % 以下のサイトは # お題:ふたつの自然数の公約数をすべて求める。 'ふたつの自然数の公約数をすべて求める。'(_ひとつめの自然数,_ふたつ目の自然数) :- 最大公約数をユークリッドの互除法で求める(_ひとつめの自然数,_ふたつ目の自然数,_最大公約数), forall((between(1,_最大公約数,_公約数),0 is _最大公約数 mod _公約数),writef('%t ',[_公約数])). 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X) . % 以下のサイトは # H. Hosaka @H_H: # [算数][問題] H君は10万円を持って銀行に行き、50枚のお札に両替してもらいました。H君は千円札、二千円札、五千円札、一万円札を何枚受け取ったでしょうか?あり得る可能性を全て答えなさい。 '[算数][問題] H君は10万円を持って銀行に行き、50枚のお札に両替してもらいました。H君は千円札、二千円札、五千円札、一万円札を何枚受け取ったでしょうか?あり得る可能性を全て答えなさい。'(_千円札の枚数,_二千円札の枚数,_五千円札の枚数,_一万円札の枚数) :- '四つ足して答えが50'(_千円札の枚数,_二千円札の枚数,_五千円札の枚数,_一万円札の枚数), 100000 is 1000 * _千円札の枚数 + 2000 * _二千円札の枚数 + 5000 * _五千円札の枚数 + 10000 * _一万円札の枚数. '四つ足して答えが50'(A,B,C,D) :- 答えが50以下の足し算(A,B,S1), 答えが50以下の足し算(S1,C,S2), 答えが50以下の足し算(S2,D,50). 答えが50以下の足し算(1,1,2). 答えが50以下の足し算(1,2,3). 答えが50以下の足し算(1,3,4). 答えが50以下の足し算(1,4,5). 答えが50以下の足し算(1,5,6). 答えが50以下の足し算(1,6,7). 答えが50以下の足し算(1,7,8). 答えが50以下の足し算(1,8,9). 答えが50以下の足し算(1,9,10). 答えが50以下の足し算(1,10,11). 答えが50以下の足し算(1,11,12). 答えが50以下の足し算(1,12,13). 答えが50以下の足し算(1,13,14). 答えが50以下の足し算(1,14,15). 答えが50以下の足し算(1,15,16). 答えが50以下の足し算(1,16,17). 答えが50以下の足し算(1,17,18). 答えが50以下の足し算(1,18,19). 答えが50以下の足し算(1,19,20). 答えが50以下の足し算(1,20,21). 答えが50以下の足し算(1,21,22). 答えが50以下の足し算(1,22,23). 答えが50以下の足し算(1,23,24). 答えが50以下の足し算(1,24,25). 答えが50以下の足し算(1,25,26). 答えが50以下の足し算(1,26,27). 答えが50以下の足し算(1,27,28). 答えが50以下の足し算(1,28,29). 答えが50以下の足し算(1,29,30). 答えが50以下の足し算(1,30,31). 答えが50以下の足し算(1,31,32). 答えが50以下の足し算(1,32,33). 答えが50以下の足し算(1,33,34). 答えが50以下の足し算(1,34,35). 答えが50以下の足し算(1,35,36). 答えが50以下の足し算(1,36,37). 答えが50以下の足し算(1,37,38). 答えが50以下の足し算(1,38,39). 答えが50以下の足し算(1,39,40). 答えが50以下の足し算(1,40,41). 答えが50以下の足し算(1,41,42). 答えが50以下の足し算(1,42,43). 答えが50以下の足し算(1,43,44). 答えが50以下の足し算(1,44,45). 答えが50以下の足し算(1,45,46). 答えが50以下の足し算(1,46,47). 答えが50以下の足し算(1,47,48). 答えが50以下の足し算(1,48,49). 答えが50以下の足し算(1,49,50). 答えが50以下の足し算(2,1,3). 答えが50以下の足し算(2,2,4). 答えが50以下の足し算(2,3,5). 答えが50以下の足し算(2,4,6). 答えが50以下の足し算(2,5,7). 答えが50以下の足し算(2,6,8). 答えが50以下の足し算(2,7,9). 答えが50以下の足し算(2,8,10). 答えが50以下の足し算(2,9,11). 答えが50以下の足し算(2,10,12). 答えが50以下の足し算(2,11,13). 答えが50以下の足し算(2,12,14). 答えが50以下の足し算(2,13,15). 答えが50以下の足し算(2,14,16). 答えが50以下の足し算(2,15,17). 答えが50以下の足し算(2,16,18). 答えが50以下の足し算(2,17,19). 答えが50以下の足し算(2,18,20). 答えが50以下の足し算(2,19,21). 答えが50以下の足し算(2,20,22). 答えが50以下の足し算(2,21,23). 答えが50以下の足し算(2,22,24). 答えが50以下の足し算(2,23,25). 答えが50以下の足し算(2,24,26). 答えが50以下の足し算(2,25,27). 答えが50以下の足し算(2,26,28). 答えが50以下の足し算(2,27,29). 答えが50以下の足し算(2,28,30). 答えが50以下の足し算(2,29,31). 答えが50以下の足し算(2,30,32). 答えが50以下の足し算(2,31,33). 答えが50以下の足し算(2,32,34). 答えが50以下の足し算(2,33,35). 答えが50以下の足し算(2,34,36). 答えが50以下の足し算(2,35,37). 答えが50以下の足し算(2,36,38). 答えが50以下の足し算(2,37,39). 答えが50以下の足し算(2,38,40). 答えが50以下の足し算(2,39,41). 答えが50以下の足し算(2,40,42). 答えが50以下の足し算(2,41,43). 答えが50以下の足し算(2,42,44). 答えが50以下の足し算(2,43,45). 答えが50以下の足し算(2,44,46). 答えが50以下の足し算(2,45,47). 答えが50以下の足し算(2,46,48). 答えが50以下の足し算(2,47,49). 答えが50以下の足し算(2,48,50). 答えが50以下の足し算(3,1,4). 答えが50以下の足し算(3,2,5). 答えが50以下の足し算(3,3,6). 答えが50以下の足し算(3,4,7). 答えが50以下の足し算(3,5,8). 答えが50以下の足し算(3,6,9). 答えが50以下の足し算(3,7,10). 答えが50以下の足し算(3,8,11). 答えが50以下の足し算(3,9,12). 答えが50以下の足し算(3,10,13). 答えが50以下の足し算(3,11,14). 答えが50以下の足し算(3,12,15). 答えが50以下の足し算(3,13,16). 答えが50以下の足し算(3,14,17). 答えが50以下の足し算(3,15,18). 答えが50以下の足し算(3,16,19). 答えが50以下の足し算(3,17,20). 答えが50以下の足し算(3,18,21). 答えが50以下の足し算(3,19,22). 答えが50以下の足し算(3,20,23). 答えが50以下の足し算(3,21,24). 答えが50以下の足し算(3,22,25). 答えが50以下の足し算(3,23,26). 答えが50以下の足し算(3,24,27). 答えが50以下の足し算(3,25,28). 答えが50以下の足し算(3,26,29). 答えが50以下の足し算(3,27,30). 答えが50以下の足し算(3,28,31). 答えが50以下の足し算(3,29,32). 答えが50以下の足し算(3,30,33). 答えが50以下の足し算(3,31,34). 答えが50以下の足し算(3,32,35). 答えが50以下の足し算(3,33,36). 答えが50以下の足し算(3,34,37). 答えが50以下の足し算(3,35,38). 答えが50以下の足し算(3,36,39). 答えが50以下の足し算(3,37,40). 答えが50以下の足し算(3,38,41). 答えが50以下の足し算(3,39,42). 答えが50以下の足し算(3,40,43). 答えが50以下の足し算(3,41,44). 答えが50以下の足し算(3,42,45). 答えが50以下の足し算(3,43,46). 答えが50以下の足し算(3,44,47). 答えが50以下の足し算(3,45,48). 答えが50以下の足し算(3,46,49). 答えが50以下の足し算(3,47,50). 答えが50以下の足し算(4,1,5). 答えが50以下の足し算(4,2,6). 答えが50以下の足し算(4,3,7). 答えが50以下の足し算(4,4,8). 答えが50以下の足し算(4,5,9). 答えが50以下の足し算(4,6,10). 答えが50以下の足し算(4,7,11). 答えが50以下の足し算(4,8,12). 答えが50以下の足し算(4,9,13). 答えが50以下の足し算(4,10,14). 答えが50以下の足し算(4,11,15). 答えが50以下の足し算(4,12,16). 答えが50以下の足し算(4,13,17). 答えが50以下の足し算(4,14,18). 答えが50以下の足し算(4,15,19). 答えが50以下の足し算(4,16,20). 答えが50以下の足し算(4,17,21). 答えが50以下の足し算(4,18,22). 答えが50以下の足し算(4,19,23). 答えが50以下の足し算(4,20,24). 答えが50以下の足し算(4,21,25). 答えが50以下の足し算(4,22,26). 答えが50以下の足し算(4,23,27). 答えが50以下の足し算(4,24,28). 答えが50以下の足し算(4,25,29). 答えが50以下の足し算(4,26,30). 答えが50以下の足し算(4,27,31). 答えが50以下の足し算(4,28,32). 答えが50以下の足し算(4,29,33). 答えが50以下の足し算(4,30,34). 答えが50以下の足し算(4,31,35). 答えが50以下の足し算(4,32,36). 答えが50以下の足し算(4,33,37). 答えが50以下の足し算(4,34,38). 答えが50以下の足し算(4,35,39). 答えが50以下の足し算(4,36,40). 答えが50以下の足し算(4,37,41). 答えが50以下の足し算(4,38,42). 答えが50以下の足し算(4,39,43). 答えが50以下の足し算(4,40,44). 答えが50以下の足し算(4,41,45). 答えが50以下の足し算(4,42,46). 答えが50以下の足し算(4,43,47). 答えが50以下の足し算(4,44,48). 答えが50以下の足し算(4,45,49). 答えが50以下の足し算(4,46,50). 答えが50以下の足し算(5,1,6). 答えが50以下の足し算(5,2,7). 答えが50以下の足し算(5,3,8). 答えが50以下の足し算(5,4,9). 答えが50以下の足し算(5,5,10). 答えが50以下の足し算(5,6,11). 答えが50以下の足し算(5,7,12). 答えが50以下の足し算(5,8,13). 答えが50以下の足し算(5,9,14). 答えが50以下の足し算(5,10,15). 答えが50以下の足し算(5,11,16). 答えが50以下の足し算(5,12,17). 答えが50以下の足し算(5,13,18). 答えが50以下の足し算(5,14,19). 答えが50以下の足し算(5,15,20). 答えが50以下の足し算(5,16,21). 答えが50以下の足し算(5,17,22). 答えが50以下の足し算(5,18,23). 答えが50以下の足し算(5,19,24). 答えが50以下の足し算(5,20,25). 答えが50以下の足し算(5,21,26). 答えが50以下の足し算(5,22,27). 答えが50以下の足し算(5,23,28). 答えが50以下の足し算(5,24,29). 答えが50以下の足し算(5,25,30). 答えが50以下の足し算(5,26,31). 答えが50以下の足し算(5,27,32). 答えが50以下の足し算(5,28,33). 答えが50以下の足し算(5,29,34). 答えが50以下の足し算(5,30,35). 答えが50以下の足し算(5,31,36). 答えが50以下の足し算(5,32,37). 答えが50以下の足し算(5,33,38). 答えが50以下の足し算(5,34,39). 答えが50以下の足し算(5,35,40). 答えが50以下の足し算(5,36,41). 答えが50以下の足し算(5,37,42). 答えが50以下の足し算(5,38,43). 答えが50以下の足し算(5,39,44). 答えが50以下の足し算(5,40,45). 答えが50以下の足し算(5,41,46). 答えが50以下の足し算(5,42,47). 答えが50以下の足し算(5,43,48). 答えが50以下の足し算(5,44,49). 答えが50以下の足し算(5,45,50). 答えが50以下の足し算(6,1,7). 答えが50以下の足し算(6,2,8). 答えが50以下の足し算(6,3,9). 答えが50以下の足し算(6,4,10). 答えが50以下の足し算(6,5,11). 答えが50以下の足し算(6,6,12). 答えが50以下の足し算(6,7,13). 答えが50以下の足し算(6,8,14). 答えが50以下の足し算(6,9,15). 答えが50以下の足し算(6,10,16). 答えが50以下の足し算(6,11,17). 答えが50以下の足し算(6,12,18). 答えが50以下の足し算(6,13,19). 答えが50以下の足し算(6,14,20). 答えが50以下の足し算(6,15,21). 答えが50以下の足し算(6,16,22). 答えが50以下の足し算(6,17,23). 答えが50以下の足し算(6,18,24). 答えが50以下の足し算(6,19,25). 答えが50以下の足し算(6,20,26). 答えが50以下の足し算(6,21,27). 答えが50以下の足し算(6,22,28). 答えが50以下の足し算(6,23,29). 答えが50以下の足し算(6,24,30). 答えが50以下の足し算(6,25,31). 答えが50以下の足し算(6,26,32). 答えが50以下の足し算(6,27,33). 答えが50以下の足し算(6,28,34). 答えが50以下の足し算(6,29,35). 答えが50以下の足し算(6,30,36). 答えが50以下の足し算(6,31,37). 答えが50以下の足し算(6,32,38). 答えが50以下の足し算(6,33,39). 答えが50以下の足し算(6,34,40). 答えが50以下の足し算(6,35,41). 答えが50以下の足し算(6,36,42). 答えが50以下の足し算(6,37,43). 答えが50以下の足し算(6,38,44). 答えが50以下の足し算(6,39,45). 答えが50以下の足し算(6,40,46). 答えが50以下の足し算(6,41,47). 答えが50以下の足し算(6,42,48). 答えが50以下の足し算(6,43,49). 答えが50以下の足し算(6,44,50). 答えが50以下の足し算(7,1,8). 答えが50以下の足し算(7,2,9). 答えが50以下の足し算(7,3,10). 答えが50以下の足し算(7,4,11). 答えが50以下の足し算(7,5,12). 答えが50以下の足し算(7,6,13). 答えが50以下の足し算(7,7,14). 答えが50以下の足し算(7,8,15). 答えが50以下の足し算(7,9,16). 答えが50以下の足し算(7,10,17). 答えが50以下の足し算(7,11,18). 答えが50以下の足し算(7,12,19). 答えが50以下の足し算(7,13,20). 答えが50以下の足し算(7,14,21). 答えが50以下の足し算(7,15,22). 答えが50以下の足し算(7,16,23). 答えが50以下の足し算(7,17,24). 答えが50以下の足し算(7,18,25). 答えが50以下の足し算(7,19,26). 答えが50以下の足し算(7,20,27). 答えが50以下の足し算(7,21,28). 答えが50以下の足し算(7,22,29). 答えが50以下の足し算(7,23,30). 答えが50以下の足し算(7,24,31). 答えが50以下の足し算(7,25,32). 答えが50以下の足し算(7,26,33). 答えが50以下の足し算(7,27,34). 答えが50以下の足し算(7,28,35). 答えが50以下の足し算(7,29,36). 答えが50以下の足し算(7,30,37). 答えが50以下の足し算(7,31,38). 答えが50以下の足し算(7,32,39). 答えが50以下の足し算(7,33,40). 答えが50以下の足し算(7,34,41). 答えが50以下の足し算(7,35,42). 答えが50以下の足し算(7,36,43). 答えが50以下の足し算(7,37,44). 答えが50以下の足し算(7,38,45). 答えが50以下の足し算(7,39,46). 答えが50以下の足し算(7,40,47). 答えが50以下の足し算(7,41,48). 答えが50以下の足し算(7,42,49). 答えが50以下の足し算(7,43,50). 答えが50以下の足し算(8,1,9). 答えが50以下の足し算(8,2,10). 答えが50以下の足し算(8,3,11). 答えが50以下の足し算(8,4,12). 答えが50以下の足し算(8,5,13). 答えが50以下の足し算(8,6,14). 答えが50以下の足し算(8,7,15). 答えが50以下の足し算(8,8,16). 答えが50以下の足し算(8,9,17). 答えが50以下の足し算(8,10,18). 答えが50以下の足し算(8,11,19). 答えが50以下の足し算(8,12,20). 答えが50以下の足し算(8,13,21). 答えが50以下の足し算(8,14,22). 答えが50以下の足し算(8,15,23). 答えが50以下の足し算(8,16,24). 答えが50以下の足し算(8,17,25). 答えが50以下の足し算(8,18,26). 答えが50以下の足し算(8,19,27). 答えが50以下の足し算(8,20,28). 答えが50以下の足し算(8,21,29). 答えが50以下の足し算(8,22,30). 答えが50以下の足し算(8,23,31). 答えが50以下の足し算(8,24,32). 答えが50以下の足し算(8,25,33). 答えが50以下の足し算(8,26,34). 答えが50以下の足し算(8,27,35). 答えが50以下の足し算(8,28,36). 答えが50以下の足し算(8,29,37). 答えが50以下の足し算(8,30,38). 答えが50以下の足し算(8,31,39). 答えが50以下の足し算(8,32,40). 答えが50以下の足し算(8,33,41). 答えが50以下の足し算(8,34,42). 答えが50以下の足し算(8,35,43). 答えが50以下の足し算(8,36,44). 答えが50以下の足し算(8,37,45). 答えが50以下の足し算(8,38,46). 答えが50以下の足し算(8,39,47). 答えが50以下の足し算(8,40,48). 答えが50以下の足し算(8,41,49). 答えが50以下の足し算(8,42,50). 答えが50以下の足し算(9,1,10). 答えが50以下の足し算(9,2,11). 答えが50以下の足し算(9,3,12). 答えが50以下の足し算(9,4,13). 答えが50以下の足し算(9,5,14). 答えが50以下の足し算(9,6,15). 答えが50以下の足し算(9,7,16). 答えが50以下の足し算(9,8,17). 答えが50以下の足し算(9,9,18). 答えが50以下の足し算(9,10,19). 答えが50以下の足し算(9,11,20). 答えが50以下の足し算(9,12,21). 答えが50以下の足し算(9,13,22). 答えが50以下の足し算(9,14,23). 答えが50以下の足し算(9,15,24). 答えが50以下の足し算(9,16,25). 答えが50以下の足し算(9,17,26). 答えが50以下の足し算(9,18,27). 答えが50以下の足し算(9,19,28). 答えが50以下の足し算(9,20,29). 答えが50以下の足し算(9,21,30). 答えが50以下の足し算(9,22,31). 答えが50以下の足し算(9,23,32). 答えが50以下の足し算(9,24,33). 答えが50以下の足し算(9,25,34). 答えが50以下の足し算(9,26,35). 答えが50以下の足し算(9,27,36). 答えが50以下の足し算(9,28,37). 答えが50以下の足し算(9,29,38). 答えが50以下の足し算(9,30,39). 答えが50以下の足し算(9,31,40). 答えが50以下の足し算(9,32,41). 答えが50以下の足し算(9,33,42). 答えが50以下の足し算(9,34,43). 答えが50以下の足し算(9,35,44). 答えが50以下の足し算(9,36,45). 答えが50以下の足し算(9,37,46). 答えが50以下の足し算(9,38,47). 答えが50以下の足し算(9,39,48). 答えが50以下の足し算(9,40,49). 答えが50以下の足し算(9,41,50). 答えが50以下の足し算(10,1,11). 答えが50以下の足し算(10,2,12). 答えが50以下の足し算(10,3,13). 答えが50以下の足し算(10,4,14). 答えが50以下の足し算(10,5,15). 答えが50以下の足し算(10,6,16). 答えが50以下の足し算(10,7,17). 答えが50以下の足し算(10,8,18). 答えが50以下の足し算(10,9,19). 答えが50以下の足し算(10,10,20). 答えが50以下の足し算(10,11,21). 答えが50以下の足し算(10,12,22). 答えが50以下の足し算(10,13,23). 答えが50以下の足し算(10,14,24). 答えが50以下の足し算(10,15,25). 答えが50以下の足し算(10,16,26). 答えが50以下の足し算(10,17,27). 答えが50以下の足し算(10,18,28). 答えが50以下の足し算(10,19,29). 答えが50以下の足し算(10,20,30). 答えが50以下の足し算(10,21,31). 答えが50以下の足し算(10,22,32). 答えが50以下の足し算(10,23,33). 答えが50以下の足し算(10,24,34). 答えが50以下の足し算(10,25,35). 答えが50以下の足し算(10,26,36). 答えが50以下の足し算(10,27,37). 答えが50以下の足し算(10,28,38). 答えが50以下の足し算(10,29,39). 答えが50以下の足し算(10,30,40). 答えが50以下の足し算(10,31,41). 答えが50以下の足し算(10,32,42). 答えが50以下の足し算(10,33,43). 答えが50以下の足し算(10,34,44). 答えが50以下の足し算(10,35,45). 答えが50以下の足し算(10,36,46). 答えが50以下の足し算(10,37,47). 答えが50以下の足し算(10,38,48). 答えが50以下の足し算(10,39,49). 答えが50以下の足し算(10,40,50). 答えが50以下の足し算(11,1,12). 答えが50以下の足し算(11,2,13). 答えが50以下の足し算(11,3,14). 答えが50以下の足し算(11,4,15). 答えが50以下の足し算(11,5,16). 答えが50以下の足し算(11,6,17). 答えが50以下の足し算(11,7,18). 答えが50以下の足し算(11,8,19). 答えが50以下の足し算(11,9,20). 答えが50以下の足し算(11,10,21). 答えが50以下の足し算(11,11,22). 答えが50以下の足し算(11,12,23). 答えが50以下の足し算(11,13,24). 答えが50以下の足し算(11,14,25). 答えが50以下の足し算(11,15,26). 答えが50以下の足し算(11,16,27). 答えが50以下の足し算(11,17,28). 答えが50以下の足し算(11,18,29). 答えが50以下の足し算(11,19,30). 答えが50以下の足し算(11,20,31). 答えが50以下の足し算(11,21,32). 答えが50以下の足し算(11,22,33). 答えが50以下の足し算(11,23,34). 答えが50以下の足し算(11,24,35). 答えが50以下の足し算(11,25,36). 答えが50以下の足し算(11,26,37). 答えが50以下の足し算(11,27,38). 答えが50以下の足し算(11,28,39). 答えが50以下の足し算(11,29,40). 答えが50以下の足し算(11,30,41). 答えが50以下の足し算(11,31,42). 答えが50以下の足し算(11,32,43). 答えが50以下の足し算(11,33,44). 答えが50以下の足し算(11,34,45). 答えが50以下の足し算(11,35,46). 答えが50以下の足し算(11,36,47). 答えが50以下の足し算(11,37,48). 答えが50以下の足し算(11,38,49). 答えが50以下の足し算(11,39,50). 答えが50以下の足し算(12,1,13). 答えが50以下の足し算(12,2,14). 答えが50以下の足し算(12,3,15). 答えが50以下の足し算(12,4,16). 答えが50以下の足し算(12,5,17). 答えが50以下の足し算(12,6,18). 答えが50以下の足し算(12,7,19). 答えが50以下の足し算(12,8,20). 答えが50以下の足し算(12,9,21). 答えが50以下の足し算(12,10,22). 答えが50以下の足し算(12,11,23). 答えが50以下の足し算(12,12,24). 答えが50以下の足し算(12,13,25). 答えが50以下の足し算(12,14,26). 答えが50以下の足し算(12,15,27). 答えが50以下の足し算(12,16,28). 答えが50以下の足し算(12,17,29). 答えが50以下の足し算(12,18,30). 答えが50以下の足し算(12,19,31). 答えが50以下の足し算(12,20,32). 答えが50以下の足し算(12,21,33). 答えが50以下の足し算(12,22,34). 答えが50以下の足し算(12,23,35). 答えが50以下の足し算(12,24,36). 答えが50以下の足し算(12,25,37). 答えが50以下の足し算(12,26,38). 答えが50以下の足し算(12,27,39). 答えが50以下の足し算(12,28,40). 答えが50以下の足し算(12,29,41). 答えが50以下の足し算(12,30,42). 答えが50以下の足し算(12,31,43). 答えが50以下の足し算(12,32,44). 答えが50以下の足し算(12,33,45). 答えが50以下の足し算(12,34,46). 答えが50以下の足し算(12,35,47). 答えが50以下の足し算(12,36,48). 答えが50以下の足し算(12,37,49). 答えが50以下の足し算(12,38,50). 答えが50以下の足し算(13,1,14). 答えが50以下の足し算(13,2,15). 答えが50以下の足し算(13,3,16). 答えが50以下の足し算(13,4,17). 答えが50以下の足し算(13,5,18). 答えが50以下の足し算(13,6,19). 答えが50以下の足し算(13,7,20). 答えが50以下の足し算(13,8,21). 答えが50以下の足し算(13,9,22). 答えが50以下の足し算(13,10,23). 答えが50以下の足し算(13,11,24). 答えが50以下の足し算(13,12,25). 答えが50以下の足し算(13,13,26). 答えが50以下の足し算(13,14,27). 答えが50以下の足し算(13,15,28). 答えが50以下の足し算(13,16,29). 答えが50以下の足し算(13,17,30). 答えが50以下の足し算(13,18,31). 答えが50以下の足し算(13,19,32). 答えが50以下の足し算(13,20,33). 答えが50以下の足し算(13,21,34). 答えが50以下の足し算(13,22,35). 答えが50以下の足し算(13,23,36). 答えが50以下の足し算(13,24,37). 答えが50以下の足し算(13,25,38). 答えが50以下の足し算(13,26,39). 答えが50以下の足し算(13,27,40). 答えが50以下の足し算(13,28,41). 答えが50以下の足し算(13,29,42). 答えが50以下の足し算(13,30,43). 答えが50以下の足し算(13,31,44). 答えが50以下の足し算(13,32,45). 答えが50以下の足し算(13,33,46). 答えが50以下の足し算(13,34,47). 答えが50以下の足し算(13,35,48). 答えが50以下の足し算(13,36,49). 答えが50以下の足し算(13,37,50). 答えが50以下の足し算(14,1,15). 答えが50以下の足し算(14,2,16). 答えが50以下の足し算(14,3,17). 答えが50以下の足し算(14,4,18). 答えが50以下の足し算(14,5,19). 答えが50以下の足し算(14,6,20). 答えが50以下の足し算(14,7,21). 答えが50以下の足し算(14,8,22). 答えが50以下の足し算(14,9,23). 答えが50以下の足し算(14,10,24). 答えが50以下の足し算(14,11,25). 答えが50以下の足し算(14,12,26). 答えが50以下の足し算(14,13,27). 答えが50以下の足し算(14,14,28). 答えが50以下の足し算(14,15,29). 答えが50以下の足し算(14,16,30). 答えが50以下の足し算(14,17,31). 答えが50以下の足し算(14,18,32). 答えが50以下の足し算(14,19,33). 答えが50以下の足し算(14,20,34). 答えが50以下の足し算(14,21,35). 答えが50以下の足し算(14,22,36). 答えが50以下の足し算(14,23,37). 答えが50以下の足し算(14,24,38). 答えが50以下の足し算(14,25,39). 答えが50以下の足し算(14,26,40). 答えが50以下の足し算(14,27,41). 答えが50以下の足し算(14,28,42). 答えが50以下の足し算(14,29,43). 答えが50以下の足し算(14,30,44). 答えが50以下の足し算(14,31,45). 答えが50以下の足し算(14,32,46). 答えが50以下の足し算(14,33,47). 答えが50以下の足し算(14,34,48). 答えが50以下の足し算(14,35,49). 答えが50以下の足し算(14,36,50). 答えが50以下の足し算(15,1,16). 答えが50以下の足し算(15,2,17). 答えが50以下の足し算(15,3,18). 答えが50以下の足し算(15,4,19). 答えが50以下の足し算(15,5,20). 答えが50以下の足し算(15,6,21). 答えが50以下の足し算(15,7,22). 答えが50以下の足し算(15,8,23). 答えが50以下の足し算(15,9,24). 答えが50以下の足し算(15,10,25). 答えが50以下の足し算(15,11,26). 答えが50以下の足し算(15,12,27). 答えが50以下の足し算(15,13,28). 答えが50以下の足し算(15,14,29). 答えが50以下の足し算(15,15,30). 答えが50以下の足し算(15,16,31). 答えが50以下の足し算(15,17,32). 答えが50以下の足し算(15,18,33). 答えが50以下の足し算(15,19,34). 答えが50以下の足し算(15,20,35). 答えが50以下の足し算(15,21,36). 答えが50以下の足し算(15,22,37). 答えが50以下の足し算(15,23,38). 答えが50以下の足し算(15,24,39). 答えが50以下の足し算(15,25,40). 答えが50以下の足し算(15,26,41). 答えが50以下の足し算(15,27,42). 答えが50以下の足し算(15,28,43). 答えが50以下の足し算(15,29,44). 答えが50以下の足し算(15,30,45). 答えが50以下の足し算(15,31,46). 答えが50以下の足し算(15,32,47). 答えが50以下の足し算(15,33,48). 答えが50以下の足し算(15,34,49). 答えが50以下の足し算(15,35,50). 答えが50以下の足し算(16,1,17). 答えが50以下の足し算(16,2,18). 答えが50以下の足し算(16,3,19). 答えが50以下の足し算(16,4,20). 答えが50以下の足し算(16,5,21). 答えが50以下の足し算(16,6,22). 答えが50以下の足し算(16,7,23). 答えが50以下の足し算(16,8,24). 答えが50以下の足し算(16,9,25). 答えが50以下の足し算(16,10,26). 答えが50以下の足し算(16,11,27). 答えが50以下の足し算(16,12,28). 答えが50以下の足し算(16,13,29). 答えが50以下の足し算(16,14,30). 答えが50以下の足し算(16,15,31). 答えが50以下の足し算(16,16,32). 答えが50以下の足し算(16,17,33). 答えが50以下の足し算(16,18,34). 答えが50以下の足し算(16,19,35). 答えが50以下の足し算(16,20,36). 答えが50以下の足し算(16,21,37). 答えが50以下の足し算(16,22,38). 答えが50以下の足し算(16,23,39). 答えが50以下の足し算(16,24,40). 答えが50以下の足し算(16,25,41). 答えが50以下の足し算(16,26,42). 答えが50以下の足し算(16,27,43). 答えが50以下の足し算(16,28,44). 答えが50以下の足し算(16,29,45). 答えが50以下の足し算(16,30,46). 答えが50以下の足し算(16,31,47). 答えが50以下の足し算(16,32,48). 答えが50以下の足し算(16,33,49). 答えが50以下の足し算(16,34,50). 答えが50以下の足し算(17,1,18). 答えが50以下の足し算(17,2,19). 答えが50以下の足し算(17,3,20). 答えが50以下の足し算(17,4,21). 答えが50以下の足し算(17,5,22). 答えが50以下の足し算(17,6,23). 答えが50以下の足し算(17,7,24). 答えが50以下の足し算(17,8,25). 答えが50以下の足し算(17,9,26). 答えが50以下の足し算(17,10,27). 答えが50以下の足し算(17,11,28). 答えが50以下の足し算(17,12,29). 答えが50以下の足し算(17,13,30). 答えが50以下の足し算(17,14,31). 答えが50以下の足し算(17,15,32). 答えが50以下の足し算(17,16,33). 答えが50以下の足し算(17,17,34). 答えが50以下の足し算(17,18,35). 答えが50以下の足し算(17,19,36). 答えが50以下の足し算(17,20,37). 答えが50以下の足し算(17,21,38). 答えが50以下の足し算(17,22,39). 答えが50以下の足し算(17,23,40). 答えが50以下の足し算(17,24,41). 答えが50以下の足し算(17,25,42). 答えが50以下の足し算(17,26,43). 答えが50以下の足し算(17,27,44). 答えが50以下の足し算(17,28,45). 答えが50以下の足し算(17,29,46). 答えが50以下の足し算(17,30,47). 答えが50以下の足し算(17,31,48). 答えが50以下の足し算(17,32,49). 答えが50以下の足し算(17,33,50). 答えが50以下の足し算(18,1,19). 答えが50以下の足し算(18,2,20). 答えが50以下の足し算(18,3,21). 答えが50以下の足し算(18,4,22). 答えが50以下の足し算(18,5,23). 答えが50以下の足し算(18,6,24). 答えが50以下の足し算(18,7,25). 答えが50以下の足し算(18,8,26). 答えが50以下の足し算(18,9,27). 答えが50以下の足し算(18,10,28). 答えが50以下の足し算(18,11,29). 答えが50以下の足し算(18,12,30). 答えが50以下の足し算(18,13,31). 答えが50以下の足し算(18,14,32). 答えが50以下の足し算(18,15,33). 答えが50以下の足し算(18,16,34). 答えが50以下の足し算(18,17,35). 答えが50以下の足し算(18,18,36). 答えが50以下の足し算(18,19,37). 答えが50以下の足し算(18,20,38). 答えが50以下の足し算(18,21,39). 答えが50以下の足し算(18,22,40). 答えが50以下の足し算(18,23,41). 答えが50以下の足し算(18,24,42). 答えが50以下の足し算(18,25,43). 答えが50以下の足し算(18,26,44). 答えが50以下の足し算(18,27,45). 答えが50以下の足し算(18,28,46). 答えが50以下の足し算(18,29,47). 答えが50以下の足し算(18,30,48). 答えが50以下の足し算(18,31,49). 答えが50以下の足し算(18,32,50). 答えが50以下の足し算(19,1,20). 答えが50以下の足し算(19,2,21). 答えが50以下の足し算(19,3,22). 答えが50以下の足し算(19,4,23). 答えが50以下の足し算(19,5,24). 答えが50以下の足し算(19,6,25). 答えが50以下の足し算(19,7,26). 答えが50以下の足し算(19,8,27). 答えが50以下の足し算(19,9,28). 答えが50以下の足し算(19,10,29). 答えが50以下の足し算(19,11,30). 答えが50以下の足し算(19,12,31). 答えが50以下の足し算(19,13,32). 答えが50以下の足し算(19,14,33). 答えが50以下の足し算(19,15,34). 答えが50以下の足し算(19,16,35). 答えが50以下の足し算(19,17,36). 答えが50以下の足し算(19,18,37). 答えが50以下の足し算(19,19,38). 答えが50以下の足し算(19,20,39). 答えが50以下の足し算(19,21,40). 答えが50以下の足し算(19,22,41). 答えが50以下の足し算(19,23,42). 答えが50以下の足し算(19,24,43). 答えが50以下の足し算(19,25,44). 答えが50以下の足し算(19,26,45). 答えが50以下の足し算(19,27,46). 答えが50以下の足し算(19,28,47). 答えが50以下の足し算(19,29,48). 答えが50以下の足し算(19,30,49). 答えが50以下の足し算(19,31,50). 答えが50以下の足し算(20,1,21). 答えが50以下の足し算(20,2,22). 答えが50以下の足し算(20,3,23). 答えが50以下の足し算(20,4,24). 答えが50以下の足し算(20,5,25). 答えが50以下の足し算(20,6,26). 答えが50以下の足し算(20,7,27). 答えが50以下の足し算(20,8,28). 答えが50以下の足し算(20,9,29). 答えが50以下の足し算(20,10,30). 答えが50以下の足し算(20,11,31). 答えが50以下の足し算(20,12,32). 答えが50以下の足し算(20,13,33). 答えが50以下の足し算(20,14,34). 答えが50以下の足し算(20,15,35). 答えが50以下の足し算(20,16,36). 答えが50以下の足し算(20,17,37). 答えが50以下の足し算(20,18,38). 答えが50以下の足し算(20,19,39). 答えが50以下の足し算(20,20,40). 答えが50以下の足し算(20,21,41). 答えが50以下の足し算(20,22,42). 答えが50以下の足し算(20,23,43). 答えが50以下の足し算(20,24,44). 答えが50以下の足し算(20,25,45). 答えが50以下の足し算(20,26,46). 答えが50以下の足し算(20,27,47). 答えが50以下の足し算(20,28,48). 答えが50以下の足し算(20,29,49). 答えが50以下の足し算(20,30,50). 答えが50以下の足し算(21,1,22). 答えが50以下の足し算(21,2,23). 答えが50以下の足し算(21,3,24). 答えが50以下の足し算(21,4,25). 答えが50以下の足し算(21,5,26). 答えが50以下の足し算(21,6,27). 答えが50以下の足し算(21,7,28). 答えが50以下の足し算(21,8,29). 答えが50以下の足し算(21,9,30). 答えが50以下の足し算(21,10,31). 答えが50以下の足し算(21,11,32). 答えが50以下の足し算(21,12,33). 答えが50以下の足し算(21,13,34). 答えが50以下の足し算(21,14,35). 答えが50以下の足し算(21,15,36). 答えが50以下の足し算(21,16,37). 答えが50以下の足し算(21,17,38). 答えが50以下の足し算(21,18,39). 答えが50以下の足し算(21,19,40). 答えが50以下の足し算(21,20,41). 答えが50以下の足し算(21,21,42). 答えが50以下の足し算(21,22,43). 答えが50以下の足し算(21,23,44). 答えが50以下の足し算(21,24,45). 答えが50以下の足し算(21,25,46). 答えが50以下の足し算(21,26,47). 答えが50以下の足し算(21,27,48). 答えが50以下の足し算(21,28,49). 答えが50以下の足し算(21,29,50). 答えが50以下の足し算(22,1,23). 答えが50以下の足し算(22,2,24). 答えが50以下の足し算(22,3,25). 答えが50以下の足し算(22,4,26). 答えが50以下の足し算(22,5,27). 答えが50以下の足し算(22,6,28). 答えが50以下の足し算(22,7,29). 答えが50以下の足し算(22,8,30). 答えが50以下の足し算(22,9,31). 答えが50以下の足し算(22,10,32). 答えが50以下の足し算(22,11,33). 答えが50以下の足し算(22,12,34). 答えが50以下の足し算(22,13,35). 答えが50以下の足し算(22,14,36). 答えが50以下の足し算(22,15,37). 答えが50以下の足し算(22,16,38). 答えが50以下の足し算(22,17,39). 答えが50以下の足し算(22,18,40). 答えが50以下の足し算(22,19,41). 答えが50以下の足し算(22,20,42). 答えが50以下の足し算(22,21,43). 答えが50以下の足し算(22,22,44). 答えが50以下の足し算(22,23,45). 答えが50以下の足し算(22,24,46). 答えが50以下の足し算(22,25,47). 答えが50以下の足し算(22,26,48). 答えが50以下の足し算(22,27,49). 答えが50以下の足し算(22,28,50). 答えが50以下の足し算(23,1,24). 答えが50以下の足し算(23,2,25). 答えが50以下の足し算(23,3,26). 答えが50以下の足し算(23,4,27). 答えが50以下の足し算(23,5,28). 答えが50以下の足し算(23,6,29). 答えが50以下の足し算(23,7,30). 答えが50以下の足し算(23,8,31). 答えが50以下の足し算(23,9,32). 答えが50以下の足し算(23,10,33). 答えが50以下の足し算(23,11,34). 答えが50以下の足し算(23,12,35). 答えが50以下の足し算(23,13,36). 答えが50以下の足し算(23,14,37). 答えが50以下の足し算(23,15,38). 答えが50以下の足し算(23,16,39). 答えが50以下の足し算(23,17,40). 答えが50以下の足し算(23,18,41). 答えが50以下の足し算(23,19,42). 答えが50以下の足し算(23,20,43). 答えが50以下の足し算(23,21,44). 答えが50以下の足し算(23,22,45). 答えが50以下の足し算(23,23,46). 答えが50以下の足し算(23,24,47). 答えが50以下の足し算(23,25,48). 答えが50以下の足し算(23,26,49). 答えが50以下の足し算(23,27,50). 答えが50以下の足し算(24,1,25). 答えが50以下の足し算(24,2,26). 答えが50以下の足し算(24,3,27). 答えが50以下の足し算(24,4,28). 答えが50以下の足し算(24,5,29). 答えが50以下の足し算(24,6,30). 答えが50以下の足し算(24,7,31). 答えが50以下の足し算(24,8,32). 答えが50以下の足し算(24,9,33). 答えが50以下の足し算(24,10,34). 答えが50以下の足し算(24,11,35). 答えが50以下の足し算(24,12,36). 答えが50以下の足し算(24,13,37). 答えが50以下の足し算(24,14,38). 答えが50以下の足し算(24,15,39). 答えが50以下の足し算(24,16,40). 答えが50以下の足し算(24,17,41). 答えが50以下の足し算(24,18,42). 答えが50以下の足し算(24,19,43). 答えが50以下の足し算(24,20,44). 答えが50以下の足し算(24,21,45). 答えが50以下の足し算(24,22,46). 答えが50以下の足し算(24,23,47). 答えが50以下の足し算(24,24,48). 答えが50以下の足し算(24,25,49). 答えが50以下の足し算(24,26,50). 答えが50以下の足し算(25,1,26). 答えが50以下の足し算(25,2,27). 答えが50以下の足し算(25,3,28). 答えが50以下の足し算(25,4,29). 答えが50以下の足し算(25,5,30). 答えが50以下の足し算(25,6,31). 答えが50以下の足し算(25,7,32). 答えが50以下の足し算(25,8,33). 答えが50以下の足し算(25,9,34). 答えが50以下の足し算(25,10,35). 答えが50以下の足し算(25,11,36). 答えが50以下の足し算(25,12,37). 答えが50以下の足し算(25,13,38). 答えが50以下の足し算(25,14,39). 答えが50以下の足し算(25,15,40). 答えが50以下の足し算(25,16,41). 答えが50以下の足し算(25,17,42). 答えが50以下の足し算(25,18,43). 答えが50以下の足し算(25,19,44). 答えが50以下の足し算(25,20,45). 答えが50以下の足し算(25,21,46). 答えが50以下の足し算(25,22,47). 答えが50以下の足し算(25,23,48). 答えが50以下の足し算(25,24,49). 答えが50以下の足し算(25,25,50). 答えが50以下の足し算(26,1,27). 答えが50以下の足し算(26,2,28). 答えが50以下の足し算(26,3,29). 答えが50以下の足し算(26,4,30). 答えが50以下の足し算(26,5,31). 答えが50以下の足し算(26,6,32). 答えが50以下の足し算(26,7,33). 答えが50以下の足し算(26,8,34). 答えが50以下の足し算(26,9,35). 答えが50以下の足し算(26,10,36). 答えが50以下の足し算(26,11,37). 答えが50以下の足し算(26,12,38). 答えが50以下の足し算(26,13,39). 答えが50以下の足し算(26,14,40). 答えが50以下の足し算(26,15,41). 答えが50以下の足し算(26,16,42). 答えが50以下の足し算(26,17,43). 答えが50以下の足し算(26,18,44). 答えが50以下の足し算(26,19,45). 答えが50以下の足し算(26,20,46). 答えが50以下の足し算(26,21,47). 答えが50以下の足し算(26,22,48). 答えが50以下の足し算(26,23,49). 答えが50以下の足し算(26,24,50). 答えが50以下の足し算(27,1,28). 答えが50以下の足し算(27,2,29). 答えが50以下の足し算(27,3,30). 答えが50以下の足し算(27,4,31). 答えが50以下の足し算(27,5,32). 答えが50以下の足し算(27,6,33). 答えが50以下の足し算(27,7,34). 答えが50以下の足し算(27,8,35). 答えが50以下の足し算(27,9,36). 答えが50以下の足し算(27,10,37). 答えが50以下の足し算(27,11,38). 答えが50以下の足し算(27,12,39). 答えが50以下の足し算(27,13,40). 答えが50以下の足し算(27,14,41). 答えが50以下の足し算(27,15,42). 答えが50以下の足し算(27,16,43). 答えが50以下の足し算(27,17,44). 答えが50以下の足し算(27,18,45). 答えが50以下の足し算(27,19,46). 答えが50以下の足し算(27,20,47). 答えが50以下の足し算(27,21,48). 答えが50以下の足し算(27,22,49). 答えが50以下の足し算(27,23,50). 答えが50以下の足し算(28,1,29). 答えが50以下の足し算(28,2,30). 答えが50以下の足し算(28,3,31). 答えが50以下の足し算(28,4,32). 答えが50以下の足し算(28,5,33). 答えが50以下の足し算(28,6,34). 答えが50以下の足し算(28,7,35). 答えが50以下の足し算(28,8,36). 答えが50以下の足し算(28,9,37). 答えが50以下の足し算(28,10,38). 答えが50以下の足し算(28,11,39). 答えが50以下の足し算(28,12,40). 答えが50以下の足し算(28,13,41). 答えが50以下の足し算(28,14,42). 答えが50以下の足し算(28,15,43). 答えが50以下の足し算(28,16,44). 答えが50以下の足し算(28,17,45). 答えが50以下の足し算(28,18,46). 答えが50以下の足し算(28,19,47). 答えが50以下の足し算(28,20,48). 答えが50以下の足し算(28,21,49). 答えが50以下の足し算(28,22,50). 答えが50以下の足し算(29,1,30). 答えが50以下の足し算(29,2,31). 答えが50以下の足し算(29,3,32). 答えが50以下の足し算(29,4,33). 答えが50以下の足し算(29,5,34). 答えが50以下の足し算(29,6,35). 答えが50以下の足し算(29,7,36). 答えが50以下の足し算(29,8,37). 答えが50以下の足し算(29,9,38). 答えが50以下の足し算(29,10,39). 答えが50以下の足し算(29,11,40). 答えが50以下の足し算(29,12,41). 答えが50以下の足し算(29,13,42). 答えが50以下の足し算(29,14,43). 答えが50以下の足し算(29,15,44). 答えが50以下の足し算(29,16,45). 答えが50以下の足し算(29,17,46). 答えが50以下の足し算(29,18,47). 答えが50以下の足し算(29,19,48). 答えが50以下の足し算(29,20,49). 答えが50以下の足し算(29,21,50). 答えが50以下の足し算(30,1,31). 答えが50以下の足し算(30,2,32). 答えが50以下の足し算(30,3,33). 答えが50以下の足し算(30,4,34). 答えが50以下の足し算(30,5,35). 答えが50以下の足し算(30,6,36). 答えが50以下の足し算(30,7,37). 答えが50以下の足し算(30,8,38). 答えが50以下の足し算(30,9,39). 答えが50以下の足し算(30,10,40). 答えが50以下の足し算(30,11,41). 答えが50以下の足し算(30,12,42). 答えが50以下の足し算(30,13,43). 答えが50以下の足し算(30,14,44). 答えが50以下の足し算(30,15,45). 答えが50以下の足し算(30,16,46). 答えが50以下の足し算(30,17,47). 答えが50以下の足し算(30,18,48). 答えが50以下の足し算(30,19,49). 答えが50以下の足し算(30,20,50). 答えが50以下の足し算(31,1,32). 答えが50以下の足し算(31,2,33). 答えが50以下の足し算(31,3,34). 答えが50以下の足し算(31,4,35). 答えが50以下の足し算(31,5,36). 答えが50以下の足し算(31,6,37). 答えが50以下の足し算(31,7,38). 答えが50以下の足し算(31,8,39). 答えが50以下の足し算(31,9,40). 答えが50以下の足し算(31,10,41). 答えが50以下の足し算(31,11,42). 答えが50以下の足し算(31,12,43). 答えが50以下の足し算(31,13,44). 答えが50以下の足し算(31,14,45). 答えが50以下の足し算(31,15,46). 答えが50以下の足し算(31,16,47). 答えが50以下の足し算(31,17,48). 答えが50以下の足し算(31,18,49). 答えが50以下の足し算(31,19,50). 答えが50以下の足し算(32,1,33). 答えが50以下の足し算(32,2,34). 答えが50以下の足し算(32,3,35). 答えが50以下の足し算(32,4,36). 答えが50以下の足し算(32,5,37). 答えが50以下の足し算(32,6,38). 答えが50以下の足し算(32,7,39). 答えが50以下の足し算(32,8,40). 答えが50以下の足し算(32,9,41). 答えが50以下の足し算(32,10,42). 答えが50以下の足し算(32,11,43). 答えが50以下の足し算(32,12,44). 答えが50以下の足し算(32,13,45). 答えが50以下の足し算(32,14,46). 答えが50以下の足し算(32,15,47). 答えが50以下の足し算(32,16,48). 答えが50以下の足し算(32,17,49). 答えが50以下の足し算(32,18,50). 答えが50以下の足し算(33,1,34). 答えが50以下の足し算(33,2,35). 答えが50以下の足し算(33,3,36). 答えが50以下の足し算(33,4,37). 答えが50以下の足し算(33,5,38). 答えが50以下の足し算(33,6,39). 答えが50以下の足し算(33,7,40). 答えが50以下の足し算(33,8,41). 答えが50以下の足し算(33,9,42). 答えが50以下の足し算(33,10,43). 答えが50以下の足し算(33,11,44). 答えが50以下の足し算(33,12,45). 答えが50以下の足し算(33,13,46). 答えが50以下の足し算(33,14,47). 答えが50以下の足し算(33,15,48). 答えが50以下の足し算(33,16,49). 答えが50以下の足し算(33,17,50). 答えが50以下の足し算(34,1,35). 答えが50以下の足し算(34,2,36). 答えが50以下の足し算(34,3,37). 答えが50以下の足し算(34,4,38). 答えが50以下の足し算(34,5,39). 答えが50以下の足し算(34,6,40). 答えが50以下の足し算(34,7,41). 答えが50以下の足し算(34,8,42). 答えが50以下の足し算(34,9,43). 答えが50以下の足し算(34,10,44). 答えが50以下の足し算(34,11,45). 答えが50以下の足し算(34,12,46). 答えが50以下の足し算(34,13,47). 答えが50以下の足し算(34,14,48). 答えが50以下の足し算(34,15,49). 答えが50以下の足し算(34,16,50). 答えが50以下の足し算(35,1,36). 答えが50以下の足し算(35,2,37). 答えが50以下の足し算(35,3,38). 答えが50以下の足し算(35,4,39). 答えが50以下の足し算(35,5,40). 答えが50以下の足し算(35,6,41). 答えが50以下の足し算(35,7,42). 答えが50以下の足し算(35,8,43). 答えが50以下の足し算(35,9,44). 答えが50以下の足し算(35,10,45). 答えが50以下の足し算(35,11,46). 答えが50以下の足し算(35,12,47). 答えが50以下の足し算(35,13,48). 答えが50以下の足し算(35,14,49). 答えが50以下の足し算(35,15,50). 答えが50以下の足し算(36,1,37). 答えが50以下の足し算(36,2,38). 答えが50以下の足し算(36,3,39). 答えが50以下の足し算(36,4,40). 答えが50以下の足し算(36,5,41). 答えが50以下の足し算(36,6,42). 答えが50以下の足し算(36,7,43). 答えが50以下の足し算(36,8,44). 答えが50以下の足し算(36,9,45). 答えが50以下の足し算(36,10,46). 答えが50以下の足し算(36,11,47). 答えが50以下の足し算(36,12,48). 答えが50以下の足し算(36,13,49). 答えが50以下の足し算(36,14,50). 答えが50以下の足し算(37,1,38). 答えが50以下の足し算(37,2,39). 答えが50以下の足し算(37,3,40). 答えが50以下の足し算(37,4,41). 答えが50以下の足し算(37,5,42). 答えが50以下の足し算(37,6,43). 答えが50以下の足し算(37,7,44). 答えが50以下の足し算(37,8,45). 答えが50以下の足し算(37,9,46). 答えが50以下の足し算(37,10,47). 答えが50以下の足し算(37,11,48). 答えが50以下の足し算(37,12,49). 答えが50以下の足し算(37,13,50). 答えが50以下の足し算(38,1,39). 答えが50以下の足し算(38,2,40). 答えが50以下の足し算(38,3,41). 答えが50以下の足し算(38,4,42). 答えが50以下の足し算(38,5,43). 答えが50以下の足し算(38,6,44). 答えが50以下の足し算(38,7,45). 答えが50以下の足し算(38,8,46). 答えが50以下の足し算(38,9,47). 答えが50以下の足し算(38,10,48). 答えが50以下の足し算(38,11,49). 答えが50以下の足し算(38,12,50). 答えが50以下の足し算(39,1,40). 答えが50以下の足し算(39,2,41). 答えが50以下の足し算(39,3,42). 答えが50以下の足し算(39,4,43). 答えが50以下の足し算(39,5,44). 答えが50以下の足し算(39,6,45). 答えが50以下の足し算(39,7,46). 答えが50以下の足し算(39,8,47). 答えが50以下の足し算(39,9,48). 答えが50以下の足し算(39,10,49). 答えが50以下の足し算(39,11,50). 答えが50以下の足し算(40,1,41). 答えが50以下の足し算(40,2,42). 答えが50以下の足し算(40,3,43). 答えが50以下の足し算(40,4,44). 答えが50以下の足し算(40,5,45). 答えが50以下の足し算(40,6,46). 答えが50以下の足し算(40,7,47). 答えが50以下の足し算(40,8,48). 答えが50以下の足し算(40,9,49). 答えが50以下の足し算(40,10,50). 答えが50以下の足し算(41,1,42). 答えが50以下の足し算(41,2,43). 答えが50以下の足し算(41,3,44). 答えが50以下の足し算(41,4,45). 答えが50以下の足し算(41,5,46). 答えが50以下の足し算(41,6,47). 答えが50以下の足し算(41,7,48). 答えが50以下の足し算(41,8,49). 答えが50以下の足し算(41,9,50). 答えが50以下の足し算(42,1,43). 答えが50以下の足し算(42,2,44). 答えが50以下の足し算(42,3,45). 答えが50以下の足し算(42,4,46). 答えが50以下の足し算(42,5,47). 答えが50以下の足し算(42,6,48). 答えが50以下の足し算(42,7,49). 答えが50以下の足し算(42,8,50). 答えが50以下の足し算(43,1,44). 答えが50以下の足し算(43,2,45). 答えが50以下の足し算(43,3,46). 答えが50以下の足し算(43,4,47). 答えが50以下の足し算(43,5,48). 答えが50以下の足し算(43,6,49). 答えが50以下の足し算(43,7,50). 答えが50以下の足し算(44,1,45). 答えが50以下の足し算(44,2,46). 答えが50以下の足し算(44,3,47). 答えが50以下の足し算(44,4,48). 答えが50以下の足し算(44,5,49). 答えが50以下の足し算(44,6,50). 答えが50以下の足し算(45,1,46). 答えが50以下の足し算(45,2,47). 答えが50以下の足し算(45,3,48). 答えが50以下の足し算(45,4,49). 答えが50以下の足し算(45,5,50). 答えが50以下の足し算(46,1,47). 答えが50以下の足し算(46,2,48). 答えが50以下の足し算(46,3,49). 答えが50以下の足し算(46,4,50). 答えが50以下の足し算(47,1,48). 答えが50以下の足し算(47,2,49). 答えが50以下の足し算(47,3,50). 答えが50以下の足し算(48,1,49). 答えが50以下の足し算(48,2,50). 答えが50以下の足し算(49,1,50). '答えが50以下の足し算/3を定義する' :- forall(( between(1,M,50),between(1,N,50),S is M + N,S =< 50), assertz(答えが50以下の足し算(M,N,S))). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/328 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # a) 4桁の西暦を入力として受け取り # b) その年のすべての日について次の演算を行い # c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 # (例) # 20 + 13 + 11 + 25 = 69 # d) 各日の小計を大きいものから順に # 20131231 = 76 # ... # 20131125 = 69 # ... # 20130101 = 35 # のように表示させるプログラムを作りなさい # 'a) 4桁の西暦を入力として受け取り b) その年のすべての日について次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 (例) 20 + 13 + 11 + 25 = 69 d) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させるプログラムを作りなさい '(_四桁の西暦) :- findall([_小計,_年月日整数],( 'b) その年のすべての日について'(_四桁の西暦,_年月日整数), '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計)), _小計_年月日整数ならび), 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_四桁の西暦,_小計_年月日整数ならび). 'b) その年のすべての日について'(_四桁の西暦,_年月日整数) :- between(1,12,_月整数), 月末日(_四桁の西暦,_月整数,_月末日整数), between(1,_月末日整数,_日整数), _年月日整数 is _四桁の西暦 * 10000 + _月整数 * 10 + _日整数. 月末日(_年整数,_月整数,_月末日整数) :- うるう年(_年整数), nth1(_月整数,[31,29,31,30,31,30,31,31,30,31,30,31],_月末日整数). 月末日(_年整数,_月整数,_月末日整数) :- \+(うるう年(_年整数)), nth1(_月整数,[31,28,31,30,31,30,31,31,30,31,30,31],_月末日整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4. '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計) :- 年の上位2桁(_年月日整数,_年の上位2桁), 年の下位2桁(_年月日整数,_年の下位2桁), 月(_年月日整数,_月整数), 日(_年月日整数,_日整数), _小計 is _年の上位2桁 + _年の下位2桁 + _月整数 + _日整数. 年の上位2桁(_年月日整数,_年の上位2桁) :- _年の上位2桁 is _年月日整数 // 1000000. 年の下位2桁(_年月日整数,_年の下位2桁) :- _剰余 is _年月日整数 mod 10000, _年の下位2桁 is _剰余 mod 100. 月(_年月日整数,_月整数) :- _剰余 is _年月日整数 mod 10000, _月整数 is _剰余_1 // 100. 日(_年月日整数,_日整数) :- _日整数 is _年月日整数 mod 100. 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_年整数,_小計_年月日整数ならび) :- 年の組みの合計(_年整数,_年の組みの合計), forall((for(43,N,2),_小計 is _年の組みの合計 + N,member([_小計,_年月日整数],_小計_年月日整数ならび)),writef('%t = %t\n',[_年月日整数,_小計])). 年の組みの合計(_年整数,_年の組みの合計) :- _年の組みの合計 is _年整数 // 100 + _年整数 mod 100. % for/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/328 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # a) 4桁の西暦を入力として受け取り # b) その年のすべての日について次の演算を行い # c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 # (例) # 20 + 13 + 11 + 25 = 69 # d) 各日の小計を大きいものから順に # 20131231 = 76 # ... # 20131125 = 69 # ... # 20130101 = 35 # のように表示させるプログラムを作りなさい # 'a) 4桁の西暦を入力として受け取り b) その年のすべての日について次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 (例) 20 + 13 + 11 + 25 = 69 d) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させるプログラムを作りなさい '(_四桁の西暦) :- findall([_小計,_年月日整数],( 'b) その年のすべての日について'(_四桁の西暦,_年月日整数), '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計)), _小計_年月日整数ならび), 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_小計_年月日整数ならび). 'b) その年のすべての日について'(_四桁の西暦,_年月日整数) :- between(1,12,_月整数), 月末日(_四桁の西暦,_月整数,_月末日整数), between(1,_月末日整数,_日整数), _年月日整数 is _四桁の西暦 * 10000 + _月整数 * 10 + _日整数. 月末日(_年整数,_月整数,_月末日整数) :- うるう年(_年整数), nth1(_月整数,[31,29,31,30,31,30,31,31,30,31,30,31],_月末日整数). 月末日(_年整数,_月整数,_月末日整数) :- \+(うるう年(_年整数)), nth1(_月整数,[31,28,31,30,31,30,31,31,30,31,30,31],_月末日整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4. '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計) :- 年の上位2桁(_年月日整数,_年の上位2桁), 年の下位2桁(_年月日整数,_年の下位2桁), 月(_年月日整数,_月整数), 日(_年月日整数,_日整数), _小計 is _年の上位2桁 + _年の下位2桁 + _月整数 + _日整数. 年の上位2桁(_年月日整数,_年の上位2桁) :- _年の上位2桁 is _年月日整数 // 1000000. 年の下位2桁(_年月日整数,_年の下位2桁) :- _剰余 is _年月日整数 mod 10000, _年の下位2桁 is _剰余 mod 100. 月(_年月日整数,_月整数) :- _剰余 is _年月日整数 mod 10000, _月整数 is _剰余_1 // 100. 日(_年月日整数,_日整数) :- _日整数 is _年月日整数 mod 100. 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_小計_年月日整数ならび) :- 各日の小計を大きいものから順に(_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび), forall(member([_小計,_年月日整数],_大きいものから順に整列した_小計_年月日整数ならび),writef('%t = %t\n',[_年月日整数,_小計])). 各日の小計を大きいものから順に(_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび) :- sort(_小計_年月日整数ならび,_小さいものから順に整列した_小計_年月日整数ならび), reverse(_小さいものから順に整列した_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび), % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/68 # # お題:文字列をランダムに並べ替える。 # ただし、どの文字も元と同じ位置ではないこと。 '文字列をランダムに並べ替える。 ただし、どの文字も元と同じ位置ではないこと。'(_文字列,_ランダムに並べ替えた文字列) :- 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび), 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列). 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび) :- atom_length(_文字列,_文字列の長さ), length(_位置決めならび,_文字列の長さ), findall(N,between(1,_文字列の長さ,N),_整数順ならび), 位置を置換する(_整数順ならび,_文字列の置換位置ならび). 位置を置換する([],_位置決めならび) :- !. 位置を置換する([_位置1,_位置2,_位置3],_位置決めならび) :- 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび). 位置決めならび(L,_位置決めならび) :- 位置の交換(L,R,_位置決めならび), 位置を置換する(R,_位置決めならび). 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび) :- nth1(_位置1,_位置決めならび,_位置2), nth1(_位置2,_位置決めならび,_位置3), nth1(_位置3,_位置決めならび,_位置1),!. 位置の交換(L,L2,_位置決めならび) :- 位置選択(L,N1,L1), 位置選択(N2,L1,L2), nth1(N1,_位置決めならび,N2), nth1(N2,_位置決めならび,N1),!. 位置選択(L,_位置,L2) :- length(L,Len), _乱数値 is random(Len), length(L0,Len), append(L0,[_位置|R],L), append(L0,R,L2),!. 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列) :- findall(_文字,( member(_位置,_文字列の置換位置ならび), _位置_1 is _位置 - 1, sub_atom(_文字列,_位置_1,1,_,_文字)), _ランダムに並べ替えた文字ならび), atomic_list_concat(_ランダムに並べ替えた文字ならび,_ランダムに並べ替えた文字列). % 以下のサイトは # # お題:'+'と'-'の文字を使わないコードで"Hello, world!"をn回、表示する。 # '''+''と''-''の文字を使わないコードで"Hello, world!"をn回、表示する。'(_n) :- forall(between(1,_n,_),write('Hello, Wold!\n')). % 以下のサイトは # 回文数 # コマ大数学科の問題だそうですよ。 # 引用 # ある数字とその数字を逆さに並べた数字を足して # 回文数になるまでこの操作を繰り返すとき # 1番回文数になりにくい2桁の数字を答えなさい。 # # *回文数:逆から読んでも同じ数になる数 # 例えば…96なら # 【1回目】96+69=165 # 【2回目】165+561=726 # 【3回目】726+627=1353 # 【4回目】1353+3531=4884 # となります。 'ある数字とその数字を逆さに並べた数字を足して 回文数になるまでこの操作を繰り返すとき 1番回文数になりにくい2桁の数字を答えなさい。'(_2桁の数字,_回文数になるまでの最大回数,_回文数) :- 'ある数字とその数字を逆さに並べた数字を足して 回文数になるまでこの操作を繰り返すとき'(_ある数字と回文数になるまでの回数と回文数のならび), '1番回文数になりにくい'(_ある数字と回文数になるまでの回数と回文数のならび,_2桁の数字,_回文数になるまでの最大回数,_回文数). 'ある数字とその数字を逆さに並べた数字を足して 回文数になるまでこの操作を繰り返すとき'(_ある数字と回文数になるまでの回数と回文数のならび) :- findall([_ある数字,_回文数になるまでの回数,_回文数],( 2桁の数字(_ある数字), 'ある数字とその数字を逆さに並べた数字を足して回文数になるまでこの操作を繰り返す'(_ある数字,[],_回文数になるまでの回数,_回文数)), _ある数字と回文数になるまでの回数と回文数のならび). ある数字とその数字を逆さに並べた数字を足して回文数になるまでこの操作を繰り返す(_回文数,Ln,_回文数になるまでの回数,_回文数) :- 回文数(_回文数), length(Ln,_回文数になるまでの回数),!. ある数字とその数字を逆さに並べた数字を足して回文数になるまでこの操作を繰り返す(_数字_1,L,_回文数になるまでの回数,_回文数) :- ある数字とその数字を逆さに並べた数字を足して(_数字_1,_数字_3), ある数字とその数字を逆さに並べた数字を足して回文数になるまでこの操作を繰り返す(_数字_3,[_|L],_回文数になるまでの回数,_回文数). 回文数(_数字) :- number_chars(_数字,L), reverse(L,L). ある数字とその数字を逆さに並べた数字を足して(_数字_1,_数字_3) :- number_chars(_数字_1,L2), reverse(L1,L2), number_chars(_数字_2,L2), 数字_3 is _数字_1 + _数字_2. '1番回文数になりにくい'(_ある数字と回文数になるまでの回数のならび,_ある数,_回文数になるまでの最大回数,_回文数) :- findmax(_回文数になるまでの回数,( member([_,_回文数になるまでの回数,_],_ある数字と回文数になるまでの回数のならび)), _回文数になるまでの最大回数), member([_ある数字,_回文数になるまでの最大回数,_回文数],_ある数字と回文数になるまでの回数のならび). '2桁の数字'(_2桁の数字) :- between(11,99,_2桁の数字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/240 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/2viXY6 forかwhileをつかって # 1から10までの整数のうち、偶数の合計を求めなさい。 # 1から100までの整数で、奇数だけの合計、偶数だけの合計、総合計をもとめよ; # y=5x+8の値をxが0〜10まで、1ずつ増やした時のyの値 # 10^3+30^3+50^3+70^3+90^3の計算 # '1から10までの整数のうち、偶数の合計を求めなさい。'(_1から10までの整数のうち_偶数の合計) :- findsum(_1から10までの整数のうち_偶数の,( '1から10までの整数のうち、偶数の'(_1から10までの整数のうち_偶数の)), _1から10までの整数のうち_偶数の合計). '1から10までの整数のうち、偶数の'(_1から10までの整数のうち_偶数の) :- '1から10までの整数のうち、'(_1から10までの整数のうち_偶数の), 偶数(_1から10までの整数のうち_偶数の). '1から10までの整数のうち、'(_1から10までの整数のうち_偶数の) :- between(1,10,_1から10までの整数のうち_偶数の). 偶数(_1から10までの整数のうち_偶数の) :- 0 is _1から10までの整数のうち_偶数の mod 2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1から100までの整数で、奇数だけの合計、偶数だけの合計、総合計をもとめよ'(_奇数だけの合計,_偶数だけの合計,_総合計) :- findsum([_奇数,_偶数,_1から100までの整数],( '1から100までの整数で、'(_1から100までの整数), '奇数、偶数'(_1から100までの整数,_奇数,_偶数)), [_奇数だけの合計,_偶数だけの合計,_総合計]). '1から100までの整数で、'(_1から100までの整数) :- between(1,100,_1から100までの整数). '奇数、偶数'(_1から100までの整数,_1から100までの整数,0) :- 1 is _1から100までの整数 mod 2,!. '奇数、偶数'(_1から100までの整数,0,_1から100までの整数) :- 0 is _1から100までの整数 mod 2,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'y=5x+8の値をxが0〜10まで、1ずつ増やした時のyの値'(_yの値) :- between(0,10,_x), _yの値 is 5 * _x + 8, _x = 10. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '10^3+30^3+50^3+70^3+90^3の計算'(_計算結果) :- findsum(X,( member([M,N],[[10,3],[50,3],[70,3],[90,3]]), '^'(M,N,X)), _計算結果). '^'(_,0,1) :- !. '^'(M,N,X) :- N_1 is N - 1, '^'(M,N_1,Y), X is M * Y. % 以下のサイトは # 出典:: 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(_値ならび,_合計値),!. % 以下のサイトは # 【 課題 】 # 入力: int n # 出力: List list # n 列の長さを持つすべての順列を辞書式で出力するメソッドを作成せよ。 # n=3の時 # 結果は{123,132,213,231,312,321} # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】なし # 【 期限 】11/07/2013 # 【 Ver  】"1.7.0_11" # # よろしくお願いいたします。 '入力: int n 出力: List list n 列の長さを持つすべての順列を辞書式で出力するメソッドを作成せよ。 n=3の時 結果は{123,132,213,231,312,321}'(_n,_順列ならび) :- findall(N,between(1,_n,N),_数ならび), findall(_数値,( 順列(_数ならび,_n,_順列), 一桁の数値ならびから整数(_順列,_数値)), _順列ならび). 順列(_,0,[]). 順列(L,N,[A|R]) :- select(A,L,L2), N_1 is N - 1, 順列(L2,N_1,R). 一桁の数値ならびから整数(_一桁の数値ならび,_数値) :- 一桁の数値ならびから整数(_一桁の数値ならび,M,_数値). 一桁の数値ならびから整数([N],1,N). 一桁の数値ならびから整数([N|R],M,_整数) :- 一桁の数値ならびから整数(R,M_1,_整数_1), M is M_1 + 1, _整数 is 10 ^ M_1 * N + _整数_1. % 以下のサイトは # 【 課題 】 # 入力: int n # 出力: List list # n 列の長さを持つすべての順列を辞書式で出力するメソッドを作成せよ。 # n=3の時 # 結果は{123,132,213,231,312,321} # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】なし # 【 期限 】11/07/2013 # 【 Ver  】"1.7.0_11" # # よろしくお願いいたします。 '入力: int n 出力: List list n 列の長さを持つすべての順列を辞書式で出力するメソッドを作成せよ。 n=3の時 結果は{123,132,213,231,312,321}'(_n,_順列ならび) :- 数字列を生成する(_n,_数字ならび), findall(_数値,( 順列(_数字ならび,_n,_数字順列), number_chars(_数値,_数字順列)), _順列ならび). 数字列を生成する(_n,_数字ならび) :- findall(A,( between(1,_n,N), atom_number(A,N)), _数字ならび). 順列(_,0,[]). 順列(L,N,[A|R]) :- select(A,L,L2), N_1 is N - 1, 順列(L2,N_1,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/835 # # 【課題】X * Y = 115 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい # 【 期限 】2013/11/06 # 【 Ver  】"1.7.0_11" # # いまいちわからず困っています。 # よろしくお願いします。 'X * Y = 115 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい' :- forall('X * Y = 115 になる 素数Xと素数Yを求める'(_X,_Y), 表示しなさい(_X,_Y)). 'X * Y = 115 になる 素数Xと素数Yを求める'(_X,_Y) :- '115以下の素数ならびを得る'(_115以下の素数ならび), 組合せ(_115以下の素数ならび,2,[_X,_Y]), 115 is _X * _Y. '115以下の素数ならびを得る'(_115以下の素数ならび) :- findall(N,between(2,115,N),_2から115までの整数ならび), エラトステネスの篩(_2から115までの整数ならび,_115以下の素数ならび). 組合せ(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). エラトステネスの篩([],[]) :- !. エラトステネスの篩([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). 表示しなさい(_X,_Y) :- writef('%t\n',[_X,_Y]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/832 # # 【課題】X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい # 【 期限 】2013/11/06 # 【 Ver  】"1.7.0_11" # # いまいちわからず困っています。 # よろしくお願いします。 'X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい' :- 'X * Y = 125 になる 素数Xと素数Yを求める'(_X_Y_組合せならび),!, forall(member([_X,_Y],_X_Y_組合せならび), 表示しなさい(_X,_Y)). 'X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい' :- writef('解がありません!\n'), fail. 'X * Y = 125 になる 素数Xと素数Yを求める'(_X_Y_組合せならび) :- '125以下の素数ならびを得る'(_125以下の素数ならび), findall([_X,_Y],( 組合せ(_125以下の素数ならび,2,[_X,_Y]), 125 is X * Y), _X_Y_組合せならび), \+(_X_Y_組合せならび=[]). '125以下の素数ならびを得る'(_125以下の素数ならび) :- findall(N,between(2,125,N),_2から125までの整数ならび), エラトステネスの篩(_2から125までの整数ならび,_125以下の素数ならび). 組合せ(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). エラトステネスの篩([],[]) :- !. エラトステネスの篩([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). 表示しなさい(_X,_Y) :- writef('%t %t\n',[_X,_Y]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/142 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ # input関数とshow関数を作ること # コマンド引数にテキストファイルの名前を入れること # 'テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ。コマンド引数にテキストファイルの名前を入れること' :- コマンド引数からテキストファイルの名前を得る(_テキストファイル), テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル). コマンド引数からテキストファイルの名前を得る(_テキストファイル) :- current_prolog_flag(argv,ParameterList), append(_,['--'|[_テキストファイル]],ParameterList). テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル) :- テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル,Outstream), そのテキストファイルの中身を出力せよ(_テキストファイル). テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル) :- open(_テキストファイル,write,Outstream). そのなかに整数5個数字を入れる(Outstream), close(Outstream). そのなかに整数5個数字を入れる(Outstream) :- between(1,5,_何番目), 整数を得る(_整数), writef(Outstream,'%t\n',[_整数]), _何番目 = 5. そのテキストファイルの中身を出力せよ(_テキストファイル) :- open(_テキストファイル,read,Instream), copy_stream_data(Instream,user_output), close(Instream). % % ここではズルをして組込述語 copy_stream_data/2 を使って見た。 % % 本来ならget_lines/2とput_lines/2の組合せでコピーを表現するところ。 % % そのテキストファイルの中身を出力せよ(_テキストファイル) :- % get_lines(_テキストファイル,_行ならび), % put_lines(user_output,_行ならび). % % get_lines(_ファイル名,_行ならび) :- % open(_ファイル名,read,Instream), % findall(_行,( % repeat, % ( at_end_of_stream(Instream),!,fail; % get_line(Instream,_行))), % _行ならび), % close(Instream). % % put_lines(_ファイル名,_行ならび) :- % open(_ファイル名,write,Outstream), % forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), % close(Outstream). % % 以下のサイトは % % カレンダーの形式(何曜日から始まるか)と % 月日数と1日の曜日が分かっている時 % カレンダーをならびに得る。 % 第一週と最終週を変数で補正した曜日起点月カレンダー補正(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー_1), 第一週と最終週を変数で補正した(_カレンダー_1,_カレンダー). 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- findall(N,between(1,_月日数,N),_日ならび), 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号), 曜日番号からカレンダーを作成する(_起点曜日番号,_日ならび,_カレンダー). 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号) :- 曜日番号(_曜日番号_1,_起点曜日形式), 曜日番号(_曜日番号,_1日の曜日), _起点曜日番号 is (7 - (_曜日番号 - _曜日番号_1)) mod 7. 曜日番号からカレンダーを作成する(0,_日ならび,_カレンダー) :- 'N個組'(7,_日ならび,_カレンダー),!. 曜日番号からカレンダーを作成する(_曜日番号,_日ならび,[L0|LL]) :- length(L0,_曜日番号), append(L0,L1,_日ならび), 'N個組'(7,L1,LL). 曜日番号(0,日曜) :- !. 曜日番号(1,月曜) :- !. 曜日番号(2,火曜) :- !. 曜日番号(3,水曜) :- !. 曜日番号(4,木曜) :- !. 曜日番号(5,金曜) :- !. 曜日番号(6,土曜) :- !. 'N個組'(_,[],[]) :- !. 'N個組'(N,L,[U|R]) :- 先頭からN個(N,L,U,R1), 'N個組'(N,R1,R). 先頭からN個(_,[],[],[]) :- !. 先頭からN個(0,L,[],L) :- !. 先頭からN個(N,[A|R1],[A|R2],R) :- M is N - 1, 先頭からN個(M,R1,R2,R). 第一週と最終週を変数で補正した([L|LL1],[[_1,_2,_3,_4,_5,_6,_7]|LL2]) :- 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]), 最終週を変数で補正(LL1,LL2). 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]) :- append(_,L,[_1,_2,_3,_4,_5,_6,_7]). 最終週を変数で補正(LL1,LL2) :- append(LL1_1,[L_2],LL1), append(L_2,_,[_11,_12,_13,_14,_15,_16,_17]), append(LL1_1,[[_11,_12,_13,_14,_15,_16,_17]],LL2),!. 変数だけ値を詰める([],_). 変数だけ値を詰める([V|R],V) :- 変数だけ値を詰める(R,V),!. 変数だけ値を詰める([_|R],V) :- 変数だけ値を詰める(R,V). 変数だけ要素位置番号を詰める([],_). 変数だけ要素位置番号を詰める([N|R],N) :- N_2 is N + 1, 変数だけ要素位置番号を詰める(R,N_2),!. 変数だけ要素位置番号を詰める([_|R],N) :- N_2 is N + 1, 変数だけ要素位置番号を詰める(R,N_2). % 以下のサイトは % % 再帰を使わず、かつ、バックトラックを駆使したハノイの塔 % :- dynamic(ハノイの塔/3). :- dynamic(ハノイの塔/1). :- dynamic(ハノイの塔/0). :- dynamic(履歴/3). ハノイの塔(N) :- ハノイの塔列の生成(N), ハノイの塔_2(1), listing(履歴). ハノイの塔列の生成(N) :- findall(M,between(1,N,M),A), assertz(履歴(A,[],[])), assertz(ハノイの塔(A,[],[])), between(1,1000000,N2), N3 is N2 + 1, assertz((ハノイの塔_2(N2) :- ハノイの塔,ハノイの塔_2(N3))), N3 = 1000000, assertz(ハノイの塔_2(1000000)). ハノイの塔 :- ハノイの塔([],[],_),!. ハノイの塔 :- ハノイの塔([A|R],B,C), \+(履歴(R,[A|B],C)), 重ね検査(A,B), ( asseretz(ハノイの塔(R,[A|B],C)), retract(ハノイの塔([A|R],B,C)), asserz(履歴(R,[A|B],C)); retract(履歴(R,[A|B],C)), asseretz(ハノイの塔([A|R],B,C)), retract(ハノイの塔(R,[A|B],C)), fail). ハノイの塔 :- ハノイの塔([A|R],C,B), \+(履歴(R,C,[A|B])), 重ね検査(A,B), ( asseretz(ハノイの塔(R,C,[A|B])), retract(ハノイの塔([A|R],C,B)), asserz(履歴(R,C,[A|B])); retract(履歴(R,C,[A|B])), asseretz(ハノイの塔([A|R],C,B)), retract(ハノイの塔(R,C,[A|B])), fail). ハノイの塔 :- ハノイの塔(B,[A|R],C), \+(履歴([A|B],R,C)), 重ね検査(A,B), ( asseretz(ハノイの塔([A|B],R,C)), retract(ハノイの塔(B,[A|R],C)), asserz(履歴([A|B],R,C)); retract(履歴([A|B],R,C)), asseretz(ハノイの塔(B,[A|R],C)), retract(ハノイの塔([A|B],R,C)), fail). ハノイの塔 :- ハノイの塔(B,C,[A|R]), \+(履歴([A|B],C,R)), 重ね検査(A,B), ( asseretz(ハノイの塔([A|B],C,R)), retract(ハノイの塔(B,C,[A|R])), asserz(履歴([A|B],C,R)); retract(履歴([A|B],C,R)), asseretz(ハノイの塔(B,C,[A|R])), retract(ハノイの塔([A|B],C,R)), fail). ハノイの塔 :- ハノイの塔(C,[A|R],B), \+(履歴(C,R,[A|B])), 重ね検査(A,B), ( asseretz(ハノイの塔(C,R,[A|B])), retract(ハノイの塔(C,[A|R],B)), asserz(履歴(C,R,[A|B])); retract(履歴(C,R,[A|B])), asseretz(ハノイの塔(C,[A|R],B)), retract(ハノイの塔(C,R,[A|B])), fail). ハノイの塔 :- ハノイの塔(C,B,[A|R]), \+(履歴(C,[A|B],R)), 重ね検査(A,B), ( asseretz(ハノイの塔(C,[A|B],R)), retract(ハノイの塔(C,B,[A|R])), asserz(履歴(C,[A|B],R)); retract(履歴(C,[A|B],R)), asseretz(ハノイの塔(C,B,[A|R])), retract(ハノイの塔(C,[A|B],R)), fail). 重ね検査(A,[]). 重ね検査(A,[B|_]) :- A @< B. % 以下のサイトは # WinXP HomeでBorland C++ Compiler 5.5 # ・1からnまでの整数1個ずつで構成される全部でn個の要素から、 # r個の要素を重複なく取り出した場合の組み合わせを全て昇順で並べたものの中で、 # 具体的な組み合わせと具体的な序列が何番目かを相互に返すプログラム。 # 例 43C6なら、序数5054214は組み合わせ11,14,17,18,34,36 # 例 43C6なら、組み合わせ13,28,29,37,38,41は5498643 # コマンドはncr.exe [n],[r] [co][ra] x.txtの様な感じで '1からnまでの整数1個ずつで構成される全部でn個の要素から、 r個の要素を重複なく取り出した場合の組み合わせを全て昇順で並べたものの中で、 具体的な組み合わせと具体的な序列が何番目かを相互に返す'(_n,_r,_序数,_具体的な組合せ) :- findall(M,between(1,_n,M),L), findall(_組合わせ,組合せ(L,_r,_組合わせ),_組合わせならび), nth1(_序数,_組合わせならび,_具体的な組合わせ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R3]) :- N > 1, M is N - 1, 組合せ(R1,M,R3). 組合せ([_|R1],N,L) :- N > 1, 組合せ(R1,N,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/777 # # 【課題】X * Y = 123 になる素数 XとYを求め、結果をすべて表示しなさい。 # 【 期限 】2013/10/15 # 【 Ver  】"1.7.0_11" # がんばってますが期限までに理解できる気がしないので # 基礎的なことだとは思いますが、よろしく御願いします 'X * Y = 123 になる素数 XとYを求め、結果をすべて表示しなさい。' :- forall('X * Y = 123 になる素数 XとYを求め、'(X,Y), '結果をすべて表示しなさい。'(X,Y)). 'X * Y = 123 になる素数 XとYを求め、'(X,Y) :- findall(N,between(2,123,N),L), エラトステネスの篩(L,_素数ならび), 重複組合せ(_素数ならび,2,[X,Y]), 123 is X * Y. '結果をすべて表示しなさい。'(X,Y) :- writef('X=%t,Y=%t\n',[X,Y]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 重複組合せ(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) . エラトステネスの篩([],[]) :- !. エラトステネスの篩([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). % 以下のサイトは :- dynamic(階乗保存計算/2). 'ウィルソンの定理を使って素数を判定する関数is_primeを実装し、100000以下の素数以外をリストに得る'(_10000以下の素数リスト) :- findall(_p,( between(1,10000,_p), \+(is_prime(_p))), _10000以下の素数リスト). is_prime(_p) :- 'ウィルソンの定理とは pが素数 <=> (p-1)!+1 (mod p) == 0'(_p). 'ウィルソンの定理とは pが素数 <=> (p-1)!+1 (mod p) == 0'(_p) :- _p > 0, Y is _p - 1, 階乗保存計算(Y,Z), 0 is (Z + 1) mod _p,!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). % 以下のサイトは # # お題:n番目からn+9番目のフィボナッチ数の総和を求めよ。 # 'n番目からn+9番目のフィボナッチ数の総和'(Nth,_フィボナッチ数の総和) :- 'n番目からn+9番目のフィボナッチ数ならび'(Nth,_フィボナッチ数ならび), sum_list(_フィボナッチ数ならび,_フィボナッチ数の総和),!. 'n番目からn+9番目のフィボナッチ数ならび'(Nth,_フィボナッチ数ならび) :- findall(X,'n番目からn+9番目のフィボナッチ数'(Nth,X),_フィボナッチ数ならび). 'n番目からn+9番目のフィボナッチ数'(Nth_1,X) :- Nth_9 is Nth_1 + 9, 'n番目からn+9番目のフィボナッチ数'(0,0,1,Nth_1,Nth_9,X). 'n番目からn+9番目のフィボナッチ数'(Nth,M,N,Nth_1,Nth_9,M) :- between(Nth_1,Nth_9,Nth). 'n番目からn+9番目のフィボナッチ数'(Nth,M,N,Nth_1,Nth_9,X) :- M2 is M + N, Nth_2 is Nth + 1, Nth_2 =< Nth_9, 'n番目からn+9番目のフィボナッチ数'(Nth_2,N,M2,Nth_1,Nth_9,X). % 以下のサイトは # # お題:テキストファイルを読み込み、その中で最もよく使われている単語ベスト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). % 以下のサイトは nクイーン(_nクイーン,_一解) :- '1からnまでの数ならびを得る(縦横の利き筋はこれを行ごとに一つずつ選択することで回避される)'(_nクイーン,_数ならび), 行ごとに順に駒を置き利き筋を調べて一解を得る(_数ならび,[],_一解). 行ごとに順に駒を置き利き筋を調べて一解を得る([],_一解,_一解). 行ごとに順に駒を置き利き筋を調べて一解を得る(_位置ならび,Qs,_一解) :- '駒の位置と残り駒の位置ならびを得る(この選択自体が縦横の利き筋検査になっている)'(_駒の位置,_位置ならび,_残り駒の位置ならび), 斜めの利き筋に駒はない(_駒の位置,1,Qs), 行ごとに順に駒を置き利き筋を調べて一解を得る(_残り駒の位置ならび,[_駒の位置|Qs],_一解). '駒の位置と残り駒の位置ならびを得る(この選択自体が縦横の利き筋検査になっている)'(_駒の位置,[_駒の位置|_残り駒の位置ならび],_残り駒の位置ならび). '駒の位置と残り駒の位置ならびを得る(この選択自体が縦横の利き筋検査になっている)'(X,[H|T],[H|T1]) :- '駒の位置と残り駒の位置ならびを得る(この選択自体が縦横の利き筋検査になっている)'(X,T,T1). 斜めの利き筋に駒はない(_,_,[]). 斜めの利き筋に駒はない(Q,_隔たり,[Q1|Qs]) :- Q + _隔たり =\= Q1, Q - _隔たり =\= Q1, _隔たり_2 is _隔たり + 1, 斜めの利き筋に駒はない(Q,_隔たり_2,Qs). '1からnまでの数ならびを得る(縦横の利き筋はこれを行ごとに一つずつ選択することで回避される)'(_nクイーン,_数ならび) :- findall(M,between(1,_nクイーン,M),_数ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数ならび'(_81以下の自然数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'([_],[_],_81以下の自然数ならび,_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数ならび'(_81以下の自然数ならび) :- findall(_数,between(1,81,_数),_81以下の自然数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'([_,_,_,_,_,_,_,_,_],[_,_,_,_,_,_,_,_,_,_],_81以下の自然数で九九に現れない数ならび,_81以下の自然数で九九に現れない数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_,_,_,_,_,_,_,_,_,_],L1,L) :- '81以下の自然数で九九に現れない数を昇順にすべて'([_|Ln1],[_],L1,L). '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,Ln2,L1,L) :- 九九に現れる数を削除(Ln1,Ln2,L1,L2), '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_|Ln2],L2,L). 九九に現れる数を削除(Ln1,Ln2,L1,L2) :- ならび掛け算(Ln1,Ln2,Ln3), length(Ln3,_九九に現れる数), 数をL1から削除してL2とする(_九九に現れる数,L1,L2),!. 九九に現れる数を削除(_,_,L,L). ならび掛け算(_,[],[]). ならび掛け算(L1,[B|R2],L) :- ならび掛け算(L1,R2,L2), append(L1,L2,L). 数をL1から削除してL2とする(_数,L1,L2) :- append(L0,[_数|R],L1), append(L0,R,L2). '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数ならび'(_81以下の自然数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'([_],[_],_81以下の自然数ならび,_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数ならび'(_81以下の自然数ならび) :- findall(_数,between(1,81,_数),_81以下の自然数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'([_,_,_,_,_,_,_,_,_],[_,_,_,_,_,_,_,_,_,_],_81以下の自然数で九九に現れない数ならび,_81以下の自然数で九九に現れない数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_,_,_,_,_,_,_,_,_,_],L1,L) :- '81以下の自然数で九九に現れない数を昇順にすべて'([_|Ln1],[_],L1,L). '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,Ln2,L1,L) :- 九九に現れる数を削除(Ln1,Ln2,L1,L2), '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_|Ln2],L2,L). 九九に現れる数を削除(Ln1,Ln2,L1,L2) :- ならびの要素数表現を数表現に変換(Ln1,Ln2,_数_1,_数_2), _九九に現れる数 is _数_1 * _数_2, 数をL1から削除してL2とする(_九九に現れる数,L1,L2),!. 九九に現れる数を削除(_,_,L,L). ならびの要素数表現を数表現に変換(Ln1,Ln2,_数_1,_数_2) :- length(Ln1,_数_1), length(Ln2,_数_2). 数をL1から削除してL2とする(_数,L1,L2) :- append(L0,[_数|R],L1), append(L0,R,L2). '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数で九九に現れない数ならび) :- '81以下の自然数ならび'(_81以下の自然数ならび), 九九に現れる数ならび(_九九に現れる数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数ならび,_九九に現れる数ならび,_81以下の自然数で九九に現れない数ならび). '81以下の自然数ならび'(_81以下の自然数ならび) :- findall(_数,between(1,81,_数),_81以下の自然数ならび). 九九に現れる数ならび(_九九に現れる数ならび) :- findall(_九九,( 九九(_九九)), _九九に現れる数ならび). 九九(_九九) :- between(1,9,_数_1), between(1,9,_数_2), _九九 is _数_1 * _数_2. '81以下の自然数で九九に現れない数を昇順にすべて'([],_,[]) :- !. '81以下の自然数で九九に現れない数を昇順にすべて'([_数|R1],_九九に現れる数ならび,[_数|R3]) :- 九九に現れない数(_数,_九九に現れる数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'(R1,_九九に現れる数ならび,R3),!. '81以下の自然数で九九に現れない数を昇順にすべて'([_|R1],_九九に現れる数ならび,R3) :- '81以下の自然数で九九に現れない数を昇順にすべて'(R1,_九九に現れる数ならび,R3). 九九に現れない数(_数,_九九に現れる数ならび) :- \+(member(_数,_九九に現れる数ならび)). '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数ならび'(_81以下の自然数ならび), 九九に現れる数ならび(_九九に現れる数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数ならび,_九九に現れる数ならび,_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数ならび'(_81以下の自然数ならび) :- findall(_数,between(1,81,_数),_81以下の自然数ならび). 九九に現れる数ならび(_九九に現れる数ならび) :- findall(_九九,( 九九(_九九)), _九九に現れる数ならび). 九九(_九九) :- between(1,9,_数_1), between(1,9,_数_2), _九九 is _数_1 * _数_2. '81以下の自然数で九九に現れない数を昇順にすべて'([],_,[]) :- !. '81以下の自然数で九九に現れない数を昇順にすべて'([_数|R1],_九九に現れる数ならび,[_数|R3]) :- \+(member(_数,_九九に現れる数ならび)), '81以下の自然数で九九に現れない数を昇順にすべて'(R1,_九九に現れる数ならび,R3),!. '81以下の自然数で九九に現れない数を昇順にすべて'([_|R1],_九九に現れる数ならび,R3) :- '81以下の自然数で九九に現れない数を昇順にすべて'(R1,_九九に現れる数ならび,R3). '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- findall(N,between(1,81,N),L_1), '81以下の自然数で九九に現れない数を昇順ですべて'(1,1,L_1,L_2), '表示せよ。'(L_2). '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1,_,L,L) :- _n_1 > 9,!. '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1,_n_2,L_1,L) :- _n_2 > 9, _n_1_2 is _n_1 + 1, '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1_2,1,L_1,L). '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1,_n_2,L_1,L_2) :- _n_3 is _n_1 * _n_2, 空白に置換(_n_3,L_1,L_2), _n_2_2 is _n_2 + 1, '81以下の自然数で九九に現れない数を'(_n_1,_n_2_2,L_3,L). 空白に置換(N,L_1,L_2) :- append(L0,[N|R],L_1), append(L0,[' '|R],L_2). 表示せよ(L) :- atomic_list_concat(L,_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- between(1,81,_自然数), 九九に現れない数を(_自然数), 表示せよ(_自然数), _自然数 = 81. 九九に現れない数を(_自然数) :- \+(九九に現れる数(_自然数)). 九九に現れる数(_自然数) :- between(1,9,_n1), between(1,9,_n2), _自然数 is _n1 * _n2,!. 表示せよ(_自然数) :- writef('%t ',[_自然数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数で'(_81以下の自然数), 九九に現れない数を(_81以下の自然数), '表示せよ。'(_81以下の自然数), _81以下の自然数 = 81. '81以下の自然数で'(_81以下の自然数) :- between(1,81,_81以下の自然数). 九九に現れない数を(_81以下の自然数) :- \+(九九に現れる数を(_81以下の自然数)). 九九に現れる数を(_81以下の自然数) :- 重複組合せ([1,2,3,4,5,6,7,8,9],2,[M,N]), _81以下の自然数 is M * N,!. '表示せよ。'(_81以下の自然数) :- writef('%t ',[_81以下の自然数]). 重複組合せ(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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数で九九に現れない数ならび) :- findall(_81以下の自然数,( '81以下の自然数で'(_81以下の自然数), 九九に現れない数(_81以下の自然数)),_81以下の自然数で九九に現れない数ならび). '81以下の自然数で'(_81以下の自然数) :- between(1,81,_81以下の自然数). 九九に現れない数(_81以下の自然数) :- \+(九九に現れる数(_81以下の自然数)). 九九に現れる数(_九九に現れる数) :- between(1,9,_数_1), between(1,9,_数_2), _九九に現れる数 is _数_1 * _数_2. '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1376111807/98 # # '10円と100円と1000円の買い物をした時に払う # 金額のリストを考えてみました # # map(sum)[[x,y,z]|x<-[0,10],y<-[0,100],z<-[0,1000]] # # これを任意の組に拡張するには # どういう方法があるでしょうか? # '10円と100円と1000円の買い物をした時に払う 金額のリストを考えてみました map(sum)[[x,y,z]|x<-[0,10],y<-[0,100],z<-[0,1000]] これを任意の組に拡張するには どういう方法があるでしょうか?'(_買い物をした時に支払う金額ならび,_金額組合せ) :- 買い物をした時に払う金額(_買い物をした時に支払う金額ならび,_重複を許す金額ならび), sort(_重複を許す金額ならび,_金額組合せ). 買い物をした時に払う金額(_買い物をした時に支払う金額ならび,_金額ならび) :- length(_買い物をした時に支払う金額ならび,_ならびの長さ), findall(_金額,( between(1,_ならびの長さ,N), 組合せ(_買い物をした時に支払う金額ならび,N,L), sum(L,_金額)), _金額ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/714 # # 【 課題 】3で割り切れる数の自然数の中で、7で割ったとき「2余らない数」を求めて下さい。 # 【 形態 】Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】9月6日 # 【 Ver  】javac 1.7.0_25 # 【 補足 】 # 1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する # 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する # # # よろしくお願いします。 # # '3で割り切れる数の自然数の中で、7で割ったとき「2余らない数」を求めて下さい。 1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する' :- between(1,90,_個), '3で割り切れる数の自然数の中で、'(_3で割り切れる数の自然数), '7で割ったとき「2余らない数」を求めて下さい。'(_3で割り切れる数の自然数,_3で割り切れる数の自然数の中で7で割ったとき2余らない数), '1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_個,_3で割り切れる数の自然数の中で7で割ったとき2余らない数), _個 = 90. '3で割り切れる数の自然数の中で、'(_3で割り切れる数の自然数) :- '3で割り切れる数の自然数の中で、'(1,_3で割り切れる数の自然数). '3で割り切れる数の自然数の中で、'(_3で割り切れる数の自然数,_3で割り切れる数の自然数) :- 0 is _3で割り切れる数の自然数 mod 3. '3で割り切れる数の自然数の中で、'(_自然数_1,_3で割り切れる数の自然数) :- _自然数_2 is _自然数_1 + 1, '3で割り切れる数の自然数の中で、'(_自然数_2,_3で割り切れる数の自然数). '7で割ったとき「2余らない数」を求めて下さい。'(_数,_7で割ったとき2余らない数). \+(2 is _数 mod 7). '1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_個,_数) :- '行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_個). '1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_個,_数) :- 0 is _個数 mod 10, writef(' %t\n',[_数]). '1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_個,_数) :- \+(0 is _個数 mod 10), writef(' %t',[_数]). '行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_個) :- 1 is _個 mod 10, _行 is (_個 // 10) + 1, writef('%t:',[_行]), fail. % 以下のサイトは # 出典:: 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の冪) :- between(0,_n,_冪), _2の冪 is 2 ^ _冪, _2の冪 > _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(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- message_queue_create(_キュー番号), ( thread_create(度数(_限界度数,_キュー番号),_,[]); findall(_蒐集項,( call(_目標), thread_get_message(_キュー番号,_項), ( _項 = 0,!,fail;true)), _蒐集項ならび)). 度数(_限界度数,_キュー番号) :- 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(_キュー番号), 度数(_限界度数,_キュー番号), 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] % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/782 # # 読み込むiniファイルのセクション名を、string配列にpushし続けて、 # セクション名すべてpushしたらループから外れるって仕組みなんですけど、tmp = strtok_s()の代入がうまくいきません # どうしたらいいですか # # char SectionNames[1024]; # GetPrivateProfileSectionNames(SectionNames,1024,FilePath.c_str()); # # char *WTF;//謎の内部パラメータ,strtok_sの仕様 # vector<string> SquadNameList; # SquadNameList.push_back(strtok_s( SectionNames, "0" ,&WTF)); # # for(int i=0; i < SquadNameList.size();i++){ # char tmp[256]; # tmp = strtok_s( NULL, "0" ,&WTF); # if( tmp != NULL){ # SquadNameList.push_back(tmp); # } # } # # '読み込むiniファイルのセクション名を、string配列にpushし続けて、 セクション名すべてpushしたらループから外れるって仕組みなんですけど、 tmp = strtok_s()の代入がうまくいきませんどうしたらいいですか'(_iniファイル,_セクション名ならび) :- 読み込むiniファイルの(_iniファイル,_iniファイル文字ならび), 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_iniファイル文字ならび,[],_セクション名ならび). 読み込むiniファイルの(_iniファイル,_iniファイル文字ならび) :- get_chars(_iniファイル,_iniファイル文字ならび). 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_iniファイル文字ならび,L1,_セクション名ならび) :- セクション名を(_iniファイル文字ならび,_セクション名,_セクション名後の文字ならび), 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_セクション名後の文字ならび,[_セクション名|L1],_セクション名ならび). 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_iniファイル文字ならび,_セクション名ならび,_セクション名ならび). セクション名を(_iniファイル文字ならび,_セクション名,_セクション名後の文字ならび) :- append(L0,['['|_セクション名からの文字ならび],_iniファイル文字ならび), 'L0に[も]も存在しない'(L0), append(L0_1,[']'|_セクション名後の文字ならび],_セクション名からの文字ならび), 'L0_1に]が存在しない'(_セクション名後の文字ならび), atom_chars(_セクション名,_セクション名後の文字ならび). 'L0に[も]も存在しない'(L0) :- \+(member('[',L0)), \+(member(']',L0)),!. 'L0_1に]が存在しない'(L0_1) :- \+(member(']',L0_1)). % 以下のサイトは # # お題:整数同士の掛け算の筆算の計算過程を表示するプログラム # 整数同士の掛け算の筆算の計算過程を表示する(_整数_1,_整数_2) :- それぞれの整数を数値ならびに変換(_整数_1,_整数_2,_整数ならび_1,_整数ならび_2), 掛け算の筆算の計算過程を表示する(_整数ならび_1,_整数ならび_2). それぞれの整数を数値ならびに変換(_整数_1,_整数_2,_整数ならび_1,_整数ならび_2) :- number_chars(_整数_1,Chars_1), number_chars(_整数_2,Chars_2), 数字ならびを数値ならびに変換(Chars_1,_整数ならび_1), 数字ならびを数値ならびに変換(Chars_2,_整数ならび_2). 数字ならびを数値ならびに変換([],[]). 数字ならびを数値ならびに変換([A|R1],[N|R2]) :- atom_number(A,N), 数字ならびを数値ならびに変換(R1,R2). 掛け算の筆算の計算過程を表示する(_整数ならび_1,_整数ならび_2) :- reverse(_整数ならび_1,_反転した整数ならび_1), reverse(_整数ならび_2,_反転した整数ならび_2), '掛け算の筆算の計算過程(下の桁から掛ける)を表示する'(0,_反転した整数ならび_1,_反転した整数ならび_2,_前段の数ならび), 各桁の加算を表示する(_全段の数ならび). '掛け算の筆算の計算過程(下の桁から掛ける)を表示する'(_,_,[],[]). '掛け算の筆算の計算過程(下の桁から掛ける)を表示する'(_n,L1,[_m|R2],[L2|R4]) :- 乗数がn桁目の掛算(_n,_m,L1,L2), '掛け算の筆算の計算過程の表示'(_n,_m,L1,L2), _n_2 is _n + 1, '掛け算の筆算の計算過程(下の桁から掛ける)を表示する'(_n_2,L1,R2,R4). '掛け算の筆算の計算過程の表示'(_n,_m,L1,L2) :- reverse(L1,L1_2), atomic_list_concat(L1_2,S1), reverse(L2,L2_2), atomic_list_concat(L2_2,S2), writef('%t×%t=% t ... (%t)\n',[S1,_m,S,_n2]). 乗数がn桁目の掛算(_n,_m,L1,L2) :- length(L4,_n), all(L4,0), append(L4,L1,L1_2), 段の掛算(_m,L1_2,0,[],L2),!. 段の掛算(_,[],0,L,L) :- !. 段の掛算(_,[],C,L1,[C|L1]) :- !. 段の掛算(M,[N|R2],C,L3,L) :- 九九掛算(M,N,N1,N2), D is (N1 * 10 + C + N2) // 10, M2 is (C + N2) mod 10, 段の掛算(M,R2,D,[M2|L3],L). 各桁の加算を表示する(_全段の数ならび) :- 全段を逆順に並べ直す(_全段の数ならび,_逆順の全段の数ならび), length(_全段の数ならび,Len), 各桁の加算を表示する(_逆順の全段の数ならび,Len,0). 各桁の加算を表示する([],Len,S) :- findall(S,( between(1,Len,N), swritef(S,'(%w)',[N])), L), atomic_list_concat(L,'+',S1), writef('%w=%w\n',[S1,S]),!. 各桁の加算を表示する(_逆順の全段の数ならび,Len,S) :- 下の桁から加算する(_逆順の前段の数ならび,0,S1,R2), 各桁の加算を表示する(R2,Len,S1). 全段を逆順に並べ直す([],[]). 全段を逆順に並べ直す([L1|R1],[L2|R2]) :- reverse(L1,L2), 全段を逆順に並べ直す(R1,R2). 下の桁から加算する([],S,S,[]). 下の桁から加算する([[M|R1_1]|R1],S1,S,[R1_1|R2]) :- S2 is S1 + M, 下の桁から加算する(R,S2,S,R2),!. 下の桁から加算する([[]|R1],S1,S,R2) :- 下の桁から加算する(R,S1,S,R2). 九九掛算(M,N,X_1,X_2) :- length(L1,M), length(L2,N), append(L1,L2,L3), ならびの割り算(L3,[_,_,_,_,_,_,_,_,_,_],L4,L5), length(L4,X_1), length(L5,X_2). 九九掛算(0,0,0,0). 九九掛算(0,1,0,0). 九九掛算(0,2,0,0). 九九掛算(0,3,0,0). 九九掛算(0,4,0,0). 九九掛算(0,5,0,0). 九九掛算(0,6,0,0). 九九掛算(0,7,0,0). 九九掛算(0,8,0,0). 九九掛算(0,9,0,0). 九九掛算(1,0,0,0). 九九掛算(1,1,0,1). 九九掛算(1,2,0,2). 九九掛算(1,3,0,3). 九九掛算(1,4,0,4). 九九掛算(1,5,0,5). 九九掛算(1,6,0,6). 九九掛算(1,7,0,7). 九九掛算(1,8,0,8). 九九掛算(1,9,0,9). 九九掛算(2,0,0,0). 九九掛算(2,1,0,2). 九九掛算(2,2,0,4). 九九掛算(2,3,0,6). 九九掛算(2,4,0,8). 九九掛算(2,5,1,0). 九九掛算(2,6,1,2). 九九掛算(2,7,1,4). 九九掛算(2,8,1,6). 九九掛算(2,9,1,8). 九九掛算(3,0,0,0). 九九掛算(3,1,0,3). 九九掛算(3,2,0,6). 九九掛算(3,3,0,9). 九九掛算(3,4,1,2). 九九掛算(3,5,1,5). 九九掛算(3,6,1,8). 九九掛算(3,7,2,1). 九九掛算(3,8,2,4). 九九掛算(3,9,2,7). 九九掛算(4,0,0,0). 九九掛算(4,1,0,4). 九九掛算(4,2,0,8). 九九掛算(4,3,1,2). 九九掛算(4,4,1,6). 九九掛算(4,5,2,0). 九九掛算(4,6,2,4). 九九掛算(4,7,2,8). 九九掛算(4,8,3,2). 九九掛算(4,9,3,6). 九九掛算(5,0,0,0). 九九掛算(5,1,0,5). 九九掛算(5,2,1,0). 九九掛算(5,3,1,5). 九九掛算(5,4,2,0). 九九掛算(5,5,2,5). 九九掛算(5,6,3,0). 九九掛算(5,7,3,5). 九九掛算(5,8,4,0). 九九掛算(5,9,4,5). 九九掛算(6,0,0,0). 九九掛算(6,1,0,6). 九九掛算(6,2,1,2). 九九掛算(6,3,1,8). 九九掛算(6,4,2,4). 九九掛算(6,5,3,0). 九九掛算(6,6,3,6). 九九掛算(6,7,4,2). 九九掛算(6,8,4,8). 九九掛算(6,9,5,4). 九九掛算(7,0,0,0). 九九掛算(7,1,0,7). 九九掛算(7,2,1,4). 九九掛算(7,3,2,1). 九九掛算(7,4,2,8). 九九掛算(7,5,3,5). 九九掛算(7,6,4,2). 九九掛算(7,7,4,9). 九九掛算(7,8,5,6). 九九掛算(7,9,6,3). 九九掛算(8,0,0,0). 九九掛算(8,1,0,8). 九九掛算(8,2,1,6). 九九掛算(8,3,2,4). 九九掛算(8,4,3,2). 九九掛算(8,5,4,0). 九九掛算(8,6,4,8). 九九掛算(8,7,5,6). 九九掛算(8,8,6,4). 九九掛算(8,9,7,2). 九九掛算(9,0,0,0). 九九掛算(9,1,0,9). 九九掛算(9,2,1,8). 九九掛算(9,3,2,7). 九九掛算(9,4,3,6). 九九掛算(9,5,4,5). 九九掛算(9,6,5,4). 九九掛算(9,7,6,3). 九九掛算(9,8,7,2). 九九掛算(9,9,8,1). all([],0). all([A|R],A) :- all(R,A). ならびの割り算([],_,[],[]) :- !. ならびの割り算(_被除算項,_除算項,[_|_R3],_剰余項) :- length(_除算項,N), length(_除算項_2,N), append(_除算項_2,R,_被除算項), ならびの割り算(R,_除算項_2,_R3,_剰余項),!. ならびの割り算(L,_,[],_剰余項) :- length(L,N), length(_剰余項,N),!. % 以下のサイトは # # お題:100以下の自然数でふたつの素数の積で表せる数を昇順にすべて表示せよ。 # '100以下の自然数でふたつの素数の積で表せる数を昇順にすべて表示せよ。' :- '100までの素数をエラトステネスの篩で求める'(_100までの素数ならび), '100以下の自然数でふたつの素数の積で表せる数を'(_100までの素数ならび,_ふたつの素数の積で表せる数ならび), '昇順にすべて表示せよ。'(_ふたつの素数の積で表せる数ならび). '100以下の自然数でふたつの素数の積で表せる数を'(_100までの素数ならび,_ふたつの素数の積で表せる数ならび) :- findall(_100までの自然数,( '100以下の自然数で'(_100以下の自然数), ふたつの素数の積で表せる数(_100までの自然数,_100までの素数ならび)), _ふたつの素数の積で表せる数ならび). '100以下の自然数で'(_100以下の自然数) :- between(1,100,_100以下の自然数). ふたつの素数の積で表せる数(_100以下の自然数,_100までの素数ならび) :- 組合せ(_100までの素数ならび,2,[_素数_1,_素数_2]), _100以下の自然数 is _素数_1 * _素数_2,!. '昇順にすべて表示せよ。'(_ふたつの素数の積で表せる数ならび) :- sort(_ふたつの素数の積で表せる数ならび,_整列したふたつの素数の積で表せる数ならび), atomic_list_concat(_整列したふたつの素数の積で表せる数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '100までの素数をエラトステネスの篩で求める'(_100までの素数ならび) :- findall(N,between(2,100,N),L), エラトステネスの篩(L,_100までの素数ならび). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). 組合せ(X,1,[A]) :- member(A,X). 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). % 以下のサイトは 苗字をn人分作る(_n,_苗字ならび) :- findall([_苗字,_10000人中の人数],( 苗字と10000人中の人数を得る(_苗字,_10000人中の人数)), LL1). 苗字分布ならびに変換する(LL1,0,LL2), length(_苗字ならび,_n), 苗字ならびにn人分の苗字を埋める(LL2,_苗字ならび). 苗字と10000人中の人数を得る(_苗字,_10000人中の人数) :- 苗字(_苗字,_出現比率), _10000人中の人数 is truncate(_出現比率 * 10000). 苗字分布ならびに変換する([],_,[]). 苗字分布ならびに変換する([[_苗字,N]|R1],M,[[_苗字,M,M_2]|R2]) :- M_2 is M + N, 苗字分布ならびに変換する(R1,M_2,R2). 苗字ならびにn人分の苗字を埋める(_,[]). 苗字ならびにn人分の苗字を埋める(LL2,[A|R]) :- 苗字を得る(LL2,_苗字), 苗字ならびにn人分の苗字を埋める(LL2,R),!. 苗字ならびにn人分の苗字を埋める(LL2,L) :- 苗字ならびにn人分の苗字を埋める(LL2,L). 苗字を得る(LL2,_苗字) :- _乱数 is random(10000), member([A,B,C],LL2), between(B,C,_乱数). % *** user: '苗字' / 2 *** 苗字(佐藤,0.0227). 苗字(高橋,0.0164). 苗字(伊藤,0.0124). 苗字(渡辺,0.0121). 苗字(小林,0.0118). 苗字(吉田,0.0093). 苗字(佐々木,0.0084). 苗字(松本,0.0071). 苗字(木村,0.0065). 苗字(斎藤,0.0061). 苗字(山崎,0.0055). 苗字(森,0.0052). 苗字(橋本,0.005). 苗字(石川,0.0047). 苗字(前田,0.0044). 苗字(後藤,0.0043). 苗字(岡田,0.0042). 苗字(長谷川,0.0042). 苗字(石井,0.004). 苗字(坂本,0.0038). 苗字(藤井,0.0036). 苗字(福田,0.0035). 苗字(西村,0.0035). 苗字(太田,0.0035). 苗字(原田,0.0033). 苗字(中野,0.0033). 苗字(小野,0.0033). 苗字(竹内,0.0032). 苗字(中山,0.0031). 苗字(石田,0.003). 苗字(上田,0.0028). 苗字(森田,0.0028). 苗字(横山,0.0027). 苗字(宮崎,0.0026). 苗字(内田,0.0026). 苗字(谷口,0.0025). 苗字(丸山,0.0025). 苗字(大野,0.0024). 苗字(菅原,0.0023). 苗字(武田,0.0023). 苗字(上野,0.0023). 苗字(千葉,0.0023). 苗字(増田,0.0022). 苗字(小山,0.0022). 苗字(平野,0.0022). 苗字(渡部,0.0021). 苗字(菊地,0.0021). 苗字(松尾,0.0021). 苗字(木下,0.0021). 苗字(野村,0.002). 苗字(鈴木,0.0195). 苗字(田中,0.0149). 苗字(山本,0.0122). 苗字(中村,0.0119). 苗字(加藤,0.0097). 苗字(山田,0.0092). 苗字(山口,0.0073). 苗字(井上,0.0067). 苗字(林,0.0061). 苗字(清水,0.0059). 苗字(阿部,0.0054). 苗字(池田,0.0051). 苗字(山下,0.0049). 苗字(中島,0.0045). 苗字(藤田,0.0044). 苗字(小川,0.0043). 苗字(村上,0.0042). 苗字(近藤,0.0041). 苗字(斉藤,0.0038). 苗字(遠藤,0.0038). 苗字(青木,0.0036). 苗字(三浦,0.0035). 苗字(藤原,0.0035). 苗字(松田,0.0034). 苗字(岡本,0.0033). 苗字(中川,0.0033). 苗字(田村,0.0032). 苗字(金子,0.0031). 苗字(和田,0.003). 苗字(工藤,0.0028). 苗字(原,0.0028). 苗字(酒井,0.0027). 苗字(柴田,0.0027). 苗字(宮本,0.0026). 苗字(高木,0.0026). 苗字(安藤,0.0025). 苗字(今井,0.0024). 苗字(高田,0.0024). 苗字(河野,0.0023). 苗字(藤本,0.0023). 苗字(杉山,0.0023). 苗字(村田,0.0022). 苗字(小島,0.0022). 苗字(大塚,0.0022). 苗字(久保,0.0022). 苗字(松井,0.0021). 苗字(岩崎,0.0021). 苗字(佐野,0.0021). 苗字(野口,0.0021). 苗字(新井,0.002). 苗字(古川,0.002). 苗字(杉本,0.002). 苗字(菊池,0.0019). 苗字(市川,0.0019). 苗字(島田,0.0019). 苗字(山内,0.0018). 苗字(吉川,0.0018). 苗字(東,0.0018). 苗字(中田,0.0017). 苗字(川口,0.0017). 苗字(安田,0.0017). 苗字(川崎,0.0017). 苗字(本田,0.0017). 苗字(川上,0.0016). 苗字(田口,0.0016). 苗字(吉村,0.0016). 苗字(福島,0.0016). 苗字(中西,0.0016). 苗字(松岡,0.0016). 苗字(岩田,0.0016). 苗字(森本,0.0016). 苗字(秋山,0.0016). 苗字(松下,0.0016). 苗字(大橋,0.0015). 苗字(小池,0.0015). 苗字(吉岡,0.0015). 苗字(大久保,0.0015). 苗字(野田,0.0015). 苗字(星野,0.0015). 苗字(堀,0.0014). 苗字(尾崎,0.0014). 苗字(黒田,0.0014). 苗字(松村,0.0014). 苗字(西山,0.0014). 苗字(田辺,0.0013). 苗字(片山,0.0013). 苗字(岩本,0.0013). 苗字(広瀬,0.0013). 苗字(岡崎,0.0013). 苗字(早川,0.0013). 苗字(横田,0.0013). 苗字(荒井,0.0013). 苗字(篠原,0.0012). 苗字(高山,0.0012). 苗字(栗原,0.0012). 苗字(松原,0.0012). 苗字(三宅,0.0012). 苗字(伊東,0.0012). 苗字(岡,0.0012). 苗字(福井,0.0011). 苗字(大西,0.002). 苗字(小松,0.002). 苗字(高野,0.0019). 苗字(五十嵐,0.0019). 苗字(水野,0.0019). 苗字(桜井,0.0018). 苗字(西田,0.0018). 苗字(北村,0.0018). 苗字(西川,0.0017). 苗字(久保田,0.0017). 苗字(平田,0.0017). 苗字(関,0.0017). 苗字(飯田,0.0016). 苗字(土屋,0.0016). 苗字(樋口,0.0016). 苗字(辻,0.0016). 苗字(浜田,0.0016). 苗字(永井,0.0016). 苗字(山中,0.0016). 苗字(矢野,0.0016). 苗字(服部,0.0016). 苗字(石原,0.0016). 苗字(熊谷,0.0016). 苗字(馬場,0.0015). 苗字(松浦,0.0015). 苗字(荒木,0.0015). 苗字(浅野,0.0015). 苗字(川村,0.0015). 苗字(大谷,0.0014). 苗字(望月,0.0014). 苗字(菅野,0.0014). 苗字(永田,0.0014). 苗字(内藤,0.0014). 苗字(本間,0.0013). 苗字(大島,0.0013). 苗字(大石,0.0013). 苗字(成田,0.0013). 苗字(平井,0.0013). 苗字(鎌田,0.0013). 苗字(小田,0.0013). 苗字(須藤,0.0013). 苗字(宮田,0.0012). 苗字(石橋,0.0012). 苗字(萩原,0.0012). 苗字(南,0.0012). 苗字(大森,0.0012). 苗字(桑原,0.0012). 苗字(小西,0.0012). 苗字(内山,0.0012). 苗字(松永,0.0011). 苗字(奥村,0.0011). 苗字(関口,0.0011). 苗字(上原,0.0011). 苗字(北川,0.0011). 苗字(白石,0.0011). 苗字(吉野,0.0011). 苗字(今村,0.0011). 苗字(八木,0.0011). 苗字(坂口,0.0011). 苗字(岡村,0.0011). 苗字(中尾,0.0011). 苗字(青山,0.001). 苗字(河合,0.001). 苗字(西,0.001). 苗字(川島,0.001). 苗字(竹田,0.001). 苗字(小沢,0.001). 苗字(坂井,0.001). 苗字(足立,0.001). 苗字(小原,0.001). 苗字(根本,0.001). 苗字(河村,0.001). 苗字(齋藤,0.001). 苗字(豊田,0.001). 苗字(武藤,0.001). 苗字(山根,0.0009). 苗字(関根,0.0009). 苗字(安部,0.0009). 苗字(前川,0.0009). 苗字(植田,0.0009). 苗字(宮川,0.0009). 苗字(長田,0.0009). 苗字(中井,0.0009). 苗字(及川,0.0009). 苗字(大川,0.0009). 苗字(中嶋,0.0009). 苗字(細川,0.0009). 苗字(谷,0.0009). 苗字(浅井,0.0009). 苗字(三上,0.0008). 苗字(江口,0.0008). 苗字(田代,0.0008). 苗字(神谷,0.0008). 苗字(大沢,0.0008). 苗字(長尾,0.0008). 苗字(村松,0.0008). 苗字(土井,0.0008). 苗字(飯島,0.0008). 苗字(稲葉,0.0008). 苗字(榎本,0.0008). 苗字(片岡,0.0011). 苗字(沢田,0.0011). 苗字(上村,0.0011). 苗字(小野寺,0.0011). 苗字(古賀,0.0011). 苗字(奥田,0.0011). 苗字(平山,0.0011). 苗字(宮下,0.0011). 苗字(牧野,0.0011). 苗字(小泉,0.0011). 苗字(富田,0.0011). 苗字(寺田,0.001). 苗字(児玉,0.001). 苗字(大山,0.001). 苗字(多田,0.001). 苗字(小笠原,0.001). 苗字(小倉,0.001). 苗字(渋谷,0.001). 苗字(村山,0.001). 苗字(坂田,0.001). 苗字(森下,0.001). 苗字(杉浦,0.001). 苗字(角田,0.001). 苗字(飯塚,0.001). 苗字(天野,0.0009). 苗字(神田,0.0009). 苗字(水谷,0.0009). 苗字(塚本,0.0009). 苗字(畠山,0.0009). 苗字(田島,0.0009). 苗字(佐久間,0.0009). 苗字(堀内,0.0009). 苗字(岡部,0.0009). 苗字(白井,0.0009). 苗字(今野,0.0009). 苗字(森山,0.0009). 苗字(若林,0.0009). 苗字(松崎,0.0009). 苗字(中谷,0.0008). 苗字(安達,0.0008). 苗字(西尾,0.0008). 苗字(稲垣,0.0008). 苗字(石塚,0.0008). 苗字(星,0.0008). 苗字(戸田,0.0008). 苗字(荒川,0.0008). 苗字(中原,0.0008). 苗字(本多,0.0008). 苗字(岸本,0.0008). 苗字(森川,0.0008). 苗字(岡野,0.0008). 苗字(三好,0.0008). 苗字(米田,0.0008). 苗字(黒木,0.0008). 苗字(津田,0.0008). 苗字(松山,0.0008). 苗字(落合,0.0008). 苗字(堀田,0.0007). 苗字(野崎,0.0007). 苗字(岩井,0.0007). 苗字(土田,0.0007). 苗字(古田,0.0007). 苗字(西野,0.0007). 苗字(奥山,0.0007). 苗字(須田,0.0007). 苗字(川田,0.0007). 苗字(大竹,0.0007). 苗字(野中,0.0007). 苗字(梅田,0.0007). 苗字(梶原,0.0006). 苗字(三木,0.0006). 苗字(日高,0.0006). 苗字(大場,0.0006). 苗字(大木,0.0006). 苗字(塚田,0.0006). 苗字(西本,0.0006). 苗字(藤川,0.0006). 苗字(金沢,0.0006). 苗字(竹中,0.0006). 苗字(竹下,0.0006). 苗字(宮内,0.0006). 苗字(吉本,0.0006). 苗字(藤村,0.0006). 苗字(谷川,0.0006). 苗字(窪田,0.0006). 苗字(竹本,0.0006). 苗字(石黒,0.0006). 苗字(小谷,0.0006). 苗字(福本,0.0006). 苗字(緒方,0.0006). 苗字(宮原,0.0006). 苗字(広田,0.0006). 苗字(北野,0.0005). 苗字(宮沢,0.0005). 苗字(高井,0.0005). 苗字(出口,0.0005). 苗字(小森,0.0005). 苗字(亀井,0.0005). 苗字(青柳,0.0005). 苗字(古谷,0.0005). 苗字(金井,0.0008). 苗字(中沢,0.0008). 苗字(甲斐,0.0008). 苗字(佐伯,0.0008). 苗字(山岸,0.0008). 苗字(金田,0.0008). 苗字(堤,0.0008). 苗字(西岡,0.0007). 苗字(泉,0.0007). 苗字(町田,0.0007). 苗字(新田,0.0007). 苗字(徳永,0.0007). 苗字(笠原,0.0007). 苗字(滝沢,0.0007). 苗字(黒川,0.0007). 苗字(山川,0.0007). 苗字(杉田,0.0007). 苗字(堀江,0.0007). 苗字(村井,0.0007). 苗字(川端,0.0006). 苗字(大村,0.0006). 苗字(岸,0.0006). 苗字(井口,0.0006). 苗字(庄司,0.0006). 苗字(向井,0.0006). 苗字(川原,0.0006). 苗字(大内,0.0006). 苗字(吉原,0.0006). 苗字(榊原,0.0006). 苗字(松島,0.0006). 苗字(茂木,0.0006). 苗字(藤岡,0.0006). 苗字(下田,0.0006). 苗字(藤沢,0.0006). 苗字(栗田,0.0006). 苗字(柳沢,0.0006). 苗字(嶋田,0.0006). 苗字(安井,0.0006). 苗字(宇野,0.0006). 苗字(平川,0.0006). 苗字(高島,0.0006). 苗字(奥野,0.0006). 苗字(三輪,0.0005). 苗字(下村,0.0005). 苗字(山村,0.0005). 苗字(大城,0.0005). 苗字(藤野,0.0005). 苗字(長野,0.0005). 苗字(川本,0.0005). 苗字(丹羽,0.0005). 苗字(荻野,0.0005). 苗字(田原,0.0005). 苗字(大平,0.0005). 苗字(高瀬,0.0005). 苗字(相馬,0.0005). 苗字(金城,0.0005). 苗字(北原,0.0005). 苗字(黒沢,0.0005). 苗字(小澤,0.0005). 苗字(筒井,0.0005). 苗字(吉沢,0.0005). 苗字(平松,0.0005). 苗字(山岡,0.0005). 苗字(石山,0.0005). 苗字(篠崎,0.0005). 苗字(冨田,0.0005). 苗字(鶴田,0.0005). 苗字(澤田,0.0005). 苗字(永野,0.0005). 苗字(二宮,0.0005). 苗字(川野,0.0005). 苗字(富永,0.0005). 苗字(入江,0.0005). 苗字(臼井,0.0005). 苗字(杉原,0.0005). 苗字(瀬戸,0.0005). 苗字(田畑,0.0005). 苗字(千田,0.0005). 苗字(浅田,0.0005). 苗字(花田,0.0005). 苗字(篠田,0.0005). 苗字(池上,0.0004). 苗字(日野,0.0004). 苗字(加納,0.0004). 苗字(新谷,0.0004). 苗字(堀口,0.0004). 苗字(倉田,0.0004). 苗字(深沢,0.0004). 苗字(福原,0.0004). 苗字(河原,0.0004). 苗字(野沢,0.0004). 苗字(志村,0.0004). 苗字(畑中,0.0004). 苗字(白川,0.0004). 苗字(柏木,0.0004). 苗字(矢島,0.0004). 苗字(岩瀬,0.0004). 苗字(原口,0.0004). 苗字(大崎,0.0004). 苗字(難波,0.0004). 苗字(竹村,0.0005). 苗字(稲田,0.0005). 苗字(長島,0.0005). 苗字(長岡,0.0005). 苗字(宮城,0.0005). 苗字(林田,0.0005). 苗字(大田,0.0005). 苗字(越智,0.0005). 苗字(福岡,0.0005). 苗字(福永,0.0005). 苗字(横井,0.0005). 苗字(溝口,0.0005). 苗字(柳田,0.0005). 苗字(手塚,0.0005). 苗字(武井,0.0005). 苗字(堀川,0.0005). 苗字(大原,0.0005). 苗字(高松,0.0005). 苗字(園田,0.0005). 苗字(片桐,0.0005). 苗字(比嘉,0.0005). 苗字(石崎,0.0005). 苗字(湯浅,0.0005). 苗字(渡邉,0.0005). 苗字(沼田,0.0005). 苗字(渡邊,0.0005). 苗字(根岸,0.0005). 苗字(谷本,0.0005). 苗字(小出,0.0005). 苗字(平岡,0.0005). 苗字(大槻,0.0005). 苗字(小坂,0.0004). 苗字(笠井,0.0004). 苗字(菅,0.0004). 苗字(田上,0.0004). 苗字(西沢,0.0004). 苗字(西原,0.0004). 苗字(長沢,0.0004). 苗字(松野,0.0004). 苗字(森岡,0.0004). 苗字(徳田,0.0004). 苗字(村瀬,0.0004). 苗字(小柳,0.0004). 苗字(中本,0.0004). 苗字(吉井,0.0004). 苗字(浜口,0.0004). 苗字(三谷,0.0004). 苗字(芳賀,0.0004). 苗字(内海,0.0004). 苗字(米山,0.0004). 苗字(島崎,0.0004). 苗字(荻原,0.0004). 苗字(木原,0.0004). 苗字(大友,0.0004). 苗字(北島,0.0004). 苗字(今泉,0.0004). 苗字(秋元,0.0004). 苗字(福山,0.0004). 苗字(磯部,0.0004). 苗字(河内,0.0004). 苗字(川瀬,0.0004). 苗字(小嶋,0.0004). 苗字(佐竹,0.0004). 苗字(長井,0.0004). 苗字(三村,0.0004). 苗字(遠山,0.0004). 苗字(井出,0.0004). 苗字(井手,0.0004). 苗字(塩田,0.0004). 苗字(平林,0.0004). 苗字(浜野,0.0004). 苗字(村岡,0.0004). 苗字(葛西,0.0004). 苗字(奈良,0.0004). 苗字(三島,0.0004). 苗字(真鍋,0.0004). 苗字(草野,0.0004). 苗字(橘,0.0004). 苗字(辻本,0.0004). 苗字(栗山,0.0004). 苗字(水口,0.0004). 苗字(半田,0.0004). 苗字(大澤,0.0004). 苗字(狩野,0.0004). 苗字(瀬川,0.0004). 苗字(尾形,0.0004). 苗字(坂下,0.0004). 苗字(大沼,0.0003). 苗字(立石,0.0003). 苗字(志賀,0.0003). 苗字(中里,0.0003). 苗字(柳,0.0003). 苗字(朝倉,0.0003). 苗字(有馬,0.0003). 苗字(神山,0.0003). 苗字(大江,0.0003). 苗字(高見,0.0003). 苗字(植松,0.0003). 苗字(江藤,0.0003). 苗字(宮地,0.0003). 苗字(大井,0.0004). 苗字(川畑,0.0004). 苗字(相沢,0.0004). 苗字(植木,0.0004). 苗字(皆川,0.0004). 苗字(岩下,0.0004). 苗字(坪井,0.0004). 苗字(大坪,0.0004). 苗字(秋田,0.0004). 苗字(吉永,0.0004). 苗字(三井,0.0004). 苗字(畑,0.0004). 苗字(細谷,0.0004). 苗字(細田,0.0004). 苗字(齊藤,0.0004). 苗字(浜崎,0.0004). 苗字(早坂,0.0004). 苗字(古屋,0.0004). 苗字(清野,0.0004). 苗字(若松,0.0004). 苗字(亀山,0.0004). 苗字(河田,0.0004). 苗字(保坂,0.0004). 苗字(橋口,0.0004). 苗字(松川,0.0004). 苗字(植村,0.0004). 苗字(水上,0.0004). 苗字(高村,0.0004). 苗字(板垣,0.0004). 苗字(堀井,0.0004). 苗字(岸田,0.0004). 苗字(藤森,0.0004). 苗字(玉井,0.0004). 苗字(相原,0.0004). 苗字(平,0.0004). 苗字(進藤,0.0004). 苗字(那須,0.0004). 苗字(亀田,0.0003). 苗字(川合,0.0003). 苗字(門脇,0.0003). 苗字(高岡,0.0003). 苗字(寺島,0.0003). 苗字(下山,0.0003). 苗字(市村,0.0003). 苗字(宮島,0.0003). 苗字(河本,0.0003). 苗字(高柳,0.0003). 苗字(織田,0.0003). 苗字(武内,0.0003). 苗字(藤崎,0.0003). 苗字(北山,0.0003). 苗字(木内,0.0003). 苗字(松木,0.0003). 苗字(高原,0.0003). 苗字(野上,0.0003). 苗字(三原,0.0003). 苗字(富樫,0.0003). 苗字(土居,0.0003). 苗字(立花,0.0003). 苗字(今田,0.0003). 苗字(柴崎,0.0003). 苗字(平尾,0.0003). 苗字(守屋,0.0003). 苗字(海野,0.0003). 苗字(久野,0.0003). 苗字(長谷部,0.0003). 苗字(深谷,0.0003). 苗字(関谷,0.0003). 苗字(長瀬,0.0003). 苗字(石丸,0.0003). 苗字(長谷,0.0003). 苗字(菅谷,0.0003). 苗字(黒岩,0.0003). 苗字(大倉,0.0003). 苗字(内野,0.0003). 苗字(上山,0.0003). 苗字(小寺,0.0003). 苗字(西谷,0.0003). 苗字(島,0.0003). 苗字(田川,0.0003). 苗字(末永,0.0003). 苗字(濱田,0.0003). 苗字(宮脇,0.0003). 苗字(滝口,0.0003). 苗字(成瀬,0.0003). 苗字(高崎,0.0003). 苗字(小室,0.0003). 苗字(門田,0.0003). 苗字(宍戸,0.0003). 苗字(鳥居,0.0003). 苗字(森谷,0.0003). 苗字(小畑,0.0003). 苗字(杉村,0.0003). 苗字(板倉,0.0003). 苗字(平塚,0.0003). 苗字(木田,0.0003). 苗字(阪本,0.0003). 苗字(阿久津,0.0003). 苗字(山上,0.0003). 苗字(井川,0.0003). 苗字(寺本,0.0003). 苗字(大津,0.0003). 苗字(有田,0.0003). 苗字(坂上,0.0003). 苗字(毛利,0.0003). 苗字(松沢,0.0003). 苗字(前原,0.0003). 苗字(島村,0.0003). 苗字(田崎,0.0003). 苗字(三橋,0.0003). 苗字(牧,0.0003). 苗字(岩永,0.0003). 苗字(浅見,0.0003). 苗字(川井,0.0003). 苗字(中澤,0.0003). 苗字(高尾,0.0003). 苗字(岩佐,0.0003). 苗字(飯野,0.0003). 苗字(中根,0.0003). 苗字(和泉,0.0003). 苗字(塚原,0.0003). 苗字(外山,0.0003). 苗字(滝本,0.0003). 苗字(市原,0.0003). 苗字(金山,0.0003). 苗字(金森,0.0003). 苗字(小関,0.0003). 苗字(金谷,0.0003). 苗字(秦,0.0003). 苗字(石垣,0.0003). 苗字(石本,0.0003). 苗字(井田,0.0003). 苗字(奥,0.0003). 苗字(岩渕,0.0003). 苗字(米沢,0.0003). 苗字(正木,0.0003). 苗字(宇佐美,0.0003). 苗字(矢部,0.0003). 苗字(永山,0.0003). 苗字(坂元,0.0003). 苗字(山野,0.0003). 苗字(野本,0.0003). 苗字(江崎,0.0003). 苗字(諏訪,0.0003). 苗字(藤木,0.0003). 苗字(森脇,0.0003). 苗字(江川,0.0003). 苗字(小宮,0.0003). 苗字(秋葉,0.0003). 苗字(大滝,0.0003). 苗字(小杉,0.0003). 苗字(三田,0.0003). 苗字(新垣,0.0003). 苗字(赤松,0.0003). 苗字(風間,0.0003). 苗字(布施,0.0003). 苗字(曽根,0.0003). 苗字(水田,0.0003). 苗字(堀越,0.0003). 苗字(金丸,0.0003). 苗字(佐川,0.0003). 苗字(松元,0.0002). 苗字(椎名,0.0002). 苗字(小椋,0.0002). 苗字(岩間,0.0002). 苗字(羽田,0.0002). 苗字(土橋,0.0002). 苗字(生田,0.0002). 苗字(仲田,0.0002). 苗字(小野田,0.0002). 苗字(仲村,0.0002). 苗字(長崎,0.0002). 苗字(依田,0.0002). 苗字(宮野,0.0002). 苗字(染谷,0.0002). 苗字(細野,0.0002). 苗字(矢口,0.0002). 苗字(日下,0.0002). 苗字(山元,0.0002). 苗字(赤木,0.0002). 苗字(矢田,0.0002). 苗字(木戸,0.0002). 苗字(浅川,0.0002). 苗字(勝又,0.0002). 苗字(高梨,0.0002). 苗字(倉持,0.0002). 苗字(小沼,0.0002). 苗字(寺尾,0.0002). 苗字(菅沼,0.0002). 苗字(高倉,0.0002). 苗字(富岡,0.0002). 苗字(真田,0.0002). 苗字(橋爪,0.0002). 苗字(雨宮,0.0002). 苗字(白鳥,0.0002). 苗字(岩城,0.0002). 苗字(石坂,0.0002). 苗字(丹野,0.0002). 苗字(池内,0.0002). 苗字(神野,0.0002). 苗字(豊島,0.0003). 苗字(梅原,0.0003). 苗字(玉城,0.0003). 苗字(下川,0.0003). 苗字(野原,0.0003). 苗字(香川,0.0003). 苗字(相川,0.0003). 苗字(浜本,0.0003). 苗字(古沢,0.0003). 苗字(北沢,0.0003). 苗字(山城,0.0003). 苗字(塩谷,0.0002). 苗字(櫻井,0.0002). 苗字(浦田,0.0002). 苗字(中林,0.0002). 苗字(喜多,0.0002). 苗字(小幡,0.0002). 苗字(目黒,0.0002). 苗字(宇都宮,0.0002). 苗字(大和田,0.0002). 苗字(山形,0.0002). 苗字(大畑,0.0002). 苗字(平沢,0.0002). 苗字(麻生,0.0002). 苗字(乾,0.0002). 苗字(細井,0.0002). 苗字(今西,0.0002). 苗字(梅本,0.0002). 苗字(小玉,0.0002). 苗字(大矢,0.0002). 苗字(梅津,0.0002). 苗字(北田,0.0002). 苗字(杉野,0.0002). 苗字(木本,0.0002). 苗字(大庭,0.0002). 苗字(都築,0.0002). 苗字(角,0.0002). 苗字(影山,0.0002). 苗字(波多野,0.0002). 苗字(深田,0.0002). 苗字(並木,0.0002). 苗字(西口,0.0002). 苗字(川辺,0.0002). 苗字(柳原,0.0002). 苗字(栗林,0.0002). 苗字(首藤,0.0002). 苗字(瀬尾,0.0002). 苗字(宮坂,0.0002). 苗字(赤坂,0.0002). 苗字(結城,0.0002). 苗字(合田,0.0002). 苗字(尾上,0.0002). 苗字(立川,0.0002). 苗字(海老原,0.0002). 苗字(大貫,0.0002). 苗字(青野,0.0002). 苗字(今,0.0002). 苗字(石渡,0.0002). 苗字(大下,0.0002). 苗字(川西,0.0002). 苗字(永島,0.0002). 苗字(横尾,0.0002). 苗字(久米,0.0002). 苗字(東海林,0.0002). 苗字(三沢,0.0002). 苗字(飛田,0.0002). 苗字(玉置,0.0002). 苗字(森口,0.0002). 苗字(桑田,0.0002). 苗字(廣瀬,0.0002). 苗字(三枝,0.0002). 苗字(石倉,0.0002). 苗字(大林,0.0002). 苗字(柏原,0.0002). 苗字(小堀,0.0002). 苗字(江原,0.0002). 苗字(芦田,0.0002). 苗字(水島,0.0002). 苗字(砂川,0.0002). 苗字(島袋,0.0002). 苗字(坂東,0.0002). 苗字(高畑,0.0002). 苗字(花岡,0.0002). 苗字(手島,0.0002). 苗字(梅村,0.0002). 苗字(玉木,0.0002). 苗字(吉澤,0.0002). 苗字(前野,0.0002). 苗字(白木,0.0002). 苗字(野呂,0.0002). 苗字(中塚,0.0002). 苗字(柴山,0.0002). 苗字(金澤,0.0002). 苗字(沖,0.0002). 苗字(前島,0.0002). 苗字(百瀬,0.0002). 苗字(富山,0.0002). 苗字(菅井,0.0002). 苗字(浅沼,0.0002). 苗字(高谷,0.0002). 苗字(曽我,0.0002). 苗字(小久保,0.0002). 苗字(妹尾,0.0002). 苗字(北,0.0002). 苗字(板橋,0.0002). 苗字(志田,0.0002). 苗字(上杉,0.0002). 苗字(神崎,0.0002). 苗字(有賀,0.0002). 苗字(大熊,0.0002). 苗字(竹原,0.0002). 苗字(井原,0.0002). 苗字(大嶋,0.0002). 苗字(池本,0.0002). 苗字(西島,0.0002). 苗字(田端,0.0002). 苗字(清田,0.0002). 苗字(西脇,0.0002). 苗字(須賀,0.0002). 苗字(坂野,0.0002). 苗字(横川,0.0002). 苗字(川越,0.0002). 苗字(本村,0.0002). 苗字(春日,0.0002). 苗字(笹川,0.0002). 苗字(内村,0.0002). 苗字(日比野,0.0002). 苗字(楠,0.0002). 苗字(谷村,0.0002). 苗字(脇田,0.0002). 苗字(浦野,0.0002). 苗字(小栗,0.0002). 苗字(平良,0.0002). 苗字(岡山,0.0002). 苗字(角谷,0.0002). 苗字(沖田,0.0002). 苗字(楠本,0.0002). 苗字(浜,0.0002). 苗字(大和,0.0002). 苗字(森永,0.0002). 苗字(明石,0.0002). 苗字(吉崎,0.0002). 苗字(柳川,0.0002). 苗字(島津,0.0002). 苗字(大高,0.0002). 苗字(岩谷,0.0002). 苗字(井本,0.0002). 苗字(笹原,0.0002). 苗字(滝川,0.0002). 苗字(小菅,0.0002). 苗字(黒崎,0.0002). 苗字(倉本,0.0002). 苗字(戸塚,0.0002). 苗字(桜田,0.0002). 苗字(本橋,0.0002). 苗字(畠中,0.0002). 苗字(勝田,0.0002). 苗字(益田,0.0002). 苗字(中,0.0002). 苗字(熊田,0.0002). 苗字(猪股,0.0002). 苗字(恩田,0.0002). 苗字(八田,0.0002). 苗字(村木,0.0002). 苗字(塩見,0.0002). 苗字(会田,0.0002). 苗字(新村,0.0002). 苗字(福地,0.0002). 苗字(冨永,0.0002). 苗字(滝,0.0002). 苗字(田所,0.0002). 苗字(神戸,0.0002). 苗字(川添,0.0002). 苗字(末吉,0.0002). 苗字(照井,0.0002). 苗字(紺野,0.0002). 苗字(城戸,0.0002). 苗字(寺岡,0.0002). 苗字(磯野,0.0002). 苗字(夏目,0.0002). 苗字(村中,0.0002). 苗字(森井,0.0002). 苗字(菊田,0.0002). 苗字(長友,0.0002). 苗字(石沢,0.0002). 苗字(米倉,0.0002). 苗字(石岡,0.0002). 苗字(今川,0.0002). 苗字(神原,0.0002). 苗字(柿沼,0.0002). 苗字(河西,0.0002). 苗字(寺崎,0.0002). 苗字(持田,0.0002). 苗字(川嶋,0.0002). 苗字(玉田,0.0002). 苗字(中岡,0.0002). 苗字(長沼,0.0002). 苗字(品川,0.0002). 苗字(柳瀬,0.0002). 苗字(増井,0.0002). 苗字(田渕,0.0002). 苗字(大浦,0.0002). 苗字(池谷,0.0002). 苗字(国分,0.0002). 苗字(高嶋,0.0002). 苗字(熊倉,0.0002). 苗字(本山,0.0002). 苗字(古山,0.0002). 苗字(小口,0.0002). 苗字(田尻,0.0002). 苗字(石野,0.0002). 苗字(井村,0.0002). 苗字(小平,0.0002). 苗字(南部,0.0002). 苗字(平賀,0.0002). 苗字(寺沢,0.0002). 苗字(五味,0.0002). 苗字(赤羽,0.0002). 苗字(梅沢,0.0002). 苗字(丸田,0.0002). 苗字(松橋,0.0002). 苗字(日下部,0.0002). 苗字(重松,0.0002). 苗字(若山,0.0002). 苗字(福士,0.0002). 苗字(児島,0.0002). 苗字(鶴岡,0.0002). 苗字(湊,0.0002). 苗字(野島,0.0002). 苗字(阪口,0.0002). 苗字(土谷,0.0002). 苗字(新保,0.0002). 苗字(藤島,0.0002). 苗字(西森,0.0002). 苗字(牧田,0.0002). 苗字(大関,0.0002). 苗字(重田,0.0002). 苗字(宮澤,0.0002). 苗字(古市,0.0002). 苗字(有村,0.0002). 苗字(岩村,0.0002). 苗字(浦,0.0002). 苗字(氏家,0.0002). 苗字(境,0.0002). 苗字(沢井,0.0002). 苗字(藤山,0.0002). 苗字(小高,0.0002). 苗字(西井,0.0002). 苗字(小村,0.0002). 苗字(寺井,0.0002). % 以下のサイトは # # (p) http://cp1.nintendo.co.jp/2012 任天堂サイトの問題ですが # # $ python SimpleBarsTest.py # test_loop (__main__.testSimpleBars) ... ok # test_simple_rule (__main__.testSimpleBars) ... ok # # ---------------------------------------------------------------------- # Ran 2 tests in 0.000s # # OK # # テストコードまでOKなんですが、 # answerを出したのですが違っているようなんです。 # この問題を解いた方がいましたら少し教えてもらえませんでしょうか。 'iTピラミッド' :- 'iTピラミッド'(1,12,[i,'T']), 'iTピラミッド'(12,1,['T',i]). 'iTピラミッド'(1,6,[i,'T']). 'iTピラミッド'(_開始段数,_段数,_記号並び順) :- for(_開始段数,N,_段数), ピラミッドの段を生成(N,_記号並び順,L), 最初の3文字分を末尾に移動して段文字列とする(L,_段文字列), writef('%t\n',[_段文字列]), N = _段数. ピラミッドの段を生成(N,_記号並び順,L) :- 段の記号部分を生成(_記号並び順,L2), length(L,25), append(L1,L2,L1,L), all(L1,' '). 段の記号部分を生成(_記号並び順,L2) :- _length is (N - 1) * 2 + 1, length(L2,_length), '記号並び順に変数を埋める'(_記号並び順,L2). '記号並び順に変数を埋める'(_,[]). '記号並び順に変数を埋める'([A|R1],[A|R2]) :- append(R1,[A],L1), '記号並び順に変数を埋める'(L1,R2). 最初の3文字分を末尾に移動して段文字列とする([_1,_2,_3|R],_段文字列) :- append(R,[_1,_2,_3],_求める記号ならび), atomic_list_concat(_求める記号ならび,_段文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all([],_). all([V|R],V) :- all(R,V). for(S,N,E) :- for_2(S,N,E). for(S,N,E) :- for_1(S,N,E). for_1(S,_,E) :- S < E,!,fail. for_1(S,N,E) :- N is S. for_1(S,N,E) :- S1 is S - 1, for_1(S1,N,E). for_2(S,_,E) :- S > E,!,fail. for_2(S,N,E) :- N is S. for_2(S,N,E) :- S1 is S + 1, for_2(S1,N,E). % 以下のサイトは # 出典:: 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). % 以下のサイトは # # キーボードからNを入力し、Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を表示しなさい # 'キーボードからNを入力し、Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を表示しなさい' :- 'キーボードからNを入力し、'(_N), 'Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を表示しなさい'(_N). 'キーボードからNを入力し、'(_N) :- 整数を得る('N',_N > 2,_N). 'Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を計算して、表示しなさい'(_N) :- 'Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を計算して、'(_N,_式表示文字列,_Sum), 表示しなさい(_Sum,_式表示文字列). 'Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を計算して、'(_N,_式表示文字列,_Sum) :- '1の4乗 + 2の4乗 + ... + Nの4乗 を'(_N,_式文字列,_式表示文字列), 計算して(_式文字列,_Sum). '1の4乗 + 2の4乗 + ... + Nの4乗 を'(_N,_式文字列,_式表示文字列) :- findall([_4乗項文字列,_4乗表示文字列],( between(1,_M,_N), atomic_list_concat([_M,の4乗],_4乗表示文字列), atomic_list_concat([_M,' ^ ',4],_4乗項文字列)), LL), 式文字列と式表示文字列を分離(LL,_式文字列,_式表示文字列). 式文字列と式表示文字列を分離(LL,_式文字列,_式表示文字列) :- 転置(LL,[L1,L2]), atomic_list_concat(L1,' + ',_式文字列), atomic_list_concat(L2,' + ',_式表示文字列). 計算して(_式文字列,_Sum) :- atom_to_term(_式文字列,_式,_), _Sum is _式. 表示しなさい(_Sum,_式表示文字列) :- writef('%t = %t\n',[_Sum,_式文字列]). % 以下のサイトは # # キーボードからNを入力し、Sum = 14 + 24 + ... + N4 を表示しなさい # 'キーボードからNを入力し、Sum = 14 + 24 + ... + N4 を表示しなさい' :- 'キーボードからNを入力し、'(_N), 'Sum = 14 + 24 + ... + N4 を表示しなさい'(_N). 'キーボードからNを入力し、'(_N) :- 整数を得る('N',_N > 2,_N). 'Sum = 14 + 24 + ... + N4 を計算して、表示しなさい'(_N) :- 'Sum = 14 + 24 + ... + N4 を計算して、'(_N,_式文字列,_Sum), 表示しなさい(_Sum,_式文字列). 'Sum = 14 + 24 + ... + N4 を計算して、'(_N,_式文字列,_Sum) :- '14 + 24 + ... + N4 を'(_N,_式文字列), 計算して(_式文字列,_Sum). '14 + 24 + ... + N4 を'(_N,_式文字列) :- findall(_計算の対象となる整数,( between(1,_M,_N), _計算の対象となる整数 is 10 * _M + 4), _計算の対象となる整数ならび), atomic_list_concat(_計算の対象となる整数ならび,' + ',_式文字列). 計算して(_式文字列,_Sum) :- atom_to_term(_式文字列,_式,_), _Sum is _式. 表示しなさい(_Sum,_式文字列) :- writef('%t = %t\n',[_Sum,_式文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/744 # # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&amp;リンク): # 次の式を計算するプログラムを作れ。 # Sum = 14 + 24 + ... + N4 # (注意) ・ Nの値は、キーボードから入力できるようにすること。 #     ・scanfではなくgetcharを用いること # '次の式を計算するプログラムを作れ Sum = 14 + 24 + ... + N4 (注意) ・ Nの値は、キーボードから入力できるようにすること。     ・scanfではなくgetcharを用いること' :- 'Nの値は、キーボードから入力できるようにすること。・scanfではなくgetcharを用いること'(_N), 'Sum = 14 + 24 + ... + N4 の式を'(_N,L), 計算する(L,Sum), atomic_list_concat(L,' + ',S1), write('%t = %t\n',[Sum,S1]). 'Nの値は、キーボードから入力できるようにすること。・scanfではなくgetcharを用いること'(_N) :- write('整数N[3-9]を入力して下さい : '), get_line(Line), '診断 : Nの値はキーボードから入力'(Line,_N),!. 'Nの値は、キーボードから入力できるようにすること。・scanfではなくgetcharを用いること'(_N) :- 'Nの値は、キーボードから入力できるようにすること。・scanfではなくgetcharを用いること'(_N). '診断 : Nの値はキーボードから入力'(Line,_N) :- atom_number(Line,_N), integer(_N), _N > 2,!. '診断 : Nの値はキーボードから入力'(Line,_N) :- writef('入力された値%tは3以上9以下の整数ではありません。再入力をお願いします。\n',[Line]), fail. 'Sum = 14 + 24 + ... + N4 の式を'(_N,L) :- findall(_m_1,( between(1,_m,_N), _m_1 is _m * 10 + 4), L). 計算する(L,Sum) :- sum(L,Sum). sum([],0). sum([N|R],Sum) :- sum(R,Sum_1), Sum is Sum_1 + N. % 以下のサイトは # # sum=Σ(n=1~100)n^2の計算結果とsumが初めて100以上になるnの値を表示せよ。 # 'sum=Σ(n=1~100)n^2の計算結果とsumが初めて100以上になるnの値を表示せよ。' :- 'sum=Σ(n=1~100)n^2の計算結果と'(_sumの計算結果), sumが初めて100以上になるnの値を(1,0,_sumが初めて100以上になるnの値), 'sum=Σ(n=1~100)n^2の計算結果とsumが初めて100以上になるnの値を表示する。'(_sumの計算結果,_sumが初めて100以上になるnの値). 'sum=Σ(n=1~100)n^2の計算結果と'(_sumの計算結果) :- findsum(S,( between(1,100,_n), S is _n ^ 2), _sumの計算結果). sumが初めて100以上になるnの値を(_n,_sum,_sumが初めて100以上になるnの値) :- sum_2 is _sum + _n ^ 2, _n_2 is _n + 1, sumが初めて100以上になるnの値を(_n,_n_2,_sum,_sum_2,_sumが初めて100以上になるnの値). sumが初めて100以上になるnの値を(_sumが初めて100以上になるnの値,_,_sum,_,_sumが初めて100以上になるnの値) :- _sum >= 100,!. sumが初めて100以上になるnの値を(_n,_n_2,_sum,_sum_2,_sumが初めて100以上になるnの値) :- sumが初めて100以上になるnの値を(_n_2,_sum_2,_sumが初めて100以上になるnの値). 'sum=Σ(n=1~100)n^2の計算結果とsumが初めて100以上になるnの値を表示する。'(_sumの計算結果,_sumが初めて100以上になるnの値) :- writef('sumの計算結果 %t, sumが初めて100以上になるnの値 %t\n',[_sumの計算結果,_sumが初めて100以上になるnの値]). % 以下のサイトは # # sum=Σ(n=1~100)n^2の計算結果とsumが初めて100以上になるnの値を表示せよ。 # 'sum=Σ(n=1~100)n^2の計算結果とsumが初めて100以上になるnの値を表示せよ。' :- 'sum=Σ(n=1~100)n^2の計算結果と'(_sumの計算結果), sumが初めて100以上になるnの値を(1,0,_sumが初めて100以上になるnの値), '表示せよ。'(_sumの計算結果,_sumが初めて100以上になるnの値). 'sum=Σ(n=1~100)n^2の計算結果と'(_sumの計算結果) :- findsum(S,( between(1,100,_n), S is _n ^ 2), _sumの計算結果). sumが初めて100以上になるnの値を(_n,_sum,_sumが初めて100以上になるnの値) :- sum_2 is _sum + _n ^ 2, _n_2 is _n + 1, sumが初めて100以上になるnの値を(_n,_n_2,_sum,_sum_2,_sumが初めて100以上になるnの値). sumが初めて100以上になるnの値を(_sumが初めて100以上になるnの値,_,_sum,_,_sumが初めて100以上になるnの値) :- _sum >= 100,!. sumが初めて100以上になるnの値を(_n,_n_2,_sum,_sum_2,_sumが初めて100以上になるnの値) :- sumが初めて100以上になるnの値を(_n_2,_sum_2,_sumが初めて100以上になるnの値). '表示せよ。'(_sumの計算結果,_sumが初めて100以上になるnの値) :- writef('sumの計算結果 %t, sumが初めて100以上になるnの値 %t\n',[_sumの計算結果,_sumが初めて100以上になるnの値]). % 以下のサイトは 最大部分列和(_数値ならび,_最大部分列和,_最大部分列) :- length(_数値ならび,_長さ), '全ての部分列・部分列和を得る'(_数値ならび,_長さ,_全ての部分列_部分列和), 全ての部分列和から最大部分列和とその部分列を選別する(_全ての部分列和,_最大部分列和,_最大部分列). '全ての部分列・部分列和を得る'(_数値ならび,_長さ,_全ての部分列_部分列和) :- findall([_部分列,_合計],( between(1,_長さ,_n), 組み合わせ(_数値ならび,_n,_部分列), sum(_部分列,_合計)), _全ての部分列_部分列和). 全ての部分列和から最大部分列和とその部分列を選別する(LL,_最大部分列和,_最大部分列) :- LL = [[_部分列_1,_合計_1]|R], 最大部分列_部分列和(R,_合計_1,[_部分列_1],_最大部分列和,_最大部分列). 最大部分列_部分列和([],_最大部分列和,_最大部分列,_最大部分列和,_最大部分列). 最大部分列_部分列和([[_部分列,_合計]|R],_合計,LL_1,_最大部分列和,_最大部分列) :- 最大部分列_部分列和(R,_合計,[_部分列|LL_1],_最大部分列和,_最大部分列). 最大部分列_部分列和([[_部分列,_合計]|R],_合計_1,LL_1,_最大部分列和,_最大部分列) :- _合計 > _合計_1, 最大部分列_部分列和(R,_合計,[_部分列],_最大部分列和,_最大部分列). 最大部分列_部分列和([[_部分列,_合計]|R],_合計_1,LL_1,_最大部分列和,_最大部分列) :- _合計 < _合計_1, 最大部分列_部分列和(R,_合計_1,LL_1,_最大部分列和,_最大部分列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 165代目 #32 # 総当りをする関数を作成して下さい # # VC++2010 # Windows Vista Home SP2 # # 例 # 第1引数 総当りの初めの文字 # 第2引数 総当りの最後の文字 # 第3引数 総当りする桁数 # func('a', 'z', 3); # とした時の動作は # aaa〜zzz、aa〜zz、a〜z # の全てを出力するようにしたいです # # よろしくお願いします # # 総当り(_総当りの初めの文字,_総当りの最後の文字,_総当りする桁数,_総当り) :- 文字ならびを確定する(_総当りの初めの文字,_総当りの最後の文字,_文字ならび), 総当り(_総当りする桁数,_文字ならび,_総当り). 総当り(1,_文字ならび,_文字ならび). 総当り(_桁数,_文字ならび,_総当り) :- _桁数 > 1, _桁数_1 is _桁数 - 1, 総当り(_桁数_1,_文字ならび,_総当り_2), 総当り_2(_文字ならび,_総当り_2,_総当り). 総当り_2(_文字ならび,_総当り_2,_総当り) :- findall(_文字列,( member(_文字_1,_文字ならび), member(_文字列_2,_総当り_2), atom_concat(_文字_1,_文字列_2,_文字列)), _総当り_1), append(_総当り_1,_総当り_2,_総当り). 文字ならびを確定する(_総当りの初めの文字,_総当りの最後の文字,_文字ならび) :- char_code(_総当りの初めの文字,_総当りの初めの文字コード), char_code(_総当りの最後の文字,_総当りの最後の文字コード), findall(_文字,( between(_総当りの初めの文字コード,_総当りの最後の文字コード,_文字コード), char_code(_文字,_文字コード)), _文字ならび). % 以下のサイトは 項の中に変数を含まない(_項) :- '項が変数の時は偽、atomicの時は真である'(_項),!. 項の中に変数を含まない(_項) :- '項が複合項の時は全ての引数について「項の中に変数を含まない」ことを検査する'(_項). '項が変数の時は偽、atomicの時は真である'(_項) :- '項が変数の時は偽、'(_項). '項が変数の時は偽、atomicの時は真である'(_項) :- '項がatomicの時は真である'(_項). '項が変数の時は偽、'(_項) :- var(_項),!, fail. '項がatomicの時は真である'(_項) :- atomic(_項). '項が複合項の時は全ての引数について「項の中に変数を含まない」ことを検査する'(_項) :- forall(項が複合項の時は全ての引数について(_項,_引数),項の中に変数を含まない(_引数)). 項が複合項の時は全ての引数について(_項,_引数) :- functor(_項,_関数名,_引数の数), between(1,_引数の数,_n番目), arg(_n番目,_項,_引数). % 以下のサイトは 項の中に変数を含まない(_項) :- var(_項),!,fail. 項の中に変数を含まない(_項) :- atom(_項),!. 項の中に変数を含まない(_項) :- forall((functor(_項,_関数名,_引数の数), between(1,_引数の数,_n番目), arg(_n番目,_項,_引数)), 項の中に変数を含まない(_引数)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370620300/140 # # [1] 授業数学の問題をC言語で解く # [2] 問題 # 整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら # その三素数を出力するプログラムを作成せよ。複数組み合わせの場合最初に # 見つけたものを出力せよ。 # [3.1] 7 # [3.2] gcc # [3.3] C # [4] 期限:28日9:00 # [5] その他制限: 純粋Cライブラリ。 # # 差が6となる素数ペアをリストアップする(L) :- 整数を得る(整数x,_x), findall([_素数_1,_素数_2],( 二つの素数の差が6となる(_x,_素数_1,_素数_2)), L). 二つの素数の差が6となる(_x,_素数_1,_素数_2) :- findall(N,between(2,_x,N),_2から_xまでの整数ならび), エラトステネスの篩(_2から_xまでの整数ならび,_2から高々_xまでの素数ならび), 組合せ(_2から高々_xまでの素数ならび,2,[_素数_1,_素数_2]), 6 is abs(_素数_1 - _素数_2). エラトステネスの篩([],[]) :- !. エラトステネスの篩([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). 組合せ(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). % 整数を得る/2 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/889 # # [1] 授業数学の問題をC言語で解く # [2] 問題 # 整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら # その三素数を出力するプログラムを作成せよ。複数組み合わせの場合最初に # 見つけたものを出力せよ。 # [3.1] 7 # [3.2] gcc # [3.3] C # [4] 期限:28日9:00 # [5] その他制限: 純粋Cライブラリ。 # # '整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら その三素数を出力するプログラムを作成せよ。 複数組み合わせの場合最初に見つけたものを出力せよ。'(_素数_1,_素数_2,_素数_3) :- 整数を得る(整数x,(_x >= 2,_x =< 100000),_x), findall([_素数_1,_素数_2,_素数3],( xが3つの素数の和で表現できる(_x,_素数_1,_素数_2,_素数_3)), _3つの素数のならび), 'その三素数を出力せよ。複数組み合わせの場合最初に見つけたものを出力せよ。'(_x,_3つの素数のならび). xが3つの素数の和で表現できる(_x,_素数_1,_素数_2,_素数_3) :- findall(N,between(2,_x,N),_2から_xまでの整数ならび), エラトステネスの篩(_2から_xまでの整数ならび,_2から高々_xまでの素数ならび), 組合せ(_2から高々_xまでの素数ならび,3,[_素数_1,_素数_2,_素数_3]), _x is _素数_1 + _素数_2 + _素数_3. 'その三素数を出力せよ。複数組み合わせの場合最初に見つけたものを出力せよ。'(_x,_3つの素数のならび) :- member([_素数_1,_素数_2,_素数_3],_3つの素数のならび), 'その三素数を出力せよ。'(_x,_素数_1,_素数_2,_素数_3),!. 'その三素数を出力せよ。'(_x,_素数_1,_素数_2,_素数_3) :- writef('%t+%t+%t = %t\n',[_素数_1,_素数_2,_素数_3,_x). エラトステネスの篩([],[]) :- !. エラトステネスの篩([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). 組合せ(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). % 整数を得る/3 % % 注意 % % ここでは、findall/3を用いて、xが3つの素数の和で表現できる/4の全解を % 一旦ならびに取得することによって、 % その後の出力述語を決定性にすることを可能にしている。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/889 # # [1] 授業数学の問題をC言語で解く # [2] 問題 # 整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら # その三素数を出力するプログラムを作成せよ。複数組み合わせの場合最初に # 見つけたものを出力せよ。 # [3.1] 7 # [3.2] gcc # [3.3] C # [4] 期限:28日9:00 # [5] その他制限: 純粋Cライブラリ。 # # '整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら その三素数を出力するプログラムを作成せよ。 複数組み合わせの場合最初に見つけたものを出力せよ。'(_素数_1,_素数_2,_素数_3) :- 整数を得る(整数x,(_x >= 2,_x =< 100000),_x), xが3つの素数の和で表現できる(_x,_素数_1,_素数_2,_素数_3), 'その三素数を出力せよ。'(_x,_素数_1,_素数_2,_素数_3),!. xが3つの素数の和で表現できる(_x,_素数_1,_素数_2,_素数_3) :- findall(N,between(2,_x,N),_2から_xまでの整数ならび), エラトステネスの篩(_2から_xまでの整数ならび,_2から高々_xまでの素数ならび), 組合せ(_2から高々_xまでの素数ならび,3,[_素数_1,_素数_2,_素数_3]), _x is _素数_1 + _素数_2 + _素数_3. 'その三素数を出力せよ。'(_x,_素数_1,_素数_2,_素数_3) :- writef('%t+%t+%t = %t\n',[_素数_1,_素数_2,_素数_3,_x). エラトステネスの篩([],[]) :- !. エラトステネスの篩([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). 組合せ(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). % 整数を得る/3 % % % 注意 % % 「複数組み合わせの場合最初に見つけたものを出力せよ。」は述語定義できない。 % !(カット)を述語に置き換えることはできない。 % % 最初の述語の最後の ! が「複数組み合わせの場合最初に見つけたものを出力せよ。」の意味である。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/119 # # [1] 授業単元:課題 # [2] 問題文(含コード&リンク): # 自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき # 最終的に 1 収束するものを Happy number と呼ぶ。 # # 28…〇 # 2^2 + 8^2 = 68 # 6^2 + 8^2 = 100 # 1^2 + 0^2 + 0^2 = 1 # # 89…× # 8^2 + 9^2 = 145 # 1^2 + 4^2 + 5^2 = 42 # 4^2 + 2^2 = 20 # 2^2 + 0^2 = 4 # # 1 <= n <= 10000 とした時の全ての Happy number を列挙せよ。 # '自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき 最終的に 1 収束するものを Happy number と呼ぶ。 28…〇 2^2 + 8^2 = 68 6^2 + 8^2 = 100 1^2 + 0^2 + 0^2 = 1 89…× 8^2 + 9^2 = 145 1^2 + 4^2 + 5^2 = 42 4^2 + 2^2 = 20 2^2 + 0^2 = 4 1 <= n <= 10000 とした時の全ての Happy number を列挙せよ。'(_Happy_numberならび) :- '1 <= n <= 10000 とした時の全ての Happy number を列挙せよ。'(_Happy_numberならび). '1 <= n <= 10000 とした時の全ての Happy number を列挙せよ。'(_Happy_numberならび) :- findall(_n,( between(1,1000,_n), 'Happy number'(_n)), _Happy_numberならび). 'Happy number'(_n) :- '自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき最終的に 1 収束するものを Happy number と呼ぶ。'(_n,[]). '自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき最終的に 1 収束するものを Happy number と呼ぶ。'(1,_) :- !. '自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき最終的に 1 収束するものを Happy number と呼ぶ。'(_n,L) :- \+(member(_n,L)), '自然数 n の各桁の数を2乗しその和を求める。'(_n,0,_各桁の数の2乗の和), '自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき最終的に 1 収束するものを Happy number と呼ぶ。'(_各桁の数の2乗の和,[_n|L]). '自然数 n の各桁の数を2乗しその和を求める。'(0,_各桁の数の2乗の和,_各桁の数の2乗の和) :- !. '自然数 n の各桁の数を2乗しその和を求める。'(_n,_s_1,_各桁の数の2乗の和) :- _n_1 is _n mod 10, _n_2 is _n // 10, _s_2 is _s_1 + (_n_1 * _n_1), '自然数 n の各桁の数を2乗しその和を求める。'(_n_2,_s_2,_各桁の数の2乗の和). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/69 # # # 配列を使わずに printf for while if を使って3ケタカンマ区切りをすることができますか? # '配列を使わずに printf for while if を使って3ケタカンマ区切りして表示する'(0) :- write('0'). '配列を使わずに printf for while if を使って3ケタカンマ区切りして表示する'(N) :- N > 0, '3ケタカンマ区切りして表示する'(N). '配列を使わずに printf for while if を使って3ケタカンマ区切りして表示する'(N) :- '負数の場合はマイナス記号を表示して、-1を掛けて正数とする'(N,N_1), '3ケタカンマ区切りして表示する'(N_1). '負数の場合はマイナス記号を表示して、-1を掛けて正数とする'(N,N_1) :- N < 0, write('-'), N_1 is N * (-1). '3ケタカンマ区切りして表示する'(0). '3ケタカンマ区切りして表示する'(N) :- '3ケタ未満になったら数値をヘッドゼロサプレスで表示する(ただしゼロを除外)'(N). '3ケタカンマ区切りして表示する'(N) :- '3ケタ以上有る時は最後の3ケタとそれ以上に分離して'(N,N_1,N_2), '3ケタカンマ区切りして表示する'(N_2), '最後の3ケタの数値をカンマ表示後にヘッドゼロサプライで表示する'(N_1). '3ケタ未満になったら数値をヘッドゼロサプレスで表示する(ただしゼロを除外)'(N) :- between(1,999,N), writef('%t',[N]). '3ケタ以上有る時は最後の3ケタとそれ以上に分離して'(N,N_1,N_2) :- N >= 1000, N_1 is N mod 1000, N_2 is N // 1000. '最後の3ケタの数値をカンマ表示後にヘッドゼロサプライで表示する'(N) :- write(','), '3ケタの数値をヘッドゼロサプライで表示する'(N). '3ケタの数値をヘッドゼロサプライで表示する'(N) :- N_1 is N + 1000, atom_number(A,N_1), sub_atom(A,1,3,_,B), writef('%t',[B]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/370 # # ●Regular Expressionの使用環境 # ActivePerl5.8 # # ●検索か置換か? # 検索 # # ●説明 # 連続する数を検索したい(1965から2011までの数) # # ●対象データ(配列内に格納) # 1952 # 1965 # 1986 # 2012 # 1972 # 2011 #  ・ #  ・ # ●希望する結果(配列の各要素を正規表現で検索して、マッチする要素だけ抽出) # 1965 # 1986 # 1972 # 2011 #  ・ #  ・ # # 配列の各要素が1955から2011までの数の場合にマッチする正規表現を教えてください # # '●検索か置換か? 検索 ●説明 連続する数を検索したい(1965から2011までの数) ●対象データ(配列内に格納) 1952 1965 1986 2012 1972 2011  ・  ・ ●希望する結果(配列の各要素を正規表現で検索して、マッチする要素だけ抽出) 1965 1986 1972 2011  ・  ・'(_文字列,_前文字列,_適合文字列,_後文字列) :- '連続する数を検索したい(1965から2011までの数)'(_文字列,_前文字列,_適合文字列,_後文字列). '連続する数を検索したい(1965から2011までの数)'(_文字列,_前文字列,_適合文字列,_後文字列) :- atom_chars(_文字列,_文字ならび), '文字ならびから連続する数を検索したい(1965から2011までの数)'(_文字ならび,_前文字列,_適合文字列,_後文字列). '文字ならびから連続する数を検索したい(1965から2011までの数)'(_文字ならび,_前文字列,_適合文字列,_後文字列) :- '数値を切り出す(1965から2011までの数)'(_文字ならび,L1,L2,L3,N), atom_chars(_前文字列,L1), atom_chars(_後文字列,L3), atom_chars(_適合文字列,L2). '数値を切り出す(1965から2011までの数)'(_文字ならび,L1,L2,L3,N) :- append(L1,L2,L3,_文字ならび), 全てが数字(L2), 'L1の最後の文字とL3の最初の文字は数字ではない'(L1,L3), number_chars(_数,L2), '1965から2011までの数'(_数). 全てが数字(_ならび) :- forall(member(_数字,_ならび),数字(_数字)). 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. 'L1の最後の文字とL3の最初の文字は数字ではない'(L1,L3) :- 'L1の最後の文字は数字ではない'(L1), 'L3の最初の文字は数字では無い'(L3). 'L1の最後の文字は数字ではない'(L1) :- \+((last(L1,A),数字(A))). 'L3の最初の文字は数字では無い'(L3) :- \+(([B|_]=L3,数字(B))). '1965から2011までの数'(_数) :- between(1965,2011,_数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/35 # # 【質問テンプレ】 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):標準入力から正の数Xを入力し、1からXまでの整数のうち、素数だけを出力するプログラムを作成し、実行せよ。 # 実行時にはX = 50となるように数字を入力する。 # :- dynamic(素数候補/1). :- dynamic(素数/1). '標準入力から正の数Xを入力し、1からXまでの整数のうち、素数だけを出力するプログラムを作成し、実行せよ。実行時にはX = 50となるように数字を入力する。' :- 標準入力から正の数Xを入力し(X), '1からXまでの整数のうち、素数だけを出力する'(X). 標準入力から正の数Xを入力し(X) :- 整数を得る(正の整数X,X > 0,X). '1からXまでの整数のうち、素数だけを出力する'(X) :- 素数だけ選別する(X,_素数ならび), '1からXまでの整数のうち'(X,_整数), 素数だけ出力する(_整数,_素数ならび), X = _整数. 素数だけ選別する(X,_素数ならび) :- '2からXまでのならび'(X), エラトステネスの篩. '2からXまでのならび'(X) :- between(2,X,N), assertz(素数候補(N)), X = N. エラトステネスの篩 :- retract(素数候補(M)), assertz(素数(M)), エラトステネスの篩_1(M). エラトステネスの篩. エラトステネスの篩_1(M) :- 素数候補(N), 0 is N mod M, retract(素数候補(N)), fail. エラトステネスの篩_1(M) :- エラトステネスの篩. '1からXまでの整数のうち'(X,_整数) :- between(1,X,_整数). 素数だけ出力する(_素数,_素数ならび) :- 素数(_素数), writef('%t ',[_素数]),!. 素数だけ出力する(_,_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/35 # # 【質問テンプレ】 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):標準入力から正の数Xを入力し、1からXまでの整数のうち、素数だけを出力するプログラムを作成し、実行せよ。 # 実行時にはX = 50となるように数字を入力する。 # '標準入力から正の数Xを入力し、1からXまでの整数のうち、素数だけを出力するプログラムを作成し、実行せよ。 実行時にはX = 50となるように数字を入力する。' :- 標準入力から正の数Xを入力し(X), '1からXまでの整数のうち、素数だけを出力する'(X). 標準入力から正の数Xを入力し(X) :- 整数を得る(正の整数X,X > 0,X). '1からXまでの整数のうち、素数だけを出力する'(X) :- 素数だけ選別する(X,_素数ならび), '1からXまでの整数のうち'(_整数), 素数だけ出力する(_整数,_素数ならび), X = _整数. 素数だけ選別する(X,_素数ならび) :- '2からXまでのならび'(_2からXまでのならび), エラトステネスの篩(_2からXまでのならび,_素数ならび). '2からXまでのならび'(_2からXまでのならび) :- findall(N,between(2,X,N),_2からXまでのならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([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). '1からXまでの整数のうち'(_整数) :- between(1,X,_整数). 素数だけ出力する(_素数,_素数ならび) :- member(_素数,_素数ならび), writef('%t ',[_素数]),!. 素数だけ出力する(_,_). % 以下のサイトは # 出典:: http://stackoverflow.com/questions/17029097/prolog-creating-list-with-consecutive-numbers # # I'm newbie in Prolog and I've tried to create a list. # For example when I write mazeCreator(3,List). # I want to push every number like 1/1,1/2,1/3,2/1,2/2,2/3,3/1,3/2,3/3 in a list.To do this, # I wrote a predicate but It does not work, # Is there anyone who can help me ? Thanks in advance!. mazeCreater(M,L) :- findall(J/K,( between(1,M,J), between(1,M,K)),L). ?- nojiri('stackoverflow_17029097.html'). yes. ?- % 以下のサイトは 冪集合和(_対象集合,_冪集合和) :- findall(_部分集合和,( 部分集合和(_対象集合,_部分集合和)), _冪集合和). 部分集合和([], 0). 部分集合和([_|R1],_部分集合和) :- 部分集合和(R1,_部分集合和). 部分集合和([N|R1], _部分集合和) :- 部分集合和(R1,_部分集合和_2), _部分集合和 is _部分集合和_2 + N. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 冪集合和(_集合,_冪集合和) :- length(_集合,Len), findall(S,( between(1,Len,N), 組合せ和(_集合,N,L,S)), LS), _冪集合和 = [0|LS]. 組合せ和(X,1,[A],A) :- member(A,X). 組合せ和([A|Y],N,[A|X],S) :- N > 1, M is N - 1, 組合せ和(Y,M,X,S1), S is S1 + A. 組合せ和([_|Y],N,A,S) :- N > 1, 組合せ和(Y,N,A,S). % 以下のサイトは 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)), _冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 冪集合(_集合,_冪集合) :- length(_集合,Len), findall(L,( between(1,Len,N), 組合せ(_集合,N,L)), _冪集合_0), _冪集合 = [[]|_冪集合_0]. 組合せ(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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 冪集合(_集合,_冪集合) :- findall(L,部分集合(_集合,L),_冪集合) . 部分集合(_,[]). 部分集合(LL,L) :- length(LL,Len), between(1,Len,N), 組合せ(LL,N,L). 組合せ(L,1,[A]):- member(A,L). 組合せ([A|R1],N,[A|R2]):- N > 1, succ(M,N), 組合せ(R1,M,R2). 組合せ([_|R],N,A):- N > 1, 組合せ(R,N,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数値,true,_個数), _個数_1 is _個数 - 1, between(0,_個数_1,N), M is N mod 10, sub_atom('1234567890',M,1,_,A), writef('%t',[A]), N = _個数_1,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数値,true,_個数), between(1,_個数,N), M is N mod 10, 表示する(M), N = _整数値の個数. 表示する(0) :- 表示する(10). 表示する(M) :- M_1 is M - 1, sub_atom('1234567890',M_1,1,_,A), writef('%t',[A]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/833 # # お願いします。 # [1] 情報処理演習 # [2] 自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力するプログラムを作 # 成せよ. #  [3.1] Linux #  [3.2] コンパイラ名とバージョン:visual studio 2010 #  [3.3] C言語 # [4] 指定なし # [5] 特になし # # '自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力する' :- '自然数n > 0 を入力として'(_n), 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n),!. '自然数n > 0 を入力として'(_n) :- 整数を得る('自然数n > 0',_n > 0,_n). 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n) :- _n_1 is _n - 1, between(2,_n_1,_m), 0 is _n mod _m, writef('%t\n',[_m]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/835 # # お願いします。 # [1] 授業単元:情報処理演習 # [2] 問題文:3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表 # 示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表 # 示するようにすること. # '3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表示するようにすること.' :- '3 つの整数a, b, s を入力として'(_a,_b,_s), 'ax + by = s を満たす整数x, y を一組求めて'(_a,_b,_s,_x,_y), それらを表示する(_a,_b,_s,_x,_y),!. '3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表示するようにすること.'(_a,_b,_s) :- 'ただし、望みの整数x, y が存在しないときは, その旨を表示する'. '3 つの整数a, b, s を入力として'(_a,_b,_s) :- 整数を得る('ax+by=s のa',true,_a), 整数を得る('ax+by=s のb',true,_b), 整数を得る('ax+by=s のs',true,_s). 'ax + by = s を満たす整数x, y を一組求めて'(_a,_b,_s,_x,_y) :- _a_1 is _a * -1, _b_1 is _b * -1, for(_a_1,_x,_a), for(_b_1,_y,_b), _s is _a * _x + _b * _y. それらを表示する(_a,_b,_s,_x,_y) :- write(' ax + by = s\n'), writef('%t*%t + %t*%t = %t\n',[_a,_x,_b,_y,_s]). 'ただし, 望みの整数x, y が存在しないときは, その旨を表示する' :- writef('望みのx,yが存在しません。\n'). for(S,N,E) :- E >= S, for_2(S,N,E). for(S,N,E) :- E < S, for_1(S,N,E). for_1(S,_,E) :- S < E,!,fail. for_1(S,N,E) :- N is S. for_1(S,N,E) :- S1 is S - 1, for_1(S1,N,E). for_2(S,_,E) :- S > E,!,fail. for_2(S,N,E) :- N is S. for_2(S,N,E) :- S1 is S + 1, for_2(S1,N,E). 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/827 # # [1] 授業単元:整数演算 # [2] 問題文(含コード&リンク):以下の問題に答えなさい # # 50 # Σ((3*i)/2) = A の計算式を計算できるプログラムを完成させなさい。 # i=0 # # :- op(300,xfx,(..)). '50 Σ((3*i)/2) = A の計算式を計算できるプログラムを完成させなさい。 i=0'(_A) :- 'Σ'([_k = 0 .. 50],((3 * _k) / 2),_A). 'Σ'([_k = A .. B],_式,_累計値) :- findsum(Y,( between(A,B,_k), Y is _式), _累計値). findsum(A,P,S) :- findall(A,P,L), sum(L,S). sum([],0). sum([A|R],S) :- sum(R,S2), S is S2 + A. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/825 # # [1] 授業単元:画像処理 # [2] 問題文(含コード&リンク):アスキーコード(0x21~0x7eまで)表を出力をするプログラムを作りなさい # 'アスキーコード(0x21~0x7eまで)表を出力をする' :- 見出し第一行, 行を制御する. 行を制御する :- between(2,7,M), 列を制御する(M), M = 7. 列を制御する(M) :- writef('%t |',[M]), between(1,14,N), 一文字表示(M,N), N = 14, write('\n'). 見出し第一行 :- write(' | '), between(1,14,N), '0から15までの整数と16進数文字表記の対応'(N,A), writef(' %t',[A]), N = 14. 一文字表示(M,N) :- Char_code is 16 * M + N, char_code(A,Char_code), write(' %t',[A]). '0から15までの整数と16進数文字表記の対応'(0,'0'), '0から15までの整数と16進数文字表記の対応'(1,'1'), '0から15までの整数と16進数文字表記の対応'(2,'2'), '0から15までの整数と16進数文字表記の対応'(3,'3'), '0から15までの整数と16進数文字表記の対応'(4,'4'), '0から15までの整数と16進数文字表記の対応'(5,'5'), '0から15までの整数と16進数文字表記の対応'(7,'6'), '0から15までの整数と16進数文字表記の対応'(7,'7'), '0から15までの整数と16進数文字表記の対応'(8,'8'), '0から15までの整数と16進数文字表記の対応'(9,'9'), '0から15までの整数と16進数文字表記の対応'(10,'A'), '0から15までの整数と16進数文字表記の対応'(11,'B'), '0から15までの整数と16進数文字表記の対応'(12,'C'), '0から15までの整数と16進数文字表記の対応'(13,'D'), '0から15までの整数と16進数文字表記の対応'(14,'E'), '0から15までの整数と16進数文字表記の対応'(15,'F'), % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/825 # # [1] 授業単元:画像処理 # [2] 問題文(含コード&リンク):アスキーコード(0x21~0x7eまで)表を出力をするプログラムを作りなさい # 'アスキーコード(0x21~0x7eまで)表を出力をする' :- 見出し第一行, between(2,7,M), writef('% |',[M]), between(1,14,N), 一文字表示(M,N), N = 14, write('\n'), M = 7. 見出し第一行 :- write(' | '), between(1,14,N), '16進表記'(N,A), writef(' %t',[A]), N = 14. 一文字表示(M,N) :- Char_code is 16 * M + N, char_code(A,Char_code), write(' %t',[A]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/821 # # [1] 授業数学の問題をC言語で解く # [2] 問題 # 整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら # その三素数を出力するプログラムを作成せよ。複数組み合わせの場合最初に # 見つけたものを出力せよ。 # [3.1] 7 # [3.2] gcc # [3.3] C # [4] 期限:25日 # [5] その他制限: 純粋Cライブラリ。 # '整数xを0から100000までの整数として,xが3つの素数の和で表現できるならその三素数を出力するプログラムを作成せよ。複数組み合わせの場合最初に見つけたものを出力せよ。'(_x) :- findall(N,between(1,100000,N),L1), エラトステネスの篩(L1,_100000以下の素数ならび), 組合せ(_100000以下の素数ならび,3,[N1,N2,N3]), _x is N1 + N2 + N3, writef('%t,%t,%t\n',[N1,N2,N3]),!. 組合せ(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://toro.2ch.net/test/read.cgi/tech/1364700745/818 # # すみませんもう1問お願いします; # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # for文の二重ループを用いて、下の実行結果のように0〜9までの数字を #   0から1個ずつ増やしながら10行表示するプログラムを作成せよ #    #   0 #   01 #   012 #   0123 #   01234 #   012345 #   0123456 #   01234567 #   012345678 #   0123456789 # # 'for文の二重ループを用いて、下の実行結果のように0〜9までの数字を0から1個ずつ増やしながら10行表示する'(N) :- for(0,M,9), for(0,N,M), write('%t',[N]), N = M, write('\n'), M = 9. for(S,N,E) :- E < S, for_1(S,N,E). for_1(S,_,E) :- S < E,!,fail. for_1(S,N,E) :- N is S. for_1(S,N,E) :- S1 is S - 1, for_1(S1,N,E). for_2(S,_,E) :- S > E,!,fail. for_2(S,N,E) :- N is S. for_2(S,N,E) :- S1 is S + 1, for_2(S1,N,E). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1232627790/958 # # 【 課題 】テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】7/14 am6:00 # 【 Ver  】Eclipse Version: 3.4.2 # 【 補足 】 # あいう # かきく # さしす # 上記のようなテキストファイルを読み込み、 # さかあ # しきい # すくう # のように別のテキストファイルに書き出す感じです。 'テキストファイルから文字列5行を読み込み、別のテキストへ右縦書きで書き出す'(InFile,OutFile) :- テキストファイルから文字列5行を読み込み(Infile,_文字列5行), 別のテキストへ右縦書きで(_文字列5行,_右書き用に置換された文字列ならび), 書き出す(OutFile,_右書きように置換された文字列ならび), テキストファイルから文字列5行を読み込み(Infile,_文字列5行) :- open(InFile,read,Instream), findall(_行,( between(1,5,N), get_line(Instream,_行)), _文字列5行), close(InFile). 別のテキストへ右縦書きで(_文字列5行,_右書き用に置換された文字列ならび) :- findmax(_行の長さ,( member(_行,_文字列5行), atom_length(_行,_行の長さ), _最長文字数), 空白文字を付加して文字数一致させる(_最長文字数,_文字列5行,_空白文字を付加して矩形にした文字列5行), 右書き用に置換する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび). 右書き用に置換する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび) :- 行を反転しながら転置する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび). 行を反転しながら転置する(_空白文字を付加して矩形にした文字列5行,_右書き用に置換された文字列ならび) :- '一旦文字ならびに変換して、行を反転して転置する'(_空白文字を付加して矩形にした文字列5行,LL2), 文字列に戻す(LL2,_右書き用に置換された文字列ならび). '一旦文字ならびに変換して、行を反転して転置する'(_空白文字を付加して矩形にした文字列5行,LL2) :- findall(L,( member(_行,_空白文字を付加して矩形にした文字列5行), atom_chars(_行,Chars), reverse(Chars,L)), LL1), 転置(LL1,LL2). 文字列に戻す(LL2,_右書き用に置換された文字列ならび) :- findall(_文字列,( member(Chars,LL2), atom_chars(_文字列,Chars)), _右書き用に置換された文字列ならび). 空白文字を付加して文字数を一致させる(_最大文字数,_文字列5行,_空白を付加した文字列5行) :- findall(_空白を付加された文字列,( member(_文字列,_文字列5行), atom_length(_文字列,_文字列長さ), 空白文字を付加する(_最大文字数,_文字列の長さ,_文字列,_空白を付加された文字列)), _空白を付加された文字列5行). 空白文字を付加する(_最大文字数,_文字列の長さ,_文字列,_空白を付加された文字列) :- _空白文字数 is _最大文字数 - _文字列の長さ, findall(' ',between(1,_空白文字数,_),_空白文字ならび), atomic_list_concat([_文字列|_空白文字ならび],_空白を付加された文字列). 書き出す(OutFile,_右書き用に置換された文字列ならび) :- open(OutFile,write,Outstream), append(_,[_行|R],_右書き用に置換された文字列ならび), writef(Outstream,'%t\n',[_行]), R = [], close(Outstream). % % この符にはfindall/3だけで表現するという主題がある。 % % 以下のサイトは # 御題 # # 1から100までの数を出力するプログラムを書け。 # ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 # 素数のときは 'Prime' と出力し、 # フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 # また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。 '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。' :- '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(1,0,1). '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_,_) :- _数 > 100,!. '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2,_fib_1_2,_fib_2_2), _数_2 is _数_1 + 1, '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_2,_fib_1_2,_fib_2_2). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2,_fib_1_2,_fib_2_2) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_2_2,_fib_2_2,Fib), '素数のときは ''Prime'' と'(_数,Prime), '出力する'(_数_1,Fib,Prime),!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_2_2,_数_1,'Fib') :- _数_1 is _fib_1 + _fib_2,!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_1,_fib_2,''). '素数のときは ''Prime'' と'(_数,'Prime') :- 素数である(_数),!. '素数のときは ''Prime'' と'(_,''). '出力する'(_数_1,'','') :- write('%t ',[_数_1]),!. '出力する'(_数_1,Fib,Prime) :- write('%t%t ',[Fib,Prime]). % このプログラムの骨組みは %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 素数である(1) :- !. 素数である(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,_n,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. % 以下のサイトは # 御題 # # 1から100までの数を出力するプログラムを書け。 # ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 # 素数のときは 'Prime' と出力し、 # フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 # また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。 '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。' '100以下のフィボナッチ数列を得る'(_100以下のフィボナッチ数ならび), '100以下の素数を得る'(_100以下の素数ならび), between(1,100,_数), 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L), 'Nが100になるまで出力する'(N,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,L), '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,L), それ以外の場合は数を(_数,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,['Fib',_,_]) :- member(_数,_100以下のフィボナッチ数ならび),!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_,_,['',_,_]). '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,[_,'Prime',_]) :- member(_数,_100以下の素数ならび),!. '素数のときは ''Prime'' と'(_,_,[_,'',_]). それ以外の場合は数を(_数,['','',_数]) :- !. それ以外の場合は数を(_,[_,_,'']). '100以下のフィボナッチ数列を得る'(L) :- '100以下のフィボナッチ数列'([1,0],L). '100以下のフィボナッチ数列'([B,A|R],L) :- C is A + B, C =< 100, '100以下のフィボナッチ数列'([C,B,A|R],L),!. '100以下のフィボナッチ数列'(L,L). '100以下の素数を得る'(_100以下の素数ならび) :- findall(N,( between(1,100,N)), _1から100までのならび), エラトステネスの篩(_1から100までのならび,_100以下の素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 'Nが100になるまで出力する'(N,L) :- atomic_list_concat(L,_表示文字列), writef('%t ',[_表示文字列]), N = 100. % 以下のサイトは # 御題 # # 1から100までの数を出力するプログラムを書け。 # ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 # 素数のときは 'Prime' と出力し、 # フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 # また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。 '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。' '100以下のフィボナッチ数列を得る'(_100以下のフィボナッチ数ならび), '100以下の素数を得る'(_100以下の素数ならび), between(1,100,_数), 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L), 'Nが100になるまで出力する'(N,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,L), '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,L), それ以外の場合は数を(_数,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,['Fib',_,_]) :- member(_数,_100以下のフィボナッチ数ならび),!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_,_,['',_,_]). '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,[_,'Prime',_]) :- member(_数,_100以下の素数ならび),!. '素数のときは ''Prime'' と'(_,_,[_,'',_]). それ以外の場合は数を(_数,['','',_数]) :- !. それ以外の場合は数を(_,[_,_,'']). '100以下のフィボナッチ数列を得る'(L) :- '100以下のフィボナッチ数列'([1,0],L). '100以下のフィボナッチ数列'([B,A|R],L) :- C is A + B, C =< 100, '100以下のフィボナッチ数列'([C,B,A|R],L),!. '100以下のフィボナッチ数列'(L,L). '100以下の素数を得る'(L) :- findall(N,( between(1,100,N), 素数である(N)), L). 素数である(1) :- !. 素数である(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,_n,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. 'Nが100になるまで出力する'(N,L) :- atomic_list_concat(L,_表示文字列), writef('%t ',[_表示文字列]), N = 100. % 以下のサイトは # 1)西暦年から11を引き、その値を19で割った余りを求め、11を掛ける。 # 2)月の値から、以下の表に従って値を求める。 # 月 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 # 値 0 2 0 2 2 4 5 6 7 8 9 10 # このうち6月までの値を「おにおににし」と覚える、と、多くの暦解説書に書かれている。 # 上記1),2)の値と日の値をそれぞれ加える。 # 求めた値を30で割った余りが、その日のおおよその月齢である。 # 但し、最大2程度の誤差がある。 以下はこれを数式化したものである。 # y年m月d日の月齢a日を求める。 # 但し、%は剰余演算子とし、c(m)は上の表に従った定数とする。例、62%30=2、c(5)=2。 月齢(_年整数,_月整数,_日整数,_月齢) :- 年月日範囲検査(_年整数,_月整数,_日整数), 月齢の月係数(_月整数,_月係数), _月齢 is (((_年整数 - 11) mod 19) * 11 + _月係数 + _日整数) mod 30. 年月日範囲検査(_年整数,_月整数,_日整数) :- between(1900,2099,_年整数), between(1,12,_月整数), 月末日整数(_年整数,_月整数,_月末日整数), between(1,_月末日整数,_日整数). 月齢の月係数(1,0). 月齢の月係数(2,2). 月齢の月係数(3,0). 月齢の月係数(4,2). 月齢の月係数(5,2). 月齢の月係数(6,4). 月齢の月係数(7,5). 月齢の月係数(8,6). 月齢の月係数(9,7). 月齢の月係数(10,8), 月齢の月係数(11,9). 月齢の月係数(12,10). '月齢・月名'(1,朔). '月齢・月名'(1,新月). '月齢・月名'(2,既朔). '月齢・月名'(3,三日月). '月齢・月名'(7,上弦). '月齢・月名'(8,上弦). '月齢・月名'(13,十三夜). '月齢・月名'(14,小望月). '月齢・月名'(15,望). '月齢・月名'(15,満月). '月齢・月名'(15,望月). '月齢・月名'(16,十六夜). '月齢・月名'(16,既望). '月齢・月名'(17,立待月). '月齢・月名'(18,居待月). '月齢・月名'(19,寝待月). '月齢・月名'(19,臥待月). '月齢・月名'(20,更待月). '月齢・月名'(22,下限). '月齢・月名'(23,下限). '月齢・月名'(29,晦). '月齢・月名'(30,晦). 月末日整数(_年整数,2,29) :- うるう年(_年整数). 月末日整数(_年整数,2,28) :- \+(うるう年(_年整数)). 月末日整数(_年整数,_月整数,30) :- member(_月整数,[4,6,8,10]). 月末日整数(_年整数,_月整数,31) :- member(_月整数,[1,3,5,7,8,10,12]). うるう年(_年整数) :- 0 is _年整数 mod 400,!. うるう年(_年整数) :- \+(0 is _年整数 mod 100), 0 is _年整数 mod 4. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/905 # # [1]c++ # [2]2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。 # また、対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。 # ただし、対角要素は左上隅から右下隅への対角線上の要素とする。次の図は実行例であ る。 # --- (2)配列nの内容 --- # # 100000000 # 010000000 # 001000000 # 000100000 # 000010000 # 000001000 # 000000100 # 000000010 # 000000001 '2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。' :- '2次元配列n[10][10]のすべての要素に1を代入してから'(LL), 'その内容を表示しなさい。'(LL). '2次元配列n[10][10]のすべての要素に1を代入してから'(LL) :- findall(_行,( '10行ある', '10要素の行のすべての要素に1を代入'(_行)),LL). '10行ある' :- between(1,10,_). '10要素の行のすべての要素に1を代入'(_行) :- '10要素の行の'(_行), すべての要素に1を代入(_行). '10要素の行の'(_行) :- length(_行,10). すべての要素に1を代入([]). すべての要素に1を代入([1|R]) :- すべての要素に1を代入(R). 'その内容を表示しなさい。'(LL) :- 表示しなさい(LL). 表示しなさい(LL) :- forall(行を表示文字列に変換する(LL,_表示文字列),writef('%w\n',[_表示文字列])). 行を表示文字列に変換する(LL,_表示文字列) :- member(_行,LL), atomic_list_concat(_行,' ',_表示文字列). '対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。' :- 対角要素だけ1を代入しほかは全て0を代入してから(LL), 表示しなさい(LL). 対角要素だけ1を代入しほかは全て0を代入してから(LL) :- findall(L,( between(1,10,_n), 対角要素だけ1を代入しほかは全て0を代入(_n,L)),LL). 対角要素だけ1を代入しほかは全て0を代入(_n,L) :- 対角要素だけ1を代入し(_n,L), 他の全ての変数要素は0に(L). 対角要素だけ1を代入し(_n,L) :- length(L,10), reverse(L,RL), 対角要素だけ1を代入し(_n,RL,L). 対角要素だけ1を代入し(_n,RL,L) :- nth1(_n,L,1), nth1(_n,RL,1). 他の全ての変数要素は0に(L) :- findall(N,( member(N,L), 変数要素は0に(N)),L). 変数要素は0に(0) :- !. 変数要素は0に(N). % 以下のサイトは 秋分の日(_年,_月,_日) :- '「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。'(_年,_月,_日),!. 秋分の日(_年,9,_日) :- '国立天文台「暦象年表」に基づき', between(1980,2099,_年), _日 is truncate(23.2488+0.242194*(_年-1980)-truncate((_年-1980)/4)),!. '「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。'(2013,9,23) :- true,!. '国立天文台「暦象年表」に基づき'. % 国立天文台発行のメールニュース. % 以下のサイトは 春分の日(_年,_月,_日) :- '「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。'(_年,_月,_日),!. 春分の日(_年,3,_日) :- '国立天文台「暦象年表」に基づき', between(1980,2099,_年), _日 is truncate(20.8431+0.242194*(_年-1980)-truncate((_年-1980)/4)),!. '「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。'(_年,_月,_日) :- fail. '国立天文台「暦象年表」に基づき'. % 以下のサイトは # [1] 授業単元:著作権 # [2] 問題文(含コード&リンク): # # 標準入力から西暦(グレゴリオ暦)を受け取り、 # その年のイースターの日を計算するプログラムを作成してください。 # 結果の表示はしてもしなくてもかまいません。 # # [3] 環境 #  [3.1] OS: (Windows/Linux/等々) #  [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) #  [3.3] 言語: (C/C++/どちらでも可 のいずれか) # [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) # [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) '標準入力から西暦(グレゴリオ暦)を受け取り、 その年のイースターの日を計算するプログラムを作成してください。 結果の表示はしてもしなくてもかまいません。'(_西暦,_月,_日) :- '標準入力から西暦(グレゴリオ暦)を受け取り、'(_西暦), 'Metonic cycleを使ってその年のイースターの日を計算する'(_西暦,_月,_日). '標準入力から西暦(グレゴリオ暦)を受け取り、'(_西暦) :- 整数を得る('西暦(グレゴリオ暦)',グレゴリオ歴(_西暦),_西暦). 'Metonic cycleを使ってその年のイースターの日を計算する'(_西暦,_月,_日) :- 'まず調べたい年の西暦年を19で割った余りを計算します。その余りに11をかけて225から引いた数字をDとします。'(_西暦,D), 'もしDが51以上の時は51未満になるまで30で引き、それをD_2とします。もし、Dが48よりも大きい時はそれから1を引きます。'(D,D_2), '西暦年と、西暦年を4で割った数字(小数点以下切り捨て)と、D_2 + 1 とを足し、それを7で割った余りをEとします。'(_西暦,D_2,E), 'D_2に7を足してEで引き、それをQとします。'(D_2,E,Q), 'もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。'(Q,_月,_日). 'まず調べたい年の西暦年を19で割った余りを計算します。その余りに11をかけて225から引いた数字をDとします。'(_西暦,D) :- _19で割った余り is _西暦 mod 19, D is 255 - _19で割った余り * 11. 'もしDが51以上の時は51未満になるまで30で引き、それをD_2とします。もし、Dが48よりも大きい時はそれから1を引きます。'(D,D_2) :- 'もしDが51以上の時は'(D), '51未満になるまで30で引き、それをD_2とします。'(D,D_2). 'もしDが51以上の時は51未満になるまで30で引き、それをD_2とします。もし、Dが48よりも大きい時はそれから1を引きます。'(D,D_2) :- 'もし、Dが48よりも大きい時は'(D), 'それから1を引きます。'(D,D_2). 'もしDが51以上の時は'(D) :- D >= 51. '51未満になるまで30で引き、それをD_2とします。'(D,D) :- D < 51. '51未満になるまで30で引き、それをD_2とします。'(D,D_2) :- D >= 51, D_1 is D - 30, '51未満になるまで30で引き、それをD_2とします。'(D_1,D_2). 'もし、Dが48よりも大きい時は'(D) :- between(48,50,D). 'それから1を引きます。'(D,D_2) :- D_2 is D - 1. '西暦年と、西暦年を4で割った数字(小数点以下切り捨て)と、D_2 + 1 とを足し、それを7で割った余りをEとします。'(_西暦,D_2,E) :- _西暦年を4で割った数字 is _西暦 // 4, E is (_西暦 + _西暦年を4で割った数字 + D_2 + 1) mod 7. 'D_2に7を足してEで引き、それをQとします。'(D_2,E,Q) :- Q is D_2 + 7 - E. 'もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。'(Q,3,Q) :- Q =< 31,!. 'もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。'(Q,4,_日) :- Q >= 32, _日 is Q - 31. グレゴリオ歴(_西暦) :- true. % 以下のサイトは # [1] 授業単元:著作権 # [2] 問題文(含コード&リンク): # # 標準入力から西暦(グレゴリオ暦)を受け取り、 # その年のイースターの日を計算するプログラムを作成してください。 # 結果の表示はしてもしなくてもかまいません。 # # [3] 環境 #  [3.1] OS: (Windows/Linux/等々) #  [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) #  [3.3] 言語: (C/C++/どちらでも可 のいずれか) # [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) # # [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) # # # イースターの日の決め方 # # イースターの日の決め方の単純な定義は「春分の日の次の満月の後の最初の日曜日」ということになります。 # 尚、その満月の日が日曜日の場合は翌日曜日がイースターとなります。 # # しかしながら、厳密に申しますとこの定義は正しくありません。 # まず、ここでいう「春分の日」は天文学的な意味での春分の日ではなく常に3月21日とします。 # 「満月の日」というのも天文学的な意味での満月の日ではなくMetonic cycleという周期に基づいたものなのです。 # # この理由は、地球上の経度の違い、即ちタイムゾーンの違いによって地域によってイースターの日が変ってしまうという混乱を防ぐためなのです。 # イースターの日を決めるということはそもそも礼拝式典の必要から生じてきました。 # 8世紀までは決め方に関する定まった方法はありませんでしたが、 # AD325年のニカヤ会議による方法が徐々に取り入れられていったようです。 # グレゴリオ暦の採択によって幾分かの修正が必要となりましたが基本的には同じです。 # # 逆に言うと、Metonic cycleさえ知っていれば、将来のイースターの日を計算することが可能なのです。 # # 試してみたい方は、次のようなアルゴリズムによって1900年から2099年までのイースターの日が計算できます。 # # 1.まず調べたい年の西暦年を19で割った余りを計算します。 # # (例えば2006年の場合は19で割って余りが11) # # 2.その余りに11をかけて225から引いた数字をDとします。 # # (D=225-11×11= 104) # # 3.もしDが51以上の時は51未満になるまで30で引き、改めてそれをDとします。 # # (D=104-30-30=44) # # 4.もし、Dが48よりも大きい時はそれから1を引きます。 # # (D=44なのでそのまま) # # 5.西暦年と、西暦年を4で割った数字(小数点以下切り捨て)と、D+1とを足し、それを7で割った余りをEとします。 # # (2006+501+44+1=2552となり7で割ると余りが4なのでE=4) # # 6.Dに7を足してEで引き、それをQとします。 # # (Q=44+7-4=47) # # 7.もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。 # # (Qは47なので、イースターは4月そして日付は47-31=16日) # # 堺福音教会東京チャペル # tokyo@jec-net.org # TEL.03-3642-5242/FAX.03-3642-5479 # 〒135-0042 東京都江東区木場2丁目17-10-301 # のサイトからの引用 'イースターの日の決め方 イースターの日の決め方の単純な定義は「春分の日の次の満月の後の最初の日曜日」ということになります。 尚、その満月の日が日曜日の場合は翌日曜日がイースターとなります。 しかしながら、厳密に申しますとこの定義は正しくありません。 まず、ここでいう「春分の日」は天文学的な意味での春分の日ではなく常に3月21日とします。 「満月の日」というのも天文学的な意味での満月の日ではなくMetonic cycleという周期に基づいたものなのです。 この理由は、地球上の経度の違い、即ちタイムゾーンの違いによって地域によって イースターの日が変ってしまうという混乱を防ぐためなのです。 イースターの日を決めるということはそもそも礼拝式典の必要から生じてきました。 8世紀までは決め方に関する定まった方法はありませんでしたが、 AD325年のニカヤ会議による方法が徐々に取り入れられていったようです。 グレゴリオ暦の採択によって幾分かの修正が必要となりましたが基本的には同じです。 試してみたい方は、次のようなアルゴリズムによって1900年から2099年までのイースターの日が計算できます。 1.まず調べたい年の西暦年を19で割った余りを計算します。 (例えば2006年の場合は19で割って余りが11) 2.その余りに11をかけて225から引いた数字をDとします。 (D=225-11×11= 104) 3.もしDが51以上の時は51未満になるまで30で引き、改めてそれをDとします。 (D=104-30-30=44) 4.もし、Dが48よりも大きい時はそれから1を引きます。 (D=44なのでそのまま) 5.西暦年と、西暦年を4で割った数字(小数点以下切り捨て)と、D+1とを足し、それを7で割った余りをEとします。 (2006+501+44+1=2552となり7で割ると余りが4なのでE=4) 6.Dに7を足してEで引き、それをQとします。 (Q=44+7-4=47) 7.もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。 (Qは47なので、イースターは4月そして日付は47-31=16日)' :- 堺福音教会東京チャペルのサイトからの引用. '標準入力から西暦(グレゴリオ暦)を受け取り、 その年のイースターの日を計算するプログラムを作成してください。 結果の表示はしてもしなくてもかまいません。'(_西暦,_月,_日) :- '標準入力から西暦(グレゴリオ暦)を受け取り、'(_西暦), 'Metonic cycleを使ってその年のイースターの日を計算する'(_西暦,_月,_日). '標準入力から西暦(グレゴリオ暦)を受け取り、'(_西暦) :- 整数を得る('西暦(グレゴリオ暦)',グレゴリオ歴(_西暦),_西暦). 'Metonic cycleを使ってその年のイースターの日を計算する'(_西暦,_月,_日) :- 'まず調べたい年の西暦年を19で割った余りを計算します。その余りに11をかけて225から引いた数字をDとします。'(_西暦,D), 'もしDが51以上の時は51未満になるまで30で引き、それをD_2とします。もし、Dが48よりも大きい時はそれから1を引きます。'(D,D_2), '西暦年と、西暦年を4で割った数字(小数点以下切り捨て)と、D_2 + 1 とを足し、それを7で割った余りをEとします。'(_西暦,D_2,E), 'D_2に7を足してEで引き、それをQとします。'(D_2,E,Q), 'もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。'(Q,_月,_日). 'まず調べたい年の西暦年を19で割った余りを計算します。その余りに11をかけて225から引いた数字をDとします。'(_西暦,D) :- _19で割った余り is _西暦 mod 19, D is 255 - _19で割った余り * 11. 'もしDが51以上の時は51未満になるまで30で引き、それをD_2とします。もし、Dが48よりも大きい時はそれから1を引きます。'(D,D_2) :- 'もしDが51以上の時は'(D), '51未満になるまで30で引き、それをD_2とします。'(D,D_2). 'もしDが51以上の時は51未満になるまで30で引き、それをD_2とします。もし、Dが48よりも大きい時はそれから1を引きます。'(D,D_2) :- 'もし、Dが48よりも大きい時は'(D), 'それから1を引きます。'(D,D_2). 'もしDが51以上の時は'(D,D_2) :- D >= 51. '51未満になるまで30で引き、それをD_2とします。'(D,D_2) :- D_2 is ((D - 51) // 30) + 1) * 30. 'もし、Dが48よりも大きい時は'(D) :- between(48,50,D). 'それから1を引きます。'(D,D_2) :- D_2 is D - 1. '西暦年と、西暦年を4で割った数字(小数点以下切り捨て)と、D_2 + 1 とを足し、それを7で割った余りをEとします。'(_西暦,D_2,E) :- _西暦年を4で割った数字 is _西暦 // 4, E is (_西暦年を4で割った数字 + D_2 + 1) mod 7. 'D_2に7を足してEで引き、それをQとします。'(D_2,E,Q) :- Q is D_2 + 7 - E. 'もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。'(Q,3,Q) :- Q =< 31,!. 'もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。'(Q,4,_日) :- Q >= 32, _日 is Q - 31. グレゴリオ歴(_西暦) :- true. % 以下のサイトは オイラー素数(_オイラー素数) :- between(0,39,_n), _オイラー素数 is _n * _n + _n + 41. % 以下のサイトは フェルマー素数(_フェルマー素数) :- between(0,4,_n), _フェルマー素数 is truncate(2 ^ (2 ^ _n) + 1). % 以下のサイトは # [1] 授業単元:プログラミング # [2] 問題文 # ・1から100までの数をプリントするプログラムを書け。ただしフェルマー素数のときは # 数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。 # '1から100までの数をプリントするプログラムを書け。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。' :- '1から100までの範囲のフェルマー素数とオイラー素数を得る'(_フェルマー素数ならび,_オイラー素数ならび), '1から100までの範囲のフェルマー素数とオイラー素数両方の倍数を得る'(_フェルマー素数ならび,_オイラー素数ならび,_フェルマー素数とオイラー素数両方の倍数ならび), '1から100までの数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_フェルマー素数ならび,_オイラー素数ならび,_フェルマー素数とオイラー素数両方の倍数ならび,_n), write(' '), _n = 100. '1から100までの範囲のフェルマー素数とオイラー素数を得る'(_フェルマー素数ならび,_オイラー素数ならび) :- '1から100までの範囲のフェルマー素数を得る'(_フェルマー素数ならび), '1から100までの範囲のオイラー素数を得る'(_オイラー素数ならび). '1から100までの範囲のフェルマー素数を得る'(_フェルマー素数ならび) :- findall(_n,( between(1,100,_n), フェルマー素数(_n)), _フェルマー素数ならび). '1から100までの範囲のオイラー素数を得る'(_オイラー素数ならび) :- findall(_n,( between(1,100,_n), オイラー素数(_n)), _オイラー素数ならび). '1から100までの範囲のフェルマー素数とオイラー素数両方の倍数を得る'(_フェルマー素数ならび,_オイラー素数ならび,_フェルマー素数とオイラー素数両方の倍数ならび) :- findall(_n,( between(1,100,_n), フェルマー素数とオイラー素数両方の倍数(_n,_フェルマー素数ならび,_オイラー素数ならび)), _フェルマー素数とオイラー素数両方の倍数ならび). フェルマー素数とオイラー素数両方の倍数(_n,_フェルマー素数ならび,_オイラー素数ならび) :- member(_フェルマー素数,_フェルマー素数ならび), member(_オイラー素数,_オイラー素数ならび), 0 is _n mod _フェルマー素数, 0 is _n mod _オイラー素数,!. '1から100までの数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_フェルマー素数ならび,_オイラー素数ならび,_フェルマー素数とオイラー素数両方の倍数ならび,_n) :- '1から100までの'(_n), '数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_n,_フェルマー素数ならび,_オイラー素数ならび,_フェルマー素数とオイラー素数両方の倍数ならび). '1から100までの'(_n) :- between(1,100,_n). '数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_n,_,_,_フェルマー素数とオイラー素数両方の倍数ならび) :- 'フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」と'(_n,_フェルマー素数とオイラー素数両方の倍数ならび),!. '数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_n,_フェルマー素数ならび,_,_) :- 'フェルマー素数のときは数の代わりに「Fizz」と'(_n,_フェルマー素数ならび),!. '数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_n,_,_オイラー素数ならび,_) :- 'オイラー素数のときは「Buzz」と'(_n,_オイラー素数ならび),!. '数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_n,_,_,_) :- writef('%t',[_n]). 'フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」と'(_n,_フェルマー素数とオイラー素数両方の倍数ならび) :- member(_n,_フェルマー素数とオイラー素数両方の倍数ならび), write('FizzBuzz'),!. 'フェルマー素数のときは数の代わりに「Fizz」と'(_n,_フェルマー素数ならび) :- member(_n,_フェルマー素数ならび), write('Fizz'). 'オイラー素数のときは「Buzz」と'(_n,_オイラー素数ならび) :- member(_n,_オイラー素数ならび), write('Buzz'). オイラー素数(_オイラー素数) :- between(0,39,_n), _オイラー素数 is _n * _n + _n + 41. フェルマー素数(_フェルマー素数) :- between(0,4,_n), _フェルマー素数 is truncate(2 ^ (2 ^ _n) + 1). % 以下のサイトは アルファベットのならびを生成する(_アルファベットのならび) :- findall(_アルファベット,( アルファベットの文字コードの範囲(_文字コード), char_code(_アルファベット,_文字コード)), _アルファベットのならび). アルファベットの文字コードの範囲(_文字コード) :- 数字文字コード(_文字コード). アルファベットの文字コードの範囲(_文字コード) :- 英大文字コード(_文字コード). アルファベットの文字コードの範囲(_文字コード) :- 英小文字コード(_文字コード). 数字文字コード(_文字コード) :- between(48,57,_文字コード). 英大文字コード(_文字コード) :- between(65,90,_文字コード). 英小文字コード(_文字コード) :- between(97,122,_文字コード). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1363522503/91 # # Youtubeみたいなランダムでユニークなn文字数の文字列を作る方法を教えてください 'Youtubeみたいなランダムでユニークなn文字数の文字列を作る'(_n,_文字列) :- 'ランダムでユニークなn文字数の文字コードならびを作る'(_n,[],Chars), atom_codes(_文字列,Code). 'ランダムでユニークなn文字数の文字コードならびを作る'(0,L,L). 'ランダムでユニークなn文字数の文字コードならびを作る'(M,L1,L) :- ユニークな文字コードを選択する(L1,Code), M_1 is M - 1, 'ランダムでユニークなn文字数の文字コードならびを作る'(M_1,[Code|L1],L). ユニークな文字を選択する(L,Code) :- Code is random(75) + 48, アルファベットの範囲(Code), \+(member(Code,L)),!. ユニークな文字を選択する(L,Code) :- ユニークな文字を選択する(L,Code). アルファベットの範囲(Code) :- between(48,57,Code). アルファベットの範囲(Code) :- between(65,90,Code). アルファベットの範囲(Code) :- between(97,122,Code). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1363522503/91 # # Youtubeみたいなランダムでユニークなn文字数の文字列を作る方法を教えてください 'Youtubeみたいなランダムでユニークなn文字数の文字列を作る'(_n,_文字列) :- 'ランダムでユニークなn文字数の文字コードならびを作る'(_n,[],Chars), atom_codes(_文字列,Code). 'ランダムでユニークなn文字数の文字コードならびを作る'(0,L,L). 'ランダムでユニークなn文字数の文字コードならびを作る'(M,L1,L) :- ユニークな文字コードを選択する(L1,Code), M_1 is M - 1, 'ランダムでユニークなn文字数の文字コードならびを作る'(M_1,[Code|L1],L). ユニークな文字を選択する(L,Code) :- Code is random(75) + 48, アルファベットの範囲(Code), \+(member(Code,L)),!. ユニークな文字を選択する(L,Code) :- ユニークな文字を選択する(L,Code). アルファベットの範囲(Code) :- between(48,57,Code). アルファベットの範囲(Code) :- between(65,90,Code). アルファベットの範囲(Code) :- between(97,122,Code). % 以下のサイトは # 990 :デフォルトの名無しさん :sage :2013/03/16(土) 11:04:28.09 # # りんごが当たる確率20% # みかんが当たる確率35% # ばななが当たる確率45% # # これをコードにしたいんですが、この仕組みはどう実装していいのかわかりません # 言語は特にこだわりはないのですが、ヒントをください # # 991 :デフォルトの名無しさん :sage :2013/03/16(土) 11:09:36.39 # [0.0, 1.0)の乱数(x)を生成し、 # x < 0.2 なら りんご # 0.2 <= x < 0.55 なら みかん # 0.55 <= x なら ばなな # # 995 :デフォルトの名無しさん :2013/03/16(土) 12:21:55.33 # >>990 # そのくらい自分で考えられない知恵遅れがプログラミングなんかに手を出すな # :- op(300,xf,'%'). 'りんごが当たる確率20%'(20 '%'). 'みかんが当たる確率35%'(35 '%'). 'ばななが当たる確率45%'(45 '%'). 当たる確率(りんご,_当たる確率 '%') :- 'りんごが当たる確率20%'(_当たる確率 '%'). 当たる確率(みかん,_当たる確率 '%') :- 'みかんが当たる確率35%'(_当たる確率 '%'). 当たる確率(ばなな,_当たる確率 '%') :- 'ばななが当たる確率45%'(_当たる確率 '%'). 'りんご・みかん・ばななのどれかを取り出す'(_どれか) :- 一から百の範囲の乱数(_乱数), 割り当てた数範囲にある(_どれか,_乱数). 一から百の範囲の乱数(_乱数) :- _乱数 is random(100) + 1. 割り当てた数範囲にある(りんご,_乱数) :- between(1,20,_乱数). 割り当てた数範囲にある(みかん,_乱数) :- between(21,55,_乱数). 割り当てた数範囲にある(ばなな,_乱数) :- between(56,100,_乱数). 標本として用意すべき個数(_物,_総標本数,_標本として用意すべき個数) :- 当たる確率(_物,_当たる確率 '%'), _標本として用意すべき個数 is truncate((_総標本数 * _当たる確率 / 100) + 0.5). % 「割り当てた数範囲にある」と確率の関係がうまく説明できていない。 % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/140 # # [1] 授業単元: Cプロ # [2] 問題文(含コード&リンク): # 3行3列の行列aを入力後、余因子行列で行列値|a|を求める # '3行3列の行列aを入力後、余因子行列で行列値|a|を求める' :- '3行3列の行列aを入力'(_a), '余因子行列で行列値|a|を求める'(_a,_行列式_aの値), writef('行列値|a|は%tです。\n',[_行列式_aの値]). '3行3列の行列aを入力'(_a) :- length(_a,3), findall(L,( nth1(_nth1,_a,L), length(L,3), '3列入力する'(_nth1,1,L)), _a). '3列入力する'(_,_,[]). '3列入力する'(_行位置,_列位置,[V|R]) :- writef('列入力[%t][%t] : ',[_行位置,_列位置]), get_line(Line), atom_to_term(Line,V,_), _列位置_2 is _列位置 + 1, '3列入力する'(_行位置,_列位置_2,R). '余因子行列を使って逆行列を得る'(_n,_正方行列,_逆行列) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値), 余因子行列(_n,_正方行列,_余因子行列), 転置(_余因子行列,_転置された余因子行列), 行列のすべての要素に値を掛ける(1,_n,_転置された余因子行列,1 / _行列式の値,_逆行列). 行列のすべての要素に値を掛ける(_行目,_n,LL,_,LL) :- _行目 > _n,!. 行列のすべての要素に値を掛ける(_行目,_n,LL1,_乗数 / _除数,LL2) :- '行基本変形'(_乗数 / _除数 # _行目,LL1,LL3), _行目_2 is _行目 + 1, 行列のすべての要素に値を掛ける(_行目_2,_n,LL3,_乗数 / _除数,LL2). '余因子行列で行列値|a|を求める'(_a,_行列式_aの値) :- 余因子行列(_a,_余因子行列), _a = [_aの第一行|_], _余因子行列 = [_余因子行列の第一行|_], '二つのならびの積の和'(_aの第一行,_余因子行列の第一行,_行列式_aの値). '二つのならびの積の和'([],[],0). '二つのならびの積の和'([A|R1],[B|R2],S) :- '二つのならびの積の和'(R1,R2,S_1), S is S_1 + A * B. 余因子行列(_正方行列,_余因子行列) :- length(_正方行列,_n), 余因子行列(_n,_正方行列,_余因子行列). 余因子行列(_n,_正方行列,_余因子行列) :- length(_余因子行列,_n), findall(L,( nth1(_i,_余因子行列,L), 余因子行列の要素が余因子である(_n,_正方行列,_i,L)), _余因子行列). 余因子行列の要素が余因子である(_n,_正方行列,_i,L) :- length(L,_n), findall(_余因子,( nth1(_j,L,_余因子), 余因子(_n,_正方行列,_i,_j,_余因子)), L). 行列式の値(1,[[_]],1) :- !. 行列式の値(2,_正方行列,_行列式の値) :- 二つの対角要素の積の差を得る(_n,_正方行列,_行列式の値),!. 行列式の値(_n,_正方行列,_行列式の値) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値). 余因子(_n,_正方行列,_i,_j,_余因子) :- 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子). 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) :- '正方行列からi行j列を取り除いた行列式の値'(_n,_正方行列,_i,_j,_n_1次正方行列の行列式の値), 'i,jから乗数を得る'(_i,_j,_乗数), _余因子 is _乗数 * _n_1次正方行列の行列式の値. '正方行列からi行j列を取り除いた行列式の値'(_n,_正方行列,_i,_j,_n_1次正方行列の行列式の値) :- '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列), _n_1 is _n - 1, 行列式の値(_n_1,_n_1次正方行列,_n_1次正方行列の行列式の値). '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列) :- '第何行を取り除く'(_正方行列,_i,_第i行が取り除かれた行列), 転置(_第i行が取り除かれた行列,_転置された第i行が取り除かれた行列), '第何行を取り除く'(_転置された第i行が取り除かれた行列,_j,_転置された第i行第j列が取り除かれた行列), 転置(_転置された第i行第j列が取り除かれた行列,_n_1次正方行列). '第何行を取り除く'(_正方行列,_第何行,_第i行が取り除かれた行列) :- append(L0,[L|R],_正方行列), length([_|L0],_第何行), append(L0,R,_第i行が取り除かれた行列). 二つの対角要素の積の差を得る(0,[],1) :- !. 二つの対角要素の積の差を得る(1,[[N]],N) :- !. 二つの対角要素の積の差を得る(_n,_正方行列,_二つの対角要素の積の差) :- 二つの対角要素の積を得る(_正方行列,_右下がり対角要素の積,_右上がり対角要素の積), _二つの対角要素の積の差 is _右下がり対角要素の積 - _右上がり対角要素の積. 二つの対角要素の積を得る(_正方行列,_右下がり対角要素の積,_右上がり対角要素の積) :- 二つの対角要素を得る(_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび), 対角要素の掛算(_右下がり対角要素ならび,_右下がり対角要素の積), 対角要素の掛算(_右上がり対角要素ならび,_右上がり対角要素の積). 二つの対角要素を得る(_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび) :- 右下がり対角要素ならび(_正方行列,_右下がり対角要素ならび), 右上がり対角要素ならび(_正方行列,_右上がり対角要素ならび). 右下がり対角要素ならび(_正方行列,_右下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), nth1(_nth1,L,V)), _右下がり対角要素ならび). 右上がり対角要素ならび(_正方行列,_右上がり対角要素ならび) :- reverse(_正方行列,_行を逆転した正方行列), 右下がり対角要素ならび(_行を逆転した正方行列,_右上がり対角要素ならび). 左下がり対角要素ならび(_正方行列,_左下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), length([_|R],_nth1), append(_,[V|R],L)), _左下がり対角要素ならび),!. 左上がり対角要素ならび(_正方行列,_左上がり対角要素ならび) :- reverse(_正方行列,_行を逆転した正方行列), 左下がり対角要素ならび(_行を逆転した正方行列,_左上がり対角要素ならび). 'i,jから乗数を得る'(_i,_j,(-1)) :- 1 is (_i + _j) mod 2,!. 'i,jから乗数を得る'(_i,_j,1) :- 0 is (_i + _j) mod 2,!. 対角要素の掛算([],1). 対角要素の掛算([A|R],X) :- 対角要素の掛算(R,Y), X is A * Y. 'n次正方行列の要素を行・列順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_i行), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素). 'n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_j列), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素). % 以下のサイトは # x^2+y^2=z^2を満たす正の整数をピタゴラス数と呼び、三つ組(x,y,z)で表す。 # ピタゴラス数のリストを生成する関数pythsを定義せよ。 # ただし、ピタゴラス数の要素は、与えられた上限以下であるとする。 # ピタゴラス数ならび(_要素値上限,_ピタゴラス数ならび) :- findall(N,between(1,_要素値上限,N),L), findall([X,Y,Z],( 重複組み合わせ(L,3,[X,Y,Z]), Z * Z =:= X * X + Y * Y), _ピタゴラス数ならび). % 以下のサイトは % % PrologというのはFizzBuzz問題向きなのだろうか。 % fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz([_],[_],L). fizzbuzz([_,_,_],[_,_,_,_,_],[_|R]) :- fizzbuzz([],[],['FizzBuzz'|R]). fizzbuzz([_,_,_],L2,[_|R]) :- fizzbuzz([],L2,['Fizz'|R]). fizzbuzz(L1,[_,_,_,_,_],[_|R]) :- fizzbuzz(L1,[],['Buzz'|R]). fizzbuzz(L1,L2,[A|R]) :- writef('%w ',[A]), fizzbuzz([_|L1],[_|L2],R). fizzbuzz(_,_,[]). fizzbuzz(N) :- fizbuzz(1,N,['','','Fizz'],['','','','','Buzz']). fizzbuzz(M,N,_,_) :- M > N,!. fizzbuzz(M,N,[_31,_32,_33],[_51,_52,_53,_54,_55]) :- 出力情報(_31,_51,M,_N), writef('%w%w%w ',[_31,_51,_N]), fizzbuzz(M,N,[_32,_33,_31],[_52,_53,_54,_55,_51]). 出力情報('','',_N,_N) :- !. 出力情報(_,_,_,''). fizzbuzz(N) :- findall(M,between(1,N,M),L), forall(fizzbuzz(['','','Fizz'],['','','','','Buzz'],L),true). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%w%w%w ',[A,B,C]). fizzbuzz([A|R1],[B|R2],[_|R3]) :- append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N) :- !. fizzbuzz(A,B,_,''). % PrologによるFizzBuzz問題プログラムの比較 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/48 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # FizzBuzz問題の要領で、1から100までの整数を、かいぎょう区切りで出力せよ、ただし、 # 3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、 # 数値の代わりに出力することとする # '1から100までの整数をかいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする' :- '1から100までの整数を'(_整数), 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(_整数), _整数 = 100. '1から100までの整数を'(_整数) :- between(1,100,_整数). 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(N) :- 0 is N mod 3, writef('%t',['Fizz']), fail. 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(N) :- 0 is N mod 7, writef('%t',['Buzz']), fail. 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(N) :- 0 is N mod 13, writef('%t',[hoge]), fail. 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(N) :- \+(0 is N mod 3), \+(0 is N mod 7), \+(0 is N mod 13), writef('%t',[N]), fail. 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(_) :- write('\n'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/998 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # FizzBuzz問題の要領で、1から100までの整数を、かいぎょう区切りで出力せよ、ただし、 # 3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、 # 数値の代わりに出力することとする # 'FizzBuzz問題の要領で、1から100までの整数を、かいぎょう区切りで出力せよ、ただし、 3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、 数値の代わりに、かいぎょう区切りで出力することとする' :- '1から100までの整数を、'(_整数), '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、数値の代わりに、かいぎょう区切りで出力することとする'(_整数), _整数 = 100. '1から100までの整数を、'(_整数) :- between(1,100,_整数). '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、数値の代わりに、かいぎょう区切りで出力することとする'(_整数) :- '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、該当しない時は数値を'(_整数,_出力値), writef('%t\n',[_出力値]). '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、該当しない時は数値を'(_整数,_出力文字列) :- '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」のどれかが該当したとき'(_整数,_表示ならび), atomic_list_concat(_表示ならび,_表示文字列),!. '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、該当しない時は数値を'(_整数,_整数). '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」のどれかが該当したとき'(_整数,_表示ならび) :- findall(A,( '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」の'(_整数,A)), _表示ならび), どれかが該当したとき(_表示ならび). '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」の'(_整数,A) :- member([_除数,A],[[3,'Fizz'],[5,'Buzz'],[7,hoge]]), 0 is _整数 mod _除数. どれかが該当したとき([_|_]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/874 # # ../test/read.cgi/tech/1357748713/775 # http://pc11.2ch.net/test/read.cgi/tech/1202135539/607 # [1] 授業単元:プログラミング # [2] 問題文 :キーボードから西暦と月を入力するとカレンダーを #       表示するプログラムを作成せよ # キーボードから西暦と月を入力するとカレンダーを表示する :- キーボードから西暦と月を入力すると(_西暦,_月), カレンダーを表示する(_西暦,_月). キーボードから西暦と月を入力すると(_西暦,_月) :- 整数を得る(西暦,true,_西暦), 整数を得る(月,between(1,12,_月),_月). カレンダーを表示する(_西暦,_月) :- カレンダーを(_西暦,_月,_カレンダー), 表示する(_西暦,_月,_カレンダー). カレンダーを(_西暦,_月,_カレンダー) :- 月末日(_西暦,_月,_月末日), 'Zellerの公式を用いて曜日を得る'(_年,_月,1,_曜日を表す値,_曜日), findall(D,between(1,_月末日,D),L1), カレンダーの先頭に0を詰める(L1,L2), '7個組に分解'(L2,_カレンダー). 月末日(_西暦,2,29) :- うるう年(_西暦),!. 月末日(_,2,28) :- !. 月末日(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]),!. 月末日(_,_月,30) :- member(_月,[4,6,9,11]),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 'Zellerの公式で使う曜日を表す値'(_曜日を表す値,_曜日),!. 'Zellerの公式で使う曜日を表す値'(0,日曜). 'Zellerの公式で使う曜日を表す値'(1,月曜). 'Zellerの公式で使う曜日を表す値'(2,火曜). 'Zellerの公式で使う曜日を表す値'(3,水曜). 'Zellerの公式で使う曜日を表す値'(4,木曜). 'Zellerの公式で使う曜日を表す値'(5,金曜). 'Zellerの公式で使う曜日を表す値'(6,土曜). all([],_). all([V|R],V) :- all(R,V). カレンダーの先頭に0を詰める(L1,L2) :- length(L0,_曜日を表す値), append(L0,L1,L2), all(L0,0),!. '7個組に分解'([],[]) :- !. '7個組に分解'([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- '7個組に分解'(R1,R2),!. '7個組に分解'(L,[L]). 表示する(_西暦,_月,_カレンダー) :- writef('\n%8r年 %t月\n\n',[_西暦,_月]), member(L,_カレンダー), 一行表示する(L), fail. 表示する(_西暦,_月,_カレンダー) :- write('\n'). 一行表示する([]) :- write('\n'). 一行表示する([0|R]) :- writef('%3r',[' ']), 一行表示する(R),!. 一行表示する([N|R]) :- writef('%3r',[N]), 一行表示する(R). % 以下のサイトは # 出典:: 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/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] その他の制限: なし # よろしくお願いします。 '5人の点数を読み込んでいき、その最高点を表示する' :- findall(_点数,( between(1,5,_), 数を得る(点数,true,_点数)), _5人の点数ならび), 最高点(_5人の点数ならび,_最高点), writef('最高点は%tです\n',[_最高点). 最高点(_5人の点数ならび,_最高点) :- append(_,[_最高点|R],_5人の点数ならび), \+((member(A,R),A > _最高点)),!. % 以下のサイトは # 出典:: 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/637 # # 1] 授業単元: プログラミング 演習(構造体) # [2] 問題文(含コード&リンク): 3冊の本の名前、ISBN、著者名を入力し一覧表示しなさい。 # ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。 # '3冊の本の名前、ISBN、著者名を入力し一覧表示しなさい。ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。' :- '3冊の本の名前、ISBN、著者名を入力し'(_3冊の本), 一覧表示しなさい(_3冊の本). '3冊の本の名前、ISBN、著者名を入力し'(_3冊の本) :- findall([_本の名前,_ISBN,_著者名],( between(1,3,_), 本の名前の入力(_本の名前), 'ISBNの入力'(_ISBN), 著者名の入力(_著者名)), _3冊の本). 本の名前の入力(_本の名前) :- write('本の名前を入力してください : '), get_line(_本の名前). 'ISBNの入力'(_本の名前) :- write('ISBNを入力してください : '), get_line(_ISBN). 著者名の入力(_著者名) :- write('著者名を入力してください : '), get_line(_著者名). 一覧表示しなさい([]). 一覧表示しなさい([[_本の名前,_ISBN,_著者名]|R]) :- writef('%20l %17l %12l',[_本の名前,_ISBN,_著者名]), 'ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。'(_ISBN), write('\n'), 一覧表示しなさい(R). 'ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。'(_ISBN文字列) :- atom_chars(_ISBN文字列,[_,_,_,-,_,-,_,_,_,_,_,-,_,_,_,-|_]),!. 'ただし、ISBNの4,6,12,16桁目に'-'が入っていない場合エラー表示しなさい。'(_ISBN文字列) :- write(' %ISBN形式エラー '). % 以下のサイトは うるう年は何回来るか(_年起点,_年終点,_うるう年の回数) :- count(( between(_年起点,_年終点,_年), うるう年(_年)), _うるう年の回数). 'ある日から後の年のある日は何日目か(起点日と終点日はそれぞれ日数に含める)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はそれぞれ日数に含める, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2. 'ある日から後の年のある日は何日目か(起点日と終点日はともに日数に含めない)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はともに日数に含めない, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2 - 2. 'ある日から後の年のある日は何日目か(起点日と終点日のどちらかは日数に含めない)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はともに日数に含めない, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2 - 1. ある年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目) :- うるう年は何回来るか(_年起点,_年終点,_うるう年の回数), '基本は一年365日で計算し、それにうるう年の回数(日数)を加える'(_年起点,_年終点,_うるう年の回数,_何日目). '基本は一年365日で計算し、それにうるう年の回数(日数)を加える'(_年起点,_年終点,_うるう年の回数,_何日目) :- _何日目 is _うるう年の回数 + 365 * (_年終点 - _年起点 + 1). 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目) :- _翌年 is _年起点 + 1, ある年の元旦から後の年の大晦日は何日目か(_翌年,_年終点,_何日目). ある年の元旦から後の年のある日は何日目か(_年起点,_年終点,_月終点,_日終点,_何日目) :- _前年 is _年終点 - 1, ある年の元旦から後の年の大晦日は何日目か(_年起点,_前年,_何日目_1), ある年月日はその年の元旦から何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _何日目_1 + _何日目_2. ある年月日はその年の元旦から何日目か(_年,_月,_日,_元旦から何日) :- 月日数ならび(_年,_月日数ならび), _前月 is _月 - 1, length(L0,_月), append(L0,_,_月日数ならび), sum(L0,_前月末日までの日数), _元旦から何日 is _前月末日までの日数 + _日. 大晦日は何日目か(_年,_月,_日,_大晦日は何日目) :- 月日数ならび(_年,_月日数ならび), 翌月から一日から大晦日は何日目か(_年,_月,_日,_月日数ならび,_翌月の一日から大晦日は何日目), 今日を含めて今月末日までの日数(_年,_月,_日,_月日数ならび,_今日を含めて今月の末日までの日数), _大晦日は何日目 is _今日を含めて今月の末日までの日数 + _翌月の一日から大晦日は何日目. 翌月から一日から大晦日は何日目か(_年,_月,_日,_月日数ならび,_何日目) :- length(L0,_月), append(L0,_翌月からの月日数ならび,_月日数ならび), sum(_翌月からの月日数ならび,_何日目). 今日を含めて今月末日までの日数(_年,_月,_日,_月日数ならび,_今日を含めて今月の末日までの日数) :- nth1(_月,_月日数ならび,_今月の日数), _今日を含めて今月の末日までの日数 is _今月の日数 - _日 + 1. 明日から今月末日までの日数(_年,_月,_日,_月日数ならび,_明日から今月の末日までの日数) :- nth1(_月,_月日数ならび,_今月の日数), _明日から今月の末日までの日数 is _今月の日数 - _日. 月日数ならび(_年,[31,29,31,30,31,30,31,31,30,31,30,31]) :- うるう年(_年),!. 月日数ならび(_年,[31,28,31,30,31,30,31,31,30,31,30,31]). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_),!, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 起点日と終点日はそれぞれ日数に含める. 起点日と終点日はともに日数に含めない. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/528 # # [1] 授業単元: C言語入門 # [2] 問題文(含コード&リンク): # 入力された数値の回数分だけ乱数を使ってコイン投げを行い, # 表裏が出る枚数をカウントして表示させるプログラム を作りなさい。 # '入力された数値の回数分だけ乱数を使ってコイン投げを行い,表裏が出る枚数をカウントして表示させる' :- '入力された数値の'(_入力された数値), '数値の回数分だけ乱数を使ってコイン投げを行い,表裏が出る枚数をカウントして'(_入力された数値,_表が出た枚数,_裏が出た枚数), 表示させる(_表が出た枚数,_裏が出た枚数). '入力された数値の'(_入力された数値) :- 整数を得る(コイン投げをする回数,_入力された数値 > 0,_入力された数値). '数値の回数分だけ乱数を使ってコイン投げを行い,表裏が出る枚数をカウントして'(_入力された数値) :- findall([_表,_裏],( between(1,_入力された数値,_), '乱数を使ってコイン投げを行い'(_表,_裏)), LL), 列要素の加算(LL,[_表が出た枚数,_裏が出た枚数]), '乱数を使ってコイン投げを行い'(1,0) :- 1 is random(2),!. '乱数を使ってコイン投げを行い'(0,1). 列要素の加算(LL,_合計ならび) :- 転置(LL,LL2), findall(_合計,( member(L,LL2), sum(L,_合計)), _合計ならび). 表示させる(_表が出た枚数,_裏が出た枚数) :- writef('表が出た枚数 = %t, 裏が出た枚数 = %t\n',[_表が出た枚数,_裏が出た枚数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/512 # # [1] 授業単元:C言語基礎実習 # [2] 問題文(含コード&リンク):ある整数 a をその数自身を除く約数をすべて足したときに # その合計の値がaと同じになるとき、その数を和の完全数といいます。 # 512以下の和の完全数を見つけて表示するプログラムを作成しなさい。 # 出力は以下のようにする事。 # 6=1+2+3 # 28=1+2+4+7+14 # ・ # ・ # ・ # # 'ある整数 a をその数自身を除く約数をすべて足したときに その合計の値がaと同じになるとき、その数を和の完全数といいます 512以下の和の完全数を見つけて表示するプログラムを作成しなさい。 出力は以下のようにする事。 6=1+2+3 28=1+2+4+7+14 ・ ・ ・ ' :- between(1,512,_a), 'ある整数 a をその数自身を除く約数をすべて足したときにその合計の値がaと同じになるとき、その数を和の完全数といいます'(_診断,_a,_約数ならび), 完全数を表示する(_診断,_a,_約数ならび), _a = 512,!. 'ある整数 a をその数自身を除く約数をすべて足したときにその合計の値がaと同じになるとき、その数を和の完全数といいます'(和の完全数,_a,_約数ならび), _a_1 is _a - 1, findsum(_約数,( between(1,_a_1,_約数), 0 is _a mod _約数), _a),!. 'ある整数 a をその数自身を除く約数をすべて足したときにその合計の値がaと同じになるとき、その数を和の完全数といいます'(和の完全数ではない,_,_). 完全数を表示する(和の完全数,_a,_約数ならび) :- atomic_list_concat(_約数ならび,' + ',_式表現文字列), writef('%t=%t\n',[_a,_式表現文字列]),!. 完全数を表示する(和の完全数ではない,_,_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/345 # # [1] 授業単元: #     計算機概論 # [2] 問題文(含コード&amp;リンク): #     キーボードから入力された自然数が素数であるかを調べるプログラムを作りなさい。 #     ただし、0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること。 # 'キーボードから入力された自然数が素数であるかを調べるプログラムを作りなさい。 ただし、0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること。' :- 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数), 素数であるかを調べる(_入力された自然数). 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数) :- write('自然数を入力してください : '), get_line(Line), '診断 :: 自然数入力'(Line,_入力された自然数),!. 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数) :- 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数). '診断 :: 自然数入力'(Line,_入力された自然数) :- atom_to_term(Line,_入力された自然数,_), integer(_入力された自然数), _入力された自然数 > 0,!. '診断 :: 自然数入力'(Line,_) :- writef('入力された %t から自然数を得ることができません。再入力をお願いします。\n',[Line]), fail. 素数であるかを調べる(1) :- write('プログラムを終了します\n'),!. 素数であるかを調べる(X) :- ウィルソンの定理による素数判定(X), write('素数です\n'),!. 素数であるかを調べる(_) :- write('素数ではありません\n'). ウィルソンの定理による素数判定(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,N,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/227 # # [1] 授業単元: 配列の整列 # [2] 問題文(含コード&リンク):字数超えてしまったのでリンク張ります。 # [ http://ime.nu/codepad.org/YCoV3saL ] # # /* # # 2次元配列の整列 # # ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 # # | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | # # これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) # 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合計点で照準に整列して表示する(整列後)。 # # 【実行例】 # # 整列前 # 番号 問1  問2 問3 問4 問5 合計 # 1001 20 30 49 41 90 230 # 1002 50 30 24 0 95 199 # 1003 20 33 55 35 90 233 # 1004 93 55 56 61 90 355 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1025 80 90 52 50 91 363 # 合計 1145 1015 1297 978 2292 # # 整列後 # 番号 問5  問3 問1 問2 問4 合計 # 1025 91 52 80 90 50 363 # 1004 90 56 93 55 61 355 # 1003 90 50 94 50 49 233 # 1004 100 49 70 30 62 311 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1015 90 53 20 20 0 183 # 合計 2292 1297 1145 1015 978 # # ※実行例が長くなってしまうので途中省略しています。 # # */ 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。' :- 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1), '学生ごとの合格点と、問ごと合計点を求めて表示する'(LL1,LL2), '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(LL2). 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1) :- get_split_lines('seiseki.dat',[' '],LL1). '学生ごとの合格点と、問ごと合計点を求めて表示する'(LL1,LL2) :- '行列を列の合計で降順に整列して列位置を交換し(LL1,LL2), 問いごとの合計を表示する(LL2). 列の合計で降順に整列して列位置を交換し(LL,LL1) :- 転置(LL,_転置されたLL), findall([_合計,_nth1|L],( nth1(_nth1,_転置されたLL,L), sum(L,_合計)), _転置され合計を付加されたLL), 降順バブルソート(_転置され合計と列位置が付加されたLL,_降順に整列された転置され合計と列位置が付加されたLL), 転置(_降順に整列された転置され合計と列位置が付加されたLL,LL1). 問いごとの合計を表示する(LL2) :- between(1,6,_nth), nth0(_nth,LL2,[_合計|_]), atomic_list_concat([問,_nth,' = ',_合計],S), writef(' %t,',[S]), _nth = 6, write('\n'). '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(LL1) :- 列の合計で降順に整列して列位置を交換し(LL1,LL2), 行合計で降順に整列する(LL2,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL), 表示する(_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL). 行合計で降順に整列する(LL1,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL) :- findall([_合計|L2],( member(L,LL1), 要素の合計を最終要素に付加(L,_合計,L2)), LL2), 降順バブルソート(LL2,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL). 要素の合計を最終要素に付加(L1,_合計,L2) :- 要素の合計を最終要素に付加(L1,0,_合計,L2). 要素の合計を最終要素に付加([],_合計,_合計,[_合計]). 要素の合計を最終要素に付加([N|R1],_合計_1,_合計,[N|R2]) :- _合計_2 is _合計 + N, 要素の合計を最終要素に付加(R1,_合計_2,_合計,R2). 表示する(LL2) :- 最終見出しを得る(LL2,_見出し), writef('%t\n',[_見出し]), 行列部分の表示(LL2), 最終合計の表示(LL2). 行列部分の表示(LL) :- append(_,[[_|L]|R],LL), writef('%5l%5r%5r%5r%5r%5r%5r\n',L), R = []. 最終合計の表示([_最終合計ならび|_]) :- writef(' %5r%5r%5r%5r%5r%5r\n',_最終合計ならび). 合計点の表示(_順位づけられた合計点ならび) :- findall(_合計点,( member([_合計点,_],_順位づけられた合計点ならび)), _合計点ならび), writef(' %5r%5r%5r%5r%5r%5r\n',_合計点ならび). 最終見出しを得る([_,L|_],_最終見出し) :- findall(S,( member(N,L), atomic_list_concat(['問',_nth1,' '],S)), L), atomic_list_concat(['番号 '|L],_最終見出し). 降順バブルソート(L1,L2) :- append(L0,[A,B|R],L1), A @< B, append(L0,[B,A|R],L3), 降順バブルソート(L3,L2),!. 降順バブルソート(L,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/227 # # [1] 授業単元: 配列の整列 # [2] 問題文(含コード&リンク):字数超えてしまったのでリンク張ります。 # [ http://ime.nu/codepad.org/YCoV3saL ] # # /* # # 2次元配列の整列 # # ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 # # | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | # # これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) # 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合計点で照準に整列して表示する(整列後)。 # # 【実行例】 # # 整列前 # 番号 問1  問2 問3 問4 問5 合計 # 1001 20 30 49 41 90 230 # 1002 50 30 24 0 95 199 # 1003 20 33 55 35 90 233 # 1004 93 55 56 61 90 355 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1025 80 90 52 50 91 363 # 合計 1145 1015 1297 978 2292 # # 整列後 # 番号 問5  問3 問1 問2 問4 合計 # 1025 91 52 80 90 50 363 # 1004 90 56 93 55 61 355 # 1003 90 50 94 50 49 233 # 1004 100 49 70 30 62 311 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1015 90 53 20 20 0 183 # 合計 2292 1297 1145 1015 978 # # ※実行例が長くなってしまうので途中省略しています。 # # */ 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。' :- 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1), '学生ごとの合格点と、問ごと合計点を求めて表示する(整列前)'(LL1,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列), 'さらに、学生の合格点で照準に整列して表示する(整列後)。'(_問いごとの合計点ならび,転置された学生の合格点付き点数行列). 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1) :- get_split_lines('seiseki.dat',[' '],LL1). '学生ごとの合格点と、問ごと合計点を求めて表示する(整列前)'(LL1,LL4,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列) :- '学生ごとの合格点と、'(LL1,_学生の合格点付き点数行列), '問ごと合計点を求めて'(_学生の合格点付き点数行列,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列), 表示する(_学生の合格点付き点数行列,_問いごとの合計点ならび). '学生ごとの合格点と、'([],[]). '学生ごとの合格点と、'([[_学生番号|L1]|R1],[[_学生番号|L2]|R2]) :- sum(L1,_sum), 学生ごとの合格点(L1,0,L2), '学生ごとの合格点と、'(R1,R2). 学生ごとの合格点([],_合計点,[_合計点]). 学生ごとの合格点([A|R1],_合計点_1,[A|R2]) :- _合計点2 is A + _合計点_1, 学生ごとの合格点(R1,R2). 問ごと合計点を求めて(_学生の合格点付き点数行列,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列) :- 転置(_学生の合格点付き点数行列,_転置された学生の合格点付き点数行列), 問ごと合計点(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび). 問ごと合計点([],[]). 問ごと合計点([L1|R1],[S|R2]) :- sum(L1,S), 問ごと合計点(R1,R2). 表示する(_学生の合格点付き点数行列,_問いごとの合計点ならび) :- write('番号 問1  問2 問3 問4 問5 合計\n'), append(_,[L|R],_学生の合格点付き点数行列), writef('%5l%5r%5r%5r%5r%5r%5r\n',L), R = [], writef(' %5r%5r%5r%5r%5r%5r\n',_問いごとの合計点ならび). '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび) :- '次に、問の合計点の降順に左から右に向かって整列し、'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび,LL_1), 'さらに、学生の合格点で照準に整列して'(LL_1,LL_2), 表示する_2(_問いごとの合計点ならび,LL_2). '次に、問の合計点の降順に左から右に向かって整列し、'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび) :- 順位づけする(_問いごとの合計点ならび,_順位づけされた合計点ならび), findall(L,( between(1,5,N), nth1(N,_順位づけされた合計点ならび,[_,_項目番号]), nth1(_項目番号,_転置された学生の合格点付き点数行列,L)), LL_1), 転置([_学生番号ならび|LL_1],LL_2). 'さらに、学生の合格点で照準に整列して'(LL1,LL2) :- findall([A|L],( member(L,LL1), last(L,A)), LL3), 整列(LL3,LL4), 鍵を切り離して逆順にならび替え(LL4,[],LL2). 鍵を切り離して逆順にならび替え([],LL,LL). 鍵を切り離して逆順にならび替え([[A|L]|R1],L_1,LL) :- 鍵を切り離して逆順にならび替え(R1,[L|L_1],LL). 順位づけする(_問いごとの合計点ならび,_順位づけされた合計点ならび) :- findall([_合計点,_nth1],( between(1,5,_nth1), nth1(_nth1,_問いごとの合計点ならび,_合計点)), LL1), 降順整列(LL1,_順位づけされた合計点ならび). 降順整列(LL1,_順位づけされた合計点ならび) :- 整列(LL1,LL2), reverse(LL2,_順位づけされた合計点ならび). 表示する_2(LL_2,_順位づけられた合計点ならび) :- 見出し表示(_順位づけられた合計点ならび), 行列部分の表示(LL_2), 合計点の表示(_順位づけられた合計点ならび). 見出し表示(_順位づけられた合計点ならび) :- findall(_項目番号,( member([_,_項目番号],_順位づけられた合計点ならび)), _項目番号ならび), writef('番号 %5r%5r%5r%5r%5r%5r合計\n',_項目番号ならび). 行列部分の表示(LL) :- append(_,[L|R],LL), writef('%5l%5r%5r%5r%5r%5r%5r\n',L), R = []. 合計点の表示(_順位づけられた合計点ならび) :- findall(_合計点,( member([_合計点,_],_順位づけられた合計点ならび)), _合計点ならび), writef(' %5r%5r%5r%5r%5r%5r\n',_合計点ならび). % 以下のサイトは yes. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/158 # # [1] 授業単元: プログラミング 〜構造体〜 # [2] 問題文(含コード&リンク): 3名の名前と性別、10桁の会員番号を入力し表示せよ # *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ # 入力(1234567890)→出力(12-3456-7890) # *入力された会員番号が10桁に満たない場合、 # または大きい場合は再度入力する指示を入れること # '3名の名前と性別、10桁の会員番号を入力し表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890) *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること' :- '3名の名前と性別、10桁の会員番号を入力し *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_3名の名前と性別と会員番号), '表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890)'(_3名の名前と性別と会員番号). '3名の名前と性別、10桁の会員番号を入力し *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_3名の名前と性別と会員番号) :- findall([_名前,_性別,_会員番号],( between(1,3,_), 名前を得る(_名前), 性別を得る(_性別), '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号)), _3名の名前と性別と会員番号). 名前を得る(_名前) :- write('名前を入力してください : '), get_line(_名前). 性別を得る(_性別) :- 整数を得る('性別を番号で入力してください 1..男 2..女\n',between(1,2,_性別番号),_性別番号), 性別番号から性別を得る(_性別番号,_性別). 性別番号から性別を得る(1,男). 性別番号から性別を得る(2,女). '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号) :- write('会員番号(数字10桁)を入力してください : '), get_line(Line), '診断:: 会員番号を得る'(Line,_会員番号),!. '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号) :- '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号). '診断:: 会員番号を得る'(Line,_会員番号) :- atom_chars(Line,Chars), 会員番号は数字のみで入力し(Chars), '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars),!. '診断:: 会員番号を得る'(Line,_会員番号) :- write('再入力をお願いします\n'), fail. 会員番号は数字のみで入力し(Chars) :- forall((member(A,Chars), member(A,['0','1','2','3','4','5','6','7','8','9'])),true),!. 会員番号は数字のみで入力し(Chars) :- writef('入力された文字列 %t には数字以外の文字が混入しています\n',[Chars]), fail. '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars) :- length(Chars,10),!. '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars) :- writef('入力された文字列 %t は10桁でありません\n',[Chars]), fail. '表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890)'(_3名の名前と性別と会員番号) :- append(_,[[_名前,_性別,_会員番号]|R],_3名の名前と性別と会員番号), number_chars(_会員番号,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), atomic_list_concat([[_1,_2,-,_3,_4,_5,_6,-,_7,_8,_9,_10],_会員表示文字列), writef('名前: %t\n性別: %t\n会員番号: %t\n\n',[_会員番号表示文字列]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/79 # # [1] 授業単元: システム開発 # [2] 問題文(含コード&amp;リンク): # 以下のヒントを元に、生徒の成績を管理するプログラムを作りなさい # http://ime.nu/codepad.org/vevYc04f # http://ime.nu/codepad.org/rCOCOccX # # /* seiseki.c 成績処理システム */ # #include /* 標準入出力 */ # #include /* 標準ライブラリー */ # #include /* 数学的関数 */ # #include /* 文字列関数 */ # #define SEN "--------------------\n" /* マクロ定義 */ # #define KEISEN "=====================\n" # # /* サブルーチンの宣言 */ # void data_write(void); /* データの書き込み */ # void data_read(void); /* データの読み込み */ # void data_disp(void); /* 成績一覧表の表示 */ # void data_kensk(void); /* 検索処理 */ # void the_end(void); /* プログラムの終了処理 */ # # /* 変数, 構造体の宣言 */ # struct seiseki{ # char simei[20]; /* 氏名 */ # int bango, kokugo, eigo, suugaku; /* 番号, 国語, 英語, 数学 */ # }; # struct seiseki a[100]; /* 登録数は100名まで */ # int n, i, goukei; /* 変数の定義 */ # double heikin, std; # # main() # { # int k; /* switch-case用の処理番号 */ # do{ /* 繰り返し処理do-while */ # /* 初期メニュー画面 */ # printf("\n"); # printf("☆☆ 成績処理メニュー ☆☆\n"); # printf(SEN); # printf("データの書き込み・・・・・・・・・【1】\n"); # printf("データの読み込み・・・・・・・・・【2】\n"); # printf("成績一覧表・・・・・・・・・・・・【3】\n"); # printf("検索処理・・・・・・・・・・・・・【4】\n"); # printf("終わり・・・・・・・・・・・・・・【9】\n"); # printf(SEN); # printf("処理番号を入力してください:"); # scanf("%d",&k); # printf("\n"); # # /* 関数の呼び出し */ # switch(k){ # case 1:data_write();break; # case 2:data_read();break; # case 3:data_disp();break; # case 4:data_kensk();break; # case 9:the_end();break; # default:printf("該当番号なし\n");break; # } # }while(k < 10); # } # # /* 成績一覧表の作成 */ # void data_disp(void) # { # int goukei_k=0, goukei_e=0, goukei_s=0; # double heikin_k=0.0, heikin_e=0.0, heikin_s=0.0; # double std_k=0.0, std_e=0.0, std_s=0.0; # # printf("☆☆☆ 成績一覧表 ☆☆☆\n"); # printf(KEISEN); # printf("番号 名前 国語 英語 数学 合計 平均\n"); # for(i=0;i < n;i++){ # printf("%5d %-10s %5d %5d %5d", a[i].bango, a[i].simei, a[i].kokugo, a[i].eigo, a[i].suugaku); # /* 3科目の合計計算 */ # goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku); # printf("%5d",goukei); # /* キャスト:3科目の平均計算 */ # heikin=(double)goukei/3; # printf("%6.1f\n",heikin); # } # printf("\n"); # # /* 各科目の合計計算 */ # for(i=0;i < n;i++){ # goukei_k+=a[i].kokugo; # goukei_e+=a[i].eigo; # goukei_s+=a[i].suugaku; # } # # /* 各科目の平均計算 */ # heikin_k=(double)goukei_k/n; # heikin_e=(double)goukei_e/n; # heikin_s=(double)goukei_s/n; # # /* 偏差の二乗和の計算 */ # for(i=0;i < n;i++){ # std_k+=pow((a[i].kokugo-heikin_k),2); # std_e+=pow((a[i].eigo-heikin_e),2); # std_s+=pow((a[i].suugaku-heikin_s),2); # } # # /* 標準偏差の計算 */ # std_k=sqrt(std_k/n); # std_e=sqrt(std_e/n); # std_s=sqrt(std_s/n); '繰り返し処理do-while'(P) :- 'do{ /* 繰り返し処理do-while */ }while(k < 10);'(P). 初期メニュー画面(_k) :- '/* 初期メニュー画面 */ printf("\n"); printf("☆☆ 成績処理メニュー ☆☆\n"); printf(SEN); printf("データの書き込み・・・・・・・・・【1】\n"); printf("データの読み込み・・・・・・・・・【2】\n"); printf("成績一覧表・・・・・・・・・・・・【3】\n"); printf("検索処理・・・・・・・・・・・・・【4】\n"); printf("終わり・・・・・・・・・・・・・・【9】\n"); printf(SEN); printf("処理番号を入力してください:"); scanf("%d",&k); printf("\n");'(_k). 関数の呼び出し(_k) :- '/* 関数の呼び出し */ switch(k){ case 1:data_write();break; case 2:data_read();break; case 3:data_disp();break; case 4:data_kensk();break; case 9:the_end();break; default:printf("該当番号なし\n");break; }'(_k). '3科目の合計計算'(_i,_a,_goukei) :- '/* 3科目の合計計算 */ goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku); printf("%5d",goukei);'(_i,_a,_goukei). 'キャスト:3科目の平均計算'(_goukei,_heikin) :- '/* キャスト:3科目の平均計算 */ heikin=(double)goukei/3; printf("%6.1f\n",heikin);'(_goukei,_heikin). 各科目の合計計算(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :- '/* 各科目の合計計算 */ for(i=0;i < n;i++){ goukei_k+=a[i].kokugo; goukei_e+=a[i].eigo; goukei_s+=a[i].suugaku; }'(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s). 各科目の平均計算((_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s) :- '/* 各科目の平均計算 */ heikin_k=(double)goukei_k/n; heikin_e=(double)goukei_e/n; heikin_s=(double)goukei_s/n;'(_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s). 偏差の二乗和の計算(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- '/* 偏差の二乗和の計算 */ for(i=0;i < n;i++){ std_k+=pow((a[i].kokugo-heikin_k),2); std_e+=pow((a[i].eigo-heikin_e),2); std_s+=pow((a[i].suugaku-heikin_s),2); }'(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s). 標準偏差の計算(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- '/* 標準偏差の計算 */ std_k=sqrt(std_k/n); std_e=sqrt(std_e/n); std_s=sqrt(std_s/n);'(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'do{ /* 繰り返し処理do-while */ }while(k < 10);'(P) :- between(1,10,N), call(P), N = 10. '/* 初期メニュー画面 */ printf("\n"); printf("☆☆ 成績処理メニュー ☆☆\n"); printf(SEN); printf("データの書き込み・・・・・・・・・【1】\n"); printf("データの読み込み・・・・・・・・・【2】\n"); printf("成績一覧表・・・・・・・・・・・・【3】\n"); printf("検索処理・・・・・・・・・・・・・【4】\n"); printf("終わり・・・・・・・・・・・・・・【9】\n"); printf(SEN); printf("処理番号を入力してください:"); scanf("%d",&k); printf("\n");'(_k) :- write('\n'), writef('☆☆ 成績処理メニュー ☆☆\n'), write('%t',['--------------------\n']), write('データの書き込み・・・・・・・・・【1】\n'), write('データの読み込み・・・・・・・・・【2】\n'), write('成績一覧表・・・・・・・・・・・・【3】\n'), write('検索処理・・・・・・・・・・・・・【4】\n'), write('終わり・・・・・・・・・・・・・・【9】\n'), write('--------------------\n'), write('処理番号を入力してください:'), 整数を得る(_k), write('\n'). '/* 関数の呼び出し */ switch(k){ case 1:data_write();break; case 2:data_read();break; case 3:data_disp();break; case 4:data_kensk();break; case 9:the_end();break; default:printf("該当番号なし\n");break; }'(_k) :- '_kの値によって述語を呼び出す'(_k). '_kの値によって述語を呼び出す'(1) :- data_write. '_kの値によって述語を呼び出す'(2) :- data_read. '_kの値によって述語を呼び出す'(3) :- data_disp. '_kの値によって述語を呼び出す'(4) :- data_kensk. '_kの値によって述語を呼び出す'(9) :- the_end. '/* 3科目の合計計算 */ goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku); printf("%5d",goukei);'(_i,_a,_goukei) :- nth0(_i,_a,[_kokugo,_eigo,_suugaku]), _goukei is _kokugo + _eigo + _suugaku, writef('%t',[_goukei]). '/* キャスト:3科目の平均計算 */ heikin=(double)goukei/3; printf("%6.1f\n",heikin);'(_goukei,_heikin) :- _heikin is _goukei / 3, format('~1f\n',[_heikin]). '/* 各科目の合計計算 */ for(i=0;i < n;i++){ goukei_k+=a[i].kokugo; goukei_e+=a[i].eigo; goukei_s+=a[i].suugaku; }'(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :- 各科目の合計計算(0,_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s). 各科目の合計計算(_n_1,_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :- _n_1 < _n, nth1(_nth1,_a,[_kokugo,_eigo,_suugaku]), _goukei_k_2 is _goukei_k_1 + _kokugo, _goukei_e_2 is _goukei_e_1 + _eigo, _goukei_s_2 is _goukei_s_1 + _suugaku, _n_2 is _n_1 + 1, 各科目の合計計算(_n_2,_n,_a,_goukie_k_2,_goukei_e_2,_goukei_s_2,_goukie_k,_goukei_e,_goukei_s). 各科目の合計計算(_n_1,_n,_a,_goukie_k,_goukei_e,_goukei_s,_goukie_k,_goukei_e,_goukei_s) :- _n_1 >= _n. '/* 各科目の平均計算 */ heikin_k=(double)goukei_k/n; heikin_e=(double)goukei_e/n; heikin_s=(double)goukei_s/n;'(_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s) :- _heikin_k is _heikin_k_1 + _goukei_k / _n, _heikin_e is _heikin_e_1 + _goukei_e / _n, _heikin_s is _heikin_s_1 + _goukei_s / _n. '/* 偏差の二乗和の計算 */ for(i=0;i < n;i++){ std_k+=pow((a[i].kokugo-heikin_k),2); std_e+=pow((a[i].eigo-heikin_e),2); std_s+=pow((a[i].suugaku-heikin_s),2); }'(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- 偏差の二乗和の計算(0,_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s). 偏差の二乗和の計算(_i_1,_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- _i_1 < _n, 偏差の二乗を加える(_i_1,_n,_a,_std_k_1,_std_e_1,std_s_1,_std_k_2,_std_e_2,std_s_2), _i_2 is _i_1 + 1, 偏差の二乗和の計算(_i_2,_n,_a,_std_k_2,_std_e_2,_std_s_2,_std_k,_std_e,_std_s). 偏差の二乗和の計算(_i_1,_n,_a,_std_k,_std_e,_std_s,_std_k,_std_e,_std_s) :- _i_1 >= _n. 偏差の二乗を加える(_i_1,_a,_std_k_1,_std_e_1,std_s_1,_std_k_2,_std_e_2,std_s_2) :- nth1(_i_1,_a,[_kokugo_heikin_k,_eigo_heikin_e,_suugaku_heikin_s]), _std_k_2 is _std_k_1 + _kokugo_heikin_k ^ 2, _std_e_2 is _std_e_1 + _eigo_heikin_e ^ 2, _std_s_2 is _std_s_1 + _suugaku_heikin_s ^ 2. '/* 標準偏差の計算 */ std_k=sqrt(std_k/n); std_e=sqrt(std_e/n); std_s=sqrt(std_s/n);'(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- _std_k is sqrt(_std_k_1) / _n, _std_e is sqrt(_std_e_1) / _n, _std_s is sqrt(_std_s_1) / _n. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/78 # # [1] 授業単元:C言語 # [2] 問題 http://ime.nu/codepad.org/yV0KrZox # # 問題1 # 5個の整数を次々に入力して、一元配列に格納し、その平均を計算するプログラムを作成しなさい。 # ------------------------------------------------------------------- # 整数1:40 # 整数2:35 # 整数3:28 # 整数4:15 # 整数5:16 # 平均は26.8000です # --------------------------------------------------------------------- # '5個の整数を次々に入力して、一元配列に格納し、その平均を計算する' :- '5個の整数を次々に入力して、一元配列に格納し、'(_一次元配列), その平均を計算する(_一次元配列,_その平均). '5個の整数を次々に入力して、一元配列に格納し、'(_一次元配列) :- findall(_整数,( between(1,5,N), atomic_list_concat([整数,N,': '],_催促), writef('%t',[_催促]), 整数を得る(_整数)), _一次元配列). その平均を計算する(_一次元配列,_その平均) :- findavg(_値,( member(_値,_一次元配列)), _その平均), writef('平均は%tです\n',[_その平均]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元: リスト処理 # [2] 問題文(含コード&) http://codepad.org/3DdhcBUM # # /* # # seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 # また、整列する際に要素どうしを比較した回数も表示しなさい。 # # 【実行例】 # # 番号 氏名      得点 # 1021 Machida Masato 100 # 1017 Nonaka Fujio 98 # 1011 Suzuki kenichi 93 # 1019 Fujimoto Kaoru 92 # 1006 kato Ichiro 91 # ・ ・     ・ # ・ ・     ・ # ・ ・     ・ # 1020 Hoshi Izumi 32 # 整列の為の比較回数=132回 # # ※長いので実行結果は途中省略しています。 # ※比較回数はコードによって異なる場合があります。 # # */ 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 また、整列する際に要素どうしを比較した回数も表示しなさい。' :- 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび), リスト処理による挿入法で得点の降順に整列して(_生徒ならび,[],_整列済み生徒ならび,0,_比較回数), 表示しなさい(_整列済み生徒ならび,_比較回数). 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび) :- get_split_lines('seito.dat',[' '],_生徒ならび). リスト処理による挿入法で得点の降順に整列して([[_学籍番号,_姓,_名,_得点]|R1],L1,_整列済み生徒ならび,_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,L1,L2,_比較回数_1,_比較回数_2), リスト処理による挿入法で得点の降順に整列して(R1,L2,_整列済み生徒ならび,_比較回数_2,_比較回数),!. リスト処理による挿入法で得点の降順に整列して([],_整列済み生徒ならび,_整列済み生徒ならび,_比較回数,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],[[_学籍番号,_名,_名,_得点],[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],_比較回数_1,_比較回数) :- 比較回数 is _比較回数_1 + 1, _得点 >= _得点_1,!. 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R1],[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R2],_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,R1,R2,_比較回数_1,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[],[[_学籍番号,_名,_名,_得点]],_比較回数,_比較回数) :- !. 表示しなさい(_整列済み生徒ならび,_比較回数) :- 見出しの表示, append(_,[[_学籍番号,_姓,_名,_得点]|R],_整列済み生徒ならび), 整形して表示する(_学籍番号,_姓,_名,_得点), R = [], writef('整列の為の比較回数=%t回\n',[_比較回数]). 見出しの表示 :- write('番号 氏名      得点\n'). 整形して表示する(_学籍番号,_姓,_名,_得点) :- 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列), 得点を頭部空白3桁に(_得点,_得点文字列), atomic_list_concat([_学籍番号,_姓文字列,_名文字列,_得点文字列],' ',_表示文字列), writef('%t\n',[_表示文字列]). 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列) :- '8桁に'(_姓,_姓文字列), '8桁に'(_名,_名文字列). '8桁に'(_項,_8桁文字列) :- atom_chars(_項,Chars_1), length(L,8), append(L1,L2,L), all(L2,' '), atom_chars(_8桁文字列,L). 得点を頭部空白3桁に(_得点,_得点文字列) :- number_chars(_得点,Chars), length(L,3), append(L0,Chars,L), all(L0,' '), atom_chars(_得点文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,( member(A,Lines1), split(A,Sep,Line)), Lines). get_lines(Instream,end_of_file,_,_,[]) :-!. get_lines(Instream,S,[],_終了検索対象ならび,[S]) :- member(A,_終了検索対象ならび), 検索(S,A),!. get_lines(Instream,S,[],[],[S|R]) :- get_line(Instream,S2), get_lines(Instream,S2,[],[],R),!. get_lines(Instream,S,[],_終了検索対象ならび,[S|R]) :- member(A,_終了検索対象ならび), \+(検索(S,A)), get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), member(B,_終了検索対象ならび), 検索(S,B),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S|R]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), !, get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,_,_開始検索対象ならび,_終了検索対象ならび,X) :- get_line(Instream,S2), get_lines(Instream,S2,_開始検索対象ならび,_終了検索対象ならび,X),!. get_lines(_ファイル,_スタート行,_最終行,X) :- integer(_スタート行), integer(_最終行), 行位置指定選択(_ファイル,_スタート行,_最終行,X). get_lines(_ファイル,_開始検索対象ならび,_終了検索対象ならび,X) :- \+(integer(_開始検索対象ならび)), \+(integer(_終了検索対象ならび)), open(_ファイル,read,Instream), get_line(Instream,S), get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,X), close(Instream),!. get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat, get_line(user_input,Line), (Line = end_of_file , (!) , fail ; true)), Lines). get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_chars(Instream,end_of_file,[]) :- !. get_chars(Instream,_,[]) :- at_end_of_stream(Instream),!. get_chars(Instream,X,[X|R]) :- get_char(Instream,Y), get_chars(Instream,Y,R) . get_chars(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), exists_file(File_1), open(File_1,read,Instream), get_char(Instream,X), get_chars(Instream,X,L), close(Instream),!. get_chars(Instream,L) :- is_stream(_,Instream,_), get_char(Instream,X), get_chars(Instream,X,L),!. get_chars(L) :- findall(U,( repeat, get_char(U), (U = end_of_file , (!) , fail ; true)), L). get_line(X) :- get_line(user_input,X). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,_,[]) :- at_end_of_stream(Instream),!. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). chars_lines([],[],[]) :- !. chars_lines(['\r'],[],[]) :- !. chars_lines(['\r',A|R],[],[A|R]) :- \+(A = '\n'),!. chars_lines(['\r','\n'|R],[],R) :- !. chars_lines(['\n'|R],[],R) :- !. chars_lines([A|R1],[A|R2],Z) :- chars_lines(R1,R2,Z). chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R), atomic_list_concat(U,A), chars_lines(R,R2). split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y) , \+(member(U,_区切り符号ならび))), Z), Z = X,!. split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび) , atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), C number Nl,!. split_5(B,C) :- atomic_list_concat(B,C),!. all([],_). all([V|R],V) :- all(R,V). 検索(_文字列,_副文字列) :- atom_length(_文字列,_文字列の文字数), atom_length(_副文字列,_副文字列の文字数), Max is _文字列の文字数 - _副文字列の文字数, between(0,Max,N), sub_atom(_文字列,N,_副文字列の文字数,_副文字列),!. 行位置指定選択(_ファイル,_選択先頭行,_選択最終行,X) :- wc(_ファイル,[[_行,_,_,_]]), _行数_1 is _行 - _選択先頭行 + 1, _行数_2 is _選択最終行 - _選択先頭行, atomic_list_concat(['tail -',_行数_1,' ',_ファイル,' | head -',_行数_2],S), shs(S,X). wc(F,X) :- exists_file(F1), atomic_list_concat(['wc ',F1],S), sh(S,X),!. wc(F,X) :- atomic_list_concat([F,' | wc'],S), sh(S,X),!. sh(Command,X) :- shs(Command,Y), findall(U,(member(V,Y) , make_list(V,[' ',','],U)),X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,_,[]) :- at_end_of_stream(Instream),!. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/48 # # [1] 授業単元:関数ポインタ # [2] 問題文(含コード&amp;リンク):http://codepad.org/O3eDo7F3 # # 以下のプログラムは2つの整数を入力させ,各種処理を選び, # 計算した結果をファイルへ出力するものであるが,作成途中である. # 下記に従い,プログラムを完成させよ. # ・各処理を行う場合は関数ポインタ引数とするをprocess()用いる. # ・加算:tasu(),除算(商):waru(),除算(剰余):amari(), #  最大公約数:yakusu(),最小公倍数:baisu()を用いる. # ・除算は商と剰余を求める. # ・最大公約数は2つの整数で共通の約数のうち最大のもの, #  最小公倍数は2つの整数で共通の倍数のうち最小のものである. # ・結果は「14 ÷ 5 = 2 余り 4」や「6 と 4 の最小公倍数は 12」のように #  計算式等も含めkekka.txtへ出力する. # # #include< stdio.h > # #include< stdlib.h > # # int process(ここを書く); # int tasu(ここを書く); # int waru(ここを書く); # int amari(ここを書く); # int yakusu(ここを書く); # int baisu(ここを書く); # # int main() # { # FILE *fp; //結果を出力するファイルのファイルポインタ # # int a, b; // 入力する2つ整数 # int op; // 選択された処理を示す変数 # int result1, result2; // 演算結果を格納する変数 # # fp = fopen("kekka.txt","w"); // ファイルを開く # if(fp == NULL) # { # printf("ファイルオープンエラー \n"); # exit(1); # } # # printf("1つめの整数を入力してください:"); # scanf("%d", &a); # printf("2つめの整数を入力してください:"); # scanf("%d", &b); # printf("1:加算,2:除算,3:最大公約数,4:最小公倍数\n"); # do { # printf("演算の番号を入力してください:"); # scanf("%d", &op); # } while(op<1 || op>4); # # ここを書く # # fclose(fp); // ファイルを閉じる # return 0; # } # # int process(ここを書く) # { # ここを書く # } # # int tasu(ここを書く) # { # ここを書く # } # # int waru(ここを書く) # { # ここを書く # } # # int amari(ここを書く) # { # ここを書く # } # # int yakusu(ここを書く) # { # ここを書く # } # # int baisu(ここを書く) # { # ここを書く # } '2つの整数を入力させ,各種処理を選び, 計算した結果をファイルへ出力するものである. 下記に従い,プログラムを完成させよ. ・各処理を行う場合は関数ポインタ引数とするをprocess()用いる ・加算:tasu(),除算(商):waru(),除算(剰余):amari()  最大公約数:yakusu(),最小公倍数:baisu()を用いる. ・除算は商と剰余を求める. ・最大公約数は2つの整数で共通の約数のうち最大のもの,  最小公倍数は2つの整数で共通の倍数のうち最小のものである. ・結果は「14 ÷ 5 = 2 余り 4」や「6 と 4 の最小公倍数は 12」のように  計算式等も含めkekka.txtへ出力する.' :- open('kekka.txt',write,Outstream), 二つの整数と演算番号を得る(_一つ目の整数,_二つ目の整数), 演算処理と結果を表示する(Outstream,_一つ目の整数,_二つ目の整数,_演算番号), \+(between(1,4,_演算番号)), close(Outstream). 二つの整数と演算番号を得る(_一つ目の整数,_二つ目の整数,_演算番号) :- 整数を得る('1つめの整数を入力してください',true,_一つ目の整数), 整数を得る('2つめの整数を入力してください',true,_二つ目の整数), 整数を得る('演算子番号を入力してください\n1:加算,2:除算,3:最大公約数,4:最小公倍数',between(1,4,_演算番号),_演算番号). 演算処理と結果を表示する(Outstream,_一つ目の整数,_二つ目の整数,_演算番号) :- 整数を得る('演算番号を入力してください\n1:加算,2:除算,3:最大公約数,4:最小公倍数',true,_演算番号), 演算処理(_演算番号,_一つ目の整数,_二つ目の整数,_結果文字列), writef(Outstream,'%t\n',[_結果文字列]). 演算処理と結果を表示する(Outstream,_一つ目の整数,_二つ目の整数,_演算番号) :- 演算処理と結果を表示する(Outstream,_一つ目の整数,_二つ目の整数,_演算番号). 演算処理(1,_一つ目の整数,_二つ目の整数,_結果文字列) :- _結果 is _一つ目の整数 + _二つ目の整数, swritef(_結果文字列,'%t + %t = %t',[_一つ目の整数,_二つ目の整数,_結果]). 演算処理(2,_一つ目の整数,_二つ目の整数,_結果文字列) :- _商 is _一つ目の整数 // _二つ目の整数, _剰余 is _一つ目の整数 mod _二つ目の整数, swritef(_結果文字列,'%t %% %t = %t 余り %t',[_一つ目の整数,_二つ目の整数,_商,_剰余]). 演算処理(最大公約数,_一つ目の整数,_二つ目の整数,_結果文字列) :- 最大公約数(_一つ目の整数,_二つ目の整数,_結果), swritef(_結果文字列,'%t と %t の最大公約数は %t,[_一つ目の整数,_二つ目の整数,_結果]). 演算処理(4,_一つ目の整数,_二つ目の整数,_結果文字列) :- 最小公倍数(_一つ目の整数,_二つ目の整数,_結果), swritef(_結果文字列,'%t と %t の最小公倍数は %t,[_一つ目の整数,_二つ目の整数,_結果]). 演算処理(N,_,_,'終了します') :- \+(between(1,4,N)). 最大公約数(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). 最小公倍数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,Y), X is M * N // Y. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元:リスト構造 # [2] 問題文(含コード&amp;リンク): # http://ime.nu/iup.2ch-library.com/i/i0825590-1357830189.gif # # 以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作 成せよ. # リストは1つとし,初期値は「15 4 32 1」である. # ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. # ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. # ・データのソート(降順)を行う関数を作成する. # ・リストの平均値を計算し出力する関数を作成する。 # # ------表示例------ # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : # ------------------ # # ------実行例------- # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 1 # 追加するデータを入力してください : 10 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 4 # リストの平均値 : 12.4 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 3 # リスト : 32 15 10 4 1 # :- dynamic(リスト/1). '以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作成せよ. リストは1つとし,初期値は「15 4 32 1」である. ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. ・データのソート(降順)を行う関数を作成する. ・リストの平均値を計算し出力する関数を作成する。 ------表示例------ 1. データの追加 2. データの削除 3. データのソート(降順) 4. リストの平均値 5. 終了 何を実行しますか : ' :- 'リストは1つとし,初期値は「15 4 32 1」である', メニューを表示, 各項目の機能を実現して結果を表示する. 'リストは1つとし,初期値は「15 4 32 1」である' :- assertz(リスト([15,4,32,1])). メニューを表示 :- write('1. データの追加\n2. データの削除\n3. データのソート(降順)\n4. リストの平均値\n5. 終了\n何を実行しますか : '). メニューを表示 :- メニューを表示. 各項目の機能を実現して結果を表示する :- 機能番号を選択する(_機能番号), 機能を実現して結果を表示する(_機能番号), _機能番号 = 5,!. 機能番号を選択する(_機能番号) :- get_line(Line), '診断:: メニューの選択'(Line,_機能番号),!. 機能番号を選択する(_機能番号) :- 機能番号を選択する(_機能番号). '診断:: メニューの選択'(Line,_機能番号) :- atom_number(Line,_機能番号), integer(_機能番号), between(1,5,_機能番号),!. '診断:: メニューの選択'(Line,_機能番号) :- writef('選択された %t からは適切な機能番号が得られません。再入力をお願いします。\n',[Line]), fail. 機能を実現して結果を表示する(5) :- !. 機能を実現して結果を表示する(1) :- データの追加. 機能を実現して結果を表示する(2) :- データの削除. 機能を実現して結果を表示する(3) :- 'データのソート(降順)'. 機能を実現して結果を表示する(4) :- リストの平均値. データの追加 :- write('追加するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), append(L1,[_データ],L2), assertz(リスト(L2)). データの削除 :- write('削除するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), ならびから削除(_データ,L1,L2), assertz(リスト(L2)). 'データのソート(降順)' :- リスト(L1), 降順整列(L1,L2), atomic_list_concat(L2,' ',S), writef('リスト : %t\n',[S]). リストの平均値 :- リスト(L1), findavg(_データ,( member(_データ,L1)), _平均値), atomic_list_concat(L1,_リスト表示), writef('平均値 : %t\nリスト : %t\n',[_平均値,_リスト表示]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,_,[e,n,d,'_',o,f,'_',f,i,l,e]) :- at_end_of_stream(Stream),!. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_line(user_input,X). ならびから削除(_,[],[]) :- !. ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび) :- ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!. ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび]) :- ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!. 降順整列([],[]). 降順整列([_軸要素|R1],_降順に整列されたならび) :- 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび), 降順整列(_軸要素に等しいか大きいならび,_整列した軸要素に等しいか大きいならび), 降順整列(_軸要素より小さいならび,_整列した軸要素より小さいならび), append(_整列した軸要素に等しいか大きいならび,[_軸要素|_整列した軸要素より小さいならび],_降順に整列したならび). 降順分割(_,[],[],[]). 降順分割(_軸要素,[_要素|R],[_要素|_軸要素に等しいか大きいならび],_軸要素より小さいならび) :- _要素 @>= _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). 降順分割(_軸要素,[_要素|R],_軸要素に等しいか大きいならび,[_要素|_軸要素より小さいならび]) :- _要素 @< _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). findavg(_集約項,_項,_相加平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _相加平均 is _合計値 / _ならびの長さ,!. sum([],0). sum([N|R],S) :- sum(R,S_1), S is N + S_1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/998 # # [1] 授業単元:C++ # [2] 問題文(含コード&リンク): # 入力:二つの整数n,m # 出力:1からnまでの番号札を持った人が、番号順に円陣を組んでいる。 #      最初に、1番札の人からm番目の人が退席する(円陣は1減) #      続いて、その次からm番目の人が退席する。これを繰り返したときの、 #      退席者の順番を求め、出力せよ。 #     -例:n = 9,m = 5のとき、退席者の順番は5,1,7,4,3,6,9,2,8 # '入力:二つの整数n,m 出力:1からnまでの番号札を持った人が、番号順に円陣を組んでいる。      最初に、1番札の人からm番目の人が退席する(円陣は1減)      続いて、その次からm番目の人が退席する。これを繰り返したときの、      退席者の順番を求め、出力せよ。'(_n,_m) :- findall(N,( between(1,_n,N)), L1), '最初に、1番札の人からm番目の人が退席する(円陣は1減)      続いて、その次からm番目の人が退席する。これを繰り返したときの、      退席者の順番を求め、'(L1,_m,L2), '出力せよ。'(L2). '最初に、1番札の人からm番目の人が退席する(円陣は1減)      続いて、その次からm番目の人が退席する。これを繰り返したときの、      退席者の順番を求め、'([],_,[]) :- !. '最初に、1番札の人からm番目の人が退席する(円陣は1減)      続いて、その次からm番目の人が退席する。これを繰り返したときの、      退席者の順番を求め、'(L1,_m,[N|R]) :- _m_1 is _m - 1, ならびの回転(左方向,_m_1,L1,[N|L3]), '最初に、1番札の人からm番目の人が退席する(円陣は1減)      続いて、その次からm番目の人が退席する。これを繰り返したときの、      退席者の順番を求め、'(L2,_m,R). ならびの回転(_方向,N,L1,L2) :- length(Ln,N), ならびの回転_2(_方向,Ln,L1,L2). ならびの回転_2(_方向,[],L,L). ならびの回転_2(_方向,[_|Ln],L1,L2) :- ならびの回転(_方向,L1,L1_1), ならびの回転_2(_方向,L2,L1_1,L2). ならびの回転(左方向,[A|R],L) :- append(R,[A],L). ならびの回転(右方向,L1,L) :- append(R,[A],L1), append([A],R,L). '出力せよ。'(L2) :- writef('%t\n',[L2]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/987 # # [1] プログラミング # [2] 数字を収納する # # Cでお願いします。コンソールです # ある数字を一文字入力し、そしてenter。 # 次に、その前に打った数だけランダムな数字を空白をはさんで打ち込む。そしてエンター # # 例 # 6 (エンター # 4 23 1 4 5 3 (エンター # # みたいなかんじです # # そしてこれを X[i] にi=1から順に空白を飛ばして入れていくってかんじです。 そんでX[1]=4 X[2]=23 ・・・  # みたいに入ればいいです # 文字列ではなく数字で収納したいです # # お願いします 'ある数字を一文字入力し、そしてenter。次に、その前に打った数だけランダムな数字を空白をはさんで打ち込む。そしてエンター'([N|_数値ならび]) :- 整数を得る(N), findall(_数値,( between(1,N,_), '空白または改行が来るまでが数値だ'(_数値)), _数値ならび). '空白または改行が来るまでが数値だ'(_数値) :- get_char(_文字), '空白または改行が来るまで'(_文字,_文字ならび), atomic_list_concat(文字ならび,_文字列), atom_number(_文字列,_数値). '空白または改行が来るまで'(' ',[]) :- !. '空白または改行が来るまで'('\n',[]) :- !. '空白または改行が来るまで'(A,[A|R]) :- get_char(B), '空白または改行が来るまで'(B,R). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 161代目 #984 # [1] 授業単元:プログラミング応用 # [2] 問題文(含コード&リンク):西暦を年号に変換するプログラムを作成する。 # ただし、入力できるのは、1868年以降からであり、2008年以降も平成とする。 # 明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。 # 下記を参考にプログラムを作成しなさい。 # int gannen[]={1989, 1926, 1912, 1868}; # char nengou[][8]={"heisei", "syouwa", "taisyou", "meiji"}; # '西暦を年号に変換するプログラムを作成する。 ただし、入力できるのは、1868年以降からであり、2008年以降も平成とする。 明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。'(_西暦,_年号) :- 'ただし、入力できるのは、1868年以降からであり、'(_西暦), '明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。'(_元号ならび,_元年の西暦ならび), 西暦を年号に変換する(_西暦,_元号ならび,_元年の西暦ならび,_年号). 'ただし、入力できるのは、1868年以降からであり、'(_西暦) :- _西暦 >= 1868. '明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。'([明治,大正,昭和,平成],[1868,1912,1926,1989]). 西暦を年号に変換する(_西暦,_元号ならび,_元年の西暦ならび,_年号) :- 西暦から元号と元年の西暦を得る(_西暦,_元号ならび,_元年の西暦ならび,_元号,_元年の西暦), 年号を得る(_西暦,_元号,_元年の西暦,_年号). 西暦から元号と元年の西暦を得る(_西暦,_元号ならび,_元年の西暦ならび,_元号,_元年の西暦) :- 元号候補とその元年の西暦を得る(_元号ならび,_元年の西暦ならび,_元号,_元年の西暦), 西暦が存在する元号の元年の西暦(_西暦,_元年の西暦ならび,_元年の西暦). 元号候補とその元年の西暦を得る(_元号ならび,_元年の西暦ならび,_元号,_元年の西暦) :- nth1(_nth1,_元号ならび,_元号), nth1(_nth1,_元年の西暦ならび,_元年の西暦). 西暦が存在する元号の元年の西暦(_西暦,_元年の西暦ならび,_元年の西暦) :- append(L1,[_元年の西暦|L2],_元年の西暦ならび), forall(member(N,L1),N < _西暦), forall(member(N,L2),N > _西暦). 年号を得る(_西暦,_元号,_元年の西暦,_年号) :- N is _西暦 - _元年の西暦 + 1, 和年表現(N,_和年), atomic_list_concat([_元号,_和年],_年号). 和年表現(N,_和年) :- '二十未満の和年表現'(N,_和年). 和年表現(N,_和年) :- '二十以上の和年表現'(N,_和年). '二十未満の和年表現'(N,_和年) :- between(1,19,N), nth0(N,['',元年,二年,三年,四年,五年,六年,七年,八年,九年,十年,十一年,十二年,十三年,十四年,十五年,十六年,十七年,十八年,十九年],_和年). '二十以上の和年表現'(N,_和年) :- N >= 20, '二十以上の十の位、一の位'(N,_十の位,_一の位), atomic_list_concat([_十の位,十,_一の位,年],_和年). '二十以上の十の位、一の位'(N,_十の位,_一の位) :- N_1 is N // 10, N_2 is N mod 10, nth0(N_1,['',一,二,三,四,五,六,七,八,九],_十の位), nth0(N_2,['',一,二,三,四,五,六,七,八,九],_一の位). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/841 # # お願いします。 # # [1] 授業単元: 課題 # [2] 問題文 # # 1. 10*10(=100)の領域に、ランダムに30個の点を配置する # 2. ランダムに2点 A, B を選ぶ # 3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ # # '1. 10*10(=100)の領域に、ランダムに30個の点を配置する 2. ランダムに2点 A, B を選ぶ 3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ' :- '1. 10*10(=100)の領域に、ランダムに30個の点を配置する'(L), '2. ランダムに2点 A, B を選ぶ'(L,_A,_B), '3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ'(L,_A,_B). '1. 10*10(=100)の領域に、ランダムに30個の点を配置する'(L) :- fidnall((_x,_y),( between(1,30,_), _x is (random(10000) + 1) / 1000, _y is (random(10000) + 1) / 1000), L). '2. ランダムに2点 A, B を選ぶ'(L,_A,_B) :- ランダムに点を選ぶ(L,_A), ランダムに点を選ぶ(L,_B), \+(_A = _B),!. '2. ランダムに2点 A, B を選ぶ'(L,_A,_B) :- '2. ランダムに2点 A, B を選ぶ'(L,_A,_B). ランダムに点を選ぶ(L,_点) :- R is random(30), nth0(R,L,_点). '3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ'(L,(_x1,_y1),(_x2,_y2)) :- 距離10以内にある点を経由し移動可能(L,(_x,_y),(_x1,_y1),(_x2,_y2)), writef('点(%t,%t)で可能です\n',[_x,_y]). '3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ'(_,_,_) :- write('可能な点はありません\n'). 距離10以内にある点を経由し移動可能(L,(_x,_y),(_x1,_y1),(_x2,_y2)) :- 経由する点候補を得る(L,(_x,_y),(_x1,_y1),(_x2,_y2)), 距離10以内にある((_x,_y),(_x1,_y1),(_x2,_y2)). 経由する点候補を得る(L,(_x,_y),(_x1,_y1),(_x2,_y2)) :- member((_x,_y),L), \+((_x,_y)=(_x1,_y1)), \+((_x,_y)=(_X2,_y2)). 距離10以内にある((_x,_y),(_x1,_y1),(_x2,_y2)) :- sqrt((_x - _x1) * (_x - _x1) + (_y - _y1) * (_y - _y1)) + sqrt((_x - _x2) * (_x - _x2) + (_y - _y2) * (_y - _y21)) =< 10.0. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/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',[_口座名義,_口座番号,_口座残高]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 161代目 #839 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # 任意の0〜nの整数から、重複を許してm個の整数を選び出力するプログラムを作れ。 # '任意の0〜nの整数から、重複を許してm個の整数を選び出力する'(_m個,_n) :- '任意の0〜nの整数から、重複を許してm個の整数を選び'(_m個,_整数ならび), 出力する(_整数ならび). '任意の0〜nの整数から、重複を許してm個の整数を選び'(_m個,_整数ならび) :- findall(_整数,( m個の(_m個), '任意の0〜nの整数から'(_n,_整数)),_整数ならび). m個の(_m個) :- between(1,_m個,_). '任意の0〜nの整数から'(_n,_整数) :- _整数 is random(_n + 1). 出力する(_整数ならび) :- forall(member(_整数,_整数ならび),writef('%t\n',[_整数])). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/648 # # [1] 授業単元:Cプログラミング # [2] 問題文(含コード&リンク): # 下記のアップロードされたファイル(数字の羅列)を読み込み、並び替え方法(昇順/降順)で指定されたファイル(out.txt) # へ出力するプログラムを作成せよ # http://ime.nu/www1.axfc.net/uploader/He/so/280605 # 以下実行結果 # # 並び替え方法をしていしてください(1:昇順、2:降順) # 1 # # 並び替えたファイルへ出力しました。 # # cat out.txt ←catコマンドで中身確認 # 1 # 3 # 3 # 3 # 'アップロードされたファイル(数字の羅列)を読み込み、並び替え方法(昇順/降順)で指定されたファイル(out.txt)へ出力する'(_アップロードされたファイル名) :- 'アップロードされたファイル(数字の羅列)を読み込み'(_アップロードされたファイル名,_行ならび), '並び替え方法(昇順/降順)で指定されたファイル(out.txt)へ出力する'(_行ならび). 'アップロードされたファイル(数字の羅列)を読み込み'(_行ならび) :- get_lines('input.txt',_行ならび). '並び替え方法(昇順/降順)で指定されたファイル(out.txt)へ出力する'(_行ならび) :- '並び替え方法を指定してください(1:昇順、2:降順)'(_並び替え方法), 並び替え(_並び替え方法,_行ならび,_並び替えた行ならび), '指定されたファイル(out.txt)へ出力する'(_並び替えた行ならび). '並び替え方法を指定してください(1:昇順、2:降順)'(_並び替え方法) :- write('並び替え方法を指定してください(1:昇順、2:降順)'), 整数を得る('並び替え方法を指定してください(1:昇順、2:降順)',between(1,2,N),N), 並び替え方法(N,_並び替え方法). 並び替え方法(1,昇順). 並び替え方法(2,降順). 並び替え(昇順,_行ならび,_並び替えた行ならび) :- 整列(_行ならび,_並び替えた行ならび). 並び替え(降順,_行ならび,_並び替えた行ならび) :- 整列(_行ならび,_並び替えた昇順行ならび), reverse(_並び替えた昇順行ならび,_並び替えた行ならび). '指定されたファイル(out.txt)へ出力する'(_並び替えた行ならび) :- put_lines('out.txt',_並び替えた行ならび). put_lines(_ファイル名,_行ならび) :- open(_ファイル名,write,Outstream), forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/386 # # 二つの2×3型行列を # A=1.1 -2.2 0.9 #  -0.2  2.7 0.3 # # B= 1.8 0.5 1.3 # -0.4 0.6 -0.3 # と定義する。 # # これらの二つの行列の宣言、初期化し、C≡A+B C≡A-Bを算出して # 2×3型の表形式で出力するプログラムを作成せよ。ただし、行列CとDは固定長 # 配列とし、関数内の演算を行うこと # # 上記の問題と同じように行列A、Bを用いて、積C≡ABt を算出し、2×2型の表 # 形式で出力せよ。ただし、Bの転置行列、Btはプログラム中に直接記述するのでは # なく、Bより作成すること。また、Cはnew演算子によりメモリを確保し、関数内で # 演算を行うこと。 # # # だれかこのプログラムおしえてくださいm(_ _)m # # '行列A、Bを用いて、積C≡ABt を算出し、2×2型の表形式で出力せよ。ただし、Bの転置行列、Btはプログラム中に直接記述するのではなく、Bより作成すること。'(A,B,C) :- 転置(B,Bt), 行列の掛算_1(A,Bt,C), '2×2型の表形式で出力せよ'(C). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2) . 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 行列の掛算_1([],_,[]) :- !. 行列の掛算_1([A|R1],L,[S1|R3]) :- 行列の掛算_2(A,L,S1), 行列の掛算_1(R1,L,R3). 行列の掛算_2(_,[],[]) :- !. 行列の掛算_2(A,[B|R2],[C|R3]) :- 行列の掛算_3(A,B,C), 行列の掛算_2(A,R2,R3). 行列の掛算_3([],[],0) :- !. 行列の掛算_3([A|R1],[B|R2],S) :- 分数を含む掛算(A,B,S1), 行列の掛算_3(R1,R2,S2), 分数を含む加算(S1,S2,S),!. 分数を含む加算(A1 / A2,B1 / B2,C) :- S1 is A1 * B2 + A2 * B1, S2 is A2 * B2, 約分(S1 / S2,C),!. 分数を含む加算(A1 / A2,B,C) :- S1 is A1 + A2 * B, 約分(S1 / A2,C),!. 分数を含む加算(A,B1 / B2,C) :- S1 is B1 + B2 * A, 約分(S1 / B2,C),!. 分数を含む加算(A,B,C) :- C is A + B. 約分(B / A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(0,_,0) :- !. 約分の二(0.0,_,0) :- !. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子,_分母,_分子 / _分母). 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). '2×2型の表形式で出力せよ'(LL) :- 'M×Nの表形式で出力する'(2,2,LL). 'M×Nの表形式で出力する'(M,N,LL) :- 'N列カンマ区切り行表示形式'(N,_行表示形式), nth1(_nth1,LL,L), writef(_行表示形式,L), _nth1 = M. 'N列カンマ区切り行表示形式'(N,_行表示形式) :- findall('%t',between(1,N,_),PL), atomic_list_concat(PL,',',S1), atom_concat(S1,'\n',_行表示形式). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/386 # # 二つの2×3型行列を # A=1.1 -2.2 0.9 #  -0.2  2.7 0.3 # # B= 1.8 0.5 1.3 # -0.4 0.6 -0.3 # と定義する。 # # これらの二つの行列の宣言、初期化し、C≡A+B C≡A-Bを算出して # 2×3型の表形式で出力するプログラムを作成せよ。ただし、行列CとDは固定長 # 配列とし、関数内の演算を行うこと # # 上記の問題と同じように行列A、Bを用いて、積C≡ABt を算出し、2×2型の表 # 形式で出力せよ。ただし、Bの転置行列、Btはプログラム中に直接記述するのでは # なく、Bより作成すること。また、Cはnew演算子によりメモリを確保し、関数内で # 演算を行うこと。 # # # だれかこのプログラムおしえてくださいm(_ _)m # # '二つの2×3型行列を A=1.1 -2.2 0.9  -0.2  2.7 0.3 B= 1.8 0.5 1.3 -0.4 0.6 -0.3 と定義する。 これらの二つの行列の宣言、初期化し、C≡A+B C≡A-Bを算出して 2×3型の表形式で出力する' :- これらの二つの行列の宣言(A,B), 'C≡A+B C≡A-Bを算出して'(A,B,C), '2×3型の表形式で出力する'(C), '2×3型の表形式で出力する'(D). これらの二つの行列の宣言(A,B) :- A = [[1.1,-2.2,0.9],[-0.2,2.7,0.3]], B = [[1.8,0.5,1.3],[-0.4,0.6,-0.3]]. 'C≡A+B C≡A-Bを算出して'(A,B,C) :- 行列の和(A,B,C), 行列の差(A,B,D). 行列の和([],[],[]). 行列の和([L1|R1],[L2|R2],[L3|R3]) :- 行の和(L1,L2,L3), 行列の和(R1,R2,R3). 行の和([],[],[]). 行の和([A|R1],[B|R2],[C|R3]) :- 分数を含む加算(A,B,C), 行の和(R1,R2,R3). 行列の差([],[],[]). 行列の差([L1|R1],[L2|R2],[L3|R3]) :- 行の差(L1,L2,L3), 行列の差(R1,R2,R3). 行の差([],[],[]). 行の差([A|R1],[B|R2],[C|R3]) :- B_1 is B * (-1). 分数を含む加算(A,B_1,C), 行の差(R1,R2,R3). 分数を含む加算(A1 / A2,B1 / B2,C) :- S1 is A1 * B2 + A2 * B1, S2 is A2 * B2, 約分(S1 / S2,C),!. 分数を含む加算(A1 / A2,B,C) :- S1 is A1 + A2 * B, 約分(S1 / A2,C),!. 分数を含む加算(A,B1 / B2,C) :- S1 is B1 + B2 * A, 約分(S1 / B2,C),!. 分数を含む加算(A,B,C) :- C is A + B. 約分(B / A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(0,_,0) :- !. 約分の二(0.0,_,0) :- !. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子,_分母,_分子 / _分母). 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). '2×3型の表形式で出力する'(LL) :- 'M×Nの表形式で出力する'(2,3,LL). 'M×Nの表形式で出力する'(M,N,LL) :- 'N列カンマ区切り行表示形式'(N,_行表示形式), nth1(_nth1,LL,L), writef(_行表示形式,L), _nth1 = M. 'N列カンマ区切り行表示形式'(N,_行表示形式) :- findall('%t',between(1,N,_),PL), atomic_list_concat(PL,',',S1), atom_concat(S1,'\n',_行表示形式). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349545643/864 # # # 0 ~ 64 の 65 個の数字を # 以下のような個数毎に改行して表示する場合 # 各言語ではどのように書きますか? # 便宜上それぞれの数字の型は int としてください # # 0 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 '0 ~ 64 の 65 個の数字を 以下のような個数毎に改行して表示する場合 各言語ではどのように書きますか? 便宜上それぞれの数字の型は int としてください 0 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' :- '0 ~ 64 の 65 個の数字を'(_数ならび), 個数毎に改行して表示する(_数ならび,[5,4,4]). '0 ~ 64 の 65 個の数字を'(_数ならび) :- findall(N,between(0,64,N),_数ならび). 個数毎に改行して表示する(_数ならび,[_個数|_残り表示パターン]) :- 個数毎に(_数ならび,_個数,_個数分の数ならび,_残り数ならび), 改行して表示する(_個数分の数ならび), 個数毎に改行して表示する(_残り数ならび,_残り表示パターン). 個数毎に改行して表示する([_数|_残り数ならび],[]) :- 個数毎に改行して表示する([_数|_残り数ならび],[5,4,4]). 個数毎に改行して表示する(_,_). 個数毎に(_数ならび,_個数,_個数分の数ならび,_残り数ならび) :- length(_個数分の数ならび,_個数), append(_個数分の数ならび,_残り数ならび,_数ならび),!. 改行して表示する(_個数分の数ならび) :- atomic_list_concat(_個数分の数ならび,' ',_空白で区切られた数ならび文字列), writef('%t\n',[_空白で区切られた数ならび文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/188 # # [1]C言語 # [2]hashについて # 問題文 http://ime.nu/www.dotup.org/uploda/www.dotup.org3723526.jpg # [3]Linux # [3.1]gcc C言語 # [4]木曜日6:00まで # [5]宜しくお願いします… # # # 問題1. 整数データに対してハッシュ探索を行うことを考える。 # (1) 1~50までの値の乱数を20回呼び出し、テーブル長が23のハッシュテーブル # にチェイン法によってデータを格納せよ。ここでハッシュ関数は(mod23)と # する。 # (2) hash表の内容をすべて画面表示する関数print_hashを定義して、確認しな # さい。 # (3) (2)によって格納されたデータに対して各i(1=% 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1355011916/ # # やろうとしていることは、可変長の二次元配列ではなくて # 可変長の配列の可変長の配列だろ。 # つまり、要素数が例えば2x100とかではなく100+50+30+200のような。 # C++で言うところのstd::vector >でほぼできることだけど、Cだと # 別途管理配列を要素する必要があるね。 'n個の可変要素のリストを生成する'(_n,LL) :- findall(L,( between(1,_n,L)), LL). % 以下のサイトは # 出典:: http://test/read.cgi/tech/1354715494/33 # # 【お題】 # ウィルソンの定理を使って素数を判定する関数is_primeを実装し、 # 10000以下の素数以外の数の和を求めよ # # ウィルソンの定理 # pが素数 <=> (p-1)!+1 (mod p) == 0 :- dynamic(f/2). a(A) :- b(B,(between(1,10000,B),\+(d(B))),A). b(A,B,C) :- findall(A,B,D),c(D,C). c([],0). c([A|B],C) :- c(B,D),C is A + D. d(A) :- e(A). e(A) :- A > 0,B is A - 1,f(B,C),0 is (C + 1) mod B,!. f(0,1) :- !. f(1,1) :- !. f(A,B) :- B is A - 1,f(B,C),B is A * C,asserta((f(A,B) :- !)). % 以下のサイトは # 出典:: http://test/read.cgi/tech/1354715494/33 # # 【お題】 # ウィルソンの定理を使って素数を判定する関数is_primeを実装し、 # 10000以下の素数以外の数の和を求めよ # # ウィルソンの定理 # pが素数 <=> (p-1)!+1 (mod p) == 0 :- dynamic(階乗保存計算/2). :- retract((階乗保存計算(_,_) :- _)),fail;true. 'ウィルソンの定理を使って素数を判定する関数is_primeを実装し、 10000以下の素数以外の数の和を求めよ ウィルソンの定理 pが素数 <=> (p-1)!+1 (mod p) == 0'(_10000以下の素数以外の数の和) :- findsum(_p,( between(1,10000,_p), \+(is_prime(_p))), _10000以下の素数以外の数の和). is_prime(_p) :- 'ウィルソンの定理とは pが素数 <=> (p-1)!+1 (mod p) == 0'(_p). 'ウィルソンの定理とは pが素数 <=> (p-1)!+1 (mod p) == 0'(_p) :- _p > 0, Y is _p - 1, 階乗保存計算(Y,Z), 0 is (Z + 1) mod _p,!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). % 以下のサイトは # # 与えられた数 x の3乗根を返す cube_root(x)とこれを呼び出して、1から10までの # 3乗根を表示するプログラムを作成せよ # '与えられた数 x の3乗根を返す cube_root(x)とこれを呼び出して、1から10までの3乗根を表示する' :- between(1,10,_x), cube_root(_x,_3乗根), writef('%t: ',[_x]), format('~6f\n',[_3乗根]), _x = 10. cube_root(_x,_3乗根) :- _x_2 is _x / 2, 二分法で3乗根を収束させる(100,_x,_x,_x_2,_3乗根). 二分法で3乗根を収束させる(0,_値,_3乗根,_,_3乗根) :- !. 二分法で3乗根を収束させる(N,_値,_値_1,_値_2,_3乗根) :- _値 >= _値_2 * _値_2 * _値_2, _値_3 is (_値_1 + _値_2) / 2, N_1 is N - 1, 二分法で3乗根を収束させる(N_1,_値,_値_1,_値_3,_3乗根). 二分法で3乗根を収束させる(N,_値,_値_1,_値_2,_3乗根) :- _値 < _値_2 * _値_2 * _値_2, _値_3 is _値_2 / 2, N_1 is N - 1, 二分法で3乗根を収束させる(N_1,_値,_値_2,_値_3,_3乗根). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/84 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # コマンド選択で,0) 終了,1) 追加,2) 検索(id),3) リスト表示,4) 変更 5) 削除 6) 特殊機能 が行える商品在庫管理プログラムを作成する。 # データは,商品の番号 商品名 数 単価 の形式で商品のデータを持っているファイルとする. # 上の機能ルーチンは,全て関数として作成すること. # ただし,追加と検索は実装済みである. # # 'コマンド選択で,0) 終了,1) 追加,2) 検索(id),3) リスト表示,4) 変更 5) 削除 6) 特殊機能 が行える商品在庫管理プログラムを作成する。データは,商品の番号 商品名 数 単価 の形式で商品のデータを持っているファイルとする.' :- reconsult('在庫管理.pro'), コマンド選択で(_コマンド), '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(_コマンド), '在庫管理.proの保存'. コマンド選択で(_コマンド) :- 整数を得る('0) 終了,1) 追加,2) 検索(id),3) リスト表示,4) 変更 5) 削除 6) 特殊機能を整数で',member(_整数,between(0,6,_整数),_整数), nth0(_整数,[終了,追加,'検索(id)',リスト表示,変更,削除,特殊機能],_コマンド). '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(終了) :- !. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(追加) :- 在庫追加. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(検索) :- 在庫検索. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(リスト表示) :- リスト表示. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(変更) :- 在庫変更. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(削除) :- 在庫削除. '終了,追加,検索(id),リスト表示,変更,削除,特殊機能,が行える'(特殊機能) :- 特殊機能. 在庫追加 :- 商品名を得る(_商品名), 数量を得る(_数量), 在庫追加(_商品名,_数量). 在庫追加(_商品名,_数量). retract(在庫(_商品名,_現在の数量)), _更新された数量 is _現在の数量 + _数量, asserta(在庫(_商品名,_更新された数量)),!. 在庫追加(追加,_商品名,_数量) :- asserta(在庫(_商品名,_数量)),!. '在庫検索(id)' :- 商品名を得る(_商品名), 在庫(_商品名,_数量), writef('現在の在庫数量は %t です\n',[_数量]),!. '在庫検索(id)' :- write('現在の在庫はありません\n'). リスト表示 :- 在庫(_商品名,_数量), writef('%t,%t\n',[_商品名,_数量]), fail. リスト表示. 在庫変更 :- 整数を得る('1..商品名 2..数量 どちらを変更するか',between(1,2,_整数),_整数), 在庫変更(_整数). 在庫変更(1) :- 現在の商品名を得る(_現在の商品名), 正しい商品名を得る(_正しい商品名), 在庫変更(_現在の商品名,_正しい商品名),!. 在庫変更(1) :- 在庫変更(1). 在庫変更(2) :- 商品名を得る(_商品名), '診断:: 商品名'(_商品名), 数量を得る(_数量), retract(在庫(_商品名,_)), asserta(在庫(_商品名,_数量)),!. 現在の商品名を得る(_現在の商品名) :- write('現在の商品名を入力してください : '), get_line(_現在の商品名), '診断:: 現在の商品名'(_現在の商品名),!. '診断:: 現在の商品名'(_現在の商品名) :- 在庫(_現在の商品名,_),!. '診断:: 現在の商品名'(_商品名) :- writef('入力された商品名の在庫はありません\n',[_商品名]), fail. 正しい商品名を得る(_正しい商品名) :- write('正しい商品名を入力してください : '), get_line(_正しい商品名),!. '診断:: 商品名'(_商品名) :- 在庫(_商品名,_),!. '診断:: 商品名'(_商品名) :- writef('指定された商品名の %t の在庫登録はありません\n',[_商品名]), fail. 在庫変更(_現在の商品名,_正しい商品名) :- retract(在庫(_現在の商品名,_数量)), asserta(在庫(_正しいの商品名,_数量)),!. 在庫削除 :- 商品名を得る(_商品名), retract(在庫(_商品名,_)). 特殊機能. 数量を得る(_数量) :- 数を得る(数量,true,_数量). '在庫管理.proの保存' :- tell('在庫管理.pro'), listing(在庫), told. % 以下のサイトは # 出典:: 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/49 # # [1] 授業単元:計算機実習 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/eMHdX9DL # 上記のプログラムを変更して,キーボードから(x, y)の座標とマスの状態を入力し,反映するようにしなさい. # 入力の際には座標や状態が範囲を超えていないか確認し,越えているときにはもう一度入力するようにしなさい. # # #include # int plot[8][8]; # char state[3][5] = {" ","○ ","● "}; # # # void print_board(){ # int x,y; # printf("\033[2J"); # printf("\033[%d;%dH",0,0); # for(y = 0;y < 8;y++){ # for (x = 0;x < 8;x++){ # printf("%s|",state[plot[x][y]]); # } # printf("\n"); # printf("--+--+--+--+--+--+--+--+\n"); # } # } # # int main(){ # int x,y; # # for(y = 0;y < 8;y++)for(x = 0;x < 8;x++)plot[x][y] = 0; # plot[3][3] = plot[4][4] = 1; # plot[3][4] = plot[4][3] = 2; # # print_board(); # } # # 1 2 3 4 5 6 7 8 # +--+--+--+--+--+--+--+--+ # 1 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 2 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 3 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 4 | | | |○|●| | | | # +--+--+--+--+--+--+--+--+ # 5 | | | |●|○| | | | # +--+--+--+--+--+--+--+--+ # 6 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 7 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 8 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # :- dynamic(ボード保存/1). 'キーボードから(x, y)の座標とマスの状態を入力し,反映するようにしなさい.入力の際には座標や状態が範囲を超えていないか確認し,越えているときにはもう一度入力するようにしなさい.' :- ボードの初期状態(_ボート), ボードゲーム(_ボード). ボードの初期状態(_ボート) :- findall(L,( between(1,8,_), length(L,8), all(L,' ')), _ボード). ボードゲーム(_現在のボード) :- ボード(_現在のボード,_一手進んだボード), ボードゲーム(_一手進んだボード),!. ボードゲーム(_現在のボード) :- ボード表示(_現在のボード), write('ゲーム終了です。\n'), 終了時点のボードを保存する(_現在のボード). ボード(_現在のボード) :- 着手するべきマスが残っている(_現在のボード), 'キーボードから(x, y)の座標とマスの状態を入力し'(X,Y), ボードを更新する(X,Y,_現在のボード,_一手進んだボード), ボードを表示する(_一手進んだボード),!. 着手するべきマスが残っている([L|R]) :- member(' ',L), 着手するべきマスが残っている(R),!. 'キーボードから(x, y)の座標とマスの状態を入力し'(X,Y,_マスの状態) :- 整数を得る('x(0は終了)',between(0,8,X),X), \+(X = 0), 整数を得る('y',between(1,8,Y),Y), マスの状態を得る(_マスの状態). マスの状態を得る(_マスの状態) :- write(' ..0か●..1か○..2を着手してください : '), get_Line(Line), '診断: マスの状態を得る'(Line,_マスの状態),!. マスの状態を得る(_マスの状態) :- マスの状態を得る(_マスの状態). '診断: マスの状態を得る'('0',' ') :- !. '診断: マスの状態を得る'('1','○') :- !. '診断: マスの状態を得る'('2','●') :- !. ボードを更新する(X,Y,_着手,_現在のボード,_一手進んだボード) :- '前の行ならび、対象行、後の行ならび'(Y,_現在のボード,_前の行ならび,_対象行,_後の行ならび), 対象行を更新する(X,_着手,_対象行,_更新された対象行), append(_前の行ならび,[_更新された対象行|_後の行ならび],_一手進んだボード). '前の行ならび、対象行、後の行ならび'(Y,_現在のボード,_前の行ならび,_対象行,_後の行ならび) :- append(_前の行ならび,[_対象行|_後の行ならび],_現在のボード), length([_|_前の行ならび],Y). 対象行を更新する(X,_着手,_対象行,_更新された対象行) :- append(L0,[_|R],_対象行), length([_|L0],X), append(L0,[_着手|R],_更新された対象行). ボード表示(_ボード) :- append(L0,[L|R],_ボード), ボードの一行を表示する(L0,L), R = [], writef(' +--+--+--+--+--+--+--+--+\n'),!. ボードの一行を表示する(L0,L) :- length([_|L0],N), writef(' +--+--+--+--+--+--+--+--+\n'), atomic_list_concat(L,'|',S), writef('%t %t|\n',[N,S]). 終了時点のボードを保存する(_現在のボード) :- asserta(ボード保存(終了時点のボードを保存する(_現在のボード)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1351769173/599 # # 2進数3桁のパスワードロックのプログラムを作るのですが、パスワード変更の機能も追加しなければなりません。どのようにプログラムを組めば良いのかわかりません。なにかアドバイス頂けませんか? # # :- dynamic(パスワード/4). パスワードの変更([],_ID) :- !,fail. パスワードの変更(Ln,_ID) :- パスワードを変更の手続き(_ID),!. パスワードの変更([_|Ln],_ID) :- パスワードの変更(Ln,_ID). パスワードを変更の手続き(_ID) :- 現在のパスワードの確認(_ID,_入力1,_入力2,_入力3), 新しいパスワードの入力(_入力1_2,_入力2_2,_入力3_2), 新しいパスワードの再入力(_入力1_2,_入力2_2,_入力3_2), パスワードの書き換え(_ID,_入力1_2,_入力2_2,_入力3_2),!. 新しいパスワードの再入力(_入力1_2,_入力2_2,_入力3_2) :- write('念のためもう一度新しいパスワードを入力してください : '), パスワードを入力する(_入力1_2,_入力2_2,_入力3_2). 現在のパスワードの確認(_ID,_入力1,_入力2,_入力3) :- write('現在のパスワードを入力してください : '), パスワードを入力する(_入力1,_入力2,_入力3), パスワード検査(_ID,_入力1,_入力2,_入力3,諾). 新しいパスワードの入力(_入力1_2,_入力2_2,_入力3_2) :- write('新しいパスワードを入力してください : '), パスワードを入力する(_入力1_2,_入力2_2,_入力3_2),!. 新しいパスワードの再入力(_入力1_2,_入力2_2,_入力3_2) :- write('念のため、もう一度、新しいパスワードを入力してください : '), パスワードを入力する(_入力1_2,_入力2_2,_入力3_2),!. パスワードの書き換え(_ID,_入力1_2,_入力2_2,_入力3_2) :- retract(パスワード(_ID,_,_,_)), assertz(パスワード(_ID,_入力1_2,_入力2_2,_入力3_2)). パスワード検査(_ID) :- パスワードを入力する(_入力1,_入力2,_入力3), パスワード検査(_ID,_入力1,_入力2,_入力3,_診断), パスワード検査表示(_ID,_診断). パスワードを入力する(_入力1,_入力2,_入力3) :- 整数を得る('0か1',between(0,1,_入力1),_入力1), 整数を得る('0か1',between(0,1,_入力2),_入力2), 整数を得る('0か1',between(0,1,_入力3),_入力3). パスワード検査(_ID,_入力1,_入力2,_入力3,諾) :- パスワード(_ID,_入力1,_入力2,_入力3),!. パスワード検査(_ID,_入力1,_入力2,_入力3,拒) :- \+(パスワード(_ID,_入力1,_入力2,_入力3)). パスワード検査表示(_ID,拒) :- writef('パスワードが違います\n'),!. パスワード検査表示(_ID,諾) :- !. % 以下のサイトは # 出典:: 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]ポインタはやってません。宜しくお願いします 。 # # '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/tech/1349545643/775 # # 【お題】 # コラッツ予想とは、「任意の0でない自然数nをとり、 # ・nが偶数の場合、nを2で割る # ・nが奇数の場合、nに3をかけて1を足す # という操作を繰り返すと、有限回で1に到達する」という主張である。 # # nからスタートして1に到達するまでのステップをsとしたとき、 # n = 1 .. 100000についてsを計算し、最長のsを出力せよ。 # # ただし、それぞれのnに対するsの計算は並列(スレッド、プロセス問わない)で行う事。 # # 'コラッツ予想とは、「任意の0でない自然数nをとり、 ・nが偶数の場合、nを2で割る ・nが奇数の場合、nに3をかけて1を足す という操作を繰り返すと、有限回で1に到達する」という主張である。 nからスタートして1に到達するまでのステップをsとしたとき、 n = 1 .. 100000についてsを計算し、最長のsを出力せよ。'(_n,_最長のs) :- findall(_Idならび,( between(1,100000,_n), message_queue_create(_Id), thread_create(コラッツの予想(_ID,_n),_,[])), _Idならび), 最長のsを出力する(_Idならび). コラッツの予想(_ID,_n) :- コラッツの予想(_n,0,_回数), thread_send_massage(_ID,_回数). コラッツの予想(1,_回数,_回数) :- !. コラッツの予想(_n,_回数_1,_回数) :- 'nが偶数の場合、nを2で割る nが奇数の場合、nに3をかけて1を足す'(_n,_n_2), _回数_2 is _回数_1 + 1, コラッツの予想(_n_2,_回数_2,_回数),!. 'nが偶数の場合、nを2で割る nが奇数の場合、nに3をかけて1を足す'(_n,n_2) :- 'nが偶数の場合、nを2で割る'(_n,_n_2). 'nが偶数の場合、nを2で割る nが奇数の場合、nに3をかけて1を足す'(_n,_n_2) :- 'nが奇数の場合、nに3をかけて1を足す'(_n,_n_2). 'nが偶数の場合、nを2で割る'(_n,_n_2) :- _n_2 is _n // 2. 'nが奇数の場合、nに3をかけて1を足す'(_n,_n_2) :- 1 is _n mod 2, _n_2 is _n * 3 + 1. 最長のsを出力する(_Idならび) :- findmax(_n,( between(1,100000,_), repeat, thread_get_massage(_Id,_n)), _最長のs), writef('最長のsは %t です。\n',[_最長のs]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349545643/775 # # 【お題】 # コラッツ予想とは、「任意の0でない自然数nをとり、 # ・nが偶数の場合、nを2で割る # ・nが奇数の場合、nに3をかけて1を足す # という操作を繰り返すと、有限回で1に到達する」という主張である。 # # nからスタートして1に到達するまでのステップをsとしたとき、 # n = 1 .. 100000についてsを計算し、最長のsを出力せよ。 # # ただし、それぞれのnに対するsの計算は並列(スレッド、プロセス問わない)で行う事。 # # 'コラッツ予想とは、「任意の0でない自然数nをとり、 ・nが偶数の場合、nを2で割る ・nが奇数の場合、nに3をかけて1を足す という操作を繰り返すと、有限回で1に到達する」という主張である。 nからスタートして1に到達するまでのステップをsとしたとき、 n = 1 .. 100000についてsを計算し、最長のsを出力せよ。'(_n,_最長のs) :- findmax(_回数,( between(1,100000,_n), コラッツの予想(_n,_回数)), _最長のs). コラッツの予想(_n,_回数) :- コラッツの予想(_n,0,_回数). コラッツの予想(1,_回数,_回数) :- !. コラッツの予想(_n,_回数_1,_回数) :- 'nが偶数の場合、nを2で割る nが奇数の場合、nに3をかけて1を足す'(_n,_n_2), _回数_2 is _回数_1 + 1, コラッツの予想(_n_2,_回数_2,_回数),!. 'nが偶数の場合、nを2で割る nが奇数の場合、nに3をかけて1を足す'(_n,n_2) :- 'nが偶数の場合、nを2で割る'(_n,_n_2). 'nが偶数の場合、nを2で割る nが奇数の場合、nに3をかけて1を足す'(_n,_n_2) :- 'nが奇数の場合、nに3をかけて1を足す'(_n,_n_2). 'nが偶数の場合、nを2で割る'(_n,_n_2) :- _n_2 is _n // 2. 'nが奇数の場合、nに3をかけて1を足す'(_n,_n_2) :- 1 is _n mod 2, _n_2 is _n * 3 + 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349545643/769 # # 【お題】 # 1) 1〜100からランダムに抽出した整数10個を要素に持つ配列を作成し、 # 2) その平均値と、 # 3) 各要素の平均値からの差の二乗値の平均の平方根(標準偏差)を算出して、 # 4) 1)〜3)の結果を出力するコードをどう書く? # # 言語のベーサルな表現実装力が見てみたいので、 # 可能であれば import や require 等の # 機能追加をしない素の状態でのチャレンジが望ましい。 # # 出力例: # [77, 62, 26, 17, 88, 40, 14, 11, 4, 49] # 38.8 # 27.85964823898536 # # 正直、デフォでこれら機能を有する統計処理のLL達のアピールを期待したお題だけれど # ループ等でしか書けそうもない普通のLL勢もひねりを加えるなどして面白くして欲しい。 # # '1) 1〜100からランダムに抽出した整数10個を要素に持つ配列を作成し、 2) その平均値と、 3) 各要素の平均値からの差の二乗値の平均の平方根 標準偏差)を算出して、 4) 1)〜3)の結果を出力する' :- '1) 1〜100からランダムに抽出した整数10個を要素に持つ配列を作成し、'(_整数リスト), '2) その平均値と、'(_整数リスト,_平均値), '3) 各要素の平均値からの差の二乗値の平均の平方根(標準偏差)を算出して、 '(_整数リスト,_平均値,_標準偏差), '4) 1)〜3)の結果を出力する'(_整数リスト,_平均値,_標準偏差). '1) 1〜100からランダムに抽出した整数10個を要素に持つ配列を作成し、'(_整数リスト) :- findall(_ランダムに抽出した整数,( between(1,10,_), _ランダムに抽出した整数 is random(100) + 1), _整数リスト). '2) その平均値と、'(_整数リスト,_平均値) :- length(_整数リスト,_要素数), sum(_整数リスト,_合計), _平均値 is _合計 / _要素数. '3) 各要素の平均値からの差の二乗値の平均の平方根(標準偏差)を算出して、 '(_整数リスト,_平均値,_標準偏差) :- length(_整数リスト,_要素数), '各要素の平均値からの差の二乗値の合計'(_整数リスト,_平均値,_各要素の平均値からの差の二乗値の合計), 二乗値の平均の平方根(_要素数,_各要素の平均値からの差の二乗値の合計,_標準偏差). '各要素の平均値からの差の二乗値の合計'([],_,0). '各要素の平均値からの差の二乗値の合計'([_要素|R],_平均値,S_1) :- '各要素の平均値からの差の二乗値の合計'(R,_平均値,S_2), S_1 is (_平均値 - _要素) * (_平均値 - _要素) + S_2. 二乗値の平均の平方根(_要素数,_各要素の平均値からの差の二乗値の合計,_標準偏差) :- _二乗値の平均 is _各要素の平均値からの差の二乗値の合計 / _要素数, _標準偏差 is sqrt(_二乗値の平均). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/271 # # Oracle11gR2で # # ID  Count # 1 3 # 2 2 # 3 3 # # こういうデータを元に # # Seq ID # 1 1 # 2 1 # 3 1 # 4 2 # 5 2 # 6 3 # 7 3 # 8 3 # # こんな感じのCount(*)の逆を作りたいけど、PL/SQL使わずに作るには、どうしたらいい? # Seqはなくてもいい # 'ID  Count 1 3 2 2 3 3 こういうデータを元に Seq ID 1 1 2 1 3 1 4 2 5 2 6 3 7 3 8 3 こんな感じのCount(*)の逆を作りたいけど、PL/SQL使わずに作るには、どうしたらいい?'(_テーブル名,_Seq,_ID) :- 実行項の生成(_テーブル名,_ID,_実行項), 'IDごとのカウントを取る'(_ID,_実行項,_ID_頻度ならび), sort(_ID_頻度ならび,_整列した_ID_頻度ならび), 'Seq組を生成'(1,_整列した_ID_頻度ならび,_Seq,_ID). 実行項の生成(_テーブル名,_ID,_実行項) :- findmax(Nth1,テーブル定義(_テーブル名,Nth1,_),_組の要素数), length(L,_組の要素数), _実行項 =.. [_テーブル名|L], テーブル定義(_テーブル名,_IDの位置,'ID'), nth1(_IDの位置,L,_ID). 'IDごとのカウントを取る'(_ID,_実行項,_ID_頻度ならび) :- setof(_ID,[_ID,_実行項] ^_実行項,_IDならび), findall([_ID,_頻度],( member(_ID,_IDならび), count(_実行項,_頻度ならび)),_ID_頻度ならび). 'Seq組を生成'(N_1,[[_ID,_頻度]|R],_Seq,_ID) :- N_2 is N_1 + _頻度 - 1, between(N_1,N_2,_Seq). 'Seq組を生成'(N_1,[[_ID,_頻度]|R],_Seq,_ID) :- N_2 is N_1 + _頻度, 'Seq組を生成'(N_2,R,_Seq,_ID). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/867 # # [1] プログラミング基礎 # [2] 5人の学生の学生番号、身長、体重を入力し # 平均身長ave_heigh、平均体重ave_weightを求める。 # ただし、学生番号、身長、身長の平均からの差、体重、体重の平均からの差は 2次元配列data[5][5]に格納するようにすること。 # # 学生番号、身長、体重の各々をkeyにして昇順、降順のどちらでもソートできるようにせよ。 # ただし、ソート処理は関数化しソートアルゴリズムには選択ソート、バブルソート、クイックソートの何れかを選択可能とすること。 # '5人の学生の学生番号、身長、体重を入力し、 平均身長、平均体重を求める。 学生番号、身長、身長の平均からの差、体重、体重の平均からの差を組とするならびに格納する'(_ならび) :- '5人の学生の学生番号、身長、体重を入力し'(_5人の学生の学生番号_身長_体重), '5人の学生番号、身長、身長の平均からの差、体重、体重を組とするならびに格納する'(_5人の学生の学生番号_身長_体重,_ならび). '5人の学生の学生番号、身長、体重を入力し'(_5人の学生の学生番号_身長_体重) :- findall([_学生番号,_身長,_体重],( between(1,5,_), 整数を得る(学生番号,_学生番号 > 0,_学生番号), 数を得る(身長,_身長 > 0,_身長), 数を得る(体重,_体重 > 0,_体重)), _5人の学生の学生番号_身長_体重). '5人の学生番号、身長、身長の平均からの差、体重、体重を組とするならびに格納する'(_5人の学生の学生番号_身長_体重,_ならび) :- '5人の学生番号、身長、身長の平均からの差、体重、体重を組とするならびに格納する'(_5人の学生の学生番号_身長_体重,0,0,_身長の平均,_体重の平均,_ならび). '5人の学生番号、身長、身長の平均からの差、体重、体重を組とするならびに格納する'([],_身長の合計,_体重の合計,_身長の平均,_体重の平均,[]) :- '5人の身長、体重の平均を算出する'(_身長合計,_体重合計,_身長の平均,_体重の平均). '5人の学生番号、身長、身長の平均からの差、体重、体重を組とするならびに格納する'([[_学生番号,_身長,_体重]|R1],_身長合計_1,_体重合計_1,_身長の平均,_体重の平均,[[_学生番号,_身長,_身長の平均からの差,_体重,_体重の平均からの差]|R2]) :- '身長合計、体重合計に加算する'(_身長,_体重,_身長合計_1,_体重合計_1,_身長合計_2,_体重合計_2), '5人の学生番号、身長、身長の平均からの差、体重、体重を組とするならびに格納する'(R1,_身長合計_2,_体重合計_2,_身長の平均,_体重の平均,R2), '身長の平均からの差、体重の平均からの差を求める'(_身長,_体重,_身長の平均,_体重の平均,_身長の平均からの差,_体重の平均からの差). '5人の身長、体重の平均を算出する'(_身長合計,_体重合計,_身長の平均,_体重の平均) :- _身長の平均 is _身長の合計 / 5, _体重の平均 is _体重の合計 / 5. '身長合計、体重合計に加算する'(_身長,_体重,_身長合計_1,_体重合計_1,_身長合計_2,_体重合計_2) :- _身長合計_2 is _身長合計_1 + _身長, _体重合計_2 is _体重合計_1 + _体重. '身長の平均からの差、体重の平均からの差を求める'(_身長,_体重,_身長の平均,_体重の平均,_身長の平均からの差,_体重の平均からの差) :- _身長の平均からの差 is _身長 - _身長の平均, _体重の平均からの差 is _体重 - _体重の平均. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/837 # # 単元 C言語配列 # 問題1 Float型配列にマクロで指定した個数の乱数(randを使う)を格納して # その平均値と最大値を出力するプログラムを作成せよ。 # # 問題2 上記の問題で結果を小さい順で表記せよ。 # 環境 Linux gcc C言語 # 期限 今週日曜日まで # よろしくお願いします # # 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納して、小さい順で表記せよ。'(_指定した個数) :- 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納して'(_指定した個数,_ならび), 整列(_ならび,_整列したならび), writef('%t\n',[_整列したならび]). 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納して'(_指定した個数,_ならび) :- findall(_浮動小数点数,( between(1,_指定した個数,_), _浮動小数点数 is (-1 ^ (random(2)+1)) * random(10000) / (random(10000) + 1)), _ならび). 整列([],[]). 整列([A|R],L) :- 分割(A,R,L1,L2), 整列(L1,L1_2), 整列(L2,L2_2), append(L1_2,[A|L2_2],L). 分割(_,[],[],[]). 分割(A,[B|R1],[B|R2],R3) :- B @=< A, 分割(A,R1,R2,R3). 分割(A,[B|R1],R2,[B|R3]) :- A @< B, 分割(A,R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/837 # # 単元 C言語配列 # 問題1 Float型配列にマクロで指定した個数の乱数(randを使う)を格納して # その平均値と最大値を出力するプログラムを作成せよ。 # # 問題2 上記の問題で結果を小さい順で表記せよ。 # 環境 Linux gcc C言語 # 期限 今週日曜日まで # よろしくお願いします # # 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納してその平均値と最大値を出力する'(_指定した個数) :- 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納して'(_指定した個数,_ならび), その平均値と最大値を出力する(_ならび). 'ならびに指定した個数の浮動小数点数の乱数(randを使う)を格納して'(_指定した個数,_ならび) :- findall(_浮動小数点数,( between(1,_指定した個数,_), _浮動小数点数 is (-1 ^ (random(2)+1)) * random(10000) / (random(10000) + 1)), _ならび). その平均値と最大値を出力する(_指定した個数,[_第一要素|_残りならび]) :- その平均値と最大値を出力する(_指定した個数,_ならび,_第一要素,_最大値,0.0,_平均値), writef('平均値 = %t, 最大値 = %t\n',[_平均値,_最大値]). その平均値と最大値を出力する(_指定した個数,[],_最大値,_最大値,_合計,_平均値) :- _平均値 is _合計 / _指定した個数,!. その平均値と最大値を出力する(_指定した個数,[_値|R],_最大値_1,_最大値,_合計_1,_平均値) :- 最大値はどちらか(_値,_最大値_1,_最大値_2), _合計_2 is _合計_1 + _値, その平均値と最大値を出力する(_指定した個数,R,_値,_最大値,_合計_2,_平均値). 最大値はどちらか(_値,_最大値_1,_値) :- _値 > _最大値_1,!. 最大値はどちらか(_値,_最大値_1,_これまでの最大値) :- _値 =< _最大値_1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/828 # # 単元:プログラミング1 # 問題:ある指定した個数の素数の表を出力するプログラムをかけ。 # 環境:gcc C言語 # 期限:11/20まで # # ある指定した個数の素数の表を出力する :- 整数を得る(ある指定した個数,_ある指定した個数 > 2,_ある指定した個数), ある指定した個数の素数の表を出力する(_ある指定した個数). ある指定した個数の素数の表を出力する(_ある指定した個数) :- ある指定した個数の素数ならび(_ある指定した個数,_ある指定した個数の素数ならび), 素数ならびを一行に10要素ずつの表として出力する(_ある指定した個数の素数ならび). ある指定した個数の素数ならび(_ある指定した個数,_ある指定した個数の素数ならび) :- ある指定した個数の逆順素数ならび(1,-1,_ある指定した個数,[3,2],_逆順素数ならび), reverse(_逆順素数ならび,__ある指定した個数の素数ならび),!. ある指定した個数の逆順素数ならび(N,P_M,_ある指定した個数,L,L) :- length(L,_ある指定した個数),!. ある指定した個数の逆順素数ならび(M_1,_Plus_Minus,_ある指定した個数,L1,L) :- 素数は6の倍数の前後にしか現れない(M_1,_Plus_Minus,L1,L2,M_2,_Plus_Minus_2), ある指定した個数の逆順素数ならび(M_2,_Plus_Minus_2,_ある指定した個数,L2,L). 素数は6の倍数の前後にしか現れない(M,-1,L1,[J|L1],N,1) :- N is 6 * M - 1, 'Nは素数か'(N),!. 素数は6の倍数の前後にしか現れない(M,-1,L1,L1,M,1). 素数は6の倍数の前後にしか現れない(M,1,L1,[J|L1],M_2,-1) :- N is 6 * M + 1, 'Nは素数か'(N), M_2 is M + 1,!. 素数は6の倍数の前後にしか現れない(M,1,L1,L1,M_2,-1) :- M_2 is M + 1. 'Nは素数か'(N) :- N_2 is N // 2, between(2,N_2,M), 0 is N mod M,!, fail. 'Nは素数か'(_). 素数ならびを一行に10要素ずつの表として出力する(_素数ならび) :- length(_10個の素数ならび,10), append(_10個の素数ならび,_残り素数ならび,_素数ならび), 一行出力する(_10個の素数ならび), 素数ならびを一行に10要素ずつの表として出力する(_残り素数ならび). 素数ならびを一行に10要素ずつの表として出力する(_残った素数ならび) :- 一行出力する(_残った素数ならび). 一行出力する([]). 一行出力する([A]) :- writef('%t\n',[A]),!. 一行出力する([A|R]) :- writef('%t,',[A]), 一行出力する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/827 # # 単元:プログラミング1 # 問題:ある指定した値までの素数の表を出力するプログラムをかけ。 # 環境:gcc C言語 # 期限:11/20まで # # ある指定した値までの素数の表を出力する :- ある指定した値(_ある指定した値), ある指定した値までの素数の表を出力する(_ある指定した値). ある指定した値(_ある指定した値) :- 整数を得る('素数の表の上限値',_ある指定した値 > 0,_ある指定した値),!. ある指定した値までの素数の表を出力する(_ある指定した値) :- findall(N,( between(2,_ある指定した値,N)), _2からの整数ならび), エラトステネスの篩(_2からの整数ならび,_素数ならび), 素数ならびを一行に10要素ずつの表として出力する(_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([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). 素数ならびを一行に10要素ずつの表として出力する(_素数ならび) :- length(_10個の素数ならび,10), append(_10個の素数ならび,_残り素数ならび,_素数ならび), 一行出力する(_10個の素数ならび), 素数ならびを一行に10要素ずつの表として出力する(_残り素数ならび). 素数ならびを一行に10要素ずつの表として出力する(_残った素数ならび) :- 一行出力する(_残った素数ならび). 一行出力する([]). 一行出力する([A]) :- writef('%t\n',[A]),!. 一行出力する([A|R]) :- writef('%t,',[A]), 一行出力する(R). % 以下のサイトは # # 連番のエロ画像をダウンロードするスクリプトください # # # %%% バッチファイル anonymouget %%% # anonymousget2 $2 $3 | ftp -n $1 # # %%% バッチファイル anonymousget2 %%% # echo user anonymous ***** # echo binary # echo get $1 $2 | plustosp # echo close # echo quit # # %%% plustosp.c %%% # #include # main() { # unsigned int c0,n; # n=0; # while((c0=getchar()) != EOF) { # if(c0=='+') # putchar(32); # else # putchar(c0); # } # } 連番のエロ画像をダウンロードする(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点) :- 連番ファイルをダウンロードする(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点). 連番ファイルをダウンロードする(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点) :- anonymousgetの準備, ダウンロード対象ファイルを得る(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点,_連番,_ファイル名_2), anonymousget(_ftpサイト名,_ファイル名_2,_ファイル名_2), _連番終点 = _連番. ダウンロード対象ファイルを得る(_ftpサイト名,_ファイル名,_サフィックス,_連番桁数,_連番起点,_連番終点,_連番,_ファイル名_2) :- between(_連番起点,_連番終点,_連番), 整数から文字列(_連番桁数,_連番,_連番文字列), atomic_list_concat([_ファイル名,_連番文字列,'.',_サフィックス],_ファイル名_2). anonymousgetの準備 :- バッチファイルanonymousgetの生成, コマンドデータanonymousget2の生成, 実行プログラムplustospの生成. バッチファイルanonymousgetの生成 :- open(anonymousget,write,Outstream), write(Outstream,'anonymousget2 $2 $3 | ftp -n $1\n'), close(Outstream), shell('chmod 777 anonymousget'),!. コマンドデータanonymousget2の生成 :- open(anonymousget2,write,Outstream), write(Outstream,'echo user anonymous *****\necho binary\necho get $1 $2 | plustosp\necho close\necho quit\n'), close(Outstream). 実行プログラムplustospの生成 :- open('plustosp.c',write,Outstream), write(Outstream,'#include \nmain() {\n unsigned int c0,n;\n n=0;\n while((c0=getchar()) != EOF) {\n if(c0==\'+\')\n putchar(32);\n else\n putchar(c0);\n }\n}\n'), close(Outstream), shell('cc -o plustosp plustosp.c';chmod 777 plustosp),!. anonymousget(_ftpサイト名,_入力ファイル名,_出力ファイル名) :- atomic_list_concat(['anonymousget ',_ftpサイト名,' "',_入力ファイル名,'" "',_出力ファイル名,'"'],S), shell(S),!. 整数から文字列(_文字桁,_整数,_数値文字列) :- length(L,_文字桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,'0'). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/228 # # ご教示お願いいたします。 # # ・DBMS名とバージョン # SQL Server2008 # # ・テーブルデータ # テーブル名:住所_MST # ID 住所 # ------------ # 001 住所A # 002 住所B # 003 住所C # 004 住所D # 005 住所E # 006 住所F # 008 住所G # 010 住所H # # ・欲しい結果 # IDに007を設定してINSERTしたいのですが上手くSQL文が浮かびませんでした # 仕様としましては一番若いIDから、設定されていないIDを取得してINSERTします # なお、IDはキー設定されています # # 結果は下記のようになります # ID 住所 # ------------ # 001 住所A # 002 住所B # 003 住所C # 004 住所D # 005 住所E # 006 住所F # 007 新住所 # 008 住所G # 010 住所H # # '・DBMS名とバージョン SQL Server2008 ・テーブルデータ テーブル名:住所_MST ID 住所 ------------ 001 住所A 002 住所B 003 住所C 004 住所D 005 住所E 006 住所F 008 住所G 010 住所H ・欲しい結果 IDに007を設定してINSERTしたいのですが上手くSQL文が浮かびませんでした 仕様としましては一番若いIDから、設定されていないIDを取得してINSERTします なお、IDはキー設定されています 結果は下記のようになります ID 住所 ------------ 001 住所A 002 住所B 003 住所C 004 住所D 005 住所E 006 住所F 007 新住所 008 住所G 010 住所H '(_住所) :- '一番若いIDから、設定されていないIDを取得してINSERTします'(_住所). '一番若いIDから、設定されていないIDを取得してINSERTします'(_住所) :- between(1,999,N), 頭部零文字列(3,N,_ID), \+(住所_MST(_ID,_)), assertz(住所_MST(_ID,_住所)),!. 頭部零文字列(_長さ,_整数,_頭部零文字列) :- length(_頭部零文字ならび,_長さ), number_chars(_整数,Chars), append(L0,Chars,_頭部零文字ならび), all(L0,'0'), atom_chars(_頭部零文字列,_頭部零文字ならび),!. all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/649 # # [1] 情報処理演習 # [2] ここのNo.384です # http://ime.nu/s2.etowns.slyip.net/~c_cpp_homework/cgi-bin/joyful/joyful.cgi # 9. x を-3.14 以上 3.14 以下の範囲で 0.02 ずつ変化させ, y = cos x 及び y = sin xの値を画面表示するプログラムを作成せよ.ただし, y = cos x 及び y = sin xは,次式に示す多項式 # cos(X) = 1 - x^2/2! + x^4/4! - x^6/6! + x^8/8! - x^10/10! # sin(X) = x - x^3/3! + x^5/5! - x^7/7! + x^9/9! - x^11/11! # により計算すること.また,これらの計算を行う関数のプロトタイプをそれぞれ「double # mycos(double)」,「double mysin(double)」とし,3 で作成した「kaijo()」関数を利用すること. # # 14. 1 以上の整数 n を入力し,n の階乗を計算して画面表示するような void 型の関数 void # factorial(int) を用いて n の階乗を求めるようなプログラムを作成せよ.またこのプログラムと 3 で作成したプログラムを比較せよ. 'x を-3.14 以上 3.14 以下の範囲で 0.02 ずつ変化させ, y = cos x 及び y = sin xの値を画面表示するプログラムを作成せよ.ただし, y = cos x 及び y = sin xは,次式に示す多項式 cos(X) = 1 - x^2/2! + x^4/4! - x^6/6! + x^8/8! - x^10/10! sin(X) = x - x^3/3! + x^5/5! - x^7/7! + x^9/9! - x^11/11! により計算すること' :- between(1,314,N), X is -3.14 + N * 0.02, 'y = cos x 及び y = sin xの値を表示する'(X), N = 314. 'y = cos x 及び y = sin xの値を表示する'(X) :- cos(X,_cosX), sin(X,_sinX), 表示する(X,_cosX,_sinX). cos(X,_cosX) :- findall(U,( for(1,0,5), N_2 is N * 2, 階乗(N_2,N_2_の階乗), U is (((-1) ^ N) * (X ^ 2)) / N_2_の階乗), _cosX). sin(X,_cosX) :- findall(U,( for(1,0,5), N_2 is 1 + N * 2, 階乗(N_2,N_2_の階乗), U is (((-1) ^ N) * (X ^ 2)) / N_2_の階乗), _sinX), 表示する(X,_cosX,_sinX) :- writef('%t: %t, %t\n',[X,_cosX,_sinX]). % 以下のサイトは # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):◎見にくくなりそうなので一番下に書きます。 # [3] 環境 #  [3.1] OS:Windows #  [3.2] コンパイラ名とバージョン:VC++ 2005 #  [3.3] 言語:C++ # [4] 期限:明日 11/3 # [5] その他の制限: 標準入出力ストリームで、 # # 整数除算による商の計算表(下記の例を参照)を表示する. # # # | 1 2 3 4 5 6 7 8 9 # --+------------------ # 1 | 1 0 0 0 0 0 0 0 0 # 2 | 2 1 0 0 0 0 0 0 0 # 3 | 3 1 1 0 0 0 0 0 0 # 4 | 4 2 1 1 0 0 0 0 0 # 5 | 5 2 1 1 1 0 0 0 0 # 6 | 6 3 2 1 1 1 0 0 0 # 7 | 7 3 2 1 1 1 1 0 0 # 8 | 8 4 2 2 1 1 1 1 0 # 9 | 9 4 3 2 1 1 1 1 1 # # これを出力するようなプログラムを教えてください。 '整数除算による商の計算表(下記の例を参照)を表示する' :- 商の計算表本体(_商の計算表本体), 商の計算表見出し表示, 商の計算表本体の表示(_商の計算表本体). 商の計算表本体(_商の計算表本体) :- findall(_表示行,( between(1,9,_被除数), 表示行(_被除数,_表示行)), _商の計算表本体). 表示行(_被除数,_表示行) :- findall(N,( between(1,9,_除数), N is _被除数 // _除数), _商表示ならび), atomic_list_concat([_被除数,'|'|_商表示ならび],' ',_表示行). 商の計算表見出し表示 :- write(' | 1 2 3 4 5 6 7 8 9\n--+------------------\n'). 商の計算表本体の表示(_商の計算表本体) :- append(_,[_表示行|R],_商の計算表本体), write('%t\n',[_表示行]), R = []. % 以下のサイトは # このディレクトリの索引 # [1] 授業単元:プログラミング # [2] 問題文( # キーボードから入力したメニュー番号に沿った図形を「*」で表示するプログラムを # 作成してください。なお、プログラム作成時は以下の仕様に従ってください。 # ファイル名: kadai3.c # 【 問題作成時の注意点 】 # ・メニュー番号と図形の種類は以下の通りとします。なお、キーボードから # 入力した値が以下の番号以外の場合、再びメニュー番号を入力するように # してください。 # 1 三角形 # 2 四角形 # ・図形の段数(高さ)は、キーボードから入力してください。なお、キーボード # から入力した数が1 以下の場合、エラーメッセージを表示し、exit 関数で # プログラムを終了してください。 # エラーメッセージの例) wrong number # ・図形の表示には関数を利用してください。関数のプロトタイプ宣言は以下の # 通りとします。 # void DrawTriangle(int); # void DrawRectangle(int); # [3] 環境 #  [3.1] OS: Windows #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C++ # [4] 期限: ([2006年11月2日17:30まで # [5] その他の制限:なし 'キーボードから入力したメニュー番号に沿った図形を「*」で表示するプログラムを 作成してください。なお、プログラム作成時は以下の仕様に従ってください。 l・メニュー番号と図形の種類は以下の通りとします。なお、キーボードから 入力した値が以下の番号以外の場合、再びメニュー番号を入力するように してください。 1 三角形 2 四角形 ・図形の段数(高さ)は、キーボードから入力してください。なお、キーボード から入力した数が1 以下の場合、エラーメッセージを表示し、exit 関数で プログラムを終了してください。' :- 'キーボードから入力した 1 三角形 2 四角形 のメニュー番号'(_メニュー番号), 'メニュー番号に沿った図形を「*」で表示する'(_メニュー番号). 'キーボードから入力した 1 三角形 2 四角形 のメニュー番号'(_メニュー番号) :- write('左側の数字で選択してください\n\n1 三角形\n2 四角形\n\n'), 整数を得る('メニュー番号[1/2]',member(_メニュー番号,[1,2]),_メニュー番号). 'メニュー番号に沿った図形を「*」で表示する'(1) :- 三角形の表示. 'メニュー番号に沿った図形を「*」で表示する'(2) :- 四角形の表示. 三角形の表示 :- '図形の段数(高さ)を入力してください'(_図形の高さ), 三角形の図形像(_図形の高さ,_図形像), 図形表示(_図形像). 三角形の図形像(_図形の高さ,_図形像,_図形像) :- findall(_表示星列,( between(1,_図形の段数,_現在の段), 三角形の表示星列(_現在の段,_表示星列)), _図形像). 三角形の表示星列(_現在の段,_表示星列) :- length(L,_現在の段), all(L,'*'), atomic_list_concat(L,_表示星列). 四角形の表示 :- 幅を入力してください(_図形の幅), '図形の段数(高さ)は、キーボードから入力してください'(_図形の高さ), 四角形の図形像(_図形の幅,_図形の高さ,_図形像), 図形の表示(_図形像). 四角形の図形像(_図形の幅,_図形の高さ,_図形像) :- 表示星列(_図形の幅,_表示星列), findall(_表示星列,( between(1,_図形の高さ,_), 四角形の表示星列(_図形の幅,_表示星列)), _図形像). 図形の表示(_図形像) :- append(_,[_表示星列|R],_図形像), writef('%t\n',[_表示星列]), R = []. 四角形の表示星列(_現在の段,_表示星列) :- length(L,_現在の段), all(L,'*'), atomic_list_concat(L,_表示星列). '図形の段数(高さ)を入力してください'(_図形の高さ) :- 整数を得る(図形の段数,_図形の高さ), 図形の高さ診断(_図形の高さ),!. '図形の段数(高さ)を入力してください'(_図形の高さ) :- '図形の段数(高さ)を入力してください'(_図形の高さ). 図形の高さ診断(_図形の高さ) :- _図形の高さ > 1,!. 図形の高さ診断(_図形の高さ) :- writef('入力された図形の高さ %t はこの図形の高さとして適切でありません。\n再入力をお願いします。\n',[_図形の高さ]), fail. '幅を入力してください'(_図形の幅) :- 整数を得る(図形の段数,_図形の幅), 図形の幅診断(_図形の幅),!. '幅を入力してください'(_図形の幅) :- '幅を入力してください'(_図形の幅). 図形の幅診断(_図形の幅) :- _図形の幅 > 1,!. 図形の幅診断(_図形の幅) :- writef('入力された図形の幅 %t はこの図形の幅として適切でありません。\n再入力をお願いします。\n',[_図形の幅]), fail. all([],_). all([A|R],A) :- all(R). % 以下のサイトは # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): # レポート課題:フェルマーの予想 # フェルマーは、x^n+y^n=z^n (x,y,z,n:整数)においてn≧3に対して、 # この式を満たすものはないと断言した。これはつい最近になって証明された。 # n=3に対して、x,y,z≦100の範囲内でこれに対する反例がないか確認せよ。 # ヒント: # 一見すると、3重ループになるようであるが、 # うまく工夫して2重ループにせよ。 # [3] 環境 #  [3.1] OS:Windows #  [3.2] コンパイラ名とバージョン:Microsoft Visual C++ 6.0 #  [3.3] 言語: C++ # [4] 期限: 2006年11月7日まで # [5] その他の制限: 基礎的な知識で出来るプログラミングでおねがいします。 'x^n+y^n=z^n'(_x,_y,_z) :- '_x,_y,_z'(_x,_y,_z), '_x^3,_y^3,_z^3'(X,Y,Z), Z is X + Y. '_x,_y,_z'(_x,_y,_z) :- between(1,100,_x), between(1,100,_y), between(1,100,_z). '_x^3,_y^3,_z^3'(X,Y,Z) :- 'x^n'(_z,3,Z), 'x^n'(_x,3,X), 'x^n'(_y,3,Y). 'x^n'(_,0,1) :- !. 'x^n'(_x,N,X) :- N_1 is N - 1, 'x^n'(_x,N_1,X2), X is _x * X2. % 以下のサイトは # # 値の決まらない6×6ビンゴの表を作成する # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- findall(_6要素の変数リスト,( between(1,6,_), length(_6要素の変数リスト,6)), _ビンゴの表). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- length(_ビンゴの表,6), '値の決まらない6×6ビンゴの表'(_ビンゴの表). '値の決まらない6×6ビンゴの表'([]). '値の決まらない6×6ビンゴの表'([_6要素の変数リスト|R]) :- length(_6要素の変数リスト,6), '値の決まらない6×6ビンゴの表'(R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- '値の決まらない6×6ビンゴの表を作成する'(6,_ビンゴの表). '値の決まらない6×6ビンゴの表を作成する'(0,[]) :- !. '値の決まらない6×6ビンゴの表を作成する'(N,[_6要素の変数リスト|R]) :- length(_6要素の変数リスト,6), N_1 is N - 1, '値の決まらない6×6ビンゴの表を作成する'(N_1,R). %%%%%%%%%%%%%%%% length/2 を使用しないと %%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- '値の決まらない6×6ビンゴの表を作成する'(6,_ビンゴの表). '値の決まらない6×6ビンゴの表を作成する'(0,[]) :- !. '値の決まらない6×6ビンゴの表を作成する'(N,[_6要素の変数リスト|R]) :- '6要素の変数リストを生成する'(6,_6要素の変数リスト), N_1 is N - 1, '値の決まらない6×6ビンゴの表を作成する'(N_1,R). '6要素の変数リストを生成する'(0,[]). '6要素の変数リストを生成する'(N,[_|R]) :- N_1 is N - 1, '6要素の変数リストを生成する'(N_1,[_|R]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 以下のサイトは # # 値の決まらない6×6ビンゴの表を作成する # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- findall(_6要素の変数リスト,( between(1,6,_), length(_6要素の変数リスト,6)), _ビンゴの表). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- length(_ビンゴの表,6), '値の決まらない6×6ビンゴの表'(_ビンゴの表). '値の決まらない6×6ビンゴの表'([]). '値の決まらない6×6ビンゴの表'([_6要素の変数リスト|R]) :- length(_6要素の変数リスト,6), '値の決まらない6×6ビンゴの表'(R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- '値の決まらない6×6ビンゴの表を作成する'(6,_ビンゴの表). '値の決まらない6×6ビンゴの表を作成する'(0,[]) :- !. '値の決まらない6×6ビンゴの表を作成する'(N,[_6要素の変数リスト|R]) :- length(_6要素の変数リスト,6), N_1 is N - 1, '値の決まらない6×6ビンゴの表を作成する'(N_1,R). %%%%%%%%%%%%%%%% length/2 を使用しないと %%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- '値の決まらない6×6ビンゴの表を作成する'(6,_ビンゴの表). '値の決まらない6×6ビンゴの表を作成する'(0,[]) :- !. '値の決まらない6×6ビンゴの表を作成する'(N,[_6要素の変数リスト|R]) :- '6要素の変数リストを生成する'(6,_6要素の変数リスト), N_1 is N - 1, '値の決まらない6×6ビンゴの表を作成する'(N_1,R). '6要素の変数リストを生成する'(0,[]). '6要素の変数リストを生成する'(N,[_|R]) :- N_1 is N - 1, '6要素の変数リストを生成する'(N_1,[_|R]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 以下のサイトは # [1] 授業単元:情報処理概論 # [2] 問題文(含コード&リンク):0から99の乱数を使って6×6ビンゴの表を作成しなさい。 # [3] 環境 #  [3.1] OS: WindowsXP #  [3.2] コンパイラ名とバージョン:BorlandC++ #  [3.3] 言語:C++ # [4] 期限: 10月30日まで # [5] その他の制限: # よろしくお願いします '0から99の乱数を使って6×6ビンゴの表を作成しなさい。'(_ビンゴの表) :- findall(L,( between(1,6,_), length(L,6)), _ビンゴの表), flatten(_ビンゴの表,_重複のないリスト), '0から99の乱数を使って値を埋める'([],_重複のないリスト). '0から99の乱数を使って値を埋める'(_重複のないリスト,_重複のないリスト) :- !. '0から99の乱数を使って値を埋める'(L,_重複のないリスト) :- _乱数 is random(100), \+(member(_乱数,L)), '0から99の乱数を使って値を埋める'([_乱数|L],_重複のないリスト). '0から99の乱数を使って値を埋める'(L,_重複のないリスト) :- '0から99の乱数を使って値を埋める'(L,_重複のないリスト). % 以下のサイトは # [1] 授業単元:情報処理概論 # [2] 問題文(含コード&リンク):0から99の乱数を使って6×6ビンゴの表を作成しなさい。 # [3] 環境 #  [3.1] OS: WindowsXP #  [3.2] コンパイラ名とバージョン:BorlandC++ #  [3.3] 言語:C++ # [4] 期限: 10月30日まで # [5] その他の制限: # よろしくお願いします '0から99の乱数を使って6×6ビンゴの表を作成しなさい。'(_ビンゴの表) :- findall(L,( between(1,6,_), length(L,6)), _ビンゴの表), flatten(_ビンゴの表,_重複のないならび), '0から99の乱数を使って重複のないならびを作る'([],_重複のないならび). '0から99の乱数を使って重複のないならびを作る'(_重複のないならび,_重複のないならび) :- !. '0から99の乱数を使って重複のないならびを作る'(L,_重複のないならび) :- _乱数 is random(100), \+(member(_乱数,L)), '0から99の乱数を使って重複のないならびを作る'([_乱数|L],_重複のないならび). '0から99の乱数を使って重複のないならびを作る'(L,_重複のないならび) :- '0から99の乱数を使って重複のないならびを作る'(L,_重複のないならび). % 以下のサイトは # [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/425 # # [1]C言語 プログラミング # [2]http://ime.nu/codepad.org/UrZpvr24 # 制御構造について。 # 文字制限のためコードでお願いします。 # [3]Windows 7 # [3.1]vs2010 # [3.2]C言語 # [4]明日 午前中まで # [5]現在制御構造について学んでいます。 # 配列・ポインタ・関数はまだです。 # # /*問題1 # n>=m>=2を満たす整数nとmをキーボードから入力するとm進数でnを出力するプログラムを # 作成せよ。ただしm<=10としていい。表示は逆順でも良い。 # # 問題2 # 2<=n<=10000を満たす整数nをキーボードから入力すると2以上n以下の素数とその個数を表示する # プログラムを作成せよ。ただし最後の行に素数の個数のみを表示しその他の各行には # 最後の一行を除いてちょうど10個の素数を表示しなければならない。 # 例:n=50 # 2 3 5 7 11 13 17 19 23 29 # 31 37 41 43 47 # 15 # # 問題3 # 絶対値が1未満の実数xと正の整数nが入力されるまで繰り返してキーボードからxとnを入力し # xとnが正しく入力されたら関数log(1+x)の近似値を次の式で計算して表示するプログラム。 # # log(x+1)=nΣi=1 (-1)^i+1 / i    のx^i    # # 例:n=100 x=0.5とすると0.405465と表示される。*/ '絶対値が1未満の実数xと正の整数nが入力されるまで繰り返してキーボードからxとnを入力しxとnが正しく入力されたら関数log(1+x)の近似値を次の式で計算して表示する' :- '絶対値が1未満の実数xと正の整数nが入力されるまで繰り返してキーボードからxとnを入力し'(_x,_n), '関数log(1+x)の近似値を次の式で計算して表示する'(_x,_n). '絶対値が1未満の実数xと正の整数nが入力されるまで繰り返してキーボードからxとnを入力し'(_x,_n) :- 実数を得る('絶対値が1未満の実数x',abs(_x) < 1.0,_x), 整数を得る('正の整数n',_n > 0,_n),!. '絶対値が1未満の実数xと正の整数nが入力されるまで繰り返してキーボードからxとnを入力し'(_x,_n) :- '絶対値が1未満の実数xと正の整数nが入力されるまで繰り返してキーボードからxとnを入力し'(_x,_n). '関数log(1+x)の近似値を次の式で計算して表示する'(_x,_n) :- '関数log(1+x)の近似値を次の式で計算して'(_x,_n,_近似値), writef('関数log(1+x)の近似値は %t です\n',[_近似値]). '関数log(1+x)の近似値を次の式で計算して'(_x,_n,_近似値) :- findsum(U,( between(1,_n,_x), U is (((-1) ^ _i / _i) * _x ^ _i)), _近似値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/425 # # [1]C言語 プログラミング # [2]http://ime.nu/codepad.org/UrZpvr24 # 制御構造について。 # 文字制限のためコードでお願いします。 # [3]Windows 7 # [3.1]vs2010 # [3.2]C言語 # [4]明日 午前中まで # [5]現在制御構造について学んでいます。 # 配列・ポインタ・関数はまだです。 # # /*問題1 # n>=m>=2を満たす整数nとmをキーボードから入力するとm進数でnを出力するプログラムを # 作成せよ。ただしm<=10としていい。表示は逆順でも良い。 # # 問題2 # 2<=n<=10000を満たす整数nをキーボードから入力すると2以上n以下の素数とその個数を表示する # プログラムを作成せよ。ただし最後の行に素数の個数のみを表示しその他の各行には # 最後の一行を除いてちょうど10個の素数を表示しなければならない。 # 例:n=50 # 2 3 5 7 11 13 17 19 23 29 # 31 37 41 43 47 # 15 # # 問題3 # 絶対値が1未満の実数xと正の整数nが入力されるまで繰り返してキーボードからxとnを入力し # xとnが正しく入力されたら関数log(1+x)の近似値を次の式で計算して表示するプログラム。 # # log(x+1)=nΣi=1 (-1)^i+1 / i    のx^i    # # 例:n=100 x=0.5とすると0.405465と表示される。*/ '2<=n<=10000を満たす整数nをキーボードから入力すると2以上n以下の素数とその個数を表示する。ただし最後の行に素数の個数のみを表示しその他の各行には最後の一行を除いてちょうど10個の素数を表示しなければならない。' :- '2<=n<=10000を満たす整数nをキーボードから入力すると'(_n), '2以上n以下の素数とその個数を表示する'(_n). '2<=n<=10000を満たす整数nをキーボードから入力すると'(_n) :- 整数を得る('2<=n<=10000を満たす整数n',(_n >= 2,_n =< 10000),_n),!. '2以上n以下の素数とその個数を表示する。ただし最後の行に素数の個数のみを表示しその他の各行には最後の一行を除いてちょうど10個の素数を表示しなければならない。'(_n) :- '2以上n以下の素数とその個数'(_2以上n以下の素数ならび,_個数), 'その他の各行には最後の一行を除いてちょうど10個の素数を表示しなければならない'(_2以上n以下の素数ならび), 最後の行に素数の個数のみを表示し(_個数). '2以上n以下の素数とその個数'(_2以上n以下の素数ならび,_個数) :- findall(N,between(2,_n,N),L), エラトステネスの篩(L,_2以上n以下の素数ならび), length(_2以上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). 'その他の各行には最後の一行を除いてちょうど10個の素数を表示しなければならない'(L) :- 最後の一行を除いて(L),!. 'その他の各行には最後の一行を除いてちょうど10個の素数を表示しなければならない'([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10|R]) :- atomic_list_concat([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10],',',_10個の素数), writef('%t\n',[_10個の素数文字列]). 'その他の各行には最後の一行を除いてちょうど10個の素数を表示しなければならない'(R). 最後の一行を除いて([]) :- !. 最後の一行を除いて(L) :- length(L,_要素数), _要素数 =< 10, atomic_list_concat(L,',',_10個以下の素数文字列), writef('%t\n',[_10個以下の素数文字列]),!. 最後の行に素数の個数のみを表示し(_個数) :- writef('%t\n',[_個数]). % 以下のサイトは # 出典:: 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 として実行してみよ。分布は、**** を打って表示せよ。 # */ # 'コイン投げも同様にして、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,_文字列). % 以下のサイトは # 出典 :: C言語の宿題片付けます 160代目 #400 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/QdOnaWYm # # /* # ビンゴゲームを作る # # 仕様 # ・5×5のビンゴカードをint型の2次元配列として宣言する # ・ビンゴカードの数字は重複しない1〜100の乱数を作り、それから先頭の25個をビンゴカードに適用 # ・最初にビンゴカード作成に使うための重複しない100個の乱数を見やすい形で表示 # ・値を交換する処理は関数化する # ・実際のビンゴゲームのようにガラガラで1つずつ数字が出てくる # ・ガラガラは1〜100までの重複しない乱数を作る機械であり、ビンゴカード作成に用いた乱数列とガラガラで使う乱数列は別物である # ・ビンゴカード作成用の乱数とガラガラ用の乱数はヒープ領域に確保した配列に格納 # ・カードの縦、横、斜めのいずれかがそろったらゲーム終了 # */ # :- dynamic(賞品/1). ビンゴ参加者(ケイスケ). ビンゴ参加者(ユウヤ). ビンゴ参加者(タダシ). ビンゴ参加者(マッチ). ビンゴ参加者(トオル). 賞品('フェラーリ(模型)'). 賞品('コルト45(模型)'). 賞品(西竹一の使っていた拍車). 賞品(ティーボールセット). 賞品(ビンゴセット). ビンゴゲーム :- findall(_ビンゴ参加者,ビンゴ参加者(_ビンゴ参加者),_ビンゴ参加者ならび), ビンゴゲーム(_ビンゴ参加者ならび). ビンゴゲーム(_ビンゴ参加者ならび) :- ゲーム参加者のビンゴカード(_ビンゴ参加者ならび,_ビンゴカードならび), 'ガラガラは1〜100までの重複しない乱数を作る機械であり、ビンゴカード作成に用いた乱数列とガラガラで使う乱数列は別物である'(_ガラガラで使う乱数列), 参加者全員がビンゴとなるまでガラガラを繰り返す(_ビンゴカードならび,_ガラガラで使う乱数列). 参加者全員がビンゴとなるまでガラガラを繰り返す([],_) :- write('ビンゴ終了\nご苦労さまでした\n'),!. 参加者全員がビンゴとなるまでガラガラを繰り返す(_参加者ビンゴカードならび,L1) :- ガラガラ(L1,_数,L2), ビンゴになったカードを探し賞品を渡してそのカードを削除(_数,_参加者ビンゴカードならび,_ビンゴになった人を削除した参加者ビンゴカードならび), 参加者全員がビンゴとなるまでガラガラを繰り返す(_ビンゴになった人を削除した参加者ビンゴカードならび,L2). '5×5のビンゴカードをint型の2次元配列として宣言する'(_ビンゴカード) :- length(_ビンゴカード,5), findall(L,( member(L,_ビンゴカード), length(L,5)),_ビンゴカード). ゲーム参加者のビンゴカード(_ビンゴ参加者ならび,_ビンゴカードならび) :- findall([_ビンゴ参加者,_ビンゴカード],( member(_ビンゴ参加者,_ビンゴ参加者ならび), 'ビンゴカードの数字は重複しない1〜100の乱数を作り、それから先頭の25個をビンゴカードに適用'(_ビンゴカード)),_ビンゴカードならび). 'ビンゴカードの数字は重複しない1〜100の乱数を作り、それから先頭の25個をビンゴカードに適用'(_ビンゴカード) :- 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(L), それから先頭の25個をビンゴカードに適用(L,_ビンゴカード). 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(L) :- findall(N,between(1,100,N),L1), 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(100,L1,L). 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(0,_,[]) :- !. 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(Nth,L1,[N|R2]) :- '重複しない1〜100の乱数'(Nth,L1,N,L2), Nth_1 is Nth - 1, 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(Nth_1,L2,R2). '重複しない1〜100の乱数'(Nth,L1,N,L2) :- Nth0 is random(Nth), length(L0,Nth0), append(L0,[N|R1],L1), append(L0,R1,L2),!. それから先頭の25個をビンゴカードに適用(_重複しない100個の乱数ならび,_ビンゴカード) :- ビンゴカード(_重複しない100個の乱数ならび,_ビンゴカード). ビンゴカード(_重複しない100個の乱数ならび,_ビンゴカード) :- _ビンゴカード=[[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_]], flatten(_ビンゴカード,L), append(L,_,_重複しない100個の乱数ならび). 'ガラガラは1〜100までの重複しない乱数を作る機械であり、ビンゴカード作成に用いた乱数列とガラガラで使う乱数列は別物である'(_ガラガラで使う乱数列) :- 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(_ガラガラで使う乱数列),!. ビンゴになったカードを探し賞品を渡してそのカードを削除(_,[],[]). ビンゴになったカードを探し賞品を渡してそのカードを削除(_数字,[[_ビンゴ参加者,_ビンゴカード_1]|R1],R) :- 一致した数字があったら穴をあける(_数字,_ビンゴカード_1,_ビンゴカード_2), ビンゴになったカードを探し賞品を渡してそのカードを削除_2(_数字,[[_ビンゴ参加者,_ビンゴカード_2]|R1],R). ビンゴになったカードを探し賞品を渡してそのカードを削除_2(_数字,[[_ビンゴ参加者,_ビンゴカード_1]|R1],R) :- ビンゴだったら賞品を渡してその人は上がり(_ビンゴカード_1,_ビンゴ参加者), ビンゴになったカードを探し賞品を渡してそのカードを削除(_数字,R1,R),!. ビンゴになったカードを探し賞品を渡してそのカードを削除_2(_数字,[[_ビンゴ参加者,_ビンゴカード_1]|R1],[[_ビンゴ参加者,_ビンゴカード_1]|R]) :- ビンゴになったカードを探し賞品を渡してそのカードを削除(_数字,R1,R). ビンゴだったら賞品を渡してその人は上がり(_ビンゴカード,_ビンゴ参加者) :- ビンゴ(_ビンゴカード), ビンゴ表示(_ビンゴカード), 賞品を渡す(_ビンゴ参加者),!. 一致した数字があったら穴をあける(_数字,_ビンゴカード_1,_ビンゴカード_2) :- findall(L2,( member(L,_ビンゴカード_1), 一致した場合だけ穴を開ける(_数字,L,L2)),_ビンゴカード_2). 一致した場合だけ穴を開ける(_数字,L,L2) :- append(L0,[_数字|R],L), append(L0,[穴|R],L2),!. 一致した場合だけ穴を開ける(_,L,L). ビンゴ([穴,_,_,_,_],[_,穴,_,_,_,_],[_,_,穴,_,_],[_,_,_,穴,_],[_,_,_,_,穴]) :- !. ビンゴ([_,_,_,_,穴],[_,_,_,穴,_],[_,_,穴,_,_],[_,穴,_,_,_,_],[穴,_,_,_,_]) :- !. ビンゴ(_ビンゴカード) :- member(L,_ビンゴカード), all(L,穴),!. ビンゴ(_ビンゴカード) :- 転置(_ビンゴカード,_ビンゴカード_2), member(L,_ビンゴカード_2), all(L,穴),!. ビンゴ表示(_ビンゴカード) :- forall(member(L,_ビンゴカード),ビンゴ行表示(L)). ビンゴ行表示([]) :- write('\n'). ビンゴ行表示([A|R]) :- 表示変換(A,B), writef('%w ',[B]), ビンゴ行表示(R). 表示変換(穴,穴) :- !. 表示変換(N,A) :- N < 10, atomic_list_concat([' ',N],A),!. 表示変換(N,A) :- atom_number(A,N). 賞品を渡す(_参加者) :- retract(賞品(_賞品)), writef('%t君はビンゴになりました。賞品は %t です!\n',[_参加者,_賞品]),!. all([],_). all([A|R],A) :- all(R,A). ガラガラ(L1,_数字,L2) :- length(L1,_nth_1), Nth is random(_nth_1) + 1, '重複しない1〜100の乱数'(Nth,L1,_数字,L2). % 以下のサイトは '99 bottles of beer on the wall' :- A = ' bottles of beer on the wall, ', B = ' bottles of beer,\nTake one down and pass it around, ', C = ' bottles of beer on the wall.\n\n', D = '1 bottle of beer on the wall, 1 bottle of beer,\nTake one down, and pass it around,\nNow they are all gone.\n', '99 bottles of beer on the wall'(A,B,C,D). '99 bottles of beer on the wall'(A,B,C,D) :- findall([N,C,N,A,N,B],between(2,99,N),L_1), reverse([D|L_1],L_2), flatten(L_2,[_,_|L_3]), atomic_list_concat(L_3,_99_bottles_of_beer_on_the_wall), write(_99_bottles_of_beer_on_the_wall). % 以下のサイトは '99 bottles of beer on the wall' :- ' bottles of beer on the wall, ' = A, ' bottles of beer, Take one down and pass it around, ' = B, ' bottles of beer on the wall. ' = C, '1 bottle of beer on the wall, 1 bottle of beer, Take one down, and pass it around, Now they are all gone. ' = D, findall([N,C,N,A,N,B],between(2,99,N),L_1), reverse([D|L_1],L_2), flatten(L_2,[_,_|L_3]), atomic_list_concat(L_3,_99_bottles_of_beer_on_the_wall), write(_99_bottles_of_beer_on_the_wall). % 以下のサイトは a(' bottles of beer on the wall, '). b(' bottles of beer, Take one down and pass it around, '). c(' bottles of beer on the wall. '). d('1 bottle of beer on the wall, 1 bottle of beer, Take one down, and pass it around, Now they are all gone. '). '99 bottles of beer on the wall'(_99_bottles_of_beer_on_the_wall) :- a(A), b(B), c(C), d(D), findall_flatten_concat_2(A,B,C,D,_99_bottles_of_beer_on_the_wall). findall_flatten_concat_2(A,B,C,D,S) :- findall([N,C,N,A,N,B],( for(99,N,2)), L_1), flatten(L_1,[_,_|L_2]), append(L_2,[D],L_3), atomic_list_concat(L_3,S). % 以下のサイトは '99 bottles of beer on the wall' :- findall([N,' bottles of beer on the wall.\n\n',N,' bottles of beer on the wall, ',N,' bottles of beer,\nTake one down and pass it around, '],between(2,99,N),L_1), reverse(['1 bottle of beer on the wall, 1 bottle of beer,\nTake one down, and pass it around,\nNow they are all gone.\n'|L_1],L_2), flatten(L_2,[_,_|L_3]), atomic_list_concat(L_3,_99_bottles_of_beer_on_the_wall), write(_99_bottles_of_beer_on_the_wall). % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/354 # # [1] 授業単元: 繰り返し # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/ULbfD1pL # 冪乗計算 # # /*キーボードから整数n (2<=n<=9) を入力し # 値をすべて表示するプログラムを作成せよ。 # # 例)n = 5 の場合 # 2 4 # 3 9 27 # 4 16 64 256 # 5 25 125 625 3125 */ 'キーボードから整数n (2<=n<=9) を入力し、i^j (2<=i<=n,1<=j<=i) の値をすべて表示する' :- 'キーボードから整数n (2<=n<=9) を入力し'(_整数n), 'i^j (2<=i<=n,1<=j<=i) の値をすべて表示する'(2,_n), write('\n'). 'キーボードから整数n (2<=n<=9) を入力し'(_整数n) :- 整数を得る('整数n (2<=n<=9)',(_整数n >=2,_整数n =< 9),_整数n),!. 'i^j (2<=i<=n,1<=j<=i) の値をすべて表示する'(_i,_n) :- _i > _n,!. 'i^j (2<=i<=n,1<=j<=i) の値をすべて表示する'(_i,_n) :- 'i ^ j の表示'(_i), _i_2 is _i + 1, 'i^j (2<=i<=n,1<=j<=i) の値をすべて表示する'(_i_2,_n). 'i ^ j の表示'(_i) :- between(1,_i,_j), _x is _i ^ _j, writef('%t ',[_x]), _i = _j. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/325 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/m1ElsrJZ #include # # int main(void) # { # int x[5] = {30, 25, 33, 15, 22}; # int *p; # int i; # p = x; # printf("*P = %d\n", *p); # for(i = 0; i < 5; i++) # { # printf("*(p+%d) = %d\n", i, *(p + i)); # } # return 0; # } # 上記のプログラムをx[5] = {54, 56, 64, 42, 58};として初期化し # 最大値を出力するプログラムをポインタ変数を用いて作成せよ。 # 'x[5] = {54, 56, 64, 42, 58};として初期化し最大値を出力する' :- 'x[5] = {54, 56, 64, 42, 58};として初期化し'(_x), 最大値を(_x,_最大値), 出力する(_最大値). 'x[5] = {54, 56, 64, 42, 58};として初期化し'(_x) :- _x = [54,56,64,42,58]. 最大値を([A|R],_最大値) :- 最大値を(R,A,_最大値). 最大値を([],_最大値,_最大値). 最大値を([A|R],_最大値_1,_最大値) :- A >= _最大値_1, 最大値を(R,_最大値_2,_最大値),!. 最大値を([_|R],_最大値_1,_最大値) :- 最大値を(R,_最大値_1,_最大値),!. % 以下のサイトは # 出典:: 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/175 # # [1]C言語 # [2]問1. キーボードから正の整数を2 つ(x、y とする) 入力し、縦x 個、横y 個の文字'*' から # なる長方形を表示するプログラムを多重ループを用いて作成せよ。 # # 問2. キーボードから正の整数x を入力し、下記のように、一辺に'*' がx 個並んだ直角三角 # 形が画面に出力されるプログラムを作成せよ。(x = 5 のときの例) # ***** # **** # *** # ** # * # [3]Linux # gcc # C言語 # [4]本日中でお願いします。 # # :- op(700,xfx,(::)). 'キーボードから正の整数''x'' を入力し、一辺に''*'' がx 個並んだ直角三角形が画面に出力される' :- 'キーボードから正の整数''x'' を入力し'(_x), '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(_x). 'キーボードから正の整数''x'' を入力し'(_x) :- 整数を得る(正の整数x,_x > 0,_x). '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(0) :- !. '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(_x) :- _x :: write(*), nl, _x_1 is _x - 1, '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(_x_1). _回数 :: P :- between(1,_回数,N), P, _回数 = N. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/53 # # [1]C言語 for文 while文 do while文 # [2]問題 http://ime.nu/codepad.org/oxqRFj3G # [3]Linux gcc # [4]10月9日 10時 # [5]長めですがよろしくお願いします…。 # # /* # # 17. 1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。た # だし、for を2 つ用いること。 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # */ :- op(800,xf,さらにこれを5回繰り返す). '1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。ただし、for を2 つ用いること。 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10' :- '1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。ただし、for を2 つ用いること。'. '1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。ただし、for を2 つ用いること。' :- '1 から10 までの整数を一行に表示し' さらにこれを5回繰り返す. '1 から10 までの整数を一行に表示し' :- for(1,N,9), writef('%t ',[N]), N = 9, write('10\n'). _これ さらにこれを5回繰り返す :- for(1,N,5), _これ, N = 5. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/53 # # [1]C言語 for文 while文 do while文 # [2]問題 http://ime.nu/codepad.org/oxqRFj3G # [3]Linux gcc # [4]10月9日 10時 # [5]長めですがよろしくお願いします…。 # # /* # # 17. 1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。た # だし、for を2 つ用いること。 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # */ '1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。ただし、for を2 つ用いること。 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10' :- '1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。ただし、for を2 つ用いること。'. '1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。ただし、for を2 つ用いること。' :- for(1,M,5), for(1,N,9), writef('%t ',[N]), N = 9, write('10\n'), M = 5. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/53 # # [1]C言語 for文 while文 do while文 # [2]問題 http://ime.nu/codepad.org/oxqRFj3G # [3]Linux gcc # [4]10月9日 10時 # [5]長めですがよろしくお願いします…。 # # /* # 6. キーボードから正の整数n を一つ入力し、0 以上n 以下の2 のべき乗(2i の形をした整数) をす # べて表示するプログラムをfor 文を用いて作成せよ。 # # 7.問題6をwhileかdo whileで作成せよ # # 11. 銀行の一年間の定期預金の年利は1.25%である。キーボードからこの定期預金に預ける元 # 金(円) と預金期間(年) を入力し、1 年毎の元利合計(元本+利息) を小数点以下を切り落として整 # 数で出力するプログラムをfor 文を利用して作成せよ。なお、各行を「・・年後(タブ)・・・円」の # 形式で表示すること。 # # 16. 漸化式an+1 = an +3, a1 = -5 で表わされる数列がある。初項(n = 1) から第10 項(n = 10) # までを表示するプログラムを作成せよ。 # # 17. 1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。た # だし、for を2 つ用いること。 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # */ '銀行の一年間の定期預金の年利は1.25%である。キーボードからこの定期預金に預ける元金(円) と預金期間(年) を入力し、1 年毎の元利合計(元本+利息) を小数点以下を切り落として整数で出力するプログラムをfor 文を利用して作成せよ。なお、各行を「・・年後(タブ)・・・円」の形式で表示すること。' :- '銀行の一年間の定期預金の年利は1.25%である'(_年利), 'キーボードからこの定期預金に預ける元金(円) と預金期間(年) を入力し'(_元金,_預金期間), '1 年毎の元利合計(元本+利息) を小数点以下を切り落として整数で出力するプログラムをfor 文を利用して作成せよ。なお、各行を「・・年後(タブ)・・・円」の形式で表示すること。'(_元金,_年利,_預金期間). '銀行の一年間の定期預金の年利は1.25%である'(_年利) :- _年利 = 1.0125. 'キーボードからこの定期預金に預ける元金(円) と預金期間(年) を入力し'(_元金,_預金期間) :- 'キーボードからこの定期預金に預ける元金(円)を入力'(_元金), 'キーボードからこの定期預金に預ける預金期間(年) を入力'(_預金期間). 'キーボードからこの定期預金に預ける元金(円)を入力'(_元金,_預金期間) :- 整数を得る('この定期預金に預ける元金(円)',_元金 > 0,_元金). 'キーボードからこの定期預金に預ける預金期間(年) を入力'(_預金期間) :- 整数を得る('この定期預金に預ける預金期間(年)',_預金期間 > 0,_預金期間). '1 年毎の元利合計(元本+利息) を小数点以下を切り落として整数で出力するプログラムをfor 文を利用して作成せよ。なお、各行を「・・年後(タブ)・・・円」の形式で表示すること。'(_元金,_年利,_預金期間) :- '1 年毎の元利合計(元本+利息) をfor 文を利用して'(_元金,_預金期間,_年後,_元利合計), '小数点以下を切り落として整数で出力するプログラムを作成する。なお、各行を「・・年後(タブ)・・・円」の形式で表示する'(_元利合計ならび). '1 年毎の元利合計(元本+利息) をfor 文を利用して'(_元金,_年利,_預金期間,_年後,_元利合計) :- for(1,_年後,_預金期間), _元利合計 is _元金 * (_年利 ^ _年後). '小数点以下を切り落として整数で出力する。なお、各行を「・・年後(タブ)・・・円」の形式で表示する'(_年後,_元利合計) :- writef('%t年後\t',[_年後]), format('~0f\n',[_元利合計]), _年後 = _預金期間,!. % for/3 % 整数を得る/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/53 # # [1]C言語 for文 while文 do while文 # [2]問題 http://ime.nu/codepad.org/oxqRFj3G # [3]Linux gcc # [4]10月9日 10時 # [5]長めですがよろしくお願いします…。 # # /* # 6. キーボードから正の整数n を一つ入力し、0 以上n 以下の2 のべき乗(2i の形をした整数) をす # べて表示するプログラムをfor 文を用いて作成せよ。 # # 7.問題6をwhileかdo whileで作成せよ # # 11. 銀行の一年間の定期預金の年利は1.25%である。キーボードからこの定期預金に預ける元 # 金(円) と預金期間(年) を入力し、1 年毎の元利合計(元本+利息) を小数点以下を切り落として整 # 数で出力するプログラムをfor 文を利用して作成せよ。なお、各行を「・・年後(タブ)・・・円」の # 形式で表示すること。 # # 16. 漸化式an+1 = an +3, a1 = -5 で表わされる数列がある。初項(n = 1) から第10 項(n = 10) # までを表示するプログラムを作成せよ。 # # 17. 1 から10 までの整数を一行に表示し、さらにこれを5 回繰り返すプログラムを作成せよ。た # だし、for を2 つ用いること。 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # 1 2 3 4 5 6 7 8 9 10 # */ 'キーボードから正の整数n を一つ入力し、0 以上n 以下の2 のべき乗(2i の形をした整数) をすべて表示するプログラムをfor 文を用いて作成せよ。' :- 'キーボードから正の整数n を一つ入力し'(_n), '0 以上n 以下の2 のべき乗(2i の形をした整数) をすべて表示するプログラムをfor 文を用いて作成せよ。'(_n). 'キーボードから正の整数n を一つ入力し'(_n) :- 整数を得る(正の整数,_n > 0,_n). '0 以上n 以下の2 のべき乗(2i の形をした整数) をすべて表示するプログラムをfor 文を用いて作成せよ。'(_n) :- findall(_2のi乗,( for(0,_i,_n), '2のi乗'(_i,_2のi乗)), _2のべき乗), writef('%t\n',[_2のべき乗]). '2のi乗'(0,1). '2のi乗'(_i,X) :- _i_1 is _i - 1, '2のi乗'(_i_1,Y), X is 2 * Y. % for/3 % 整数を得る/3 % 以下のサイトは # 出典:: 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/937 # # [1] 授業単元:マルチメディア実習 # [2] 問題文(含コード&リンク): # # 1. # 0x01, 0x02, 0x03, ・・・, 0x09, 0x0a, 0x0b, 0x0c の12バイトの内容を持つバイナリファイルを”ex1.bin”というファイル名で作成するCプログラムを書け. # 2.ex1.bin の内容を1バイトずつ読み出して,画面にprintfするCプログラムを書け # 3.ex1.bin をファイル先頭から int が3つ順に記録されたバイナリファイルと見なして読み出し,その3つのintの値を画面にprintfするCプログラムを書け.なぜそのような整数値になったか説明せよ. # '0x01, 0x02, 0x03, ・・・, 0x09, 0x0a, 0x0b, 0x0c の12バイトの内容を持つバイナリファイルを”ex1.bin”というファイル名で作成する' :- open('ex1.bin',write,Outstream,[type(binary)]), between(1,12,N), put_byte(Outstream,N), N = 12, close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/844 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/DXRUGC3J # http://ime.nu/codepad.org/e9CIf3Iy # # /* # # 4. # 2次元平面上の3つの座標 p1、p2、 p3 を頂点とする # 3角形を考え、構造体 triangle を以下のように定義する。 # struct triangle { # double p1[2]; double p2[2]; double p3[2]; # }; # # 構造体 triangle に対して、以下の関数を作成せよ。 適当な構造体 triangle の変数を # いくつか作成して、この関数が正しく動作することを確認するプログラムを作成せよ。 # # int congruence (structure triangle *a, structure triangle *b) # # 三角形 a と三角形 b が合同かどうかを判定する、 # 合同なら 1 を合同でないなら 0 を返す # # */ # # /* # # 5.構造体Tri は三角形に対応するものであり、3 つの辺の長さ(a,b,c) とその三角形の面積(area) を # メンバーとしてして持つ。 # struct Tri { # int a; # int b; # int c; # double area # }; # # 構造体Tri の変数をランダムにn 個作成して、三角形の面積が大きい順に表示するプログラムを作成 # する。ただしn はプログラムの引数として与える。また構造体Tri の変数をランダムに作成する際 # に、a とb には3 以上30 以下の整数をランダムに入れ、c にはa とb の値から、3 辺a, b, c から三 # 角形ができるようにランダムに正の整数を入れる。 # # [実行結果] # > ./a.out 1000 # 1 番目に大きい三角形は3 辺が( 30, 29, 41 ) で面積は434.741302 # 2 番目に大きい三角形は3 辺が( 29, 29, 43 ) で面積は418.422260 # 3 番目に大きい三角形は3 辺が( 30, 27, 37 ) で面積は399.749922 # ... # 998 番目に大きい三角形は3 辺が( 4, 3, 3 ) で面積は4.472136 # 999 番目に大きい三角形は3 辺が( 3, 3, 3 ) で面積は3.897114 # 1000 番目に大きい三角形は3 辺が( 3, 3, 1 ) で面積は1.479020 # # */ '三角形の面積が大きい順に表示する'(_n) :- 三角形をn個生成する(_n,_n個の三角形ならび), 大きい順に表示する(_n個の三角形ならび). 三角形をn個生成する(_n,_n個の三角形ならび) :- findall([_a,_b,_c],( between(1,_n,_), 三辺の長さを生成する(_a,_b,_c)), _n個の三角形ならび). 三辺の長さを生成する(_a,_b,_c) :- _a is random(100) + 1, _b is random(100) + 1, _c is random(100) + 1. 大きい順に表示する(_n個の三角形ならび) :- 三角形の面積と相対位置のならびを作る(0,_n個の三角形ならび,_面積と相対位置のならび), 大きい順に(_面積と相対位置のならび,_大きい順に整列した面積と相対位置のならび), 表示する(0,_大きい順に整列した面積と相対位置のならび,_n個の三角形ならび). 三角形の面積と相対位置のならびを作る(_,[],[]). 三角形の面積と相対位置のならびを作る(N_1,[[_a,_b,_c]|R1],[[_三角形の面積,N_2]|R2]) :- N_2 is N + 1, ヘロンの公式(_a,_b,_c,_三角形の面積), 三角形の面積と相対位置のならびを作る(0,R1,R2). ヘロンの公式(_a,_b,_c,_三角形の面積) :- _周囲の半分 is (_a + _b + _c) / 2, _三角形の面積 is sqrt(_周囲の半分 * (_周囲の半分 - _a) * (_周囲の半分 - _b) * (_周囲の半分 - _c)). 大きい順に([],[]). 大きい順に([_軸要素|L1],L2) :- 大きい順に分割する(_軸要素,L1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび), 大きい順に(_軸要素に等しいか大きい要素ならび,_大きい順に整列した軸要素に等しいか大きい要素ならび), 大きい順に(_軸要素より小さい要素ならび,_大きい順に整列した軸要素より小さい要素ならび), append(_大きい順に整列した軸要素に等しいか大きい要素ならび,[_軸要素|_大きい順に整列した軸要素より小さい],L2). 大きい順に分割する(_,[],[],[])). 大きい順に分割する(_軸要素,[_要素|R1],[_要素|_軸要素に等しいか大きい要素ならび],_軸要素より小さい要素ならび) :- _要素 @>= _軸要素, 大きい順に分割する(_軸要素,R1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび). 大きい順に分割する(_軸要素,[_要素|R1],_軸要素に等しいか大きい要素ならび,[_要素|_軸要素より小さい要素ならび]) :- _要素 @< _軸要素, 大きい順に分割する(_軸要素,R1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび). 表示する(_,[],_). 表示する(_順位_0,[[_面積,_相対番号]|R1],_n個の三角形ならび) :- _順位 is _順位_0 + 1, nth1(_相対番号,_n個の三角形ならび,[_a,_b,_c]), writef('%t 番目に大きい三角形は3 辺が( %t, %t, %t ) で面積は%t\n',[_順位,_a,_b,_c,_面積]), 表示する(_順位,R1,_n個の三角形ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/667 # # [1] 授業単元:C言語 # [2] 問題文: http://ime.nu/ideone.com/tRkzM # # 1. 10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示するプログラムを作成せよ。 #   ただし数値は何番目に生成した数値かも表示する。 # #   例)1番目に小さい数は475番目の数10049です。 # # 2. 10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を  表示するプログラムを作成せよ。また、各数値は何番目に生成したかも表示する。 # #   例)1番目に平均との差が小さい数は680番目の数69383です。 平均値との差は10.505です。 # # 3. n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。 #   ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15は仮定する。 # #   例)program 5 # a,b,c,d,e # a,b,c,e,d # a,b,d,c,e # ・ #       ・ #     e,d,c,b,a '10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を表示する。各数値は何番目に生成したかも表示する' :- '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび), '各数値と平均値との差をもとめ、その差が小さい順にその数値を表示する。各数値は何番目に生成したかも表示する'(_自然数ならび). '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび) :- findall(N,( between(1,10000,_), N is random(10000) + 10000), _自然数ならび). '各数値と平均値との差をもとめ、その差が小さい順にその数値を表示する'(_自然数ならび) :- 各数値と平均値との差をもとめ(_自然数ならび,_何番目かの情報を付けた平均との差ならび), その差が小さい順に(_何番目かの情報を付加した平均との差ならび,_小さい順に整列した何番目かの情報を付加した平均との差ならび), その数値を表示する(_小さい順に整列した何番目かの情報を付加した平均との差ならび). 各数値と平均値との差をもとめ(_自然数ならび,_何番目かの情報を付加した平均との差ならび) :- 平均値(_自然数ならび,_平均値), findall([_差,_何番目],( append(L0,[_数値|_],_自然数ならび), length([_|L0],_何番目), _差 is abs(_数値 - _平均値)), _何番目かの情報を付加した平均との差ならび). 平均値(_自然数ならび,_平均値) :- 相加平均(_自然数ならび,_平均値). 小さい順にこれら数値を表示する(_自然数ならび) :- 小さい順に数値を(_自然数ならび,_小さい順に整列した自然数ならび), 表示する(_小さい順に整列した自然数ならび) その差が小さい順に([],[]). その差が小さい順に([_軸要素|_残りならび],_小さい順に整列した自然数ならび) :- 分割(_軸要素,_残りならび,_軸要素と等しいか小さい自然数ならび,_軸要素より大きい自然数ならび), その差が小さい順に(_軸要素と等しいか小さい自然数ならび,_小さい順に整列した軸要素と等しいか小さい自然数ならび), その差が小さい順に(_軸要素より大きい自然数ならび,_小さい順に整列した軸要素より大きい自然数ならび), append(_小さい順に整列した軸要素と等しいか小さい自然数ならび,[_軸要素|_小さい順に整列した軸要素より大きい自然数ならび],_小さい順に整列した自然数ならび). 分割(_,[],[]). 分割(_軸要素,[A|R],[A|R1],R2) :- A @=< _軸要素, 分割(_軸要素,R,R1,R2). 分割(_軸要素,[A|R],R1,[A|R2]) :- A @> _軸要素, 分割(_軸要素,R,R1,R2). 'その数値を表示する。各数値は何番目に生成したかも表示する'(_,[]). 'その数値を表示する。各数値は何番目に生成したかも表示する'(_自然数ならび,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10|R]) :- '数値と何番目かを表示する'(_自然数ならび,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), 'その数値を表示する。各数値は何番目に生成したかも表示する'(_自然数ならび,R). '数値と何番目かを表示する'(_,[]) :- write('\n'). '数値と何番目かを表示する'(_自然数ならび,[[_,_位置]|R]) :- nth1(_位置,_自然数ならび,_数値), writef('%t(%t) ',[_位置,_数値]), '数値と何番目かを表示する'(_自然数ならび,R). 相加平均(_値ならび,_相加平均) :- length(_値ならび,_標本数), 相加平均(_値ならび,_標本数,0,_相加平均). 相加平均([],_標本数,_合計,_相加平均) :- _相加平均 is _合計 / _標本数,!. 相加平均([V|R],_標本数,_合計_1,_相加平均) :- _合計_2 is _合計_1 + V, 相加平均(R,_標本数,_合計_2,_相加平均). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/667 # # [1] 授業単元:C言語 # [2] 問題文: http://ime.nu/ideone.com/tRkzM # # 1. 10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示するプログラムを作成せよ。 #   ただし数値は何番目に生成した数値かも表示する。 # #   例)1番目に小さい数は475番目の数10049です。 # # 2. 10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を  表示するプログラムを作成せよ。また、各数値は何番目に生成したかも表示する。 # #   例)1番目に平均との差が小さい数は680番目の数69383です。 平均値との差は10.505です。 # # 3. n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。 #   ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15は仮定する。 # #   例)program 5 # a,b,c,d,e # a,b,c,e,d # a,b,d,c,e # ・ #       ・ #     e,d,c,b,a '10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示する' :- '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび), '小さい順にこれら数値を表示する'(_自然数ならび). '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび) :- findall(N,( between(1,10000,_), N is random(10000) + 10000), _自然数ならび). 小さい順にこれら数値を表示する(_自然数ならび) :- 小さい順に数値を(_自然数ならび,_小さい順に整列した自然数ならび), 表示する(_小さい順に整列した自然数ならび) 小さい順に数値を([],[]). 小さい順に数値を([_軸要素|_残りならび],_小さい順に整列した自然数ならび) :- 分割(_軸要素,_残りならび,_軸要素と等しいか小さい自然数ならび,_軸要素より大きい自然数ならび), 小さい順に数値を(_軸要素と等しいか小さい自然数ならび,_小さい順に整列した軸要素と等しいか小さい自然数ならび), 小さい順に数値を(_軸要素より大きい自然数ならび,_小さい順に整列した軸要素より大きい自然数ならび), append(_小さい順に整列した軸要素と等しいか小さい自然数ならび,[_軸要素|_小さい順に整列した軸要素より大きい自然数ならび],_小さい順に整列した自然数ならび). 分割(_,[],[]). 分割(_軸要素,[A|R],[A|R1],R2) :- A =< _軸要素, 分割(_軸要素,R,R1,R2). 分割(_軸要素,[A|R],R1,[A|R2]) :- A > _軸要素, 分割(_軸要素,R,R1,R2). 表示する([]). 表示する([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10|R]) :- writef('%t %t %t %t %t %t %t %t %t %t\n',[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), 表示する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/667 # # [1] 授業単元:C言語 # [2] 問題文: http://ime.nu/ideone.com/tRkzM # # 1. 10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示するプログラムを作成せよ。 #   ただし数値は何番目に生成した数値かも表示する。 # #   例)1番目に小さい数は475番目の数10049です。 # # 2. 10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を  表示するプログラムを作成せよ。また、各数値は何番目に生成したかも表示する。 # #   例)1番目に平均との差が小さい数は680番目の数69383です。 平均値との差は10.505です。 # # 3. n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。 #   ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15は仮定する。 # #   例)program 5 # a,b,c,d,e # a,b,c,e,d # a,b,d,c,e # ・ #       ・ #     e,d,c,b,a '10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示する' :- '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび), '小さい順にこれら数値を表示する'(_自然数ならび). '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび) :- findall(N,( between(1,10000,_), N is random(10000) + 10000), _自然数ならび). 小さい順にこれら数値を表示する(_自然数ならび) :- 小さい順に数値を(_自然数ならび,_小さい順に整列した自然数ならび), 表示する(_小さい順に整列した自然数ならび) 小さい順に数値を([],[]). 小さい順に数値を([_軸要素|_残りならび],_小さい順に整列した自然数ならび) :- 分割(_軸要素,_残りならび,_軸要素と等しいか小さい自然数ならび,_軸要素より大きい自然数ならび), 小さい順に数値を(_軸要素と等しいか小さい自然数ならび,_小さい順に整列した軸要素と等しいか小さい自然数ならび), 小さい順に数値を(_軸要素より大きい自然数ならび,_小さい順に整列した軸要素より大きい自然数ならび), append(_小さい順に整列した軸要素と等しいか小さい自然数ならび,[_軸要素|_小さい順に整列した軸要素より大きい自然数ならび],_小さい順に整列した自然数ならび). 分割(_,[],[]). 分割(_軸要素,[A|R],[A|R1],R2) :- A =< _軸要素, 分割(_軸要素,R,R1,R2). 分割(_軸要素,[A|R],R1,[A|R2]) :- A > _軸要素, 分割(_軸要素,R,R1,R2). 表示する([]). 表示する([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10|R]) :- writef('%t %t %t %t %t %t %t %t %t %t\n',[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), 表示する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/649 # # # [4] 期限: 2012年9月19日3時00分まで # [5] 標準体重を計算して対応表を表示するだけの単純なもの #   計算式は標準体重(kg) = 身長(cm)×身長(cm)×22/10000でお願いします # # 実行例 # # 対応表 # --------------- # 150.0 cm : 49.5 kg # 155.0 cm : 52.9 kg # 160.0 cm : 56.3 kg # 165.0 cm : 59.9 kg # 170.0 cm : 63.6 kg # --------------- '標準体重を計算して対応表を表示するだけの単純なもの。計算式は標準体重(kg) = 身長(cm)×身長(cm)×22/10000でお願いします ' :- write('対応表\n---------------\n'), 身長を得る(_身長), '計算式は標準体重(kg) = 身長(cm)×身長(cm)×22/10000でお願いします'(_身長,_標準体重), 対応表の一行を表示する(_身長,_標準体重), _身長 = 200, write('---------------\n'). 身長を得る(_身長) :- between(140,200,_身長整数), 0 is _身長整数 mod 5, _身長 is _身長整数 * 1.0. '計算式は標準体重(kg) = 身長(cm)×身長(cm)×22/10000でお願いします'(_身長,_標準体重) :- _標準体重 is _身長 * 身長 * 22 / 10000. 対応表の一行を表示する(_身長,_標準体重) :- format('~1f cm : ~1f kg\n',[_身長,_標準体重]). % 以下のサイトは # 出典:: 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 # # 【問題3】 # バブルソートを用いて、整数のデータ列を昇順に整列するプログラムを作成せよ。 # データ数をキーボード入力し、続いてその個数の整列していないデータを配列に格納し、 # データとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。 # 次にデータ列のソートを行い、結果の整列したデータ列をディスプレイ表示するとともに、 # 別のファイルへ出力する。なお、データ数は最大50として50をマクロ定義せよ。疑似乱数で # データを作成するために、【問題2】で作成した関数random_dataを使用すること。また、ソートには # 次の関数を作成して使うこと。 # ・void bubble(int data[],int num) # この関数はnum個の値が格納された配列data[]を、バブルソートアルゴリズムで昇順に並べ替える関数である。 'バブルソートを用いて、整数のデータ列を昇順に整列するプログラムを作成せよ。データ数をキーボード入力し、続いてその個数の整列していないデータを配列に格納しデータとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。 次にデータ列のソートを行い、結果の整列したデータ列をディスプレイ表示するとともに、別のファイルへ出力する。 なお、データ数は最大50として50をマクロ定義せよ。'(_出力ファイル名,_別の出力ファイル名) :- 'データ数は最大50としてデータ数をキーボード入力し、続いてその個数の整列していないデータを配列に格納しデータとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。 '(_出力ファイル名,_データ数,_データならび), 'データ列をバブルソートを用いて昇順に整列し、結果の整列したデータ列をディスプレイ表示するとともに、別のファイルへ出力する。'(_別の出力ファイル名,_データ数,_データならび,_整列したデータ列). 'データ数をキーボード入力し、続いてその個数の整列していないデータを配列に格納しデータとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。'(_出力ファイル名,_データ数,_データならび) :- 'データ数は最大50としてデータ数をキーボード入力し'(_データ数), 'その個数の整列していないデータを配列に格納し'(_データ数,_データならび), 'データとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。'(_出力ファイル名,_データ数,_データならび). 'データ数は最大50としてデータ数をキーボード入力し'(_データ数) :- 整数を得る(最大50のデータ数,between(1,50,_データ数),_データ数). 'その個数の整列していないデータを配列に格納し'(_データ数,_データならび) :- length(_データならび,_データ数), findall(N,( member(N,_データならび), N is random(_データ数) + 1), _データならび). 'データとその添え字番号をディスプレイに一覧表示するとともにファイルへも出力する。'(_出力ファイル名,_データ数,_データならび) :- open(_述力ファイル名,write,Oustream), 'データと添え字番号を'(_データならび,_添え字番号,_データ), 'ディスプレイに一覧表示するとともにファイルへも出力する。'(Outstream,_添え字番号,_データ), close(Outstream). 'ディスプレイに一覧表示するとともにファイルへも出力する。'(Outstream,_添え字番号,_データ) :- writef('%t: %t\n',[_添え字番号,_値]), writef(Outstream,'%t: %t\n',[_添え字番号,_データ]), _添え字番号 = _データ数. 'データ列をバブルソートを用いて昇順に整列し、結果の整列したデータ列をディスプレイ表示するとともに、別のファイルへ出力する。'(_別の出力ファイル名,_データ数,_データならび,_昇順に整列したならび) :- 'データ列をバブルソートを用いて昇順に整列し'(_データならび,_昇順に整列したデータならび), '結果の整列したデータ列をディスプレイ表示するとともに、別のファイルへ出力する。'(_別の出力ファイル名,_昇順に整列したデータならび). 'データ列をバブルソートを用いて昇順に整列し'(_データならび,_昇順に整列したデータならび) :- バブルソート(_データならび,_昇順に整列したデータならび). '結果の整列したデータ列をディスプレイ表示するとともに、別のファイルへ出力する。'(_別の出力ファイル名,_昇順に整列したデータならび) :- open(_別のファイル名,write,Outstream), append(L0,[_データ|R],_昇順に整列したデータならび), writef('%t\n',[_データ]), writef(Outstream,'%t\n',[_データ]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/592 # # [1] 授業単元:データ構造入門 # [2] 問題文(含コード&リンク):問題文が長いためこちらに記載しました http://ime.nu/ideone.com/R8gaZ # # 【問題2】 # 線形探索法で目的データを探索するプログラムを作成せよ。 # データの数をキーボード入力し、その個数だけの疑似乱数を発生させてデータを配列に格納し、 # データとその添え字番号を一覧表示する。次に目的データ(探索データ)をキーボード入力し、 # 線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は # 「みつからなかったこと」を表示する。なお、データ数は最大50として、50をマクロ定義 # せよ。また、データの探索と作成には、次の関数を作成して使うこと。 # # ・int linear_search(int data[],int key,int num) # この関数はnum個のデータが格納された配列dataの中から、線形探索を用いて目的データkeyと等しい # 値を探し、見つかった場合にはその配列要素を返却し、見つからなかった場合には-1を返却する。 # # ・void random_data(int data[],int num) # この関数は整列していないnum個のデータを配列dataに格納する関数。疑似乱数rand()を用いよ。 # データの値は0からnum-1までの整数で全て異なる値とせよ。 # ※乱数列を変更するにはvoid srand(seed)を実行する。seedの値が異なると、ことなる乱数列が # 得られることを確認しよう。 'データの数をキーボード入力し、その個数だけの疑似乱数を発生させてデータを配列に格納し、データとその添え字番号を一覧表示する。 次に目的データ(探索データ)をキーボード入力し、線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する。 なお、データ数は最大50として、50をマクロ定義せよ。' :- 'データの数をキーボード入力し、その個数だけの疑似乱数を発生させてデータを配列に格納し、データとその添え字番号を一覧表示する。なお、データ数は最大50とする'(_データの数,_データならび), '次に目的データ(探索データ)をキーボード入力し、線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する。'(_データの数,_データならび). 'データの数をキーボード入力し、その個数だけの疑似乱数を発生させてデータを配列に格納し、データとその添え字番号を一覧表示する。' :- 'データ数は最大50としてデータの数をキーボード入力し'(_データの数), 'その個数だけの疑似乱数を発生させてデータを配列に格納し'(_データの数,_データならび), 'データとその添え字番号を一覧表示する'(_データの数,_データならび). 'データ数は最大50としてデータの数をキーボード入力し、' :-'(_データの数) :- 整数を得る(データの数,between(1,50,_データ数),_データの数). 'その個数だけの疑似乱数を発生させてデータを配列に格納し'(_データの数,_データならび) :- length(_データならび,_データの数), findall(N,( member(N,_データならび), N is random(_データの数) + 1), _データならび). 'データとその添え字番号を一覧表示する'(_データの数,_データならび) :- nth1(_添字番号,_データならび,_データ), writef('%t: %t\n',[_添字番号,_データ]), _添字番号 = _データの数,!. '次に目的データ(探索データ)をキーボード入力し、線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する。'(_データの数,_データならび) :- '目的データ(探索データ)をキーボード入力し'(_データの数,_目的データ), '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび). '目的データ(探索データ)をキーボード入力し'(_データの数,_目的データ) :- swritef(_制限表示,'1から%tまでの範囲の任意の数',[_データ数]), write('目的データ(探索データ)を入力してください : '), 整数を得る(_制限表示,_目的データ). '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび) :- '線形探索法で探索し、見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび),!. '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し、見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび) :- '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し'(_目的データ,_データならび). '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し'(_目的データ,_データならび) :- '見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび),!. '線形探索法で探索し、見つからなかった場合は「みつからなかったこと」を表示する'(_目的データ,_データならび) :- \+(nth1(_添字番号,_データならび,_目的データ)), writef('目的データ %t はデータならびの中に見つかりません\n',[_目的データ]),!. '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し'(_目的データ,_データならび) :- nth1(_添字番号,_データならび,_目的データ), writef('%t: %t\n',[_添字番号,_目的データ), fail. '線形探索法で探索し、見つかった場合その配列の添え字番号を表示し'(_目的データ,_データならび). % 以下のサイトは # 出典:: 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/1276873238/825 # # 誰かこれ教えてください… # # 問題1 # 最初に「文字列を入力してください.」と表示して文字列を読みこみ、 # 次に「数字を入力してください.」と表示して数字を読み込み、 # 入力文字列を入力した数字の回数分だけ一行ずつ表示するプログラムを # ex07-3-03.rbで保存して実行してください. # # 問題2 # 問題1で作成したプログラムは、数字の読み込みについてバグがある # 可能性があります(数字でないものが入力されたとき、 # どうなるでしょうか?).もしバグがある場合、 # それを修正したプログラムをex07-3-04.rbで保存して実行してください. # '最初に「文字列を入力してください.」と表示して文字列を読みこみ、次に「数字を入力してください.」と表示して数字を読み込み、入力文字列を入力した数字の回数分だけ一行ずつ表示する' :- '最初に「文字列を入力してください.」と表示して文字列を読みこみ'(_文字列), '次に「数字を入力してください.」と表示して数字を読み込み'(_数字), '入力文字列を入力した数字の回数分だけ一行ずつ表示する'(_文字列,_数字). '最初に「文字列を入力してください.」と表示して文字列を読みこみ'(_文字列) :- '最初に「文字列を入力してください.」と表示して', 文字列を読み込み(_文字列). '最初に「文字列を入力してください.」と表示して' :- write('文字列を入力してください. '). 文字列を読み込み(_文字列) :- get_line(_文字列). '次に「数字を入力してください.」と表示して数字を読み込み'(_数字) :- '次に「数字を入力してください.」と表示して', 数字を読み込み(_数字). '次に「数字を入力してください.」と表示して' :- write('数字を入力してください. '). 数字を読み込み(_数字) :- 数を得る('',_数字). '入力文字列を入力した数字の回数分だけ一行ずつ表示する'(_文字列,_数字) :- between(1,_数字,N), writef('%t\n',[_文字列]), N = _数字. % 以下のサイトは # 出典:: 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. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/243 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文(含コード&リンク): # ・問 マルチキークイックソートを非再帰で実装せよ。 # マルチキークイックソートは文字列を辞書順にソートする手法である。 # 例えば、文字列appleを5回巡回し、5つの文字列を生成する。 # この5つの文字列を辞書順にソートすると、以下のようになる。 # # 巡回     ソート後 # apple apple # pplea  eappl # pleap  → leapp # leapp pleap # eappl pplea # # 実際には文字列appleを2倍にし巡回文字列を得る。 # 例 : appleapple # この文字列に対して非再帰のマルチキークイックソートを適用せよ。 # マルチキークイックソートは文字列を辞書順にソートする(_文字列,_辞書順に整列した文字列) :- マルチキークイックソートの整列対象文字列の生成(_文字列,_整列対象文字列ならび), 辞書順整列(_整列対象文字列ならび,_辞書順に整列した文字列). マルチキークイックソートの整列対象文字列の生成(_文字列,_整列対象文字列ならび) :- atom_chars(_文字列,_文字ならび), atom_length(_文字列,_n), findall(_回転した文字列,( between(1,_n,N), ならびの回転(左方向,N,L,_回転した文字ならび), atom_chars(_回転した文字列,_回転した文字ならび)), _整列対象文字列ならび). 辞書順整列([],[]). 辞書順整列([_軸要素文字列|_残り文字列],_辞書順に整列した文字列) :- 辞書順分割(_軸要素文字列,_残り文字列,_より小さい文字列,_等しいかより大きい文字列), 辞書順整列(_より小さい文字列,_整列したより小さい文字列), 辞書順整列(_等しいかより大きい文字列,_整列した等しいかより大きい文字列), append(_整列したより小さい文字列,[_軸要素文字列|_整列した等しいかより大きい文字列],_辞書順に整列した文字列). 辞書順分割(_軸要素文字列,[],[],[]). 辞書順分割(_軸要素文字列,[_文字列|R1],L1,L2) :- atom_chars(_軸文字列,_文字ならび_1), atom_chars(_文字列,_文字列ならび_2), 辞書順分割(_文字ならび_1,_文字ならび_2,L1,L2,R1,R2), 辞書順分割(_軸要素文字列,R1,R1,R2). 辞書順分割(_文字ならび_1,_文字ならび_2,L1,R2,R1,R2) :- 辞書順文字列の比較(_軸要素文字ならび_1,_文字ならび,_文字ならび,_), atom_chars(_文字列,_文字ならび), L1 = [_文字列|R1],!. 辞書順分割(_文字ならび_1,_文字ならび_2,R1,L2,R1,R2) :- 辞書順文字列の比較(_軸要素文字ならび_1,_文字ならび,_,_文字ならび), atom_chars(_文字列,_文字ならび), L2 = [_文字列|R2],!. 辞書順文字列の比較([],[],[],[]) :- !. 辞書順文字列の比較(L,[],[],L) :- !. 辞書順文字列の比較([],L,[],L) :- !. 辞書順文字列の比較([_文字|R1],[_文字|R2],[_文字|R3],[_文字|R4]) :- 辞書順文字列の比較(R1,R2,R3,R4),!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_1|R1],[_文字_2|R2]) :- 英大文字(_文字_1), 英小文字(_文字_2), to_upper(_文字_2,_文字_1),!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_2|R2],[_文字_1|R1]) :- 英小文字(_文字_1), 英大文字(_文字_2), to_upper(_文字_1,_文字_2),!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_1|R1],[_文字_2|R2]) :- _文字_1 @< _文字_2,!. 辞書順文字列の比較([_文字_1|R1],[_文字_2|R2],[_文字_2|R2],[_文字_1|R1]) :- _文字_1 @>= _文字_2,!. 英小文字(_英小文字) :- _英小文字 @>= 'a', _英小文字 @=< 'z'. 英大文字(_英大文字) :- _英大文字 @>= 'A', _英大文字 @=< 'Z'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/136 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # cos(3t)を計算しtとcos(3t)をdata1.datに保存し エクセルグラフを書くこと # ただし t=0.0 , 0.1, 0.2 , 0.3 ,,,,,,,, 360.0 とすること # 'cos(3t)を計算しtとcos(3t)をdata1.datに保存しエクセルグラフを書くこと。 ただしt=0.0 , 0.1, 0.2 , 0.3 ,,,,,,,, 360.0 とすること' :- 'cos(3t)を計算する。ただしt=0.0 , 0.1, 0.2 , 0.3 ,,,,,,,, 360.0 とすること'(L), 'data1.datに保存する'(L). 'cos(3t)を計算する。ただしt=0.0 , 0.1, 0.2 , 0.3 ,,,,,,,, 360.0 とすること'(L) :- findall([_t,_cos_3t],( for(0,3600,N), _t is N / 10, _cos_3t is cos(3 * 2 * pi * _t / 360)), L). 'data1.datに保存する'(L) :- open('data1.dat',write,Outstream), append(_,[[_t,_cos_3t]|R],L), writef(Outstream,'%t %t\n',[_t,_cos_3t]), R = [], close(Outstream). % 以下のサイトは ガウス法によるLU分解(_n,LL,LU,L,U) :- 解が生成される変数行列とその転置行列の生成(_n,LU,LU2), 転置(LL,LL2), ガウス法によるLU分解(LL,LL2,LU,LU2), 'LとUに分解'(LU,L,U),!. 解が生成される変数行列とその転置行列の生成(_n,LU,LU2) :- length(LU,_n), findall(L,( between(1,_n,_), length(L,_n)), LU), 転置(LU,LU2),!. ガウス法によるLU分解([],[],[],[]) :- !. ガウス法によるLU分解([[A|L1]|R1],[[A|L2]|R2],[[A|L3]|R3],[[A|L2]|R4]) :- '第一行は各列を隅要素(A)で割って置換する'(A,L1,L3), 第二行以下は次の対象矩形を生成する(L2,L3,R1,_次の対象矩形), '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'(R3,R4,R31,R41), 転置(_次の対象矩形,_転置された次の対象矩形), ガウス法によりLu分解(_次の対象矩形,_転置された次の対象矩形,R31,R41), '第一行は各列を隅要素(A)で割って置換する'(A,[],[]). '第一行は各列を隅要素(A)で割って置換する'(A,[A1|R1],[B1|R2]) :- 'A1をAで割る'(A,A1,B1), '第一行は各列を隅要素(A)で割って置換する'(A,R1,R2). 'A1をAで割る'(A,A1,B1) :- 行基本変形除算(A,1,A1,B1). 第二行以下は次の対象矩形を生成する([],_,[],[]) :- !. 第二行以下は次の対象矩形を生成する([A|R1],L2,[[_|L3]|R3],[L|R]) :- '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(A,L2,L3,L), 第二行以下は次の対象矩形を生成する(R1,L2,R3,R). '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(_,[],[],[]) :- !. '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(A,[B|R2],[C|R3],[D|R4]) :- 'D is C - A * B'(A,B,C,D), '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(A,R2,R3,R4). 'D is C - A * B'(A,B,C,D) :- 行基本変形乗算(A,B,V), 行基本変形減算(C,V,D),!. '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'([],[],[],[]). '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'([[_|L3]|R3],[[_|L4]|R4],[L3|R31],[L4|R41]) :- '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'(R3,R4,R31,R41). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'LとUに分解'(LU,L,U) :- 'Lに分解'(LU,L), 'Uに分解'(LU,U). 'Lに分解'(LU,LL) :- findall(L2,( member(L1,LU), append(L0,R,L1), \+(L0 = []), '残り要素Rをすべて0に置き換える'(L0,R,L2)), LL). '残り要素Rをすべて0に置き換える'(L0,R,L2) :- length(R,Len), length(R1,Len), all(R1,0), append(L0,R1,L2),!. 'Uに分解'(LU,UU) :- findall(L2,( member(L,LU), append(L0,L1,L), 'L0の全要素を0に置き換える'(L0,L1,L2)), UU). 'L0の全要素を0に置き換える'(L,L0,[A|R1],L2) :- length(L0,Len), length(L0_2,Len), all(L0_2,0), 'L1を先頭要素で割る'(L1,L1_2), append(L0_2,L1_2,L2),!. 'L1を先頭要素で割る'([_先頭要素|R1],[1|R2]) :- findall(M,( member(A,R1), 分数を含む除算(A,_先頭要素,M)), R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行基本変形乗算(_乗数_1,_乗数_2,X) :- integer(_乗数_1), integer(_乗数_2), X is _乗数_1 * _乗数_2,!. 行基本変形乗算(_分子_1/_分母_1,_分子_2/_分母_2,X) :- _分子 is _分子_1 * _分子_2, _分母 is _分母_1 * _分母_2, 約分(_分子 / _分母,X),!. 行基本変形乗算(_分子/_分母,_乗数_2,X) :- A is _分子 * _乗数_2, 0 is A mod _分母, X is A // _分母,!. 行基本変形乗算(_乗数_1,_分子/_分母,X) :- atomic(_乗数_1), 行基本変形乗算(_分子/_分母,_乗数_1,X),!. 行基本変形乗算(_乗数_1,_乗数_2,X) :- X is _乗数_1 * _乗数_2,!. 行基本変形除算(A,_乗数,_除数,X) :- integer(A), integer(_乗数), integer(_除数), A2 is A * _乗数, 0 is A2 mod _除数, X is A * _乗数 // _除数,!. 行基本変形除算(A,_乗数,_除数,X) :- integer(A), integer(_乗数), integer(_除数), A2 is A * _乗数, \+(0 is A2 mod _除数), 約分(A2 / _除数,X),!. 行基本変形除算(A,_乗数,_除数,X) :- X is A * _乗数 / _除数. 行基本変形減算(A,B,C) :- atomic(A), atomic(B), C is A - B,!. 行基本変形減算(A1/A2,B1/B2,X) :- _分子 is A1 * B1, _分母 is A2 * B2, 約分(_分子 / _分母,X),!. 行基本変形減算(A1/A2,B1/B2,X) :- _分子 is A1 * B2 - B1 * A2, _分母 is A2 * B2, 約分(_分子 / _分母,X),!. 行基本変形減算(A1/A2,B,X) :- atomic(B), _分子 is A1 - A2 * B, _分母 is A2, 約分(_分子 / _分母,X),!. 行基本変形減算(B,A1/A2,X) :- 行基本変形減算(A1/A2,B,X),!. 行基本変形減算(A,B,X) :- X 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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/63 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/img/371.txt # #include # int main(){ # int a[4][3]={ # {3,5,3}, # {4,3,5}, # {2,2,3}, # {1,8,7} # }; # # int b[4],x,y; # # for(y=0;y<=3;y++){ # b[y]=0; # for(x=0;x<=2;x++){ # b[y] += a[y][x]; # } # } # # for(y=0;y<=3;y++){ # printf("%d\n",b[y]); # } # } # 上のコードは、配列a[4][3]の各行の合計を求め、配列b[4]に保存し、求めた値を出力するプログラムです。 # これを改造して次のプログラムを作成せよ。 # # ・配列a[4][3]の各行において、その合計の昇順に行を並び替え、配列 c[4][3]に保存し、出力しなさい。 # ただし、各行の合計の値が等しいものがあった場合、行番号が小さいものを小さい順番にする。 # # '行列の各行において、その合計の昇順に行を並び替え、出力しなさい。ただし、各行の合計の値が等しいものがあった場合、行番号が小さいものを小さい順番にする。'(_行列,_行合計で整列した行列) :- 'その合計の昇順に行を並び替え'(_行列,_行合計で整列した行列), 出力しなさい(_行合計で整列した行列). 'その合計の昇順に行を並び替え'(_行列,_行合計で整列した行列) :- findsort([_行合計,_行番号],( nth1(_行番号,_行列,_行), sum(_行,_行合計)), _行合計で整列した行列). 出力しなさい(_行合計で整列した行列) :- 表示形式文字列の生成(_行合計で整列した行列,_表示形式文字列), append(_,[[_行合計,_行番号]|_残り行],_行合計で整列した行列), nth1(_行番号,_行列,_行), writef(_表示形式文字列,_行), _残り行 = []. 表示形式文字列の生成(_行合計で整列した行列,_表示形式文字列) :- nth1(1,_行合計で整列した行列,_行), length(_行,_列数), findall('%t',between(1,_列数,_),L), atomic_list_concat(L,',',S), atomic_list_concat(['| ',S,' |\n'],_表示形式文字列). findsort(_射影項,_目標,_整列した射影項ならび) :- findall(_射影項,_目標,_射影項ならび), sort(_射影項ならび,_整列した射影項ならび). % 以下のサイトは # 出典 :: # [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人の予想ならび) :- length(_10人の予想ならび), findall([_性別,_予想],( member(_,_10人の予想ならび), 予想を入力する(_性別,_予想)),_10人の予想ならび), 'それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し表示する'(_10人の予想ならび). 予想を入力する(_性別,_予想) :- write('性別を入力してください(M or F) : '), get_line(_性別), 整数を得る('勝ち=1, 負け=2, 引き分け=0 を入力してください',between(0,2,_予想),_予想). 'それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し表示する'(_10人の予想ならび) :- 'それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し'(_10人の予想ならび,_予想結果ならび), 表示する(_予想結果ならび). 'それら10人分の予想結果を、「 勝ち1・引き分け0・負け2 」に男女別に集計し'(_10人の予想ならび,_予想結果ならび) :- findall([_性別,_勝ち合計,_引き分け合計,_負け合計],( 男女別に(_性別), 勝ち合計(_10人の予想ならび,_性別,_勝ち合計), 引き分け合計(_10人の予想ならび,_性別,_引き分け合計), 負け合計(_10人の予想ならび,_性別,_負け合計)),_予想結果ならび). 男女別に(_性別):- member(_性別,['M','F']). 勝ち合計(_10人の予想ならび,_性別,_勝ち):- count(member([_性別,1],_10人の予想ならび),_勝ち). 引き分け合計(_10人の予想ならび,_性別,_引き分け):- count(member([_性別,0],_10人の予想ならび),_引き分け). 負け合計(_10人の予想ならび,_性別,_負け):- count(member([_性別,2],_10人の予想ならび),_負け). 表示する(_予想結果ならび):- forall(member([_性別,_勝ち,_引き分け,_負け]_予想結果ならび), writef('%w 勝ち=%w,引き分け=%w,負け=%w\n',[_性別,_勝ち,_引き分け,_負け])). count(P,Count) :- findall(1,P,L), length(L,Count). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/797 # # 問題 # 長方形ABCDの二辺ABとBCが与えられたとき(AB>BC) # L=AE=BF=CF=DE=EFとなるLを求めよ。 # A■■■■■■■■■■■■■B # ■■□□□□□□□□□□□■■ # ■□■□□□□□□□□□■□■ # ■□□■□□□□□□□■□□■ # ■□□□E■■■■■F□□□■ # ■□□■□□□□□□□■□□■ # ■□■□□□□□□□□□■□■ # ■■□□□□□□□□□□□■■ # D■■■■■■■■■■■■■C # 例 # AB=11、BC=8のとき、L=5 # # '長方形ABCDの二辺ABとBCが与えられたとき(AB>BC)L=AE=BF=CF=DE=EFとなるLを求めよ。'(AB,BC,L) :- between(0,100000,N), L is AB * N / 100000, L^2 >= 0.25 * ((BC^2) + (AB - L)^2),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/794 # # 正の整数mとn(1<=n<=9)を入力し, m桁の1以上n以下の数字を組み合わせてできる全ての数列を出力するプログラムを作れ. # # mが3でnが2の場合の例: # 111 # 112 # 121 # 122 # 211 # 212 # 221 # 222 # # '正の整数mとn(1<=n<=9)を入力し, m桁の1以上n以下の数字を組み合わせてできる全ての数列を出力する' :- '正の整数mとn(1<=n<=9)を入力し'(_m,_n), m桁の1以上n以下の数字を組み合わせてできる全ての数列を出力する(_m,_n). '正の整数mとn(1<=n<=9)を入力し'(_m,_n) :- 整数を得る(正の整数m,_m > 0,_m), 整数を得る('n(1<=n<=9)',(_n>=1,_n=<9),_n). m桁の1以上n以下の数字を組み合わせてできる全ての数列を出力する(_m,_n) :- m桁の1以上n以下の数字を組み合わせてできる全ての数列を(_m,_n,_m桁の1以上n以下の数字を組み合わせてできる全ての数列), 出力する(_m桁の1以上n以下の数字を組み合わせてできる全ての数列). m桁の1以上n以下の数字を組み合わせてできる全ての数列を(_m,_n,_m桁の1以上n以下の数字を組み合わせてできる全ての数列) :- 繰り返し数の制御のため_mをならびLmに変換する(_m,Lm), findall(_m桁の数字列,( m桁の1以上n以下の数字を組み合わせてできる数列(Lm,_n,_m要素の数字ならび), atomic_list_concat(_m要素の数字ならび,_m桁の数字列)), _m桁の1以上n以下の数字を組み合わせてできる全ての数列). m桁の1以上n以下の数字を組み合わせてできる数列([],_,[]). m桁の1以上n以下の数字を組み合わせてできる数列([_|Lm],_n,[_1以上n以下の数字|R]) :- '1以上n以下の数字を'(_n,_1以上n以下の数字), m桁の1以上n以下の数字を組み合わせてできる数列(Lm,_n,R). '1以上n以下の数字を'(_n,_1以上n以下の数) :- between(1,_n,_1以上n以下の数), atom_number(_1以上n以下の数字,_1以上n以下の数). 出力する(_数字文字列ならび) :- append(_,[_数字文字列|_残り要素],_数字文字列ならび), writef('%t',[_数字文字列]), _残り要素 = []. 繰り返し数の制御のため_mをならびLmに変換する(_m,Lm) :- length(Lm,_m). % 以下のサイトは # 出典 :: 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/1337692704/273 # # 【 課題 】1からnまでの値(たとえばnが5であれば、1,2,3,4,5)を、1行に1個ずつ表示するプログラムである # 【 形態 】1. Javaアプリケーション(main()で開始) # #        # 【 期限 】明日 # # 【 補足 】import java.util.Scanner; # # class B4{ # # public static void main(String[] args){ # # Scanner stdIn = new Scanner(System.in); # int n; # n = stdIn.nextInt(); # # int i=1; # while (i<=n){ # System.out.println("i"); # i++; # } # } # } # 自分で作ったんですがこれ以上わかりません。 # 正しく直してくれませんか>< # # '1からnまでの値(たとえばnが5であれば、1,2,3,4,5)を、1行に1個ずつ表示する' :- 整数を得る(整数,_n), '1からnまでの値'(_n,_1からnまでの値), 1行に1個ずつ表示する(_1からnまでの値), _1からnまでの値 = _n. '1からnまでの値'(_1からnまでの値) :- between(1,_n,_1からnまでの値). 1行に1個ずつ表示する(_1からnまでの値) :- writef('%t\n',[_1からnまでの値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/790 # # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 数値を1つ入力し、その個数分の"*"を1辺とする # \喫形 ∋鯵儼 5媚鯵儼 せ鯵儡 ゥ瀬ぅ箏 θ角形 Ю鰻舛鯢漸茲擦 # # ・繰り返しの条件指定の工夫のみの作成。 # ・描画部分のアルゴリズムでif文を使用しないこと # ・1回のprintf()関数で出力できるものは「*」「 」「\n」のみ。 # ただし「*」の後ろに半角スペースを付加することはOK。 # ・各図形の描画は、それぞれ関数化されていること。 # ・2〜9以外の数字が入力されたら、エラーメッセージを出力して再入力させる。 # ・メニュー形式にして、どの図形を描画するか選択式にする # さらに1回で終了せず描画後、メニューに戻ること。 # ・描画する図形の内部を空白にする。 # # 入力させるメッセージは「数字(2〜9)を入力してください。」 # エラーメッセージは「エラー! 2〜9の数字を入力してください。」 # メニューは、1)正方形 2)三角形 3)逆三角形 4)三角旗 5)ダイヤ型 6)八角形 7)星形を表示し、 # そこから選ばせるようにすること。 # 三角旗(_n) :- 旗の部分(1,_n), 残りの竿の部分(_n). 旗の部分(_n), between(1,_n,M), 竿のひと節, 旗(_n), M = _n, 旗(_n,_n) :- 一筋書く(_m),!. 旗(_m,_n) :- 一筋書く(_m), _m_2 is _m + 1, 旗(_m_2,_n), 一筋書く(_m). 竿のひと節 :- write('*'). 一筋書く(_m) :- between(1,_m,M), write('*'), _m = M, write('\n'). 残りの竿の部分(_n) :- between(1,_n,M), 竿のひと節, write('\n'), _n = M. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/191 # # 自然数N(N<10000)があたえられたとき、Nまでのうち素数のみを示すプログラムを作れ。 # 表示はコンソールに、コンマで区切って表示せよ。 # (ヒント:a,b(a<=b)の2数の積がN以下ならば最大となるaまでの素数を考えればよい) # # まずヒントが日本語じゃないです・・・ # 数学ができなくてもやる気があればできるというので大学に入ったのですが、もう毎日死ぬほど数