このディレクトリの索引

% 以下のサイトは # 出典 :: SQL質疑応答スレ 11問目 #106 # ストアドプロシージャについて質問させてください。 # # 簡単な結果を返すクエリ # SELECT A,B,C FROM TEST # # といったクエリの結果を戻り値として返すストアドを作成したいのですが # どのように書けば良いのかわかりません。 # # 単一の列のみを返す方法ならわかったのですが、複数列を返す方法が # 分からないといった状態です。 # テーブル構造('TEST',1,'A'). テーブル構造('TEST',2,'B'). テーブル構造('TEST',3,'C'). 'TEST'(200,300,400). 'TEST'(80,90,100). 簡単な結果を返すクエリ(_テーブル名,_選択項名ならび,_選択値ならび) :- 項名と値の結合(_テーブル名,_値ならび,_選択項名ならび,_選択値ならび), テーブル構造から引数の数を調べて目標を構成して実行する(_テーブル名,_値ならび). 項名と値の結合(_,_,[],[]). 項名と値の結合(_テーブル名,_値ならび,_選択項名ならび,_選択値ならび) :- 項名と値ならびの値を結合して行く(_テーブル名,_値ならび,_選択項名ならび,_選択値ならび). 項名と値ならびの値を結合して行く(_テーブル名,_値ならび,[_項名|R1],[_値|R2]) :- テーブル構造(_テーブル名,_nth1,_項名), nth1(_nth1,_値ならび,_値), 項名と値の結合(_テーブル名,_値ならび,R1,R2). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). テーブル構造から引数の数を調べて目標を構成して実行する(_テーブル名,_値ならび) :- テーブル構造から引数の数を調べて目標を構成して(_テーブル名,_値ならび,_目標), 実行する(_目標). テーブル構造から引数の数を調べて目標を構成して(_テーブル名,_値ならび,_目標) :- 度数(テーブル構造(_テーブル名,_,_),Len), length(_値ならび,Len), _目標 =.. [_テーブル名|_値ならび]. 実行する(_目標) :- call(_目標). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/561 # n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。 # がわかりませぬ。どなたか教えてください。 # # 'n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。' :- 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数), 'それらの平均と標準偏差を出力する'(_n個,_n個の実数). 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数) :- length(_n個の実数,_n個), findall(_個々の実数,( 個々の実数(_n個の実数,_個々の実数), 実数を得る(_個々の実数)),_n個の実数). 'それらの平均と標準偏差を出力する'(_n個,_n個の実数) :- それらの平均と標準偏差を(_n個,_n個の実数,_平均,_標準偏差), 出力する(_平均,_標準偏差). それらの平均と標準偏差を(_n個,_n個の実数,_n個の実数の平均,_n個の実数の標準偏差) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差). 出力する(_n個の実数の平均,_n個の実数の標準偏差) :- writef('平均  = %t\n標準偏差 = %t\n',[_n個の実数の平均,_n個の実数の標準偏差). 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均) :- sum_list(_n個の実数,_n個の実数の合計), _n個の実数の平均 is _n個の実数の合計 / _n個. 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), 個々の実数と平均の差の二乗の合計(_n個,_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗の合計), 標準偏差は分散の平方根になる(_n個,_個々の実数と平均の差の二乗の合計,_n個の実数の標準偏差). 個々の実数と平均の差の二乗の合計(_n個,_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗の合計) :- findsum(_個々の実数と平均の差の二乗,( 個々の実数と平均の差の二乗(_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗)),_個々の実数と平均の差の二乗の合計). 個々の実数と平均の差の二乗(_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗) :- 個々の実数(_n個の実数,_個々の実数), _個々の実数と平均の差の二乗 is (_個々の実数 - _n個の実数の平均) ^ 2. 個々の実数(_n個の実数,_個々の実数) :- nth1(_,_n個の実数,_個々の実数). 標準偏差は分散の平方根になる(_n個,_個々の実数と平均の差の二乗の合計,_n個の実数の標準偏差) :- _n個の実数の標本の分散 is _個々の実数と平均の差の二乗の合計 / _n個, _n個の実数の標準偏差 is sqrt(_n個の実数の標本の分散). 実数を得る(_個々の実数) :- 行入力(_行), read_term_from_atom(_行,_実数,[]), 実数診断(_行,_実数),!. 実数を得る(_個々の実数) :- 実数を得る(_個々の実数). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 実数診断(_行,_実数) :- float(_実数),!. 実数診断(Line,_実数) :- writef('入力された %t から実数が得られません。再入力をお願いします。\n',[_行]), fail. findsum(_集約対象項,_目標,_合計) :- findall(_集約対象項,_目標,_集約対象項ならび), sum_list(_集約対象項ならび,_合計). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/561 # n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。 # がわかりませぬ。どなたか教えてください。 # # 'n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。' :- 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数), 'それらの平均と標準偏差を出力する'(_n個,_n個の実数). 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数) :- length(_n個の実数,_n個), findall(_個々の実数,( 個々の実数(_n個の実数,_個々の実数), 実数を得る(_個々の実数)),_n個の実数). 'それらの平均と標準偏差を出力する'(_n個,_n個の実数) :- それらの平均と標準偏差を(_n個,_n個の実数,_平均,_標準偏差), 出力する(_平均,_標準偏差). それらの平均と標準偏差を(_n個,_n個の実数,_n個の実数の平均,_n個の実数の標準偏差) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差). 出力する(_n個の実数の平均,_n個の実数の標準偏差) :- writef('平均  = %t\n標準偏差 = %t\n',[_n個の実数の平均,_n個の実数の標準偏差). 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均) :- sum_list(_n個の実数,_n個の実数の合計), _n個の実数の平均 is _n個の実数の合計 / _n個. 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), 個々の実数と平均の差の二乗の合計(_n個,_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗の合計), 標準偏差は分散の平方根になる(_n個,_個々の実数と平均の差の二乗の合計,_n個の実数の標準偏差). 個々の実数と平均の差の二乗の合計(_n個,_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗の合計) :- findsum(_個々の実数と平均の差の二乗,( 個々の実数と平均の差の二乗(_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗)),_個々の実数と平均の差の二乗の合計). 個々の実数と平均の差の二乗(_n個の実数,_n個の実数の平均,_個々の実数と平均の差の二乗) :- 個々の実数(_n個の実数,_個々の実数), _個々の実数と平均の差の二乗 is (_個々の実数 - _n個の実数の平均) ^ 2. 個々の実数(_n個の実数,_個々の実数) :- nth1(_,_n個の実数,_個々の実数). 標準偏差は分散の平方根になる(_n個,_個々の実数と平均の差の二乗の合計,_n個の実数の標準偏差) :- _n個の実数の標本の分散 is _個々の実数と平均の差の二乗の合計 / _n個, _n個の実数の標準偏差 is sqrt(_n個の実数の標本の分散). 実数を得る(_個々の実数) :- 行入力(_行), read_term_from_atom(_行,_実数,[]), 実数診断(_行,_実数),!. 実数を得る(_個々の実数) :- 実数を得る(_個々の実数). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 実数診断(_行,_実数) :- float(_実数),!. 実数診断(Line,_実数) :- writef('入力された %t から実数が得られません。再入力をお願いします。\n',[_行]), fail. findsum(_集約対象項,_目標,_合計) :- findall(_集約対象項,_目標,_集約対象項ならび), sum_list(_集約対象項ならび,_合計). % 以下のサイトは # 出典 :: CodeIQ q1565 # 【問題】 # できるだけ多くの人数で、肩車をしようと思います。 #      # # 肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。 # # # 【例】 # 一行ごとに、身長と体重のセットが与えられます。次の例は、5人の身長と体重を表しています。 # 166 71 # 178 84 # 176 94 # 174 85 # 174 65 # # # この中から肩車をする人間を選ぶと、身長と体重が # (166, 71) # (174, 85) # (176, 94) # の3人が最大人数になります。 # # ※身長と体重共に、上の人が下の人“より小さい”場合に肩車が許されるとしていますので、 #  (174, 85)の上に(174, 65)が乗ることはできません。 'できるだけ多くの人数で、肩車をしようと思います。      肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_最大人数) :- 身長と体重のセットを得る(_身長と体重のセット), 'できるだけ多くの人数で、肩車をしようと思います。'(_身長と体重のセット,_最大人数). 'できるだけ多くの人数で、肩車をしようと思います。'(_人間ならび,_最大人数) :- findall(_肩車人数,( 肩車人数(_人間ならび,_肩車人数)),_肩車人数ならび), max_list(_肩車人数ならび,_最大人数). 肩車人数(_人間ならび,_肩車人数) :- select(_取りだされた人間,_人間ならび,_残りの人間ならび), 肩車を重ねる(_取りだされた人間,_残りの人間ならび,_肩車重ね), length(_肩車重ね,_肩車人数). 肩車を重ねる(_自分,_人間ならび,[_自分|_肩車重ね]) :- 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね). 肩車を重ねる(_一番上の人間,_,[_一番上の人間]). 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね) :- select(_上の人間,_人間ならび,_残りの人間ならび), '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_上の人間,_自分), 肩車を重ねる(_上の人間,_残りの人間ならび,_肩車重ね). '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'([_上の人間の身長,_上の人間の体重],[_自分の身長,_自分の体重]) :- _上の人間の身長 @< _自分の身長, _上の人間の体重 @< _自分の体重. 身長と体重のセットを得る(_身長と体重のセット) :- readln(_身長と体重ならび), 身長と体重のセットを得る(_身長と体重ならび,_身長と体重のセット). 身長と体重のセットを得る([],[]). 身長と体重のセットを得る(L,[L|R]) :- readln(_次の身長と体重ならび), 身長と体重のセットを得る(_次の身長と体重ならび,R). % 以下のサイトは # 出典 :: https://twitter.com/ichyo/status/746985274232602624 'みんなで食べる プチシュー13個 カスタードクリーム入り 295円(税込)'(_みんなで食べるプチシューの割り分) :- findall(L,( 重複を許した部分集合([1,2,3,4,5,6,7,8,9,10,11,12,13],L), sum_list(L,13)),_みんなで食べるプチシューの割り分). 重複を許した部分集合(_,[]). 重複を許した部分集合(A,B) :- length(A,C), between(1,C,D), 重複組合せ(A,D,B) . 重複組合せ(L,1,[A]) :- member(A,L). 重複組合せ([A|R1],N,[A|R2]) :- 'Nを1減らして残り要素の重複組合せ'([A|R1],N,R2). 重複組合せ([A|R1],N,R2) :- 'Nはそのままで残り要素の重複組合せ'([A|R1],N,R2). 'Nを1減らして残り要素の重複組合せ'([A|R1],N,R2) :- N > 1, succ(N_1,N), 重複組合せ([A|R1],N_1,R2). 'Nはそのままで残り要素の重複組合せ'([A|R1],N,R2) :- N > 1, 重複組合せ(R1,N,R2). ?- 'みんなで食べる プチシュー13個 カスタードクリーム入り 295円(税込)'(_みんなで食べるプチシューの割り分). _みんなで食べるプチシューの割り分 = [[13], [1,12],[2,11],[3,10],[4,9],[5,8],[6,7], [1,1,11],[1,2,10],[1,3,9],[1,4,8],[1,5,7],[1,6,6],[2,2,9],[2,3,8],[2,4,7],[2,5,6], [3,3,7],[3,4,6],[3,5,5],[4,4,5],[1,1,1,10],[1,1,2,9],[1,1,3,8],[1,1,4,7],[1,1,5,6], [1,2,2,8],[1,2,3,7],[1,2,4,6],[1,2,5,5],[1,3,3,6],[1,3,4,5],[1,4,4,4],[2,2,2,7], [2,2,3,6],[2,2,4,5],[2,3,3,5],[2,3,4,4],[3,3,3,4],[1,1,1,1,9],[1,1,1,2,8],[1,1,1,3,7], [1,1,1,4,6],[1,1,1,5,5],[1,1,2,2,7],[1,1,2,3,6],[1,1,2,4,5],[1,1,3,3,5],[1,1,3,4,4], [1,2,2,2,6],[1,2,2,3,5],[1,2,2,4,4],[1,2,3,3,4],[1,3,3,3,3],[2,2,2,2,5],[2,2,2,3,4], [2,2,3,3,3],[1,1,1,1,1,8],[1,1,1,1,2,7],[1,1,1,1,3,6],[1,1,1,1,4,5],[1,1,1,2,2,6], [1,1,1,2,3,5],[1,1,1,2,4,4],[1,1,1,3,3,4],[1,1,2,2,2,5],[1,1,2,2,3,4],[1,1,2,3,3,3], [1,2,2,2,2,4],[1,2,2,2,3,3],[2,2,2,2,2,3],[1,1,1,1,1,1,7],[1,1,1,1,1,2,6],[1,1,1,1,1,3,5], [1,1,1,1,1,4,4],[1,1,1,1,2,2,5],[1,1,1,1,2,3,4],[1,1,1,1,3,3,3],[1,1,1,2,2,2,4], [1,1,1,2,2,3,3],[1,1,2,2,2,2,3],[1,2,2,2,2,2,2],[1,1,1,1,1,1,1,6],[1,1,1,1,1,1,2,5], [1,1,1,1,1,1,3,4],[1,1,1,1,1,2,2,4],[1,1,1,1,1,2,3,3],[1,1,1,1,2,2,2,3],[1,1,1,2,2,2,2,2], [1,1,1,1,1,1,1,1,5],[1,1,1,1,1,1,1,2,4],[1,1,1,1,1,1,1,3,3],[1,1,1,1,1,1,2,2,3], [1,1,1,1,1,2,2,2,2],[1,1,1,1,1,1,1,1,1,4],[1,1,1,1,1,1,1,1,2,3],[1,1,1,1,1,1,1,2,2,2], [1,1,1,1,1,1,1,1,1,1,3],[1,1,1,1,1,1,1,1,1,2,2],[1,1,1,1,1,1,1,1,1,1,1,2], [1,1,1,1,1,1,1,1,1,1,1,1,1]]. % 以下のサイトは '与えられた数字よりも小さい数字の中で、素数がいくつあるか調べる データが標準入力で与えられた際、結果を標準出力に出力する' :- データが標準入力で与えられた際(_与えられた数字), '与えられた数字よりも小さい数字の中で、素数がいくつあるか調べる'(_与えられた数字,_いくつ), 結果を標準出力に出力する(_いくつ). データが標準入力で与えられた際(_与えられた数字) :- write('数字を入力してください : '), read_line_to_codes(current_input,Codes), number_codes(_与えられた数字,Codes). '与えられた数字よりも小さい数字の中で、素数がいくつあるか調べる'(_与えられた数字,_いくつ) :- '与えられた数字よりも小さい数字の中で'(_与えられた数字,_与えられた数字よりも小さい数字のならび), 素数がいくつあるか調べる(_与えられた数字よりも小さい数字のならび,_いくつ). '与えられた数字よりも小さい数字の中で'(_与えられた数字,_与えられた数字よりも小さい数字のならび) :- succ(_与えられた数字_1,_与えられた数字), findall(N,between(2,_与えられた数字_1,N),_与えられた数字よりも小さい数字のならび). 素数がいくつあるか調べる(_与えられた数字よりも小さい数字のならび,_いくつ) :- 度数(非決定性のエラトステネスの篩(_与えられた数字よりも小さい数字のならび,_素数),_いくつ). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|L1],_素数) :- 先頭の素数を網として篩に掛けて行く(N,L1,_素数). 先頭の素数を網として篩に掛けて行く(N,L1,_素数) :- 'L1の要素でNで割り切れないものを篩に掛ける'(N,L1,L2), 非決定性のエラトステネスの篩(L2,_素数). 'L1の要素でNで割り切れないものを篩に掛ける'(N,L1,L2) :- findall(_要素,( 'L1の要素で'(L1,_要素), 'Nで割り切れないものを篩に掛ける'(_要素,N)),L2). 'L1の要素で'(L1,_要素) :- member(_要素,L1). 'Nで割り切れないものを篩に掛ける'(_要素,N) :- \+(0 is _要素 mod N). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). 結果を標準出力に出力する(_いくつ) :- writef('結果は %w\n',[_いくつ]). :- '与えられた数字よりも小さい数字の中で、素数がいくつあるか調べる データが標準入力で与えられた際、結果を標準出力に出力する',halt. % 以下のサイトは ヘッドゼロサプレス数値文字列(_桁数,_数,_ヘッドゼロサプレス数値文字列) :- length(_ヘッドゼロサプレス文字ならび,_桁数), ヘッドゼロサプレス文字ならび(_数,_ヘッドゼロサプレス文字ならび), atom_chars(_ヘッドゼロサプレス数値文字列,_ヘッドゼロサプレス文字ならび). ヘッドゼロサプレス文字ならび(_数,_ヘッドゼロサプレス文字ならび) :- number_chars(_数,_数字ならび), append(L1,_数字ならび,_ヘッドゼロサプレス文字ならび), すべて同一文字(L1,' '). すべて同一文字([],_). すべて同一文字([_同一文字|R],_同一文字) :- すべて同一文字(R,_同一文字). ?- ヘッドゼロサプレス数値文字列(8,-25.42,_ヘッドゼロサプレス数値文字列). _ヘッドゼロサプレス数値文字列 = ' -25.42' % 以下のサイトは # 出典 :: C/C++の宿題片付けます 137代目 #943 # 入力したDNA塩基配列中に,atgという並びがいくつあるか調べるプログラムを作成せよ.但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること. # 【実行例】 # # % ./a.out # 1gattatgtga # 11tgccgatatc # 21gatatgattc # (ここで ^D を押す) # #ATG is 3 # % # # よろしくお願いします。 # # '入力したDNA塩基配列中に,atgという並びがいくつあるか調べるプログラムを作成せよ.但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_いくつ) :- '入力したDNA塩基配列中に,(但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること)'(_DNA塩基ならび), '入力したDNA塩基配列中に,atgという並びがいくつあるか調べる'(_DNA塩基ならび,_いくつ). '入力したDNA塩基配列中に,atgという並びがいくつあるか調べる'(_DNA塩基ならび,_いくつ) :- いくつあるか(atgという並びが(_DNA塩基ならび),_いくつ). atgという並びが(_DNA塩基ならび) :- append(_,[a,t,g|_],_DNA塩基ならび). いくつあるか(_副目標,_いくつ) :- findall(1,_副目標,L), length(L,_いくつ). '入力したDNA塩基配列中に,(但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること)'(_DNA塩基ならび) :- findall(_DNA塩基,( '連続して一文字入力する。但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_文字,_DNA塩基)),_DNA塩基ならび). '連続して一文字入力する。但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_文字,_DNA塩基) :- 連続して一文字入力する(_文字), '但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_文字,_DNA塩基). 連続して一文字入力する(_文字) :- repeat, get_char(_文字), (入力した文字がend_of_fileの時(_文字),!,入力を終了する;true). 入力した文字がend_of_fileの時(end_of_file). 入力を終了する :- fail. '但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_DNA塩基,_DNA塩基) :- member(_DNA塩基,[t,c,a,g]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 137代目 #943 # 入力したDNA塩基配列中に,atgという並びがいくつあるか調べるプログラムを作成せよ.但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること. # 【実行例】 # # % ./a.out # 1gattatgtga # 11tgccgatatc # 21gatatgattc # (ここで ^D を押す) # #ATG is 3 # % # # よろしくお願いします。 # # '入力したDNA塩基配列中に,atgという並びがいくつあるか調べるプログラムを作成せよ.但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_いくつ) :- '入力したDNA塩基配列中に,(但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること)'(_DNA塩基ならび), '入力したDNA塩基配列中に,atgという並びがいくつあるか調べる'(_DNA塩基ならび,_いくつ). '入力したDNA塩基配列中に,atgという並びがいくつあるか調べる'(_DNA塩基ならび,_いくつ) :- いくつあるか(atgという並びが(_DNA塩基ならび),_いくつ). atgという並びが(_DNA塩基ならび) :- append(_,[a,t,g|_],_DNA塩基ならび). いくつあるか(_副目標,_いくつ) :- findall(1,_副目標,L), length(L,_いくつ). '入力したDNA塩基配列中に,(但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること)'(_DNA塩基ならび) :- findall(_DNA塩基,( 連続して一文字入力する(_文字), (入力した文字がend_of_fileの時(_文字),!,入力を終了する; '但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_文字,_DNA塩基))),_DNA塩基ならび). '但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_DNA塩基,_DNA塩基) :- member(_DNA塩基,[t,c,a,g]). 連続して一文字入力する(_文字) :- repeat, get_char(_文字). 入力した文字がend_of_fileの時(end_of_file). 入力を終了する :- fail. % 以下のサイトは ヒストグラムを出力する(_標本ならび) :- ヒストグラムの用意(_標本ならび,LL1), 転置して出力する(LL1). ヒストグラムの用意(_標本ならび,LL1) :- '標本の最大値要素数のリストを作る'(_標本ならび,L1), findall(L1,( 星のリストに変換(_標本ならび,L1)),LL1). '標本の最大値要素数のリストを作る'(_標本ならび,L1) :- 最大値(_標本ならび,_最大値), length(L1,_最大値). 星のリストに変換(_標本ならび,L1) :- member(_標本値,_標本ならび), length(_星のリスト,_標本値), 空白リストと星のリスト(_星のリスト,L1). 空白リストと星のリスト(_星のリスト,L1) :- append(_空白リスト,_星のリスト,L1), all(_空白リスト,' '), all(_星のリスト,*). 転置して出力する(LL1) :- 転置(LL1,LL2), 出力する(LL2). 出力する(LL) :- forall( ならび要素を文字列に変換して(LL,_出力行文字列), writef('%w\n',[_出力行文字列])). ならび要素を文字列に変換して(LL,_出力行文字列) :- member(L,LL), atomic_list_concat(L,_出力行文字列). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). all([],_). all([V|R],V) :- all(R,V). 最大値([A|R],_最大値) :- 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値(_ならび,_最大値_1,_最大値) :- '_ならびの先頭要素の値によって_最大値_1を置き換えて行く'(_ならび,_最大値_1,_最大値). '_ならびの先頭要素の値によって_最大値_1を置き換えて行く'(_ならび,_最大値_1,_最大値) :- '_ならびの先頭要素が_最大値_1より大きい場合、_最大値_1を置き換える'(_ならび,_最大値_1,_最大値). '_ならびの先頭要素の値によって_最大値_1を置き換えて行く'(_ならび,_最大値_1,_最大値) :- '_ならびの先頭要素が_最大値_1と等しいか小さい場合、_最大値_1を置き換えない'(_ならび,_最大値_1,_最大値). '_ならびの先頭要素が_最大値_1より大きい場合、_最大値_1を置き換える'([_先頭要素|R],_最大値_1,_最大値) :- _先頭要素 @> _最大値_1, 最大値(R,_先頭要素,_最大値). '_ならびの先頭要素が_最大値_1と等しいか小さい場合、_最大値_1を置き換えない'([_先頭要素|R],_最大値_1,_最大値) :- _先頭要素 @=< _最大値_1, 最大値(R,_最大値_1,_最大値). % 以下のサイトは 最長反復文字列(_文字列,_最長反復文字列) :- setof([Len,_最長反復文字列], [Len,_最長反復文字列] ^ ( 最長反復文字列(_文字列,Len,_最長反復文字列)),LL), 最長反復文字列を取り出す(LL,_最長反復文字列). 最長反復文字列(_文字列,Len,_最長反復文字列) :- sub_atom(_文字列,_前文字列,_最長反復文字列,_後文字列), atom_length(_最長反復文字列,Len), sub_atom(_後文字列,0,Len,_,_最長反復文字列). 最長反復文字列を取り出す(LL,_最長反復文字列) :- findmax(N,member([N,_],LL),_最長文字数), member([_最長文字数,_最長反復文字列],LL). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは # 出典 :: 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(_得点,( '5人の', '得点(10点満点)を受け取る'(_得点)),_5人の得点ならび). '5人の' :- between(1,5,_). '得点(10点満点)を受け取る'(_得点) :- 行入力(_行文字列), '診断: 得点(10点満点)を受け取る'(_行文字列,_得点),!. '得点(10点満点)を受け取る'(_得点) :- '得点(10点満点)を受け取る'(_得点). '診断: 得点(10点満点)を受け取る'(_行文字列,_得点) :- 行文字列を解析して0から10の範囲の得点を得る(_行文字列,_得点),!. '診断: 得点(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. % 以下のサイトは # # SWI-Prolog用 sub_atom/5 の遅延評価版述語 副文字列/5 # # 第一引数の_文字列が変数であってもすぐにはエラーとならない # 副文字列(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- '選択開始位置0起源、残り長さが共に0で、かつ、文字列が変数'(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列),!. 副文字列(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- freeze(_文字列,sub_atom(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列)). '選択開始位置0起源、残り長さが共に0で、かつ、文字列が変数'(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- '選択開始位置0起源、残り長さが共に0で、'(_選択開始位置0起源,_残り長さ), 'かつ、文字列が変数'(_文字列,_副文字列,_選択長さ). '選択開始位置0起源、残り長さが共に0で、'(_選択開始位置0起源,_残り長さ) :- '選択開始位置0起源、残り長さは整数で'(_選択開始位置0起源,_残り長さ), 共に0である(_選択開始位置0起源,_残り長さ). '選択開始位置0起源、残り長さは整数で'(_選択開始位置0起源,_残り長さ) :- integer(_選択開始位置0起源), integer(_残り長さ). 共に0である(0,0). 'かつ、文字列が変数'(_文字列,_副文字列,_選択長さ) :- var(_文字列), _文字列 = _副文字列, freeze(_文字列,atom_length(_文字列,_選択長さ)). % 以下のサイトは '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). % 以下のサイトは # 出典 :: #132 # 親テーブル # Id, 資産 # 1, 100 # 2, 200 # 3, 400 # # 子テーブル # Id, 親Id, 資産 # 1, 1, 10 # 2, 1, 20 # 3, 2, 10 # 4, 2, 20 # 5, 2, 30 # 6, 3, 10 # # から # Id, 資産 # 1, 60 -- 親1の子供は二人だから、各々の子に 100/2 = 50 を加算する。 # 2, 70 # 3, 76 -- 親2の子供は三人だから、各々の子に 200/3 = 66 を加算する。 # 4, 86 # 5, 96 # 6, 410 -- 親3の子供は一人だから、400 をそのまま加算する。 # # という結果を得たい。 # 要するに、親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい。 # SQL で出来ます? # # 親テーブル(1, 100). 親テーブル(2, 200). 親テーブル(3, 400). 子テーブル(1, 1, 10). 子テーブル(2, 1, 20). 子テーブル(3, 2, 10). 子テーブル(4, 2, 20). 子テーブル(5, 2, 30). 子テーブル(6, 3, 10). 親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい(_一覧) :- findall([_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額],子供の親資産と自分を含めた兄弟人数を調べて親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額),_一覧). 子供の親資産と自分を含めた兄弟人数を調べて親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額) :- 子テーブル(_Id,_親Id,_資産), 親資産と自分を含めた兄弟人数を調べて(_Id,_親Id,_親資産,_自分を含めた兄弟人数), 親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_資産,_親資産,_自分を含めた兄弟人数,_親の資産を子供に分配して各々の子供の資産と合わせた額). 親資産と自分を含めた兄弟人数を調べて(_Id,_親Id,_親資産,_自分を含めた兄弟人数) :- 親テーブル(_親Id,_親資産), 自分を含めた兄弟人数(_親Id,_自分を含めた兄弟人数). 自分を含めた兄弟人数(_親Id,_自分を含めた兄弟人数) :- 度数(子テーブル(_,_親Id,_),_自分を含めた兄弟人数). 親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_資産,_親資産,_自分を含めた兄弟人数,_親の資産を子供に分配して各々の子供の資産と合わせた額) :- _親の資産を子供に分配して各々の子供の資産と合わせた額 is _資産 + _親資産 // _自分を含めた兄弟人数. 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは # 出典 :: #132 # 親テーブル # Id, 資産 # 1, 100 # 2, 200 # 3, 400 # # 子テーブル # Id, 親Id, 資産 # 1, 1, 10 # 2, 1, 20 # 3, 2, 10 # 4, 2, 20 # 5, 2, 30 # 6, 3, 10 # # から # Id, 資産 # 1, 60 -- 親1の子供は二人だから、各々の子に 100/2 = 50 を加算する。 # 2, 70 # 3, 76 -- 親2の子供は三人だから、各々の子に 200/3 = 66 を加算する。 # 4, 86 # 5, 96 # 6, 410 -- 親3の子供は一人だから、400 をそのまま加算する。 # # という結果を得たい。 # 要するに、親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい。 # SQL で出来ます? # # 親テーブル(1, 100). 親テーブル(2, 200). 親テーブル(3, 400). 子テーブル(1, 1, 10). 子テーブル(2, 1, 20). 子テーブル(3, 2, 10). 子テーブル(4, 2, 20). 子テーブル(5, 2, 30). 子テーブル(6, 3, 10). 親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい(_一覧) :- findall([_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額],子供の親資産と自分を含めた兄弟人数を調べて親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額),_一覧). 子供の親資産と自分を含めた兄弟人数を調べて親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額) :- 子テーブル(_Id,_親Id,_資産), 親資産と自分を含めた兄弟人数を調べて(_Id,_親Id,_親資産,_自分を含めた兄弟人数), 親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_資産,_親資産,_自分を含めた兄弟人数,_親の資産を子供に分配して各々の子供の資産と合わせた額). 親資産と自分を含めた兄弟人数を調べて(_Id,_親Id,_親資産,_自分を含めた兄弟人数) :- 親テーブル(_親Id,_親資産), 自分を含めた兄弟人数(_親Id,_自分を含めた兄弟人数). 自分を含めた兄弟人数(_親Id,_自分を含めた兄弟人数) :- 度数(子テーブル(_,_親Id,_),_自分を含めた兄弟人数). 親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_資産,_親資産,_自分を含めた兄弟人数,_親の資産を子供に分配して各々の子供の資産と合わせた額) :- _親の資産を子供に分配して各々の子供の資産と合わせた額 is _資産 + _親資産 // _自分を含めた兄弟人数. 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは # 出典:: 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++の宿題片付けます 158代目 #880 # [1]授業単元:C言語 # [2]問題文 # マインスイーパのような爆弾ゲームプログラムを作成する。 # 1. マス目を8× 8に設定する。 # 2. 爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)。 # 3.まだ指定していないマス目には数字の0の代わりに記号'-'を表示する。 # 4.爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を # 表示する(最小で0、最大で8)。 # 5. 爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字 # の'x'を表示し、"Bomb!"と表示して終了する。 # # [3]環境 # [3.1]windows7 # [3.2]gcc # [3.3]C/C++ # [4]7月20日 # よろしくお願いします。 # マインスイーパ :- 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面). 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面) :- 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面), '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(_平坦なならびで表現された盤面). マインスイーパ(_平坦なならびで表現された盤面) :- 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面),!. マインスイーパ(_平坦なならびで表現された盤面) :- マインスイーパを継続する(_平坦なならびで表現された盤面). 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面) :- 度数((member(A,_平坦なならびで表現された盤面),atom(A)),64), write('あなたの勝ちです。\n'). マインスイーパを継続する(_平坦なならびで表現された盤面) :- '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置), マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置) :- 爆弾を隠して盤面を表示する(_平坦なならびで表現された盤面), マス目を選択させる(_行位置,_列位置). マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面),!. マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面), 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面) :- 平坦化した位置に変換(_行位置,_列位置,_nth1), nth1(_nth1,_平坦なならびで表現された盤面,0). 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面) :- 爆弾は周囲にいくつあるか(_nth1,_平坦なならびで表現された盤面,_個数), writef('周囲に爆弾は %w 個あります\n',[_個数]),!. '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面) :- 得点は(_平坦なならびで表現された盤面,_得点), 爆弾が置かれたすべてのマス目に小文字のxを表示し(_平坦なならびで表現された盤面), writef('\n Bomb! \n\n\n あなたの得点は %t です\n',[_得点]). 得点は(_平坦なならびで表現された盤面,_得点) :- 度数((member(A,_平坦なならびで表現された盤面),\+(var(A)),A==0),_得点). 爆弾が置かれたすべてのマス目に小文字のxを表示し([]) :- !. 爆弾が置かれたすべてのマス目に小文字のxを表示し(L) :- 爆弾が置かれたすべてのマス目に小文字のxを表示して行く(L). 爆弾が置かれたすべてのマス目に小文字のxを表示して行く([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾が置かれたすべてのマス目に小文字のxを表示し(R). 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 行末まで表示する(A,R). 行末まで表示する(A,R) :- 爆弾を含むマス目表示文字(A,_表示文字), 爆弾を含むマス目表示(R,_表示文字). 爆弾を含むマス目表示(R,_表示文字) :- writef('%w',[_表示文字]), R = [], write('\n'). マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R) :- append(_,[A|R],[_1,_2,_3,_4,_5,_6,_7,_8]). 爆弾を含むマス目表示文字(V,'-') :- var(V),!. 爆弾を含むマス目表示文字('x','x') :- !. 爆弾を含むマス目表示文字(_,0). 爆弾を隠して盤面を表示する([]). 爆弾を隠して盤面を表示する([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾を隠して盤面を表示する(R). 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 爆弾を隠して行末まで表示する(A,R). 爆弾を隠して行末まで表示する(A,R) :- 爆弾を隠すマス目表示文字(A,_表示文字), 爆弾を隠すマス目表示(_表示文字,R). 爆弾を隠すマス目表示(_表示文字,R) :- writef('%w',[_表示文字]), R = [], write('\n'). 爆弾を隠すマス目表示文字(V,'-') :- var(V),!. 爆弾を隠すマス目表示文字('x','-') :- !. 爆弾を隠すマス目表示文字(_,0). 平坦化した位置に変換(_行位置,_列位置,_nth1) :- _nth1 is (_行位置-1) * 8 + _列位置. 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面) :- length(_平坦なならびで表現された盤面,64). '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(L) :- 爆弾は10個にし(Lp), 同じマス目に重ならないようにランだけに配置する(Lp,L). 爆弾は10個にし(Lp) :- length(Lp,10). 同じマス目に重ならないようにランだけに配置する([],L) :- !. 同じマス目に重ならないようにランだけに配置する([_|R1],L) :- 同じマス目に重ならないようにランダムに一個爆弾を設置する(L), 同じマス目に重ならないようにランだけに配置する(R1,L). 同じマス目に重ならないようにランダムに一個爆弾を設置する(L) :- ランダムに(L,_nth0), 同じマス目に重ならないように一個爆弾を設置する(_nth0,L),!. ランダムに(L,_nth0) :- repeat, _nth0 is random(64). 同じマス目に重ならないように一個爆弾を設置する(_nth0,L) :- 同じマス目に重ならないように(_nth0,L,V), 一個爆弾を設置する(V). 同じマス目に重ならないように(_nth0,L,V) :- nth0(_nth0,L,V), var(V). 一個爆弾を設置する(x). 爆弾は周囲にいくつあるか(N,L,_個数) :- 度数(周囲の八箇所の中で爆弾があるのは(N,L),_個数). 周囲の八箇所の中で爆弾があるのは(N,L) :- 周辺の八箇所の中で(N,_nth1), '_nth1には爆弾がある'(_nth1,L). 周辺の八箇所の中で(N,_nth1) :- member(_式,[N-9,N-8,N-7,N-1,N,N+1,N+7,N+8,N+9]), _nth1 is _式. '_nth1には爆弾がある'(_nth1,L) :- nth1(_nth1,L,V), 変数ではなく爆弾がある(V). 変数ではなく爆弾がある(V) :- 変数ではなく(V), V = x. 変数ではなく(V) :- \+(var(V)). マス目を選択させる(_行位置,_桁位置) :- 整数を得る('マス目の行位置(1-8) ',between(1,8,_行位置),_行位置), 整数を得る('マス目の桁位置(1-8) ',between(1,8,_桁位置),_桁位置),!. 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から(_催促文,_行), 行を条件付きで整数に変換する(_行,_条件,_整数),!. 催促文付き行入力から(_催促文,_行) :- writef('%w',[_催促文]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_chars(_行,Codes). 行を条件付きで整数に変換する(_行,_条件,_整数) :- 行を整数に変換する(_行,_整数), 整数入力条件検査(_条件). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査(_整数). 整数検査(_整数) :- integer(_整数),!. 整数検査(_項) :- 整数検査再入力要請(_項). 整数検査再入力要請(_項) :- writef('入力された項 %w は整数になりません。再入力をお願いします。\n',[_項]), fail. 整数入力条件検査(_条件) :- catch(_条件,E,fail),!. 整数入力条件検査(_条件) :- 整数入力条件検査再入力要請(_条件). 整数入力条件検査再入力要請(_条件) :- writef('入力された %w は成立しません。再入力をお願いします。\n',[_条件]), fail. % 以下のサイトは # 出題 :: プログラミングのお題スレ Part3 #482 # # お題:二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。 # 例 # aabaabbab -> a '二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_多数派の文字) :- 文字ならびに変換して二種の文字を得る(_二種類の文字からなる長さが奇数の文字列,_文字ならび,_甲,_乙), 多数派の文字を求める(_文字ならび,_甲,_乙,_多数派の文字). 文字ならびに変換して二種の文字を得る(_二種類の文字からなる長さが奇数の文字列,_文字ならび,_甲,_乙) :- atom_chars(_二種類の文字からなる長さが奇数の文字列,_文字ならび), ふたつの文字は異なる(_文字ならび,_甲,_乙),!. ふたつの文字は異なる(_文字ならび,_甲,_乙) :- append([_甲|_],[_乙|_],_文字ならび), _甲 \== _乙. 多数派の文字を求める(_文字ならび,_甲,_乙,_多数派の文字) :- 度数を得る(_文字ならび,_甲,_甲の度数,_乙の度数), 多数派の文字を得る(_甲,_乙,_甲の度数,_乙の度数,_多数派の文字). 度数を得る(_文字ならび,_甲,_甲の度数,_乙の度数) :- length(_文字ならび,_文字数), 度数(member(_甲,_文字ならび),_甲の度数), _乙の度数 is _文字数 - _甲の度数. 多数派の文字を得る(_甲,_,_甲の度数,_乙の度数,_甲) :- _甲の度数 > _乙の度数. 多数派(_,_乙,_,_,_乙). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは バイバイマン(LL) :- findnsols(101,[N,_値],バイバイマン([],[0,1,1,1,1],N,_値),LL),!. バイバイマン(Ln,_値,N,_値) :- length(Ln,N). バイバイマン(Ln,[A,B,C,D,E],N,_値) :- バイバイマンが行く(Ln,[A,B,C,D,E],N,_値). バイバイマンが行く(Ln,[A,B,C,D,E],N,_値) :- バイバイ([A,B,C,D,E,F,G,H,I,J]), バイバイマン([_|Ln],[F,G,H,I,J],N,_値). バイバイ([_,_,_,_,_]). バイバイ([A,B,C,D,E,F|R]) :- '4(B),5(A)要素前を計算の種とする'([A,B,C,D,E,F|R]). '4(B),5(A)要素前を計算の種とする'([A,B,C,D,E,F|R]) :- F is A + 2 * B, バイバイ([B,C,D,E,F|R]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 134代目 #554 # [1] 授業単元:プログラミング 1 # [2] 問題文(含コード&リンク): # /************************* # ある二つの文字列str1,str2 の編集距離はつぎの3つの操作を行うことによりstr1 をstr2 に変換するのに要する操作の最低回数である # ・ 1文字挿入する # ・ 1文字削除する # ・ 1文字を他の1文字に置き換える # たとえば str1="sport" はstr2="sort" に, 文字 'p' を削除することによりstr2 に変換できるため編集距離は 1 である # # str_n を文字列str の頭からn 番目までの部分列としm(i,j)をstr i とstr j の編集距離を表すものとする.m(i,j)とm(i+1,j),m(i,j+1),m(i+1,j+1)の間に成り立つ再帰式を記述しなさい # # この再帰式に基づき効率良く編集距離を計算するプログラムを2次元配列を利用して作成しなさい.ただし,関数m(i,j)はint型の編集距離を返り値とする. # ******************************/ # 編集距離(_str1,_str2,_編集距離) :- 文字列をならびに変換して編集距離を計算する(_str1,_str2,_編集距離),!. 文字列をならびに変換して編集距離を計算する(_str1,_str2,_編集距離) :- 文字列をならびに変換して(_str1,_str2,L1,L2), 編集距離を計算する(L1,L2,0,_編集距離). 文字列をならびに変換して(_str1,_str2,L1,L2) :- atom_chars(_str1,L1), atom_chars(_str2,L2). 編集距離を計算する(L1,L2,M1,_編集距離) :- 一致する部分がない時はその部分の距離計算を加算して停止する(L1,L2,M1,_編集距離). 編集距離を計算する(L1,L2,M1,_編集距離) :- 一致する部分までの距離を加算して行く(L1,L2,M1,_編集距離). 一致する部分がない時はその部分の距離計算を加算して停止する(L1,L2,M1,_編集距離) :- 一致する部分がない時は(L1,L2), その部分の距離計算を加算して(L1,L2,M1,_編集距離). その部分の距離計算を加算して(L1,L2,M1,_編集距離) :- 距離計算(L1,L2,M1,_編集距離). 一致する部分がない時は(L1,L2) :- \+(一致する部分(L1,L2)). 一致する部分(L1,L2) :- append(_,[X|_],L1), append(_,[X|_],L2). 一致する部分までの距離を加算して行く(L1,L2,M1,_編集距離) :- 一致部分までの編集距離(L1,L2,M1,R1,R2,_一致部分までの編集距離), 編集距離を計算する(R1,R2,_一致部分までの編集距離,_編集距離). 一致部分までの編集距離(L1,L2,M1,R1,R2,_一致部分までの編集距離) :- 一致部分までの(L1,L2,L0_1,L0_2,R1,R2), 距離計算(L0_1,L0_2,M1,_一致部分までの編集距離). 一致部分までの(L1,L2,L0_1,L0_2,R1,R2) :- append(L0_1,[X|R1],L1), append(L0_2,[X|R2],L2). 距離計算(L1,L2,M1,M2) :- 'L1,L2の長さを取り'(L1,L2,Len1,Len2), 距離に加算する(Len1,Len2,M1,M2). 'L1,L2の長さを取り'(L1,L2,Len1,Len2) :- length(L1,Len1), length(L2,Len2). 距離に加算する(Len1,Len2,M1,M2) :- 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離より短い時は、Len2を加算する'(Len1,Len2,M1,M2). 距離に加算する(Len1,Len2,M1,M2) :- 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離と等しいか長い時は、Len1を加算する'(Len1,Len2,M1,M2). 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離より短い時は、Len2を加算する'(Len1,Len2,M1,M2) :- Len1 =< Len2, M2 is M1 + Len2. 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離と等しいか長い時は、Len1を加算する'(Len1,Len2,M1,M2) :- Len1 > Len2, M2 is M1 + Len1. % 以下のサイトは # [1] 授業単元: 基礎プログラミング # [2] 問題文(含コード&リンク): # いま、要素数Nのならび(リスト)に整数がセットされている。 # # 1) 直前・直後の要素が存在し、それら2つの値の平均よりも大きな値を # 持つ要素をすべて印字する。 # 2) ならびからi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が # 等しいとき、iをを印字する。 # ただし出力される要素位置は重複しないこと。 :- op(500,xfx,すべて). P すべて Q :- forall(P,Q). '直前・直後のならび要素が存在し、それら2つの値の平均よりも大きな値を持つ要素をすべて印字する'(_ならび) :- '直前・直後のならび要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) すべて 印字する(_現在の要素). '直前・直後のならび要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) :- '直前・直後のならび要素が存在する現在の要素は'(_ならび,_直前の要素,_現在の要素,_直後の要素), '直前・直後の値の平均よりも大きな値を持つ'(_直前の要素,_現在の要素,_直後の要素). '直前・直後のならび要素が存在する現在の要素は'(_ならび,_直前の要素,_現在の要素,_直後の要素) :- append([_,[_直前の要素,_現在の要素,_直後の要素],_],_ならび). '直前・直後の値の平均よりも大きな値を持つ'(_直前の要素,_現在の要素,_直後の要素) :- _現在の要素 * 1.0 > (_直前の要素 + _直後の要素) / 2. 印字する(_現在の要素) :- writef('%t\n',[_現在の要素]). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、それらの要素の添え字のうち小さな方を印字する'(_ならび) :- forall('ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目), それらの要素の添字の小さな方を印字する(_i番目,_j番目)). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目) :- 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_要素の値), '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_要素の値). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_値) :- append(L1,[_値|_],_ならび), length(L1,_i番目). '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_値) :- append(L3,[_値|L4],_ならび), length(L4,_i番目), length(L3,_j番目). それらの要素の添字の小さな方を印字する(_i番目,_j番目) :- _小さな方 is min(_i番目,_j番目), writef('%w\n',[_小さな方]). % 以下のサイトは # [1] 授業単元: 基礎プログラミング # [2] 問題文(含コード&リンク): # いま、要素数Nのならび(リスト)に整数がセットされている。 # # 1) 直前・直後の要素が存在し、それら2つの値の平均よりも大きな値を # 持つ要素をすべて印字する。 # 2) ならびからi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が # 等しいとき、iをを印字する。 # ただし出力される要素位置は重複しないこと。 :- op(500,xfx,すべて). P すべて Q :- forall(P,Q). '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素をすべて印字する'(_ならび) :- '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) すべて 印字する(_現在の要素). '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) :- append([_,[_直前の要素,_現在の要素,_直後の要素],_],_ならび), _現在の要素 * 1.0 > (_直前の要素 + _直後の要素) / 2. 印字する(_現在の要素) :- writef('%t\n',[_現在の要素]). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、それらの要素の添え字のうち小さな方を印字する'(_ならび) :- forall('ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目), それらの要素の添字の小さな方を印字する(_i番目,_j番目)). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目) :- 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_要素の値), '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_要素の値). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_値) :- append(L1,[_値|_],_ならび), length(L1,_i番目). '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_値) :- append(L3,[_値|L4],_ならび), length(L4,_i番目), length(L3,_j番目). それらの要素の添字の小さな方を印字する(_i番目,_j番目) :- _小さな方 is min(_i番目,_j番目), writef('%w\n',[_小さな方]). % 以下のサイトは # [1] 授業単元: 基礎プログラミング # [2] 問題文(含コード&リンク): # いま、要素数Nのならび(リスト)に整数がセットされている。 # # 1) 直前・直後の要素が存在し、それら2つの値の平均よりも大きな値を # 持つ要素をすべて印字する。 # 2) ならびからi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が # 等しいとき、iをを印字する。 # ただし出力される要素位置は重複しないこと。 '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素をすべて印字する'(_ならび) :- forall('直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素), すべて印字する(_現在の要素)). '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) :- append(_,[_直前の要素,_現在の要素,_直後の要素|_],_ならび), _現在の要素 * 1.0 > (_直前の要素 + _直後の要素) / 2. すべて印字する(_現在の要素) :- writef('%t\n',[_現在の要素]). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、それらの要素の添え字のうち小さな方を印字する'(_ならび) :- forall('ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目), それらの要素の添字の小さな方を印字する(_i番目)). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目) :- 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_要素の値), '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_要素の値), _i番目 =< _j番目. 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_値) :- append(L1,[_値|_],_ならび), length(L1,_i番目). '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_値) :- append(L3,[_値|L4],_ならび), length(L4,_i番目), length(L3,_j番目). それらの要素の添字の小さな方を印字する(_i番目) :- writef('%w\n',[_i番目]). % 以下のサイトは # 出典::★★ Java の宿題ここで答えます Part 69 ★★ #806 # # 【 課題 】鶴亀算:頭の数と足の数を入力し,鶴と亀の数を出力しなさい.計算できない場合は,その旨メッセージを出力しなさい. # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI 】制限なし # 【 期限 】1/23 # 【 Ver 】1.6.0_21 # 【 補足 】プログラムに適切なコメントを入れてください. # # よろしくお願いします # # 鶴亀算(_頭の数,_足の数,_鶴何羽,_亀何匹) :- 頭の数と足の数のならび表現(_頭の数,_足の数,_頭の数ならび表現,_足の数ならび表現), 鶴亀算(_鶴の頭ならび表現,_亀の頭ならび表現,_,_,_頭の数ならび表現,_足の数ならび表現), 頭のならび表現を数表現に変換する(_鶴の頭ならび表現,_亀の頭ならび表現,_鶴何羽,_亀何匹). 鶴亀算([],[],[],[],[],[]). 鶴亀算([_|_鶴の頭],[],[_,_|_鶴の足],[],[_|_頭の数],[_,_|_足の数]) :- 鶴亀算(_鶴の頭,[],_鶴の足,[],_頭の数,_足の数). 鶴亀算([],[_|_亀の頭],[],[_,_,_,_|_亀の足],[_|_頭の数],[_,_,_,_|_足の数]) :- 鶴亀算([],_亀の頭,[],_亀の足,_頭の数,_足の数). 鶴亀算([_|_鶴の頭],[_|_亀の頭],[_,_|_鶴の足],[_,_,_,_|_亀の足],[_,_|_頭の数],[_,_,_,_,_,_|_足の数]) :- 鶴亀算(_鶴の頭,_亀の頭,_鶴の足,_亀の足,_頭の数,_足の数) . 頭の数と足の数のならび表現(_頭の数,_足の数,_頭の数ならび表現,_足の数ならび表現) :- length(_頭の数ならび表現,_頭の数), length(_足の数ならび表現,_足の数). 頭のならび表現を数表現に変換する(_鶴の頭ならび表現,_亀の頭ならび表現,_鶴何羽,_亀何匹) :- length(_鶴の頭ならび表現,_鶴何羽), length(_亀の頭ならび表現,_亀何匹). % 以下のサイトは ある行に実数倍した他の行を加える(_行列,_ある行の位置,_実数,_他の行の位置,_ある行に実数倍した他の行を加えた行列) :- ある行に実数倍した他の行を加えた行で(_行列,_ある行の位置,_実数,_他の行の位置,L1,_ある行に実数倍した他の行を加えた行,R1), ある行を置き換える(L1,_ある行に実数倍した他の行を加えた行,R1,_ある行に実数倍した行を加えた行列). ある行に実数倍した他の行を加えた行で(_行列,_ある行の位置,_実数,_他の行の位置,L1,_ある行に実数倍した他の行を加えた行,R1) :- ある行に(_行列,_ある行の位置,L1,_ある行,R1), 実数倍した他の行(_行列,_他の行の位置,_実数倍した他の行), 行と行との加算(_ある行,_実数倍した他の行,_ある行に実数倍した他の行を加えた行). ある行に(_行列,_ある行の位置,L1,_ある行,R1) :- append(L1,[_ある行|R1],_行列), length([_|L1],_ある行の位置). 実数倍した他の行(_行列,_他の行の位置,_実数倍した他の行) :- 他の行に(_行列,_他の行の位置,_他の行), 行に実数を掛ける(_他の行,_実数,_実数倍した他の行). 他の行に(_行列,_他の行の位置,_他の行) :- append(L2,[_他の行|R2],_行列), length([_|L2],_他の行の位置). 行に実数を掛ける([],_,[]). 行に実数を掛ける(L1,_実数,L2) :- 行に実数を掛けて行く(L1,_実数,L2). 行に実数を掛けて行く([A|R1],_実数,[B|R2]) :- B is A * _実数, 行に実数を掛ける(R1,_実数,R2). 行と行との加算([],[],[]). 行と行との加算(L1,L2,L3) :- 行と行を加算して行く(L1,L2,L3). 行と行を加算して行く([A|R1],[B|R2],[C|R3]) :- C is A + B, 行と行との加算(R1,R2,R3). ある行を置き換える(L1,_ある行に実数倍した他の行を加えた行,R1,_ある行に実数倍した行を加えた行列) :- append(L1,[_ある行に実数倍した他の行を加えた行|R1],_ある行に実数倍した他の行を加えた行列). % 以下のサイトは % 非決定性 シャッフルして一枚取り出す/4 シャッフルして一枚取り出す(_札,_既に取り出した札,_取り出す札,_残り札) :- シャッフル(_札,_シャッフルした札), append(_既に取り出した札,[_取り出す札|_残り札],_シャッフルした札). % 決定性 シャッフル/2 シャッフル([],[]) :- !. シャッフル(L,[A|R2]) :- 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2). 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2) :- 位置を示す乱数を使い(L,_乱数), 一個ずつ取り出して行く(L,_乱数,A,R2). 位置を示す乱数を使い(L,_乱数) :- length(L,Len), _乱数 is random(Len). 一個ずつ取り出して行く(L,_乱数,A,R2) :- 取り出して行く(L,_乱数,A,R1), シャッフル(R1,R2). 取り出して行く(L,_乱数,A,R1) :- nth0(_乱数,L,A), select(A,L,R1). % 以下のサイトは 行列の2つの行を交換する(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), 行列の2つの行を交換する(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行を交換した行列). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). 行列の2つの行を交換する(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行を交換した行列) :- length(_行列,_行列の行数), '2つの行を交換しながら別に行列を生成する'(_行列,_行列の行数,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行を交換した行列). '2つの行を交換しながら別に行列を生成する'(_行列,_行列の行数,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行を交換した行列) :- findnsols(_生成された行,_行列の行数,( 行を生成する(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_生成された行)),_2つの行を交換した行列),!. 行を生成する(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_生成された行) :- nth1(_nth1,_,_生成された行), '交換する行は交換し、そうでないものは行列から取得'(_行列,_nth1,_第何行_1,_第何行_2,_行_1,_行_2,_生成された行). '交換する行は交換し、そうでないものは行列から取得'(_,_nth1,_nth1,_,_,_行_2,_行_2) :- !. '交換する行は交換し、そうでないものは行列から取得'(_,_nth1,_,_nth1,_行_1,_,_行_1) :- !. '交換する行は交換し、そうでないものは行列から取得'(_行列,_nth1,_,_,_,_,_行) :- nth1(_nth1,_行列,_行). % 以下のサイトは '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://toro.2ch.net/test/read.cgi/tech/1381909900/505 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): #  キーボードから正負の整数をデタラメに入力し、整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ # 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数の和,_5つの正の整数の平均) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'([],_5つの正の整数ならび), 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均). 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび,_正の整数ならび) :- 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび),!. 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび). 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび) :- length(_正の整数ならび,5). 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数), '正の整数のみをリストに格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2), 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_2,_正の整数ならび). 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 整数を入力する(_整数),!. 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数). 整数を入力する(_整数) :- 行入力(_行), '診断 :: 整数'(_行,_整数). '診断 :: 整数'(_行,_整数) :- read_term_from_atom(_行,_整数,[]), integer(_整数). '正の整数のみをリストに格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2) :- _整数 >= 0, append(_正の整数ならび_1,[_整数],_正の整数ならび_2). '正の整数のみをリストに格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_1) :- _整数 < 0. 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均) :- sum_list(_5つの正の整数ならび,_5つの正の整数の和), _5つの正の整数の平均 is floor((_5つの正の整数の和 / 5) * 10 + 0.5) / 10. 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 【 課題 】マス取りゲーム # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11/27 24:00 # 【 Ver  】"1.7.0_45" # 【 補足 】3×3のマスに『○』と『×』を交互に入力して9マス埋まったら終了です。 # 勝ち負けはいりません 戦略なしマス取りゲーム(_手順) :- 戦略なしマス取りゲーム(○,[a1,a2,a3,b1,b2,b3,c1,c2,c3],_手順). 戦略なしマス取りゲーム(_手番,[],[]). 戦略なしマス取りゲーム(_手番,_残りマスならび,_手順) :- 空いたマスがあれば戦略なしマス取りゲームを続ける(_手番,_残りマスならび,_手順). 空いたマスがあれば戦略なしマス取りゲームを続ける(_手番,_残りマスならび,[[_手番,_マス]|_手順]) :- 空いたマスがあれば(_残りマスならび), 手番がマスをひとつ取る(_手番,_残りマスならび,_次の手番,_マス,_ひとつマスを取られた残りマスならび), 戦略なしマス取りゲーム(_次の手番,_ひとつマスを取られた残りマスならび,_手順). 空いたマスがあれば(_残りマスならび) :- \+(_残りマスならび = []). 手番がマスをひとつ取る(_手番,_残りマスならび,_次の手番,_マス,_ひとつマスを取られた残りマスならび) :- マスをひとつ取る(_残りマスならび,_マス), ひとつマスを取られた残りマスならび(_マス,_残りマスならび,_ひとつマスを取られた残りマスならび), 次の手番(_手番,_次の手番). マスをひとつ取る(_残りマスならび,_マス) :- length(_残りマスならび,_残りマス数), _乱順数 is random(_残りマス数), nth0(_乱順数,_残りマスならび,_マス). ひとつマスを取られた残りマスならび(_マス,_残りマスならび,_ひとつマスを取られた残りマスならび) :- select(_マス,_残りマスならび,_ひとつマスを取られた残りマスならび). 次の手番(○,×). 次の手番(×,○). % 以下のサイトは # 出典::プログラミングのお題スレ 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). % 以下のサイトは '2文字の抽出とその出現頻度を求める'(_文字列,_抽出された出現頻度付きの2文字ならび) :- '2文字の抽出と'(_文字列,_抽出された2文字ならび), その出現頻度を求める(_文字列,_抽出された2文字ならび,_抽出された出現頻度付きの2文字ならび). '2文字の抽出と'(_文字列,_抽出された2文字ならび) :- setof(_2文字,[_文字列,S,R,_2文字] ^ sub_atom(_文字列,S,2,R,_2文字),_抽出された2文字ならび). その出現頻度を求める(_文字列,_抽出された2文字ならび,_抽出された出現頻度付きの2文字ならび) :- findall([_2文字,_出現頻度],( member(_2文字,_抽出された2文字ならび), 出現頻度(sub_atom(_文字列,_,2,_,_2文字),_出現頻度)),_抽出された出現頻度付きの2文字ならび). 出現頻度(P,_出現頻度) :- findall(1,P,L), length(L,_出現頻度). % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび), 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび), 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), get_line(_行), length(Ln,100), 成績データを得る(Ln,_行,_整列鍵ならび,_成績ならび). 成績データを得る(_,'0 0',[]) :- !. 成績データを得る([],_,[]). 成績データを得る([_|Ln],_行,[[_学籍番号,_成績]|R]) :- split(_行,[' '],[_学籍番号,_成績]), get_line(_行_2), 成績データを得る(Ln,_行_2,R). 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ member([_学籍番号,_成績],_成績ならび),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび) :- 上位11名を選別する(_上位11名), 上位11名を表示する(_上位11名). 上位11名を選別する(_降順に整列した成績鍵ならび,_成績ならび,_上位11名ならび) :- once(findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_降順に整列した成績鍵ならび,_成績ならび,_学籍番号,_成績),_上位11名ならび)). '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_降順に整列した成績鍵ならび,_成績ならび,_学籍番号,_成績) :- member(_成績,_降順に整列した成績鍵ならび), member([_学籍番号,_成績],_成績ならび). 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出典:: http://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 % 以下のサイトは # 出典::スレ立てるまでもない質問はここで 105匹目 #516 # 文字列をひっくり返す関数下さい # # in→あいうえお # out→おえうあい # # こんな感じのです # # # 文字列をひっくり返す関数下さい(_in,_out) :- 仕様に勘違いがある(_in,_out). 文字列をひっくり返す関数下さい(_in,_out) :- 仕様には深淵なるルールがある(_in,_out). 仕様に勘違いがある(_in,_out) :- 勘違い(おえうあい,おえういあ), '勘違いだと分かったら最も常識的な解決、乃ち文字列を単に反転する'(_in,_out). 勘違い(おえうあい,おえういあ). '勘違いだと分かったら最も常識的な解決、乃ち文字列を単に反転する'(_in,_out) :- atom_chars(_in,_文字ならび), reverse(_文字ならび,_反転した文字ならび), atom_chars(_out,_反転した文字ならび). 仕様には深淵なるルールがある(_in,_out) :- 仕様には深遠なるルールがある(_in,_out). 仕様には深遠なるルールがある(_in,_out) :- atom_chars(_in,Chars), 深遠なるルールを文字のならびで(Chars,Chars2), atom_chars(_out,Chars2). 深遠なるルールを文字のならびで(Chars,Chars2) :- 第三要素から残り最後までを反転し最初の二要素を付加する(Chars,Chars2). 深遠なるルールを文字のならびで(Chars,Chars2) :- 一旦反転して最終二要素を置換する(Chars,Chars2). 深遠なるルールを文字のならびで(Chars,Chars2) :- 文字置換ルールに従って文字を置換する(Chars,Chars2). 第三要素から残り最後までを反転し最初の二要素を付加する(Chars,Chars2) :- 最初の二要素(Chars,_最初のに要素,_第三要素から残り最後まで), 第三要素から残り最後までを反転し(_第三要素から残りの最後まで,_反転した第三要素から残りの最後まで), 最初の二要素を付加する(_反転した第三要素から残りの最後まで,_最初の二要素,Chars2). 最初の二要素(Chars,_最初の二要素,_第三要素から残り最後まで) :- length(_最初の二要素,2), append(_最初の二要素,_第三要素から残り最後まで,Chars). 第三要素から残り最後までを反転し(_第三要素から最後まで,_反転した第三要素から最後まで) :- reverse(_第三要素から最後まで,_反転した第三要素から最後まで). 最初の二要素を付加する(_反転した第三要素から最後まで,_最初の二要素,Chars2) :- append(_反転した第三要素から最後まで,_最初の二要素,Chars2). 一旦反転して最終二要素を置換する(_文字ならび,_一旦反転して最終二要素を置換した文字ならび) :- 一旦反転して(_文字ならび,_反転した文字ならび), 最終二要素を置換する(_反転した文字ならび,_一旦反転して最終二要素を置換した文字ならび). 一旦反転して(_文字ならび,_反転した文字ならび) :- reverse(_文字ならび,_反転した文字ならび). 最終二要素を置換する(_反転した文字ならび,_一旦反転して最終二要素を置換した文字ならび) :- append(L,[A,B],_反転した文字ならび), append(L,[B,A],_一旦反転して最終二要素を置換した文字ならび). 文字置換ルールに従って文字を置換する(_文字ならび,_置換された文字ならび) :- findall(_置換文字, 置換文字を取り出す(_文字ならび,_置換文字),_置換された文字ならび). 置換文字を取り出す(_文字ならび,_置換文字) :- member(_文字,_文字ならび), 文字置換ルール(_文字,_置換文字). 文字置換ルール(あ,お). 文字置換ルール(い,え). 文字置換ルール(う,う). 文字置換ルール(え,あ). 文字置換ルール(お,い). % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- '1+2+3+....+nが1000になる直前の変数nの値を求めよ'([],[],_n),!. '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(L,Ls_1,_n) :- 加算するとならび要素が1000を超える(L,Ls_1,_n). '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(L1,Ls_1,_n) :- append([_|L1],Ls_1,Ls_2), '1+2+3+....+nが1000になる直前の変数nの値を求めよ'([_|L1],Ls_2,_n). 加算するとならび要素が1000を超える(L,Ls_1,_n) :- append([_|L],Ls_1,Lx), length(Lx,X), X >= 1000, length(L,_n). % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- length(Ln,1000), '1+2+3+....+nが1000になる直前の変数nの値を求めよ'([],Ln,[],L), length(L,_n). '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(L,Ln,Ls_1,L) :- 加算するとならび要素が1000を超える(L,Ln,Ls_1),!. '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(L1,Ln,Ls_1,L) :- append([_|L1],Ls_1,Ls_2), '1+2+3+....+nが1000になる直前の変数nの値を求めよ'([_|L1],Ln,Ls_2,L). 加算するとならび要素が1000を超える(L,Ln,Ls_1) :- append([_|L],Ls_1,Lx), append(Ln,_,Lx). % 以下のサイトは # # 出典::パスワード向け文字列検査 # 半角英数字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(_蔵ならび,_幾つ). % 以下のサイトは # 出典::C/C++の宿題片付けます 128代目 #222 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9599.txt # “パスカルの三角形”を表示するプログラムを作ってください。 # ただし、表示する段数はキー入力するようにします。 # # 実行の様子はこのような感じです。 # # [b8000@localhost]$ ./main # 何段表示しますか?: 13 # 1 # 1 1 # 1 2 1 # 1 3 3 1 # 1 4 6 4 1 # 1 5 10 10 5 1 # 1 6 15 20 15 6 1 # 1 7 21 35 35 21 7 1 # 1 8 28 56 70 56 28 8 1 # 1 9 36 84 126 126 84 36 9 1 # 1 10 45 120 210 252 210 120 45 10 1 # 1 11 55 165 330 462 462 330 165 55 11 1 # 1 12 66 220 495 792 924 792 495 220 66 12 1 # # # この問題は、calloc() を使って領域確保をしてください。 # 段数を入力した後、calloc() を使って、必要分の領域確保をします。 # # 表示の体裁は大まかに二等辺三角形の形になっていればOKです。 # なお、上の実行例のプログラムでは、 # # printf("%3d ", 〜); # ↑ # ここは半角スペース3個 # # という記述で表示を行なっています。 パスカルの三角形(_段) :- パスカルの三角形(_段,LL), パスカルの三角形_表示(_段,LL). パスカルの三角形(_段,[[1]|LL]) :- length([_|Ln],_段), パスカルの三角形加算(Ln,[1,1],LL). パスカルの三角形加算([],_,[]). パスカルの三角形加算([_|Ln],L,[L|R2]) :- 指定された段に達するまでパスカルの三角形加算を続ける(Ln,L,R2). 指定された段に達するまでパスカルの三角形加算を続ける(Ln,L,R2) :- パスカルの三角形一行計算(L,L1), パスカルの三角形加算(Ln,L1,R2). パスカルの三角形一行計算(L,L1) :- 上の行の隣り合う二項の合計を取っていく(L,L0), 両端に1を付加する(L0,L1). 上の行の隣り合う二項の合計を取っていく(L,L0) :- findall(N,( append(_,[A,B|_],L),N is A + B),L0). 両端に1を付加する(L0,L1) :- append([1|L0],[1],L1). パスカルの三角形_表示(0,_) :- !. パスカルの三角形_表示(N,[L|R]) :- 'N>0の間、パスカルの三角形の表示'(N,L,R). 'N>0の間、パスカルの三角形の表示'(N,L,R) :- N > 0, succ(N_1,N), パスカルの三角形一行表示(N_1,L), パスカルの三角形_表示(N_1,R). パスカルの三角形一行表示(N_1,L) :- 左端からの空白表示(N_1), パスカルの三角形部分表示(L), write('\n'). 左端からの空白表示(N_1) :- 左端からの空白文字列の生成(N_1,_空白文字列), writef('%w',[_空白文字列]). 左端からの空白文字列の生成(N_1,_空白文字列) :- 左端からの空白文字ならびの生成(N_1,_空白ならび), atomic_list_concat(_空白ならび,_空白文字列). 左端からの空白文字ならびの生成(N_1,_空白ならび) :- Len is 3 * N_1, length(_空白ならび,Len), all(_空白ならび,' '). all([],_). all([V|R],V) :- all(R,V). パスカルの三角形部分表示(L) :- forall(member(A,L), writef('%5r ',[A])). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/751 # # [1] 授業単元:文字列 # [2] 問題文(含コード&リンク): # 1行最大80文字の空白を挟まない英字文字列を入力したとき、大文字の文字を小文字に、小文字の文字を大文字にして表示するプログラムを作成しなさい # このプログラムの入力は、英字以外の文字が入力される場合を考慮しなくてもよい # 英大文字ならび(['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']). 英小文字ならび([a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). '1行最大80文字の空白を挟まない英字文字列を入力したとき、大文字の文字を小文字に、小文字の文字を大文字にして表示する' :- 英大文字ならび(_英大文字ならび), 英小文字ならび(_英小文字ならび), '1行最大80文字の空白を挟まない英字文字列を入力したとき、大文字の文字を小文字に、小文字の文字を大文字にして表示する'(_英大文字ならび,_英小文字ならび). '1行最大80文字の空白を挟まない英字文字列を入力したとき、大文字の文字を小文字に、小文字の文字を大文字にして表示する'(_英大文字ならび,_英小文字ならび) :- '1行最大80文字の空白を挟まない英字文字列を入力したとき、'(_英大文字ならび,_英小文字ならび,_英文字ならび), '一行を大文字を小文字に、小文字を大文字にしながら表示する'(_英大文字ならび,_英小文字ならび,_英文字ならび). '1行最大80文字の空白を挟まない英字文字列を入力したとき、'(_英大文字ならび,_英小文字ならび,_最大80字の英文字ならび) :- length(Ln,80), 英文字を読み込む(_英大文字ならび,_英小文字ならび,_英文字), '1行最大80文字の空白を挟まない英字文字ならび'(Ln,_英大文字ならび,_英小文字ならび,_英文字,_最大80字の英文字ならび). '1行最大80文字の空白を挟まない英字文字ならび'(Ln,_,_,_文字,[]) :- '停止条件::改行を読み込むか80字を超える'(Ln,_文字). '1行最大80文字の空白を挟まない英字文字ならび'([_|Ln],_英大文字ならび,_英小文字ならび,_文字,[_文字|R]) :- '1行最大80文字の空白を挟まない英字文字ならび'(Ln,_英大文字ならび,_英小文字ならび,R). '停止条件::改行を読み込むか80字を超える'([],_). '停止条件::改行を読み込むか80字を超える'([_|_],'\n'). '1行最大80文字の空白を挟まない英字文字ならび'(Ln,_英大文字ならび,_英小文字ならび,R) :- 英文字を読み込む(_英大文字ならび,_英小文字ならび,_次の英文字), '1行最大80文字の空白を挟まない英字文字ならび'(Ln,_英大文字ならび,_英小文字ならび,_次の英文字,R). 英文字を読み込む(_英大文字ならび,_英小文字ならび,_英文字) :- get_char(_英文字), 英文字(_英文字,_英大文字ならび,_英小文字ならび),!. 英文字を読み込む(_英大文字ならび,_英小文字ならび,_英文字) :- 英文字を読み込む(_英大文字ならび,_英小文字ならび,_英文字). 英文字(_文字,_英大文字ならび,_) :- member(_文字,_英大文字ならび). 英文字(_文字,_,_英小文字ならび) :- member(_文字,_英小文字ならび). '一行を大文字を小文字に、小文字を大文字にしながら表示する'(_英文字ならび,_英大文字ならび,_英小文字ならび) :- forall(member(_文字,_英文字ならび), '大文字を小文字に、小文字を大文字にして表示する'(_英大文字ならび,_英小文字ならび,_文字)). '大文字を小文字に、小文字を大文字にして表示する'(L1,L2,_文字) :- '大文字を小文字に、小文字を大文字にして'(L1,L2,_文字,_変換された文字), writef('%w',[_変換された文字]). '大文字を小文字に、小文字を大文字にして'(L1,L2,_文字,_変換された文字) :- 英文字変換(L1,L2,_文字,_変換された文字),!. '大文字を小文字に、小文字を大文字にして'(L1,L2,_文字,_変換された文字) :- '大文字を小文字に、小文字を大文字にして'(L2,L1,_文字,_変換された文字). 英文字変換(L1,L2,_文字,_変換された文字) :- nth1(_nth1,L1,_文字), nth1(_nth1,L2,_変換された文字). % 以下のサイトは # # ある専門学校の受験資格のデシジョンテーブル # # <条件> 1 2 3 4 5 6 7 8 # # 体重が軽い N N N N Y Y Y Y # 体が柔らかい N N Y Y N Y N Y # 敏捷である N Y Y N N N Y Y # # <行動> # # 受験資格がある X # 受験資格がない X X X X X X X 体重が軽い(偽,偽,偽,偽,真,真,真,真). 体が柔らかい(偽,偽,真,真,偽,真,偽,真). 敏捷である(偽,真,真,偽,偽,偽,真,真). 受験(諦める,諦める,ダイエットして来年受験する,諦める,諦める,諦める,ヨガに一年通ってから受験する,受験してみる). デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_行動述語名ならび,_選択列,_行動ならび) :- デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_選択列), findall(_行動,( '行動述語の_選択列引数を得る'(_アリティ,_選択列,_行動述語名ならび,_行動)), _行動ならび). デシジョンテーブル(_,[],_,_選択列). デシジョンテーブル(_アリティ,[_述語名|R1],[_真偽値|R2],_選択列) :- 条件述語を実行する(_アリティ,_述語名,_真偽値ならび), nth1(_選択列,_真偽値ならび,_真偽値), デシジョンテーブル(_アリティ,R1,R2,_選択列). 条件述語を実行する(_アリティ,_述語名,_真偽値ならび) :- length(_真偽値ならび,_アリティ), P =.. [_述語名|_真偽値ならび], call(P). '行動述語の_選択列引数を得る'(_アリティ,_選択列,_行動述語名ならび,_行動) :- member(_行動述語名,_行動述語名ならび), 行動述語名の行動ならびを得る(_アリティ,_行動述語名,_行動選択ならび), nth1(_選択列,_行動選択ならび,_行動). 行動述語名の行動選択ならびを得る(_アリティ,_行動述語名,_行動選択ならび) :- length(_行動選択ならび,_アリティ), P =.. [_行動述語名|_行動選択ならび], call(P). % % ?- デシジョンテーブル(8,[体重が軽い,体が柔らかい,敏捷である],[真,偽,真],[受験],_選択列,_行動ならび). % % _選択列 = 7, % _行動ならび = [ヨガに一年通ってから受験する] % % 以下のサイトは 切ったトランプを用意する(_切ったトランプ) :- '52枚の整列したカード'(_52枚の整列したカード), シャッフル(_52枚の整列したカード,_切ったトランプ). '52枚の整列したカード'(_52枚の整列したカード) :- findall([_数,_スート], 'カードを数・スート順に生成する'(_数,_スート),_52枚の整列したカード). 'カードを数・スート順に生成する'(_数,_スート) :- between(1,13,_数), member(_スート,[スペード,ハート,ダイヤ,クラブ]). シャッフル([],[]) :- !. シャッフル(L,[A|R2]) :- 位置を示す乱数を使い一枚ずつ取り出して行くことによりシャッフルする(L,A,R2). 位置を示す乱数を使い一枚ずつ取り出して行くことによりシャッフルする(L,A,R2) :- 位置を示す乱数を使い一枚ずつ取り出して行く(L,A,R2), select(A,L,R1), シャッフル(R1,R2). 位置を示す乱数を使い一枚ずつ取り出して行く(L1,A,R2):- length(L1,Len), _乱数 is random(Len), nth0(_乱数,L1,A). % 以下のサイトは # 出典 :: SQL質疑応答スレ 12問目 #689 # すみません。 # 高専機械科卒なんですがお願いいたします。 # # 以下のようなテーブルにて、あかさたなでGROUP BYしてそれぞれの件数を出力できないかどうか悩んでおります。 # # CREATE TABLE `name_list` ( # kanji varchar(64), # yomi varchar(64) # ) # # INSERT INTO name_list (kanji,yomi) VALUES # ('安部','あべ'), # ('井口','いぐち'), # ('臼井','うすい'), # ('江本','えもと'), # ('小川','おがわ'), # ('柿本','かきもと'), # ('木島','きじま'), # ('九条','くじょう'), # ('毛森','けもり'), # ('小島','こじま'), # ('佐藤','さとう'), # ('しみず','')・・・・・・ # # 勿論、各頭文字で一件ずつじゃないのですが # これを # # あ行 5件 # か行 5件 # さ行 8件 # # のように集計をかけたいと思っておりますが # よい方法が思いつかず… # # 出力結果は、例でして出力した左側のフィールドはなんでもOKです。 # 右側のあかさたな行のそれぞれのレコード数がチェックできればOKです。 # # なにとぞよろしくお願いいたします。 # 名簿(安部,あべ). 名簿(井口,いぐち). 名簿(臼井,うすい). 名簿(江本,えもと). 名簿(小川,おがわ). 名簿(柿本,かきもと). 名簿(木島,きじま). 名簿(九条,くじょう). 名簿(毛森,けもり). 名簿(小島,こじま). 名簿(佐藤,さとう). 名簿(しみず,''). '各頭文字で一件ずつじゃないのですが、これを あ行 5件 か行 5件 さ行 8件 のように集計をかけたい'(_あかさたなはまやらわん,_件数) :- あかさたなはまやらわん(_あかさたなはまやらわん), '件数(但し0件は除く)'('名簿のひらがな読みの最初の文字は_あかさたなはまやらわんの行範囲'(_あかさたなはまやらわん),_件数). '名簿のひらがな読みの最初の文字は_あかさたなはまやらわんの行範囲'(_あかさたなはまやらわん) :- 名簿のひらがな読みの最初の文字は(_ひらがな読みの最初の文字), あかさたなはまやらわん(_あかさたなはまやらわん,_ひらがな読みの最初の文字). 名簿のひらがな読みの最初の文字は(_ひらがな読みの最初の文字) :- 名簿(_,_ひらがな読み), sub_atom(_ひらがな読み,0,1,_,_ひらがな読みの最初の文字). '件数(但し0件は除く)'(_目標,_件数) :- findall(1,_目標,[_|L]), length([_|L],_件数). あかさたなはまやらわん(あ). あかさたなはまやらわん(か). あかさたなはまやらわん(さ). あかさたなはまやらわん(た). あかさたなはまやらわん(な). あかさたなはまやらわん(は). あかさたなはまやらわん(ま). あかさたなはまやらわん(や). あかさたなはまやらわん(ら). あかさたなはまやらわん(わ). あかさたなはまやらわん(ん). あかさたなはまやらわん(あ,あ). あかさたなはまやらわん(あ,ぃ). あかさたなはまやらわん(あ,い). あかさたなはまやらわん(あ,ぅ). あかさたなはまやらわん(あ,う). あかさたなはまやらわん(あ,ぇ). あかさたなはまやらわん(あ,え). あかさたなはまやらわん(あ,ぉ). あかさたなはまやらわん(あ,お). あかさたなはまやらわん(か,か). あかさたなはまやらわん(か,が). あかさたなはまやらわん(か,き). あかさたなはまやらわん(か,ぎ). あかさたなはまやらわん(か,く). あかさたなはまやらわん(か,ぐ). あかさたなはまやらわん(か,け). あかさたなはまやらわん(か,げ). あかさたなはまやらわん(か,こ). あかさたなはまやらわん(か,ご). あかさたなはまやらわん(さ,さ). あかさたなはまやらわん(さ,ざ). あかさたなはまやらわん(さ,し). あかさたなはまやらわん(さ,じ). あかさたなはまやらわん(さ,す). あかさたなはまやらわん(さ,ず). あかさたなはまやらわん(さ,せ). あかさたなはまやらわん(さ,ぜ). あかさたなはまやらわん(さ,そ). あかさたなはまやらわん(さ,ぞ). あかさたなはまやらわん(た,た). あかさたなはまやらわん(た,だ). あかさたなはまやらわん(た,ち). あかさたなはまやらわん(た,ぢ). あかさたなはまやらわん(た,っ). あかさたなはまやらわん(た,つ). あかさたなはまやらわん(た,づ). あかさたなはまやらわん(た,て). あかさたなはまやらわん(た,で). あかさたなはまやらわん(た,と). あかさたなはまやらわん(た,ど). あかさたなはまやらわん(な,な). あかさたなはまやらわん(な,に). あかさたなはまやらわん(な,ぬ). あかさたなはまやらわん(な,ね). あかさたなはまやらわん(な,の). あかさたなはまやらわん(は,は). あかさたなはまやらわん(は,ば). あかさたなはまやらわん(は,ぱ). あかさたなはまやらわん(は,ひ). あかさたなはまやらわん(は,び). あかさたなはまやらわん(は,ぴ). あかさたなはまやらわん(は,ふ). あかさたなはまやらわん(は,ぶ). あかさたなはまやらわん(は,ぷ). あかさたなはまやらわん(は,へ). あかさたなはまやらわん(は,べ). あかさたなはまやらわん(は,ぺ). あかさたなはまやらわん(は,ほ). あかさたなはまやらわん(は,ぼ). あかさたなはまやらわん(は,ぽ). あかさたなはまやらわん(ま,ま). あかさたなはまやらわん(ま,み). あかさたなはまやらわん(ま,む). あかさたなはまやらわん(ま,め). あかさたなはまやらわん(ま,も). あかさたなはまやらわん(や,ゃ). あかさたなはまやらわん(や,や). あかさたなはまやらわん(や,ゅ). あかさたなはまやらわん(や,ゆ). あかさたなはまやらわん(や,ょ). あかさたなはまやらわん(や,よ). あかさたなはまやらわん(ら,ら). あかさたなはまやらわん(ら,り). あかさたなはまやらわん(ら,る). あかさたなはまやらわん(ら,れ). あかさたなはまやらわん(ら,ろ). あかさたなはまやらわん(わ,ゎ). あかさたなはまやらわん(わ,わ). あかさたなはまやらわん(わ,ゐ). あかさたなはまやらわん(わ,ゑ). あかさたなはまやらわん(わ,を). あかさたなはまやらわん(な,ん). % 以下のサイトは % % カレンダーの形式(何曜日から始まるか)と % 月日数と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になる'(_,_). % 以下のサイトは # 出典 :: # すいませんおねがいします。日曜までです。 # # # String型の配列として与えられた人の名前を全て使って「しりとり」を作りましょう。 # 参考資料ファイルを自分のプロジェクトにコピーもしくはインポートし、50音順で並んでいる配列をしりとりの原理で並び替え、出力するプログラムを作成してください。 # -----------Original NameList----------- # ごりら # らっぱ # りんご # -----------Sorted NameList----------- # りんご # ごりら # らっぱ # # 単語は適当に自分がうめるのでプログラミングそのものだけつくってもらえませんか? # # # 語彙集(ごりら). 語彙集(らっぱ). 語彙集(りんご). 語彙集(もも). 語彙集(もり). 語彙集(こくご). 語彙集(らっこ). しりとり(_任意の語彙,_最長のしりとり) :- findall(_しりとり,しりとり([_任意の語彙],_任意の語彙,_しりとり),_しりとりならび), 最長のしりとりを得る(_しりとりならび,_最長のしりとり). しりとり(_すでに使った語彙ならび,_語彙,_しりとり) :- 次の語彙を捜ししりとりを続ける(_すでに使った語彙ならび,_語彙,_しりとり). しりとり(_逆順しりとり,_語彙,_しりとり) :- 逆順しりとりを正順に戻して停止(_逆順しりとり,_しりとり). 次の語彙を捜ししりとりを続ける(_すでに使った語彙ならび,_語彙,_しりとり) :- 次の語彙(_すでに使った語彙ならび,_語彙,_次の語彙), しりとり([_次の語彙|_すでに使った語彙ならび],_次の語彙,_しりとり). 次の語彙(_すでに使った語彙ならび,_語彙,_次の語彙) :- '語彙の末尾の文字と一致する語彙を語彙集の中から捜す'(_語彙,_次の語彙), 次の語彙はすでに使った語彙ではない(_次の語彙,_すでに使った語彙ならび). '語彙の末尾の文字と一致する語彙を語彙集の中から捜す'(_語彙,_次の語彙) :- sub_atom(_語彙,_,1,0,_語彙の最後の文字), 語彙集(_次の語彙), sub_atom(_次の語彙,0,1,_,_語彙の最後の文字). 次の語彙はすでに使った語彙ではない(_次の語彙,_すでに使った語彙ならび) :- \+(member(_次の語彙,_すでに使った語彙ならび)). 逆順しりとりを正順に戻して停止(_逆順しりとり,_しりとり) :- reverse(_逆順しりとり,_しりとり). 最長のしりとりを得る(_しりとりならび,_最長のしりとり) :- しりとりならびの最大要素数を得る(_しりとりならび,_最大要素数), 最大要素数のしりとりを得る(_しりとりならび,_最大要素数,_最長のしりとり). しりとりならびの最大要素数を得る(_しりとりならび,_最大要素数) :- findmax(_要素数,しりとりの要素数(_しりとりならび,_要素数),_最大要素数). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). しりとりの要素数(LL,_要素数) :- member(_しりとり,LL), length(_しりとり,_要素数). 最大要素数のしりとりを得る(LL,_最大要素数,_最長のしりとり) :- member(_最長のしりとり,LL), length(_最長のしりとり,_最大要素数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/689 # # すみません。 # 高専機械科卒なんですがお願いいたします。 # # 以下のようなテーブルにて、あかさたなでGROUP BYしてそれぞれの件数を出力できないかどうか悩んでおります。 # # CREATE TABLE `name_list` ( # kanji varchar(64), # yomi varchar(64) # ) # # INSERT INTO name_list (kanji,yomi) VALUES # ('安部','あべ'), # ('井口','いぐち'), # ('臼井','うすい'), # ('江本','えもと'), # ('小川','おがわ'), # ('柿本','かきもと'), # ('木島','きじま'), # ('九条','くじょう'), # ('毛森','けもり'), # ('小島','こじま'), # ('佐藤','さとう'), # ('しみず','')・・・・・・ # # 勿論、各頭文字で一件ずつじゃないのですが # これを # # あ行 5件 # か行 5件 # さ行 8件 # # のように集計をかけたいと思っておりますが # よい方法が思いつかず… # # 出力結果は、例でして出力した左側のフィールドはなんでもOKです。 # 右側のあかさたな行のそれぞれのレコード数がチェックできればOKです。 # # なにとぞよろしくお願いいたします。 # 名簿(安部,あべ). 名簿(井口,いぐち). 名簿(臼井,うすい). 名簿(江本,えもと). 名簿(小川,おがわ). 名簿(柿本,かきもと). 名簿(木島,きじま). 名簿(九条,くじょう). 名簿(毛森,けもり). 名簿(小島,こじま). 名簿(佐藤,さとう). 名簿(しみず,''). '各頭文字で一件ずつじゃないのですが、これを あ行 5件 か行 5件 さ行 8件 のように集計をかけたい'(_行,_件数) :- append(_,[_行|R],[あ,か,さ,な,ま,や,ら,わ,ん]), '件数(但し0件は除く)'('_行の読み範囲の中に名簿の_ひらがな読みは入っている'(_行,R),_件数). '_行の読み範囲の中に名簿の_ひらがな読みは入っている'(_行,_残りの行) :- '名簿の_ひらがな読みの一字目は行の範囲'(_行,_残りの行). '名簿の_ひらがな読みの一字目は行の範囲'(_行,[]) :- '名簿の_ひらがな読みの一字目は「ん」'. '名簿の_ひらがな読みの一字目は行の範囲'(_行,[_次の行|_]) :- '名簿の一字目は行の範囲'(_行,_次の行). '名簿の一字目は行の範囲'(_行,_次の行) :- 名簿(_,_ひらがな読み), _ひらがな読み @>= _行, _ひらがな読み @< _次の行. '名簿の_ひらがな読みの一字目は「ん」' :- 名簿(_,_ひらがな読み), sub_atom(_ひらがな読み,0,1,_,ん). '件数(但し0件は除く)'(_目標,_件数) :- findall(1,_目標,[_|L]), length([_|L],_件数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/689 # # すみません。 # 高専機械科卒なんですがお願いいたします。 # # 以下のようなテーブルにて、あかさたなでGROUP BYしてそれぞれの件数を出力できないかどうか悩んでおります。 # # CREATE TABLE `name_list` ( # kanji varchar(64), # yomi varchar(64) # ) # # INSERT INTO name_list (kanji,yomi) VALUES # ('安部','あべ'), # ('井口','いぐち'), # ('臼井','うすい'), # ('江本','えもと'), # ('小川','おがわ'), # ('柿本','かきもと'), # ('木島','きじま'), # ('九条','くじょう'), # ('毛森','けもり'), # ('小島','こじま'), # ('佐藤','さとう'), # ('しみず','')・・・・・・ # # 勿論、各頭文字で一件ずつじゃないのですが # これを # # あ行 5件 # か行 5件 # さ行 8件 # # のように集計をかけたいと思っておりますが # よい方法が思いつかず… # # 出力結果は、例でして出力した左側のフィールドはなんでもOKです。 # 右側のあかさたな行のそれぞれのレコード数がチェックできればOKです。 # # なにとぞよろしくお願いいたします。 # 名簿(安部,あべ). 名簿(井口,いぐち). 名簿(臼井,うすい). 名簿(江本,えもと). 名簿(小川,おがわ). 名簿(柿本,かきもと). 名簿(木島,きじま). 名簿(九条,くじょう). 名簿(毛森,けもり). 名簿(小島,こじま). 名簿(佐藤,さとう). 名簿(しみず,''). '各頭文字で一件ずつじゃないのですが、これを あ行 5件 か行 5件 さ行 8件 のように集計をかけたい'(_行,_件数) :- append(_,[_行,_次の行|_],[あ,か,さ,た,な,は,ま,や,ら,わ,ん]), '件数(但し0件は除く)'('_行の読み範囲の中に名簿の_ひらがな読みは入っている'(_行,_次の行),_件数). '_行の読み範囲の中に名簿の_ひらがな読みは入っている'(_行,_次の行) :- 名簿(_,_ひらがな読み), _ひらがな読み @>= _行, _ひらがな読み @< _次の行. '件数(但し0件は除く)'(_目標,_件数) :- findall(1,_目標,[_|L]), length([_|L],_件数). % 以下のサイトは # お題: # 例:数列[3,1,-7,1,5]について、 # ->[4,-3,-2,3] (累計) # ->12 (絶対値の合計) # のように計算する。 # 最初の数列の並び順を変えると、最後の合計計も変わる。 # 任意数列について、上記合計が最小になるように並び替える関数を作成 '例:数列[3,1,-7,1,5]について、 ->[4,-3,-2,3] (累計) ->12 (絶対値の合計) のように計算する。 任意数列について、上記合計が最小になるように並び替える'(_数列,_最小となる数列) :- 絶対値の合計が最小になるように並び替える(_数列,_,_最小となる数列). 絶対値の合計が最小になるように並び替える(_数列,_最小の絶対値,_絶対値の合計が最小となる数列):- length(_数列,_要素数), setof([_絶対値の合計,_順列], [_数列,_要素数,_順列,_絶対値の合計] ^ 並べ替える(_数列,_要素数,_順列,_絶対値の合計),_絶対値_数列ならび), 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_最小の絶対値,_絶対値の合計が最小となる数列). 並べ替える(_数列,_要素数,_順列,_絶対値の合計):- 順列(_数列,_要素数,_順列), 絶対値の合計(_順列,_絶対値の合計). 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_最小の絶対値,_絶対値の合計が最小となる数列) :- findmin(_絶対値,( member([_絶対値,_],_絶対値_数列ならび)),_最小の絶対値), member([_最小の絶対値,_絶対値の合計が最小となる数列],_絶対値_数列ならび). 絶対値の合計([_値],_絶対値の合計) :- _絶対値の合計 is abs(_値). 絶対値の合計(_値ならび,_絶対値の合計) :- 累計の途中経過得ながらそれを縮退して行って絶対値を得る(_値ならび,_絶対値の合計). 累計の途中経過得ながらそれを縮退して行って絶対値を得る(_値ならび,_絶対値の合計) :- 累計の途中経過を得る(_値ならび,_累計の途中経過ならび), 要素の絶対値の合計(_累計の途中経過ならび,_絶対値の合計). 累計の途中経過を得る([_],[]). 累計の途中経過を得る([_数_1,_数_2|R1],[_累計の途中経過|R2]) :- _累計の途中経過 is _数_1 + _数_2, 累計の途中経過を得る([_累計の途中経過|R1],R2). 要素の絶対値の合計(_累計の途中経過ならび,_絶対値の合計) :- findsum(_絶対値,( member(_値,_累計の途中経過ならび), _絶対値 is abs(_値)),_絶対値の合計). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 順列(_,0,[]). 順列(L1,N,[A|R]) :- select(A,L1,R1), N_1 is N - 1, 順列(R1,N_1,R). findmin(V,P,Min) :- findall(V,P,L), min_list(L,Min). findsum(V,P,Sum) :- findall(V,P,L), sum_list(L,Sum). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/806 # # # 【 課題 】鶴亀算:頭の数と足の数を入力し,鶴と亀の数を出力しなさい.計算できない場合は,その旨メッセージを出力しなさい. # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI 】制限なし # 【 期限 】1/23 # 【 Ver 】1.6.0_21 # 【 補足 】プログラムに適切なコメントを入れてください. # # よろしくお願いします # # 鶴亀算(_頭の数,_足の数,_鶴何羽,_亀何匹) :- length(_頭の数ならび表現,_頭の数), length(_足の数ならび表現,_足の数), 鶴亀算(_,_,_鶴の頭ならび表現,_亀の頭ならび表現,_頭の数ならび表現,_足の数ならび表現), length(_鶴の頭ならび表現,_鶴何羽), length(_亀の頭ならび表現,_亀何匹). 鶴亀算([],[],[],[],[],[]). 鶴亀算([_,_|_鶴の足],[],[_|_鶴の頭],[],[_|_頭の数],[_,_|_足の数]) :- 鶴亀算(_鶴の足,[],_鶴の頭,[],_頭の数,_足の数). 鶴亀算([],[_,_,_,_|_亀の足],[],[_|_亀の頭],[_|_頭の数],[_,_,_,_|_足の数]) :- 鶴亀算([],_亀の足,[],_亀の頭,_頭の数,_足の数). 鶴亀算([_,_|_鶴の足],[_,_,_,_|_亀の足],[_|_鶴の頭],[_|_亀の頭],[_,_|_頭の数],[_,_,_,_,_,_|_足の数]) :- 鶴亀算(_鶴の足,_亀の足,_鶴の頭,_亀の頭,_頭の数,_足の数) . % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #812 # [1] 授業単元:c 反復処理 # [2] 問題文(含コード&リンク): # 整数 a をキーボードから入力し,a が素数かどうか判断するプログラムを作成しなさい.(2〜a/2で整数aを割ったときに全ての値で割り切れなければ,aは素数である.) # サイズm(m<=10)の整数型配列変数aをキーボードから受け取り,a[0],a[1],...,a[n-1]のうちの最大値をディスプレイに表示するプログラムを完成しなさい. # '整数 a をキーボードから入力し,a が素数かどうか判断する' :- '整数 a をキーボードから入力し'(_a), 'a が素数かどうか判断する'(_a,_素数かどうかの判断), writef('%t は %t\n',[_a,_素数かどうかの判断]). '整数 a をキーボードから入力し'(_a) :- 整数を得る('整数 a',_a). 'a が素数かどうか判断する'(_a,素数である) :- _除数になりうる最大値 is _a // 2, 'a が素数かどうか判断する'(2,_除数になりうる最大値,_a),!. 'a が素数かどうか判断する'(_,素数ではない). 'a が素数かどうか判断する'(_除数,_除数になりうる最大値,_) :- _除数 > _除数になりうる最大値. 'a が素数かどうか判断する'(_除数,_除数になりうる最大値,_a) :- 'a が除数で割り切れない限り除数を1ずつ加算して行って判断する'(_除数,_除数になりうる最大値,_a). 'a が除数で割り切れない限り除数を1ずつ加算して行って判断する'(_除数,_除数になりうる最大値,_a) :- 'a が除数で割り切れない限り'(_a,_除数), 除数を1ずつ加算して(_除数,_次の除数), 'a が素数かどうか判断する'(_次の除数,_除数になりうる最大値,_a). 'a が除数で割り切れない限り'(_a,_除数) :- \+(0 is _a mod _除数). 除数を1ずつ加算して(_除数,_次の除数) :- succ(_除数,_次の除数). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(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/1323566370/786 # # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- length(_30行ならび,30), 'キャリッジ・リターンが30回登場するまで行文字列とキャレッジ・リターンをならびに得る'(_文字列,_30行ならび), atomic_list_concat(_30行ならび,_末尾を削除された文字列). 'キャリッジ・リターンが30回登場するまで行文字列とキャレッジ・リターンをならびに得る'(_,[]) :- !. 'キャリッジ・リターンが30回登場するまで行文字列とキャレッジ・リターンをならびに得る'(_文字列,[_前文字列|R]) :- 'キャレッジ・リターンが登場'(_文字列,_前文字列,_後文字列), 'キャリッジ・リターンが30回登場するまで行文字列とキャレッジ・リターンをならびに得る'(_後文字列,R). 'キャレッジ・リターンが登場'(_文字列,_前文字列,_後文字列) :- sub_atom(_文字列,S,1,R,'\r'), sub_atom(_文字列,0,_,R,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは 軸要素の選定([_最初の位置の値|R],_軸要素,_残りならび) :- 軸要素の選定([_最初の位置の値|R],_軸要素), select(_軸要素,[_最初の位置の値|R],_残りならび),!. 軸要素の選定([_最初の位置の値|R],_軸要素) :- 中間位置の値([_最初の位置の値|R],_中間位置の値), last([_最初の位置の値|R],_最終位置の値), 三値の中央値(_最初の位置の値,_中間位置の値,_最終位置の値,_軸要素). 中間位置の値(L,_中間位置の値) :- length(L,Length), Length_1 is Length // 2, length(L1,Length_1), append(L1,[_中間位置の値|_],L). 三値の中央値(_1,_2,_3,_中央値) :- 順列([_1,_2,_3],3,[_中央値,A,B]), A @>= _中央値, B @=< _中央値. 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), succ(M,N), 順列(Z,M,X). % 以下のサイトは 軸要素の選定(_対象ならび,_軸要素) :- '最初の位置の値、中間位置の値、最終位置の値、三値の中央値を取る'(_対象ならび,_軸要素),!. '最初の位置の値、中間位置の値、最終位置の値、三値の中央値を取る'([_最初の位置の値|R],_軸要素) :- 中間位置の値([_最初の位置の値|R],_中間位置の値), last([_最初の位置の値|R],_最終位置の値), 三値の中央値(_最初の位置の値,_中間位置の値,_最終位置の値,_軸要素). 中間位置の値(_値ならび,_中間位置の値) :- '_前ならびを作り'(_値ならび,_前ならび), append(_前ならび,[_中間位置の値|_],_値ならび),!. '_前ならびを作り'(_値ならび,_前ならび) :- length(_値ならび,_ならびの要素数), _前ならびの要素数 is _ならびの要素数 // 2, length(_前ならび,_前ならびの要素数). 三値の中央値(_1,_2,_3,_三値の中央値) :- select(_三値の中央値,[_1,_2,_3],_残り値ならび), '残り値ならびの値の全てが三値の中央値より小さいことはなく、残り値ならびの値の全てが三値の中央値より大きいこともない'(_残り値ならび,_三値の中央値),!. '残り値ならびの値の全てが三値の中央値より小さいことはなく、残り値ならびの値の全てが三値の中央値より大きいこともない'(_残り値ならび,_三値の中央値) :- 残り値ならびの値の全てが三値の中央値より小さいことはなく(_残り値ならび,_三値の中央値), 残り値ならびの値の全てが三値の中央値より大きいこともない(_残り値ならび,_三値の中央値). 残り値ならびの値の全てが三値の中央値より小さいことはなく(_残り値ならび,_三値の中央値) :- \+(残り値ならびの値の全てが三値の中央値より小さい(_残り値ならび,_三値の中央値)). 残り値ならびの値の全てが三値の中央値より小さい(_残り値ならび,_三値の中央値) :- forall(member(_値,_残り値ならび),_値 @< _三値の中央値)). 残り値ならびの値の全てが三値の中央値より大きいこともない(_残り値ならび,_三値の中央値) :- \+(残り値ならびの値の全てが三値の中央値より大きい(_残り値ならび,_三値の中央値)). 残り値ならびの値の全てが三値の中央値より大きい(_残り値ならび,_三値の中央値) :- forall(member(_値,_残り値ならび),_値 @> _三値の中央値)). % 以下のサイトは 軸要素の選定(_対象ならび,_軸要素) :- '最初の位置の値、中間位置の値、最終位置の値、三値の中央値を取る'(_対象ならび,_軸要素),!. '最初の位置の値、中間位置の値、最終位置の値、三値の中央値を取る'([_最初の位置の値|R],_軸要素) :- 中間位置の値([_最初の位置の値|R],_中間位置の値), last([_最初の位置の値|R],_最終位置の値), 三値の中央値(_最初の位置の値,_中間位置の値,_最終位置の値,_軸要素). 中間位置の値(_値ならび,_中間位置の値) :- '_前ならびを作り'(_値ならび,_前ならび), append(_前ならび,[_中間位置の値|_],_値ならび),!. '_前ならびを作り'(_値ならび,_前ならび) :- length(_値ならび,_ならびの要素数), _前ならびの要素数 is _ならびの要素数 // 2, length(_前ならび,_前ならびの要素数). 三値の中央値(_1,_2,_3,_三値の中央値) :- select(_三値の中央値,[_1,_2,_3],_残り値ならび), '残り値ならびの値の全てが中央値より小さいことはなく、残り値ならびの値の全てが中央値より大きいこともない'(_残り値ならび,_三値の中央値),!. '残り値ならびの値の全てが中央値より小さいことはなく、残り値ならびの値の全てが中央値より大きいこともない'(_残り値ならび,_三値の中央値) :- 残り値ならびの値の全てが中央値より小さいことはなく(_残り値ならび,_三値の中央値), 残り値ならびの値の全てが中央値より大きいこともない(_残り値ならび,_三値の中央値). 残り値ならびの値の全てが中央値より小さいことはなく(_残り値ならび,_三値の中央値) :- \+(forall(member(A,_残り値ならび),A @< _三値の中央値)). 残り値ならびの値の全てが中央値より大きいこともない(_残り値ならび,_三値の中央値) :- \+(forall(member(A,_残り値ならび),A @> _三値の中央値)). % 以下のサイトは # # length/2をsucc/2を使って定義してみる。 # length(L,N) :- length(L,0,N). length([],N,N). length(L,M1,N) :- (\+(var(N));\+(var(L))), L=[_|R], succ(M1,M2), length(R,M2,N),!. length([_|R],M1,N) :- succ(M1,M2), length(R,M2,N). % 以下のサイトは # # ガリ夫くん:スマ子さん、最近実は数字萌えに目覚めたんです! # # スマ子さん: 藪から棒にアブノーマル宣言をされても困るのだけれども……。 # # ガリ夫くん:特に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のならび,_度数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/657 # # 【 課題 】 # (4)配列を使って、n番目までのフィボナッチ数列を表示するプログラム。 # 最大何番目の値が求められるか確かめること。 # # 【 形態 】http://ime.nu/www.javadrive.jp/install/jdk/で設定したのですが1でしょうか… # 【 期限 】12月16日です # 【 Ver  】1.6.0_22 # 【 補足 】ぎりぎりで丸投げですがよろしくお願いします! # # n番目までのフィボナッチ数列を(_n,_n番目までのフィボナッチ数ならび) :- n番目までの(_n,_n番目までのフィボナッチ数ならび), フィボナッチ数列を(_n番目までのフィボナッチ数ならび). n番目までの(_n,_n番目までのフィボナッチ数ならび) :- length(_n番目までのフィボナッチ数ならび,_n). フィボナッチ数列を(L) :- 要素数2以下のフィボナッチ数列(L). フィボナッチ数列を([1,1|R]) :- フィボナッチ数でならびを満たす([1,1|R]). 要素数2以下のフィボナッチ数列([1]). 要素数2以下のフィボナッチ数列([1,1]). フィボナッチ数でならびを満たす([A,B,C]) :- C is A + B. フィボナッチ数でならびを満たす([A,B,C|R]) :- C is A + B, フィボナッチ数でならびを満たす([B,C|R]). % 以下のサイトは # 出典 :: 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([]. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/726 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # キーボードから入力した10文字以内の任意の文字列の中で、 # ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す関数 # char *cut_str(char *address1, char target_char)を定義し、 # その動作を確認するkadai7-2.cを作りなさい。 # ただし、文字列と、ある特定の文字の入力は、 # char str[10], target_char; # scanf("%s %c", str, &target_char); # で入力されるものとして、 # 答えは以下で出力されるものとする。 # printf("answer = %s\n", cut_str(str, target_char)); # # 'キーボードから入力した10文字以内の任意の文字列の中で、ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す'(_ある特定の文字が最初に現れる位置からそれ以降の部分文字列) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字), 'ある特定の文字が最初に現れる位置からそれ以降の部分文字列を返す'(_文字列,_ある特定の文字,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列). キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- 催促の後一行入力して文字列とある特定の文字を得る(_文字列,_ある特定の文字),!. キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字). 催促の後一行入力して文字列とある特定の文字を得る(_文字列,_ある特定の文字) :- 催促の後一行入力する(_入力文字列), 文字列入力診断(_入力文字列,_文字列,_ある特定の文字). 催促の後一行入力する(_入力文字列) :- write('10文字以内の任意の文字列とある特定の文字を空白区切りで入力してください : '), 一行読み込む(_入力文字列,_). 文字列入力診断(_入力文字列,_文字列,_ある特定の文字) :- 文字列とある特定の文字を切り出す(_入力文字列,_文字列,_ある特定の文字), 文字列の長さ診断(_文字列,_ある特定の文字),!. 文字列入力診断(_入力文字列,_,_) :- writef('入力された %t から適切な情報が得られません。再入力をお願いします。\n',[_入力文字列]), fail. 文字列とある特定の文字を切り出す(_入力文字列,_文字列,_ある特定の文字) :- sub_atom(_入力文字列,_文字列,_空白文字列,_ある特定の文字), 空白文字列(_空白文字列), ある特定の文字は先頭文字は空白になり得ない(_ある特定の文字). 空白文字列(_空白文字列) :- sub_atom(_空白文字列,_,1,_,' '), forall(sub_atom(_空白文字列,_,1,_,_文字),_文字 = ' '). ある特定の文字は先頭文字は空白になり得ない(_ある特定の文字) :- \+(sub_atom(_ある特定の文字,0,1,_,' ')). 文字列の長さ診断(_文字列,_ある特定の文字) :- '10文字以内の文字列と1文字のある特定の文字'(_文字列,_ある特定の文字),!. 文字列の長さ診断(_文字列,_ある特定の文字) :- atom_length(_文字列,_文字列の長さ), writef('入力された文字列 %t は%t文字あります。10文字以下の長さで再入力をお願いします\n',[_文字列,_文字列の長さ]), fail. '10文字以内の文字列と1文字のある特定の文字'(_文字列,_ある特定の文字) :- '10文字以内の文字列'(_文字列), '1文字のある特定の文字'(_ある特定の文字). '10文字以内の文字列'(_文字列) :- atom_length(_文字列,_文字列の長さ), _文字列の長さ =< 10. '1文字のある特定の文字'(_ある特定の文字) :- atom_length(_ある特定の文字,1). 'ある特定の文字が最初に現れる位置からそれ以降の部分文字列を返す'(_文字列,_ある特定の文字,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列) :- sub_atom(_文字列,S,_,_,_ある特定の文字), sub_atom(_文字列,S,_,0,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列),!. 一行読み込む(_行,_終了状態) :- 行入力(_行,_終了状態). 行入力(X,_終了状態) :- get_char(C), '行入力/3'(C,Chars,_終了状態), atom_chars(X,Chars). '行入力/3'('\n',[],改行) :- !. '行入力/3'([A],[A],end_of_file) :- at_end_of_stream(user_input),!. '行入力/3'(C,[C|R],_終了状態) :- get_char(C2), '行入力/3'(C2,R,_終了状態). % 以下のサイトは '13桁のISBNコードを検査せよ。'(_13桁のISBNコード) :- '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(_13桁のISBNコード,_12要素の数値ならび,_最終桁の数), '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_12要素の数値ならび,_加算された数), '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数). '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(_13桁のISBNコード,_12要素の数値ならび,_最終桁の数) :- 各桁を数値に変換した上で(_13桁のISBNコード,_13要素の数値ならび), '12要素の数値ならびと最終桁の数に分離し'(_13要素の数値ならび,_12要素の数値ならび,_最終桁の数). 各桁を数値に変換した上で(_13桁のISBNコード,_13要素の数値ならび) :- findall(_数値,各桁を数値に変換する(_13桁のISBNコード,_数値),_13要素の数値ならび). 各桁を数値に変換する(_13桁のISBNコード,_数値) :- sub_atom(_13桁のISBNコード,_,1,_,_数字), atom_number(_数字,_数値). '12要素の数値ならびと最終桁の数に分離し'(_13要素の数値ならび,_12要素の数値ならび,_最終桁の数) :- append(_12要素の数値ならび,[_最終桁の数],_13要素の数値ならび). '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_12要素の数値ならび,_加算された数) :- '12要素の数値ならびを逆順にして'(_12要素の数値ならび,_反転した12要素の数値ならび), '順に3,1を掛けて加算し'(_反転した12要素の数値ならび,_加算された数). '12要素の数値ならびを逆順にして'(_12要素の数値ならび,_反転した12要素の数値ならび) :- reverse(_12要素の数値ならび,_反転した12要素の数値ならび). '順に3,1を掛けて加算し'(_反転した12要素の数値ならび,_加算された数) :- findsum(S,'順に3,1を掛けて'(_反転した12要素の数値ならび,S),_加算された数). '順に3,1を掛けて'(_反転した12要素の数値ならび,S) :- 順に(_反転した12要素の数値ならび,N1,N2), '3,1を掛けて'(N1,N2,S). 順に(_反転した12要素の数値ならび,N1,N2) :- append(L0,[N1,N2|_],_反転した12要素の数値ならび), 要素数が偶数(L0). 要素数が偶数(L) :- length(L,_要素数), 0 is _要素数 mod 2. '3,1を掛けて'(N1,N2,S) :- S is N1 * 3 + N2 * 1. '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数) :- _最終桁の数 is 10 - (_加算された数 mod 10). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 出典 :: 正規表現 Part9 #786 # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- 'キャリッジ・リターンが30回登場したら'(_文字列,_末尾を削除された文字列). 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列_1,_文字列) :- 'キャリッジ・リターンが30回未満しかない場合そのまま文字列を解とする'(_文字列_1,_文字列). 'キャリッジ・リターンが30回登場したら'(_文字列,_末尾を削除された文字列) :- sub_atom(_文字列,0,_,_,_末尾を削除された文字列), sub_atom(_文字列,_,1,0,'\r'), 度数(sub_atom(_末尾を削除された文字列,_,1,_,'\r'),30). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 'キャリッジ・リターンが30回未満しかない場合そのまま文字列を解とする'(_文字列,_文字列) :- \+('キャリッジ・リターンが30回登場したら'(_文字列,_)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/657 # # 【 課題 】 # (4)配列を使って、n番目までのフィボナッチ数列を表示するプログラム。 # 最大何番目の値が求められるか確かめること。 # # 【 形態 】http://ime.nu/www.javadrive.jp/install/jdk/で設定したのですが1でしょうか… # 【 期限 】12月16日です # 【 Ver  】1.6.0_22 # 【 補足 】ぎりぎりで丸投げですがよろしくお願いします! # # n番目までのフィボナッチ数列を表示する(_n) :- n番目までのフィボナッチ数列を(_n,_n番目までのフィボナッチ数ならび), 表示する(_n番目までのフィボナッチ数ならび). n番目までのフィボナッチ数列を(_n,_n番目までのフィボナッチ数ならび) :- n番目までの(_n,_n番目までのフィボナッチ数ならび), フィボナッチ数列を(_n番目までのフィボナッチ数ならび). n番目までの(_n,_n番目までのフィボナッチ数ならび) :- length(_n番目までのフィボナッチ数ならび,_n). フィボナッチ数列を(L) :- 要素数2以下のフィボナッチ数列(L). フィボナッチ数列を([1,1|R]) :- フィボナッチ数でならびを満たす([1,1|R]). 要素数2以下のフィボナッチ数列([1]). 要素数2以下のフィボナッチ数列([1,1]). フィボナッチ数でならびを満たす([A,B,C]) :- C is A + B. フィボナッチ数でならびを満たす([A,B,C|R]) :- C is A + B, フィボナッチ数でならびを満たす([B,C|R]). 表示する(_n番目までのフィボナッチ数ならび) :- writef('%t\n',[_n番目までのフィボナッチ数ならび]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/657 # # 【 課題 】 # (4)配列を使って、n番目までのフィボナッチ数列を表示するプログラム。 # 最大何番目の値が求められるか確かめること。 # # 【 形態 】http://ime.nu/www.javadrive.jp/install/jdk/で設定したのですが1でしょうか… # 【 期限 】12月16日です # 【 Ver  】1.6.0_22 # 【 補足 】ぎりぎりで丸投げですがよろしくお願いします! # # n番目までのフィボナッチ数列を表示する(_n) :- n番目までのフィボナッチ数列を(_n,_n番目までのフィボナッチ数ならび), 表示する(_n番目までのフィボナッチ数ならび). n番目までのフィボナッチ数列を(_n,_n番目までのフィボナッチ数ならび) :- n番目までの(_n,_n番目までのフィボナッチ数ならび), フィボナッチ数列を(_n番目までのフィボナッチ数ならび). n番目までの(_n,_n番目までのフィボナッチ数ならび) :- length(_n番目までのフィボナッチ数ならび,_n). フィボナッチ数列を([1]) :- !. フィボナッチ数列を([1,1]) :- !. フィボナッチ数列を([1,1|R]) :- フィボナッチ数でならびを満たす([1,1|R]). フィボナッチ数でならびを満たす([A,B,C]) :- C is A + B,!. フィボナッチ数でならびを満たす([A,B,C|R]) :- C is A + B, フィボナッチ数でならびを満たす([B,C|R]). 表示する(_n番目までのフィボナッチ数ならび) :- writef('%t\n',[_n番目までのフィボナッチ数ならび]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/657 # # 【 課題 】 # (4)配列を使って、n番目までのフィボナッチ数列を表示するプログラム。 # 最大何番目の値が求められるか確かめること。 # # 【 形態 】http://ime.nu/www.javadrive.jp/install/jdk/で設定したのですが1でしょうか… # 【 期限 】12月16日です # 【 Ver  】1.6.0_22 # 【 補足 】ぎりぎりで丸投げですがよろしくお願いします! # # 'n番目までのフィボナッチ数列を表示する'(N) :- n番目までのフィボナッチ数列を(N,L), 表示する(L). n番目までのフィボナッチ数列を(N,L) :- n番目までの(N,L), フィボナッチ数列を(L). n番目までの(N,L) :- length(L,N). フィボナッチ数列を([1]) :- !. フィボナッチ数列を([1,1]) :- !. フィボナッチ数列を([1,1|R]) :- フィボナッチ数列でならびを満たす([1,1|R]). フィボナッチ数列でならびを満たす([A,B,C]) :- C is A + B,!. フィボナッチ数列でならびを満たす([A,B,C|R]) :- C is A + B, フィボナッチ数列でならびを満たす([B,C|R]),!. 表示する(L) :- writef('%t\n',[L]). % 以下のサイトは 同一要素数ならびを要素の出現順に得る(_ならび,_同一要素数ならび) :- findall([_要素,_度数],( 同一要素数を得る(_ならび,_要素,_度数)),_同一要素数ならび). 同一要素数を得る(_ならび,_要素,_度数) :- 最初の要素を得る(_ならび,_残りならび,_要素), 度数(member(_要素,[_要素|_残りならび]),_度数). 最初の要素を得る(_ならび,_残りならび,_要素) :- append(_前ならび,[_要素|_残りならび],_ならび), '_前ならびは_要素を含まない'(_前ならび,_要素). '_前ならびは_要素を含まない'(_前ならび,_要素) :- \+(member(_要素,_前ならび)). 度数(_目標,_度数) :- findall(1,_目標,_目標が真になった数だけ整数1を要素とするならび), length(_目標が真になった数だけ整数1を要素とするならび,_度数). % 以下のサイトは 同一要素数ならび(_ならび,_同一要素数ならび) :- findall([_要素,_度数],( 同一要素数を得る(_ならび,_要素,_度数)),_同一要素数ならび). 同一要素数を得る(_ならび,_要素,_度数) :- 最終要素を得る(_ならび,_前要素ならび,_要素), 度数(member(_要素,[_要素|_前要素ならび]),_度数). 最終要素を得る(_ならび,_前要素ならび,_要素) :- append(_前要素ならび,[_要素|_残りならび],_ならび), '_残りならびは_要素を含まない'(_残りならび,_要素). '_残りならびは_要素を含まない'(_残りならび,_要素) :- \+(member(_要素,_残りならび)). 度数(_目標,_度数) :- findall(1,_目標,_目標が真になった数だけ整数1を要素とするならび), length(_目標が真になった数だけ整数1を要素とするならび,_度数). % 以下のサイトは 最長しりとりならび(_語彙ならび,_最長しりとりならび) :- 全しりとりならびを得てその中から最長しりとりを得る(_語彙ならび,_最長しりとりならび). 全しりとりならびを得てその中から最長しりとりを得る(_語彙ならび,_最長しりとりならび) :- 全しりとりならびを得て(_語彙ならび,_全しりとりならび), その中から最長しりとりならびを得る(_全しりとりならび,_最長しりとりならび). 全しりとりならびを得て(_語彙ならび,_全しりとりならび) :- findall(_しりとりならび,( select(_語彙,_語彙ならび,_残り語彙ならび), しりとり(_語彙,_残り語彙ならび,_しりとりならび)),_全しりとりならび). その中から最長しりとりならびを得る(_全しりとりならび,_最長しりとりならび) :- 最長しりとり要素数を得る(_全しりとりならび,_最長しりとり要素数), 最長しりとりならびは(_最長しりとり要素数,_全しりとりならび,_最長しりとりならび). 最長しりとり要素数を得る(_全しりとりならび,_最長しりとり要素数) :- findmax(_要素数,( member(_しりとりならび,_全しりとりならび), length(_しりとりならび,_要素数)),_最長しりとり要素数). 最長しりとりならびは(_最長しりとり要素数,_全しりとりならび,_最長しりとりならび) :- member(_最長しりとりならび,_全しりとりならび), length(_最長しりとりならび,_最長しりとり要素数). しりとり(_前の語彙,_語彙ならび,_しりとりならび) :- 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびになければしりとりを終了する(_前の語彙,_語彙ならび,_しりとりならび). しりとり(_前の語彙,_語彙ならび,_しりとりならび) :- 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,_しりとりならび). 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびになければしりとりを終了する(_前の語彙,_語彙ならび,[_前の語彙]) :- 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字), 語彙が語彙ならびになければ(_語彙の先頭文字,_語彙ならび). 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字) :- sub_atom(_前の語彙,_,1,0,_語彙の先頭文字). 語彙が語彙ならびになければ(_語彙の先頭文字,_語彙ならび) :- forall(select(_語彙,_語彙ならび,_),\+(sub_atom(_語彙,0,1,_,_語彙の先頭文字))). 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,[_前の語彙|R]) :- 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび), しりとり(_語彙,_残り語彙ならび,R). 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび) :- 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字), 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび). 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび) :- select(_語彙,_語彙ならび,_残り語彙ならび), sub_atom(_語彙,0,1,_,_語彙の先頭文字). findmax(A,B,Max) :- findall(A,B,L), max_list(L,Max). % 以下のサイトは mergesort([],[]) :- !. mergesort([A],[A]) :- !. mergesort(L, L3) :- ならびを二分する(L, L1, L2), mergesort(L1, L1_2), mergesort(L2, L2_2), merge(L1_2,L2_2,L3). merge([],L,L) :- !. merge(L,[],L) :- !. merge([A|R1],[B|R2],[A|R3]) :- A @=< B, merge(R1,[B|R2],R3). merge([A|R1],[B|R2],[B|R3]) :- A @> B, merge([A|R1],R2,R3). ならびを二分する([],[],[]) :- !. ならびを二分する(_ならび,_前半ならび,_後半ならび) :- 二分されたならびの要素数(_ならび,_二分されたならびの要素数), 二分されたならびを得る(_二分されたならびの要素数,_前半ならび,_後半ならび), append(_前半ならび,_後半ならび,_ならび),!. 二分されたならびの要素数(_ならび,_二分されたならびの要素数) :- length(_ならび,_ならびの長さ), _二分されたならびの要素数 is _ならびの長さ // 2. 二分されたならびを得る(_二分されたならびの要素数,_前半ならび,_後半ならび) :- length(_前半ならび,_二分されたならびの要素数), length(_後半ならび_1,_二分されたならびの要素数), append(_後半ならび_1,_,_後半ならび). % 以下のサイトは ならびを二分する(_ならび,_前半ならび,_後半ならび) :- 二分されたならびの要素数(_ならび,_二分されたならびの要素数), 二分されたならびを得る(_二分されたならびの要素数,_前半ならび,_後半ならび), append(_前半ならび,_後半ならび,_ならび),!. 二分されたならびの要素数(_ならび,_二分されたならびの要素数) :- length(_ならび,_ならびの長さ), _二分されたならびの要素数 is _ならびの長さ // 2. 二分されたならびを得る(_二分されたならびの要素数,_前半ならび,_後半ならび) :- length(_前半ならび,_二分されたならびの要素数), length(_後半ならび_1,_二分されたならびの要素数), append(_後半ならび_1,_,_後半ならび). % 以下のサイトは 整数から頭部零文字列(_桁,_整数,_数値を表す文字列) :- 整数を数字ならびに変換してその桁数を得る(_整数,_数字ならび,_数字部分の桁), 頭部の零ならびを作り数字ならびを追加した頭部零数字ならびを作る(_桁,_数字ならび,_数字部分の桁,_頭部零数字ならび), 頭部零数字ならびを数値を表す文字列に変換する(_頭部零数字ならび,_数値を表す文字列). 整数を数字ならびに変換してその桁数を得る(_整数,_数字ならび,_数字部分の桁) :- number_chars(_整数,_数字ならび), length(_数字ならび,_数字部分の桁). 頭部の零ならびを作り数字ならびを追加した頭部零数字ならびを作る(_桁,_数字ならび,_数字部分の桁,_頭部零数字ならび) :- _頭部零の桁 is _桁 - _数字部分の桁, findall('0',between(1,_頭部零の桁,_),_頭部零数字ならび,_数字ならび). 頭部零数字ならびを数値を表す文字列に変換する(_頭部零数字ならび,_数値を表す文字列) :- atom_chars(_数値を表す文字列,_頭部零数字ならび). % 以下のサイトは 整数から頭部零文字列(_桁,_整数,_数値を表す文字列) :- 整数を数字ならびに変換して桁数要素の変数ならびの後半に埋め込む(_桁,_整数,_頭部零文字ならび,_文字ならび), 頭部の零ならびは後から変数に零を埋める(_頭部零文字ならび,_文字ならび), 文字ならびを数値を表す文字列に変換する(_文字ならび,_数値を表す文字列). 整数を数字ならびに変換して桁数要素の変数ならびの後半に埋め込む(_桁,_整数,_頭部零文字ならび,_文字ならび) :- length(_文字ならび,_桁), number_chars(_整数,_数字ならび), append(_頭部零文字ならび,_数字ならび,_文字ならび). 頭部の零ならびは後から変数に零を埋める(_頭部零文字ならび) :- findall('0',( member(_要素,_頭部零文字ならび),var(_要素)),_頭部零文字ならび). 文字ならびを数値を表す文字列に変換する(_文字ならび,_数値を表す文字列) :- atom_chars(_数値を表す文字列,_文字ならび). % 以下のサイトは シャッフル([],[]) :- !. シャッフル(L,[A|R2]) :- 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2). 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2) :- 位置を示す乱数を使い一個ずつ取り出して行く(L,A,R2), select(A,L,R1), シャッフル(R1,R2). 位置を示す乱数を使い一個ずつ取り出して行く(L1,A,R2) :- length(L1,Len), _乱数 is random(Len), nth0(_乱数,L1,A). % 以下のサイトは シャッフル(L1,L2) :- length(L1,Len), findall(N,between(1,Len,N),L), シャッフル(Len,L,L1,L2). シャッフル(0,_,_,[]) :- !. シャッフル(Len,L,L1,[_値|R]) :- 'L1からランダムに取り出して新たなリストを構成する'(Len,L,L1,_値,R). 'L1からランダムに取り出して新たなリストを構成する'(Len,L,L1,_値,R) :- 得られた乱数の位置にあるL1の値を取り出す(Len,L,L1,L_1,_値), succ(Len_1,Len), シャッフル(Len_1,L_1,L1,R). 得られた乱数の位置にあるL1の値を取り出す(Len,L,L1,L_1,_値) :- 得られた乱数の位置にある(Len,L,M), 'L1の値を取り出す'(L,L1,M,L_1,_値). 得られた乱数の位置にある(Len,L,M) :- N is random(Len) + 1, nth1(N,L,M). 'L1の値を取り出す'(L,L1,M,L_1,_値) :- nth1(M,L1,_値), select(M,L,L_1). % 以下のサイトは # 出典 :: CodeIQ q1565 # 【問題】 # できるだけ多くの人数で、肩車をしようと思います。 #      # # 肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。 # # # 【例】 # 一行ごとに、身長と体重のセットが与えられます。次の例は、5人の身長と体重を表しています。 # 166 71 # 178 84 # 176 94 # 174 85 # 174 65 # # # この中から肩車をする人間を選ぶと、身長と体重が # (166, 71) # (174, 85) # (176, 94) # の3人が最大人数になります。 # # ※身長と体重共に、上の人が下の人“より小さい”場合に肩車が許されるとしていますので、 #  (174, 85)の上に(174, 65)が乗ることはできません。 'できるだけ多くの人数で、肩車をしようと思います。      肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_最大人数) :- 身長と体重のセットを得る(_身長と体重のセット), 'できるだけ多くの人数で、肩車をしようと思います。'(_身長と体重のセット,_最大人数). 'できるだけ多くの人数で、肩車をしようと思います。'(_人間ならび,_最大人数) :- findall(_肩車人数,( 肩車人数(_人間ならび,_肩車人数)),_肩車人数ならび), max_list(_肩車人数ならび,_最大人数). 肩車人数(_人間ならび,_肩車人数) :- select(_取りだされた人間,_人間ならび,_残りの人間ならび), 肩車を重ねる(_取りだされた人間,_残りの人間ならび,_肩車重ね), length(_肩車重ね,_肩車人数). 肩車を重ねる(_自分,_人間ならび,[_自分|_肩車重ね]) :- 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね). 肩車を重ねる(_一番上の人間,_,[_一番上の人間]). 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね) :- select(_上の人間,_人間ならび,_残りの人間ならび), '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_上の人間,_自分), 肩車を重ねる(_上の人間,_残りの人間ならび,_肩車重ね). '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'([_上の人間の身長,_上の人間の体重],[_自分の身長,_自分の体重]) :- _上の人間の身長 @< _自分の身長, _上の人間の体重 @< _自分の体重. 身長と体重のセットを得る(_身長と体重のセット) :- readln(_身長と体重ならび), 身長と体重のセットを得る(_身長と体重ならび,_身長と体重のセット). 身長と体重のセットを得る([],[]). 身長と体重のセットを得る(L,[L|R]) :- readln(_次の身長と体重ならび), 身長と体重のセットを得る(_次の身長と体重ならび,R). % 以下のサイトは 'Σ'(_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. % 以下のサイトは # 出典 :: CodeIQ q1565 # 【問題】 # できるだけ多くの人数で、肩車をしようと思います。 #      # # 肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。 # # # 【例】 # 一行ごとに、身長と体重のセットが与えられます。次の例は、5人の身長と体重を表しています。 # 166 71 # 178 84 # 176 94 # 174 85 # 174 65 # # # この中から肩車をする人間を選ぶと、身長と体重が # (166, 71) # (174, 85) # (176, 94) # の3人が最大人数になります。 # # ※身長と体重共に、上の人が下の人“より小さい”場合に肩車が許されるとしていますので、 #  (174, 85)の上に(174, 65)が乗ることはできません。 'できるだけ多くの人数で、肩車をしようと思います。      肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_最大人数) :- 身長と体重のセットを得る(_身長と体重のセット), 'できるだけ多くの人数で、肩車をしようと思います。'(_身長と体重のセット,_最大人数). 'できるだけ多くの人数で、肩車をしようと思います。'(_人間ならび,_最大人数) :- findall(_肩車人数,( 肩車人数(_人間ならび,_肩車人数)),_肩車人数ならび), max_list(_肩車人数ならび,_最大人数). 肩車人数(_人間ならび,_肩車人数) :- select(_取りだされた人間,_人間ならび,_残りの人間ならび), 肩車を重ねる(_取りだされた人間,_残りの人間ならび,_肩車重ね), length(_肩車重ね,_肩車人数). 肩車を重ねる(_自分,_人間ならび,[_自分|_肩車重ね]) :- 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね). 肩車を重ねる(_一番上の人間,_,[_一番上の人間]). 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね) :- select(_上の人間,_人間ならび,_残りの人間ならび), '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_上の人間,_自分), 肩車を重ねる(_上の人間,_残りの人間ならび,_肩車重ね). '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'([_上の人間の身長,_上の人間の体重],[_自分の身長,_自分の体重]) :- _上の人間の身長 @< _自分の身長, _上の人間の体重 @< _自分の体重. 身長と体重のセットを得る(_身長と体重のセット) :- readln(_身長と体重ならび), 身長と体重のセットを得る(_身長と体重ならび,_身長と体重のセット). 身長と体重のセットを得る([],[]). 身長と体重のセットを得る(L,[L|R]) :- readln(_次の身長と体重ならび), 身長と体重のセットを得る(_次の身長と体重ならび,R). % 以下のサイトは # 出典 :: CodeIQ q1365 # # 成績の分布などを表すのに使われる度数分布表。 # ひと目で全体の散らばり具合がわかって便利です。 # # 【問題】 # 今回は素数の度数分布表を作ってみます。 # 入力として2つの正の整数が与えられます。 # 一つ目は分布させる素数の最大値、二つ目は区切りの大きさです。 # 例えば、30と5が与えられたとき、30までの素数を5で区切って出力します。 # 30までの素数は2, 3, 5, 7, 11, 13, 17, 19, 23, 29ですので、 # 出力内容は以下のようになります。 # 01-05:*** # 06-10:* # 11-15:** # 16-20:** # 21-25:* # 26-30:* # 同様に、40と7が与えられると、以下のように出力されます。 # 01-07:**** # 08-14:** # 15-21:** # 22-28:* # 29-35:** # 36-42:* # 上記のように出力するプログラムを作成してください。 # なお、最低限、以下の入力に対して正常に動作することを確認してください。 # 入力1:100 15 # 入力2:1200 25 # 入力3:12345 789 # '今回は素数の度数分布表を作ってみます。'(_最大値,_区切り) :- 素数の度数分布表(_最大値,_区切り,_度数分布表), 度数分布図として表示する(_度数分布表). 素数の度数分布表(_最大値,_区切り,_度数分布表) :- 素数を生成する(_最大値,_素数ならび), 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表). 素数を生成する(_最大値,_素数ならび) :- findall(_自然数,between(2,_最大値,_自然数),L), エラトステネスの篩(L,_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([M|R1],[M|R2]) :- エラトステネスの篩(M,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(M,R1,L) :- findall(N,( member(N,R1), \+(0 is N mod M)),L). 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表) :- findall([_範囲下限,_範囲上限,_度数],( 素数の度数分布(_素数ならび,_最大値,_区切り,1,_区切り,_範囲下限,_範囲上限,_度数)),_度数分布表). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限,_範囲上限,_範囲下限,_範囲上限,_度数) :- 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数). 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数) :- _範囲下限 =< _最大値, 度数((between(_範囲下限,_範囲上限,_素数),member(_素数,_素数ならび)),_度数). '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- _範囲下限_1 =< _最大値, 次の範囲を確定する(_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限), 素数の度数分布(_素数ならび,_最大値,_区切り,_次の範囲下限,_次の範囲上限,_範囲下限,_範囲上限,_度数). 次の範囲を確定する(_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限) :- _次の範囲下限 is _範囲下限_1 + _区切り, _次の範囲上限 is _範囲上限_1 + _区切り. 度数(_目標,_度数) :- findall(_,_目標,L), length(L,_度数). 度数分布図として表示する(_度数分布表) :- 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数), 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数). 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数), 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲上限の表示桁数). 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数) :- findall(_桁数,範囲下限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲下限の表示桁数). 範囲下限値の桁数(_度数分布表,_下限桁数) :- member([_範囲下限,_,_],_度数分布表), number_chars(_範囲下限,Chars), length(Chars,_下限桁数). 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲の表示桁数) :- findall(_桁数,範囲上限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲の表示桁数). 範囲上限値の桁数(_度数分布表,_上限桁数) :- member([_,_範囲上限,_],_度数分布表), number_chars(_範囲上限,Chars), length(Chars,_上限桁数). 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- forall( member([_範囲下限,_範囲上限,_度数],_度数分布表), 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数)). 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数) :- ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列), 星文字列(_度数,_星文字列), writef('%w:%w\n',[_範囲表現文字列,_星文字列]). ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列) :- ヘッドゼロサプライ(_範囲下限の表示桁数,_範囲下限,_表示範囲下限), ヘッドゼロサプライ(_範囲上限の表示桁数,_範囲上限,_表示範囲上限), atomic_list_concat([_表示範囲下限,'-',_表示範囲上限],_範囲表現文字列). ヘッドゼロサプライ(_桁数,_数値,_ヘッドゼロサプライ数値表現) :- ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト), 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト), 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現). ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト) :- length(_ヘッドゼロサプライされたリスト,_桁数). 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト) :- number_chars(_数値,_数字のリスト), append(_頭部の枠リスト,_数字のリスト,_ヘッドゼロサプライされたリスト), 全ての要素が同じ(_頭部の枠リスト,'0'). 全ての要素が同じ([],_). 全ての要素が同じ([V|R],V) :- 全ての要素が同じ(R,V). 星文字列(_度数,_星文字列) :- findall(*,between(1,_度数,_),L), atomic_list_concat(L,_星文字列). 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現) :- atom_chars(_ヘッドゼロサプライ数値表現,_ヘッドゼロサプライされたリスト). % 以下のサイトは # 出典 :: わかりやすい Javaによる医療言語処理入門 p62-65 # # n-gram :: 文字列から文字の出現確率を求める。 # 'n-gram'(_文字列,_文字,_出現確率) :- 文字の出現頻度の総数を求める(_文字列,_文字の出現頻度の総数), 文字の出現頻度(_文字列,_文字,_文字の出現頻度), _出現確率 is _文字の出現頻度 / _文字の出現頻度の総数. 文字の出現頻度の総数を求める(_文字列,_文字の出現頻度の総数) :- sub_atom(_文字列,_,_文字の出現頻度の総数,_,_文字列). 文字の出現頻度(_文字列,_文字,_文字の出現頻度) :- 重複なく文字を取り出す(文字列,_文字), 頻度(文字を取り出す(_文字列,_文字),_文字の出現頻度). 重複なく文字を取り出す(_文字列,_文字) :- 文字の集合(_文字列,_文字の集合), member(_文字,_文字の集合). 文字の集合(_文字列,_文字の集合) :- setof(C,(A,B,C) ^ sub_atom(_文字列,A,1,B,C),_文字の集合). 文字を取り出す(_文字列,_文字) :- sub_atom(_文字列,_,1,_,_文字). 頻度(P,_頻度) :- findall(1,P,L), length(L,_頻度). % 以下のサイトは # 出典 :: わかりやすい Javaによる医療言語処理入門 p60-61 # 文字列から二文字の出現頻度を求める。 # 二文字の出現頻度(_文字列,_二文字,_二文字の出現頻度) :- 重複なく二文字を取り出す(文字列,_二文字), 頻度(二文字を取り出す(_文字列,_二文字),_二文字の出現頻度). 重複なく二文字を取り出す(_文字列,_二文字) :- 二文字の集合(_文字列,_二文字の集合), member(_二文字,_二文字の集合). 二文字の集合(_文字列,_二文字の集合) :- setof(C_2,(A,B,C_2) ^ sub_atom(_文字列,A,2,B,C_2),_二文字の集合). 二文字を取り出す(_文字列,_二文字) :- sub_atom(_文字列,_,2,_,_二文字). 頻度(P,_頻度) :- findall(1,P,L), length(L,_頻度). % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # 横書文書を縦書文書に変形する(_横書文書,_縦書文書) :- 横書文書を縦書文書に変形する(_横書文書,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 _式. % 以下のサイトは # 出典 :: C#,C#の宿題片付けます。 #699 # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク): # 1.acをabbに置き換える最小のレーヴェンシュタイン距離を求めよ # 2.1をもとにdiffツールを作成せよ。なお、出力時の形式は以下のとおりとする # ac # ^ # # abb # || # レーベンシュタイン距離(_文字列1,_文字列2,_レーベンシュタイン距離) :- 編集距離(_文字列1,_文字列2,_レーベンシュタイン距離). 編集距離(S1,S2,_編集距離) :- atom_chars(S1,LX), atom_chars(S2,LY), ならびの編集距離(LX,LY,LZ), length(LZ,_編集距離),!. ならびの編集距離(LX,LY,LZ) :- 'ならびの編集距離の停止条件はLXかLYが[]'(LX,LY,LZ). ならびの編集距離(LX,LY,LZ) :- ならびの編集距離の共通部分を取り除いていく(LX,LY,LZ). ならびの編集距離(LX,LY,LZ) :- append(LX,LY,LZ). 'ならびの編集距離の停止条件はLXかLYが[]'([],LY,LY). 'ならびの編集距離の停止条件はLXかLYが[]'(LX,[],LX). ならびの編集距離の共通部分を取り除いていく(LX,LY,LZ) :- ならびの編集距離の共通部分と残りの部分に分離する(LX,LY,L0,L1,L2,L01,L21), append(L01,L21,LYR), append(L0,LZ_1,LZ), ならびの編集距離(L2,LYR,LZ_1). ならびの編集距離の共通部分と残りの部分に分離する(LX,LY,L0,L1,L2,L01,L21) :- append(L0,L1,L2,LX), \+(L1 = []), append(L01,L1,L21,LY). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは '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. % 以下のサイトは # 出典 :: 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). % 以下のサイトは 親(為義). 親(頼朝). 親(範頼). 子(頼朝). 子(範頼). 子(公暁). 親子テーブル候補(_親子テーブル候補) :- 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補). 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補) :- 属性集合である親と子の直積上の(_属性集合_親_と_属性集合_子の直積), 部分集合候補(_属性集合_親_と_属性集合_子の直積,_親子テーブル候補). 属性集合である親と子の直積上の(_親と子の直積) :- 属性集合_親(_属性集合_親), 属性集合_子(_属性集合_子), 直積([_属性集合_親,_属性集合_子],_親と子の直積). 属性集合_親(_属性集合_親) :- 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(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1295436346/173 # # 質問させてください # selectしたデータを一部だけ別のテーブルに入れる方法ってありますか? # # 例:insert into table2 (aaa,bbb,ccc) select aaa as aaa,bbb as bbb,ccc as ccc from table1 # この場合table1のデータがすべてtable2に入るのでaaaだけ別のデータを入れたいと思っています。 # よろしくお願いします。 # # 海に接していない都道府県名([栃木県,群馬県,埼玉県,山梨県,長野県,岐阜県,滋賀県,奈良県]). table1(奈良県,1000,aa). table1(埼玉県,2000,ab). selectしたデータを一部だけ別のテーブルに入れる方法 :- 海に接していない都道府県名(_海に接していない都道府県名ならび), table1(_都道府県名の一,_bbb,_ccc), 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二), assertz(table2(_都道府県名の二,_bbb,_ccc)), fail. selectしたデータを一部だけ別のテーブルに入れる方法. 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二) :- M is (random mod 8) + 1, list_nth(M,_海に接していない道府県名ならび,_都道府県名の二), \+(_都道府県名の一 = _都道府県名の二), \+(table2(_都道府県名の二,_,_)). 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二) :- 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二). ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/584 # # MySQL 5.5.19 . 長くなりますので # テーブルの定義・内容と欲しい結果はここに # http://ime.nu/codepad.org/oe1jhVrF # # で、 # # create table a_tbl( # code int(9) not null, # input_date date not null, # data1 double(9,2) unsigned default 0 not null, # data2 double(9,2) unsigned default 0 not null, # primary key(code,input_date) # ) ; # # insert into a_tbl # values # (1111,'2012-02-01',10,12), # (1111,'2012-02-02',133,14), # (1111,'2012-02-04',13,15), # (1111,'2012-02-06',13,10); # # create table b_tbl( # code varchar(10) not null, # input_date date not null, # data1 double(9,2) unsigned default 0 not null, # data2 double(9,2) unsigned default 0 not null, # primary key(code,input_date) # ) ; # # insert into b_tbl # values # ('ddd','2012-02-01',122,13), # ('ddd','2012-02-03',127,18), # ('ddd','2012-02-04',11,14), # ('ddd','2012-02-05',16,95), # ('ddd','2012-02-06',13,10); # # 欲しい結果 # input_date a.data1 a.data2 b.data2 # 2012-02-01 10 12 13 # 2012-02-02 133 14 null # 2012-02-03 null null 18 # 2012-02-04 13 15 14 # 2012-02-05 null null 95 # 2012-02-06 13 10 10 # # # select a.input_date,b.input_date,a.data1,a.data2,b.data2 # from a_tbl a # right join b_tbl b # on a.input_date = b.input_date; とすると、結果が # +------------+------------+-------+-------+-------+ # | input_date | input_date | data1 | data2 | data2 | # +------------+------------+-------+-------+-------+ # | 2012-02-01 | 2012-02-01 | 10 | 12 | 13 | # | NULL | 2012-02-03 | NULL | NULL | 18 | # | 2012-02-04 | 2012-02-04 | 13 | 15 | 14 | # | NULL | 2012-02-05 | NULL | NULL | 95 | # | 2012-02-06 | 2012-02-06 | 13 | 10 | 10 | # +------------+------------+-------+-------+-------+ # なんですが、実際にはいろんなコードが入っているので、コードも抽出条件に入れたら # select a.input_date,b.input_date,a.data1,a.data2,b.data2 # from a_tbl a # right join b_tbl b # on a.input_date = b.input_date # where # a.code=1111 and b.code='ddd'; # +------------+------------+-------+-------+-------+ # | input_date | input_date | data1 | data2 | data2 | # +------------+------------+-------+-------+-------+ # | 2012-02-01 | 2012-02-01 | 10 | 12 | 13 | # | 2012-02-04 | 2012-02-04 | 13 | 15 | 14 | # | 2012-02-06 | 2012-02-06 | 13 | 10 | 10 | # +------------+------------+-------+-------+-------+ # になってしまいました。 # コードを抽出条件に入れた状態で望ましい結果または上の方の結果になるようなSQLを教えて下さい。 # 'input_dateの集合を得る'(_input_dateの集合) :- findall(_input_date,a_tbl(_input_date,_,_),L1), findall(_input_date,b_tbl(_input_date,_,_),L2), append(L1,L2,L3), setof(_input_date,member(_input_date,L3),_input_dateの集合). 抽出(_input_date,_tbl_aのdata1ならび,_tbl_aのdata2ならび,_tbl_bのdata2ならび) :- 'input_dateの集合を得る'(_input_dateの集合), member(_input_date,_input_dateの集合), findall([_data1],tbl_a(_,_input_date,_data1,_),_tbl_aのdata1ならび), findall([_data2],tbl_a(_,_input_date,_,_data2),_tbl_aのdata2ならび), findall([_data2],tbl_b(_,_input_date,_,_data2),_tbl_bのdata2ならび). # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/633 # # MySQL 5.1です。 # # create table staff_list( # staff_id int(5) primary key //社員番号 # staff_name varchar(8) //社員名 # unit varchar(8) primary key //部署名 # ) # # insert into staff_list (staff_id,staff_name,unit) values # (1,'範馬','総務'), # (2,'愚地','総務'), # (3,'花山','総務'), # (1,'高津','企画'), # (2,'池谷','企画'), # (3,'長嶋','企画'), # (1,'鳩山','営業'), # (2,'野田','営業'), # (3,'小沢','営業'), # (4,'枝野','営業') # # # # このようなテーブルに対してSELECTをかける際、一度のクエリーで # 部署別にソートしたうえで、総務だけstaff_id降順で他を昇順で出したいと思っています。 # # order by unit,IF(staff_name='総務',staff_id desc,staff_id asc) # などと試行してみているのですがうまくできません。 # # どなたかうまい方法をご存じないでしょうか。 # # よろしくお願いいたします。 # スタッフリスト(1,範馬,総務). スタッフリスト(2,愚地,総務). スタッフリスト(3,花山,総務). スタッフリスト(1,高津,企画). スタッフリスト(2,池谷,企画). スタッフリスト(3,長嶋,企画). スタッフリスト(1,鳩山,営業). スタッフリスト(2,野田,営業). スタッフリスト(3,小沢,営業). スタッフリスト(4,枝野,営業). 'このようなテーブルを選択する際、一度部署別にソートしたうえで、総務だけ社員番号降順で出したいと思っています。'(_部署名,_社員番号,_社員名) :- 一度部署別にソートしたうえで(_部署名ならび), 総務だけ社員番号降順で出したい(_部署名ならび,_部署名,_社員番号,_社員名). 一度部署別にソートしたうえで(_部署名ならび) :- findsetof(_部署名,( スタッフリスト(_社員番号,_社員名,_部署名)), _部署名ならび). 総務だけ社員番号降順で出したい(_部署名ならび,_部署名,_社員番号,_社員名) :- member(_部署名,_部署名ならび), 総務だけ社員番号降順で出したい(_部署名,_社員番号,_社員名). 総務だけ社員番号降順で出したい(総務,_社員番号,_社員名) :- 総務だけ社員番号降順で(_社員番号,_社員名). 総務だけ社員番号降順で出したい(_部署名,_社員番号,_社員名) :- \+(_部署名 == 総務), スタッフリスト(_社員番号,_社員名,_部署名). 総務だけ社員番号降順で(_社員番号,_社員名) :- findall([_社員番号,_社員名],( スタッフリスト(_社員番号,_社員名,総務)), L1), 降順でソート(L1,L2), member([社員番号,_社員名],L2). 降順でソート(L1,L2) :- sort(L1,L3), reverse(L3,L2). % % findsetof/3 % # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/666 # # SQLite3を使っています。 # # カラムがなかったらinsert # あったらupdateしたいのですが、 # どういうSQLをかけばいいのでしょうか? # # insert into t1(c1, c2) values("hoge",10) # update t1 set c2=10 WHERE c1="hoge" # このときc1はuniqueです。 # # よろしくお願いします。 # # 'カラムがなかったらinsert あったらupdateしたい'(_テーブル,_カラムならび,_鍵カラム,_鍵値) :- findall(_カラム,( テーブル定義(_テーブル,_番目,_カラム)), L1), 鍵値をセットする(_テーブル,_鍵カラム,_鍵値,P), 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび). 鍵値をセットする(_テーブル,L1,_鍵カラム,_鍵値,P) :- length(L1,Len), length(L2,Len), nth1(Nth,L1,_鍵カラム), nth1(Nth,L2,_鍵値), P =.. [_テーブル|L2]. 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび) :- call(P),!, ( retract(P), Q =.. [_テーブル|_カラムならび], asserta(Q), fail; true). 'カラムがなかったらinsert あったらupdateしたい'(_,_テーブル,_カラムならび) :- Q =.. [_テーブル|_カラムならび], asserta(Q). # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/684 # # ・DBMS名とバージョン # Oracle 10g # ・テーブルデーた # create table aaa ( # id number(5,0) primary key, -- 主キー # nendo char(4), -- 年度 # tsuki char(2) -- 月 # ); # insert into aaa values (1, '2012', '01'); # insert into aaa values (2, '2012', '02'); # insert into aaa values (3, '2012', '03'); # insert into aaa values (4, '2012', '04'); # insert into aaa values (5, '2012', '05'); # ・欲しい結果 # id, nendo, tsuki # -------------------- # 4, '2012', '04' # 5, '2012', '05, # 1, '2012', '01' # 2, '2012', '02' # 3, '2012', '03' # # ・説明 # 年度/月の昇順に並べたいです。 # 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。 # '・テーブルデータ create table aaa ( id number(5,0) primary key, -- 主キー nendo char(4), -- 年度 tsuki char(2) -- 月 ); insert into aaa values (1, '2012', '01'); insert into aaa values (2, '2012', '02'); insert into aaa values (3, '2012', '03'); insert into aaa values (4, '2012', '04'); insert into aaa values (5, '2012', '05'); ・欲しい結果 id, nendo, tsuki -------------------- 4, '2012', '04' 5, '2012', '05, 1, '2012', '01' 2, '2012', '02' 3, '2012', '03' ・説明 年度/月の昇順に並べたいです。 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。'(_id,_年度,_月) :- 欲しい結果(_id,_年度,_月). 年度の場合の月順('04','05'). 年度の場合の月順('05','06'). 年度の場合の月順('06','07'). 年度の場合の月順('07','08'). 年度の場合の月順('08','09'). 年度の場合の月順('09','10'). 年度の場合の月順('10','11'). 年度の場合の月順('11','12'). 年度の場合の月順('12','01'). 年度の場合の月順('01','02'). 年度の場合の月順('02','03'). 年度の場合の月順('03','04'). 欲しい結果(_id,_年度,_月) :- findsetof(_年度,aaa(_,_年度,_),_年度ならび), member(_年度,_年度ならび), 年度順に並べる('04',_id,_年度,_月). 年度順に並べる(_月,_id,_年度,_月) :- aaa(_id,_年度,_月). 年度順に並べる(_月_1,_id,_年度,_月) :- \+(_月_1 = '03'), 年度の場合の月順(_月,_次の月), 年度順に並べる(_次の月,_id,_年度,_月). # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/684 # # ・DBMS名とバージョン # Oracle 10g # ・テーブルデーた # create table aaa ( # id number(5,0) primary key, -- 主キー # nendo char(4), -- 年度 # tsuki char(2) -- 月 # ); # insert into aaa values (1, '2012', '01'); # insert into aaa values (2, '2012', '02'); # insert into aaa values (3, '2012', '03'); # insert into aaa values (4, '2012', '04'); # insert into aaa values (5, '2012', '05'); # ・欲しい結果 # id, nendo, tsuki # -------------------- # 4, '2012', '04' # 5, '2012', '05, # 1, '2012', '01' # 2, '2012', '02' # 3, '2012', '03' # # ・説明 # 年度/月の昇順に並べたいです。 # 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。 # '・テーブルデータ create table aaa ( id number(5,0) primary key, -- 主キー nendo char(4), -- 年度 tsuki char(2) -- 月 ); insert into aaa values (1, '2012', '01'); insert into aaa values (2, '2012', '02'); insert into aaa values (3, '2012', '03'); insert into aaa values (4, '2012', '04'); insert into aaa values (5, '2012', '05'); ・欲しい結果 id, nendo, tsuki -------------------- 4, '2012', '04' 5, '2012', '05, 1, '2012', '01' 2, '2012', '02' 3, '2012', '03' ・説明 年度/月の昇順に並べたいです。 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。'(_id,_年度,_月) :- 欲しい結果(_id,_年度,_月). 欲しい結果(_id,_年度,_月) :- findsetof(_年度,aaa(_,_年度,_),_年度ならび), member(_年度,_年度ならび), 年度順に並べる(['04','05','06','07','08','09','10','11','12','01','02','03'],_id,_年度,_月). 年度順に並べる([_月|R],_id,_年度,_月) :- aaa(_id,_年度,_月). 年度順に並べる([_|R],_id,_年度,_月) :- 年度順に並べる(R,_id,_年度,_月). # 質問です。 # MySQL5です。 # テーブルデータはDATE(YYYYMMの6けたのint型),CODE(varchar型),VALUE(varchar型) の3カラムからなります。 # 各日付順の降順にしたいのですが、スレッドのように、同じコードの場合、その下に日付順でソートしたいです。 # 言っていることが、よくわからなくてすみません。 # # 元テーブル # DATE, CODE, VALUE # .... # 20140401, 11, A # 20140402, 12, B # 20140403, 11, C # 20140404, 13, D # 20140405, 12, E # 20140406, 11, F # .... # # 欲しい結果 # 20140401, 11, A # 20140403, 11, C # 20140406, 11, F # 20140402, 12, B # 20140405, 12, E # 20140404, 13, D # # 宜しくお願い致します。 # # # 879 名前:NAME IS NULL [sage]: 2014/04/25(金) 17:41:21.67 ID:??? # >>877 # どうも質問が明確じゃないけど、 # insert into tname select 〜 # の形式にすればとりあえず解決しそうな話に見える。 # # >>878 # order by code, date ということ? # # # 880 名前:NAME IS NULL []: 2014/04/25(金) 17:47:38.30 ID:+Fb19Efw (3) # 879 # 分かりずらい # 欲しい結果にしてしまいました。 # # 第1キーは、日付です。 # # 元テーブル # DATE, CODE, VALUE # 20140401, 13, A # 20140402, 11, B # 20140403, 12, C # 20140404, 13, D # 20140405, 12, E # 20140406, 11, F # # 欲しい結果 # 20140401, 13, A # 20140404, 13, D # 20140402, 11, B # 20140406, 11, F # 20140403, 12, C # 20140405, 12, E # # 宜しくお願い致します。 # # # 要するに第一キーは降順、第二キーは昇順で整列する。 # 'テーブルデータはDATE(YYYYMMの6けたのint型),CODE(varchar型),VALUE(varchar型) の3カラムからなります。各日付順の降順にしたいのですが、スレッドのように、同じコードの場合、その下に日付順でソートしたいです。'(_DATE,_CODE,_VALUE) :- '要するに第一キーは降順、第二キーは昇順で整列する。'(_DATE,_CODE,_VALUE). '要するに第一キーは降順、第二キーは昇順で整列する。'(_DATE,_CODE,_VALUE) :- 第一キー順序(_CODE), 第二キー順序(_CODE,_DATE), 元テーブル(_DATE,_CODE,_VALUE). 第一キー順序(_CODE) :- findsetof(_CODE,( 元テーブル(_DATE,_CODE,_VALUE)), L1), reverse(L1,L2), member(_CODE,L2). 第二キー順序(_CODE,_DATE) :- findsetof(_DATE,( 元テーブル(_DATE,_CODE,_VALUE)), L1), member(_DATE,L1). % 以下のサイトは % % SWI-Prolog のコマンド引数の内、ユーザパラメータ部分をリストに得る。 % user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/348 # # [1] C言語演習 # # [2] argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 # 但し、第一引数だけは別の配列(ary)に格納はしないこと。 # 例)argv:./test a b c d e f # 例)ary :./test b c d e f # # [3.1] redhat # [3.3] C言語 # [4] 本日中 # [5] 制限:なし # わかる方どうかよろしくお願いします。 # # 'argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 但し、第一引数だけは別の配列(ary)に格納はしないこと'(UserParameterList) :- user_parameters([_|UserParameterList]),!. user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/425 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 与えた文字列を指定した回数繰り返す文字列に変換するプログラムを作成しなさい。 # ただし、main関数を以下のように宣言し、実行時に引数をとれるようにする。 # 第一引数は繰り返し回数とし、第二引数は繰り返される文字列とする。 # すなわち、./prog 3 "ABC"と実行した場合は、ABCABCABCとなる文字列が作られる。 # 作られた文字列は、表示すること。必要に応じて、数字を数値に変換する関数atoi()を使用してもよい。 # その際は、#include<stdlib.h>を加えること。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc,char*argv[]){ # /** argc:引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:引数**/ # x=atoi(argv[1]);/*atoiの使用例*/ # return(0); # } # program :- 与えた文字列を指定した回数繰り返す文字列に変換する. 与えた文字列を指定した回数繰り返す文字列に変換する :- user_parameters([_回数文字列,_文字列]), atom_to_term(_回数文字列,_回数,_), length(Ln,_回数), append(_,[_|R],Ln), write(_文字列), R = []. user_parameters(A) :- current_prolog_flag(argv, B), append(_, [--|A], B). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/639 # # [1] C言語演習 # [2] argvで入力された引数 "123:456:78:90" の様な文字列を ":" 区切りで # 別の配列へ順に格納せよ。(strchr関数を使いなさい) # 上記の例では、[0]=123,[1]=456,[2]=78,[3]=90となる。 # 尚、::の連続もありで、"12:34::90" は [0]=12,[1]=34,[2]=null,[3]=90となる。 # # 下の様に処理しているが、スマートに行きません。。。 # p = NULL; # p = strchr(str, ':'); # while (p != NULL) { # printf("length %d\n", strlen(str)-strlen(p)); # p++; # p = strchr(p, ':'); # } # 'argvで入力された引数 "123:456:78:90" の様な文字列を ":" で区切り、プログラム引数述語のリスト引数とする' :- user_parameters([_引数文字列]), split(_引数文字列,[':'],L), assertz(プログラム引数(L)). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/682 # # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(0,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,1,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,0,1,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,1,0,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,0,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(0,1,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,1,1,'NG') :- !. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/699 # # ../test/read.cgi/tech/1311089619/682について内容が不足していたので再投稿します。 # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # [3] フラグ・判定にビット演算を使用してください。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する。判定はビット演算を使う' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'OK') :- 0 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'NG') :- 1 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/453 # # 【 課題 】コマンドラインから入力された点数を集計するプログラムを作成。 #       ソースファイルにコードを追加して、以下の実行結果になるように。 # # 実行結果  #       java CalcMain 69 88 70 45 95 33 #       高得点順: 95点 , 88点 , 70点 , 69点 , 45点 , 33点 #       科目数:6科目 #       合計点:400点 #       平均点: 66.666664点 #        CalcMainクラスはmain()メソッドを持つ。 #        Calculationクラスは、合計点の計算をするgetTotal()メソッド、平均点の計算をするgetAve()メソッド、並び替え処理を行うsort()メソッドを持つ。 #        コマンドライン引数から受け取った不特定数の数値(点数)について、降順並び替え表示、科目数、合計点、平均点の表示を行う。 #        sort()メソッドの並び替え処理には「バブルソート」を使用する # # #       ソースファイル #       http://ime.nu/www.dotup.org/uploda/www.dotup.org2249012.java.html # # http://ime.nu/www.dotup.org/uploda/www.dotup.org2249060.java # # # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11月14日まで # 【 Ver  】java version "1.6.0_22" # 【 用語 】 # 【 補足 】よろしくお願いします。 # # 'コマンドラインから入力された点数を集計するプログラムを作成。ソースファイルにコードを追加して、以下の実行結果になるように。' :- コマンドラインから入力された点数(_コマンドラインから入力された点数ならび), 高得点順に表示(_コマンドラインから入力された点数ならび), 科目数と合計点と平均点の表示(_コマンドラインから入力された点数ならび). コマンドラインから入力された点数(_コマンドラインから入力された点数ならび) :- current_prolog_flag(argv,_コマンドライン), append(_,['--'|_コマンドラインから入力された点数ならび],_コマンドライン]). 高得点順に表示(L) :- バブルソート降順(L,L2), concat_atom(L2,',',_表示文字列), writef('高得点順: %t\n',[_表示文字列]). 科目数の表示(L,_科目数) :- length(L,_科目数), writef('科目数: %t\n',[_科目数]), 科目数と合計点と平均点の表示(L) :- length(L,_科目数), sum(L,_合計点), _平均点 is _合計点 / _科目数. writef('科目数: %t\n合計点: %t\n平均点: %t\n',[_科目数,_合計点,_平均点]). バブルソート降順(_対象ならび,_整列済みならび) :- 降順交換(_対象ならび,_対象ならびの一), !, バブルソート降順(_対象ならびの一,_整列済みならび). バブルソート降順(_整列済みならび,_整列済みならび). 降順交換([],[]) :- !,fail. 降順交換([A,B|R],[B,A|R]) :- A @< B,!. 降順交換([A|R1],[A|R2]) :- 降順交換(R1,R2). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/670 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # #include<stdio.h> # int main(void) # { # int i=0; # char *ptr; # char str[128]; # # ptr = str; # # scanf("%s",&str); # # while(*ptr++){ # i++; # } # # printf("%d\n",i); # } # # 上記の入力したテキストの文字数を表示するプログラムの読み込み部分をファイル処理に変更せよ。 # fgetc() 関数を使用し、コマンドラインにファイル名が指定できるようにすること。 # ただし、ファイル名を指定しない場合は標準入力とする。 # ファイルが見つからなかった時はエラーメッセージを出し、プログラムを終了する。 # 'length系組込述語を使わず入力したテキストの文字数を表示する' :- get_chars(_文字ならび), ならびの文字数を数える(_文字ならび,_文字数), writef('文字数は %t文字です\n',[_文字数]). ならびの文字数を数える([],0). ならびの文字数を数える([_|R],_文字数) :- ならびの文字数を数える(R,_文字数_1), _文字数 is _文字数_1 + 1. 読み込み部分をファイル処理に変更する :- コマンドラインからファイル名を取り出す(_ファイル名), 読み込み部分をファイル処理に変更する(_ファイル名). 読み込み部分をファイル処理に変更する(user_input,_文字数) :- ファイルから読み出しながら文字数を数える(user_input,_文字数). 読み込み部分をファイル処理に変更する(_ファイル名,_文字数) :- open(_ファイル名,read,Instream), ファイルから読み出しながら文字数を数える(Instream,_文字数), close(Instream). ファイルから読み出しながら文字数を数える(Instream,0) :- at_end_of_stream(Instream),!. ファイルから読み出しながら文字数を数える(Instream,_文字数) :- get_char(Instream,_), ファイルから読み出しながら文字数を数える(Instream,_文字数_1), _文字数 is _文字数_1 + 1. コマンドラインからファイル名を取り出す(_ファイル名) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList), ParameterList = [_ファイル名|_],!. コマンドラインからファイル名を取り出す(user_input). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/613 # # 明日までの課題です。 # まったくわかりません。 # # キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力するプログラムを書きなさい。 # なお、プログラムは次の要件を満たすこと。 # # 1.キーボードからの入力は、Enter(return)キーを2回連続して入力すると終了する # 2.入力終了後、画面に入力した行数を表示する # 3.コマンドラインからプログラムを起動後、入力する文字列に各自の氏名(ローマ字表記)を含めた場合、入力処理終了後、各自の氏名を含む行は何行目にあり、その行の文字列が何であるか表示する。 # 氏名が入力データに含まれていない場合には、含まれていなかったことを表示する # # よろしくお願いします。 # # program :- 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する' :- user_parameters([_ファイル名]), open(_ファイル名,write,Outstream), get_line(Line), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,[]), close(Outstream). 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,'',Ln) :- length(Ln,_行数), writef('行数は %t です\n',[_行数]),!. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,Ln) :- writef(Outstream,'%t\n',[Line]), get_line(Line_2), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line_2,[_|Ln] user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/59 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): # main関数を以下のように宣言し、実行時に引数を取れるようにする。 # 引数がすべて得点であるとして、その平均値を # 求めるプログラムを作成しなさい。 # すなわち、 # ./prog 50 70 90 と実行した場合は、70と表示される。 # 必要に応じて、数字を数値に変換する関数atoi()や # atof()を使用してもよい。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc, char *argv[] ) { # /** argc: 引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:実数 **/ # x = atof( argv[1] ); /* atofの使用例 */ # return(0); # } # # ※ 配列のサイズなど、定数は必ず#defineを利用すること. # ※ 表示や入力を目的とする関数以外では、 # 関数の中で標準入力や標準出力への入出力は行わないこと. # # #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語: c言語 # [4] 期限: 6月15日 # よろしくお願いします! # # program :- user_parameters(_ユーザパラメータならび), プログラム引数を整数ならびに変換(_ユーザパラメータならび,_整数ならび), avg(整数ならび,_相加平均), writef('%t\n',[_相加平均]). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). プログラム引数を整数ならびに変換([],[]). プログラム引数を整数ならびに変換([A|R1],[N|R2]) :- atom_to_term(A,N,_), integer(N), プログラム引数を整数ならびに変換(R1,R2). プログラム引数を整数ならびに変換([_|R1],R2) :- プログラム引数を整数ならびに変換(R1,R2). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/642 # # [1] 授業単元:C言語演習 # [2] 問題文: # 実行ファイル名をmultiとして、multiに続いて2つの正の整数を入力すると、小さい方の整数から大きい方の整数までの積を出力するプログラムを作成せよ。 # 但し、入力時には小さい方の整数、大きいほうの整数の順で入力されるものとする。 # <入力例>$./multi 3 6 # <計算結果>360 # program :- user_parameters([_引数1,_引数2]), 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2), user_parameters(ParametersList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2) :- atom_number(_引数1,N1), atom_number(_引数2,N2), 小さい方の整数と大きい方の整数(N1,N2,_小さい方の整数,_大きい方の整数), 小さい方の整数から大きい方の整数までの積を(_小さい方の整数,_大きい方の整数,_積), 出力する(_積). 小さい方の整数と大きい方の整数(N1,N2,N1,N2) :- N1 =< N2. 小さい方の整数と大きい方の整数(N1,N2,N2,N1) :- N1 > N2. 小さい方の整数から大きい方の整数までの積を(N,N,N). 小さい方の整数から大きい方の整数までの積を(N,_大きい方の整数,_積) :- N < _大きい方の整数, N1_2 is N1 + 1, 小さい方の整数から大きい方の整数までの積を(N_2,_大きい方の整数,_積_2), _積 is _積_2 * N. 出力する(_積) :- writef('%t\n',[N]). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/786 # # C言語 # gcc # Linux # 問題:cat関数を作りなさい。ただし、fgets,fputsを用いること。です。 # # 明日のお昼までにお願いします。 # # cat :- user_parameters([]), get_code(user_input,Code), ストリームから読み取り書き出す(user_input,Code),!. cat :- user_parameters(L), append(_,[File|R],L), ファイルを書き出す(File), R = [],!. ファイルを書き出す(File) :- open(File,read,Instream), get_code(Instream,Code), ストリームから読み取り書き出す(Instream,Code), close(Instream). ストリームから読み取り書き出す(_,-1) :- !. ストリームから読み取り書き出す(Instream,Code_1) :- put_code(Code_1), get_code(Instream,Code_2), ストリームから読み取り書き出す(Instream,Code_2). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). % % SWI-Prologの起動は % # swipl -t cat -f プログラムファイル名 -- ファイル1 ファイル名2 ... % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/907 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 以下のようにmain関数を定義し、mainの引数を合計するプログラムsumを作成せよ。ただし、引数の数は未定であり、実行時に決定されるものとする。 # int main(int argc, char *argv[]) # main :- 利用者引数ならび(_利用者引数ならび), findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値ならび), sum(_数値ならび,_合計), writef('%t\n',[_合計]). sum([],0). sum([_数値|R],_合計) :- sum(R,_合計_1), _合計 is _数値 + _合計_1. 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). % % # swipl --quiet -f c161_907.html -g main -- 33.0 25.1 38.4 % 96.5 % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/957 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク): # コマンド行から複数の数値を受け取りその平均値を出力するプログラムを # 作成し、プログラムリストと実行結果を示せ。ヒント:受け取った文字列を # double型に変換するには、関数double atof(const char *nPtr)を使う。 # この関数を使うには<stdlib.h>のインクルードが必要である。 # #include <stdio.h> # #include <stdlib.h> # int main(void) # { # char str[]="1.41421356"; # double x; # x = atof(str); # } # 'コマンド行から複数の数値を受け取りその平均値を出力する' :- 利用者引数ならび(_利用者引数ならび), 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび), 相加平均(_数値引数ならび,_相加平均), writef('平均値は %t です\n',[_相加平均]). 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび) :- findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値引数ならび). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0e+00,M). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/142 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ # input関数とshow関数を作ること # コマンド引数にテキストファイルの名前を入れること # 'テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ。コマンド引数にテキストファイルの名前を入れること' :- コマンド引数からテキストファイルの名前を得る(_テキストファイル), テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル). コマンド引数からテキストファイルの名前を得る(_テキストファイル) :- current_prolog_flag(argv,ParameterList), append(_,['--'|[_テキストファイル]],ParameterList). テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル) :- テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル,Outstream), そのテキストファイルの中身を出力せよ(_テキストファイル). テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル) :- open(_テキストファイル,write,Outstream). そのなかに整数5個数字を入れる(Outstream), close(Outstream). そのなかに整数5個数字を入れる(Outstream) :- between(1,5,_何番目), 整数を得る(_整数), writef(Outstream,'%t\n',[_整数]), _何番目 = 5. そのテキストファイルの中身を出力せよ(_テキストファイル) :- open(_テキストファイル,read,Instream), copy_stream_data(Instream,user_output), close(Instream). % % ここではズルをして組込述語 copy_stream_data/2 を使って見た。 % % 本来ならget_lines/2とput_lines/2の組合せでコピーを表現するところ。 % % そのテキストファイルの中身を出力せよ(_テキストファイル) :- % get_lines(_テキストファイル,_行ならび), % put_lines(user_output,_行ならび). % % get_lines(_ファイル名,_行ならび) :- % open(_ファイル名,read,Instream), % findall(_行,( % repeat, % ( at_end_of_stream(Instream),!,fail; % get_line(Instream,_行))), % _行ならび), % close(Instream). % % put_lines(_ファイル名,_行ならび) :- % open(_ファイル名,write,Outstream), % forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), % close(Outstream). % % 以下のサイトは # 指数表記を使わずに整数を素因数分解することを考えます。 # つまり、「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,_乗算記号度数). % 以下のサイトは 相乗平均(_標本ならび,_相乗平均) :- length(_標本ならび,_標本数), 相乗平均(_標本ならび,_標本数,1,_相乗平均). 相乗平均([],N,S,M) :- M is S ^ (1 rdiv N),!. 相乗平均([A|R],N,S,M) :- S1 is A * S, 相乗平均(R,N,S1,M). % 以下のサイトは # 出題場所 :: 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,土曜). % 以下のサイトは '日付と曜日の生成'(_年_1,_月_1,_日_1,_起点日からの日数,_年,_月,_日,_曜日) :- '日付と曜日の生成'(_年_1,_月_1,_日_1,0,_起点日からの日数,_年,_月,_日,_曜日). '日付と曜日の生成'(_年,_月,_日,_日数,_日数,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_起点日からの日数_1,_起点日からの日数,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), succ(_起点日からの日数_1,_起点日からの日数_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_起点日からの日数_2,_起点日からの日数,_年,_月,_日,_曜日). '日付と曜日の生成'(_年,_月,_日,_年,_月,_日,_曜日) :- '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,土曜). 整数から文字列(_文字列桁,_整数,_定数) :- '整数・文字番号変換'(_整数,_文字番号ならび), ならびの長さ(_文字番号ならび,_ならびの長さ), _不足桁 is _文字列桁 - _ならびの長さ, 頭部に零を詰める(_不足桁,_文字番号ならび,_整形された文字番号ならび), '定数・文字番号変換'(_定数,_整形された文字番号ならび),!. 年月日文字列から整数年月日を得る(_年月日文字列,_年,_月,_日) :- sub_atom(_年月日文字列,0,4,4,_年文字列), sub_atom(_年月日文字列,2,2,2,_月文字列), sub_atom(_年月日文字列,4,2,0,_日文字列), 文字列ならびから整数ならびを得る([_年文字列,_月文字列,_日文字列],[_年,_月,_日]). 文字列ならびから整数ならびを得る([],[]). 文字列ならびから整数ならびを得る([_文字列|R1],[_整数|R2]) :- get_term_from_atom(_文字列,_整数,[]), 文字列ならびから整数ならびを得る(R1,R2). ならびの長さ(_ならび,_ならびの長さ) :- length(_ならび,_ならびの長さ). '整数・文字番号変換'(_整数,_文字番号ならび) :- number_codes(_整数,_文字番号ならび). 頭部に零を詰める(0,_文字ならび,_文字ならび) :- !. 頭部に零を詰める(_桁,[_|_未決定ならび],_文字ならび) :- _桁 < 0,!, _残り桁 is _桁 + 1, 頭部に零を詰める(_残り桁,_未決定ならび,_文字ならび). 頭部に零を詰める(_桁,_文字ならび,[48|_未決定ならび]) :- _残り桁 is _桁 - 1, 頭部に零を詰める(_残り桁,_文字ならび,_未決定ならび). '定数・文字番号変換'(_定数,_文字番号ならび) :- atom_codes(_定数,_文字番号ならび). % 以下のサイトは 有限個のデータを小さい順に並べた時中央に位置する値(_有限個のデータ,_中央値) :- 小さい順に並べた時(_有限個のデータ,_小さい順に並べた有限個のデータ), 中央に位置する値(_小さい順に並べた有限個のデータ,_中央値). 中央に位置する値(_小さい順に並べた有限個のデータ,_中央値) :- length(_小さい順に並べた有限個のデータ,_データ数), 中央に位置する値(_小さい順に並べた有限個のデータ,_データ数,_中央値). 中央に位置する値(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 'データが奇数個の場合は、中央の位置にある値'(_小さい順に並べた有限個のデータ,_データ数,_中央値). 中央に位置する値(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 'データが偶数個の場合は、中央に近い2つの値の算術平均をとる'(_小さい順に並べた有限個のデータ,_データ数,_中央値). 'データが奇数個の場合は、中央の位置にある値'(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 奇数(_データ数), _中央の位置 is (_データ数 // 2) + 1, nth1(_中央の位置,_小さい順に並べた有限個のデータ,_中央値). 'データが偶数個の場合は、中央に近い2つの値の算術平均をとる'(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 偶数(_データ数), 中央に近い2つの値の(_小さい順に並べた有限個のデータ,_データ数,_値_1,_値_2), 算術平均をとる(_値_1,_値_2,_中央値). 偶数(_整数) :- 0 is _整数 mod 2. 奇数(_整数) :- 1 is _整数 mod 2. 中央に近い2つの値の(_小さい順に並べた有限個のデータ,_データ数,_値_1,_値_2) :- _中央に近い位置_1 is _データ数 // 2, succ(_中央に近い位置_1,_中央に近い位置_2), nth1(_中央に近い位置_1,_小さい順に並べた有限個のデータ,_値_1), nth1(_中央に近い位置_2,_小さい順に並べた有限個のデータ,_値_2). 算術平均をとる(_値_1,_値_2,_中央値) :- _中央値 is ( _値_1 + _値_2 ) / 2. 小さい順に並べた時([],[]). 小さい順に並べた時(_有限個のデータ,_小さい順に並べた有限個のデータ) :- 軸要素の選定(_有限個のデータ,_軸要素,_軸要素を除いたならび), 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,_軸要素を除いたならび,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび), '軸要素で分割した二つの要素ならびを それぞれ小さい順に並べて結合する'(_軸要素,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび,_小さい順に並べた有限個のデータ). '軸要素で分割した二つの要素ならびを それぞれ小さい順に並べて結合する'(_軸要素,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび,_小さい順に並べた有限個のデータ) :- 小さい順に並べた時(_軸要素より小さい要素ならび,_小さい順にならべた軸要素より小さい要素ならび), 小さい順に並べた時(_軸要素に等しいか大きい要素ならび,_小さい順にならべた軸要素に等しいか大きい要素ならび), append(_小さい順にならべた軸要素より小さい要素ならび,[_軸要素|_小さい順にならべた軸要素に等しいか大きい要素ならび],_小さい順に並べた有限個のデータ). 軸要素の選定([_軸要素|_軸要素を除いたならび],_軸要素,_軸要素を除いたならび). 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_,[],[],[]). 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,[A|R],[A|_軸要素より小さい要素ならび],_軸要素に等しいか大きい要素ならび) :- A @< _軸要素, 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,R,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび). 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,[A|R],_軸要素より小さい要素ならび,[A|_軸要素に等しいか大きい要素ならび]) :- A @>= _軸要素, 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,R,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび). % 以下のサイトは # 出典::twitter_by_TakaoOzaki_20141219 # # 初心者向きのPrologの問題。100個の乱数値(0-99)をリストに生成してください。乱数値(0-99)は _乱数値 is random(100) で取れることとしてください。 # # 初心者でない人には、「あなたは、何通りのプログラムパターンが脳裏を過ぎりますか?」 # '100個の乱数値(0-99)をリストに生成します'(_乱数リスト) :- '100個の'(_乱数リスト), '乱数値(0-99)をリストに生成します'(_乱数リスト). '100個の'(_乱数リスト) :- length(_乱数リスト,100). '乱数値(0-99)をリストに生成します'([]). '乱数値(0-99)をリストに生成します'([_乱数値|R]) :- _乱数値 is random(100), '乱数値(0-99)をリストに生成します'(R). % 以下のサイトは # 出典::twitter_by_TakaoOzaki_20141219 # # 初心者向きのPrologの問題。100個の乱数値(0-99)をリストに生成してください。乱数値(0-99)は _乱数値 is random(100) で取れることとしてください。 # # 初心者でない人には、「あなたは、何通りのプログラムパターンが脳裏を過ぎりますか?」 # '100個の乱数値(0-99)をリストに生成します'(_乱数リスト) :- '100個の'(_乱数リスト), '乱数値(0-99)をリストに生成します'(_乱数リスト). '100個の'(_乱数リスト) :- length(_乱数リスト,100). '乱数値(0-99)をリストに生成します'([]). '乱数値(0-99)をリストに生成します'([_乱数値|R]) :- _乱数値 is random(100), '乱数値(0-99)をリストに生成します'(R). % 以下のサイトは # 出典::twitter_by_TakaoOzaki_20141219 # # 初心者向きのPrologの問題。100個の乱数値(0-99)をリストに生成してください。乱数値(0-99)は _乱数値 is random(100) で取れることとしてください。 # # 初心者でない人には、「あなたは、何通りのプログラムパターンが脳裏を過ぎりますか?」 # '100個の乱数値(0-99)をリストに生成します'(_乱数リスト) :- length(_乱数リスト,100), '乱数値(0-99)をリストに生成します'(_乱数リスト). '乱数値(0-99)をリストに生成します'([]). '乱数値(0-99)をリストに生成します'([_乱数値|R]) :- _乱数値 is random(100), '乱数値(0-99)をリストに生成します'(R). % 以下のサイトは # # 出典::増井技術士事務所 今週のアルゴリズムの@masuipeoさんからのアルゴリズムの問題 # # 有名な「パスカルの三角形」は「右上の数と左上の数の和」を配置していきますが、 ここでは単純な「和」ではなく、「排他的論理和」を使うことを考えます。 # 1段目から順に配置してみると、以下の図のようになります。 # # 上から順番に配置していったとき、2014番目の「0」が出力されるのは何段目になるかを求めてください。 # # 1番めの「0」は、3段目、2・3・4番目の「0」は5段目に出力されています。 # # 【解答方法】 # 解答フォームの1行目に答えを記入してください。 # 2行目以降はあなたが求めた方法を記入してください。プログラムを書いた場合はコードを貼り付けてください。 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_何行目) :- length(_0計測器,2014), 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_],[1],_0計測器,_行計測器), length(_行計測器,_何行目). 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_行計測器,_,[],_行計測器) :- !. 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_行計測器_1,_パスカルの三角形の底の行,_0計測器_1,_行計測器) :- 排他的論理和を使ったパスカルの三角形の次の行(_パスカルの三角形の底の行,_0計測器_1,_右端に1を付加したパスカルの三角形の次の行,_0計測器_2), _両端に1を付加したパスカルの三角形の次の行 = [1|_右端に1を付加したパスカルの三角形の次の行], 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_|_行計測器_1],_両端に1を付加したパスカルの三角形の次の行,_0計測器_2,_行計測器). 排他的論理和を使ったパスカルの三角形の次の行(_行_1,_0計測器,_行_2,_0計測器) :- '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1,_0計測器,_行_2,_0計測器). 排他的論理和を使ったパスカルの三角形の次の行([_値_1,_値_2|R1],_0計測器_1,[_排他的論理和|R3],_0計測器) :- '排他的論理和をとり、0である場合だけ_0計測器を減じる'(_値_1,_値_2,_0計測器_1,_0計測器_2,_排他的論理和), 排他的論理和を使ったパスカルの三角形の次の行([_値_2|R1],_0計測器_2,R3,_0計測器). '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_,_0計測器,_,[]) :- '_0計測器が[]なら計算を打ち切る。'(_0計測器). '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1,_0計測器,[1],_0計測器) :- '行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1). '_0計測器が[]なら計算を打ち切る。'([]). '行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'([_]). '排他的論理和をとり、0である場合だけ_0計測器を減じる'(_値_1,_値_2,_0計測器_1,_0計測器_2,_排他的論理和) :- 排他的論理和をとり(_値_1,_値_2,_排他的論理和), 排他的論理和が0である場合だけ_0計測器を減じる(_排他的論理和,_0計測器_1,_0計測器_2). 排他的論理和をとり(0,0,0). 排他的論理和をとり(0,1,1). 排他的論理和をとり(1,0,1). 排他的論理和をとり(1,1,0). 排他的論理和が0である場合だけ_0計測器を減じる(0,[_|_0計測器],_0計測器). 排他的論理和が0である場合だけ_0計測器を減じる(1,_0計測器,_0計測器). :- 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_何行目), writef('0が2014個に達するのは%t行目です。\n',[_何行目]). % 以下のサイトは # # 出典::増井技術士事務所 今週のアルゴリズムの@masuipeoさんからのアルゴリズムの問題 # # 有名な「パスカルの三角形」は「右上の数と左上の数の和」を配置していきますが、 ここでは単純な「和」ではなく、「排他的論理和」を使うことを考えます。 # 1段目から順に配置してみると、以下の図のようになります。 # # 上から順番に配置していったとき、2014番目の「0」が出力されるのは何段目になるかを求めてください。 # # 1番めの「0」は、3段目、2・3・4番目の「0」は5段目に出力されています。 # # 【解答方法】 # 解答フォームの1行目に答えを記入してください。 # 2行目以降はあなたが求めた方法を記入してください。プログラムを書いた場合はコードを貼り付けてください。 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_何行目) :- 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_],[1],[],_何行目),!. 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(Ln,_,_0ならび,_何行目) :- '0ならびの要素数が2014以上の時は何行目'(Ln,_0ならび,_何行目). 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(Ln,_パスカルの三角形の行,_0ならび_1,_何行目) :- パスカルの三角形の次の行(_パスカルの三角形の行,_パスカルの三角形の次の行), '0ならびの更新'(_パスカルの三角形の次の行,_0ならび_1,_0ならび_2), 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_|Ln],_パスカルの三角形の次の行,_0ならび_2,_何行目). '0ならびの要素数が2014以上の時は何行目'(Ln,_0ならび,_何行目) :- length(_0ならび,_要素数), _要素数 >= 2014, length(Ln,_何行目). パスカルの三角形の次の行(_パスカルの三角形の行,_パスカルの三角形の次の行) :- findall(N,( append(_,[A,B|_],_パスカルの三角形の行), 排他的論理和(A,B,N)),_上段の対の値から排他的論理和を取ったならび), 上段の対の値から排他的論理和を取ったならびの両端に1を付加する(_上段の対の値から排他的論理和を取ったならび,_パスカルの三角形の次の行). 上段の対の値から排他的論理和を取ったならびの両端に1を付加する(_上段の対の値から排他的論理和を取ったならび,_パスカルの三角形の次の行) :- append([1|_上段の対の値から排他的論理和を取ったならび],[1],_パスカルの三角形の次の行). 排他的論理和(0,0,0). 排他的論理和(0,1,1). 排他的論理和(1,0,1). 排他的論理和(1,1,0). '0ならびの更新'([],_0ならび_1,_0ならび_1). '0ならびの更新'([0|R1],_0ならび_1,[0|_0ならび_2]) :- '0ならびの更新'(R1,_0ならび_1,_0ならび_2). '0ならびの更新'([1|R1],_0ならび_1,_0ならび_2) :- '0ならびの更新'(R1,_0ならび_1,_0ならび_2). % 以下のサイトは 等差数列([_],_公差) :- var(_公差),!,fail. 等差数列(_等差数列,_公差) :- 等差数列とは公差確定問題である(_等差数列,_公差). 等差数列とは公差確定問題である([_],_公差). 等差数列とは公差確定問題である([V|_等差数列],_公差) :- '先頭要素が変数の時、後続の数列が等差数列で公差が決まれば、後続の等差数列の先頭要素と公差からVが求まる'([V|_等差数列],_公差). 等差数列とは公差確定問題である([A,B|_等差数列],_公差) :- 先頭要素と公差が変数でない時は後続の等差数列は順に解決できる([A,B|_等差数列],_公差). 等差数列とは公差確定問題である([A|_等差数列],_公差) :- '公差が変数でAは変数でない時は、次の変数でない要素とそれまでの要素数から公差を推計して、等差数列部分を確定していく'([A|_等差数列],_公差). '先頭要素が変数の時、後続の数列が等差数列で公差が決まれば、後続の等差数列の先頭要素と公差からVが求まる'([V|_等差数列],_公差) :- 変数である(V), 等差数列(_等差数列,_公差), _等差数列 = [_後続の等差数列の先頭要素|_], V is _後続の等差数列の先頭要素 - _公差. 先頭要素と公差が変数でない時は後続の等差数列は順に解決できる([A,B|_等差数列],_公差) :- 先頭要素と公差が変数でない時は(A,_公差), 後続ならびは順に解決できる([A,B|_等差数列],_公差). 先頭要素と公差が変数でない時は(A,_公差) :- 変数ではない(A), 変数ではない(_公差). 後続ならびは順に解決できる([A,B|_等差数列],_公差) :- B is A + _公差, 等差数列([B|_等差数列],_公差). '公差が変数でAは変数でない時は、次の変数でない要素とそれまでの要素数から公差を推計して、等差数列部分を確定していく'([A|_等差数列],_公差) :- 公差が変数でAは変数でない時は(A,_公差), 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,_次の変数でない要素,_変数ならび,_残り等差数列,_公差), 等差数列部分を確定していく(A,_次の変数でない要素,_変数ならび,_残り等差数列,_公差). 公差が変数でAは変数でない時は(A,_公差) :- 変数である(_公差), 変数ではない(A). 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,A,[],[],_公差) :- '等差数列が全て変数の時は変数は全てAとなり公差は0'(A,_等差数列,_公差),!. 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,_次の変数でない要素,_変数ならび,_残りならび,_公差) :- 次の変数でない要素とそれまでの要素数から(_等差数列,_次の変数でない要素,_変数ならび,_残りならび), 公差を推計して(A,_次の変数でない要素,_変数ならび,_公差). 等差数列が全て変数の時は変数は全てAとなり公差は0(A,_等差数列,0) :- 等差数列が全て変数の時は(_等差数列), 変数は全てAとなり(A,_等差数列). 等差数列が全て変数の時は(_等差数列) :- forall(member(V,_等差数列),var(V)). 変数は全てAとなり(_等差数列,A) :- findall(A,member(_,_等差数列),_等差数列). 次の変数でない要素とそれまでの要素数から(_等差数列,_次の変数でない要素,_変数ならび,_残りならび) :- append(_変数ならび,[_次の変数でない要素|_残りならび],_等差数列), 要素は全て変数である(_変数ならび), 変数ではない(_次の変数でない要素). 要素は全て変数である(_変数ならび) :- forall(member(_変数,_変数ならび),変数である(_変数)). 公差を推計して(A,_次の変数でない要素,_変数ならび,_公差) :- length([_|_変数ならび],_分割数), _公差 is (_次の変数でない要素 - A) / _分割数. 等差数列部分を確定していく(A,B,L1,R2,_公差) :- 等差数列([A|L1],_公差), 等差数列([B|R2],_公差). 変数である(_変数) :- var(_変数). 変数ではない(_変数ではない項) :- \+(var(_変数ではない項)). % 以下のサイトは 等差数列([_],_公差) :- var(_公差),!,fail. 等差数列(_等差数列,_公差) :- 等差数列とは公差確定問題である(_等差数列,_公差),!. 等差数列とは公差確定問題である([_],_公差). 等差数列とは公差確定問題である([V|R],_公差) :- var(V), 等差数列(R,_公差), R = [B|_], V is B - _公差,!. 等差数列とは公差確定問題である([A,B|R],_公差) :- 変数ではない(A), 変数ではない(_公差), B is A + _公差, 等差数列([B|R],_公差). 等差数列とは公差確定問題である([A|R],_公差) :- var(_公差), 変数ではない(A), append(L1,[B|R2],R), forall(member(V,L1),var(V)), 変数ではない(B), length([_|L1],N), _公差 is (B - A) / N,!, 等差数列([A|L1],_公差), 等差数列([B|R2],_公差),!. 変数ではない(A) :- \+(var(A)). % 以下のサイトは # # ガリ夫くん:スマ子さん、最近実は数字萌えに目覚めたんです! # # スマ子さん: 藪から棒にアブノーマル宣言をされても困るのだけれども……。 # # ガリ夫くん:特に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のならび,_度数). % 以下のサイトは # # 出典::増井技術士事務所 今週のアルゴリズムの@masuipeoさんからのアルゴリズムの問題 # # 有名な「パスカルの三角形」は「右上の数と左上の数の和」を配置していきますが、 ここでは単純な「和」ではなく、「排他的論理和」を使うことを考えます。 # 1段目から順に配置してみると、以下の図のようになります。 # # 上から順番に配置していったとき、2014番目の「0」が出力されるのは何段目になるかを求めてください。 # # 1番めの「0」は、3段目、2・3・4番目の「0」は5段目に出力されています。 # # 【解答方法】 # 解答フォームの1行目に答えを記入してください。 # 2行目以降はあなたが求めた方法を記入してください。プログラムを書いた場合はコードを貼り付けてください。 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_何行目) :- length(_0計測器,2014), 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_],[1],_0計測器,_行計測器), length(_行計測器,_何行目). 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_行計測器,_,[],_行計測器) :- !. 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_行計測器_1,_パスカルの三角形の底の行,_0計測器_1,_行計測器) :- 排他的論理和を使ったパスカルの三角形の次の行(_パスカルの三角形の底の行,_0計測器_1,_右端に1を付加したパスカルの三角形の次の行,_0計測器_2), _両端に1を付加したパスカルの三角形の次の行 = [1|_右端に1を付加したパスカルの三角形の次の行], 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_|_行計測器_1],_両端に1を付加したパスカルの三角形の次の行,_0計測器_2,_行計測器). 排他的論理和を使ったパスカルの三角形の次の行(_行_1,_0計測器,_行_2,_0計測器) :- '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1,_0計測器,_行_2,_0計測器). 排他的論理和を使ったパスカルの三角形の次の行([_値_1,_値_2|R1],_0計測器_1,[_排他的論理和|R3],_0計測器) :- '排他的論理和をとり、0である場合だけ_0計測器を減じる'(_値_1,_値_2,_0計測器_1,_0計測器_2,_排他的論理和), 排他的論理和を使ったパスカルの三角形の次の行([_値_2|R1],_0計測器_2,R3,_0計測器). '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_,_0計測器,_,[]) :- '_0計測器が[]なら計算を打ち切る。'(_0計測器). '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1,_0計測器,[1],_0計測器) :- '行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1). '_0計測器が[]なら計算を打ち切る。'([]). '行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'([_]). '排他的論理和をとり、0である場合だけ_0計測器を減じる'(_値_1,_値_2,_0計測器_1,_0計測器_2,_排他的論理和) :- 排他的論理和をとり(_値_1,_値_2,_排他的論理和), 排他的論理和が0である場合だけ_0計測器を減じる(_排他的論理和,_0計測器_1,_0計測器_2). 排他的論理和をとり(0,0,0). 排他的論理和をとり(0,1,1). 排他的論理和をとり(1,0,1). 排他的論理和をとり(1,1,0). 排他的論理和が0である場合だけ_0計測器を減じる(0,[_|_0計測器],_0計測器). 排他的論理和が0である場合だけ_0計測器を減じる(1,_0計測器,_0計測器). :- 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_何行目), writef('0が2014個に達するのは%t行目です。\n',[_何行目]). % 以下のサイトは 連立一次方程式の解(_拡大係数行列,_解ならび) :- ガウス行列に変形(_拡大係数行列,_ガウス行列,_), 連立一次方程式の一般解(_ガウス行列,_解ならび). 連立一次方程式の一般解(_ガウス行列,_解ならび) :- 解が1つだけ存在する場合(_ガウス行列,_解ならび),!. 連立一次方程式の一般解(_ガウス行列,解は無数に存在する) :- 解が無数にある場合(_ガウス行列),!. 連立一次方程式の一般解(_ガウス行列,解は存在しない) :- 解がない場合(_ガウス行列). 解が1つだけ存在する場合(_ガウス行列,_解ならび) :- '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(0,_ガウス行列), 既約ガウス行列に変形(_ガウス行列,_既約ガウス行列), 既約ガウス行列の各行の最終要素が解である(_既約ガウス行列,_解ならび). '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(_,[]) :- !. '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(N,[L|R]) :- 先頭から0がN要素(N,L), succ(N,N_2), '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(N_2,R). 先頭から0がN要素(N,L) :- append(L1,[A|_],L), \+(A=0),!, length(L1,N). 既約ガウス行列の各行の最終要素が解である(_既約ガウス行列,_解ならび) :- findall(_解,( member(_行,_既約ガウス行列), last(_行,_解)),_解ならび). 解が無数にある場合(_ガウス行列) :- length(_ガウス行列,N), 行列の階数(_ガウス行列,_ガウス行列の階数), \+(N = _ガウス行列の階数). 解がない場合(_ガウス行列). % 以下のサイトは '0でない実数をかけた行に、他の行を実数倍したものを加える'(_行列,_行目_1,_行目_2,_実数_1,_実数_2,_行列_2) :- '0でない実数をかけた行に'(_行列,_行目_1,_実数_1,_行ならび_1,_行_1,_残り行ならび), '他の行を実数倍したものを'(_行列,_行目_2,_実数_2,_行_2), 行を加算する(_行_1,_行_2,_行_3), append(_行ならび_1,[_行_3|_残り行ならび],_行列_2). '0でない実数をかけた行に'(_行列,_行目_1,_実数_1,_行ならび_1,_行_1,_残り行ならび) :- append(_行ならび_1,[_行|_残り行ならび],_行列), length([_|_行ならび_1],_行目_1), 実数をかける(_実数_1,_行,_行_1). '他の行を実数倍したものを'(_行列,_行目_2,_実数_2,_行_2) :- append(_行ならび_1,[_行|_残りならび],_行列), length([_|_行ならび_1],_行目_2), 実数をかける(_実数_2,_行,_行_2). 行を加算する([],[],[]). 行を加算する([A|R1],[B|R2],[C|R3]) :- C is A + B, 行を加算する(R1,R2,R3). 実数をかける(_行,_実数,_実数をかけた行) :- 行に実数をかける(_行,_実数,_実数をかけた行). 行に実数をかける([],_,[]). 行に実数をかける([A|R1],_実数,[B|R2]) :- B is A * _実数, 行に実数をかける(R1,_実数,R2). % 以下のサイトは ある行に実数倍した他の行を加える(_行列,_ある行,_実数,_他の行,_ある行に実数倍した他の行を加えた行列) :- append(L1,[_行_1|R1],_行列), length([_|L1],_ある行), append(L2,[_行_2|R2],_行列), length([_|L2],_他の行), 行に実数をかける(_行_2,_実数,_実数をかけた行), 行と行との加算(_ある行,_実数をかけた行,_ある行に実数倍した他の行を加えた行), append(L1,[_ある行に実数倍した他の行を加えた行|R1],_ある行に実数倍した他の行を加えた行列). 行に実数をかける([],_,[]). 行に実数をかける([A|R1],_実数,[B|R2]) :- B is A * _実数, 行に実数をかける(R1,_実数,R2). 行と行との加算([],[],[]). 行と行との加算([A|R1],[B|R2],[C|R3]) :- C is A + B, 行と行との加算(R1,R2,R3). % 以下のサイトは '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). % 以下のサイトは # 出典::プログラミングのお題スレ Part5 # 与えられた文字列を三等分にして出力しなさい # きれいに三等分できない場合は四等分にしなさい '与えられた文字列を三等分にして出力しなさい。きれいに三等分できない場合は四等分にしなさい。'(_文字列) :- '与えられた文字列を三等分にして出力しなさい。'(_文字列),!. '与えられた文字列を三等分にして出力しなさい。きれいに三等分できない場合は四等分にしなさい。'(_文字列) :- 'きれいに三等分できない場合は四等分にしなさい。'(_文字列). '与えられた文字列を三等分にして出力しなさい。'(_文字列) :- sub_atom(_文字列,N,N,N,S1,S2,S3,_,_,_), writef('%t,%t,%t\n',[S1,S2,S3]). 'きれいに三等分できない場合は四等分にしなさい。'(_文字列) :- '文字数が1:2:1になるように分割する'(_文字列,S1,S2,S3), 'さらにS2を二等分して'(S2,S2_1,S2_2), 全体が四等分されたら出力する(S1,S2_1,S2_2,S3). '文字数が1:2:1になるように分割する'(_文字列,S1,S2,S3) :- sub_atom(_文字列,N,M,N,S1,S2,S3,_,_,_), M is N * 2. 'さらにS2を二等分して'(S2,S2_1,S2_2) :- sub_atom(S2,N_1,N_1,0,S2_1,S2_2,_,_,_,_). 全体が四等分されたら出力する(S1,S2_1,S2_2,S3) :- writef('%t,%t,%t,%t\n',[S1,S2_1,S2_2,S3]). sub_atom(A,S,L,R,S1,S2,S3,HL,XL,TL) :- 'Aがアトムの場合、Aを三つの文字列に分解してそれぞれの文字ならびを得る'(A,S,L,R,S1,S2,S3). sub_atom(A,S,L,R,S1,S2,S3,HL,XL,TL) :- 'Aが変数の場合、三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる'(A,S,L,R,S1,S2,S3,HL,XL,TL). 'Aがアトムの場合、Aを三つの文字列に分解してそれぞれの文字ならびを得る'(A,S,L,R,S1,S2,S3) :- atom(A), 'Aを三つの文字列に分解する'(A,S,L,R,S1,S2,S3), 三つの文字列の文字ならびを得る(S1,S2,S3,HL,XL,TL). 'Aを三つの文字列に分解する'(A,S,L,R,S1,S2,S3) :- 'S1を得る'(A,S,S1), 'S2を得る'(A,S,L,S2), 'S3を得る'(A,S,L,R,S3). 'S1を得る'(A,S,S1) :- sub_atom(A,0,S,_,S1). 'S2を得る'(A,S,L,S2) :- sub_atom(A,S,L,_,S2). 'S3を得る'(A,S,L,R,S3) :- N is S + L, sub_atom(A,N,R,0,S3). 三つの文字列の文字ならびを得る(S1,S2,S3,HL,XL,TL) :- atom_chars(S1,HL), atom_chars(S2,XL), atom_chars(S3,TL). 'Aが変数の場合、三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる'(A,S,L,R,S1,S2,S3,HL,XL,TL) :- var(A), 三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる(A,S,L,R,S1,S2,S3,HL,XL,TL). 三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる(A,S,L,R,S1,S2,S3,HL,XL,TL) :- 三つの文字列と文字ならびの関係(S1,S2,S3,HL,XL,TL), 三つの文字ならびとその要素数の関係(HL,XL,TL,S,L,R), 'Aを定数化できたら、sub_atom/10が実行できる'(A,S,L,R,S1,S2,S3,HL,XL,TL). 三つの文字列と文字ならびの関係(S1,S2,S3,HL,XL,TL) :- atom_chars(S1,HL), atom_chars(S2,XL), atom_chars(S3,TL). 三つの文字ならびとその要素数の関係(HL,XL,TL,S,L,R) :- length(HL,S), length(XL,L), length(TL,R). 'Aを定数化できたら、sub_atom/10が実行できる'(A,S,L,R,S1,S2,S3,HL,XL,TL) :- atomic_list_concat([S1,S2,S3],A), sub_atom(A,S,L,R,S1,S2,S3,HL,XL,TL). % 以下のサイトは # 出典:: プログラミングのお題スレ Part5 # お題:自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。 # # 例1:14,17,50,25,29,85,89,145,190,730,730,... # 例2:59,106,217,352,160,217,352,160,... # # この操作によるループ(上記の例では[730],[160,217,352])を好きなだけ求めよ。 '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,L,_ループ) :- '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,[],L,_ループ). '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,L1,L,_ループ) :- ループが発生したら終了する(L1,L,_ループ). '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,L1,L,_ループ) :- '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返す'(N,_Nの各桁のk乗の和), '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(_Nの各桁のk乗の和,[_Nの各桁のk乗の和|L1],L,_ループ). ループが発生したら終了する(L1,L,_ループ) :- L1 = [N1|R], append(L0,[N1|_],R), reverse(L1,L), reverse([N1|L0],_ループ). '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返す'(N,_Nの各桁のk乗の和) :- 各桁の数ならびを得る(N,_数ならび), length(Chars,_k), findsum(_nの各桁のk乗,( member(_数,_数ならび), _nの各桁のk乗 is _数 ^ _k),_Nの各桁のk乗の和). 各桁の数ならびを得る(N,_数ならび) :- number_chars(N,Chars), findall(_数,( member(A,Chars), number_chars(_数,[A])),_数ならび). % 以下のサイトは # # 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). % 以下のサイトは # 出題::プログラミングのお題スレ Part5#459 # お題:ふたつの自然数を連結してひとつの自然数にする。 # たとえば123と56なら123456になる。 'ふたつの自然数を連結してひとつの自然数にする。'(_一つ目の自然数,_二つ目の自然数,_連結された自然数) :- number_chars(_二つ目の自然数,_二つ目の自然数ならび), length(_二つ目の自然数ならび,_二つ目の自然数の桁), _連結された自然数 is _一つ目の自然数 * 10 ^ _二つ目の自然数の桁 + _二つ目の自然数. % 以下のサイトは # 最大の利益 # 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([]. % 以下のサイトは 日曜起点カレンダー(_年,_月) :- 一日の曜日(_年,_月,_一日の曜日), 月末日の曜日(_年,_月,_月末日,_), 日曜起点カレンダー(_一日の曜日,_月末日,_カレンダー), カレンダー表示(_カレンダー). 日曜起点カレンダー(_一日の曜日,_月末日,_カレンダー) :- 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). % 以下のサイトは # 出典: プログラミングのお題スレ Part5 #252 # お題: # 整数n(0<=n<1000000)をソロバンのAAに変換するプログラムを書け # # n=9563なら # ######## # #oo|||o# # #||ooo|# # ######## # #||o|oo# # #oooo|o# # #oooooo# # #ooooo|# # #oo|ooo# # ######## # # 等幅フォントじゃないとちゃんと見れないけどごめんね '整数n(0<=n<1000000)をソロバンのAAに変換するプログラムを書け'(_n) :- '整数n(0<=n<1000000)をソロバンの'(_n,[],LL), 'AAに変換する'(LL). '整数n(0<=n<1000000)をソロバンの'(0,LL,LL) :- !. '整数n(0<=n<1000000)をソロバンの'(_n,LL1,LL) :- 一桁を天下に二分する(_n,[_1,_2,_3],[_4,_5,_6,_7,_8]), _n_2 is _n // 10, '整数n(0<=n<1000000)をソロバンの'(_n_2,[[_1,_2,_3,_4,_5,_6,_7,_8]|LL1],LL). 一桁を天下に二分する(_n,_天,_下) :- _n_1 is _n mod 10, _n_1_1 is _n_1 // 5, _n_1_2 is _n_1 mod 5, 天(_n_1_1,_天), 下(_n_1_2,_下). 天(0,['O','|']). 天(1,['|','O']). 下(0,['|','O','O','O','O']). 下(1,['O','|','O','O','O']). 下(2,['O','O','|','O','O']). 下(3,['O','O','O','|','O']). 下(4,['O','O','O','O','|']). 'AAに変換する'(LL) :- 梁(LL,_梁), 転置(LL,LL2), 枠の中に描く(_梁,LL2). 枠の中に描く(_梁,LL) :- writef('#%t#\n',[_梁]), forall(上から下まで枠と珠ならびを描く(_梁,LL,_表示行),writef('%t',[_表示行])), writef('#%t#\n',[_梁]). 上から下までの枠と珠ならびを描く(_梁,LL,_表示行) :- nth1(_nth1,LL,_横方向珠ならび), atomic_list_concat(_横方向珠ならび,_横方向珠文字列), 上から下までの枠と珠ならびを描く(_nth1,_梁,_横方向珠文字列,_表示行). 上から下までの枠と珠ならびを描く(4,_梁,_横方向珠文字列,_表示行) :- swritef(_表示行,'%t\n#%t#\n',[_梁,_横方向珠文字列]). 上から下までの枠と珠ならびを描く(_nth1,_梁,_横方向珠文字列,_表示行) :- \+(_nth1=4), swritef(_表示行,'#%t#\n',[_横方向珠文字列]). 梁(LL,_梁) :- length(LL,_幅), lenth(L,_幅), all(L,'#'), atom_chars(_梁,L). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/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,_度数). % 以下のサイトは # プログラミングのお題スレ 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. % 以下のサイトは フィボナッチ数列を20個目までカンマ区切りで出力する :- フィボナッチ数列を20個目までの数列の枠を作り初期値を埋める(_数列の枠), フィボナッチ数で数列の枠を埋める(_数列の枠), フィボナッチ数列をカンマ区切りで出力する(_数列の枠). フィボナッチ数列を20個目までの数列の枠を作り初期値を埋める(_数列の枠) :- length(_数列の枠,20), _数列の枠 = [1,1|_]. フィボナッチ数で数列の枠を埋める([_,_]). フィボナッチ数で数列の枠を埋める([_二つ前のフィボナッチ数,_一つ前のフィボナッチ数,_フィボナッチ数|R]) :- フィボナッチ数は二つ前のフィボナッチ数に一つ前のフィボナッチを加えたものです(_二つ前のフィボナッチ数,_一つ前のフィボナッチ数,_フィボナッチ数), フィボナッチ数で数列の枠を埋める([_一つ前のフィボナッチ数,_フィボナッチ数|R]). フィボナッチ数は二つ前のフィボナッチ数に一つ前のフィボナッチを加えたものです(_二つ前のフィボナッチ数,_一つ前のフィボナッチ数,_フィボナッチ数) :- _フィボナッチ数 is _二つ前のフィボナッチ数 + _一つ前のフィボナッチ数. フィボナッチ数列をカンマ区切りで出力する(_数列の枠) :- atomic_list_concat(_数列の枠,',',_フィボナッチ数列出力文字列), 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(_整数,( between(1,_何種類,_), 標準入力から整数を得る(_整数)), _枚数ならび). 硬貨の合計金額種類(_枚数ならび,_何通り) :- findall(_合計金額,合計金額(0,_枚数ならび,0,_合計金額),L1), sort(L1,L2), length(L2,_何通り). 合計金額(N,[],_合計金額,_合計金額). 合計金額(N,[_枚数|R],_合計金額_1,_合計金額) :- '1から枚数分を増やして合計金額を非決定性に計算していく'(N,_枚数,_ご金額金額_1,_合計金額_2), succ(N,N_2), 合計金額(N_2,R,_合計金額_2,_合計金額). '1から枚数分を増やして合計金額を非決定的に計算していく'(N,_枚数,_合計金額_1,_合計金額_2) :- between(1,_枚数,M), _合計金額_2 is _合計金額_1 + 10 ^ N * M. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類),!. '高橋君が払える金額が何通りあるかを出力しなさい。 ただし、これは膨大な数となるため、 1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- writef('%t種類\n',[_種類]). '1000000007 以上となる場合は、 1000000007 で割った余りを出力しなさい。'(_種類) :- _種類 >= 1000000007, _種類を1000000007で割った余り is _種類 mod 1000000007, writef('%t種類\n',[_種類を1000000007で割った余り]). 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[]),E,fail), integer(_整数),!. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 問題文 # (21:13 追記) |A|=|B|=1のケースがテスト中に一つ含まれていましたので、リジャッジを行います。なお、このケースでNOを出力するプログラムに影響はありません。 # # 文字列 A の文字をちょうど 3 回スワップすることにより、文字列 B に変換できるとき、二つの文字列 A, B を、仲良し文字列と呼ぶことにします。 # # スワップとは、文字列に含まれる 2 つの文字を、入れ替えることを指します。 例えば、abcという文字列であれば、aとcを入れ替えて、cbaのように変換することが出来ます。 # # aaのような文字列に対し、 1 文字目のaと、 2 文字目のaを入れ替えることは許されていますが、同じ場所の文字を指定することはできません。 # # 文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # B # 1 行目には、文字列 A(2≦|A|≦1000) が与えられる。 # 2 行目には、文字列 B(|B|=|A|) が与えられる。 # A, B 共に、小文字アルファベットのみで構成されていることが保障されている。 # 出力 # 与えられた 2 つの文字列が、仲良し文字列であればYES、そうでなければNOを出力せよ。 出力の末尾には改行をいれること。 # # 入力例1 # abcdef # fedcba # 出力例1 # YES # まず、文字列 A のabcdefのaとfをスワップし、fbcdeaとします。 # # 次に、bとeをスワップし、fecdbaとします。 # # 最後に、cとdをスワップし、fedcbaとすると、文字列 B と一致します。 # # よって、この 2 つの文字列は、仲良し文字列となるため、YESと出力します。 # # 入力例2 # abababab # babababa # 出力例2 # NO # 使っている文字数が同じでも、 3 回のスワップでは同じ文字列にできないパターンも存在します。 # # 入力例3 # nt # nt # 出力例3 # NO # スワップの仕方が 1 通りしかなく、 3 回のスワップを繰り返すと、tnになってしまいます。 よって、同じ 2 つの文字列ですが、仲良し文字列ではありません。 # # 入力例4 # pqqq # pqqq # 出力例4 # YES # まず、 1 番目の文字と 2 番目の文字を入れ替え、qpqqとします。 次に、 3 番目の文字と 4 番目の文字を入れ替え、qpqqとします。この際、同じ文字を選んでいますが、場所が違うので問題ありません。 最後に、1番目の文字と、2番目の文字を入れ替え、pqqqとします。 # # 入力例5 # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyzw # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz # 出力例5 # YES # 長い文字列が与えらえれることがあることにも注意してください。 # # 入力例6 # abcdef # ghijkl # 出力例6 # NO '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- 標準入力から二つの文字列を得る(A,B), '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B). '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- 文字列と仲良し文字列(A,B), write('YES\n'),!. '文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。'(A,B) :- write('NO\n'). 文字列と仲良し文字列(_文字列,_仲良し文字列) :- 二つの文字列をならびに変換する(_文字列,_仲良し文字列,L1,L2), '二つのならびの差分(L3,L4)と同一部分(L5)'(L1,L2,L3,L4,L5), 三組のスワップが存在する(L3,L4,L5,Len). 二つの文字列をならびに変換する(_文字列,_仲良し文字列,L1,L2) :- atom_chars(_文字列,L1), atom_chars(_仲良し文字列,L2). '二つのならびの差分(L3,L4)と同一部分(L5)'([],[],[],[],[]). '二つのならびの差分(L3,L4)と同一部分(L5)'([A|R1],[A|R2],R3,R4,[A|R5]) :- '二つのならびの差分(L3,L4)と同一部分(L5)'(R1,R2,R3,R4),!. '二つのならびの差分(L3,L4)と同一部分(L5)'([A|R1],[B|R2],[A|R3],[B|R4],R5) :- '二つのならびの差分(L3,L4)と同一部分(L5)'(R1,R2,R3,R4,R5). 三組のスワップが存在する(L3,L4,L5,Len) :- 二つのならびは同一要素からなる(L3,L4,Len), 整列(L5,L6), 同一文字のペアの可能性を含めて三組のスワップが存在するかどうかの検査(Len,L6). 二つのならびは同一要素からなる(L3,L4,Len) :- length(L3,Len), length(L4,Len). 同一の要素からなる(L3,L4). 同一の要素からなる([],[]). 同一の要素からなる([A|R1],L2) :- select(A,L2,R2), 同一の要素からなる(R1,R2). 同一文字のペアの可能性を含めて三組のスワップが存在するかどうかの検査(Len,L6) :- 同一文字ペアを数える(L6,_同一文字ペア数), 同一文字同士のスワップ検査(Len,_同一文字ペア数). 同一文字ペアの数を数える([],[]). 同一文字ペアの数を数える([A,A|R],[_|R2]) :- 同一文字ペアの数を数える(R1,R2),!. 同一文字ペアの数を数える([_|R1],R2) :- 同一文字ペアの数を数える(R1,R2). 同一文字同士のスワップ検査(3,_) :- !. 同一文字同士のスワップ検査(2,[_|_]) :- !. 同一文字同士のスワップ検査(1,[_,_|_]) :- !. 同一文字同士のスワップ検査(0,[_,_,_|_]). 整列([],[]). 整列([_軸要素|_残りならび],_整列したならび) :- 軸要素との大小で分割してそれぞれ整列する(_軸要素,_残りならび,_整列したL1,_整列したL2), append(_整列したL1,[_軸要素|_整列したL2],_整列したならび). 軸要素との大小で分割してそれぞれ整列する(_軸要素,_残りならび,_整列したL1,_整列したL2) :- 分割(_軸要素,_残りならび,L1,L2), 整列(L1,_整列したL1), 整列(L2,_整列したL2). 分割(_軸要素,[],[],[]). 分割(_軸要素,[A|R1],[A|R2],R3) :- 軸要素より大きい時は(_軸要素,A,R1,R2,R3). 分割(_軸要素,[A|R1],[A|R2],R3) :- 軸要素と等しいか小さい時は(_軸要素,A,R1,R2,R3). 軸要素より大きい時は(_軸要素,A,R1,R2,R3) :- _軸要素 @< A, 分割(_軸要素,R1,R2,R3). 軸要素と等しいか小さい時は(_軸要素,A,R1,R2,R3) :- _軸要素 @>= A, 分割(_軸要素,R1,R2,R3). 標準入力から二つの文字列を得る(A,B) :- 標準入力から文字列を得る(A), 標準入力から文字列を得る(B). 標準入力から文字列を得る(_文字列) :- findall(_文字,( 一文字を得る(_文字), (終了文字(_文字),!,fail;true)),_文字ならび), atom_chars(_文字列,_文字ならび). 一文字を得る(_文字) :- get_char(_文字). 一文字を得る(_文字) :- 一文字を得る(_文字). 終了文字('\n'). 終了文字(end_of_file). % 以下のサイトは # 問題文 # (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). % 以下のサイトは # サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 # # 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 # # この対面にある、底面に書かれた数字を出力してください。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # 1 行目には、サイコロの上の面に書かれている数字を表す 1 つの整数 A(1≦A≦6) が与えられる。 # 出力 # サイコロの底の面に書かれている数字を 1 行で出力せよ。出力の末尾には改行をいれること。 # # 入力例1 # 6 # 出力例1 # 1 # 6 の裏に書かれている数字は 1 です。 # # 入力例2 # 3 # 出力例2 # 4 # 'サイコロが 1 つあります。このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 今、サイコロの上の面に書かれている数字が、 A であることが解っています。 この対面にある、底面に書かれた数字を出力してください。' :- '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A), 'このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字), 出力してください(_対面にある底面に書かれた数字). '今、サイコロの上の面に書かれている数字が、 A であることが解っています。'(_A) :- 標準入力から整数を得る(_A). 'このサイコロは、 1 から 6 までの数字が一つずつ書かれており、対面の和が 7 になるように作られています。 この対面にある、底面に書かれた数字を'(_A,_対面にある底面に書かれた数字) :- length(L1,_A), length(L2,_対面にある底面に書かれた数字), length(_対面の和を表すならび,7), append(L1,L2,_対面の和を表すならび). 出力してください(_対面にある底面に書かれた数字) :- 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). % 以下のサイトは # # あなたは既に読んでしまった札を記憶していることにします。 # 現在の自陣にある札のうち、一文字目が決まり字である札は何枚あるでしょうか。 # '現在の自陣にある札のうち、一文字目が決まり字である札は何枚あるでしょうか。'(_まだ読んでいない札,_既に読んでしまった札,_自陣にある札ならび,_何枚) :- 自陣の札の上の句の先頭の文字の未出の読み札数(_まだ読んでいない札,_既に読んでしまった札,_自陣にある札ならび,_度数ならび), 目標の度数(member(1,_度数ならび),_何枚). 自陣の札の上の句の先頭の文字の未出の読み札数(_,_,[],[]). 自陣の札の上の句の先頭の文字の未出の読み札数(_まだ読んでいない札,_既に読んでしまった札,[_下の句|R1],[_度数|R2]) :- 下の句から上の句の先頭の文字を得る(_下の句,_上の句の先頭文字), 上の句の先頭の文字の度数を得る(_まだ読んでいない札,_既に読んでしまった札,_上の句の先頭の文字,_度数), 自陣の札の上の句の先頭の文字の未出の読み札数(_まだ読んでいない札,_既に読んでしまった札,R1,R2). 下の句から上の句の先頭の文字を得る(_下の句,_上の句の先頭の文字) :- 百人一首(_歌), '上の句と下の句'(_歌,_上の句,_下の句), '上の句の先頭の文字、下の句の先頭の文字'(_歌,_,_,_上の句の先頭の文字,_). '上の句と下の句'(_歌,_上の句,_下の句) :- sub_atom(_歌,S,1,R,' '), sub_atom(_歌,_,R,0,_下の句), 目標の度数(sub_atom(_下の句,_,1,_,' ')),1), sub_atom(_歌,0,S,_,_上の句). '上の句の先頭の文字、下の句の先頭の文字'(_歌,_上の句,_下の句,_上の句の先頭の文字,_下の句の先頭の文字) :- '上の句と下の句'(_歌,_上の句,_下の句), sub_atom(_上の句,0,1,_,_上の句の先頭の文字), sub_atom(_下の句,0,1,_,_下の句の先頭の文字). 上の句の先頭の文字の度数を得る(_既に読んでしまった札,_上の句の先頭の文字,_度数) :- 目標の度数(上の句の先頭の文字の(_上の句の先頭の文字),_度数). 上の句の先頭の文字の(_上の句の先頭の文字) :- 百人一首(_歌), \+(member(_歌,_既に読んでしまった札)), sub_atom(_歌,0,1,_,_上の句の先頭の文字). 百人一首('あきのたの かりほのいほの とまをあらみ わがころもでは つゆにぬれつつ'). 百人一首('はるすぎて なつきにけらし しろたへの ころもほすてふ あまのかぐやま'). 百人一首('あしびきの やまどりのをの しだりをの ながながしよを ひとりかもねむ'). 百人一首('たごのうらに うちいでてみれば しろたへの ふじのたかねに ゆきはふりつつ'). 百人一首('おくやまに もみぢふみわけ なくしかの こゑきくときぞ あきはかなしき'). 百人一首('かささぎの わたせるはしに おくしもの しろきをみれば よぞふけにける'). 百人一首('あまのはら ふりさけみれば かすがなる みかさのやまに いでしつきかも'). 百人一首('わがいほは みやこのたつみ しかぞすむ よをうぢやまと ひとはいふなり'). 百人一首('はなのいろは うつりにけりな いたづらに わがみよにふる ながめせしまに'). 百人一首('これやこの ゆくもかへるも わかれては しるもしらぬも あふさかのせき'). 百人一首('わたのはら やそしまかけて こぎいでぬと ひとにはつげよ あまのつりぶね'). 百人一首('あまつかぜ くものかよひぢ ふきとぢよ をとめのすがた しばしとどめむ'). 百人一首('つくばねの みねよりおつる みなのがは こひぞつもりて ふちとなりぬる'). 百人一首('みちのくの しのぶもぢずり たれゆゑに みだれそめにし われならなくに'). 百人一首('きみがため はるののにいでて わかなつむ わがころもでに ゆきはふりつつ'). 百人一首('たちわかれ いなばのやまの みねにおふる まつとしきかば いまかへりこむ'). 百人一首('ちはやぶる かみよもきかず たつたがは からくれなゐに みづくくるとは'). 百人一首('すみのえの きしによるなみ よるさへや ゆめのかよひぢ ひとめよくらむ'). 百人一首('なにはがた みじかきあしの ふしのまも あはでこのよを すぐしてよとや'). 百人一首('わびぬれば いまはたおなじ なにはなる みをつくしても あはむとぞおもふ'). 百人一首('いまこむと いひしばかりに ながつきの ありあけのつきを まちいでつるかな'). 百人一首('ふくからに あきのくさきの しをるれば むべやまかぜを あらしといふらむ'). 百人一首('つきみれば ちぢにものこそ かなしけれ わがみひとつの あきにはあらねど'). 百人一首('このたびは ぬさもとりあへず たむけやま もみぢのにしき かみのまにまに'). 百人一首('なにしおはば あふさかやまの さねかづら ひとにしられで くるよしもがな'). 百人一首('をぐらやま みねのもみぢば こころあらば いまひとたびの みゆきまたなむ'). 百人一首('みかのはら わきてながるる いづみがは いつみきとてか こひしかるらむ'). 百人一首('やまざとは ふゆぞさびしさ まさりける ひとめもくさも かれぬとおもへば'). 百人一首('こころあてに をらばやをらむ はつしもの おきまどはせる しらぎくのはな'). 百人一首('ありあけの つれなくみえし わかれより あかつきばかり うきものはなし'). 百人一首('あさぼらけ ありあけのつきと みるまでに よしののさとに ふれるしらゆき'). 百人一首('やまがはに かぜのかけたる しがらみは ながれもあへぬ もみぢなりけり'). 百人一首('ひさかたの ひかりのどけき はるのひに しづごころなく はなのちるらむ'). 百人一首('たれをかも しるひとにせむ たかさごの まつもむかしの ともならなくに'). 百人一首('ひとはいさ こころもしらず ふるさとは はなぞむかしの かににほひける'). 百人一首('なつのよは まだよひながら あけぬるを くものいづこに つきやどるらむ'). 百人一首('しらつゆに かぜのふきしく あきののは つらぬきとめぬ たまぞちりける'). 百人一首('わすらるる みをばおもはず ちかひてし ひとのいのちの をしくもあるかな'). 百人一首('あさぢふの をののしのはら しのぶれど あまりてなどか ひとのこひしき'). 百人一首('しのぶれど いろにいでにけり わがこひは ものやおもふと ひとのとふまで'). 百人一首('こひすてふ わがなはまだき たちにけり ひとしれずこそ おもひそめしか'). 百人一首('ちぎりきな かたみにそでを しぼりつつ すゑのまつやま なみこさじとは'). 百人一首('あひみての のちのこころに くらぶれば むかしはものを おもはざりけり'). 百人一首('あふことの たえてしなくは なかなかに ひとをもみをも うらみざらまし'). 百人一首('あはれとも いふべき人は 思ほえで 身のいたづらに なりぬべきかな'). 百人一首('ゆらのとを わたるふなびと かぢをたえ ゆくへもしらぬ こひのみちかな'). 百人一首('やへむぐら しげれるやどの さびしきに ひとこそみえね あきはきにけり'). 百人一首('かぜをいたみ いはうつなみの おのれのみ くだけてものを おもふころかな'). 百人一首('みかきもり ゑじのたくひの よるはもえ ひるはきえつつ ものをこそおもへ'). 百人一首('きみがため をしからざりし いのちさへ ながくもがなと おもひけるかな'). 百人一首('かくとだに えやはいぶきの さしもぐさ さしもしらじな もゆるおもひを'). 百人一首('あけぬれば くるるものとは しりながら なほうらめしき あさぼらけかな'). 百人一首('なげきつつ ひとりぬるよの あくるまは いかにひさしき ものとかはしる'). 百人一首('わすれじの ゆくすゑまでは かたければ けふをかぎりの いのちともがな'). 百人一首('たきのおとは たえてひさしく なりぬれど なこそながれて なほきこえけれ'). 百人一首('あらざらむ このよのほかの おもひでに いまひとたびの あふこともがな'). 百人一首('めぐりあひて みしやそれとも わかぬまに くもがくれにし よはのつきかな'). 百人一首('ありまやま ゐなのささはら かぜふけば いでそよひとを わすれやはする'). 百人一首('やすらはで ねなましものを さよふけて かたぶくまでの つきをみしかな'). 百人一首('おほえやま いくののみちの とほければ まだふみもみず あまのはしだて'). 百人一首('いにしへの ならのみやこの やへざくら けふここのへに にほひぬるかな'). 百人一首('よをこめて とりのそらねは はかるとも よにあふさかの せきはゆるさじ'). 百人一首('いまはただ おもひたえなむ とばかりを ひとづてならで いふよしもがな'). 百人一首('あさぼらけ うぢのかはぎり たえだえに あらはれわたる せぜのあじろぎ'). 百人一首('うらみわび ほさぬそでだに あるものを こひにくちなむ なこそをしけれ'). 百人一首('もろともに あはれとおもへ やまざくら はなよりほかに しるひともなし'). 百人一首('はるのよの ゆめばかりなる たまくらに かひなくたたむ なこそをしけれ'). 百人一首('こころにも あらでうきよに ながらへば こひしかるべき よはのつきかな'). 百人一首('あらしふく みむろのやまの もみぢばは たつたのかはの にしきなりけり'). 百人一首('さびしさに やどをたちいでて ながむれば いづこもおなじ あきのゆふぐれ'). 百人一首('ゆふされば かどたのいなば おとづれて あしのまろやに あきかぜぞふく'). 百人一首('おとにきく たかしのはまの あだなみは かけじやそでの ぬれもこそすれ'). 百人一首('たかさごの をのへのさくら さきにけり とやまのかすみ たたずもあらなむ'). 百人一首('うかりける ひとをはつせの やまおろしよ はげしかれとは いのらぬものを'). 百人一首('ちぎりおきし させもがつゆを いのちにて あはれことしの あきもいぬめり'). 百人一首('わたのはら こぎいでてみれば ひさかたの くもゐにまがふ おきつしらなみ'). 百人一首(' せをはやみ いはにせかるる たきがはの われてもすゑに あはむとぞおもふ'). 百人一首('あはぢしま かよふちどりの なくこゑに いくよねざめぬ すまのせきもり'). 百人一首('あきかぜに たなびくくもの たえまより もれいづるつきの かげのさやけさ'). 百人一首('ながからむ こころもしらず くろかみの みだれてけさは ものをこそおもへ'). 百人一首('ほととぎす なきつるかたを ながむれば ただありあけの つきぞのこれる'). 百人一首('おもひわび さてもいのちは あるものを うきにたへぬは なみだなりけり'). 百人一首('よのなかよ みちこそなけれ おもひいる やまのおくにも しかぞなくなる'). 百人一首('ながらへば またこのごろや しのばれむ うしとみしよぞ いまはこひしき'). 百人一首('よもすがら ものおもふころは あけやらで ねやのひまさへ つれなかりけり'). 百人一首('なげけとて つきやはものを おもはする かこちがほなる わがなみだかな'). 百人一首('むらさめの つゆもまだひぬ まきのはに きりたちのぼる あきのゆふぐれ'). 百人一首('なにはえの あしのかりねの ひとよゆゑ みをつくしてや こひわたるべき'). 百人一首('たまのをよ たえなばたえね ながらへば しのぶることの よわりもぞする'). 百人一首('みせばやな をじまのあまの そでだにも ぬれにぞぬれし いろはかはらず'). 百人一首('きりぎりす なくやしもよの さむしろに ころもかたしき ひとりかもねむ'). 百人一首('わがそでは しほひにみえぬ おきのいしの ひとこそしらね かわくまもなし'). 百人一首('よのなかは つねにもがもな なぎさこぐ あまのをぶねの つなでかなしも'). 百人一首('みよしのの やまのあきかぜ さよふけて ふるさとさむく ころもうつなり'). 百人一首('おほけなく うきよのたみに おほふかな わがたつそまに すみぞめのそで'). 百人一首('はなさそふ あらしのにはの ゆきならで ふりゆくものは わがみなりけり'). 百人一首('こぬひとを まつほのうらの ゆふなぎに やくやもしほの みもこがれつつ'). 百人一首('かぜそよぐ ならのをがはの ゆふぐれは みそぎぞなつの しるしなりける'). 百人一首('ひともをし ひともうらめし あぢきなく よをおもふゆゑに ものおもふみは'). 百人一首('ももしきや ふるきのきばの しのぶにも なほあまりある むかしなりけり'). 目標の度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは # 要件 # # ユーザーテーブル(users)は入会日(joined_on)と退会日(left_on)を持っている # 退会していないユーザーの場合、退会日にはNULLが入る # ユーザー数の増減を確認するために、日付単位で入会したユーザーの人数と退会したユーザーの人数を一覧化したい。どうすれば取得できるか? # 例 # # ユーザーテーブル(users) # # id joined_on left_on # 1 2014-08-01 2014-08-10 # 2 2014-08-01 2014-08-05 # 3 2014-08-03 NULL # 4 2014-08-03 2014-08-10 # 5 2014-08-10 NULL # 期待する出力結果 # # date joined_count left_count # 2014-08-01 2 0 # 2014-08-03 2 0 # 2014-08-05 0 1 # 2014-08-10 1 2 # ユーザーテーブル(1,'2014-08-01','2014-08-10'). ユーザーテーブル(2,'2014-08-01','2014-08-05'). ユーザーテーブル(3,'2014-08-03','NULL'). ユーザーテーブル(4,'2014-08-03','2014-08-10'). ユーザーテーブル(5,'2014-08-10','NULL'). 'ユーザーテーブル(users)は入会日(joined_on)と退会日(left_on)を持っている 退会していないユーザーの場合、退会日にはNULLが入る ユーザー数の増減を確認するために、日付単位で入会したユーザーの人数と 退会したユーザーの人数を一覧化したい。どうすれば取得できるか?' :- setof(_日付,[_日付] ^ 'joined_onの候補+left_offの候補'(_日付),_日付候補), '日付単位で入会したユーザーの人数と退会したユーザーの人数を一覧したい。'(_日付候補). 'joined_onの候補+left_offの候補'(_日付) :- ユーザーテーブル(_,_入会日付,_退会日付), member(_日付,[_入会日付,_退会日付]), \+(_日付 = 'NULL'). '日付単位で入会したユーザーの人数と退会したユーザーの人数を一覧したい。'(_日付候補) :- '日付単位で入会したユーザーの人数と退会したユーザーの人数を'(_日付候補,_日付,_入会したユーザーの人数,_退会したユーザーの人数,R), 表示する(_日付,_入会したユーザーの人数,_退会したユーザーの人数), R = []. '日付単位で入会したユーザーの人数と退会したユーザーの人数を'(_日付候補,_日付,_入会したユーザーの人数,_退会したユーザーの人数,R) :- append(_,[_日付|R],_日付候補), 度数(ユーザーテーブル(_,_日付,_),_入会したユーザーの人数), 度数(ユーザーテーブル(_,_,_日付),_退会したユーザーの人数). 表示する(_日付,_入会したユーザーの人数,_退会したユーザーの人数) :- writef('%t %3r %3r\n',[_日付,_入会したユーザーの人数,_退会したユーザーの人数]). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/933 # [1] 授業単元:プログラミング基礎 # [2] 問題文: # 氏名が"end"になるまで、氏名と点数を入力する。データがなくなったら点数の平均を算出 # する。平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上 # 下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。 # _____________________________ #   氏名   点数  備考  # --------------------- #   井上    70   #   田口    65  * #   佐藤    100   #   田中    30  ***   # ===================== # [3.1] Windows 8 #  [3.2] Visual studio 2008 #  [3.3] C # # '氏名が"end"になるまで、氏名と点数を入力する。データがなくなったら点数の平均を算出する。氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。' :- '氏名が"end"になるまで、氏名と点数を入力する。'(_氏名_点数ならび), 'データがなくなったら点数の平均を算出する。'(_氏名_点数ならび,_平均), '氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。'(_氏名_点数ならび,_平均). '氏名が"end"になるまで、氏名と点数を入力する。'(_氏名_点数ならび) :- findall([_氏名,_点数],( 氏名の入力(_氏名),(_氏名=end,!,fail;点数の入力(_点数))), _氏名_点数ならび). 氏名の入力(_氏名) :- get_line(_氏名). 点数の入力(_点数) :- 整数を得る(_整数). 'データがなくなったら点数の平均を算出する。'(_氏名_点数ならび,_平均) :- length(_氏名_点数ならび,_人数), findall(_点数,member([_,_点数],_氏名_点数ならび),_点数ならび), sum_list(_点数ならび,_合計点), _平均 is _合計点 / _人数. '氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。'(_氏名_点数ならび,_平均). forall( member([_氏名,_点数],_氏名_点数_ならび), '氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。'(_氏名,_点数,_平均)). '氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。'(_氏名,_点数,_平均) :- 備考(_氏名,_点数,_備考), writef('20r10r %4l\n,[_氏名,_点数,_備考]). 備考(_点数,_平均,_備考) :- '平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、'(_点数,_平均). 備考(_点数,_平均,_備考) :- '平均より10点以上下回っていたら"***"、'(_点数,_平均). 備考(_点数,_平均,_備考) :- '平均より1点以上下回っていたら"***"、'(_点数,_平均). 点数が平均点より低い場合(_点数,_平均,_備考),!. 備考(_,_,''). '平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、'(_点数,_平均,'***') :- 点数が平均点より低い場合(_点数,_平均,_備考) :- '平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、'(_点数,_平均,'***') :- _平均 - _点数 >= 20. '10点以上下回っていたら"**"、'(_点数,_平均,'**') :- _平均 - _点数 >= 10, _平均 - _点数 < 20. '1点以上下回っていたら"*"を備考欄に表示する。'(_点数,_平均,'*') :- _平均 - _点数 < 10, _平均 - _点数 >= 1. % 以下のサイトは 攪乱順列(_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). % 以下のサイトは 攪乱順列(L,_撹乱順列) :- 完全順列(L,_完全順列). 完全順列(L,_完全順列) :- 完全順列(L,[_],_完全順列). 完全順列([],_,[]). 完全順列(L,Lm,[A|R]) :- select(A,L,L2), \+(length(Lm,A)), 完全順列(L2,[_|Lm],R). % 以下のサイトは 完全順列(L,K,_順列) :- length(Ln,K), 完全順列(L,[_],Ln,_順列). 完全順列(_,_,[],[]). 完全順列(L,Lm,[_|Ln],[A|R]) :- select(A,L,L2), \+(length(Lm,A)), 完全順列(L2,[_|Lm],Ln,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/833 # [1] 授業単元: プログラミング1 # [2] 問題文 # 文字列が入力され, # 次に表示したい文字の番号が入力されるので、 # その番号の文字を表示すること # 範囲を超えた場合は、NAと表示する # (番号は、1から始まる) # (文字列は50文字以内) # # 実行例 # abcdfge 入力1 # 3 入力2 # # '文字列が入力され, 次に表示したい文字の番号が入力されるので、 その番号の文字を表示すること 範囲を超えた場合は、NAと表示する (番号は、1から始まる) (文字列は50文字以内)' :- '文字列が入力され,(文字列は50文字以内)'(_文字列,_文字列長), '次に表示したい文字の番号が入力されるので、'(_文字の番号), 'その番号の文字を表示すること範囲を超えた場合は、NAと表示する(番号は、1から始まる)'(_文字列,_文字列長,_文字の番号),!. '文字列が入力され,(文字列は50文字以内)'(_文字列長,_文字列) :- get_line(_文字列), atom_length(_文字列,_文字列長), _文字列長 =< 50. '文字列が入力され,(文字列は50文字以内)'(_文字列) :- '文字列が入力され,(文字列は50文字以内)'(_文字列). '次に表示したい文字の番号が入力されるので、'(_文字の番号) :- 整数を得る(表示したい文字の番号,true,_文字の番号). 'その番号の文字を表示すること範囲を超えた場合は、NAと表示する(番号は、1から始まる)'(_文字列,_文字列長,_文字の番号) :- succ(_nth0,_文字の番号), sub_atom(_文字列,_nth0,1,_,_文字), writef('%t\n',[_文字]). 'その番号の文字を表示すること範囲を超えた場合は、NAと表示する(番号は、1から始まる)'(_文字列,_文字列長,_文字の番号) :- write('NA\n'). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/831 # [1] 授業単元:プログラミング基礎 # [2] 問題文 # 文字配列buffを100バイト確保して、キーボードから繰り返し入力して # その文字列を空白を作り、連結していくプログラムを作ります # キーボードから入力できる文字は30バイトまでです # byeと入力で、終了 # '文字配列buffを100バイト確保して、キーボードから繰り返し入力して その文字列を空白を作り、連結していくプログラムを作ります キーボードから入力できる文字は30バイトまでです byeと入力で、終了'(L) :- length(L,100), get_line(_行文字列), 'キーボードから繰り返し入力してその文字列を空白を作り、連結していく'(_行文字列,L), atom_chars(_文字列,L). 'キーボードから繰り返し入力してその文字列を空白を作り、連結していく'(bye,L) :- 残りに空白を埋める(L). 'キーボードから繰り返し入力してその文字列を空白を作り、連結していく'(_文字列,L) :- atom_chars(_文字列,_文字ならび), 文字列を埋める(_文字ならび,L,R), get_line(_次の行文字列), 'キーボードから繰り返し入力してその文字列を空白を作り、連結していく'(_次の行文字列,R). 文字列を埋める([],[' '|R],R). 文字列を埋める([_文字|R1],[_文字|R2],R) :- 文字列を埋める(R1,R2,R). 残りに空白を埋める([]). 残りに空白を埋める([' '|R]) :- 残りに空白を埋める(R). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/555 # お題:全n巻の全集があり各巻の頁数はすべてp頁である。毎日x頁づつ読んだら # 最後の日は1頁だけだった。p,xから最小のnを求める。解がない場合は偽を返す。 # 例 # p=213, x=16 -> 13 # p=214, x=16 -> false # p=333, x=29 -> 27 # # '全n巻の全集があり各巻の頁数はすべてp頁である。毎日x頁づつ読んだら 最後の日は1頁だけだった。p,xから最小のnを求める。解がない場合は偽を返す。'(_p,_x,_最小のn) :- 毎日読む(_p,_x,_最後の日の頁数,_全集), _最後の日の頁数 = [_], length(_全集,_最小のn). 毎日読む(_p,_x,_残り頁数,_全集) :- 頁をならびで表現する(_p,_x,_p頁,_x頁), '毎日読む'([_],_p頁,_p頁,_x頁,_全集,_残り頁数),!. 頁をならびで表現する(_p,_x,_p頁,_x頁) :- length(_p頁,_p), length(_x頁,_x). 毎日読む(_冊数,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数) :- '終了条件は_残り頁数が[]または[_]'(_冊数,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数). 毎日読む(_冊数_1,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数) :- '一冊読み切れなかったら翌日に、読み切ったら次の本を'(_冊数_1,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数). '一冊読み切れなかったら翌日に、読み切ったら次の本を'(_冊数_1,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数) :- 一冊読み切れなかったら翌日に(_冊数_1,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数). '一冊読み切れなかったら翌日に、読み切ったら次の本を'(_冊数_1,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数) :- 読み切ったら次の本を(_冊数_1,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数). 一冊読み切れなかったら翌日に(_冊数_1,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数) :- append(_x頁,_現在の頁数_2,_現在の頁数), 毎日読む(_冊数_1,_現在の頁数_2,_p頁,_x頁,_冊数,_残り頁数). 読み切ったら次の本を(_冊数_1,_現在の頁数,_p頁,_x頁,_冊数,_残り頁数) :- append(_現在の頁数,_p頁,_現在の頁数_2), 毎日読む([_|_冊数_1],_現在の頁数_2,_p頁,_x頁,_冊数,_残り頁数). '終了条件は_残り頁数が[]または[_]'(_冊数,_現在の頁数,_p頁,_x頁,_冊数,[_]) :- append(_x頁,[_],_現在の頁数). '終了条件は_残り頁数が[]または[_]'(_冊数,[],_p頁,_x頁,_冊数,[]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/555 # お題:全n巻の全集があり各巻の頁数はすべてp頁である。毎日x頁づつ読んだら # 最後の日は1頁だけだった。p,xから最小のnを求める。解がない場合は偽を返す。 # 例 # p=213, x=16 -> 13 # p=214, x=16 -> false # p=333, x=29 -> 27 # # '全n巻の全集があり各巻の頁数はすべてp頁である。毎日x頁づつ読んだら 最後の日は1頁だけだった。p,xから最小のnを求める。解がない場合は偽を返す。'(_p頁,_x頁,_n巻) :- '全n巻の全集があり'(_全集,_n巻), '各巻の頁数はすべてp頁である。'(_全集,_p頁), 毎日x頁づつ読んだら最後の日は(_全集,_x頁,_最後の日に読んだ頁数),!, '1頁だけだった。解がない場合は偽を返す。'(_最後の日に読んだ頁数). '全n巻の全集があり'(_全集,_n巻) :- length(_全集,_n巻). '各巻の頁数はすべてp頁である。'(_全集,_p頁) :- findall(_各巻,( member(_各巻,_全集), length(_各巻,_p頁)),_全集). 毎日x頁づつ読んだら最後の日は(_全集,_x頁,_最後の日に読んだ頁数) :- flatten(_全集,_全集の全頁数), length(_x頁ならび,_x頁), 最後の日は(_全集の全頁数,_x頁ならび,_最後の日に読んだ頁数). 最後の日は(_最後の日に読んだ頁数,_最後の日に読んだ頁数,_最後の日に読んだ頁数). 最後の日は([_],_,[_]). 最後の日は(L,_x頁ならび,_最後の日に読んだ頁数) :- append(_x頁ならび,L2,L), 最後の日は(L2,_x頁ならび,_最後の日に読んだ頁数). '1頁だけだった。解がない場合は偽を返す。'(_最後の日に読んだ頁数) :- _最後の日に読んだ頁数 = [_]. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/555 # お題:全n巻の全集があり各巻の頁数はすべてp頁である。毎日x頁づつ読んだら # 最後の日は1頁だけだった。p,xから最小のnを求める。解がない場合は偽を返す。 # 例 # p=213, x=16 -> 13 # p=214, x=16 -> false # p=333, x=29 -> 27 # # '全n巻の全集があり各巻の頁数はすべてp頁である。毎日x頁づつ読んだら 最後の日は1頁だけだった。p,xから最小のnを求める。解がない場合は偽を返す。'(_p頁,_x頁,_n巻) :- '全n巻の全集があり'(_全集,_n巻), '各巻の頁数はすべてp頁である。'(_全集,_p頁), '毎日x頁づつ読んだら最後の日は1頁だけだった。'(_全集,_x頁,_最後の日に読んだ頁数),!, _最後の日に読んだ頁数 = [_]. '全n巻の全集があり'(_全集,_n巻) :- length(_全集,_n巻). '各巻の頁数はすべてp頁である。'(_全集,_p頁) :- findall(_各巻,( member(_各巻,_全集), length(_各巻,_p頁)), _全集). '毎日x頁づつ読んだら最後の日は1頁だけだった。'(_全集,_x頁,_最後の日に読んだ頁数) :- flatten(_全集,_全集の全頁数), length(_x頁ならび,_x頁), 最後の日は(_全集の全頁数,_x頁ならび,_最後の日に読んだ頁数). 最後の日は(_最後の日に読んだ頁数,_最後の日に読んだ頁数,_最後の日に読んだ頁数). 最後の日は([_],_,[_]). 最後の日は(L,_x頁ならび,_最後の日に読んだ頁数) :- append(_x頁ならび,L2,L), 最後の日は(L2,_x頁ならび,_最後の日に読んだ頁数). % 以下のサイトは # 出典: 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/757 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 担当者名が"end"になるまで、担当者名と売上を入力する。 # 売上合計、平均、最も売上が多い担当者名とその売上、 # 最も売上が低い担当者名とその売上を表示する。 # '担当者名が"end"になるまで、担当者名と売上を入力する。 売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。' :- '担当者名が"end"になるまで、担当者名と売上を入力する。'(_担当者名_売上ならび), '売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。'(_担当者_売上ならび). '担当者名が"end"になるまで、担当者名と売上を入力する。'(_担当者名_売上ならび) :- findall([_担当者名,_売上],( 担当者の入力(_担当者名), ( _担当者名 = end,!,fail; 売上の入力(_売上))), _担当者名_売上ならび). 担当者の入力(_担当者名) :- write('担当者名を入力してください (endで終了する) : '), get_line(_担当者名). 売上の入力(_売上) :- 整数を得る('売上を入力して下さい : ',true,_売上). '売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。'(_担当者_売上ならび) :- '売上合計、平均、'(_担当者_売上ならび,_売上合計,_平均), '最も売上が多い担当者名とその売上、最も売上が低い担当者名とその売上を'(_担当者_売上ならび,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上), 表示する(_売上合計,_平均,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上). '売上合計、平均、'(_担当者_売上ならび,_売上合計,_平均) :- findall(_売上,( member([_,_売上],_担当者名_売上ならび)), _売上ならび), sum_list(_売上ならび,_売上合計), length(_売上ならび,_要素数), _平均 is _売上合計 / _要素数. '最も売上が多い担当者名とその売上、最も売上が低い担当者名とその売上を'(_担当者_売上ならび,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上) :- setof(_担当者,[_担当者,_売上] ^ member([_担当者,_売上],_担当者_売上ならび),_担当者名ならび), 担当者別の売上合計(_担当者_売上ならび,_担当者名ならび,_担当者別売上合計ならび), '最も売上が多い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が多い担当者,_最も売上が多い担当者の売上), '最も売上が低い担当者名とその売上'(_担当者別売上合計ならび,_最も売上が低い担当者,_最も売上が低い担当者の売上). 担当者別の売上合計(_担当者_売上ならび,_担当者名ならび,_担当者別売上合計ならび) :- findall([_担当者名,_売上合計],( member(_担当者名,_担当者名ならび), findsum(_売上,( member([_担当者名,_売上],_担当者別売上ならび), _売上合計))), _担当者別売上合計ならび). '最も売上が多い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が多い担当者,_最も売上が多い担当者の売上) :- append(L1,[[_最も売上が多い担当者,_最も売上が多い担当者の売上]|L2],_担当者別売上合計ならび), \+((member([_,_売上合計],L1),_売上合計 > _最も売上が多い担当者の売上)), \+((member([_,_売上合計],L2),_売上合計 > _最も売上が多い担当者の売上)). '最も売上が低い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が低い担当者,_最も売上が低い担当者の売上) :- append(L1,[[_最も売上が低い担当者,_最も売上が低い担当者の売上]|L2],_担当者別売上合計ならび), \+((member([_,_売上合計],L1),_売上合計 < _最も売上が低い担当者の売上)), \+((member([_,_売上合計],L2),_売上合計 < _最も売上が低い担当者の売上)). 表示する(_売上合計,_平均,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上) :- writef('売上合計 = %t\n平均 = %t\n',[_売上合計,_平均]), writef('最も売上が多い担当者名 = %t\n最も売上が多い担当者の売上 = %t\n最も売上が低い担当者名 = %t\n',[_最も売上が多い担当者名,_最も売上が多い担当者の売上]), writef('最も売上が低い担当者名 = %t\n最も売上が低い担当者の売上 = %t\n',[_最も売上が低い担当者名,_最も売上が低い担当者の売上]). % 以下のサイトは # 出典 : http://peace.2ch.net/test/read.cgi/tech/1392388003/754 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。 # '点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。' :- '点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。'([]). '点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。'(_点数ならび) :- sum_list(_点数ならび,_合計), _合計 >= 999,!. '点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。'(_点数ならび) :- 新たな点数を入力する(_点数ならび,_新たな点数ならび), '合計、平均、最高点数、最低点数を表示する。'(_あらたな点数ならび). '合計、平均、最高点数、最低点数を表示する。'(_点数ならび) :- '合計、平均、最高点数、最低点数を表示する。'(_点数ならび), '点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。'(_点数ならび). '合計、平均、最高点数、最低点数を表示する。'(_点数合計,_点数ならび) :- length(_点数ならび,_要素数), _平均 is _点数合計 / _要素数, 最高点数(_点数ならび,_最高点数), 最低点数(_点数ならび,_最低点数), writef('合計 = %t\n平均 = %t\n最高点数 = %t\n最低点数 = %t\n',[_点数合計,_平均,_最高点数,_最低点数]). 新たな点数を入力する(_点数ならび,[_点数|_新たな点数ならび]) :- 整数を得る('点数を入力してください : ',(integer(_点数),_点数>=0),_点数),!. 最高点数(_点数ならび,_最高点数) :- append(L1,[_最高点数|L2],_点数ならび), \+((member(N,L1),N > _最高点数)), \+((member(N,L2),N > _最高点数)). 最低点数(_点数ならび,_最低点数) :- append(L1,[_最低点数|L2],_点数ならび), \+((member(N,L1),N < _最低点数)), \+((member(N,L2),N < _最低点数)). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/745 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 1)変数名 kokugo,shakai,rika を整数型で宣言する。(国語、社会、理科) # 変数名 goukei,heikinを整数型で宣言する。(合計、平均) # 2)「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。 # 3)3科目の合計を求める。 # 4)enumを使うこと # '「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。' :- forall(科目の点数を入力する(_科目,_点数),assertz(成績(_科目,_点数))). 科目の点数を入力する(_科目,_点数) :- 科目と催促文を得る(_科目,_催促文), 整数を得る(_催促文,integer(_点数),_点数). 科目と催促文を得る(_科目,_催促文) :- member(_科目,[国語,社会,理科]), swritef(_催促文,'%tの点数=',[_科目]). '3科目の合計を求める。'(_合計) :- findsum(_点数,成績(_,_点数),_合計). '3科目の平均を求める。'(_平均) :- findavg(_点数,成績(_,_点数),_平均). findsum(A,_目標,_合計) :- findall(A,_目標,_解ならび), sum_list(_解ならび,_合計). findavg(A,_目標,_相和平均) :- findall(A,_目標,_解ならび), 相和平均(_解ならび,_相和平均). 相和平均([_標本|R],_相和平均) :- length([_標本|R],_標本数), sum_list([_標本|R],_合計), _相和平均 is _合計 / _標本数. 整数を得る(_催促文,_条件,_整数) :- write(_催促文), 行を得る(_行), 整数入力検査(_行,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 行を得る(_行) :- read_line_to_codes(user_input,_codes), atom_codes(_行,_codes). 整数入力検査(_行,_条件,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査と条件検査(_行,_整数,_条件). 整数検査と条件検査(_行,_整数,_条件) :- 整数検査(_行,_整数), 条件検査(_行,_条件). 整数検査(_行,_整数) :- integer(_整数),!. 整数検査(_整数) :- writef('入力された行 %w から整数は得られません。\n',[_行]), fail. 条件検査(_行,_条件) :- call(_条件),!. 条件検査(_行,_条件) :- writef('入力された行 %w からは、条件 %w が真になりません。\n',[_行,_条件]), fail. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/741 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 以下のプログラムを作成すること # 英文の回文判定 # 回文とは、どちらから読んでも # 同じ並びになる文章。 # 1つの英文字列(100文字以内)が入力されるので、 # 回文であれば、GOODと表示 # 回文でなければ、NGと表示 # *大文字小文字を区別しない # *「?!,. 」を無視する # # 実行例) # apple 入力 # NG 出力 # Borrow or rob? 入力 # GOOD 出力 # Kodak ad? OK! 入力 # GOOD 出力 # What time is it? 入力 # NG 出力 # Was it a bar or a bat I saw? 入力 # GOOD 出力 # '英文の回文判定 回文とは、どちらから読んでも 同じ並びになる文章。 1つの英文字列(100文字以内)が入力されるので、 回文であれば、GOODと表示 回文でなければ、NGと表示 *大文字小文字を区別しない *「?!,. 」を無視する' :- '1つの英文字列(100文字以内)が入力されるので、'(_文字列), '回文であれば、GOODと表示 回文でなければ、NGと表示 *大文字小文字を区別しない *「?!,. 」を無視する'(_文字列). '1つの英文字列(100文字以内)が入力されるので、'(_文字列) :- get_line(_文字列), atom_length(_文字列,_文字列の長さ), _文字列の長さ =< 100,!. '1つの英文字列(100文字以内)が入力されるので、'(_文字列) :- '1つの英文字列(100文字以内)が入力されるので、'(_文字列). '回文であれば、GOODと表示 回文でなければ、NGと表示 *大文字小文字を区別しない *「?!,. 」を無視する'(_文字列) :- '*大文字小文字を区別しない *「?!,. 」を無視する'(_文字列,_回文判定文字列), '回文であれば、GOODと表示 回文でなければ、NGと表示'(_回文判定文字列). '*大文字小文字を区別しない *「?!,. 」を無視する'('',''). '*大文字小文字を区別しない *「?!,. 」を無視する'(_文字列_1,_文字列) :- 最初の文字と残り文字列(_文字列_1,_文字,_残り文字列), '大文字を小文字に変換し、「?!,. 」を無視する'(_文字,_文字_2), '*大文字小文字を区別しない *「?!,. 」を無視する'(_残り文字列,_文字列_2), atom_concat(_文字_2,_文字列_2,_文字列). '大文字を小文字に変換し、「?!,. 」を無視する'(_文字,_文字_2) :- '大文字を小文字に変換し'(_文字,_文字_1), '*「?!,. 」を無視する'(_文字_1,_文字_2). 大文字を小文字に変換(_文字,_小文字) :- 英大文字英小文字(_文字,_小文字),!. 大文字を小文字に変換(_文字,_文字). 英大文字英小文字('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). '*「?!,. 」を無視する'(_文字,'') :- member(_文字,['?','!','.',' ']),!. '*「?!,. 」を無視する'(_文字,_文字). '回文であれば、GOODと表示 回文でなければ、NGと表示'(_文字列) :- '回文であれば、'(_文字列), 'GOODと表示'. '回文であれば、GOODと表示 回文でなければ、NGと表示'(_) :- '回文でなければ、'(_文字列), 'NGと表示'. '回文であれば、'(_文字列) :- forall((sub_atom(_文字列,S,1,R,_文字),S =< R),sub_atom(_文字列,R,1,S,_文字)). '回文でなければ、'(_文字列) :- \+('回文であれば、'(_文字列)). 'GOODと表示' :- write('Good\n'). 'NGと表示' :- write('NG\n'). % 以下のサイトは # 出題場所 :: 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',[_勝者]). % 以下のサイトは バイナリファイル (標準入力) に一致しました % 以下のサイトは # 出典: C/C++の宿題片付けます 167代目 #698 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # ?以下のプログラムを作成しなさい. # 5件の数字を入力し、上位3位までの # 数字を順に表示する # (数字の大きい順) # # 実行例) # 22 入力1 # 30 入力2 # 10 入力3 # 40 入力4 # 2 入力5 # 40 30 22 出力 # 123 入力1 # 25 入力2 # 294 入力3 # -100 入力4 # 80 入力5 # 294 123 80 出力 # -20 入力1 # -25 入力2 # -394 入力3 # -50 入力4 # -80 入力5 # -20 -25 -50 出力 # [3] 環境 . #  [3.1] Windows 8.1 #  [3.2] Visual studio 2013 #  [3.3] C # [4] 期限:2014年7月14日0:00 '5件の数字を入力し、上位3位までの 数字を順に表示する (数字の大きい順)' :- '5件の数字を入力し、'(_5件の数字ならび), '上位3位までの数字を順に表示する(数字の大きい順)'(_5件の数字ならび). '5件の数字を入力し、'(_5件の数字ならび) :- findall(_数字,( 数字の入力(_数字)),_5件の数字ならび). 数字の入力(_数字) :- '_件目の入力を促す', 数字入力(_行,_数字). '_件目の入力を促す' :- append(L1,[_件目|R],[1,2,3,4,5]), length([_件目|R],_残り件数), writef('%w件目(残り%w件) の数字を入力して下さい : ',[_件目,_残り件数]). 数字入力(_行,_数字) :- 行入力し数字を得る(_行,_数字),!. 数字入力(_行,_数字) :- 数字入力(_行,_数字). 行入力し数字を得る(_行,_数字) :- 行入力(_行), 数字検査(_行,_数字). 行入力(_行) :- read_line_to_codes(user_input,_codes), atom_codes(_行,_codes). 数字検査(_行,_数字) :- 行を解析し数字を得る(_行,_数字),!. 数字検査(_行,_) :- 再入力を要請する(_行). 行を解析し数字を得る(_行,_数字) :- atom_number(_行,_数字). 再入力を要請する(_行) :- writef('入力された文字列 %w は数字ではありません。再入力をお願いします。\n',[_行]), fail. '上位3位までの数字を順に表示する(数字の大きい順)'(_5件の数字ならび) :- '上位3位までの数字を順に(数字の大きい順)'(_5件の数字ならび,[],_上位3位までの数字ならび), 表示する(_上位3位までの数字ならび). '上位3位までの数字を順に(数字の大きい順)'([],[_1,_2,_3|_],[_1,_2,_3]). '上位3位までの数字を順に(数字の大きい順)'([M|R1],L1,_上位3位までの数字ならび) :- 挿入する(M,L1,L2), '上位3位までの数字を順に(数字の大きい順)'(R1,L2,_上位3位までの数字ならび). 挿入する(M,L1,L2) :- 'L1が[]であるかL1の先頭要素よりMが大きい時停止する'(M,L1,L2). 挿入する(M,L1,L2) :- 挿入するべき位置を捜す(M,L1,L2). 'L1が[]であるかL1の先頭要素よりMが大きい時停止する'(M,[],[M]). 'L1が[]であるかL1の先頭要素よりMが大きい時停止する'(M,[N|R],[M,N|R]) :- M >= N,!. 挿入するべき位置を捜す(M,[N|R2],[N|R3]) :- M < N, 挿入する(M,R2,R3). 表示する(_上位3位までの数字ならび) :- writef('%w %w %w\n',_上位3位までの数字ならび). % 以下のサイトは 魔方陣(_魔方陣) :- 魔方陣の構成要素を得る(_魔方陣,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). % 以下のサイトは # 出典: 問題 # 詳細な問題文 # 私のツイート(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). % 以下のサイトは # お題:与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。 # 例:123は、1,23 1,2,3 12,3のように分割出来る。 # 1,23 ---> 22*22 ---> 484 # 1,2,3 ---> 1*1+1*1 --> 2 # 12,3 ---> 9*9 ---> 81 # です。 '与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、 隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。'(_与えられた数値列,_隣り合う数の差の二乗の合計が最大になるような分割) :- '与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、'(_与えられた数値,_全数値分割), '隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。'(_全数値分割,_隣り合う数の差の二乗の合計が最大になるような分割). '与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、'(_与えられた数値,_全数値分割) :- number_chars(_与えられた数値,_数字ならび), findall(_数値分割,( 数字ならびから数値分割(_数字ならび,_数値分割)), _全数値分割). 数字ならびから数値分割([],[]). 数字ならびから数値分割(_数字ならび,[N|LL2]) :- append(L1,L2,_数字ならび), number_chars(N,L1), 数字ならびから数値分割(L2,LL2). '隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。'(_全数値分割,_隣り合う数の差の二乗の合計が最大になるような分割) :- findall(_隣り合う数の差の二乗の合計,( member(_分割,_全数値分割), '隣り合う数の「差の二乗」の合計が'(_分割,_隣り合う数の差の二乗の合計)), _隣り合う数の差の二乗の合計ならび), 最大になるような分割(_全数値分割,_隣り合う数の差の二乗の合計ならび,_合計の最大値). '隣り合う数の「差の二乗」の合計が'(_全数値分割,_隣り合う数の差の二乗の合計) :- findsum(_隣り合う数の差の二乗,( append(_,[N1,N2|_],_全数値分割), _隣り合う数の差の二乗 is (N1 - N2) ^ 2), _隣り合う数の差の二乗の合計). 最大になるような分割(_全数値分割,_隣り合う数の差の二乗の合計ならび,_隣り合う数の差の二乗の合計が最大になるような分割) :- 最大になる(_隣り合う数の差の二乗の合計ならび,_位置,_合計の最大値), nth1(_位置,_全数値分割,_隣り合う数の差の二乗の合計が最大になるような分割). 最大になる(_隣り合う数の差の二乗の合計ならび,_位置,_合計の最大値) :- append(L1,[_合計の最大値|L2],_隣り合う数の差の二乗の合計ならび), forall(member(N1,L1),N1 =< _合計の最大値), forall(member(N2,L2),N2 =< _合計の最大値), length([_|L1],_位置). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 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])). % 以下のサイトは # # ならびの最初のn要素を切り取る # ならびの最初のn要素を切り取る(_n,_ならび,_最初のn要素を切り取ったならび) :- length(_最初のn要素を切り取ったならび,_n), append(_最初のn要素を切り取ったならび,_,_ならび). ならびの最初のn要素を切り取る(_n,_ならび,_最初のn要素を切り取ったならび,_残りならび) :- length(_最初のn要素を切り取ったならび,_n), append(_最初のn要素を切り取ったならび,_残りならび,_ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ならびの最初のn要素を切り取る(0,_,[]). ならびの最初のn要素を切り取る(_n,[A|R1],[A|R2]) :- succ(_n_1,_n), ならびの最初のn要素を切り取る(_n_1,R1,R2). ならびの最初のn要素を切り取る(0,_残りのならび,[],_残りのならび). ならびの最初のn要素を切り取る(_n,[A|R1],[A|R2],_残りのならび) :- succ(_n_1,_n), ならびの最初のn要素を切り取る(_n_1,R1,R2,_残りのならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ならびの先頭からn要素を切り取る(_n,_ならび,_最初のn要素を切り取ったならび) :- length(_最初のn要素を切り取ったならび,_n), append(_最初のn要素を切り取ったならび,_,_ならび). ならびの先頭からn要素を切り取る(_n,_ならび,_最初のn要素を切り取ったならび,_残りならび) :- length(_最初のn要素を切り取ったならび,_n), append(_最初のn要素を切り取ったならび,_残りならび,_ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ならびの先頭からn要素を切り取る(0,_,[]). ならびの先頭からn要素を切り取る(_n,[A|R1],[A|R2]) :- succ(_n_1,_n), ならびの先頭からn要素を切り取る(_n_1,R1,R2). ならびの先頭からn要素を切り取る(0,_残りのならび,[],_残りのならび). ならびの先頭からn要素を切り取る(_n,[A|R1],[A|R2],_残りのならび) :- succ(_n_1,_n), ならびの先頭からn要素を切り取る(_n_1,R1,R2,_残りのならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ならびの末尾からn要素を切り取る(_n,_ならび,_末尾からn要素を切り取ったならび) :- length(_最初のn要素を切り取ったならび,_n), append(_,_末尾からn要素を切り取ったならび,_ならび). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #203 # 例: # 110, 119 -> T # -110, -119 -> T # -110, 119 -> F # 1234, 214 -> F # 567, 23 -> F # 567, -23 -> F '2つの整数が与えられたとき、桁数が同じ場合を求める。 指数関数は使わないこと。 例: 110, 119 -> T -110, -119 -> T -110, 119 -> F 1234, 214 -> F 567, 23 -> F 567, -23 -> F'(_整数_1,_整数_2) :- number_chars(_整数_1,_数字ならび_1), number_chars(_整数_2,_数字ならび_2), length(_数字ならび_1,_桁数), length(_数字ならび_2,_桁数). % 以下のサイトは # プログラミングのお題スレ Part4 #197 # アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 # 例に沿って連続する文字をカウントするプログラムを作成せよ。 # # 出力の最後に改行を挿入すること。 # 標準入力から以下の形式で与えられる。 # S # # 例) # In: # aaaaaaaaaabbbbbbbbbbbbcccccccddddddddddeeeeeeefffffffffghiiiiiiiii # # Out: # a10b12c7d10e7f9ghi9 # # In: # # Out: # 0 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 例に沿って連続する文字をカウントするプログラムを作成せよ。 出力の最後に改行を挿入すること。 標準入力から以下の形式で与えられる。' :- 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字ならび), 連続する文字をカウントする(_文字ならび,_文字_連続数ならび), 出力する(_文字_連続数ならび). 連続する文字をカウントする(L4,_文字_連続数ならび) :- findall([_文字,_連続数],( append(L1,L2,L3,L4), 'L2は限界連続文字ならび'(L1,L2,L3,_文字,_連続数)), _文字_連続数ならび). 'L2は限界連続文字ならび'(L1,L2,L3,_文字,_連続数) :- all(L2,_文字), \+(nth1(1,L3,_文字)), \+(last(L1,_文字)), length(L2,_連続数). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). all([],_). all([A|R],A) :- all(R,A). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字ならび) :- length(S,100), write('In: '), '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字), 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(S,_文字,_文字ならび). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる,'([],_,[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_,end_of_file,[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_,'\n',[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる'([_|S],_文字,[_文字|R]) :- '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(S,_次の文字), 'アルファベットの小文字aからzで成り立つS(S,0≦S≦100)が標準入力から与えられる。'(S,_次の文字,R). '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(end_of_file) :- !. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'('\n') :- !. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字) :- get_char(_文字), 文字はアルファベットの小文字aからzで成り立つ(_文字),!. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字) :- '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字). 文字はアルファベットの小文字aからzで成り立つ(end_of_file) :- !. 文字はアルファベットの小文字aからzで成り立つ('\n') :- !. 文字はアルファベットの小文字aからzで成り立つ(_文字) :- _文字 @>= 'a', _文字 @=< 'z',!. 出力する(LL) :- flatten(LL,L), atomic_list_concat(L,_出力文字列). writef('Out:\n%t\n',[_出力文字列]). % 以下のサイトは # プログラミングのお題スレ Part4 #197 # アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 # 例に沿って連続する文字をカウントするプログラムを作成せよ。 # # 出力の最後に改行を挿入すること。 # 標準入力から以下の形式で与えられる。 # S # # 例) # In: # aaaaaaaaaabbbbbbbbbbbbcccccccddddddddddeeeeeeefffffffffghiiiiiiiii # # Out: # a10b12c7d10e7f9ghi9 # # In: # # Out: # 0 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 例に沿って連続する文字をカウントするプログラムを作成せよ。 出力の最後に改行を挿入すること。 標準入力から以下の形式で与えられる。' :- 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字列), 連続する文字をカウントする(_文字列,_出力文字列), writef('Out:\n%t\n',[_出力文字列]). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字列) :- write('In: '), read(_文字列). 連続する文字をカウントする('','') :- !. 連続する文字をカウントする(_文字列,_出力文字列) :- 文字列の先頭から同一文字を切り取る(_文字列,_連続文字,_連続文字数,_残り文字列), 連続する文字をカウントする(_残り文字列,_残り出力文字列), atomic_list_concat([_連続文字,_連続文字数,_残り出力文字列],_出力文字列). 文字列の先頭から同一文字を切り取る(_文字列,_連続文字,_連続文字数,_残り文字列) :- sub_atom(_文字列,0,1,_,_連続文字), 連続文字数と残り文字列を得る(_文字列,_連続文字,_連続文字数,_残り文字列). 連続文字数と残り文字列を得る(_文字列,_連続文字,_連続文字数,_残り文字列) :- sub_atom(_文字列,_連続文字数,1,_,_文字), \+(_連続文字 = _文字), sub_atom(_文字列,_連続文字数,_,0,_残り文字列),!. 連続文字数と残り文字列を得る(_文字列,_連続文字,_連続文字数,'') :- atom_length(_文字列,_連続文字数). % 以下のサイトは # プログラミングのお題スレ Part4 #197 # アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 # 例に沿って連続する文字をカウントするプログラムを作成せよ。 # # 出力の最後に改行を挿入すること。 # 標準入力から以下の形式で与えられる。 # S # # 例) # In: # aaaaaaaaaabbbbbbbbbbbbcccccccddddddddddeeeeeeefffffffffghiiiiiiiii # # Out: # a10b12c7d10e7f9ghi9 # # In: # # Out: # 0 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 例に沿って連続する文字をカウントするプログラムを作成せよ。 出力の最後に改行を挿入すること。 標準入力から以下の形式で与えられる。'(LL) :- 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(Line), atom_chars(Line,Chars), '連続する文字をカウントするプログラムを作成せよ。'(Chars,LL), 出力する(LL). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(Line) :- write('In: '), get_line(Line). '連続する文字をカウントするプログラムを作成せよ。'([],[]) :- !. '連続する文字をカウントするプログラムを作成せよ。'(Chars,[[_連続文字,_文字数]|R]) :- 先頭からの連続文字(Chars,Chars1,Chars2,_連続文字), length(L1,_文字数), '連続する文字をカウントするプログラムを作成せよ。'(L2,R). 先頭からの連続文字(Chars,Chars1,Chars2,_連続文字) :- append(Chars1,Chars2,Chars), 連続文字(Chars1,_連続文字), \+((Chars2 = [A|R],_連続文字 = A)). 連続文字([],_). 連続文字([_連続文字|R],_連続文字) :- 連続文字(R,_連続文字). 出力する(LL) :- flatten(LL,L), atomic_list_concat(L,S), writef('Out:\n%t\n',[S]). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #132 # お題:ふたつの自然数が与えられたとき、数字が一致している桁の個数を求める。 # 例 # 110, 119 -> 2 # 1234, 214 -> 2 # 567, 23 -> 0 # 'ふたつの自然数が与えられたとき、数字が一致している桁の個数を求める'(_自然数_1,_自然数_2,_数字が一致している桁の個数) :- ふたつの自然数をふたつの数字文字列に変換(_自然数_1,_自然数_2,_数字文字列_1,_数字文字列_2), 数字が一致している桁の個数を求める(_数字文字列_1,_数字文字列_2,_数字が一致している桁の個数). ふたつの自然数をふたつの数字文字列に変換(_自然数_1,_自然数_2,_数字文字列_1,_数字文字列_2) :- atom_number(_数字文字列_1,_自然数_1), atom_number(_数字文字列_2,_自然数_2). 数字が一致している桁の個数を求める(_数字文字列_1,_数字文字列_2,_数字が一致している桁の個数) :- 個数を求める(数字が一致している桁の(_数字文字列_1,_数字文字列_2),_数字が一致している桁の個数). 数字が一致している桁の(_数字文字列_1,_数字文字列_2) :- sub_atom(_数字文字列_1,_,1,_残り文字数,_数字), sub_atom(_数字文字列_2,_,1,_残り文字数,_数字). 個数を求める(_実行項,_個数) :- findall(1,_実行項,L), length(L,_個数). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #132 # お題:ふたつの整数が与えられたとき、数字が一致している桁の個数を求める。 # 例 # 110, 119 -> 2 # 1234, 214 -> 2 # 567, 23 -> 0 # :- op(600,xfx,'個数を求める。'). 'ふたつの整数が与えられたとき、数字が一致している桁の個数を求める。'(_数_1,_数_2,_数字が一致している桁の個数) :- ふたつの整数をふたつの数字文字列に変換(_数_1,_数_2,_数字文字列_1,_数字文字列_2), '数字が一致している桁の個数を求める。'(_数字文字列_1,_数字文字列_2,_数字が一致している桁の個数). ふたつの整数をふたつの数字文字列に変換(_数_1,_数_2,_数字文字列_1,_数字文字列_2) :- atom_number(_数字文字列_1,_数_1), atom_number(_数字文字列_2,_数_2). '数字が一致している桁の個数を求める。'(_数字文字列_1,_数字文字列_2,_数字が一致している桁の個数) :- 数字が一致している桁の(_数字文字列_1,_数字文字列_2) '個数を求める。' _数字が一致している桁の個数. '数字が一致している桁の'(_数字文字列_1,_数字文字列_2) :- sub_atom(_数字文字列_1,_,1,_残り文字数,_数字), sub_atom(_数字文字列_2,_,1,_残り文字数,_数字), \+(_数字 = '-'). '個数を求める。'(P,_個数). findall(1,P,L), length(L,_個数). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #132 # お題:ふたつの整数が与えられたとき、数字が一致している桁の個数を求める。 # 例 # 110, 119 -> 2 # 1234, 214 -> 2 # 567, 23 -> 0 # 'ふたつの整数が与えられたとき、数字が一致している桁の個数を求める。'(_数_1,_数_2,_数字が一致している桁の個数) :- number_chars(_数_1,_数字ならび_1), number_chars(_数_2,_数字ならび_2), reverse(_数字ならび_1,_反転した数字ならび_1), reverse(_数字ならび_2,_反転した数字ならび_2), '数字が一致している桁の個数を求める。'(_反転した数字ならび_1,_反転した数字ならび_2,_数字が一致している桁の個数). '数字が一致している桁の個数を求める。'(_反転した数字ならび_1,_反転した数字ならび_2,_数字が一致している桁の個数) :- '個数を調べる。'(数字が一致している桁の(_反転した数字ならび_1,_反転した数字ならび_2,_数字が一致している桁),_数字が一致している桁の個数). '数字が一致している桁の'(L1,L2,_数字が一致している桁) :- nth1(_数字が一致している桁,L1,_数字), nth1(_数字が一致している桁,L2,_数字), ('L1かL2のどちらかが[]の時'(L1,L2),!,fail;true). 'L1かL2のどちらかが[]の時'([],_) :- !. 'L1かL2のどちらかが[]の時'(_,[]). '個数を調べる。'(P,_個数) :- findall(1,P,L), length(L,_個数). % 以下のサイトは # 出典: twitter_by_@mandel59_20140619 # # 1) 「1から10までの数」を用意する。 # 2) 用意したデータの各要素を「すべて足す」という操作をする。 # これはまさに手続きだ '1) 「1から10までの数」を用意する。 2) 用意したデータの各要素を「すべて足す」という操作をする。 これはまさに手続きだ'(_合計) :- '1) 「1から10までの数」を用意する。'(LL), '2) 用意したデータの各要素を「すべて足す」という操作をする。'(LL,_合計). '1) 「1から10までの数」を用意する。'(LL) :- findnsols(10,[A|B],length([A|B],_),LL),!. '2) 用意したデータの各要素を「すべて足す」という操作をする。'(LL,_合計) :- flatten(LL,L), length(L,_合計). % 以下のサイトは # 出典: twitter_by_@warazo_20140611 # #     RT #    RTRT #   RTRTRT #  RTRTRTRT # RTRTRTRTRT #  RTRTRTRT #   RTRTRT #    RTRT #     RT # '     RT    RTRT   RTRTRT  RTRTRTRT RTRTRTRTRT  RTRTRTRT   RTRTRT    RTRT     RT ' :- 'RT文字列描画'(2). 'RT文字列描画'(10) :- writef('%w\n',['RTRTRTRTRT']),!. 'RT文字列描画'(_n) :- sub_atom('RTRTRTRTRT',0,_n,_r,_RT副文字列), _m is _r // 2, 'M個の空白文字列'(_m,_m個の空白文字列), 'RT文字列を上下対称に描画する'(_n,_m個の空白文字列,_RT副文字列). 'RT文字列を上下対称に描画する'(_n,_m個の空白文字列,_RT副文字列) :- writef('%w%w%w\n',[_m個の空白文字列,_RT副文字列,_m個の空白文字列]), _n_2 is _n + 2, 'RT文字列描画'(_n_2), writef('%w%w%w\n',[_m個の空白文字列,_RT副文字列,_m個の空白文字列]). 'M個の空白文字列'(_m,_m個の空白文字列) :- length(L,_m), all(L,' '), atomic_list_concat(L,_m個の空白文字列). all([],_). all([A|R],A) :- all(R,A). ?- nojiri('twitter_by_warazo_20140611_2.html'). yes. ?- swiprolog yes. ?- % 以下のサイトは # 出典: プログラミングのお題スレ 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). % 以下のサイトは 色(赤). 色(青). 色(緑). 色(黄). 区画(a). 区画(b). 区画(c). 区画(d). 隣接(a,b). 隣接(b,d). 隣接(a,c). 隣接(c,d). 塗り絵(_区画の定義順に対応した区画色変数ならび) :- 色組合せならび(_色組合せならび), 区画変数組合せ(_区画の定義順に対応した区画色変数ならび,_区画変数組合せならび), 色合わせ(_色組合せならび,_区画変数組合せならび). 色組合せならび(_色組合せならび) :- findall(_色,色(_色),_色ならび), findall([_色_1,_色_2],( 色を双方向に順列で取る(_色_1,_色_2)), _色組合せならび). 色を順列で双方向に取る(_色_1,_色_2) :- 順列(_色ならび,2,[A,B]), 双方向に取る(A,B,_色_1,_色_2). 双方向に取る(A,B,A,B). 双方向に取る(A,B,B,A). 色合わせ(L1,L2) :- select([A,B],L2,R2), member([A,B],L1), 色合わせ(L1,R2). 区画変数組合せ(_区画変数ならび,_区画変数組合せならび) :- 区画名ならびと区画変数ならびを得る(_区画名ならび,_区画変数ならび), findall([_区画変数_1,_区画変数_2],( 順列(_区画名ならび,2,[_区画名_1,_区画名_2]), 区画変数に変換(_区画名_1,_区画名_2,_区画変数_1,_区画変数_2)), _区画変数組合せならび). 区画名ならびと区画変数ならびを得る(_区画名ならび,_区画変数ならび) :- findall(_区画名,区画(_区画名),_区画名ならび), length(_区画名ならび,_要素数), length(_区画変数ならび,_要素数),!. 区画変数に変換(_区画変数ならび,_区画名_1,_区画名_2,_区画変数_1,_区画変数_2) :- nth1(_nth1,_区画名ならび,_区画名_1), nth1(_nth2,_区画名ならび,_区画名_2), nth1(_nth1,_区画変数ならび,_区画変数_1_1), nth1(_nth2,_区画変数ならび,_区画変数_2_1), 双方向にに変換(_区画変数_1_1,_区画変数_2_1,_区画変数_1,_区画変数_2). 双方向に変換(_区画変数_1_1,_区画変数_2_1,_区画変数_1_1,_区画変数_2_1). 双方向に変換(_区画変数_1_1,_区画変数_2_1,_区画変数_2_1,_区画変数_1_1). % 以下のサイトは 副文字列(_文字列,_開始位置,_副文字列の長さ,_残り文字数,_副文字列) :- sub_atom(_文字列,_開始位置,_副文字列の長さ,_残り文字数,_副文字列). 副文字列(_文字列,_副文字列) :- sub_atom(_文字列,_,_,_,_副文字列). 副文字列(_文字列,_前文字列,_中間文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,S,_,R,_中間文字列), sub_atom(_文字列,_,R,0,_後文字列). 副文字列(_文字列,_前文字列,_中間文字列,_後文字列,L1,L2,L3) :- 前文字列(_文字列,S,_前文字列,L1), 中間文字列(_文字列,S,R,_中間文字列,L2), 後文字列(_文字列,R,_後文字列,L3). 前文字列(_文字列,S,_前文字列,L1) :- sub_atom(_文字列,0,S,_,_前文字列), length(L1,S), atom_chars(_前文字列,L1). 中間文字列(_文字列,S,R,_中間文字列,L2) :- sub_atom(_文字列,S,Len,R,_中間文字列), length(L2,Len), atom_chars(_中間文字列,L2). 後文字列(_文字列,R,_後文字列,L3) :- sub_atom(_文字列,_,R,0,_後文字列), length(L3,R), atom_chars(_後文字列,L3). % 以下のサイトは '1+3+5=9=3*3はA1+A2+A3=B=n*nになりますよね Bの平方根がnであるとき、ある整数BからAnをすべて求める方法を教えてください ただしA1..Anは全て奇数の一意数であり昇順に並んでいます'(B,_A1__An) :- _n is sqrt(B), '1から始まる公差2のn要素の等差数列'(_n,_A1__An). '1から始まる公差2のn要素の等差数列'(_n,_1から始める公差2のn要素の等差数列) :- length(_1から始める公差2のn要素の等差数列,_n), _1から始める公差2のn要素の等差数列 = [1|_], '反転して公差-2にして等差数列を求める'(_1から始める公差2のn要素の等差数列). '反転して公差-2にして等差数列を求める'(L) :- reverse(L,L2), '等差数列'(L2,-2). % 以下のサイトは # 出典 :: 「受験全解算数」日能研発行 p460 灘中入試問題より # # ある工場では3種類の機械A,B,Cを使って、品物Pを生産しています。 # 1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に # 8時間ずつ運転します。また、一日の生産高は、Cを使わないときは19544個、 # Bを使わないときは、13832個、Aを使わないときは14896個です。このとき、 # 次の問に答えなさい。 # (1) 3種類の機械はそれぞれ何台ありますか。 # (2) 全部の機械を使ったときの品物Pの総生産高を今の2倍にするために # は、Aを25台買い足して、さらにBとCをそれぞれ何台買いたせばよいで # すか。ただし、B,Cどちらも13台より多く買い入れるものとします。 'ある工場では3種類の機械A,B,Cを使って、品物Pを生産しています。 1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に 8時間ずつ運転します。また、一日の生産高は、Cを使わないときは19544個、 Bを使わないときは、13832個、Aを使わないときは14896個です。このとき、 次の問に答えなさい。 3種類の機械はそれぞれ何台ありますか。'(Aの台数,Bの台数,Cの台数) :- '一日の生産高は、Cを使わないときは19544個、 Bを使わないときは、13832個、Aを使わないときは14896個です。'(A,B,C), '1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に8時間ずつ運転します。 3種類の機械はそれぞれ何台ありますか。'(A,B,C,Aの台数,Bの台数,Cの台数). '一日の生産高は、Cを使わないときは19544個、 Bを使わないときは、13832個、Aを使わないときは14896個です。'(A,B,C) :- '一日の生産高は、Cを使わないときは19544個、'(A,B), '一日の生産高は、Bを使わないときは13832個、'(A,C), '一日の生産高は、Aを使わないときは14896個、'(B,C). '一日の生産高は、Cを使わないときは19544個、'(A,B) :- length(A_plus_B,19544), append(A,B,A_plus_B). '一日の生産高は、Bを使わないときは13832個、'(A,C) :- length(A_plus_C,13832), append(A,C,A_plus_C). '一日の生産高は、Aを使わないときは14896個、'(B,C) :- length(B_plus_C,14896), append(B,C,B_plus_C). '1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に8時間ずつ運転します。 3種類の機械はそれぞれ何台ありますか。'(A,B,C,Aの台数,Bの台数,Cの台数) :- '1時間あたりのAの生産高は77個で、1日に8時間ずつ運転します。台数は'(A,Aの台数), '1時間あたりのBの生産高は56個で、1日に8時間ずつ運転します。台数は'(B,Bの台数), '1時間あたりのCの生産高は14個で、1日に8時間ずつ運転します。台数は'(C,Cの台数). '1時間あたりのAの生産高は77個で、1日に8時間ずつ運転します。台数は'(A,Aの台数) :- _一台のAによる一日の生産高 is 77 * 8, length(A,Aによる一日の総生産高), Aの台数 is Aによる一日の総生産高 / _一台のAによる一日の生産高. '1時間あたりのBの生産高は56個で、1日に8時間ずつ運転します。台数は'(B,Bの台数) :- _一台のBによる一日の生産高 is 56 * 8, length(B,Bによる一日の総生産高), Bの台数 is Bによる一日の総生産高 / _一台のBによる一日の生産高. '1時間あたりのCの生産高は14個で、1日に8時間ずつ運転します。台数は'(C,Cの台数) :- _一台のCによる一日の生産高 is 14 * 8, length(C,Cによる一日の総生産高), Cの台数 is Cによる一日の総生産高 / _一台のCによる一日の生産高. % 以下のサイトは # 出典 :: 「受験全解算数」日能研発行 p460 灘中入試問題より # # ある工場では3種類の機械A,B,Cを使って、品物Pを生産しています。 # 1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に # 8時間ずつ運転します。また、一日の生産高は、Cを使わないときは19544個、 # Bを使わないときは、13832個、Aを使わないときは14896個です。このとき、 # 次の問に答えなさい。 # (1) 3種類の機械はそれぞれ何台ありますか。 # (2) 全部の機械を使ったときの品物Pの総生産高を今の2倍にするために # は、Aを25台買い足して、さらにBとCをそれぞれ何台買いたせばよいで # すか。ただし、B,Cどちらも13台より多く買い入れるものとします。 'ある工場では3種類の機械A,B,Cを使って、品物Pを生産しています。 1時間あたりの生産高はA,B,Cの順に、77個、56個、14個で、1日に 8時間ずつ運転します。また、一日の生産高は、Cを使わないときは19544個、 Bを使わないときは、13832個、Aを使わないときは14896個です。このとき、 次の問に答えなさい。 (1) 3種類の機械はそれぞれ何台ありますか。'(Aの台数,Bの台数,Cの台数) :- length(A_plus_B,19544), length(A_plus_C,13832), length(B_plus_C,14896), append(A,B,A_plus_B), append(A,C,A_plus_C), append(B,C,B_plus_C), length(A,Aの一日の生産高), length(B,Bの一日の生産高), length(C,Cの一日の生産高), Aの台数 is Aの一日の生産高 / (77 * 8), Bの台数 is Bの一日の生産高 / (56 * 8), Cの台数 is Cの一日の生産高 / (14 * 8). % 以下のサイトは # 出典 :: SQL質疑応答スレ14問目 #890 # 質問させてください。MySQLです。 # 上位100件を抽出してその中から10件をランダムに抽出したい。 # SELECT文はどう書けばいいですか?1行でできますか? '上位100件を抽出してその中から10件をランダムに抽出したい。'(_10件をランダムに抽出) :- 上位100件を抽出して(_上位100件), length(_10件をランダムに抽出,10), '上位100件の中から10件をランダムに抽出したい。'(_上位100件,[],_10件をランダムに抽出). '上位100件を抽出して'(_上位100件) :- findall(_値,テーブル(_値),_値ならび), 降順整列(_値ならび,_降順整列した値ならび), length(_上位100件,100), append(_上位100件,_,_降順整列した値ならび). '上位100件の中から10件をランダムに抽出したい。'(_,_,[]). '上位100件の中から10件をランダムに抽出したい。'(_上位100件,_既に選択した位置,[_選択値|R]) :- 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値), '上位100件の中から10件をランダムに抽出したい。'(_上位100件,[_選択した位置|_既に選択した位置],R). 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値) :- ランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値),!. 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値) :- 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値). ランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値) :- _選択する位置 is random(100) + 1, \+(member(_選択する位置,_既に選択した位置)), nth1(_選択する位置,_上位100件,_選択値). 降順整列([],[]). 降順整列([A|R1],L) :- 降順分割(A,R1,L1,L2), 降順整列(L1,L1_2), 降順整列(L2,L2_2), append(L1_2,[A|L2_2],L). 降順分割(_,[],[],[]). 降順分割(A,[B|R],[B|L1],L2) :- B @> A, 降順分割(A,R,L1,L2). 降順分割(A,[B|R],L1,[B|L2]) :- B @=< A, 降順分割(A,R,L1,L2). % 以下のサイトは # 出典 :: プログラミングのお題スレ3 #623 # お題:1のビットが3個ある二進表記文字列が与えられたとき、次に大きい # 1のビットが3個ある二進表記文字列を求める。 # 例 # 111 -> 1011 # 1110 -> 10011 # 101100 -> 110001 '1のビットが3個ある二進表記文字列が与えられたとき、次に大きい1のビットが3個ある二進表記文字列を求める。'(_1のビットが3個ある二進表記文字列,_次に大きい1のビットが3個ある二進表記文字列) :- 先頭に0を付加した二進表記文字列で探索する(_1のビットが3個ある二進表記文字列,_探索した数字ならび), '先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(_探索した数字ならび,_次に大きい1のビットが3個ある二進表記文字列),!. 先頭に0を付加した二進表記文字列で探索する(_1のビットが3個ある二進表記文字列,_生成された数字ならび) :- atom_concat('0',_1のビットが3個ある二進表記文字列,_先頭に0を付加した1のビットが3個ある二進表記文字列), atom_chars(_先頭に0を付加した1のビットが3個ある二進表記文字列,_先頭に0を付加した1のビットが3個ある二進表記文字ならび), 順列で数字ならびを生成する(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_生成された数字ならび), _生成された数字ならび @> _先頭に0を付加した1のビットが3個ある二進表記文字ならび. 順列で数字ならびを生成する(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_生成された数字ならび) :- length(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_要素数), '最後の3要素だけが数字1、それより前は数字0のならび'(_要素数,_最後の3要素だけ数字1それより前は数字0のならび), 順列(_最後の3要素だけ数字1それより前は数字0のならび,_要素数,_生成された数字ならび). '最後の3要素だけが数字1、それより前は数字0のならび'(_要素数,_最後の3要素だけ数字1それより前は数字0のならび) :- length(_最後の3要素だけ数字1それより前は数字0のならび,_要素数), append(_全ての要素が数字0のならび,['1','1','1'],_最後の3要素だけ数字1それより前は数字0のならび), 全ての要素が数字0のならび(_全ての要素が数字0のならび). '先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(['0'|L],_次に大きい1のビットが3個ある二進表記文字列) :- atomic_list_concat(L,_次に大きい1のビットが3個ある二進表記文字列). '先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(['1'|L],_次に大きい1のビットが3個ある二進表記文字列) :- atomic_list_concat(['1'|L],_次に大きい1のビットが3個ある二進表記文字列). 全ての要素が数字0のならび([]). 全ての要素が数字0のならび(['0'|_全ての要素が数字0のならび]) :- 全ての要素が数字0のならび(_全ての要素が数字0のならび). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは # # [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 _合計値 / _要素数. % 以下のサイトは :- dynamic(もらったよ/2). 'http://t.co/A1Tk1q6uuH'([_ぼく|R],L) :- はんぶんこ(_ぼく,L,L2), 'http://t.co/A1Tk1q6uuH'(R,L2). 'http://t.co/A1Tk1q6uuH'([],_). はんぶんこ(_ぼく,L,L2) :- length(L1,_要素数), length(L2_1,_要素数), はんぶんこ(L,L1,L2_1,L2), assertz(もらったよ(_ぼく,L1)). はんぶんこ(L,L1,L2_1,L2) :- append(L1,L2_1,[_ひとつ余り],L), append(L2_1,[_ひとつ余り],L2),!. はんぶんこ(L,L1,L2,L2) :- append(L1,L2,L),!. append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # お題:二次元配列を各行、各列ともに昇順になるように並べ替える。 # 例 # 1 5 3 4 # 0 4 1 0 # 7 2 3 1 #  ↓ # 0 0 1 4 # 1 2 3 5 # 1 3 4 7 '二次元配列を各行、各列ともに昇順になるように並べ替える。'(_二次元ならび,_各行各列ともに昇順ならび) :- flatten(_二次元ならび,L1), 要素に重複を許す昇順整列(L1,[L|R2]), length(L,Len), 二次元ならびと同型に構成する([L|R2],Len,_各行各列ともに昇順ならび). 二次元ならびと同型に構成する([],_,[]). 二次元ならびと同型に構成する(L1,Len,[L3|R3]) :- length(L3,Len), append(L3,R1,L1), 二次元ならびと同型に構成する(R1,Len,R3). 要素に重複を許す昇順整列([],[]). 要素に重複を許す昇順整列([_軸要素|R],L) :- '軸要素で分割する(要素の重複を許す)'(_軸要素,R,L1,L2), 整列(L1,L1_2), 整列(L2,L2_2), append(L1_2,[_軸要素|L2_2],L). '軸要素で分割する(要素の重複を許す)'(_,[],[],[]). '軸要素で分割する(要素の重複を許す)'(_軸要素,[A|R],[A|R1],L2) :- _軸要素 @>= A, '軸要素で分割する(要素の重複を許す)'(_軸要素,R,R1,L2). '軸要素で分割する(要素の重複を許す)'(_軸要素,[A|R],L1,[A|R2]) :- _軸要素 @< A, '軸要素で分割する(要素の重複を許す)'(_軸要素,R,L1,R2). % 以下のサイトは # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): # 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). % 以下のサイトは # # 成績 [氏名,成績1,成績2, ... 成績n] の合計点順の # 順位を振る非決定性述語 # 成績の合計順に順位付けする(_成績ならび,_順位,_組) :- 成績の合計順に(_成績ならび,_成績の合計順に降順整列したならび), 順位付けする(_成績の合計順に降順整列したならび,_順位,_組). 成績の合計順に(_成績ならび,_成績の合計順に降順整列したならび) :- 整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび), 降順整列(_合計点を先頭に付加された成績ならび,_成績の合計順に降順整列した合計点を先頭に付加された成績ならび), 先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび). 整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび) :- findall([_合計点,_氏名|L],( member([_氏名|L],_成績ならび), sum_list(L,_合計点)),_合計点を先頭に付加された成績ならび). 先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび) :- findall(L,( member([_|L],_成績の合計順に降順整列した合計点を先頭に付加された成績ならび)),_成績の合計順に降順整列したならび). 降順整列([],[]). 降順整列([_軸要素|R],L) :- 軸要素との大小で二列を作りそれぞれ降順整列したものを結合する(_軸要素,R,L). 軸要素との大小で二列を作りそれぞれ降順整列したものを結合する(_軸要素,R,L) :- 降順整列の分割(_軸要素,R,L1,L2), それぞれ降順整列したものを結合する(_軸要素,L1,L2,L). 降順整列の分割(_,[],[],[]). 降順整列の分割(_軸要素,L,L1,L2) :- '軸要素との大小でL1,L2に割り振る'(_軸要素,L,L1,L2). '軸要素との大小でL1,L2に割り振る'(_軸要素,L,L1,L2) :- 'L1に要素を付加してさらに分割を続ける'(_軸要素,L,L1,L2). '軸要素との大小でL1,L2に割り振る'(_軸要素,L,L1,L2) :- 'L2に要素を付加してさらに分割を続ける'(_軸要素,L,L1,L2). 'L1に要素を付加してさらに分割を続ける'(_軸要素,[_要素|R],[_要素|L1],L2) :- _要素 @>= _軸要素, 降順整列の分割(_軸要素,R,L1,L2). 'L2に要素を付加してさらに分割を続ける'(_軸要素,[_要素|R],L1,[_要素|L2]) :- _要素 @< _軸要素, 降順整列の分割(_軸要素,R,L1,L2). それぞれ降順整列したものを結合する(_軸要素,L1,L2,L) :- 降順整列(L1,L1_2), 降順整列(L2,L2_2), append(L1_2,[_軸要素|L2_2],L). 順位付けする(_整列した組みならび,_順位,_組) :- 順位付けする(_整列した組みならび,[],[],_順位,_組). 順位付けする([_組|_],Ln,_,_順位,_組) :- length([_|Ln],_順位). 順位付けする(L,Ln,Ln_2,_順位,_組) :- 同順位になる場合を考慮しながら順位付けをしていく(L,Ln,Ln_2,_順位,_組). 同順位になる場合を考慮しながら順位付けをしていく(L,Ln,Ln_2,_順位,_組) :- 順位調整(L,Ln,Ln_2,_新しいL,_新しいLn,_新しいLn_2), 順位付けする(_新しいL,_新しいLn,_新しいLn_2,_順位,_組). 順位調整(L,_順位,_位置順位,_新しいL,_新しい順位,_新しい位置順位) :- '合計点が同点の場合は同順位。_位置順位のみ更新する'(L,_順位,_位置順位,_新しいL,_新しい順位,_新しい位置順位),!. 順位調整(L,_順位,_位置順位,_新しいL,_新しい順位,_新しい位置順位) :- '合計点が同点でない場合は、順位とはすなわち_位置順位である'(L,_順位,_位置順位,_新しいL,_新しい順位,_新しい位置順位). '合計点が同点の場合は同順位。_位置順位のみ更新する'([_組_1,_組_2|R],_順位,_位置順位,[_組_2|R],_順位,[_|_位置順位]) :- 第二項以降の合計点が同じ(_組_1,_組_2). '合計点が同点でない場合は、順位とはすなわち_位置順位である'([_|R],_,_位置順位,R,[_|_位置順位],[_|_位置順位]). 第二項以降の合計点が同じ([_|R1],[_|R2]) :- sum_list(R1,S), sum_list(R2,S). % 以下のサイトは # # 成績 [氏名,成績1,成績2, ... 成績n]の成績の合計点順の # 順位を振る非決定性述語 # 順位付け(_整列した組みならび,_順位,_組) :- 順位付け(_整列した組みならび,[],[],_順位,_組). 順位付け([_組|_],Ln,_,_順位,_組) :- length([_|Ln],_順位). 順位付け([_組_1,_組_2|R],Ln,Ln_2,_順位,_組) :- 第二項以降の合計点が同じ(_組_1,_組_2),!, 順位付け([_組_2|R],Ln,[_|Ln_2],_順位,_組). 順位付け([_|R],_,Ln_2,_順位,_組) :- 順位付け(R,[_|Ln_2],[_|Ln_2],_順位,_組). 第二項以降の合計点が同じ([_|R1],[_|R2]) :- sum_list(R1,S), sum_list(R2,S). 成績の合計順に降順整列(_成績ならび,_成績の合計順に降順整列したならび) :- 整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび), 降順整列(_合計点を先頭に付加された成績ならび,_成績の合計順に降順整列した合計点を先頭に付加された成績ならび), 先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび). 整列の対象鍵となる合計点を先頭に付加する(_成績ならび,_合計点を先頭に付加された成績ならび) :- findall([_合計点,_氏名|成績ならび],( member([_氏名|_成績ならび],_成績ならび), sum_list(_成績ならび,_合計点)), _合計点を先頭に付加された成績ならび). 先頭の合計点は削除する(_成績の合計順に降順整列した合計点を先頭に付加された成績ならび,_成績の合計順に降順整列したならび) :- findall(L,( member([_|L],_成績の合計順に降順整列した合計点を先頭に付加された成績ならび)), _成績の合計順に降順整列したならび). 降順整列([],[]). 降順整列([_軸要素|R],L) :- 降順整列の分割(_軸要素,R,L1,L2), 降順整列(L1,L1_2), 降順整列(L2,L2_2), append(L1_2,[_軸要素|L2_2],L). 降順整列の分割(_,[],[],[]). 降順整列の分割(_軸要素,[_要素|R],[_要素|L1],L2) :- _要素 @>= _軸要素, 降順整列の分割(_軸要素,R,L1,L2). 降順整列の分割(_軸要素,[_要素|R],L1,[_要素|L2]) :- _要素 @< _軸要素, 降順整列の分割(_軸要素,R,L1,L2). % 以下のサイトは # # 既に整列されている成績 [氏名,成績1,成績2, ... 成績n]の成績の合計点順の # 順位を振る非決定性述語 # 順位付け(_整列した組ならび,_順位,_組) :- 順位付け(_整列した組ならび,[],[],_順位,_組). 順位付け([_組|_],Ln,_,_順位,_組) :- length([_|Ln],_順位). 順位付け([_組_1,_組_2|R],Ln,Ln_2,_順位,_組) :- 第二項以降の合計点が同じ(_組_1,_組_2),!, 順位付け([_組_2|R],Ln,[_|Ln_2],_順位,_組). 順位付け([_|R],_,Ln_2,_順位,_組) :- 順位付け(R,[_|Ln_2],[_|Ln_2],_順位,_組). 第二項以降の合計点が同じ([_|R1],[_|R2]) :- sum_list(R1,S), sum_list(R2,S). % 以下のサイトは % % 非決定性の 降順に順位付け/3 % 降順に順位付け(_先頭に整列対象要素のある要素ならび,_順位,_要素) :- 降順整列(_先頭に整列対象要素のある要素ならび,_降順に整列したならび), append(L1,L2,L3,_降順に整列したならび), 'L2は同一の整列対象要素の最大集合'(L1,L2,L3), 順位と要素(L1,L2,_順位,_要素). 'L2は同一の整列対象要素の最大集合'(L1,L2,L3) :- 先頭の整列対象要素は全て同一(L2,_整列対象要素), 前後には整列対象要素はない(_整列対象要素,L1,L3),!. 前後には整列対象要素はない(_整列対象要素,L1,L3) :- \+(append(_,[[_整列対象要素|_]],L1)), \+(L3 = [[_整列対象要素|_]|_]). 順位と要素(L1,L2,_順位,_要素) :- length([_|L1],_順位), member(_要素,L2). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). 先頭の整列対象要素は全て同一([],_). 先頭の整列対象要素は全て同一([[_要素|_]|R],_要素) :- 先頭の整列対象要素は全て同一(R,_要素). 降順整列([],[]). 降順整列([_軸要素|R],L) :- 降順整列の分割(_軸要素,R,L1,L2), 降順整列(L1,L1_2), 降順整列(L2,L2_2), append(L1_2,[_軸要素|L2_2],L). 降順整列の分割(_,[],[],[]). 降順整列の分割(_軸要素,[_要素|R],[_要素|L1],L2) :- A @>= _軸要素, 降順整列の分割(_軸要素,R,L1,L2). 降順整列の分割(_軸要素,[_要素|R],L1,[_要素|L2]) :- A @< _軸要素, 降順整列の分割(_軸要素,R,L1,L2). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # # かたやん印刷所では、いまの時代においてもグーテンベルグ印刷にこだわって印刷をしています。 # グーテンベルグ印刷とは、活版(活字を組み合わせて作った版)で印刷する方法です。(Wikipedia) # # かたやん印刷所の所長かたやんは、使った活字を元の場所に戻さないので、 # いつも活字を入れているボックスはぐちゃぐちゃで、 # ほしい活字をすぐに見つけ出すことができません。 # # そこで見かねた印刷所の副所長エミーは、活字を入れているボックスビデオで撮影し、 # 画像解析し、ボックスのどこにどの活字があるかを解析し、 # ほしい文字列の活字がどこにあるか瞬時にみつけだすプログラミングを作ることにしました。 # # 現状の状態のボックスは以下のようになっています。 # # # 6×6のボックスの中から"PRO, PROGRAMMER"という活字を探し出したいです。 # カンマやスペースは1つの活字としてカウントします。 # ですので、今回は文字13個、カンマ1個、スペース1個の合計15個の活字が必要です。 # 一度使った活字は2回使うことはできません。 # # 活字の場所は、(縦番号,横番号)で表すと以下のような順番で活字を取り出すことができます。 # 縦番号は上から下の方向に、横番号は左から右の方向に、1から数えます。 # 1,4 = P # 2,1 = R # 1,6 = O # 5,2 = , # 5,4 = space # 2,2 = P # 3,4 = R # 4,5 = O # 5,1 = G # 4,3 = R # 1,1 = A # 2,5 = M # 6,1 = M # 2,4 = E # 6,6 = R # # # 上記の例では、例えば"P"という文字が2回でてきますが、(1,4)と(2,2)にある"P"はどちらを先につかってもかまいません。 # また場所の特定は1つのみ記述すればよいです。すべての場所番号を書く必要はありません。 # # 画像解析したボックスのデータはCSVで出力されます。 # ボックスのデータを使ってほしい文字列を作るための活字の在り処を探しだしてください。 # # ■資料 # gutenberg.zip # zipファイルを解凍すると以下のファイルが入っています。 # # gutenberg.csv # このボックスから"STAY HUNGRY, STAY FOOLISH"という活字を取り出してください。 # 文字21個、カンマ1個、スペース3個で、合計25個の活字が必要です。 # # answer.txt # 解答用テキストファイルです。 # # ■解答方法 # 解答用テキストファイル(answer.txt)を完成させ、アップロードしてください。 # ※解答用テキストファイル(answer.txt)以外のファイル形式(zipなど)をアップロードした場合は評価対象外となります。 # '20×20のボックスの生成' :- open('gutenberg.csv',read,Instream), '20×20のボックスの生成'(Instream,_20掛ける20のボックス), close(Instream), assertz('20×20のボックス'(_20掛ける20のボックス)). '20×20のボックスの生成'(Instream,[]) :- at_end_of_stream(Instream),!. '20×20のボックスの生成'(Instream,[L|R]) :- get_line(Instream,Line), split(Line,['\t'],L), '20×20のボックスの生成'(Instream,R). '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス) :- atom_chars(_ある文字列,_文字ならび), '20×20のボックスの中からある文字列を取り出す'(_文字ならび,_20掛ける20のボックス,L), 解の表示(L). '20×20のボックスの中からある文字列を取り出す'([],_20掛ける20のボックス,[]) :- !. '20×20のボックスの中からある文字列を取り出す'([_文字|_残り文字ならび],_20掛ける20のボックス_1,[[_文字,_行目,_列目]|R]) :- ある文字を取り出す(_文字,_20掛ける20のボックス_1,1,_列目,_20掛ける20のボックス_2), '20×20のボックスの中からある文字列を取り出す'(_残り文字ならび,_20掛ける20のボックス_2,R). ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行_2|R_1]) :- nth1(_列目,_行,_文字), 行を更新する(_行,_列目,_行_2),!. ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行|R_2]) :- _行目_2 is _行目 + 1, ある文字を取り出す(_文字,R_1,_行目_2,_列目,R_2). 行を更新する(_行,_列目,_行_2) :- length([_|L1],_列目), append(L1,[_|R],_行), append(L1,[''|R],_行_2),!. 解の表示(L) :- tell('ans.txt'), forall(member([_文字,_行目,_列目],L),writef('%t,%t,%t\n',[_文字,_行目,_列目])), told. get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). split('',_,[],[]) :- !. split(_文字列,_区切り文字列ならび,[_区切り文字列|R3],[_副文字列|R4]) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列), split(_残り文字列,_区切り文字列ならび,R3,R4). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), atom_length(_区切り文字列,_長さ), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). :- '20×20のボックスの生成'(_CSVファイル). :- '20×20のボックス'(_20掛ける20のボックス), '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # '20×20のボックスの中からある文字列を取り出す'(_20掛ける20のボックス,_行目,_列目,_ある文字列) :- '20×20のボックスの中から'(_20掛ける20のボックス), ある文字列を取り出す(_20掛ける20のボックス,_行目,_列目,_ある文字列). '20×20のボックスの中から'(_20掛ける20のボックス) :- length(_20掛ける20のボックス,20), forall( member(_20のボックス,_20掛ける20のボックス), '20のボックス'(_20のボックス)). '20のボックス'(_20のボックス) :- length(_20のボックス,20), forall( member(_ボックス,_20のボックス), ボックス(_ボックス)). ボックス([_|_]) :- !. ボックス([]). ある文字列を取り出す(_20掛ける20のボックス,_行目,_列目,_ある文字列) :- nth1(_行目,_20のボックス,_20掛ける20のボックス), nth1(_列目,_20のホックス,_ボックス), member(_ある文字列,_ボックス). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # '20×20のボックスの中からある文字列を取り出す'(_20掛ける20のボックス,_行目,_列目,_ある文字列) :- _ボックス = [_|_], '20×20のボックス'(_20掛ける20のボックス), nth1(_行目,_20のボックス,_20掛ける20のボックス), nth1(_列目,_20のホックス,_ボックス), member(_ある文字列,_ボックス). '20×20のボックス'(_20掛ける20のボックス) :- length(_20掛ける20のボックス,20), forall(member(_20のボックス,_20掛ける20のボックス),length(_20のボックス,20)). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # '20×20のボックスの中からある文字列を取り出す'(_20掛ける20のボックス,_行目,_列目,_ある文字列) :- '20×20のボックス'(_20掛ける20のボックス), nth1(_行目,_20のボックス,_20掛ける20のボックス), nth1(_列目,_20のホックス,_ボックス), member(_ある文字列,_ボックス). '20×20のボックス'(_20掛ける20のボックス) :- length(_20掛ける20のボックス,20), forall(member(_20のボックス,_20掛ける20のボックス),length(_20のボックス,20)). % 以下のサイトは % スケルトン 文字列の要素文字から重複を許しN文字の文字列を作る(_文字列,N,_N文字の文字列) :- length(L,N), 文字列の要素文字から重複を許しN文字の文字列を作る(_文字列,[],L,_N文字の文字列). 文字列の要素文字から重複を許しN文字の文字列を作る(_文字列,L,L,_N文字の文字列) :- atom_chars(_N文字の文字列,L),!. 文字列の要素文字から重複を許しN文字の文字列を作る(_文字列,L1,L,_N文字の文字列) :- sub_atom(_文字列,_,1,_,_文字), 文字列の要素文字から重複を許しN文字の文字列を作る(_文字列,[_文字|L1],L,_N文字の文字列). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # '20×20のボックスの中からある文字列を取り出す'(_20掛ける20のボックス,_行目,_列目,_ある文字列) :- '20×20のボックス'(_20掛ける20のボックス), nth1(_行目,_20のボックス,_20掛ける20のボックス), nth1(_列目,_20のホックス,[_ある文字列]). '20×20のボックス'(_20掛ける20のボックス) :- length(_20掛ける20のボックス,20), forall(member(_20のボックス,_20掛ける20のボックス),length(_20のボックス,20)). % 以下のサイトは # 【問題】 # ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。 # 【例】 # 1 3 4 7 11 6 8 9 7 10 13 14 # # これを昇順に並び替えると # 1 3 4 6 7 7 8 9 10 11 13 14 # # となります。つまり、最初の整数列の、4番目から10番目を並び替えれば良いことになります。このとき、 # 4..10 # # と出力してください。もし、ソートする必要がなければ、 # 0 # # と出力してください。 # # 【解答方法】 # まずはsort.zipをダウンロードしてください。 # 中には6つのファイルが含まれています。 # # answer.txt # 解答用テキストファイルです。 # # input_case_1.txt # input_case_2.txt # input_case_3.txt # input_case_4.txt # input_case_5.txt # 整数列が含まれたデータファイルです。これらを入力として得られた結果を解答していただきます。 # データファイルの整数列は、改行区切りになっています。 # # answer.txtに必要事項を記入し、テキストファイルのままアップロードしてください。 # ※answer.txt以外のファイルをzipに固めてアップロードした場合は評価対象外となります。 # :- op(600,xfx,'::'). 'ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。'(_整数列,_開始位置 :: _終了位置) :- 範囲の開始位置(_整数列,_開始位置), 範囲の終了位置(_整数列,_終了位置),!. 'ある整数列が与えられます。その整数列を昇順に並び替えるとき、並び替える最小の範囲を見つけてください。'(_,0). 範囲の開始位置(L,_開始位置) :- append(L1,[A|L2],L), 'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2),!, length([_|L1],_開始位置). 範囲の終了位置(L,_終了位置) :- reverse(L,LR), append(L1,[A|L2],LR), 'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2),!, length([A|L2],_終了位置). 'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2) :- member(B,L1), B > A. 'L1にAより大きい要素があるかL2にAより小さい要素がある'(A,L1,L2) :- member(B,L2), B < A. 'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2) :- member(B,L1), B < A. 'L1にAより小さい要素があるかL2にAより大きい要素がある'(A,L1,L2) :- member(B,L2), B > A. % 以下のサイトは # # 文字列の先頭から連続文字を切り出す # 文字列の先頭から同じ文字による文字列を切り出す(_文字列,_同じ文字の文字列,_残り文字列) :- sub_atom(_文字列,0,1,_,_文字), 同じ文字による文字列の文字数を得る(_文字列,_文字,_文字数), sub_atom(_文字列,0,_文字数,R,_同じ文字の文字列), sub_atom(_文字列,_,R,0,_残り文字列). 同じ文字による文字列の文字数を得る(_文字列,_文字,_文字数) :- findall(_,( sub_atom(_文字列,_,1,_,_文字_1), ( \+(_文字_1 = _文字),!,fail;true)), L), length(L,_文字数). % 以下のサイトは # 出典: http://toro.2ch.net/test/read.cgi/tech/1392388003/167 # 文字列(string型)の先頭から数字として有効な文字数を返す関数ってどうやって作れば良いですか? # 例 # "126AB"→3 # "-(1+2)"→0 # "-9.25ABC"→5 '文字列の先頭から数字として有効な文字列・文字数・数値を切り出す'(_文字列,_文字数,_先頭から数字として有効な文字列,_数値) :- atom_length(_文字列,_長さ), '文字列の先頭から数字として有効な文字列・文字数・数値を切り出す'(_文字列,_長さ,_文字数,_先頭から数字として有効な文字列,_数値). '文字列の先頭から数字として有効な文字列・文字数・数値を切り出す'(_文字列,_文字数,_文字数,_先頭から数字として有効な文字列,_数値) :- '文字列の先頭から数字として有効な文字列・文字数・数値'(_文字列,_文字数,_先頭から数字として有効な文字列,_数値),!. '文字列の先頭から数字として有効な文字列・文字数・数値を切り出す'(_文字列,_文字数,_先頭から数字として有効な文字列) :- _文字数 > 0, _文字数_1 is _文字数 - 1, '文字列の先頭から数字として有効な文字列・文字数・数値を切り出す'(_文字列,_文字数_1,_先頭から数字として有効な文字列). '文字列の先頭から数字として有効な文字列・文字数・数値'(_文字列,_文字数,_先頭から数字として有効な文字列,_数値) :- _文字数 > 0, sub_atom(_文字列,0,_文字数,_,_先頭から数字として有効な文字列), catch(read_term_from_atom(_先頭から数字として有効な文字列,_数値,[]),_,fail), number(_数値),!. % 以下のサイトは # 出典: http://toro.2ch.net/test/read.cgi/tech/1392388003/167 # 文字列(string型)の先頭から数字として有効な文字数を返す関数ってどうやって作れば良いですか? # 例 # "126AB"→3 # "-(1+2)"→0 # "-9.25ABC"→5 文字列の先頭から数字として有効な文字数を得る(_文字列,_先頭から数字として有効な文字数) :- atom_length(_文字列,_長さ), 文字列の先頭から数字として有効な文字数を得る(_文字列,_長さ,_先頭から数字として有効な文字数). 文字列の先頭から数字として有効な文字数を得る(_文字列,_先頭から数字として有効な文字数,_先頭から数字として有効な文字数) :- 文字列の先頭から数字として有効な文字数(_文字列,_先頭から数字として有効な文字数),!. 文字列の先頭から数字として有効な文字数を得る(_文字列,_文字数,_先頭から数字として有効な文字数) :- _文字数 > 0, _文字数_1 is _文字数 - 1, 文字列の先頭から数字として有効な文字数を得る(_文字列,_文字数_1,_先頭から数字として有効な文字数). 文字列の先頭から数字として有効な文字数(_文字列,_先頭から数字として有効な文字数) :- _先頭から数字として有効な文字数 > 0, sub_atom(_文字列,0,_先頭から数字として有効な文字数,_,_副文字列), catch(read_term_from_atom(_副文字列,_項,[]),_,fail), number(_項),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列の先頭から数字として有効な文字列を切り出す(_文字列,_先頭から数字として有効な文字列) :- sub_atom(_文字列,0,Len,R,_先頭から数字として有効な文字列), (catch(read_term_from_atom(_先頭から数字として有効な文字列,_項,[]),_,fail),number(_項)), succ(Len,Len2), \+((sub_atom(_文字列(0,Len2,_,_副文字列2),catch(read_term_from_atom(_副文字列2,_項,[]),_,fail)),!. % 以下のサイトは # http://toro.2ch.net/test/read.cgi/tech/1392388003/116 # [1] プログラミング言語 C # [2] # ・ 指定したファイルに文字列を行数を指定して挿入するプログラム(ファイル名と位置,挿入する文字列を入力できるようにする) # ・ また、上記のプログラムを直して文字列を挿入する場所を行だけでなく列も指定できるようにせよ。(まずは半角だけでよい) # # [3] 環境 #  [3.1] OS: Windows Vista #  [3.2] コンパイラ名とバージョン: Visual C++ #  [3.3] 言語: C # [4] 期限: 3月14日 '・ 指定したファイルに文字列を行数を指定して挿入するプログラム(ファイル名と位置,挿入する文字列を入力できるようにする ・ また、上記のプログラムを直して文字列を挿入する場所を行だけでなく列も指定できるようにせよ。'(_ファイル名,_行位置,_列位置,_列位置,_文字列) :- get_chars(_ファイル名,Chars), tell(_ファイル名), 指定したファイルに文字列を行数と列数を指定して挿入する(Chars,1,_行位置,_列位置,_文字列), told. 指定したファイルに文字列を行数と列数を指定して挿入する(Chars,_行位置,_行位置,_列位置,_文字列) :- 列位置に文字列を書き込む(Chars,_列位置,_文字列), 残りの文字ならびをファイルに書く(Chars),!. 指定したファイルに文字列を行数と列数を指定して挿入する(['\n'|R],_行位置_1,_行位置,_列位置_文字列) :- write('\n'), _行位置_2 is _行位置_1 + 1, 指定したファイルに文字列を行数と列数を指定して挿入する(R,_行位置_2,_行位置,_文字列),!. 指定したファイルに文字列を行数と列数を指定して挿入する([A|R],_行位置_1,_行位置,_文字列) :- write(A), 指定したファイルに文字列を行数と列数を指定して挿入する(R,_行位置_1,_行位置,_列位置,_文字列). 列位置に文字列を書き込む(Chars,_列位置,_文字列) :- length([_|L0],_列位置), append(L0,Chars2,Chars), writef('%t\n',[_文字列]),!. 残りの文字ならびをファイルに書く([]). 残りの文字ならびをファイルに書く([Char|R]) :- write(Char), 残りの文字ならびをファイルに書く(R). % 以下のサイトは # 出題場所 :: 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). % 以下のサイトは # # 上部の基壇に幅をもたせたピラミッドの矩形 # # # _向き = 上向き, _頂点の高さ = 2, _上部の基壇の幅 = 3 の場合 # # *** # ***** # # _向き = 右向き, _頂点の高さ = 3, _上部の基壇の幅 = 2 の場合 # # * # ** # *** # *** # ** # * # ピラミッドの矩形(右向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- 下向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形),!. ピラミッドの矩形(左向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- 上向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形),!. ピラミッドの矩形(_向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- '上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形). 下向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- ピラミッドの矩形(下向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形_1), 転置(_ピラミッドの矩形_1,_ピラミッドの矩形). 上向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- ピラミッドの矩形(上向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形_1), 転置(_ピラミッドの矩形_1,_ピラミッドの矩形). '上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- _底辺の幅 is _頂点の高さ * 2 + _上部基壇の幅, length(L,_底辺の幅), findall(L4,( append(L1,L2,L), 行にピラミッドの文様を描く(_向き,_上部基壇の幅,L1,L2,L4)), _ピラミッドの矩形). 行にピラミッドの文様を描く(上向き,_上部基壇の幅,[A|L1],L2,L4) :- length(L0,_上部基壇の幅), append(L0,L1,L), 行にピラミッドの文様を描く(L,L2,L4). 行にピラミッドの文様を描く(下向き,_上部基壇の幅,L1,[A|L2],L4) :- length(L0,_上部基壇の幅), append(L0,L2,L), 行にピラミッドの文様を描く(L,L1,L4). 行にピラミッドの文様を描く(L1,L2,L4) :- all(L1,'*'), all(L2,' '), append(L3,L3,L2), append(L3,L1,L3,L4). ピラミッドの矩形を表示する([]). ピラミッドの矩形を表示する([L|R]) :- atomic_list_concat(L,A), writef('%t\n',[A]), ピラミッドの矩形を表示する(R). all([],_). all([A|R],A) :- all(R,A). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは ピラミッドの矩形(右向き,_頂点の高さ,_ピラミッドの矩形) :- 下向きピラミッドの矩形を転置する(_頂点の高さ,_ピラミッドの矩形),!. ピラミッドの矩形(左向き,_頂点の高さ,_ピラミッドの矩形) :- 上向きピラミッドの矩形を転置する(_頂点の高さ,_ピラミッドの矩形),!. ピラミッドの矩形(_向き,_頂点の高さ,_ピラミッドの矩形) :- '上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_ピラミッドの矩形). 下向きピラミッドの矩形を転置する(_頂点の高さ,_ピラミッドの矩形) :- ピラミッドの矩形(下向き,_頂点の高さ,_ピラミッドの矩形_1), 転置(_ピラミッドの矩形_1,_ピラミッドの矩形). 上向きピラミッドの矩形を転置する(_頂点の高さ,_ピラミッドの矩形) :- ピラミッドの矩形(上向き,_頂点の高さ,_ピラミッドの矩形_1), 転置(_ピラミッドの矩形_1,_ピラミッドの矩形). '上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_ピラミッドの矩形) :- _底辺の幅 is _頂点の高さ * 2 - 1, length(L,_底辺の幅), findall(L4,( append(L1,L2,L), 行にピラミッドの文様を描く(_向き,L1,L2,L4)), _ピラミッドの矩形). 行にピラミッドの文様を描く(上向き,[A|L1],L2,L4) :- all([A|L1],'*'), all(L2,' '), append(L3,L3,L2). append(L3,[A|L1],L3,L4). 行にピラミッドの文様を描く(下向き,L1,[A|L2],L4) :- all([A|L2],'*'), all(L1,' '), append(L3,L3,L1), append(L3,[A|L2],L3,L4). ピラミッドの矩形を表示する([]). ピラミッドの矩形を表示する([L|R]) :- atomic_list_concat(L,A), writef('%t\n',[A]), ピラミッドの矩形を表示する(R). all([],_). all([A|R],A) :- all(R,A). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは 横向きに星のピラミッドを描く(_ピラミッドの頂点の高さ) :- length(L,_ピラミッドの頂点の高さ), 横向きに星のピラミッドを描く([*],L). 横向きに星のピラミッドを描く(L,L) :- 星で行表示する(L),!. 横向きに星のピラミッドを描く(L_1,L) :- 星で行表示する(L_1), 横向きに星のピラミッドを描く([*|L_1],L), 星で行表示する(L_1). 星で行表示する(L) :- atomic_list_concat(L,A), writef('%t\n',[A]). % 以下のサイトは # 出題: http://toro.2ch.net/test/read.cgi/tech/1390525149/231 # 出題補足: http://toro.2ch.net/test/read.cgi/tech/1390525149/238 # [1] 授業単元名:FizzBuzzクイズ # [2] 問題文(含コード&リンク): # [3] 環境 #  [3.1] OS: (Windows/Linux/等々)特に問わない #  [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)特に問わない #  [3.3] 言語: (C/C++/どちらでも可 のいずれか)C++/Java # # (p)http://kohada.2ch.net/test/read.cgi/prog/1209467166/401 # FizzBuzzクイズ # # 1.fizz.buzz #=> 1 # 3.fizz.buzz #=> "Fizz" # 5.fizz.buzz #=> "Buzz" # 15.fizz.buzz #=> "FizzBuzz" # 999.fizz.buzz #=> 999 # # となるようなメソッドfizz、buzzは定義可能か? # 可能である場合、同様にgizzを追加定義し、 # 7.fizz.buzz.gizz #=> "Gizz" # 21.fizz.buzz.gizz #=> "FizzGizz" # 35.fizz.buzz.gizz #=> "BuzzGizz" # 105.fizz.buzz.gizz #=> "FizzBuzzGizz" # 105.fizz.gizz.buzz #=> "FizzGizzBuzz" と拡張・応用ができるか? # # メソッドのコールに()が必須の言語では 3.fizz().buzz() 形式でも構わない。 # オープンクラス機構やメソッドのない言語では関数(buzz(fizz(3)) #=> "Fizz" など)で。 fizzbuzzgizz(N) :- fizzbuzzgizz([],N,['','','Fizz'],['','','','','Buzz'],['','','','','','','Gizz']). fizzbuzzgizz(L,N,_,_,_) :- length(L,N),!. fizzbuzzgizz(Ln,N,[_31,_32,_33],[_51,_52,_53,_54,_55],[_71,_72,_73,_74,_75,_76,_77]) :- fizzbuzzgizz_1(_31,_51,_71,Ln,A), writef('%t%t%t%t ',[_31,_51,_71,A]), fizzbuzzgizz([_|Ln],N,[_32,_33,_31],[_52,_53,_54,_55,_51],[_72,_73,_74,_75,_76,_77,_71]). fizzbuzzgizz_1('','','',Ln,M) :- length([_|Ln],M),!. fizzbuzzgizz_1(_,_,_,_,''). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1392388003/4 # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # struct node {int elem;struct node *next;}; # struct node *list; # 問1、中央のセルのポインタを返す関数list midcell(list L)を定義してください。 # 条件は単方向リストで。また中央のセルとは末尾のセルを除いて考えセルの個数が # 2N個の場合N番目のセルのことをいいます。 # 問2、連結リストLとその途中のセルのポインタMが与えられたとき # 先頭LからMの直前のセルまでを切り離し順序を逆転させリストを返す関数 # list revfR(list L,list M)を再帰関数で定義してください。 # リストLは空でないと仮定します。また本問も単方向リストでお願いします。 # 問3、問2の機能を持つ関数list revf(list L,list M)を再帰関数を用いず定義してください # よろしくお願いします。 # '問1、中央のセルのポインタを返す関数list midcell(list L)を定義してください。'(L,_中央位置) :- append(L1,L2,L), length(L1,_中央位置), length(L2,_中央位置). % 以下のサイトは # 出典: プログラミングのお題スレ 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/db/1371476534/541 # 質問です教えてください # # データベース = access # テーブル名 = T_DATA # # SQLで取得したい結果は、KEYごとに日数を取得したいのですが # 重複する日数はカウントから除外したいです。 # どんなSQLを書けばいいですか? # # ・キーは、日数=5日 # ・キーは、日数=1日 # # ---------------------------------- # キー, 開始日, 終了日 # ---------------------------------- # 1, 2014/01/01, 2014/01/01 |→ 日数=1日 # 1, 2014/01/02, 2014/01/02 |→ 日数=1日 # 1, 2014/01/02, 2014/01/02 |→ 日数=0日(重複) # 1, 2014/01/03, 2014/01/03 |→ 日数=1日 # 1, 2014/01/04, 2014/01/05 |→ 日数=2日、合計=5日 # --- # 2, 2014/01/01, 2014/01/01 |→ 日数=1日 # 2, 2014/01/01, 2014/01/01 |→ 日数=0日(重複)、合計=1日 # # ↓これだと重複がカウントされてしまいます。 # SELECT # キー # ,SUM(DATEDIFF('d', 開始日, 終了日)+1) AS 日数 # FROM # T_DATA # GROUP BY # キー # 'データベース = access テーブル名 = T_DATA SQLで取得したい結果は、KEYごとに日数を取得したいのですが 重複する日数はカウントから除外したいです。'(_キーごとの日数) :- setof(_キー,[_キー,_開始日,_終了日] ^ 'T_DATA'(_キー,_開始日,_終了日),_キーならび), findall([_キー,_日数],( member(_キー,_キーならび), キーの日数を得る(_キー,_日数)), _キーごとの日数). キーの日数を得る(_キー,_日数) :- findall(_日,( 'T_DATA'(_キー,_開始日,_終了日), 整数構造に変換(_開始日,_終了日,_開始日整数構造,_終了日整数構造), 範囲の日を引出す(_開始日整数構造,_終了日整数構造,_日)), L1), 重複日を取り除いた日数(L1,_日数). 整数構造に変換(_開始日,_終了日,_開始日整数構造,_終了日整数構造) :- read_term_from_atom(_開始日,_開始日整数構造), read_term_from_atom(_終了日,_終了日整数構造). 範囲の日を引出す(_終了日,_終了日,_終了日) :- !. 範囲の日を引出す(_日,_終了日,_日). 範囲の日を引出す(_日_1,_終了日,_日) :- 翌日(_日_1,_翌日), 範囲の日を引出す(_翌日,_終了日,_日). 翌日(_年/12/_31,_翌年/1/1) :- _翌年 is _年 + 1,!. 翌日(_年/_月/_日,_年/_翌月/1) :- 月末日(_年/_月/_日), _翌月 is _月 + 1,!. 翌日(_年/_月/_日,_年/_月/_翌日の日) :- _翌日の日 is _日 + 1,!. 月末日(_年/2/29) :- うるう年(_年),!. 月末日(_年/2/28) :- \+(うるう年(_年)),!. 月末日(_年/_月/30) :- member(_月,[4,6,9,11]),!. 月末日(_年/_月/31) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 重複日を取り除いた日数(L1,_日数) :- sort(L1,L2), length(L2,_日数). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/43 # お題 与えられた集合の要素を数珠順列に並べたもの全てを列挙せよ。 # # 例 # # {'a','b','c','d'} の数珠順列の全て # necklace=λ kfsAg:sum([[(kfsAg.sl[0],y)+x+(z,) for x in permutate(kfsAg-kfs([kfsAg.sl[0],y,z]))] for y,z in combinate(kfsAg.sl[1:],2)],[]); necklace(kfs("abcd")) # =============================== # [('a', 'b', 'd', 'c'), ('a', 'b', 'c', 'd'), ('a', 'c', 'b', 'd')] # # # # [1, 2, 3, 4, 5] の数珠順列の全て # necklace=λ kfsAg:sum([[(kfsAg.sl[0],y)+x+(z,) for x in permutate(kfsAg-kfs([kfsAg.sl[0],y,z]))] for y,z in combinate(kfsAg.sl[1:],2)],[]); necklace(kfs([1,2,3,4,5])) # =============================== # [(1, 2, 4, 5, 3), (1, 2, 5, 4, 3), (1, 2, 3, 5, 4), (1, 2, 5, 3, 4), (1, 2, 3, 4, 5), (1, 2, 4, 3, 5), # (1, 3, 2, 5, 4), (1, 3, 5, 2, 4), (1, 3, 2, 4, 5), (1, 3, 4, 2, 5), (1, 4, 2, 3, 5), (1, 4, 3, 2, 5)] # # 参考 URL;;http://ime.nu/www.geocities.jp/m_hiroi/light/pyalgo62.html # # '与えられた集合の要素を数珠順列に並べたもの全てを列挙せよ。'(_集合,_数珠順列) :- _集合 = [_首に掛ける要素|_残り集合], length(_残り集合,_残り集合の要素数), findall([_首に掛ける要素|L],( 順列(_残り集合,_残り集合の要素数,L)), _数珠順列). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/23 # お題: # リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する # ソートされていなければ先頭からソートされている個数を出力する # [6,6,3,2,6,4,7,4,7,4] => 4 # [2,3,4,4,4,6,6,6,7,7] => AS # [7,7,6,6,6,4,4,4,3,2] => DES # [1,1,1,1,1,1,1,1,1,1] => EQ # [] => EQ # [1] => EQ # # 'リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する。ソートされていなければ先頭からソートされている個数を出力する'(_リスト,全て同じ要素) :- 全て同じ要素である(_リスト),!. 'リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する。ソートされていなければ先頭からソートされている個数を出力する'(_リスト,昇順) :- 昇順にソートされている(_リスト),!. 'リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する。ソートされていなければ先頭からソートされている個数を出力する'(_リスト,降順) :- 降順にソートされている(_リスト),!. 'リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する。ソートされていなければ先頭からソートされている個数を出力する'(_リスト,_個数) :- ソートされていなければ先頭からソートされている個数を出力する(_リスト,_個数). 全て同じ要素である([],_). 全て同じ要素である([A|R],A) :- 全て同じ要素である(R,A). 昇順にソートされている(_リスト) :- forall(append(_,[A,B|_],_リスト),A @=< B). 降順にソートされている(_リスト) :- forall(append(_,[A,B|_],_リスト),A @>= B). ソートされていなければ先頭からソートされている個数を出力する(L,_先頭からソートされている個数) :- findall(Len,( append(L1,L2,L), length(L1,Len), (昇順にソートされている(L1);降順にソートされている(L1)), _長さならび), 最大値(_長さならび,_先頭からソートされている個数). 最大値([A|R],_最大値) :- 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値([A|R],_最大値_1,_最大値) :- A @> _最大値_1, 最大値(R,A,_最大値),!. 最大値([A|R],_最大値_1,_最大値) :- 最大値(R,_最大値_1,_最大値). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/901 # [2] 要素の数が10の配列に2から始まる倍数を逆順に表示せよ # '要素の数が10のならびに2から始まる倍数を逆順に格納した後、表示せよ'(_要素の数が10のならび) :- 要素の数が10のならびに(_要素の数が10のならび), '2から始まる倍数を逆順に格納した後、'(_要素の数が10のならび), 表示せよ(_要素の数が10のならび). 要素の数が10のならびに(_要素の数が10のならび) :- length(_要素の数が10のならび,10). '2から始まる倍数を逆順に格納した後、'(_要素の数が10のならび) :- 逆順に(_要素の数が10のならび,_要素の数が10の逆順ならび), '2から始まる倍数を格納した後、'(1,_要素の数が10の逆順ならび). 逆順に(_要素の数が10のならび,_要素の数が10の逆順ならび) :- reverse(_要素の数が10のならび,_要素の数が10の逆順ならび). '2から始まる倍数を格納した後、'(_,[]) :- !. '2から始まる倍数を格納した後、'(N,[N_1|R]) :- N_1 is N * 2, '2から始まる倍数を格納した後、'(N_1,R). 表示せよ(L) :- forall(member(N,L),writef('%t ',[N])), write('\n'). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/901 # [2] 要素の数が10の配列に2から始まる倍数を逆順に表示せよ # '要素の数が10のならびに2から始まる倍数を逆順に格納した後、表示せよ'(_要素の数が10のならび) :- 要素の数が10のならびに(_要素の数が10のならび), '2から始まる倍数を逆順に格納した後、'(10,1,_要素の数が10のならび), 表示せよ(_要素の数が10のならび). 要素の数が10のならびに(_要素の数が10のならび) :- length(_要素の数が10のならび,10). '2から始まる倍数を逆順に格納した後、'(0,_,_要素の数が10のならび) :- !. '2から始まる倍数を逆順に格納した後、'(_位置,N,_要素の数が10のならび) :- nth1(_位置,_要素の数が10のならび,N_1), N_1 is N * 2, _位置_1 is _位置 - 1, '2から始まる倍数を逆順に格納した後、'(_位置_1,N_1,_要素の数が10のならび). 表示せよ(_要素の数が10のならび) :- forall(member(N,_要素の数が10のならび),writef('%t ',[N])), write('\n'). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/901 # [2] 要素の数が10の配列に2から始まる倍数を逆順に表示せよ # '要素の数が10のならびに2から始まる倍数を逆順に格納した後、表示せよ'(_要素の数が10のならび) :- 要素の数が10のならびに(_要素の数が10のならび), '2から始まる倍数を逆順に格納した後、'(2,[],_要素の数が10のならび), 表示せよ(_要素の数が10のならび). 要素の数が10のならびに(_要素の数が10のならび) :- length(_要素の数が10のならび,10). '2から始まる倍数を逆順に格納した後、'(_,L,L) :- !. '2から始まる倍数を逆順に格納した後、'(_2から始まる倍数,L_1,L) :- _2から始まる倍数_1 is _2から始まる倍数 * 2, '2から始まる倍数を逆順に格納した後、'(_2から始まる倍数_1,[_2から始まる倍数|L_1],L). 表示せよ(_要素の数が10のならび) :- forall(member(_要素,_要素の数が10のならび),writef('%t ',[_要素])), write('\n'). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/885 # 夜分遅くに申し訳ございません… # 本日9時提出の課題を今になって気づいたのですが、私の頭ではさっぱりわからないのでお助け下さい… # # [1]プログラミングC # [2] 問題文(含コード&リンク): # 問1:以下の実行結果に示すような、3つの実数を入力した後、最大値と最小値の差を求めるプログラムを作成せよ。 # ※例 # 3つの整数を入力してください。 # na=12 # nb=65 # nc=44 # 65と12の差は53です。 # # 問2:以下の文字列(programming_jissyu)が配列に格納されているとする。 # この文字列を任意の位置で2つ分割して表示するプログラムを作成せよ。 # ※例 # 難文字目で分割しますか:11 # 文字列の前半 # programming # 文字列の後半 # _jissyu # '問2:以下の文字列(programming_jissyu)が配列に格納されているとする。 この文字列を任意の位置で2つに分割して表示するプログラムを作成せよ。 ※例 何文字目で分割しますか:11 文字列の前半 programming 文字列の後半 _jissyu' :- _文字列 = programming_jissyu, 文字列を任意の位置で2つに分割して表示する(_文字列). 文字列を任意の位置で2つに分割して表示する(_文字列) :- 任意の位置で(_任意の位置), sub_atom(_文字列,0,_任意の位置,_,_文字列の前半), sub_atom(_文字列,_任意の位置,_,0,_文字列の後半), writef('文字列の前半\n%t\n文字列の後半\n%t\n',[_文字列の前半,_文字列の後半]). 任意の位置で(_文字列,_任意の位置) :- atom_length(_文字列,_文字列の長さ), 整数を得る(何文字目で分割しますか,_任意の位置 < _文字列の長さ,_任意の位置). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/868 # [2] 入力した5文字までの文字列を5個まで格納して表示する。 # 5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、入力したすべての文字列を表示。 # '入力した5文字までの文字列を5個まで格納して表示する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、入力したすべての文字列を表示。' :- '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(_文字列を5個まで格納), '入力したすべての文字列を表示。'(_文字列を5個まで格納). '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(_文字列を5個まで格納) :- length(Ln,5), '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(Ln,_文字列を5個まで格納). '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'([_|Ln],[_5文字までの文字列|R]) :- 入力した5文字までの文字列を(_5文字までの文字列), \+(_文字列=''), '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(Ln,R). '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(_,_,[]). 入力した5文字までの文字列を(_5文字までの文字列) :- findall(_文字,( nth1(Nth1,_,_), ( Nth1 > 5,!,fail; get_char(_文字), ( _文字 = '\n',!,fail; true))), _入力文字ならび), atomic_list_concat(_入力文字ならび,_5文字までの文字列). '入力したすべての文字列を表示。'(_文字列を5個まで格納) :- forall(member(_文字列,_文字列を5個まで格納),writef('%t\n',[_文字列])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/929 # お題:3次元の配列を連番で初期化する。 # Jの場合 # a=:i.2 3 4 # a # 0 1 2 3 # 4 5 6 7 # 8 9 10 11 # # 12 13 14 15 # 16 17 18 19 # 20 21 22 23 # # (<1;2;3){a # 23 # # '3次元のならびを連番で初期化する。'(_3次元のならび,_初期化された3次元のならび) :- ならびの構造(_3次元のならび,_1,_2,_3), findall(_初期化された2次元ならび,( nth0(N1,_3次元のならび,_), findall(_初期化された1次元ならび,( nth0(N2,_2次元ならび,_), findall(N,( U is _1 * _2, U_2 is U + _3 - 1, between(U,U_2,N)), _初期化された1次元ならび)), _初期化された2次元ならび)), _初期化された3次元ならび). ならびの構造(LLL,_1,_2,_3) :- length(_3次元のならび,_1), _3次元のならび = [_2次元のならび|_], length(_2次元のならび,_2), _2次元のならび = [_1次元のならび|_], length(_1次元のならび,_3). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/896 # お題:単語データファイル「words.txt」から英単語リストを読み取り、アルファベットでしりとりを行い、 # 一番長いしりとりの単語列を出力せよ。同じ単語は二度使わない。 # # '一番長いしりとりの単語列を出力せよ。同じ単語は二度使わない。'(_単語列,_一番長いしりとりの単語列) :- '同じ単語は二度使わない。'(_単語列,_整列した重複のない単語列), forall(一番長いしりとり単語列を(_整列した重複のない単語列,_一番長いしりとりの単語列),'出力せよ。'(_一番長いしりとりの単語列)). 一番長いしりとり単語列を(_整列した重複のない単語列,_一番長いしりとりの単語列) :- しりとり単語列を(_整列した重複のない単語列,_長さを鍵に持つしりとり単語列), 一番長い(_長さを鍵に持つしりとり単語列,_一番長いしりとりの単語列). しりとり単語列を(_整列した重複のない単語列,_長さを鍵に持つしりとり単語列) :- findall([_長さ,_しりとりの単語列],しりとりの単語列(_整列した重複のない単語列,_しりとりの単語列,_長さ),_長さを鍵に持つしりとり単語列). '同じ単語は二度使わない。'(_単語列,_整列した重複のない単語列) :- sort(_単語列,_整列した重複のない単語列). しりとりの単語列(_単語列,_しりとりの単語列,_長さ) :- select(_単語,_単語列,_残り単語列), しりとり(_単語,_残り単語列,[_単語],_しりとりの単語列), length(_しりとりの単語列,_長さ). しりとり(_単語,_単語列,L1,_しりとりの単語列) :- 単語列の中から単語の末尾文字と同じ先頭文字を持つ単語を捜す(_単語,_単語列,_次の単語候補,_残り単語列), しりとり(_次の単語候補,_残り単語列,[_次の単語候補|L1],_しりとりの単語列). しりとり(_,_,_しりとりの単語列,_しりとりの単語列). 単語列の中から単語の末尾文字と同じ先頭文字を持つ単語を捜す(_単語,_単語列,_単語_2,_残り単語列) :- sub_atom(_単語,_,1,0,_文字), select(_単語_2,_単語列,_残り単語列), sub_atom(_単語_2,0,1,_,_文字). 一番長い(LL,_一番長いしりとりの単語列) :- 最大値を捜す(_長さ,member([_長さ,_],LL),_一番長い), member([_一番長い,_一番長いしりとりの単語列],LL). 最大値を捜す(A,B,C) :- findall(A,B,L), 最大値(L,C). 最大値(L,C) :- select(C,L,R), forall(member(A,R),A @=< C),!. '出力せよ。'(_一番長い逆順のしりとりの単語列) :- reverse(_一番長い逆順のしりとりの単語列,_一番長いしりとりの単語列), atomic_list_concat(_一番長いしりとりの単語列,' ',_一番長いしりとりの単語列表現), writef('%t\n',[_一番長いしりとりの単語列表現]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/696 # [1] 授業単元: Cプログラミング # [2] 問題文(含コード&amp;リンク): データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が # 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の # 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 # 探索は二分探索法を使いソートにはクイックソートを使うこと。 # # 表示は以下のようにすること。 # Input A Student Number: 14【Enter】 # Ranking : #269 /*最高得点は1位とせよ.*/ # Subject A : 86 # Subject B : 59.1 # Subject C : 220.42 # Total : 365.52 # # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/697 # 【備考】 # 科目 A の得点は int 型,科目 B,C の得点は double 型で扱うこと. # 合計点が同じになる学生はいないということは既知とせよ. # データの人数は 1000 人であることもわかっているとせよ. # 学籍番号には抜けがある.学籍番号が存在しない場合は,”No data”と表示するようにせよ. # 雛型 (121.c) を用いよ.main 関数は完成しているので,main 関数内で呼び出している関数を作成せよ. # 'データファイル(rep_data.txt)には「学籍番号、科目A、科目B、科目Cの各点数」が 順に学籍番号順に並んでいる。そのデータファイルをもとにキーボードから入力された学籍番号の 学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ。 探索は二分探索法を使いソートにはクイックソートを使うこと。' :- 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび), 合計得点の順位表を作る(_学生成績ならび,_合計得点の順位表), キーボードから入力された学籍番号の(_学籍番号), 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績), '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績). 'データファイルから学籍番号、科目A、科目B、科目Cの各点数の学生成績ならびを作る'(_学生成績ならび) :- get_lines('rep_data.txt',Lines), findall(L,( member(_行,Lines), split(_行,[','],L)), _学生成績ならび). 合計得点の順位表を作る(_学生成績ならび,_合計得点の重複要素を許す降順ならび) :- findall(_合計,( member([_,A,B,C],_学生成績ならび), _合計 is A + B + C), _合計得点ならび), 重複要素を許す降順整列(_合計得点ならび,_合計得点の重複要素を許す降順ならび). キーボードから入力された学籍番号の(_学籍番号) :- 整数を得る(学籍番号,_学籍番号 >= 0,_学籍番号). キーボードから入力された学籍番号の(_学籍番号) :- キーボードから入力された学籍番号の(_学籍番号). 二分探索法を使い学生の成績を得る(Lines,_学籍番号,_学生の成績) :- length(Lines,_最大要素位置), 二分探索法を使い学生の成績を得る(1,_最大要素位置,_最大要素位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_要素位置,_要素位置,Lines,_学籍番号,_学生の成績) :- !, nth1(_要素位置,Lines,[_学籍番号|_学生の成績]). 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- succ(_要素位置_1,1,_要素位置_2),!, 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績), 二分探索法を使い学生の成績を得る(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- _検索位置 is (_要素位置_1 + _要素位置_2) // 2, nth1(_検索位置,Lines,[_学籍番号_1|_学生の成績_1]), 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_学生の成績_1,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績,_学籍番号,_学生の成績) :- !. 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @< _学籍番号, 二分探索法を使い学生の成績を得る(_要素位置_1,_検索位置,Lines,_学籍番号,_学生の成績). 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_1,_要素位置_2,Lines,_学籍番号_1,_,_学籍番号,_学生の成績) :- _学籍番号_1 @> _学籍番号, 二分探索法を使い学生の成績を得る(_検索位置,_要素位置_2,Lines,_学籍番号,_学生の成績). 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_1,Lines,[_学籍番号|_学生の成績]),!. 求める要素は_要素位置_1か_要素位置_2のどちらかにある(_要素位置_1,_要素位置_2,Lines,_学籍番号,_学生の成績) :- nth1(_要素位置_2,Lines,[_学籍番号|_学生の成績]). 重複要素を許す降順整列([],[]). 重複要素を許す降順整列([_軸要素|_残りならび],_合計得点の重複要素を許す降順ならび) :- 重複要素を許す降順分割(_軸要素,_残りならび,_軸要素と等しいか大きいならび,_軸要素より小さいならび), 重複要素を許す降順整列(_軸要素と等しいか大きいならび,_合計得点の重複要素を許す降順ならび_1), 重複要素を許す降順整列(_軸要素より小さいならび,_合計得点の重複要素を許す降順ならび_2), append(_合計得点の重複要素を許す降順ならび_1,[_軸要素|_合計得点の重複要素を許す降順ならび_2],_合計得点の重複要素を許す降順ならび). 重複要素を許す降順分割(_,[],[],[]) :- !. 重複要素を許す降順分割(_軸要素,[A|R],[A|R2],R3) :- A @>= _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). 重複要素を許す降順分割(_軸要素,[A|R],R2,[A|R3]) :- A @< _軸要素, 重複要素を許す降順分割(_軸要素,R1,R2,R3). '学生の成績(含:3科目の合計点の順位)を表示する'(_学籍番号,_合計得点の重複を許す降順ならび,_学生の成績) :- _学生の成績 = [_科目Aの得点,_科目Bの得点,_科目Cの得点], _学生の合計得点 = _科目Aの得点+_科目Bの得点+_科目Cの得点, nth1(_順位,_合計得点の重複を許す降順ならび,_学生の合計得点), writef('学籍番号 :: %t\n順位 :: #%t\n,科目%t :: %t\n科目%t :: %t\n科目%t :: %t\n',[_学籍番号,_順位,'A',_科目Aの得点,'B',_科目Bの得点,'C',_科目Cの得点]). get_lines(Lines) :- get_lines(user_input,Lines). get_lines(Stream,Lines) :- findall(Line,( get_line(Stream,Line), ( Line=end_of_file,!,fail; true)), Lines). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_line(user_input,X). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/775 # お題:文字を円形に並べる。一番上が最初の文字。時計回りに等間隔で並べる。 # 半径は文字間隔が離れすぎず近すぎない程度になるよう適当に選ぶ。 # # '文字を円形に並べる。一番上が最初の文字。時計回りに等間隔で並べる。'(_文字列) :- atom_chars(_文字列,_文字ならび), 文字盤を用意する(_文字ならび,_文字盤), 文字盤に円形に文字を書き込む(_文字ならび,_文字盤), 文字を表示する(_文字盤). 文字盤を用意する(_文字ならび,_文字盤) :- length(_文字ならび,_文字数), '_文字数+1の文字盤を作る'(_文字数,_文字盤). '_文字数+1の文字盤を作る'(_文字数,_文字盤) :- _文字数_1 is _文字数 + 1, length(_文字盤,_文字数_1), findall(L,( length(L,_文字数_1)), _文字盤). 円形に文字を書き込む(_文字ならび,_文字盤) :- length(_文字ならび,_文字ならびの要素数), _半径 is _文字ならびの要素数 // 2, 点に文字を書き込む(0,_文字ならび,_文字ならびの要素数,_半径,_文字盤). 点に文字を書き込む(_,[],_,_,_文字盤) :- !. 点に文字を書き込む(_n,[_文字|R],_分割数,_半径,_文字盤) :- '_x,_yの座標点を得る'(_n,_半径,_分割数,_x,_y), '文字盤の_x,_yに_文字を埋める'(_x,_y,_文字,_文字盤), _n_2 is _n + 1, 点に文字を書き込む(_n_2,R,_分割数,_半径,_文字盤). '_x,_yの座標点を得る'(_n,_半径,_分割数,_x,_y) :- _x is truncate(sin((2 * pi) / _分割数 * _n + (pi / 2)) * _半径 + _半径 + 0.5), _y is truncate(cos((2 * pi) / _分割数 * _n + (pi / 2)) * _半径 + _半径 + 0.5). '文字盤の_x,_yに_文字を埋める'(_x,_y,_文字,_文字盤) :- nth1(_y,_文字盤,L), nth1(_x,L,_文字),!. 文字を表示する([]) :- !. 文字を表示する([L|R]) :- forall(member(A,L),変数は空白に埋めて文字を出力する(A)), write('\n'), 文字を表示する(R). 変数は空白に埋めて文字を出力する(A) :- var(A), write(' '),!. 変数は空白に埋めて文字を出力する(A) :- write(A). % 以下のサイトは # 出題場所 http://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/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/642 # お題:"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。 # "11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を # 返す。"1"から始めてこの操作を10回繰り返し、途中経過を表示する。 # 例 # 1 # 11 # 21 # 1211 # 111221 # 312211 # 13112221 # 1113213211 # 31131211131221 # 13211311123113112211 # 11131221133112132113212221 # # '"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。"11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を返す。"1"から始めてこの操作(以下、"この操作"とする)を10回繰り返し、途中経過を表示する。' :- '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'. '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。' :- この操作([],'1',Ln,_文字列), writef('%w\n',[_文字列]), length(Ln,10),!. この操作(Ln,_文字列,Ln,_文字列). この操作(Ln_1,_文字列_1,Ln,_文字列) :- 連続数連続記号が列んだ行を生成する(Ln_1,_文字列_1,Ln,_文字列). 連続数連続記号が列んだ行を生成する(Ln_1,_文字列_1,Ln,_文字列) :- 連続記号を切り取って連続数と連続記号が交互に来るならびを生成する(_文字列_1,_文字構成ならび), atomic_list_concat(_文字構成ならび,_文字列_2), この操作([_|Ln_1],_文字列_2,Ln,_文字列). 連続記号を切り取って連続数と連続記号が交互に来るならびを生成する(_文字列,_文字構成ならび) :- findall([_連続数,_連続記号],( 連続記号を切り取る(_文字列,_連続数,_連続記号)),LL), flatten(LL,_文字構成ならび). 連続記号を切り取る(_文字列,_連続数,_連続記号) :- '前文字列・後文字列'(_文字列,_前文字列の文字数,_,_前文字列,_後文字列), 前文字列は全部同じ記号で構成され後文字列の先頭記号はこれとは異なる(_前文字列,_後文字列,_同じ記号), 連続記号を切り取る(_後文字列,_前文字列の文字数,_同じ記号,_連続数,_連続記号). 連続記号を切り取る(_後文字列,_連続数,_連続記号,_連続数,_連続記号). 連続記号を切り取る(_後文字列,_,_,_連続数,_連続記号) :- 連続記号を切り取る(_後文字列,_連続数,_連続記号). '前文字列・後文字列'(_文字列,_前文字列の長さ,_後文字列の長さ,_前文字列,_後文字列) :- sub_atom(_文字列,0,_前文字列の長さ,_後文字列の長さ,_前文字列), sub_atom(_文字列,_,_後文字列の長さ,0,_後文字列). 前文字列は全部同じ記号で構成され後文字列の先頭記号はこれとは異なる(_前文字列,_後文字列,_同じ記号) :- 前文字列は全部同じ記号で構成され(_前文字列,_同じ記号), 後文字列の先頭記号はこれとは異なる(_後文字列,_同じ記号). 前文字列は全部同じ記号で構成され(_前文字列,_同じ記号) :- sub_atom(_前文字列,0,1,_,_同じ記号), forall(sub_atom(_前文字列,_,1,_,_記号),_記号=_同じ記号). 後文字列の先頭記号はこれとは異なる(_後文字列,_同じ記号) :- \+(sub_atom(_後文字列,0,1,_,_同じ記号)). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/642 # お題:"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。 # "11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を # 返す。"1"から始めてこの操作を10回繰り返し、途中経過を表示する。 # 例 # 1 # 11 # 21 # 1211 # 111221 # 312211 # 13112221 # 1113213211 # 31131211131221 # 13211311123113112211 # 11131221133112132113212221 # # '"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。"11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を返す。"1"から始めてこの操作(以下、"この操作"とする)を10回繰り返し、途中経過を表示する。' :- length(Ln,10), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],'1'). '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([],_文字列) :- !. '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],_文字列) :- writef('%t\n',[_文字列]), この操作を(_文字列,_次の文字列), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,_次の文字列). この操作を(_文字列,_次の文字列) :- findall(_個数と連続した記号の結合文字列,( '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数), atomic_list_concat([_個数,_連続した記号],_個数と連続した記号の結合文字列)), _個数と連続した記号の結合文字列ならび), 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列). '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数) :- atom_chars(_文字列,_文字ならび), 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数). 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数) :- append([L1,L2,L3],_文字ならび), 'L2は_記号が_個数連続している'(L2,_連続した記号,_個数), '両隣は_連続した記号と異なる'(_連続した記号,L1,L3). '両隣は_連続した記号と異なる'(_連続した記号,L1,L3) :- \+((last(L1,A0),A0=_連続した記号)), \+((nth1(1,L3,A3),A3=_連続した記号)). 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列) :- atomic_list_concat(_個数と連続した記号の結合文字列ならび,_次の文字列). 'L2は_記号が_個数連続している'(L2,_記号,_個数) :- L2 = [_記号|R], all(R,_記号), length([_記号|R],_個数). all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/642 # お題:"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。 # "11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を # 返す。"1"から始めてこの操作を10回繰り返し、途中経過を表示する。 # 例 # 1 # 11 # 21 # 1211 # 111221 # 312211 # 13112221 # 1113213211 # 31131211131221 # 13211311123113112211 # 11131221133112132113212221 # # '"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。"11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を返す。"1"から始めてこの操作(以下、"この操作"とする)を10回繰り返し、途中経過を表示する。' :- length(Ln,10), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,'1'). '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([],_文字列) :- !. '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],_文字列) :- writef('%t\n',[_文字列]), この操作を(_文字列,_次の文字列), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,_次の文字列). この操作を(_文字列,_次の文字列) :- findall(_個数と連続した記号の結合文字列,( '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数), atomic_list_concat([_個数,_連続した記号],_個数と連続した記号の結合文字列)), _個数と連続した記号の結合文字列ならび), 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列). '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数) :- atom_chars(_文字列,_文字ならび), 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数). 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数) :- append(L1,L2,L3,_文字ならび), 'L2は_記号が_個数連続している'(L2,_連続した記号,_個数), '両隣は_連続した記号と異なる'(_連続した記号,L1,L3). '両隣は_連続した記号と異なる'(_連続した記号,L1,L3) :- \+((last(L1,A0),A0=_連続した記号)), \+((nth1(1,L3,A3),A3=_連続した記号)). 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列) :- atomic_list_concat(_個数と連続した記号の結合文字列ならび,_次の文字列). 'L2は_記号が_個数連続している'(L2,_記号,_個数) :- L2 = [_記号|R], all(R,_記号), length([_記号|R],_個数). all([],_). all([V|R],V) :- all(R,V). append([],L2,L3,L) :- append(L2,L3,L). append([U|R1],L2,L3,[U|R4]) :- append(R1,L2,L3,R4). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/561 # n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。 # がわかりませぬ。どなたか教えてください。 # # 'n個の実数x(i)をキーボードから読み込み、それらの平均と標準偏差を出力するプログラムを作りなさい。ただし、n個の実数の平均を求める関数mean(size,x[ ])と標準偏差を求める関数stdev(size,x[ ])を定義し、これを用いること。' :- 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数), 'それらの平均と標準偏差を出力する'(_n個,_n個の実数). 'n個の実数x(i)をキーボードから読み込み、'(_n個,_n個の実数) :- length(_n個の実数,_n個), findall(_個々の実数,( 個々の実数(_n個の実数,_個々の実数), 実数を得る(_個々の実数)), _n個の実数). 'それらの平均と標準偏差を出力する'(_n個,_n個の実数) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差), writef('平均  = %t\n標準偏差 = %t\n',[_n個の実数の平均,_n個の実数の標準偏差). 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均) :- sum_list(_n個の実数,_n個の実数の合計), _n個の実数の平均 is _n個の実数の合計 / _n個. 'n個の実数の標準偏差を求める関数stdev(size,x[ ])'(_n個,_n個の実数,_n個の実数の標準偏差) :- 'n個の実数の平均を求める関数mean(size,x[ ])'(_n個,_n個の実数,_n個の実数の平均), findsum(_個々の実数と平均の差の二乗,( 個々の実数(_n個の実数,_個々の実数), _個々の実数と平均の差の二乗 is (_個々の実数 - _n個の実数の平均) ^ 2), _個々の実数と平均の差の二乗の合計), _n個の実数の標本の分散 is _個々の実数と平均の差の二乗の合計 / _n個, _n個の実数の標準偏差 is sqrt(_n個の実数の標本の分散). 個々の実数(_n個の実数,_個々の実数) :- nth1(_,_n個の実数,_個々の実数). 実数を得る(_個々の実数) :- get_line(Line), read_term_from_atom(Line,_実数,[]), 実数診断(Line,_実数),!. 実数を得る(_個々の実数) :- 実数を得る(_個々の実数). 実数診断(Line,_実数) :- float(_実数),!. 実数診断(Line,_実数) :- writef('入力された %t から実数が得られません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出題場所 :: 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). % 以下のサイトは # # length/2をsucc/2を使って定義してみる。 # length(L,0) :- \+(var(L)), L = [],!. length(L,Len) :- \+(var(L)), \+(var(Len)), L = [_|R], length(R,Len_1), succ(Len_1,Len),!. length(L,Len) :- \+(var(L)), var(Len), L = [_|R], length(R,Len_1), succ(Len_1,Len). length(L,Len) :- var(L), \+(var(Len)),!, length([],0,L,Len),!. length(L,Len) :- var(L), var(Len), length([],0,L,Len). length(L,Len,L,Len). length(L_1,Len_1,L,Len) :- succ(Len_1,Len_2), length([_|L_1],Len_2,L,Len). % 以下のサイトは # 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/465 # お題:与えられた文字列中の各文字数をカウントして表示せよ。 # 表示順や形式は定めない。 # # 回答例およびチェック用出力例: c # #include <stdio.h> # void check(const char *cs) { # int i, counts[256] = {0}; # for (i = 0; cs[i] != '\0'; i++) counts[cs[i]] += 1; # for (i = 0; i < 256; i++) { # if (counts[i]) printf("'%c'=>%d, ", (char)i, counts[i]); # } # } # int main() { # check("We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris."); # return 0; # } # ↓ # ' '=>16, ','=>2, '.'=>1, ':'=>1, 'W'=>1, 'a'=>7, 'b'=>1, 'c'=>2, 'd'=>2, 'e'=>14 # , 'f'=>1, 'g'=>3, 'h'=>3, 'i'=>6, 'l'=>4, 'm'=>3, 'n'=>4, 'o'=>6, 'p'=>3, 'r'=>8 # , 's'=>4, 't'=>6, 'u'=>4, 'v'=>2, 'w'=>1, 'y'=>1, 'z'=>1, # # '与えられた文字列中の各文字数をカウントして表示せよ。表示順や形式は定めない。'(_文字列,_各文字数のカウント) :- findall(_文字_1,( setof(_文字_1,sub_atom(_文字列,_,1,_,_文字_1),[_文字_1])), _重複のない文字ならび), findall([_文字,_文字数のカウント],( member(_文字,_重複のない文字ならび), カウント(sub_atom(_文字列,_,1,_,_文字),_文字数のカウント)), _各文字数のカウント). カウント(P,_カウント) :- findall(1,P,L), length(L,_カウント). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/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/1381909900/505 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): #  キーボードから正負の整数をデタラメに入力し、整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ # 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数の和,_5つの正の整数の平均) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'([],_5つの正の整数ならび), 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均). 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび,_正の整数ならび) :- 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび),!. 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび). 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび) :- length(_正の整数ならび,5). 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数), '正の整数のみを配列に格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2), 'キーボードから正負の整数をデタラメに入力し、正の整数のみを配列に格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_2,_正の整数ならび). 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 行入力(_行), '診断 :: 整数'(_行,_整数),!. 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数). '診断 :: 整数'(_行,_整数) :- read_term_from_atom(_行,_整数,[]), integer(_整数). '正の整数のみを配列に格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2) :- _整数 >= 0, append(_正の整数ならび_1,[_整数],_正の整数ならび_2). '正の整数のみを配列に格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_1) :- _整数 < 0. 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均) :- sum_list(_5つの正の整数ならび,_5つの正の整数の和), _5つの正の整数の平均 is floor((_5つの正の整数の和 / 5) * 10 + 0.5) / 10. 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/365 # お題:偶数の目が奇数の目より二倍でやすいイカサマさいころの実装と、 # それを実際に10万回ふって出た目の数を集計し出力するコード。 # # 出力例 # 1: 11103 # 2: 22287 # 3: 11114 # 4: 22170 # 5: 11089 # 6: 22237 # # 余力があれば、任意の目の数と出やすさに対応できるコードにしてください。 # # 偶数の目が奇数の目より二倍でやすいイカサマさいころ(_イカサマさいころの目) :- _乱数値 is random(9), nth0(_乱数値,[1,2,3,4,5,6,2,4,6],_イカサマさいころの目),!. 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際に10万回ふって出た目の数を集計し出力する :- 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し([],[],[],[],[],[],[],Ln,_1,_2,_3,_4,_5,_6), length(Ln,100000), 出力する(_1,_2,_3,_4,_5,_6). 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し(Ln,_1,_2,_3,_4,_5,_6,Ln,_1,_2,_3,_4,_5,_6). 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し(Ln_1,LL_1,Ln,LL) :- 偶数の目が奇数の目より二倍でやすいイカサマさいころ(_イカサマさいころの目), 出た目の数を集計し(_イカサマさいころの目,LL_1,LL_2), 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し([_|Ln_1],LL_2,Ln,LL). 出た目の数を集計し(_イカサマさいころの目,LL_1,LL_2) :- length([_|LL0],_イカサマさいころの目), append(LL0,[L|LL2],LL_1), append(LL0,[[_|L]|LL2],LL_2),!. 出力する(_1,_2,_3,_4,_5,_6) :- forall((nth1(_nth1,[_1,_2,_3,_4,_5,_6],L),length(L,_集計値)), writef('%t: %t\n',[_nth1,_集計値]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/423 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 問題(戻り値がある場合の引数あり) # 円錐の半径rと高さhを入力し、円錐の体積を求めるプログラムを作りなさい。 # ただし、main関数で円錐の半径rと高さhの入力と計算された円錐の体積の表示を行い、 # 円錐の体積の計算はtaisekiという関数で行うこと。 # また、円周率は3.14を使用すること。 # # ../test/read.cgi/tech/1381909900/422に続きます # '円錐の半径rと高さhを入力し、円錐の体積を求めるプログラムを作りなさい。 ただし、主述語で円錐の半径rと高さhの入力と計算された円錐の体積の表示を行い、 円錐の体積の計算は体積という述語で行うこと。 また、円周率は3.14を使用すること。' :- 数を得る(円錐の半径r,_円錐の半径r), 数を得る(円錐の高さh,_円錐の高さh), '円錐の体積の計算と表示は体積という述語で行うこと。 また、円周率は3.14を使用すること。'(_円錐の半径r,_円錐の高さh,_円錐の体積), writef('半径%t,高さ%t の円錐の体積は %t\n',[_円錐の半径r,_円錐の高さh,_円錐の体積]). '円錐の体積の計算は体積という関数で行うこと。 また、円周率は3.14を使用すること。'(_円錐の半径r,_円錐の高さh,_円錐の体積) :- _円周率 = 3.14, 体積(_円錐の半径r,_円錐の高さh,_円周率,_円錐の体積). 体積(_円錐の半径r,_円錐の高さh,_円周率,_円錐の体積) :- _円錐の体積 is _円周率 * _円錐の半径r * _円錐の半径r * _円錐の高さh / 3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :- list(_催促文ならび), findall(_数,( member(_催促文,_催促文ならび), 数を得る(Instream,_催促文,_数を含む条件,_数)), _数ならび),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 数を得る'(Line,_数を含む条件,_数),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 数を得る(Instream,_催促文,_数を含む条件,_数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 数を得る'(end_of_file,_,end_of_file) :- !. '診断: 数を得る'('',_,_) :- !,fail. '診断: 数を得る'(Line,_数を含む条件,_数) :- atom_to_term(Line,_数,_), number(_数), '診断: 数を含む条件'(_数,_数を含む条件),!. '診断: 数を得る'(Line,_数を含む条件,_数) :- \+((atom_to_term(Line,_数,_),number(_数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!, fail. '診断: 数を含む条件'(_数,_数を含む条件) :- number(_数), call(_数を含む条件),!. '診断: 数を含む条件'(_数,_数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!, fail. 数を得る(_催促文,_数を含む条件,_数) :- 数を得る(user_input,_催促文,_数を含む条件,_数). 数を得る(_催促文,_数) :- 数を得る(user_input,_催促文,true,_数). 数を得る(_数) :- 数を得る(user_input,'',true,_数). 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([]. % 以下のサイトは # 出題場所 # # ●Regular Expressionの使用環境 # Python3.3 # # ●検索か置換か? # 置換 # # ●説明 # 均等割りにしているスペースを削除したい # 一文字ずつスペースが入っている文字のスペースを削除したい # # ●対象データ # あ い う え お # かき くけ ここ # # ●希望する結果 # あいうえお # かき くけ ここ # 均等割りにしているスペースを削除したい(_文字列,_均等割文字列長さ,_スペースを削除した文字列) :- 均等割文字列(_文字列,_均等割文字列長さ,_均等割文字列ならび), atomic_list_concat(_均等割文字列ならび,_スペースを削除した文字列). 均等割文字列(_文字列,_均等割文字列長さ,[_文字列]) :- '文字列が均等割文字長さであり、構成する文字全てがスペースではない'(_文字列,_均等割文字列長さ). 均等割文字列(_文字列,_均等割文字列長さ,[_前文字列|R]) :- 均等割副文字列を得る(_文字列,_前文字列,_スペース文字列,_後文字列,_均等割文字列長さ), 均等割文字列(_後文字列,_均等割文字列長さ,R). '文字列が均等割文字長さであり、構成する文字全てがスペースではない'(_文字列,_均等割文字列長さ) :- 文字列を構成する文字全てがスペースではない(_文字列), atom_length(_文字列,_均等割文字列長さ). 均等割副文字列を得る(_文字列,_前文字列,_スペース文字列,_後文字列,_均等割文字列長さ) :- '前文字列・スペース文字列・後文字列候補'(_文字列,_前文字列,_スペース文字列,_後文字列,_均等割文字列長さ), '前文字列は空文字でなく全て文字、スペース文字列は空文字でなく全てスペース'(_前文字列,_スペース文字列), 後文字列の先頭文字はスペースではない(_後文字列). '前文字列・スペース文字列・後文字列候補'(_文字列,_前文字列,_スペース文字列,_後文字列,_均等割文字列長さ) :- sub_atom(_文字列,_均等割文字列長さ,_,R,_スペース文字列), sub_atom(_文字列,0,_均等割文字列長さ,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). '前文字列は空文字でなく全て文字、スペース文字列は空文字でなく全てスペース'(_前文字列,_スペース文字列) :- 前文字列は空文字でなく全て文字(_前文字列), スペース文字列は空文字でなく全てスペース(_スペース文字列). 前文字列は空文字でなく全て文字(_前文字列) :- 空文字ではなく(_前文字列), 文字列を構成する文字全てがスペースではない(_前文字列). スペース文字列は空文字でなく全てスペース(_スペース文字列) :- 空文字ではなく(_スペース文字列), 文字列を構成する文字全てがスペースである(_スペース文字列). 空文字ではなく(_文字列) :- \+(_文字列=''). 後文字列の先頭文字はスペースではない(_後文字列) :- \+(sub_atom(_後文字列,0,1,_,' ')). 文字列を構成する文字全てがスペースではない(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),\+(_文字=' ')). 文字列を構成する文字全てがスペースである(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),_文字=' '). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/198 # # お題:チャンパーノウン定数を表示せよ。 # 表示された文字列中に"991"を一つだけ含むこと。 'お題:チャンパーノウン定数を表示せよ。 表示された文字列中に"991"を一つだけ含むこと。' :- 'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(1,'0.'). 'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N,A) :- count(sub_atom(A,_,3,_,'991'),2),!,fail. 'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N,A) :- atom_number(B,N), atom_concat(A,B,C), '表示された文字列中に"991"を一つだけ含むこと。'(N,C). '表示された文字列中に"991"を一つだけ含むこと。'(N,_チャンパーノウン定数) :- '文字列中に"991"を一つだけ含むこと。'(_チャンパーノウン定数), writef('%t\n',[_チャンパーノウン定数]). '表示された文字列中に"991"を一つだけ含むこと。'(N,C) :- N_2 is N + 1, チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N_2,C,_チャンパーノウン定数). '文字列中に"991"を一つだけ含むこと。'(_チャンパーノウン定数) :- count(sub_atom(_チャンパーノウン定数,_,3,_,'991'),1). count(P,N) :- findall(1,P,L), length(L,Count). % 以下のサイトは # # SWI-Prolog用 sub_atom/5 の遅延評価版述語 副文字列/5 # # 第一引数の_文字列が変数であってもすぐにはエラーとならない # 副文字列(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- '選択開始位置0起源、残り長さが共に0で、かつ、文字列が変数'(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列),!. 副文字列(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- freeze(_文字列,sub_atom(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列)). '選択開始位置0起源、残り長さが共に0で、かつ、文字列が変数'(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- '選択開始位置0起源、残り長さが共に0で、'(_選択開始位置0起源,_残り長さ), 'かつ、文字列が変数'(_文字列,_副文字列,_選択長さ). '選択開始位置0起源、残り長さが共に0で、'(_選択開始位置0起源,_残り長さ) :- '選択開始位置0起源、残り長さは整数で'(_選択開始位置0起源,_残り長さ), 共に0である(_選択開始位置0起源,_残り長さ). '選択開始位置0起源、残り長さは整数で'(_選択開始位置0起源,_残り長さ) :- integer(_選択開始位置0起源), integer(_残り長さ). 共に0である(0,0). 'かつ、文字列が変数'(_文字列,_副文字列,_選択長さ) :- var(_文字列), _文字列 = _副文字列, freeze(_文字列,atom_length(_文字列,_選択長さ)). % 以下のサイトは # 【 課題 】マス取りゲーム # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11/27 24:00 # 【 Ver  】"1.7.0_45" # 【 補足 】3×3のマスに『○』と『×』を交互に入力して9マス埋まったら終了です。 # 勝ち負けはいりません 戦略なしマス取りゲーム(_手順) :- 戦略なしマス取りゲーム(○,[a1,a2,a3,b1,b2,b3,c1,c2,c3],_手順). 戦略なしマス取りゲーム(_手番,[],[]) :- !. 戦略なしマス取りゲーム(_手番,_残りマスならび,_手順) :- 空いたマスがあれば戦略なしマス取りゲームを続ける(_手番,_残りマスならび,_手順). 空いたマスがあれば戦略なしマス取りゲームを続ける(_手番,_残りマスならび,[[_手番,_マス]|_手順]) :- 手番がマスをひとつ取る(_手番,_残りマスならび,_次の手番,_マス,_ひとつマスを取られた残りマスならび), 戦略なしマス取りゲーム(_次の手番,_ひとつマスを取られた残りマスならび,_手順). 手番がマスをひとつ取る(_手番,_残りマスならび,_次の手番,_マス,_ひとつマスを取られた残りマスならび) :- マスをひとつ取る(_残りマスならび,_マス), ひとつマスを取られた残りマスならび(_マス,_残りマスならび,_ひとつマスを取られた残りマスならび), 次の手番(_手番,_次の手番). マスをひとつ取る(_残りマスならび,_マス) :- length(_残りマスならび,_残りマス数), _乱順数 is random(_残りマス数), nth0(_乱順数,_残りマスならび,_マス). ひとつマスを取られた残りマスならび(_マス,_残りマスならび,_ひとつマスを取られた残りマスならび) :- select(_マス,_残りマスならび,_ひとつマスを取られた残りマスならび). 次の手番(○,×). 次の手番(×,○). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/68 # # お題:文字列をランダムに並べ替える。 # ただし、どの文字も元と同じ位置ではないこと。 '文字列をランダムに並べ替える。 ただし、どの文字も元と同じ位置ではないこと。'(_文字列,_ランダムに並べ替えた文字列) :- 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび), 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列). 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび) :- atom_length(_文字列,_文字列の長さ), length(_位置決めならび,_文字列の長さ), findall(N,between(1,_文字列の長さ,N),_整数順ならび), 位置を置換する(_整数順ならび,_文字列の置換位置ならび). 位置を置換する([],_位置決めならび) :- !. 位置を置換する([_位置1,_位置2,_位置3],_位置決めならび) :- 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび). 位置決めならび(L,_位置決めならび) :- 位置の交換(L,R,_位置決めならび), 位置を置換する(R,_位置決めならび). 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび) :- nth1(_位置1,_位置決めならび,_位置2), nth1(_位置2,_位置決めならび,_位置3), nth1(_位置3,_位置決めならび,_位置1),!. 位置の交換(L,L2,_位置決めならび) :- 位置選択(L,N1,L1), 位置選択(N2,L1,L2), nth1(N1,_位置決めならび,N2), nth1(N2,_位置決めならび,N1),!. 位置選択(L,_位置,L2) :- length(L,Len), _乱数値 is random(Len), length(L0,Len), append(L0,[_位置|R],L), append(L0,R,L2),!. 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列) :- findall(_文字,( member(_位置,_文字列の置換位置ならび), _位置_1 is _位置 - 1, sub_atom(_文字列,_位置_1,1,_,_文字)), _ランダムに並べ替えた文字ならび), atomic_list_concat(_ランダムに並べ替えた文字ならび,_ランダムに並べ替えた文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 166代目 #290 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): 100000 # 110000 # 111000 # 111100 # 111110 # 111111 # とこのように表示させるプログラム。 # '100000 110000 111000 111100 111110 111111 とこのように表示させるプログラム。' :- length(L,6), forall(先頭文字だけは1固定で行を1と0のならびで分離する(L),表示させる(L)). 先頭文字だけは1固定で行を1と0のならびで分離する(L) :- append(['1'|L1],L2,L), all(L1,'1'), all(L2,'0'). 表示させる(L) :- atomic_list_concat(L,A), writef('%t\n',[A]). all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/53 # # # お題:nの階乗の末尾の連続した0の個数を求める。 # :- dynamic(階乗保存計算/2). 'nの階乗の末尾の連続した0の個数を求める。'(_n,_末尾の連続した0の個数) :- 階乗保存計算(_n,_nの階乗), 末尾の連続した0の個数(_nの階乗,_末尾の連続した0の個数). 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). 末尾の連続した0の個数(_nの階乗,_末尾の連続した0の個数) :- atom_chars(_nの階乗,L), append(_,L1,L), all(L1,'0'), length(L1,_末尾の連続した0の個数). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # # お題:'+'と'-'の文字を使わないコードで"Hello, world!"をn回、表示する。 # 'お題:''+''と''-''の文字を使わないコードで"Hello, world!"をn回、表示する。'(_n) :-     length(Ln,_n),     '"Hello, world!"をn回、表示する。'(Ln). '"Hello, world!"をn回、表示する。'([]). '"Hello, world!"をn回、表示する。'([_|R]) :-     write('Hello, World!'),     '"Hello, world!"をn回、表示する。'(R). % 以下のサイトは # 回文数 # コマ大数学科の問題だそうですよ。 # 引用 # ある数字とその数字を逆さに並べた数字を足して # 回文数になるまでこの操作を繰り返すとき # 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桁の数字). % 以下のサイトは # お題: # 例:数列[3,1,-7,1,5]について、 # ->[4,-3,-2,3] (累計) # ->12 (絶対値の合計) # のように計算する。 # 最初の数列の並び順を変えると、最後の合計計も変わる。 # 任意数列について、上記合計が最小になるように並び替える関数を作成 '例:数列[3,1,-7,1,5]について、 ->[4,-3,-2,3] (累計) ->12 (絶対値の合計) のように計算する。 任意数列について、上記合計が最小になるように並び替える'(_数列,_最小となる数列) :- 絶対値の合計が最小になるように並び替える(_数列,_,_最小となる数列). 絶対値の合計が最小になるように並び替える(_数列,_最小の絶対値,_絶対値の合計が最小となる数列) :- length(_数列,_要素数), setof([_絶対値の合計,_順列], [_数列,_要素数,_順列,_絶対値の合計] ^ 並べ替える(_数列,_要素数,_順列,_絶対値の合計),_絶対値_数列ならび), 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_最小の絶対値,_絶対値の合計が最小となる数列). 並べ替える(_数列,_要素数,_順列,_絶対値の合計) :- 順列(_数列,_要素数,_順列), 絶対値の合計(_順列,_絶対値の合計). 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_最小の絶対値,_絶対値の合計が最小となる数列) :- findmin(_絶対値,( member([_絶対値,_],_絶対値_数列ならび)), _最小の絶対値), member([_最小の絶対値,_絶対値の合計が最小となる数列],_絶対値_数列ならび). 絶対値の合計([_値],_絶対値の合計) :- _絶対値の合計 is abs(_値),!. 絶対値の合計(_値ならび,_絶対値の合計) :- 累計の途中経過を得る(_値ならび,_累計の途中経過ならび), 要素の絶対値の合計(_累計の途中経過ならび,_絶対値の合計). 累計の途中経過を得る([_],[]). 累計の途中経過を得る([_数_1,_数_2|R1],[_累計の途中経過|R2]) :- _累計の途中経過 is _数_1 + _数_2, 累計の途中経過を得る([_累計の途中経過|R1],R2). 要素の絶対値の合計(_累計の途中経過ならび,_絶対値の合計) :- findsum(_絶対値,( member(_値,_累計の途中経過ならび), _絶対値 is abs(_値)), _絶対値の合計). 順列(_,0,[]). 順列(L1,N,[A|R]) :- select(A,L1,R1), N_1 is N - 1, 順列(R1,N_1,R). findmin(V,P,Min) :- findall(V,P,L), min_list(L,Min). findsum(V,P,Sum) :- findall(V,P,L), sum_list(L,Sum). % 以下のサイトは # お題: # 例:数列[3,1,-7,-1,5]について、 # ->[4,-3,-2,3] (累計) # ->12 (絶対値の合計) # のように計算する。 # 最初の数列の並び順を変えると、最後の合計計も変わる。 # 任意数列について、上記合計が最小になるように並び替える関数を作成 '例:数列[3,1,-7,-1,5]について、 ->[4,-3,-2,3] (累計) ->12 (絶対値の合計) のように計算する。 任意数列について、上記合計が最小になるように並び替える'(_数列,_最小となる数列) :- 絶対値の合計が最小になるように並び替える(_数列,_最小となる数列). 絶対値の合計が最小になるように並び替える(_数列,_絶対値が最小となる数列) :- length(_数列,_要素数), findall([_絶対値の合計,_順列],( 順列(_数列,_要素数,_順列), 絶対値の合計(_順列,_絶対値の合計)), _絶対値_数列ならび), 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_絶対値の合計が最小となる数列). 絶対値の合計(_数列,_絶対値の合計) :- 数列から累計を得る(_数列,_累計数列), 絶対値の合計を得る(_累計数列,_絶対値の合計). 数列から累計を得る([_数],_数) :- !. 数列から累計を得る([_数_1,_数_2|R1],[_数_3|R2]) :- _数_3 is _数_1 + _数_2, 数列から累計を得る([_数_3|R1],R2). 絶対値の合計を得る([],0). 絶対値の合計を得る([N|R1],_合計) :- 絶対値の合計を得る(R1,_合計_2), _合計 is abs(N) + _合計_2. 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_絶対値の合計が最小となる数列) :- findmin(_絶対値,( member([_絶対値,_],_絶対値_数列ならび)), _最小の絶対値), member([_最小の絶対値,_絶対値の合計が最小となる数列],_絶対値_数列ならび). 順列(_,0,[]). 順列(L1,N,[A|R]) :- select(A,L1,R1), N_1 is N - 1, 順列(R1,N_1,R). findmin(V,P,Min) :- findall(V,P,L), min(L,Min). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/194 # # [1] 授業単元:C言語 # # [2] 問題文(含コード&リンク): # 1〜100の整数のうち「6の倍数」の個数を表示するプログラムを作成しなさい、ただし、for文とif文を用いて作成すること # 1次元配列を用いて5人分の数学の得点を100点満点で入力し、「数学の得点の最小値と最大値」を画面表示、およびファイルに書き出すプログラムを作成しなさい。ただし、書き出し用ファイル名は「sugaku.txt」にしなさい。 # # '1次元配列を用いて5人分の数学の得点を100点満点で入力し、「数学の得点の最小値と最大値」を画面表示、およびファイルに書き出すプログラムを作成しなさい。ただし、書き出し用ファイル名は「sugaku.txt」にしなさい。' :- '1次元配列を用いて5人分の数学の得点を100点満点で入力し'(_5人文の数学の得点), '「数学の得点の最小値と最大値」を'(_5人分の数学の得点,_数学得点の最小値,_数学得点の最大値), '画面表示、'(_数学得点の最小値,_数学得点の最大値), 'およびファイルに書き出すプログラムを作成しなさい。ただし、書き出し用ファイル名は「sugaku.txt」にしなさい。'(_5人分の数学の得点). '1次元配列を用いて5人分の数学の得点を100点満点で入力し'(_5人文の数学の得点) :- length(_5人分の数学の得点,5), forall(nth1(_nth1,_5人分の数学の得点,_数学の得点),整数を得る(数学の得点,(_数学の得点>=0,_数学の得点=<100),_数学の得点)). '「数学の得点の最小値と最大値」を'(_5人分の数学の得点,_数学得点の最小値,_数学得点の最大値,_数学得点の最小値,_数学得点の最大値) :- 数学の得点の最小値(_5人分の数学の得点,_数学得点の最小値), 数学の得点の最大値(_5人分の数学の得点,_数学得点の最大値). 数学の得点の最小値(_5人分の数学の得点,_数学得点の最小値) :- select(_数学得点の最小値,_5人分の数学の得点,_残りの数学の得点), forall(member(N,_残りの数学の得点),N>=_数学得点の最小値). 数学の得点の最大値(_5人分の数学の得点,_数学得点の最大値) :- select(_数学得点の最大値,_5人分の数学の得点,_残りの数学の得点), forall(member(N,_残りの数学の得点),N=<_数学得点の最大値). '画面表示、'(_数学得点の最小値,_数学得点の最大値) :- writef('数学得点の最小値 = %t\n数学得点の最大値 = %t\n',[_数学得点の最小値,_数学得点の最大値]). 'およびファイルに書き出すプログラムを作成しなさい。ただし、書き出し用ファイル名は「sugaku.txt」にしなさい。'(_5人分の数学の得点) :- open('sugaku.txt',write,Outstream), forall(nth1(_nth1,_5人分の数学の得点,_数学の得点),writef(Outstream,'%t\n',[_数学の得点])), close(Outstream). % 以下のサイトは '「たけしさんの前に9人、後ろに4人います。みんなで何人?」'(_何人) :- 'たけしさんの前に9人、後ろに4人います。'(_たけしさんの前に9人,_後ろに4人), 'みんなで何人?'(_たけしさんの前に9人,_後ろに4人,_何人). 'たけしさんの前に9人、後ろに4人います。'(_たけしさんの前に9人,_後ろに4人) :- 'たけしさんの前に9人、'(_たけしさんの前に9人), '後ろに4人います。'(_後ろに4人). 'たけしさんの前に9人、'(_たけしさんの前に9人) :- append(_前に9人,[_たけしさん],_たけしさんの前に9人), 前に9人(_前に9人). 前に9人(_前に9人) :- length(_前に9人,9). '後ろに4人います。'(_後ろに4人) :- length(_後ろに4人,4). 'みんなで何人?'(_たけしさんの前に9人,_後ろに4人,_何人) :- みんなで(_たけしさんの前に9人,_後ろに4人,_みんなで), '何人?'(_みんなで,_何人). みんなで(_たけしさんの前に9人,_後ろに4人,_みんなで) :- append(_たけしさんの前に9人,_後ろに4人,_みんなで). '何人?'(_みんなで,_何人) :- length(_みんなで,_何人). % 以下のサイトは '「たけしさんの前に9人、後ろに4人います。みんなで何人?」'(_何人) :- 'たけしさんの前に9人、後ろに4人います。'(_前に9人,_たけしさんの後ろに4人), 'みんなで何人?'(_前に9人,_たけしさんの後ろに4人,_何人). 'たけしさんの前に9人、後ろに4人います。'(_前に9人,_たけしさんの後ろに4人) :- 'たけしさんの前に9人、'(_前に9人), '後ろに4人います。'(_たけしさん,_たけしさんの後ろに4人). 'たけしさんの前に9人、'(_前に9人) :- length(_前に9人,9). 'たけしさんの後ろに4人います。'(_たけしさん,_たけしさんの後ろに4人) :- length(_後ろに4人,4), _たけしさんの後ろに4人 = [_たけしさん|_後ろに4人]. 'みんなで何人?'(_前に9人,_たけしさんの後ろに4人,_何人) :- みんなで(_前に9人,_たけしさんの後ろに4人,_みんなで), '何人?'(_みんなで,_何人). みんなで(_前に9人,_たけしさんの後ろに4人,_みんなで) :- append(_前に9人,_たけしさんの後ろに4人,_みんなで). '何人?'(_みんなで,_何人) :- length(_みんなで,_何人). % 以下のサイトは # # 「たけしさんの前に9人、後ろに4人います。みんなで何人?」 # '「たけしさんの前に9人、後ろに4人います。みんなで何人?」'(_何人) :- 'たけしさんの前に9人、後ろに4人います。'(_前に,たけしさん,_後ろに), 'みんなで何人?'(_前に,たけしさん,_後ろに,_何人). 'たけしさんの前に9人、後ろに4人います。'(_前に,たけしさん,_後ろに) :- 'たけしさんの前に9人、'(_前に), '後ろに4人います。'(_後ろに). 'たけしさんの前に9人、'(_前に) :- length(_前に,9). '後ろに4人います。'(_後ろに) :- length(_後ろに,4). 'みんなで何人?'(_前に,たけしさん,_後ろに,_何人) :- みんなで(_前に,たけしさん,_後ろに,_みんなで), '何人?'(_みんなで,_何人). みんなで(_前に,_たけしさん,_後ろに,_みんなで) :- append(_前に,[_たけしさん|_後ろに],_みんなで). '何人?'(_みんなで,_何人) :- length(_みんなで,_何人). % 以下のサイトは '「たけしさんの前に9人、後ろに4人います。みんなで何人?」'(_何人) :- append(_前に,[_たけしさん|_後ろに],_みんなで), length(_前に,9), length(_後ろに,4), length(_みんなで,_何人). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/89 # # [1] 授業単元: 現象数理 # [2] 問題文(含コード&リンク): # f(x) = cosx - x^2 = 0 の近似解を求めるプログラムを作り、以下の問題を解け。 # なお、二分法を用いること。 # 
a = 0, b = 1 からa, b, c の値を求める。 # 
|b - a| < 10^(−6) の条件を満たすまで実行し、 # もしくはこの条件を満たさない場合は30 回実行し、各回のa, b, cの値をまとめる。 # f(_x,_y) :- cos(_x) - _x ^ 2. '二分法を用いて、 f(x)=cosx - x^2の近似解を求めよ。'(X) :- length(Ln,30), '二分法を用いて、 f(x)=cosx - x^2の近似解を求めよ。'(Ln,0,1,X). '二分法を用いて、 f(x)=cosx - x^2の近似解を求めよ。'(Ln,N1,N2,X) :- f(N1,Y1), f(N2,Y2), N is (N1 + N2) / 2, f(N,Y), '二分法を用いて、 f(x)=cosx - x^2の近似解を求めよ。'(Ln,N1,N2,N,Y1,Y2,Y,X). '二分法を用いて、 f(x)=cosx - x^2の近似解を求めよ。'([],_,_,X,_,_,Y,X) :- !. '二分法を用いて、 f(x)=cosx - x^2の近似解を求めよ。'(_,_,_,X,_,_,Y,X) :- 10 ^ -6 > abs(Y). '二分法を用いて、 f(x)=cosx - x^2の近似解を求めよ。'([_|Ln],N1,N2,N,Y1,Y2,Y,X) :- abs(Y1) < abs(Y2), '二分法を用いて、 f(x)=cosx - x^2の近似解を求めよ。'(Ln,N1,N3,X),!. '二分法を用いて、 f(x)=cosx - x^2の近似解を求めよ。'([_|Ln],N1,N2,N,Y1,Y2,Y,X) :- abs(Y1) > abs(Y2), '二分法を用いて、 f(x)=cosx - x^2の近似解を求めよ。'(Ln,N3,N2,X). % 以下のサイトは # 西暦年を入力してそれ以後の閏年を10個表示させる 西暦年を入力してそれ以後の閏年を10個表示させる :- 西暦年を入力して(_西暦年), それ以後の閏年を10個(_西暦年,_それ以後の閏年を10個), 表示させる(_それ以後の閏年を10個). 西暦年を入力して(_西暦年) :- write('西暦年を入力 '), read(_西暦年). それ以後の閏年を10個(_年,_それ以後の閏年を10個) :- '10個'(_それ以後の閏年を10個), それ以後の閏年を(_年,_それ以後の閏年を10個). '10個'(_10個のならび) :- length(_10個のならび,10). それ以後の閏年を(_,[]). それ以後の閏年を(_閏年,[_閏年|_残り閏年ならび]) :- 閏年(_閏年), _閏年の翌年 is _閏年 + 1, それ以後の閏年を(_閏年の翌年,_残り閏年ならび),!. それ以後の閏年を(_閏年ではない年,_残り閏年ならび) :- _閏年ではない年の翌年 is _閏年ではない年 + 1, それ以後の閏年を(_閏年ではない年の翌年,_残り閏年ならび). 表示させる(_それ以後の閏年を10個) :- atomic_list_concat(_それ以後の閏年を10個,'\n',_表示文字列), writef('%t\n',[_表示文字列]). 閏年(_閏年) :- 0 is _閏年 mod 400,!. 閏年(_閏年) :- \+(0 is _閏年 mod 100), 0 is _閏年 mod 4. % 以下のサイトは # "0000000000"のような文字列を用意しておいて、"123" のような # 任意の文字列を"0000000123"のように置き換えるのって簡単にできますか? # 置き換える方の文字列は3桁じゃなくて、いろんな数字があり得ます。 # # C言語でいうsprintf(%10d, 123)みたいなフォーマットを正規表現で簡単に # 再現できますか? '"0000000000"のような文字列を用意しておいて、"123" のような 任意の文字列を"0000000123"のように置き換えるのって簡単にできますか? 置き換える方の文字列は3桁じゃなくて、いろんな数字があり得ます。'(_置換対象文字列,_置換文字列,_置換された文字列) :- atom_length(_置換文字列,_文字長), sub_atom(_置換対象文字列,S1,S2,S3), atom_length(S2,_文字長), atomic_list_concat([S1,_置換文字列,S3],_置換された文字列). % *** user: sub_atom / 4 *** sub_atom(A,H,X,T) :- 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) :- 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). % 以下のサイトは % % カレンダーの形式(何曜日から始まるか)と % 月日数と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). % 以下のサイトは # お題:数字を3桁ごとにカンマ区切りでフォーマットした文字列をふたつ取り # 合計を同じフォーマット文字列で返す。 # 例 # "18,446,744,073,709,551,616" # "1,099,511,627,776" #   ↓ # "18,446,745,173,221,179,392" # 'お題:数字を3桁ごとにカンマ区切りでフォーマットした文字列をふたつ取り合計を同じフォーマット文字列で返す。'(_文字列_1,_文字列_2,_文字列_3) :- カンマ区切り文字列を数値に戻す(_文字列_1,_数値_1), カンマ区切り文字列を数値に戻す(_文字列_2,_数値_2), _数値_3 is _数値_1 + _数値_2, 数値を3桁ごとにカンマ区切りでフォーマットした文字列とする(_数値_3,_文字列_3). カンマ区切り文字列を数値に戻す(_文字列,_数値) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(_文字=',')), _数字文字ならび), number_chars(_数値,_数字文字ならび). 数値を3桁ごとにカンマ区切りでフォーマットした文字列とする(_数値,_カンマが挿入された文字列) :- number_chars(_数値,_数字ならび), length(_数字ならび,_桁), atomic_list_concat(_数字ならび,_カンマが挿入されていない数字文字列), _剰余 is _桁 mod 3, 数字文字列にカンマを挿入(_剰余,_カンマが挿入されていない数字文字列,_カンマが挿入された文字列). 数字文字列にカンマを挿入(0,_カンマが挿入されていない数字文字列,_カンマが挿入された数字文字列) :- findall(_3字文字列,( sub_atom(_カンマが挿入されていない数字文字列,St,3,R,_3字文字列), 0 is St mod 3), L), atomic_list_concat(L,',',_カンマが挿入された数字文字列),!. 数字文字列にカンマを挿入(N,_数字文字列,_カンマが挿入された数字文字列) :- sub_atom(_数字文字列,0,N,R,_先頭文字列), sub_atom(_数字文字列,_,R,0,_残り文字列), 数字文字列にカンマを挿入(0,_残り文字列,_カンマが挿入された数字文字列_1), atomic_list_concat([_先頭文字列,',',_カンマが挿入された数字文字列_1],_カンマが挿入された数字文字列). % 以下のサイトは # # xxxx0xxxx # xxx000xxx # xx00000xx # # こういうピラミッドを作るコードを教えてください # 言語は何でも良いですけどコードが長くなるのはNGです # この例だと頂上の0は1個で、底辺は5個ですけど # 頂上n個、底辺k個、'0'と'x'の 文字は任意の文字を指定できるようなコードをおしえてください。 # また層は2個ずつちがいますけど、この部分も任意の値を指定できるようにしてください # # こういうのもあり # xx0xx # 00000 ピラミッドを作る(_基壇の幅,_頂上の数,_底辺の数,_段ごとの増分,_ピラミッドの文字,_周囲の文字) :- _左右の捌きの文字数初期値 is (_基壇の幅 - _頂上の数) // 2, _段数 is (_底辺の数 - _頂上の数) // _段ごとの増分, ピラミッドを作る(_段数,_左右の捌きの文字数初期値,_段ごとの増分,_頂上の数,_ピラミッドの文字,_周囲の文字). ピラミッドを作る(0,_,_,_,_,_) :- !. ピラミッドを作る(_段数,_左右の捌き文字数,_段ごとの増分,_ピラミッドの段の文字数,_ピラミッドの文字,_周囲の文字) :- 左右の捌き(_左右の捌き文字数,_段ごとの増分,_周囲の文字,_捌き文字列,_左右の捌き文字数_1), ピラミットの段(_ピラミッドの段の文字数,_段ごとの増分,_ピラミッドの文字,_捌き文字列,_ピラミッドの段の数_2), _段数_1 is _段数 - 1, ピラミッドを作る(_段数_1,_左右の捌き文字数_1,_段ごとの増分,_ピラミッドの段の数_2,_ピラミッドの文字,_周囲の文字). 左右の捌き(_左右の捌き文字数,_段ごとの増分,_周囲の文字,_捌き文字列,_左右の捌き文字数_1) :- n個の連続した文字列(_左右捌きの文字数,_周囲の文字,_左右捌きの文字列), _左右の捌き文字数_1 is _左右の捌き文字数 - _段ごとの増分 // 2. ピラミットの段(_ピラミッドの段の文字数,_段ごとの増分,_ピラミッドの文字,_捌き文字列,_ピラミッドの段の数_2) :- n個の連続した文字列(_ピラミッドの段の文字数,_ピラミッドの文字,_ピラミッド段の文字列), writef('%t%t%t\n',[_捌き文字列,_ピラミット段の文字列,_捌き文字列]), _ピラミッドの段の文字数_2 is _ピラミッドの段の文字数 + _段ごとの増分. n個の連続した文字列(_n個,_文字,_n個の連続した文字列) :- length(L,_n個), all(L,_文字), atom_chars(_n個の連続した文字列,L). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # いろいろな環境の中には、先読みの否定である (?! ) が # 使えない環境があります。 このような環境では、 # 「ABC」 という文字列を含まない # というような、文字列の否定をする正規表現を作るのは # とても難しい作業になります # ※ (?! ) が使える環境での作り方は こちら 。 # # では、例として、 # 以下のようなテキストにマッチする正規表現を考えてみましょう★ # ・ テキストの先頭が AA から始まる # ・ テキストの末尾が AA で終わる # ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない # '・ テキストの先頭が AA から始まる ・ テキストの末尾が AA で終わる ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない'(_テキスト) :- sub_atom(_テキスト,_,_,_,'AA',S2,'AA',_,_,_), \+(sub_atom(S2,_,_,_,'AA')). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% sub_atom(A,S,Len,R,H,X,T,HL,XL,TL) :- atomic(X), atom_chars(A,L), atom_chars(X,XL), subatom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,S,Len,R,H,X,T,HL,XL,TL) :- var(X), atom_chars(A,L), subatom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), \+(XL = []), atom_chars(T,TL). sub_atom_2(L,S,Len,R,L1,XL,L2) :- append(L1,XL,L2,L), length_cut(L1,S), length_cut(L2,R), length_cut(XL,Len). length_cut(L,Len) :- length(L,Len),!. % 以下のサイトは # 出典 :: Regular Expression(正規表現) Part11 #535 # "123,456,789"から","だけを削除して"123456789"にするにはどうすればいいの? # 前後が数字になっている","だけにマッチするのって正規表現だけでできるの? # "[0-9],[0-9]だと前後の数字にもマッチしちゃうよね。 '"123,456,789"から","だけを削除して"123456789"にするにはどうすればいいの? 前後が数字になっている","だけにマッチするのって正規表現だけでできるの? "[0-9],[0-9]だと前後の数字にもマッチしちゃうよね。'(_文字列,_カンマを削除した文字列) :- 文字列からアラビア数字に囲まれたカンマを削除する(_文字列,_カンマを削除した文字列). 文字列からアラビア数字に囲まれたカンマを削除する(_文字列,_カンマを削除した文字列) :- sub_atom(_文字列,_開始点,_検索語の長さ,_残り長さ,S1,',',S3,L1,L2,L3),!, 検索語の前後はアラビア数字である(_文字列,_開始点,_検索語の長さ), 文字列からアラビア数字に囲まれたカンマを削除する(S1,S3,_カンマを削除した文字列). 文字列からアラビア数字に囲まれたカンマを削除する(S1,S3,_カンマを削除した文字列) :- atomic_list_concat([S1,S3],_カンマを削除した文字列). 文字列からアラビア数字に囲まれたカンマを削除する(S1,S3,_カンマを削除した文字列) :- 文字列からアラビア数字に囲まれたカンマを削除する(S3,_カンマを削除した文字列_2), atomic_list_concat([S1,_カンマを削除した文字列_2],_カンマを削除した文字列). 検索語の前後はアラビア数字である(_文字列,_開始点,_検索語の長さ) :- 検索語の前はアラビア数字である(_文字列,_開始点), 検索語の後はアラビア数字である(_文字列,_開始点,_検索語の長さ). 検索語の前はアラビア数字である(_文字列,_開始点) :- _開始点_1 is _開始点 - 1, sub_atom(_文字列,_開始点_1,1,_,A), アラビア数字(A). 検索語の後はアラビア数字である(_文字列,_開始点,_検索語の長さ) :- _開始点_2 is _開始点 + _検索語の長さ, sub_atom(_文字列,_開始点_2,1,_,A), アラビア数字(A). アラビア数字('0'). アラビア数字('1'). アラビア数字('2'). アラビア数字('3'). アラビア数字('4'). アラビア数字('5'). アラビア数字('6'). アラビア数字('7'). アラビア数字('8'). アラビア数字('9'). sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- atom(A), sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), N is S + L, sub_atom(A,N,R,_,T), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- var(A), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL), length(HL,S), length(XL,L), length(TL,R), concat_atom([H,X,T],A), sub_atom(A,S,L,R,H,X,T,HL,XL,TL). % 以下のサイトは 行列から行を取り出す(_行列,_行) :- 行列から行を取り出す(_行列,_,_行). 行列から行を取り出す(_行列,_行目,_行) :- nth1(_行目,_行列,_行). 行列から列を取り出す(_行列,_列) :- 行列から列を取り出す(_行列,_nth1,_列). 行列から列を取り出す(_行列,_列目,_列) :- 転置(_行列,_転置された行列), nth1(_列目,_転置された行列,_列). 行列の位置要素を取り出す(_行列,_行目,_列目,_要素) :- nth1(_行目,_行列,_行), nth1(_列目,_行,_要素). 行列の要素を置換する(_行列,_置換対象値,_置換値,_置換された行列) :- findall(_置換された行,( member(_行,_行列), 行を全置換する(_行,_置換対象値,_置換値,_置換された行)), _置換された行列). 行を全置換する([],_,_,[]). 行を全置換する([A|R1],A,B,[B|R4]) :- 行を全置換する(R1,A,B,R4),!. 行を全置換する([C|R1],A,B,[C|R4]) :- 行を全置換する(R1,A,B,R4). 行列の位置要素を置換する(_行列,_行目,_列目,_値,_置換された行列) :- 行を取り出す(_行列,_行目,_それまでの行ならび,_行,_それより後の行ならび), 行の列要素を置換する(_行,_列目,_値,_置換された行),!, append(_それまでの行ならび,[_置換された行|_それより後の行ならび],_置換された行列). 行を取り出す(_行列,_行目,_それまでの行ならび,_行,_それより後の行ならび) :- _行目_1 is _行目 - 1, length(_それまでの行ならび,_行目_1), append(_それまでの行ならび,[_行|_それより後の行ならび],_行列). 行の列要素を置換する(_行,_列目,_値,_置換された行) :- _列目_1 is _列目 - 1, length(L0,_列目_1), append(L0,[_|R],_行), append(L0,[_値|R],_置換された行). 行列の行を入れ替える(_行列,_行目_1,_行目_2,_入れ替えた行列) :- _行目_1 > _行目_2, 行列の行を入れ替える(_行列,_行目_2,_行目_1,_入れ替えた行列). 行列の行を入れ替える(_行列,_行目_1,_行目_2,_入れ替えた行列) :- _行目_1 < _行目_2, 行列の行を取り出す(_行列,_行目_2,_前ならび_2,_行_2,_後ろならび_2), 行列の行を取り出す(_前ならび_2,_行目_1,_前ならび_1,_行_1,_後ろならび_1), append(_前ならび_1,[_行_2|_後ろならび_1],_前ならび_2_2), append(_前ならび_2_2,[_行_1|_後ろならび_2],_入れ替えた行列). 行列の行を取り出す(_行列,_行目_2,_前ならび_2,_行_2,_後ろならび_2) :- _行目_2_1 is _行目_2 - 1, length(_前ならび_2,_行目_2_1), append(_前ならび_2,[_行_2|_後ろならび_2],_行列). 行列の行を取り出す(_前ならび_2,_行目_1,_前ならび_1,_行_1,_後ろならび_1) :- _行目_1_1 is _行目_1 - 1, length(_前ならび_1,_行目_1_1), append(_前ならび_1,[_行_1|_後ろならび_1],_前ならび_2). 行列の列を入れ替える(_行列,_列目_1,_列目_2,_入れ替えた行列) :- 転置(_行列,_転置された行列), 行列の行を入れ替える(_転置された行列,_列目_1,_列目_2,_入れ替えた転置された行列), 転置(_入れ替えた転置された行列,_入れ替えた行列). 行全体をn倍する(_行列,_行目,_n倍,_行がn倍された行列) :- _行目_1 is _行目 - 1, length(L0,_行目_1), append(L0,[_行|R],_行列), 行要素全てをn倍する(_行,_n倍,_全ての要素がn倍された行), append(L0,[_全ての要素がn倍された行|R],_行がn倍された行列). 行要素全てをn倍する([],_,[]) :- !. 行要素全てをn倍する([A|R1],_n倍,[B|R2]) :- B is A * _n倍, 行要素全てをn倍する(R1,_n倍,R2). 列全体をn倍する(_行列,_列目,_n倍,_列がn倍された行列) :- 転置(_行列,_転置された行列), 行全体をn倍する(_転置された行列,_列目,_n倍,_行がn倍された転置された行列), 転置(_行がn倍された転置された行列,_列がn倍された行列). 二つの行のある列要素がそれぞれの最小公倍数になるように二つの行を倍する(_行列,_行目_1,_行目_2,_列目,_変形した行列) :- 行列の位置要素を取り出す(_行列,_行目_1,_列目,_要素_1), 行列の位置要素を取り出す(_行列,_行目_2,_列目,_要素_2), 最小公倍数を取る(_要素_1,_要素_2,_最小公倍数), _行目_1の倍数 is _最小公倍数 // _要素_1, _行目_2の倍数 is _最小公倍数 // _要素_2, 行全体をn倍する(_行列,_行目_1,_行目_1の倍数,_行列_2), 行全体をn倍する(_行列,_行目_2,_行目_2の倍数,_変形した行列). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは nth1(_nth1,L,A) :- nth1([_],_nth1,L,A). nth1(Ln,_nth1,[A|_],A) :- length(Ln,_nth1). nth1(Ln,_nth1,[_|R],A) :- integer(_nth1), length(L2,_nth1), append(Ln,_,L2), nth1([_|Ln],_nth1,R,A). nth1(Ln,_nth1,[_|R],A) :- var(_nth1), nth1([_|Ln],_nth1,R,A). % 以下のサイトは # # 【東電問題】汚染水を保存するためのタンクを毎日1個作るとします。 # タンクは10日後には必ず壊れ作り直すとします。 # タンク作製作業量はどのように変移するでしょうか? # なお、汚染水の移動作業、タンク点検作業などは考える必要はありません。 :- dynamic(タンク/3). '【東電問題】汚染水を保存するためのタンクを毎日1個作るとします。 タンクは10日後には必ず壊れ作り直すとします。 タンク作製作業量はどのように変移するでしょうか? なお、汚染水の移動作業、タンク点検作業などは考える必要はありません。'(_何日目,_作業量) :- 'タンク作製作業量はどのように変移するでしょうか?'(_何日目,_作業量). 'タンク作製作業量はどのように変移するでしょうか?'(_何日目,_作業量) :- タンク作製作業量はどのように変移([_],_何日目,_作業量). タンク作製作業量はどのように変移(_日の変数ならび,_何日目,_作業量) :- length(_日の変数ならび,_何日目), '汚染水を保存するためのタンクを毎日1個作るとします。', findall(_,'タンクは10日後には必ず壊れ作り直すとします。',_作り直した個数の変数ならび), length([_|_作り直した個数の変数ならび],_作業量). タンク作製作業量はどのように変移(_日の変数ならび,_何日目,_作業量) :- 一日経ちました(_日の変数ならび,_何日目,_作業量). 一日経ちました(_,_,_) :- retract(タンク(_状態,_経た日数,_内容)), assertz(タンク(_状態,[_|_経た日数],_内容)), fail. 一日経ちました(_日の変数ならび,_何日目,_作業量) :- タンク作製作業量はどのように変移([_|_日の変数ならび],_何日目,_作業量). '汚染水を保存するためのタンクを毎日1個作るとします。' :- assertz(タンク(使えます,[],_汚染水)). 'タンクは10日後には必ず壊れ作り直すとします。' :- 'タンクは10日後には必ず壊れ', '作り直すとします。'. 'タンクは10日後には必ず壊れ' :- retract(タンク(使えます,[_,_,_,_,_,_,_,_,_,_],_汚染水)), assertz(タンク(壊れました,[_,_,_,_,_,_,_,_,_,_],_汚染水)). '作り直すとします。' :- assertz(タンク(使えます,[],[])). % 以下のサイトは # 関数のソースコード or バイトコードを取得して # 実行時に書き換えられるかどうか # % コードの実行時書き換えはどのような場合に可能か? % % 下の例は簡単に可能。 :- dynamic(ならびの要素を削除する/2). 実行時のコードの書き換え(P,Q) :- retract(P), assertz(Q). ならびの要素を削除する(_ならび,_削除されたならび) :- append(L0,[_|R],_ならび), length(L0,0), append(L0,R,_削除されたならび). テストコード(_ならび,_削除されたならび) :- テストコード(1,_ならび,_削除されたならび). テストコード(5,_ならび,_削除されたならび) :- !,fail. テストコード(_,_ならび,_削除されたならび) :- ならびの要素を削除する(_ならび,_削除されたならび). テストコード(N,_ならび,_削除されたならび) :- 実行時のコードの書き換え((ならびの要素を削除する(_ならび_2,_削除されたならび_2) :- append(L0,[_|R],_ならび_2), length(L0,_), append(L0,R,_削除されたならび_2)), (ならびの要素を削除する(_ならび_2,_削除されたならび_2) :- append(L0,[_|R],_ならび_2), length(L0,N), append(L0,R,_削除されたならび_2))), N_2 is N + 1, テストコード(N_2,_ならび,_削除されたならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1377511459/294 # # 縦横6マスのボックスがあります。 # 全てのマスを○×で埋めます。 # ○と×はそれぞれ連続2個まで繋がっててOK。 # 縦横の各列は○と×の数は同じにならなければいけない。 # ○と×の並び方が他の列と重複するのはNG。(縦と横を比較して同じなのはOK。縦と縦、横と横が同じ並びって言うのがNG) # これはどうやって解けばいいのか教えてください。 # # '縦横6マスのボックスがあります。 全てのマスを○×で埋めます。 ○と×はそれぞれ連続2個まで繋がっててOK。 縦横の各列は○と×の数は同じにならなければいけない。 ○と×の並び方が他の列と重複するのはNG。(縦と横を比較して同じなのはOK。縦と縦、横と横が同じ並びって言うのがNG) これはどうやって解けばいいのか教えてください。'(LL) :- 行候補ならびを得る(_行候補ならび), 面を規定する(LL), 転置(LL,_転置されたLL), 面候補を得る(_行候補ならび,LL), 転置診断(_転置されたLL,_行候補ならび). 行候補ならびを得る(_行候補ならび) :- findall(L,( 順列([○,○,○,×,×,×],6,L), \+(append(_,[A,A,A|_],L))), _重複があり得る行候補ならび), sort(_重複があり得る行候補ならび,_行候補ならび). 面を規定する(LL) :- length(LL,6), findall(L,( member(L,LL), length(L,6)), LL). 面候補を得る(_行候補ならび,[L1,L2,L3,L4,L5,L6]) :- member(L1,_行候補ならび), member(L2,_行候補ならび), member(L3,_行候補ならび), member(L4,_行候補ならび), member(L5,_行候補ならび), member(L6,_行候補ならび), sort([L1,L2,L3,L4,L5,L6],[_,_,_,_,_,_]). 転置診断(_転置されたLL,_行候補ならび) :- sort(_転置されたLL,[_,_,_,_,_,_]), findall(_,( member(L,_転置されたLL), member(L,_行候補ならび), \+(append(_,[A,A,A|_],L))), [_,_,_,_,_,_]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- del(A,Y,Z), M is N - 1, 順列(Z,M,X). del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). % 以下のサイトは :- dynamic(tmp/2). 入力された点数の相加平均を表示する :- 点に999が入るまで入力を続ける([],Ln), 点数を合計する([],Ln,0,_合計), length(Ln,_人数), _相加平均 is _合計 / 人数, writef('平均点は %t です\n',[_相加平均]). 点に999が入るまで入力を続ける(Ln_1,Ln_2) :- 整数を得る('点数(999の入力で終了)',_点数), \+(_点数 = 999), assertz(tmp(Ln_1,_点数)), 点に99が入るまで入力を続ける([_|Ln_1],Ln_2). 点に999が入るまで入力を続ける(Ln,Ln). 点数を合計する(Ln,Ln,_合計,_合計) :- !. 点数を合計する(Ln_1,Ln_2,_合計_1,_合計) :- tmp(Ln_1,_数), _合計_2 is _合計_1 + _数, 点数を合計する([_|Ln_1],Ln_2,_合計_2,_合計). % 以下のサイトは # 出典:: 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/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からスタート)とコロン(:)を出力する' :- 個数と行数を数える([_],[_],[_],_総個数ならび,_行個数ならび,_行数ならび), '3で割り切れる数の自然数の中で、'(_3で割り切れる数の自然数), '7で割ったとき「2余らない数」を求めて下さい。'(_3で割り切れる数の自然数,_3で割り切れる数の自然数の中で7で割ったとき2余らない数), '1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_総個数ならび,_行個数ならび,_行数ならび,_3で割り切れる数の自然数の中で7で割ったとき2余らない数), length(_総個数ならび,90). 個数と行数を数える(_総個数,_行個数,_行数,_総個数,_行個数,_行数). 個数と行数を数える(L1,[_,_,_,_,_,_,_,_,_,_],L3) :- 個数と行数を数える([_|L1],[_],[_|L3],_総個数,_行個数,_行数),!. 個数と行数を数える(L1,L2,L3,_総個数,_行個数,_行数) :- 個数と行数を数える([_|L1],[_|L2],L3,_総個数,_行個数,_行数),!. '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からスタート)とコロン(:)を出力する'(_行番号ならび), fail. '1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_,[_,_,_,_,_,_,_,_,_,_],_,_数) :- writef(' %t\n',[_数]),!. '1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_,_,_,_数) :- writef(' %t',[_数]). '行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_行番号ならび) :- length(_行番号ならび,_行番号), writef('%t:',[_行番号]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/785 # # 与えられた自然数nを上回る2の冪を返す関数をなるべく最短処理になるように自作してください # 宿題じゃないので期限は問いません # 例: # n=1 → 1 # n=2 → 2 # n=3 → 4 # n=6 → 8 # n=300 → 512 # # 与えられた自然数nを上回る2の冪を返す(_n,_2の冪) :- count('1ビット右シフト'(_n),_冪), _2の冪 is 2 ^ _冪. '1ビット右シフト'(0) :- !,fail. '1ビット右シフト'(N). '1ビット右シフト'(N) :- M is N >> 1, '1ビット右シフト'(M). count(P,N) :- findall(1,P,L), length(L,N). % 以下のサイトは 全順列(L,LL) :- length(L,Len), ダミー要素を付加する(Len,L,L_2), findall(L_4,( 順列(L_2,3,L_3), findall(A,(member(A,L_3),\+(var(A))),L_4)), LL_1), sort(LL_1,LL). 全組合せ(L,LL) :- length(L,Len), ダミー要素を付加する(Len,L,L_2), findall(L_4,( 組合せ(L_2,3,L_3), findall(A,(member(A,L_3),\+(var(A))),L_4)), LL_1), sort(LL_1,LL). ダミー要素を付加する(Len,L_1,L_2) :- length(L_v,Len), append(L_1,L_v,L_2),!. % 以下のサイトは # # 目標を限界度数成功させて指定した蒐集項をならびとして得る # 目標を限界度数成功させて指定した蒐集項をならびとして得る(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- 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(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- メッセージキューを生成し番号ならびを詰める(_限界度数,_キュー番号), '目標を実行して蒐集項ならびを得る'(_限界度数,_キュー番号,_蒐集項,_目標,_蒐集項ならび). '目標を実行して蒐集項ならびを得る'(_限界度数,_キュー番号,_蒐集項,_目標,_蒐集項ならび) :- findall(_蒐集項,( call(_目標), thread_get_message(_キュー番号,_項), ( _項 = _限界度数,!,true;true)),_蒐集項ならび). メッセージキューを生成し番号ならびを詰める(_限界度数,_キュー番号) :- message_queue_create(_キュー番号), thread_create(度数(_限界度数,_キュー番号),_,[]). 度数(_限界度数,_キュー番号) :- between(1,_限界度数,_度数), thread_send_message(_キュー番号,_度数), _度数 = _限界度数. % % 先にlength/2等で解の枠が決まっている場合があるが、 % findall/3述語だと、その枠を無視して、全解を蒐集して、 % その上で第三引数のならびとの単一化を試みようとする。 % 目標の解が1000万個というように多量の場合は、 % スタックオーバーフローが生じてエラーとなって終了する。 % % これに対して、この述語は子スレッドを作り出して、ここで % 本来は現在の解数を数えさせてキュー経由で親スレッドは % これを受信する。この為には親スレッドから子スレッドに解が % 取れたことを送信するためのキューが必要であるがここでは % それを省略した。子から親への片方向の通信になっている。 % % 子スレッドは1から解の限界数まで整数をキューに一気に詰める。 % 親スレッドは目標が達成される度にキューから一つ度数情報を % 取り出す。 % 解の数が限界数に達した時に子スレッドが既に送信してあった % 親スレッドのfindall_n/4の目標内のカットが発動されて % それ以後は蒐集せずにfindall_n/4を終了させることができる。 % % ここではfindall/3を対象にしているがsetof/3やbagof/3も % 全く同様の問題があるし、解決策も同じである。 % 以下のサイトは # # 目標を限界度数成功させて指定した蒐集項をならびとして得る # 目標を限界度数成功させて指定した蒐集項をならびとして得る(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- findall_n(_限界度数,_蒐集項,_目標,_蒐集項ならび). findall_n(_限界度数,_蒐集項,_目標,_蒐集項ならび) :- message_queue_create(_キュー番号), 度数(_限界度数,_キュー番号), findall(_蒐集項,( thread_get_message(_キュー番号,_項), ( _項 = 0,!,fail;call(_目標))), _蒐集項ならび). 度数(_限界度数,_キュー番号) :- between(1,_限界度数,_度数), _剰余 is _度数 mod ( _限界度数 + 1 ), thread_send_message(_キュー番号,_剰余), _度数 = _限界度数. % % ?- length(L,4),findall(N,between(1,10000000,N),L). % false. % 1000万要素と4要素のリストの単一化。この結論を得るまでに数秒を要する。 % % ?- length(L,4),findall_n(4,N,between(1,10000000,N),L). % L = [1,2,3,4] % % ?- length(L,4),findall_n(5,N,between(1,10000000,N),L). % false. % % ?- length(L,4),findall_n(5,N,between(1,4,N),L). % L = [1,2,3,4] % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/676 # # 【 課題 】カンマ区切られているtest.txtのx列のみを取り出し移動平均で値を出しなさい。平均をとる範囲は10とする。 # 【 形態 】Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】提出期限なし # 【 Ver  】java version "1.7.0_21" # 【 補足 】txtははこちらです。よろしくお願いします。 # www.dotup.org/uploda/www.dotup.org4425870.txt.html # # 'カンマ区切られているtest.txtのx列のみを取り出し移動平均で値を出しなさい。平均をとる範囲は10とする。'(_x列,_x列の移動平均ならび) :- 'カンマ区切られているtest.txtのx列のみを取り出し'(_x列,_x列ならび), '移動平均で値を出しなさい。平均をとる範囲は10とする。'(_x列ならび,_x列の移動平均ならび). 'カンマ区切られているtest.txtのx列のみを取り出し'(_x列,_x列ならび) :- get_split_lines('test.txt',[','],LL), findall(S,( member(L,LL), nth1(_x列,L,S)), _x列ならび). '移動平均で値を出しなさい。平均をとる範囲は10とする。'(_x列ならび,_x列の移動平均ならび) :- findall(_単純移動平均,( 単純移動平均(_x列ならび,10,_単純移動平均)), _x列の移動平均ならび). 単純移動平均(_データならび,_サンプル数,_単純移動平均) :- length(L1,_サンプル数), append(L0,L1,_データならび), 相加平均(L1,_単純移動平均). % 以下のサイトは '多点交叉'(_親1,_親2,_交叉点の個数,_1点交叉後の親1,_1点交叉後の親2) :- '1点交叉の素直な拡張である多点交叉は,親1,親2の文字列上で交叉点"|"をランダムに複数個選び,交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する'(_親1,_親2,_交叉点の個数,_1点交叉後の親1,_1点交叉後の親2). '1点交叉の素直な拡張である多点交叉は,親1,親2の文字列上で交叉点"|"をランダムに複数個選び,交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する'(_親1,_親2,_交叉点の個数,_1点交叉後の親1,_1点交叉後の親2) :- '交叉点をランダムに複数個選び、'(_親1,_親2,_交叉点の個数,_交叉点ならび), '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する'(_親1,_親2,_交叉点ならび,_1点交叉後の親1,_1点交叉後の親2). '交叉点をランダムに複数個選び、'(_親1,_親2,_交叉点の個数,_交叉点ならび) :- length(_親1,_長さ1), length(_親2,_長さ2), '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点の個数,_交叉点ならび). '交叉点をランダムに複数個選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点の個数,_交叉点ならび) :- _長さ1 =< _長さ2, '交差点をランダムに複数個選び、'(_長さ1,_交叉点の個数,_交叉点ならび),!. '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点の個数,_交叉点) :- '交差点をランダムに複数個選び、'(_長さ2,_交叉点の個数,_交叉点ならび),!. '交差点をランダムに複数個選び、'(_長さ1,_交叉点の個数,_交叉点ならび) :- '交差点をランダムに複数個選び、'(_長さ1,_交叉点の個数,[],_交叉点ならび). '交差点をランダムに複数個選び、'(_,0,_交叉点ならび,_交叉点ならび) :- !. '交差点をランダムに複数個選び、'(_長さ1,N,L1,_交叉点ならび) :- R is random(_長さ1), 整列を保ちつつ挿入する(R,L1,L2), N_1 is N - 1, '交差点をランダムに複数個選び、'(_長さ1,N_1,L2,_交叉点ならび),!. '交差点をランダムに複数個選び、'(_長さ1,N,L1,_交叉点ならび) :- '交差点をランダムに複数個選び、'(_長さ1,N,L1,_交叉点ならび). 整列を保ちつつ挿入する(M,[],[M]). 整列を保ちつつ挿入する(M,[N|R],[M,N|R]) :- M < N,!. 整列を保ちつつ挿入する(M,[N|R1],[N|R2]) :- M > N, 整列を保ちつつ挿入する(M,R1,R2),!. '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2をならびとして生成する'(_親1,_親2,_交叉点ならび,_1点交叉後の親1,_1点交叉後の親2) :- '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,_交叉点ならび,_1点交叉後の親1の部分文字列ならび,_1点交叉後の親2の部分文字列ならび), atomic_list_concat(_1点交叉後の親1の部分文字列ならび,_1点交叉後の親1). atomic_list_concat(_1点交叉後の親2の部分文字列ならび,_1点交叉後の親2). '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,[],[],[]). '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,[_交叉点],[_親1部分文字列],[_親2部分文字列]) :- sub_atom(_親1,_交叉点,_,0,_親1部分文字列), sub_atom(_親2,_交叉点,_,0,_親2部分文字列). '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,[_交叉点1,_交叉点2|R1],[_親1部分文字列_1,_親2部分文字列_2|R2],[_親2部分文字列_1,_親1部分文字列_2|R3]) :- sub_atom(_親1,0,_交叉点1,_,_親1部分文字列_1), sub_atom(_親2,0,_交叉点2,_,_親2部分文字列_1), _交叉2の長さ is _交叉点2 - _交叉点1, sub_atom(_親1,_交叉点1,_交叉2の長さ,_,_親1部分文字列_2), sub_atom(_親2,_交叉点1,_交叉2の長さ,_,_親2部分文字列_2), '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,R1,R2,R3). % 以下のサイトは '1点交叉'(_親1,_親2,_1点交叉後の親1,_1点交叉後の親2) :- '1点交叉は,単純交叉とよばれる最も単純な交叉規則である。1点交叉では,親1,親2の文字列上で交叉点"|"をランダムに1箇所選び,交叉点の右側の2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する。'(_親1,_親2,_1点交叉後の親1,_1点交叉後の親2). '1点交叉は,単純交叉とよばれる最も単純な交叉規則である。1点交叉では,親1,親2の文字列上で交叉点"|"をランダムに1箇所選び,交叉点の右側の2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する。'(_親1,_親2,_1点交叉後の親1,_1点交叉後の親2) :- '交叉点をランダムに1箇所選び、'(_親1,_親2,_交叉点), '交叉点の右側の2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する。'(_親1,_親2,_交叉点,_1点交叉後の親1,_1点交叉後の親2). '交叉点をランダムに1箇所選び、'(_親1,_親2,_交叉点) :- length(_親1,_長さ1), length(_親2,_長さ2), '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点). '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点) :- _長さ1 =< _長さ2, _交叉点 is random(_長さ1),!. '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点) :- _交叉点 is random(_長さ2). '交叉点の右側の2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する。'(_親1,_親2,_交叉点,_1点交叉後の親1,_1点交叉後の親2) :- '交叉点の右側の2つの親の部分文字列を'(_親1,_親2,_親1の前半文字列,_親1の後半文字列,_親2の前半文字列,_親2の後半文字列), 'そっくりそのまま交換して,子1,子2を生成する。'(_親1の前半文字列,_親1の後半文字列,_親2の前半文字列,_親2の後半文字列,_1点交叉後の親1,_1点交叉後の親2). '交叉点の右側の2つの親の部分文字列を'(_親1,_親2,_親1の前半文字列,_親1の後半文字列,_親2の前半文字列,_親2の後半文字列) :- sub_atom(_親1,0,_交叉点,_残り長さ1,_親1の前半文字列), sub_atom(_親1,_交叉点,_残り長さ1,0,_親1の後半文字列), sub_atom(_親2,0,_交叉点,_残り長さ2,_親2の前半文字列), sub_atom(_親2,_交叉点,_残り長さ2,0,_親2の後半文字列). 'そっくりそのまま交換して,子1,子2を生成する。'(_親1の前半文字列,_親1の後半文字列,_親2の前半文字列,_親2の後半文字列,_1点交叉後の親1,_1点交叉後の親2) :- atom_concat(_親1の前半文字列,_親2の後半文字列,_1点交叉後の親1), atom_concat(_親2の前半文字列,_親1の後半文字列,_1点交叉後の親2). % 以下のサイトは # # お題:整数同士の掛け算の筆算の計算過程を表示するプログラム # 整数同士の掛け算の筆算の計算過程を表示する(_整数_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),!. % 以下のサイトは # 【 課題 】コンソルから値xを取り、二進法に直す。負の整数の場合も変換出来るように。 # 【 形態 】Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】制限なし # 【 Ver  】java version "1.7.0_02" # 【 補足 】十進xが負の場合、全部0と1を反転させて最後に1を足すのですが、そこの処理が出来ません。 'コンソルから値xを取り、二進法に直す。負の整数の場合も変換出来るように。 ' :- 'コンソルから値xを取り、'(_x), '二進数に直す。'(_x,_二進数). 'コンソルから値xを取り、'(_x) :- 数を得る(整数,integer(_x),_x). '二進数に直す。'(_x,_二進数) :- _x < 0, 負数の二進数に変換(1,_x,[],_二進数). '二進数に直す。'(_x,_二進数) :- _x >= 0, '二進数に直す。'(_x,[],_二進数). '二進数に直す。'(0,L,L). '二進数に直す。'(N,L1,L) :- M is N mod 2, D is N // 2, '二進数に直す。'(D,[M|L1],L). 負数の二進数に変換(_桁溢れ,N1,L1,L) :- M is N mod 2, N_1 is N // 2, 負数の二進数に変換(_桁溢れ,M,N_1,L1,L),!. 負数の二進数に変換(_桁溢れ,_,0,L1,L) :- 残り桁を埋める(L1,L). 負数の二進数に変換(0,0,N_1,L1,L) :- 負数の二進数に変換(0,N_1,[1|L1],L). 負数の二進数に変換(0,1,N_1,L1,L) :- 負数の二進数に変換(0,N_1,[0|L1],L). 負数の二進数に変換(1,0,N_1,L1,L) :- 負数の二進数に変換(1,N_1,[0|L1],L). 負数の二進数に変換(1,1,N_1,L1,L) :- 負数の二進数に変換(0,N_1,[1|L1],L). 残り桁を埋める(L,L) :- length(L,64),!. 残り桁を埋める(L1,L) :- 残り桁を計算する([1|L1],L). % 以下のサイトは 苗字を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/767 # # どなたか助けてください。困ってます。 # [1] 授業単元: 課題 # [2] 問題文: テキストファイル test.txtを呼び出し、平滑化したデータを # 違うファイルtest1.txtに出力しなさい。 # 'テキストファイル test.txtを呼び出し、平滑化したデータを違うファイルtest1.txtに出力しなさい。' :- 'テキストファイル test.txtを呼び出し、平滑化したデータを'(_平滑化したデータならび), '違うファイルtest1.txtに出力しなさい。'(_平滑化したデータならび). 'テキストファイル test.txtを呼び出し、平滑化したデータを'(_平滑化したデータならび) :- 'テキストファイル test.txtを呼び出し、'(_データならび), 平滑化したデータを'(_データならび,_平滑化したデータならび). 'テキストファイル test.txtを呼び出し、'(_データならび) :- get_chars('test.txt',Chars), atom_chars(Atom,Chars), split(Atom,[' ','\n','\t'],_データならび). 平滑化したデータを(_データならび,_平滑化したデータならび). 'テキストファイル test.txtを呼び出し、'(_データならび) :- get_chars('test.txt',Chars), atom_chars(Atom,Chars), split(Atom,[' ','\n','\t'],_データならび). 平滑化したデータを(_データならび,_平滑化したデータならび) :- 単純移動平均(_データならび,_平滑化したデータならび). 単純移動平均(_データならび,_平滑化したデータならび) :- length(L2,25), findall(_相加平均,( append(L1,L2,L3,_データならび), 相加平均(L2,_相加平均)), _平滑化したデータならび). '違うファイルtest1.txtに出力しなさい。'(_平滑化したデータならび) :- open('test1.txt',write,Outstream), '違うファイルtest1.txtに出力しなさい。'(Outstream,_平滑化したデータならび), close(Outstream). '違うファイルtest1.txtに出力しなさい。'(Outstream,[]). '違うファイルtest1.txtに出力しなさい。'(Outstream,[V|R]) :- writef('%t ',[V]), '違うファイルtest1.txtに出力しなさい。'(Outstream,R). % 以下のサイトは 最大部分列和(_数値ならび,_最大部分列和,_最大部分列) :- 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,_最大部分列和,_最大部分列). % 以下のサイトは ある文字数以上の単語をすべて抽出する(_ある文字数以上の単語ならび) :- 形態素解析(_文字列,_形態素ならび), findall(_ある文字数以上の単語,( member(_ある文字数以上の単語,_形態素ならび), atom_length(_ある文字数以上の単語,_文字数), _文字数 >= _ある文字数), _ある文字数以上の単語ならび). 形態素解析(S,L) :- tmpnam(F), tell(F), writef('%t',[S]), told, 形態素解析サーバによる形態素解析(ファイル,F,L) . 形態素解析サーバによる形態素解析(_ファイル名,_形態素ならび) :- 形態素解析サーバー(_形態素解析サーバー), atomic_list_concat(['cat ',_ファイル名,' | ',_形態素解析サーバー],S), sh(S,L1), 形態素解析(L1,L2), 形態素解析_3(L2,L). 形態素解析_1([],[]) :- !. 形態素解析_1([['EOS'|_]|_],[]) :- !. 形態素解析_1([[A|_],[@,B|_]|R],[R1_1|R3]) :- 形態素解析_2(R,R1,R2), 形態素解析_2_重複削除([A,B|R1],[],R1_1), 形態素解析_1(R2,R3),!. 形態素解析_1([[A|_]|R],[B|R2]) :- mecabサーバーによる形態素解析(A,B,R,R2),!. 形態素解析_1([[A|_]|R],[A|R2]) :- jumanサーバーによる形態素解析(A,B,R,R2). mecabサーバーによる形態素解析(A,B,R,R2) :- 形態素解析サーバー(mecab), split(A,['\t'],AL), AL = [B|_], 形態素解析_1(R,R2),!. jumanサーバーによる形態素解析(A,B,R,R2) :- 形態素解析サーバー(juman), 形態素解析_1(R,R2),!. 形態素解析_2([],[],[]) :- !. 形態素解析_2([[A|R1]|R],[],[[A|R1]|R]) :- \+(A = (@)),!. 形態素解析_2([[@,A|_]|R],[A|R2],R3) :- 形態素解析_2(R,R2,R3),!. 形態素解析_3([],[]). 形態素解析_3([A|R],[A|R2]) :- \+(list(A)), '形態素解析_3(R,R2) . 形態素解析_3([A|R],[B|R2]) :- list(A), member(B,A), 形態素解析_3(R,R2) . 形態素解析_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) . 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). 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). % 以下のサイトは ある指定した文字数で折り返す(_文字列,_指定した文字数,_文字列) :- atom_length(_文字列,_文字数), _文字数 =< _指定した文字数,!. ある指定した文字数で折り返す(_文字列,_指定した文字数,_変換された文字列) :- sub_atom(_文字列,0,_指定した文字数,E,_副文字列_1), sub_atom(_文字列,_指定した文字数,_,0,_副文字列_2), ある指定した文字数で折り返す(_副文字列_2,_指定した文字数,_変換された文字列_2), atomic_list_concat([_副文字列_1,'\n',_変換された文字列_2],_変換された文字列). % 以下のサイトは '[1-9]?[0-9]'(_文字列,_前文字列,_適合文字列,_後文字列) :- '0から99までの数字に一致させる'(_文字列,_前文字列,_適合文字列,_後文字列). '0から99までの数字に一致させる'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), '2文字以下の数字ならび'(L2), 前後の文字は数字ではない(L1,L3). '2文字以下の数字ならび'(L2) :- length(L2,_文字数), _文字数 =< 2, forall(member(A,L2),数字(A)). 前後の文字は数字ではない(L1,L3) :- \+((last(L1,_直前の文字),数字(_直前の文字))), \+((L3=[_直後の文字|_],数字(_直後の文字))),!. 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. % 以下のサイトは # 例題の1つに、すべての製品を注文したすべての顧客の平均の売掛残高、および # すべての製品を注文していない顧客の平均の売掛残高を求めるといったものがありました。 % 単位節データベースを抽象するならば、 すべての製品を注文していない顧客の平均の売掛残高を求める(_すべての製品を注文していない顧客の平均の売掛残高) :- findall(_売掛残高,( すべての製品を注文していない顧客の売掛残高(_売掛残高)),_売掛残高ならび), 平均の売掛残高を求める(_売掛残高ならび,_すべての製品を注文していない顧客の平均の売掛残高). すべての製品を注文していない顧客の売掛残高(_売掛残高) :- すべての製品を注文していない顧客(_顧客), 売掛残高(_顧客,_売掛残高). すべての製品を注文していない顧客(_顧客) :- 顧客(_顧客), すべての製品を注文していない(_顧客). すべての製品を注文していない(_顧客) :- forall(商品(_商品),注文していない(_顧客,_商品)). 注文していない(_顧客,_商品) :- \+(注文(_顧客,_商品)). 平均の売掛残高を求める(_売掛残高ならび,_すべての製品を注文していない顧客の平均の売掛残高) :- 顧客数と売掛残高合計を得る(_売掛残高ならび,_顧客数,_売掛残高合計), 売掛残高合計と顧客数から平均売掛残高を求める(_売掛残高合計,_顧客数,_すべての製品を注文していない顧客の平均の売掛残高). 顧客数と売掛残高合計を得る(_売掛残高ならび,_顧客数,_売掛残高合計) :- length(_売掛残高ならび,_顧客数), sum_list(_売掛残高ならび,_売掛残高合計). 売掛残高合計と顧客数から平均売掛残高を求める(_売掛残高合計,_顧客数,_すべての製品を注文していない顧客の平均の売掛残高) :- _顧客数 > 0, _すべての製品を注文していない顧客の平均の売掛残高 is _売掛残高合計 / _顧客数. % 以下のサイトは # 例題の1つに、すべての製品を注文したすべての顧客の平均の売掛残高、および # すべての製品を注文していない顧客の平均の売掛残高を求めるといったものがありました。 % 単位節データベースを抽象するならば、 すべての製品を注文したすべての顧客の平均の売掛残高を求める(_すべての製品を注文したすべての顧客の平均の売掛残高) :- findavg(_売掛残高,( すべての製品を注文した顧客の売掛残高(_売掛残高)), _すべての製品を注文したすべての顧客の平均の売掛残高). すべての製品を注文した顧客の売掛残高(_売掛残高) :- すべての製品を注文した顧客(_顧客), 売掛残高(_顧客,_売掛残高). すべての製品を注文した顧客(_顧客) :- 顧客(_顧客), forall(商品(_商品),注文(_顧客,_商品)). findavg(_選択,_目標,_平均値) :- findall(_選択,_目標,L), sum_list(L,_合計), length(L,_標本数), _平均値 is _合計 / _標本数. % 以下のサイトは ハミング距離(_a,_b,_ハミング距離) :- length(_a,_n), length(_b,_n), findsum(X,( nth1(_k,_a,A), nth1(_k,_b,B), X is abs(A-B)), _ハミング距離). % 以下のサイトは # # 文字列から数字列を検索する # 数字文字列を検索してその数値を得る(_文字列,_前文字列,_数字文字列,_後文字列,_数値) :- 数字文字列を検索して(_文字列,_前文字列,_数字文字列,_後文字列), その数値を得る(_数字文字列,_数値). 数字文字列を検索して(_文字列,_前文字列,_数字文字列,_後文字列) :- 数字文字列を検索する(_文字列,_前文字列,_数字文字列,_後文字列). その数値を得る(_数字文字列,_数値) :- atom_number(_数字文字列,_数値). 数字文字列を検索する(_文字列,_前文字列,_数字文字列,_後文字列) :- '前文字列・数字文字列・後文字列に分割'(_文字列,_前文字列,_数字文字列,_後文字列), 前文字列が空文字であるか前文字列の最後の文字が数字ではない(_前文字列), 後文字列が空文字であるか後文字列の最初の文字が数字ではない(_後文字列). '前文字列・数字文字列・後文字列に分割'(_文字列,_前文字列,_数字文字列,_後文字列) :- sub_atom(_文字列,_開始点,_長さ,_残り長さ,_数字文字列), _長さ > 0, 数字文字列である(_数字文字列), sub_atom(_文字列,0,_開始点,_,_前文字列), sub_atom(_文字列,_,_残り長さ,0,_後文字列). 前文字列が空文字であるか前文字列の最後の文字が数字ではない(''). 前文字列が空文字であるか前文字列の最後の文字が数字ではない(_前文字列) :- sub_atom(_前文字列,_,1,0,_文字), 符号とピリオドを含む数字ではない(_文字). 後文字列が空文字であるか後文字列の最初の文字が数字ではない(''). 後文字列が空文字であるか後文字列の最初の文字が数字ではない(_後文字列) :- sub_atom(_後文字列,0,1,_,_文字), 符号とピリオド含む数字ではない(_文字). 符号とピリオドを含む数字である('+'). 符号とピリオドを含む数字である('-'). 符号とピリオドを含む数字である('.'). 符号とピリオドを含む数字である(_文字) :- 数字である(_文字). 符号とピリオドを含む数字ではない(_文字) :- \+(符号とピリオドを含む数字である(_文字)). 数字である(_文字) :- _文字 @>= '0', _文字 @=< '9'. 数字ではない(_文字) :- \+(数字である(_文字)). 数字文字列である(_数字文字列) :- 'IEEE974等の浮動小数点数表示形式'(_数字文字列). 数字文字列である(_数字文字列) :- 全ての文字が数字である(_数字文字列), \+(数字列の禁則(_数字文字列)). 全ての文字が符号とピリオドを含む数字である(_数字文字列) :- forall(sub_atom(_数字文字列,_,1,_,_文字),符号とピリオドを含む数字である(_文字)). 全ての文字が数字である(_数字文字列) :- forall(sub_atom(_数字文字列,_,1,_,_文字),数字である(_文字)). 'IEEE974等の浮動小数点数表示形式'(_数字文字列) :- sub_atom(_数字文字列,S,2,R,_二文字), member(_二文字,['E+','E-','e+','e-']), 二文字は先頭または末尾にはこない(S,R), 前後文字列の形式が正しい(_数字文字列,S,R). 二文字は先頭または末尾にはこない(S,R) :- S > 0, R > 0. 前後文字列の形式が正しい(_数字文字列,S,R) :- sub_atom(_数字文字列,0,S,_,_数字文字列_1), sub_atom(_数字文字列,_,S,0,_数字文字列_2), 全ての文字が符号とピリオドを含む数字である(_数字文字列_1), 全ての文字が数字である(_数字文字列_2). 数字列の禁則(_数字文字列) :- ピリオドが2個以上ある(_数字文字列),!. 数字列の禁則(_数字文字列) :- ピリオドが先頭文字か末尾文字にある(_数字文字列),!. 数字列の禁則(_数字文字列) :- 'ピリオドの前後に+か-がある'(_数字文字列),!. 数字列の禁則(_数字文字列) :- '+が先頭文字以外にある'(_数字文字列),!. 数字列の禁則(_数字文字列) :- '-が先頭文字以外にある'(_数字文字列),!. ピリオドが2個以上ある(_数字文字列) :- findall(1,sub_atom(_数字文字列,_,1,_,'.'),L), length(L,_度数), _度数 > 1,!. ピリオドが先頭文字か末尾文字にある(_数字文字列) :- sub_atom(_数字文字列,0,1,_,'.'),!. ピリオドが先頭文字か末尾文字にある(_数字文字列) :- sub_atom(_数字文字列,_,1,0,'.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'+.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'-.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'.+'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'.-'),!. '+が先頭文字以外にある'(_数字文字列) :- sub_atom(_数字文字列,_開始点,1,_,'+'), _開始点 > 0,!. '-が先頭文字以外にある'(_数字文字列) :- sub_atom(_数字文字列,_開始点,1,_,'-'), _開始点 > 0,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/159 # # [1] 授業単元:タンシバへの挑戦状 # [2] 問題文:入力された正の整数をローマ数字に変換するプログラムを作れ。 # 正の整数をローマ数字に変換(_正の整数,_ローマ数字) :- 正の整数をローマ数字に変換([1,4,5,9,10,40,50,90,100,400,500,900,1000],['I','IV','V','IX','X','XL','L','XC','C','CD','D','CM','M'],_正の整数,_ローマ数字). 正の整数をローマ数字に変換(L1,L2,_正の整数,_ローマ数字) :- '正の整数がL1に存在した時はL2から対応するローマ数字を得る'(L1,L2,_正の整数,_ローマ数字). 正の整数をローマ数字に変換(L1,L2,_正の整数,_ローマ数字) :- '正の整数がL1に存在しない場合はL2から正の整数より小さくかつ最大のローマ数字単位とローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字_1), '正の整数からローマ数字単位を引いた整数のローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字_2), concat_atom(_ローマ数字_1,_ローマ数字_2,_ローマ数字). '正の整数がL1に存在した時はL2から対応するローマ数字を得る'(L1,L2,_正の整数,_ローマ数字) :- nth1(_nth1,L1,_正の整数), nth1(_nth1,L2,_ローマ数字),!. '正の整数がL1に存在しない場合は正の整数より小さくかつ最大のローマ数字単位とローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字) :- 正の整数より小さくかつ最大のローマ数字単位(L1,L0,_ローマ数字単位), 正の整数より小さくかつ最大のローマ数字(L2,L0,_ローマ数字). 正の整数より小さくかつ最大のローマ数字単位(L1,L0,_ローマ数字単位) :- append(L0,[_ローマ字数字単位|R],L1), _ローマ字数字単位 < _正の整数, \+((member(_ローマ字数字単位_1,R),_ローマ字数字単位_1 < _正の整数)). 正の整数より小さくかつ最大のローマ数字(L2,L0,_ローマ数字) :- length(L0,_nth0), nth0(_nth0,L2,_ローマ数字). '正の整数からローマ数字単位を引いた整数のローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字_2) :- _差分整数 is _正の整数 - _ローマ数字単位, 正の整数をローマ数字に変換(L1,L2,_差分整数,_ローマ数字_2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/959 # # 質問させてください # # アマゾンとかでよくある商品の評価ポイントを集計するクエリを作りたいです # アマゾンと少し違うのは、商品そのものの評価ポイントではなく、 # 商品を登録した出品者くくりでの、「その出品者が出品した全ての商品の評価ポイント」の平均値をとることです # # まとめると、 # ・特定の出品者の出品した商品の評価ポイントの平均値をとる # ・同時に、レビューの件数をとる # ・判明してるキーはt_prof.keyのみです # # テーブルは以下の通り。 # # レビューtable =t_review # =============================== # reviewId -- int(11) :プライマリキー、auto_increment # workId -- int(11) :商品のID # userId -- int(11) :出品者のID # point -- tinyInt(1):評価ポイント(1〜5) # # 出品者プロフィールtable =t_prof # =============================== # userId -- int(11) :プライマリキー、auto_increment # namae -- text :出品者の名前 # key -- int(3):キー。ユニーク # # どんなクエリを書いたらいいんでしょうか # すみません、よろしくお願いします # 'アマゾンとかでよくある商品の評価ポイントを集計するクエリを作りたいです アマゾンと少し違うのは、商品そのものの評価ポイントではなく、 商品を登録した出品者くくりでの、「その出品者が出品した全ての商品の評価ポイント」の平均値をとることです まとめると、 ・特定の出品者の出品した商品の評価ポイントの平均値をとる ・同時に、レビューの件数をとる ・判明してるキーはt_prof.keyのみです テーブルは以下の通り。 レビューtable =t_review =============================== reviewId -- int(11) :プライマリキー、auto_increment workId -- int(11) :商品のID userId -- int(11) :出品者のID point -- tinyInt(1):評価ポイント(1〜5) 出品者プロフィールtable =t_prof =============================== userId -- int(11) :プライマリキー、auto_increment namae -- text :出品者の名前 key -- int(3):キー。ユニーク どんなクエリを書いたらいいんでしょうか すみません、よろしくお願いします'(_商品のID,_出品者のID,_出品者の名前,_レビューの件数,_評価点の平均) :- '商品を登録した出品者くくりでの、「その出品者が出品した全ての商品の評価ポイント」の平均値をとる'(_商品のID,_出品者のID,_出品者の名前,_レビューの件数,_評価点の平均). '商品を登録した出品者くくりでの、「その出品者が出品した全ての商品の評価ポイント」の平均値をとる'(_商品のID,_出品者のID,_出品者の名前,_レビューの件数,_評価点の平均) :- 商品から出品者を得る(_商品のID,_出品者のID), レビューの件数と評価点の平均を得る(_商品のID,_レビューの件数,_評価点の平均), 出品者の名前を得る(_出品者のID,_出品者の名前). 商品から出品者を得る(_商品のID,_出品者のID) :- レビュー(_,_商品のID,_出品者のID,_). レビューの件数と評価点の平均を得る(_出品者のID,_レビューの件数,_評価点の平均) :- findall(_評価点,( レビュー(_,_商品のID,_出品者のID,_評価点)), _評価点ならび), レビューの件数と評価点の平均を得る(_評価点ならび,_評価点の平均), length(_評価点ならび,_レビューの件数), 相加平均(_評価点ならび,_評価点の平均). 出品者の名前を得る(_出品者のID,_出品者の名前) :- 出品者プロフィール(_,_出品者の名前,_出品者のID). % 以下のサイトは ならびをn個切り出す(_ならび,_m要素目から,_n個,_切り出されたならび) :- length([_|L1],_m要素目から), append(L1,_切り出されたならび,_,_ならび), length(_切り出されたならび,_n個). ならびをm要素目からn要素目まで切り出す(_ならび,_m要素目から,_n要素目まで,_切り出されたならび) :- length([_|L1],_m要素目から), length(L2,_n要素目まで), append(L1,_切り出されたならび,L2), append(L1,_切り出されたならび,_,_ならび). % 以下のサイトは 冪集合和(_対象集合,_冪集合和) :- 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). % 以下のサイトは # # @ft4613_ac # if(n段上れる)step_1(N-n,S) みたいな再帰がかけない # 階段を上がる(_,[_現在の段|_残りの階段],[],_現在の段,_残りの階段). 階段を上がる(_n段上がる,[_現在の段_1|_残りの階段_1],_既に登った階段,_現在の段,_残りの階段) :- length(_駆け上がり階段ならび,_n段上がる), append(_駆け上がり階段ならび,_残りの階段_2,[_現在の段_1|_残りの階段_1]), 階段を上がる(_n段上がる,_残りの階段_2,_既に登った階段_2,_現在の段,_残りの階段), append(_駆け上がり階段ならび,_既に登った階段_2,_既に登った階段). % % ?- 階段を上がる(3,[0,1,2,3,4,5,6,7],_既に登った階段,_現在の段,_残りの階段). % % _既に登った階段 = [], % _現在の段 = 0, % _残りの階段 = [1,2,3,4,5,6,7]; % _既に登った階段 = [0,1,2], % _現在の段 = 3, % _残りの階段 = [4,5,6,7]; % _既に登った階段 = [0,1,2,3,4,5], % _現在の段 = 6, % _残りの階段 = [7]; % no. % ?- % % 以下のサイトは # # @ft4613_ac # if(n段上れる)step_1(N-n,S) みたいな再帰がかけない # 階段を上がる(_n段上がる,_階段,_既に登った階段,_現在の段,_残りの階段) :- length(_駆け上がり段数ならび,_n段上がる), length(_階段,_階段の段数), length([_最初の段|_残り段数の変数ならび],_階段の段数), 階段を上がる(_駆け上がり段数ならび,_残り段数の変数ならび,_階段,_既に登った階段,_現在の段,_残りの階段). 階段を上がる(_,_残りの階段,_階段,_既に登った段,_現在の段,_残りの階段) :- append(_既に登った階段,[_現在の段|_残りの階段],_階段). 階段を上がる(_駆け上がり段数ならび,_残り段数の変数ならび,_階段,_既に登った階段,_現在の段,_残りの階段) :- append(_駆け上がり段数ならび,_駆け上がった後の残り段数の変数ならび,_残り段数の変数ならび), 階段を上がる(_駆け上がり段数ならび,_駆け上がった後の残り段数の変数ならび,_階段,_既に登った階段,_現在の段,_残りの階段). % % ?- 階段を上がる(3,[0,1,2,3,4,5,6,7],_既に登った階段,_現在の段,_残りの階段). % % _既に登った階段 = [], % _現在の段 = 0, % _残りの階段 = [1,2,3,4,5,6,7]; % _既に登った階段 = [0,1,2], % _現在の段 = 3, % _残りの階段 = [4,5,6,7]; % _既に登った階段 = [0,1,2,3,4,5], % _現在の段 = 6, % _残りの階段 = [7]; % no. % ?- % % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 色(赤). 色(青). 色(緑). 塗り分けならび(_塗り分けならび) :- findall(_塗り分けならび,塗り分け(_塗り分けならび),_塗り分けならび). 全色塗り分けならび(_塗り分けならび) :- findall(_塗り分けならび,全色塗り分け(_塗り分けならび),_塗り分けならび). 塗り分け(_塗り分けならび) :- 領域名と色の対ならび(_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), 色検査(_塗り分けならび). 全色塗り分け(_塗り分けならび) :- 領域名と色の対ならび(_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), forall(member(_色,_色ならび),member([_,_色],_塗り分けならび)), 色検査(_塗り分けならび). 領域名と色の対ならび(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), 色ならび(_色ならび), 対ならびの形成(_領域名ならび,_色ならび,_塗り分けならび). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 色ならび(_色ならび) :- findall(_色,色(_色),_色ならび). 対ならびの形成(_領域名ならび,_色ならび,_塗り分けならび) :- length(_領域名ならび,Len), length(_塗り分けならび,Len), findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,_塗り分けならび,_色)), _塗り分けならび). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(_塗り分けならび) :- forall((member([A,C],_塗り分けならび),領域が隣接している(A,B)),\+(member([B,C],_塗り分けならび))). 領域が隣接している(A,A) :- 領域が孤立している,!,fail. 領域が隣接している(A,B) :- 隣接(A,B). 領域が孤立している. % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 全色塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(_塗り分けならび,Len), findall(_塗り分けならび,塗り分け(_領域名ならび,_色ならび,_塗り分けならび),_塗り分けならび). 塗り分け(_領域名ならび,_色ならび,_塗り分けならび) :- 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), 色検査(_塗り分けならび). 全色塗り分け(_領域名ならび,_色ならび,_塗り分けならび) :- 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), forall(member(_色,_色ならび),member([_,_色],_塗り分けならび)), 色検査(_塗り分けならび). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび) :- findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,_塗り分けならび,_色)), _塗り分けならび). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(_塗り分けならび) :- forall((member([A,C],_塗り分けならび),隣接(A,B)),\+(member([B,C],_塗り分けならび))). % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 全色塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 塗り分け(_領域名ならび,_色ならび,LL) :- 領域名と色の対ならび(_領域名ならび,_色ならび,LL), 色を割り振る(_色ならび,LL), 色検査(LL). 全色塗り分け(_領域名ならび,_色ならび,LL) :- 領域名と色の対ならび(_領域名ならび,_色ならび,LL), 色を割り振る(_色ならび,LL), forall(member(_色,_色ならび),member([_,_色],LL)), 色検査(LL). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 領域名と色の対ならび(_領域名ならび,_色ならび,LL) :- findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,LL,_色)), LL). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(L) :- forall((member([A,C],L),隣接(A,B)),\+(member([B,C],L))). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数,true,_個数), length(Ln,_個数), '1234567890を繰り返し表示する'(Ln,'1234567890',0). '1234567890を繰り返し表示する'([],_,_). '1234567890を繰り返し表示する'([_|Ln],_文字列,_取り出し位置) :- sub_atom(_文字列,_取り出し位置,1,_,_文字), write(_文字), 次の取り出し位置(_取り出し位置,_次の取り出し位置), '1234567890を繰り返し表示する'(Ln,_文字列,_次の取り出し位置). 取り出し位置の更新(9,0) :- !. 取り出し位置の更新(_取り出し位置,_次の取り出し位置) :- _次の取り出し位置 is _取り出し位置 + 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- '表示する数字は読み込まれた整数値の個数とする。'(_個数), length(Ln2,_個数), '1234567890を繰り返し表示する'([],_個数). '1234567890を繰り返し表示する'(Ln,Ln2) :- append(Ln,_,Ln2), 表示する([_,_,_,_,_,_,_,_,_,_],'1234567890'), '1234567890を繰り返し表示する'([_,_,_,_,_,_,_,_,_,_|Ln],Ln2). '1234567890を繰り返し表示する'(Ln,_) :- 表示する(Ln,'1234567890'). '表示する数字は読み込まれた整数値の個数とする。'(_個数) :- 整数を得る(整数値,true,_個数). 表示する(Ln,_文字列) :- length(Ln,Len), sub_atom(_文字列,0,Len,_,_副文字列), write(_副文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数値,true,_個数), length(Ln,_個数), '文字列を繰り返し表示する。'(Ln,'1234567890'). '文字列を繰り返し表示する。'([_,_,_,_,_,_,_,_,_,_|Ln],_文字列) :- write(_文字列), '文字列を繰り返し表示する。'(Ln,_文字列). '文字列を繰り返し表示する。'(Ln,_文字列) :- length(Ln,_個数), sub_atom(_文字列,0,_個数,_,_表示副文字列), write(_表示副文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数値,true,_個数), length(Ln,_個数), '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。'(Ln). '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。'([_,_,_,_,_,_,_,_,_,_|Ln]) :- write('1234567890'), '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。'(Ln). '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。'(Ln) :- length(Ln,_個数), sub_atom('1234567890',0,_個数,_,_表示文字列), writef('%t',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数,true,_個数), length(L,_個数), '1234567890を繰り返し'(L), 表示する(L). '1234567890を繰り返し'([1,2,3,4,5,6,7,8,9,0|R]) :- '1234567890を繰り返し'(R). '1234567890を繰り返し'(L) :- append(L,_,[1,2,3,4,5,6,7,8,9,0]). 表示する(L) :- atomic_list_concat(L,A), writef('%t',[A]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数,true,_個数), length(Ln,_個数), '1234567890を繰り返し表示する'(Ln,[]). '1234567890を繰り返し表示する'([],_). '1234567890を繰り返し表示する'(Ln,[]) :- '1234567890を繰り返し表示する'(Ln,[1,2,3,4,5,6,7,8,9,0]). '1234567890を繰り返し表示する'([_|Ln],[N|R]) :- write(N), '1234567890を繰り返し表示する'(Ln,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数,true,_個数), length(Ln,_個数), '1234567890を繰り返し表示する'(Ln,'1234567890'). '1234567890を繰り返し表示する'([],_). '1234567890を繰り返し表示する'([_|Ln],_文字列) :- 文字列の回転(_文字列,_先頭文字,_回転した文字列), write(_先頭文字), '1234567890を繰り返し表示する'(Ln,_回転した文字列). 文字列の回転(_文字列,_先頭文字,_回転した文字列) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,1,_,0,_二文字目以降文字列), atom_concat(_二文字目以降文字列,_先頭文字,_回転した文字列), % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数,true,_個数), length(Ln,_個数), '1234567890を繰り返し表示する'(Ln,[1,2,3,4,5,6,7,8,9,0]). '1234567890を繰り返し表示する'([],_). '1234567890を繰り返し表示する'([_|Ln],[N|R]) :- write(N), append(R,[N],L1), '1234567890を繰り返し表示する'(Ln,L1). % 以下のサイトは # 出典:: 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([]. % 以下のサイトは # 出典::c言語の宿題片付けます 164代目 #823 # [1] 授業単元: C # [2] 問題文(含コード&リンク): # [3] 環境 #  [3.1] 7 #  [3.2] gcc #  [3.3] C # [4] 期限: 明日まで # [5] その他の制限:a[]など配列は使わない。 # # # # リスト構造で名簿を作っているんですが、標準入力から名前を常に先頭に # 入れるという処理を10回繰り返しても10個とも全部最後に入力した名前に # なってしまいます・・・どうしてでしょうか? # 山田 田中 佐藤 鈴木 村上 # 山本 裏山 田山 小島 島々 # # これだけの名前を先頭から順番に入れて, # printf("%s",P.first->name); # printf("%s",P.first->->next->name); # printf("%s",P.first->->next->next->name); # ・ # ・ # 10個とも島々になってしまいます・・・何故でしょうか? # 一番簡単なリスト構造で先頭に入れるプログラム作っていただきませんか? # ちなみにPはfirstを含む構造体です。firstは構造体NAMEへのポインタで、 # 最初first=NULLです。 name,nextはNAMEのメンバーです。 # 'リスト構造で名簿を作っているんですが、標準入力から名前を常に先頭に 入れるという処理を10回繰り返しても10個とも全部最後に入力した名前に なってしまいます'(L) :- 'リスト構造で名簿を作っているんですが、標準入力から名前を常に先頭に 入れるという処理を10回繰り返しても10個とも全部最後に入力した名前に なってしまいます'([],L). 'リスト構造で名簿を作っているんですが、標準入力から名前を常に先頭に 入れるという処理を10回繰り返しても10個とも全部最後に入力した名前に なってしまいます'(L,L) :- length(L,10),!. 'リスト構造で名簿を作っているんですが、標準入力から名前を常に先頭に 入れるという処理を10回繰り返しても10個とも全部最後に入力した名前に なってしまいます'(L1,L) :- get_line(Line), 'リスト構造で名簿を作っているんですが、標準入力から名前を常に先頭に 入れるという処理を10回繰り返しても10個とも全部最後に入力した名前に なってしまいます'([Line|L1],L). % 以下のサイトは # # 子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。 # このとき、考え得る階段の上がり方が何通りあるか求めるメソッドを実装してください。 '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方が何通りあるか求める。'(_n,_何通り) :- length(Ln,_n), 度数('子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'([],Ln,L),_何通り). '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(L,L,[]). '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_前回までに登った段,Ln,[_一歩で何段|_残りの段]) :- append(_前回までに登った段,[_|_],Ln), '一歩で1段、2段、もしくは3段を登ることができます'(_前回までに登った段,_一歩で何段,_登った段), '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_登った段,Ln,_残りの段). '一歩で1段、2段、もしくは3段を登ることができます'(_前回までに登った段,_一歩で何段,_登った段) :- member(_一歩で何段,[[_],[_,_],[_,_,_]]), append(_前回までに登った段,_一歩で何段,_登った段). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは # 子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。 # このとき、考え得る階段の上がり方が何通りあるか求めるメソッドを実装してください。 '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方が何通りあるか求める。'(_n,_何通り) :- 度数('子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(0,_n,L),_何通り). '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_n,_n,[]). '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_前回までに登った段段,_n,[_一歩で何段|_残りの段]) :- _前回までに登った段 < _n, '一歩で1段、2段、もしくは3段を登ることができます'(_前回までに登った段,_一歩で何段,_登った段), '子供がn段の階段を駆け上がりますが、一歩で1段、2段、もしくは3段を登ることができます。このとき、考え得る階段の上がり方。'(_登った段,_n,_残りの段). '一歩で1段、2段、もしくは3段を登ることができます'(_前回までに登った段,_一歩で何段,_登った段) :- member(_一歩で何段,[1,2,3]), _登った段 is _前回までに登った段 + _一歩で何段. 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは # 出典:: 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だけで表現するという主題がある。 % % 以下のサイトは # お題:表計算ソフトで使われる列名 A,B,C,...,Z,AA,AB,AC,...,AZ,BA,BB,BC,... # をAを1番目とした番号に変換せよ '表計算ソフトで使われる列名 A,B,C,...,Z,AA,AB,AC,...,AZ,BA,BB,BC,...をAを1番目とした番号に変換せよ'(_列名,_番号) :- atom_codes(_列名,_文字コードならび), 順序番号に変換する(_文字コードならび,_番号). 順序番号に変換する([],0). 順序番号に変換する([_文字番号|_残りならび],_番号) :- length(_残りならび,_乗), 順序番号に変換する(_残りならび,_番号_1), _番号 is (_文字番号 - 64) * (26 ^ _乗) + _番号_1. % 以下のサイトは # # 働き蟻の8割はまともだが2割は馬鹿、しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという # 結論:駆除しても無駄 # # '働き蟻の8割はまともだが2割は馬鹿、しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという'(_働き蟻,_駆除対象の馬鹿,_まともな働き蟻) :- '働き蟻の8割はまともだが2割は馬鹿'(_働き蟻,_駆除対象の馬鹿_1,_まともな働き蟻_1), 'しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという'(_駆除対象の馬鹿_1,_まともな働き蟻_1,_駆除対象の馬鹿,_まともな働き蟻). 'しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという'(_駆除対象の馬鹿,_まともな働き蟻,_駆除対象の馬鹿,_まともな働き蟻). 'しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという'(_,_まともな働き蟻,_駆除対象の馬鹿,_まともな働き蟻) :- '2割が新しく馬鹿になる'(_まともな働き蟻,_2割が新しく馬鹿になった働き蟻), '働き蟻の8割はまともだが2割は馬鹿、しかもその2割を駆除すると残りの8割の中の2割が新しく馬鹿になるという'(_2割が新しく馬鹿になった働き蟻,_駆除対象の馬鹿,_まともな働き蟻). '働き蟻の8割はまともだが2割は馬鹿'(_働き蟻,_駆除対象の馬鹿,_まともな働き蟻) :- 働き蜂の個体数(_働き蜂,_働き蜂の個体数), 馬鹿順に整列する(_働き蟻,_馬鹿順に整列した働き蟻), 働き蟻の8割はまともだが(_馬鹿順に整列した働き蟻,_働き蟻の個体数,_まともな働き蟻), '2割は馬鹿'(_馬鹿順に整列した働き蟻,_働き蟻の個体数,_駆除対象の馬鹿). 働き蟻の8割はまともだが(_馬鹿順に整列した働き蟻,_働き蟻の個体数,_まともな働き蟻) :- _働き蟻の8割の個体数 is truncate(_働き蟻の個体数 * 0.8 + 0.49), length(_まともな働き蟻,_働き蟻の8割の個体数), append(_,_まともな働き蟻,_馬鹿順に整列した働き蟻). '2割は馬鹿'(_馬鹿順に整列した働き蟻,_働き蟻の個体数,_駆除対象の馬鹿) :- _働き蟻の2割の個体数 is truncate(_働き蟻の個体数 * 0.2 + 0.51), length(_駆除対象の馬鹿,_働き蟻の2割の個体数), append(_駆除対象の馬鹿,_,_馬鹿順に整列した働き蟻). 働き蟻の個体数(_働き蟻,_働き蟻の個体数) :- length(_働き蟻,_働き蟻の個体数). 馬鹿順に整列する(_働き蟻,_働き蟻) :- 馬鹿とまともな働き蟻とは実は差がない. 馬鹿とまともな働き蟻とは実は差がない. '2割が新しく馬鹿になる'(_まともな働き蟻,_2割が新しく馬鹿になった働き蟻) :- _まともな働き蟻 = _2割が新しく馬鹿になった働き蟻. % 以下のサイトは # # 要素数がn個以上のならび # n個以上のならび(_n,_n個以上のならび,_n個のならび,_残りならび) :- length(_n個のならび,_n), append(_n個のならび,_残りならび,_n個以上のならび). n個以上のならび(_n,_n個以上のならび,_残りならび) :- length(_n個のならび,_n), append(_n個のならび,_残りならび,_n個以上のならび). n個以上のならび(_n,_n個以上のならび) :- length(_n個のならび,_n), append(_n個のならび,_,_n個以上のならび). % 以下のサイトは # # 要素が高々n個のならびの定義 # 高々n個のならび(_n,_ならび) :- length(L,_n), append(_ならび,_,L). % 以下のサイトは # 無題 投稿者:774 投稿日:2013/04/16(Tue) 17:04 No.6 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 一次配列を指定した数参照(例だと3つ),配列の終わりに到達したら,最初に戻る. # これを数回繰り返すプログラム(例1) # また,例1で特定の条件を満たす場合,次回はその条件を満たした配列の次からスタート. # ※例2:条件を満たす数が複数含まれている場合,後ろを優先 # 例1 # a[4]={1,2,3,4,5} # 回数3 # 1回目 a[0]=1,a[1]=2,a[2]=3 # 2回目 a[3]=4,a[4]=5,a[0]=1 # 3回目 a[1]=2,a[2]=3,a[3]=4 # # 例2 # 条件:2の倍数→2と4 # a[5]={1,2,3,4,5,6} # 回数5 # 1回目 a[0]=1,a[1]=2,a[2]=3 # ※a[1]が条件を満たすので,次回はa[2]から # 2回目 a[2]=3,a[3]=4,a[4]=5 # ※a[3]が条件を満たすので,次回はa[4]から # 3回目 a[4]=5,a[5]=6,a[0]=1 # 4回目 a[1]=2,a[2]=3,a[3]=4 # ※a[1],a[3]が条件を満たすので,次回はa[4]から # 5回目 a[4]=5,a[5]=6,a[0]=1 # # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン:gcc v3.3 #  [3.3] 言語:C # [4] 期限: 4/18 # [5] その他の制限:stdio.h stdlib.hのみ # わかりにくい問題でごめんなさい。ヒントだけでもよろしくお願いします。 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(_参照) :- 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,_参照), Ln = [],!. 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,_参照) :- ならびを入力する(_ならび), 繰り返し回数を入力する(_回数,_限界回数L), 参照限界数を入力する(_参照限界数,_参照限界数L), 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([],_参照限界数L,[],_回数L,_ならび,_ならび,[],_参照), _回数L = _限界回数L. ならびを入力する(_ならび) :- write('ならびを項として入力してください(ピリオドで終わる) : '), read(_ならび). 繰り返し回数を入力する(_回数,Ln) :- 整数を得る(繰り返し回数,_回数 > 0,_回数), length(Lmax,_回数). 参照限界数を入力する(_参照限界数,Lmax) :- 整数を得る(参照限界数,_参照限界数 > 0,_参照限界数), length(Ln,_参照限界数). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Lmax,Lmax,_回数L,_回数L,_,_,L1,L) :- reverse(L1,L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Lmax,Lmax,_回数L_1,_回数L,_ならび_1,_ならび,L1,L) :- 次の開始ならびを決める(L1,_ならび,_ならび_2), 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([],Lmax,[_|_回数L_1],_回数L,_ならび_2,_ならび,[],L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,[],_ならび,L1,L) :- 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,_ならび,_ならび,L1,L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,[_値|R1],_ならび,L1,L) :- 参照位置を得る([_値|R1],_ならび,_参照位置), 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([_|Ln],Lmax,_回数L_1,_回数L,R1,_ならび,[[_参照位置,_値]|R2],L). 参照位置を得る(L1,_ならび,N) :- append(L0,L1,_ならび), length(L0,N),!. 次の開始ならびを決める(L1,_ならび,_ならび_2) :- 値が偶数でそれより後にリセットされていない(L1,_nth0,_値,L0), length(L0_1,_nth0), append([_|L0_1],_ならび_2,_ならび),!. 次の開始ならびを決める(L1,_,L1). 値が偶数でそれより後にリセットされていない(L1,_nth0,_値,L0) :- append(L0,[[_nth0,_値]|R],L1), 偶数(_値), \+(member([0,_],L0)),!. 偶数(_値) :- 0 is _値 mod 2. % 以下のサイトは # 無題 投稿者:774 投稿日:2013/04/16(Tue) 17:04 No.6 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 一次配列を指定した数参照(例だと3つ),配列の終わりに到達したら,最初に戻る. # これを数回繰り返すプログラム(例1) # また,例1で特定の条件を満たす場合,次回はその条件を満たした配列の次からスタート. # ※例2:条件を満たす数が複数含まれている場合,後ろを優先 # 例1 # a[4]={1,2,3,4,5} # 回数3 # 1回目 a[0]=1,a[1]=2,a[2]=3 # 2回目 a[3]=4,a[4]=5,a[0]=1 # 3回目 a[1]=2,a[2]=3,a[3]=4 # # 例2 # 条件:2の倍数→2と4 # a[5]={1,2,3,4,5,6} # 回数5 # 1回目 a[0]=1,a[1]=2,a[2]=3 # ※a[1]が条件を満たすので,次回はa[2]から # 2回目 a[2]=3,a[3]=4,a[4]=5 # ※a[3]が条件を満たすので,次回はa[4]から # 3回目 a[4]=5,a[5]=6,a[0]=1 # 4回目 a[1]=2,a[2]=3,a[3]=4 # ※a[1],a[3]が条件を満たすので,次回はa[4]から # 5回目 a[4]=5,a[5]=6,a[0]=1 # # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン:gcc v3.3 #  [3.3] 言語:C # [4] 期限: 4/18 # [5] その他の制限:stdio.h stdlib.hのみ # わかりにくい問題でごめんなさい。ヒントだけでもよろしくお願いします。 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(_参照) :- 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,_参照), Ln = [],!. 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,_参照) :- ならびを入力する(_ならび), 繰り返し回数を入力する(_回数,_限界回数L), 参照限界数を入力する(_参照限界数,_参照限界数L), 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([],_参照限界数L,[],_回数L,_ならび,_ならび,[],_参照), _回数L = _限界回数L. ならびを入力する(_ならび) :- write('ならびを項として入力してください(ピリオドで終わる) : '), read(_ならび). 繰り返し回数を入力する(_回数,Ln) :- 整数を得る(繰り返し回数,_回数 > 0,_回数), length(Lmax,_回数). 参照限界数を入力する(_参照限界数,Lmax) :- 整数を得る(参照限界数,_参照限界数 > 0,_参照限界数), length(Ln,_参照限界数). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Lmax,Lmax,_回数L,_回数L,_,_,L1,L) :- reverse(L1,L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Lmax,Lmax,_回数L_1,_回数L,_ならび_1,_ならび,L1,L) :- 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([],Lmax,[_|_回数L_1],_回数L,_ならび_1,_ならび,[],L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,[],_ならび,L1,L) :- 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,_ならび,_ならび,L1,L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,[A|R1],_ならび,L1,L) :- 参照位置を得る([A|R1],_ならび,_参照位置), 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([_|Ln],Lmax,_回数L_1,_回数L,R1,_ならび,[[_参照位置,A]|R2],L). 参照位置を得る(L1,_ならび,_参照位置) :- append(L0,L1,_ならび), length(L0,_参照位置),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364009659/125 # # # 質問、 # ave関数でなぜかIntが返されます。[1.0, 2.0, 3.0]ならばsumはで、lengthは3なので戻りは1.0のはずなのですが。 # # value :: [Float] -> [Float] # value [] = [] # value (x:xs) = case (ave (x:xs) /= 0) of # True -> (x/ave (x:xs)) : value xs # False -> [] # # ave :: [Float] -> Float # ave (x:xs) = (sum (x:xs)) / (fromIntegral (length (x:xs))) # ave [] = 0 # value([_x|_xs],[_y|_ys]) :- ave([_x|_xs],_ave), \+(_ave = 0.0), value(_xs,_ys), _y is _x / _ave,!. value(_,[]). ave([_x|_xs],_ave) :- sum([_x|_xs],_sum), length([_x|_xs],_length), _ave is _sum / _length. sum([],0). sum([M|R],S) :- sum(R,S_1), S is M + S_1. % 以下のサイトは nth1_split(_nth1,_文字列,_区切り文字,_副文字列) :- split(_文字列,[_区切り文字],_,L2), nth1(_nth1,L2,_副文字列). split('',_,[],[]) :- !. split(_文字列,_区切り文字列ならび,[_区切り文字列|R3],[_副文字列|R4]) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列), split(_残り文字列,_区切り文字列ならび,R3,R4). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), atom_length(_区切り文字列,_長さ), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/905 # # [1]c++ # [2]2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。 # また、対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。 # ただし、対角要素は左上隅から右下隅への対角線上の要素とする。次の図は実行例であ る。 # --- (2)配列nの内容 --- # # 100000000 # 010000000 # 001000000 # 000100000 # 000010000 # 000001000 # 000000100 # 000000010 # 000000001 '2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。' :- '2次元配列n[10][10]のすべての要素に1を代入してから'(LL), 'その内容を表示しなさい。'(LL). '2次元配列n[10][10]のすべての要素に1を代入してから'(LL) :- findall(_行,( '10行ある', '10要素の行のすべての要素に1を代入'(_行)),LL). '10行ある' :- between(1,10,_). '10要素の行のすべての要素に1を代入'(_行) :- '10要素の行の'(_行), すべての要素に1を代入(_行). '10要素の行の'(_行) :- length(_行,10). すべての要素に1を代入([]). すべての要素に1を代入([1|R]) :- すべての要素に1を代入(R). 'その内容を表示しなさい。'(LL) :- 表示しなさい(LL). 表示しなさい(LL) :- forall(行を表示文字列に変換する(LL,_表示文字列),writef('%w\n',[_表示文字列])). 行を表示文字列に変換する(LL,_表示文字列) :- member(_行,LL), atomic_list_concat(_行,' ',_表示文字列). '対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。' :- 対角要素だけ1を代入しほかは全て0を代入してから(LL), 表示しなさい(LL). 対角要素だけ1を代入しほかは全て0を代入してから(LL) :- findall(L,( between(1,10,_n), 対角要素だけ1を代入しほかは全て0を代入(_n,L)),LL). 対角要素だけ1を代入しほかは全て0を代入(_n,L) :- 対角要素だけ1を代入し(_n,L), 他の全ての変数要素は0に(L). 対角要素だけ1を代入し(_n,L) :- length(L,10), reverse(L,RL), 対角要素だけ1を代入し(_n,RL,L). 対角要素だけ1を代入し(_n,RL,L) :- nth1(_n,L,1), nth1(_n,RL,1). 他の全ての変数要素は0に(L) :- findall(N,( member(N,L), 変数要素は0に(N)),L). 変数要素は0に(0) :- !. 変数要素は0に(N). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1363522503/91 # # Youtubeみたいなランダムでユニークなn文字数の文字列を作る方法を教えてください 選択可能文字リスト( ['0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). 'Youtubeみたいなランダムでユニークなn文字数の文字列を作る'(_n,_ランダムでユニークなn文字数の文字列) :- findall(_ランダムでユニークな文字,~( ランダムでユニークな文字(_n,_ランダムでユニークな文字)), _ランダムでユニークなn文字数の文字リスト). atom_chars(_ランダムでユニークなn文字数の文字列,_ランダムでユニークなn文字数の文字リスト). ランダムでユニークな文字(_n,_ランダムでユニークな文字) :- length(Ln,_n), 選択可能文字リスト(_選択可能文字リスト), ランダムでユニークな文字_1(Ln,_選択可能文字リスト,_ランダムでユニークな文字). ランダムでユニークな文字_1([_|Ln],_選択可能文字リスト,_ランダムでユニークな文字) :- リストからランダムに値を抜き取る(_選択可能文字リスト,_文字_1,_選択文字を抜き取った選択可能文字リスト), ランダムでユニークな文字_2([_|Ln],_文字_1,_選択文字を抜き取った選択可能文字リスト,_ランダムでユニークな文字). ランダムでユニークな文字_2([_|Ln],_文字,_,_文字). ランダムでユニークな文字_2([_|Ln],_,_選択文字を抜き取った選択可能文字リスト,_文字) :- ランダムでユニークな文字(Ln,_選択文字を抜き取った選択可能文字リスト,_文字). リストからランダムに値を抜き取る(_リスト,_値,_値を抜き取ったリスト) :- 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト), リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト). 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト) :- length(_リスト,_要素数), _乱数値 is random(_要素数), length(_乱数値を要素数とした変数リスト,_乱数値). リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト) :- append(_乱数値を要素数とした変数リスト,[_値|_残りリスト],_リスト), append(_乱数値を要素数とした変数リスト,_残りリスト,_値を抜き取ったリスト). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1363522503/91 # # Youtubeみたいなランダムでユニークなn文字数の文字列を作る方法を教えてください 選択可能文字リスト( ['0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). 'Youtubeみたいなランダムでユニークなn文字数の文字列を作る'(_n,_ランダムでユニークなn文字数の文字列) :- length(Ln,_n), 選択可能文字リスト(_選択可能文字リスト), ランダムでユニークなn要素の文字リストを作る(Ln,_選択可能文字リスト,_ランダムでユニークなn文字数の文字リスト), atom_chars(_ランダムでユニークなn文字数の文字列,_ランダムでユニークなn文字数の文字リスト). ランダムでユニークなn要素の文字リストを作る([],_,[]). ランダムでユニークなn要素の文字リストを作る([_|Ln],_選択可能文字リスト,[_選択値|R]) :- リストからランダムに値を抜き取る(_選択可能文字リスト,_選択値,_選択値を抜き取った選択可能文字リスト), ランダムでユニークなn要素の文字リストを作る(Ln,_選択値を抜き取った選択可能文字リスト,R). リストからランダムに値を抜き取る(_リスト,_値,_値を抜き取ったリスト) :- 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト), リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト). 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト) :- length(_リスト,_要素数), _乱数値 is random(_要素数), length(_乱数値を要素数とした変数リスト,_乱数値). リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト) :- append(_乱数値を要素数とした変数リスト,[_値|_残りリスト],_リスト), append(_乱数値を要素数とした変数リスト,_残りリスト,_値を抜き取ったリスト). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/727 # # [1] 授業単元: 暇つぶし # [2] 問題文:迷路を解くプログラム。 #  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 # ----- ここからテキスト ----- # 5 5 # sxrrr # rxrrr # rrrxr # rrxgr # ----- ここまでテキスト ----- #  テキストの1行目は順番に迷路の横幅と縦幅を表します。 #  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。 #  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。 #  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 # 1 step # sxrrr # +xrrr # rrrxr # rrxgr # <中略> # 9 step # sxrrr # +x+++ # +++x+ # rrxg+ # '問題文:迷路を解くプログラム。  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 ----- ここからテキスト ----- 5 5 sxrrr rxrrr rrrxr rrxgr ----- ここまでテキスト -----  テキストの1行目は順番に迷路の横幅と縦幅を表します。  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 1 step sxrrr +xrrr rrrxr rrxgr <中略> 9 step sxrrr +x+++ +++x+ rrxg+ '(_テキスト) :- 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト). 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト) :- テキストを入力とし(_テキスト,LL1,LL2), スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順), '道を表示してください。'(_スタートからゴールまでの道順,LL1). スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順) :- スタートを探す(LL1,LL2,_スタートの行,_スタートの列), ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列), 隣に移動する(_スタートの行,_スタートの列,_ゴールの行,_ゴールの列,LL1,LL2,[],_スタートからゴールまでの道順). テキストを入力とし(_テキスト,LL1,LL2) :- get_lines(_テキスト,[_不要要素|_行ならび]), findall(_文字ならび,( member(_一行,_行ならび), atom_chars(_一行,_文字ならび)), LL1), 転置(LL1,LL2). スタートを探す(LL1,LL2,_スタートの行,_スタートの列) :- nth1(_スタートの行,LL1,L), nth1(_スタートの列,L,s). ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列) :- nth1(_ゴールの行,LL1,L), nth1(_ゴールの列,L,g). 隣に移動する(_ゴールの行,_ゴールの列,_ゴールの行,_ゴールの列,LL1,LL2,_,[[_ゴールの行,_ゴールの列]]). 隣に移動する(_行,_列,_ゴールの行,_ゴールの列,LL1,LL2,_履歴1,[[_行,_列]|R]) :- 移動可能な隣接点を得る(_行,_列,LL1,LL2,_隣の行,_隣の列), \+(member([_隣の行,_隣の列],_履歴1)), 隣に移動する(_隣の行,_隣の列,_ゴールの行,_ゴールの列,LL1,LL2,[[_行,_列]|_履歴1],R). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 列の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列) :- nth1(_行,LL1,L), length([_|L0],_列), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の列). 列の移動可能な隣接点(_行,_列,LL1,LL2,_隣の行,_隣の列) :- nth1(_列,LL2,L), length([_|L0],_行), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の行). 移動可能な隣接点(L0,R,_隣) :- last(L0,r), length(L0,_隣). 移動可能な隣接点(L0,R,_隣) :- R = [r|_], length([_,_|L0],_隣). '道を表示してください。'(_スタートからゴールまでの道順,LL) :- append(LL0,[[_行,_列]|RR],_スタートからゴールまでの道順), length([_|LL0],_ステップ), write('%t\n',[_ステップ]), '通過点を+に置換してLLを表示する'(_行,_列,LL), R = []. '通過点を+に置換してLLを表示する'(_行,_列,LL) :- append(L0,[L1|R],LL), length([_|L0],_行_1), 列の置換(_行_1,_行,_列,L1,L2), ならびを文字列に変換して表示(L2), R = []. 列の置換(_行,_行,_列,L1,L2) :- length([_|L0],_列), append(L0,[_|R],L1), append(L0,[+|R],L2),!. 列の置換(_,_,_,L,L). ならびを文字列に変換して表示(L) :- atomic_list_concat(L,S), writef('%t\n',[S]). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/117 # # コメント内の任意の文字を全て半角スペースに置き換える正規表現は可能でしょうか? # aaaは固定ではなく、長さや文字も任意です。 # 文字数分スペースに置き換える必要があります。 # # 変換前 # /*aaa*/ # # 変換後 # /* */ # # 'コメント内の任意の文字を全て半角スペースに置き換える正規表現は可能でしょうか? aaaは固定ではなく、長さや文字も任意です。 文字数分スペースに置き換える必要があります。 変換前 /*aaa*/ 変換後 /* */'(_文字列,_置換された文字列) :- コメント内の任意の文字を全て半角スペースに置き換える(_文字列,_置換された文字列). コメント内の任意の文字を全て半角スペースに置き換える(_文字列,_置換された文字列) :- sub_atom(_文字列,'/*','*/',_,_,_,S1,S2,S3,L1,L2,L3), sub_atom(S2,2,Len,2,_), length(L0,Len), all(L0,' '), atomic_list_concat([S1,'/*',L0,'*/',S3],_置換された文字列). % 以下のサイトは % ユーティリティ述語 sub_atom/10 の提案 % % A .. 文字列 (atom) % S .. 検索文字列開始変位 (integer) % L .. 検索文字列の長さ (integer) % R .. 残り長さ (integer) % H .. 検索文字列より前側の文字列 (atom) % X .. 検索文字列 (atom) % T .. 検索文字列より後の残り文字列 (atom) % HL .. 検索文字列より前側の文字ならび (chars) % XL .. 検索文字列文字ならび (chars) % TL .. 検索文字列より後の残り文字ならび (chars) % A がvarである時はH-HL,X-XL,T-TLの3組の中にvar-varの組があってはなりません。 sub_atom_12(A,W1,W2,S,L,R,H,X,T,HL,XL,TL) :- '文字列W1から始まりW2で終わる。W1,W2の間にW1,W2は現れない'(A,V,W,S,L,R,H,X,T,HL,XL,TL). '文字列W1から始まりW2で終わる。W1,W2の間にW1,W2は現れない'(A,W1,W2,S,L,R,H,X,T,HL,XL,TL) :- sub_atom(A,S,L,R,H,X,T,HL,XL,TL), 文字列W1から始まりW2で終わる(X,W1,W2,S1,S2), 'W1,W2の間の文字列にW1,W2は現れない'(X,S1,S2,W1,W2). 文字列W1から始まりW2で終わる(X,W1,W2,S1,S2) :- sub_atom(X,0,S1,_,W1), sub_atom(X,S2,_,0,W2). 'W1,W2の間の文字列にW1,W2は現れない'(X,W1,W2,S1,S2) :- sub_atom(X,S1,_,S2,_W1とW2の間の文字列), \+(sub_atom(_W1とW2の間の文字列,_,_,_,W1)), \+(sub_atom(_W1とW2の間の文字列,_,_,_,W2)). count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- atom(A), !, sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), N is S + L, sub_atom(A,N,R,_,T), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- var(A), !, atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL), length(HL,S), length(XL,L), length(TL,R), concat_atom([H,X,T],A), sub_atom(A,S,L,R,H,X,T,HL,XL,TL). % 以下のサイトは # # ある専門学校の受験資格のデシジョンテーブル # # <条件> 1 2 3 4 5 6 7 8 # # 体重が軽い N N N N Y Y Y Y # 体が柔らかい N N Y Y N Y N Y # 敏捷である N Y Y N N N Y Y # # <行動> # # 受験資格がある X # 受験資格がない X X X X X X X 体重が軽い(偽,偽,偽,偽,真,真,真,真). 体が柔らかい(偽,偽,真,真,偽,真,偽,真). 敏捷である(偽,真,真,偽,偽,偽,真,真). 受験資格がある(偽,偽,偽,偽,偽,偽,偽,真). 受験資格がない(真,真,真,真,真,真,真,偽). デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_行動述語名ならび,_nth1,_行動ならび) :- デシジョンテーブル引数を取得して転置する(_アリティ,_条件述語名ならび,LL2), nth1(_nth1,LL2,_真偽値ならび), 行動述語から行動ならびを得る(_アリティ,_nth1,_行動述語名ならび,_行動ならび). デシジョンテーブル引数を取得して転置する(_アリティ,_条件述語名ならび,LL2) :- findall(_引数ならび,( member(_条件述語名,_条件述語名ならび), length(_引数ならび,_アリティ), P =.. [_条件述語名|_引数ならび], call(P)), LL2), 転置(LL1,LL2). 行動述語から行動ならびを得る(_アリティ,_nth1,_行動述語名ならび,_行動ならび) :- findall(_行動,( '行動述語の_nth1引数を得る'(_アリティ,_nth1,_行動述語名ならび,_行動)), _行動ならび). '行動述語の_nth1引数を得る'(_アリティ,_nth1,_行動述語名ならび,_行動) :- member(_行動述語名,_行動述語名ならび), length(L,_アリティ), P =.. [_行動述語名|L], call(P), nth1(_nth1,L,_行動). 転置([],[],[]):- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]):- 転置(R2,R3,R4). 転置([[]|_],[]):- !. 転置(L,[L1|R2]):- 転置(L,L2,L1), 転置(L2,R2) . % % ?- デシジョンテーブル(8,[体重が軽い,体が柔らかい,敏捷である],[真,偽,真],[受験資格がある],_nth1,_行動ならび). % % _nth1 = 7, % _行動ならび = [偽] % % 以下のサイトは # # ある専門学校の受験資格のデシジョンテーブル # # <条件> 1 2 3 4 5 6 7 8 # # 体重が軽い N N N N Y Y Y Y # 体が柔らかい N N Y Y N Y N Y # 敏捷である N Y Y N N N Y Y # # <行動> # # 受験資格がある X # 受験資格がない X X X X X X X 体重が軽い(偽,偽,偽,偽,真,真,真,真). 体が柔らかい(偽,偽,真,真,偽,真,偽,真). 敏捷である(偽,真,真,偽,偽,偽,真,真). 受験(諦める,諦める,ダイエットして来年受験する,諦める,諦める,諦める,ヨガに一年通ってから受験する,受験してみる). デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_行動述語名ならび,_選択列,_行動ならび) :- デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_選択列), findall(_行動,( '行動述語の_選択列引数を得る'(_アリティ,_選択列,_行動述語名ならび,_行動)), _行動ならび). デシジョンテーブル(_,[],_,_選択列). デシジョンテーブル(_アリティ,[_述語名|R1],[_真偽値|R2],_選択列) :- 条件述語を実行する(_アリティ,_述語名,_真偽値ならび), nth1(_選択列,_真偽値ならび,_真偽値), デシジョンテーブル(_アリティ,R1,R2,_選択列). 条件述語を実行する(_アリティ,_述語名,_真偽値ならび) :- length(_真偽値ならび,_アリティ), P =.. [_述語名|_真偽値ならび], call(P). '行動述語の_選択列引数を得る'(_アリティ,_選択列,_行動述語名ならび,_行動) :- member(_行動述語名,_行動述語名ならび), 行動述語名の行動ならびを得る(_アリティ,_行動述語名,_行動選択ならび), nth1(_選択列,_行動選択ならび,_行動). 行動述語名の行動選択ならびを得る(_アリティ,_行動述語名,_行動選択ならび) :- length(_行動選択ならび,_アリティ), P =.. [_行動述語名|_行動選択ならび], call(P). % % ?- デシジョンテーブル(8,[体重が軽い,体が柔らかい,敏捷である],[真,偽,真],[受験],_選択列,_行動ならび). % % _選択列 = 7, % _行動ならび = [ヨガに一年通ってから受験する] % % 以下のサイトは # # モンテカルロ法により円周率を求める # 試行限界数(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://toro.2ch.net/test/read.cgi/tech/1362715265/22 # '可変長のリストの入力に対して固定長のリストを出力したいのですが 足りない部分を先頭の要素から0で埋めようと思います'(_可変長リスト,_固定長リストの長さ) :- length(_固定長リスト,_固定長リストの長さ), append(_足りない部分のリスト,_可変長リスト,_固定長リスト), '0で埋める'(_足りない部分のリスト), write(_固定長リスト). '0で埋める'([]). '0で埋める'([0|_残りリスト]) :- '0で埋める'(_残りリスト). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362715265/18 # :- dynamic(todo/1). 'お題 こんな感じにコマンドラインで動くTODO管理アプリを作りなさい $ ./todo add "本屋でPythonの本を買ってくる" $ ./todo add "たいやきを買ってくる" $ ./todo list 1: 本屋でPythonの本を買ってくる 2: たいやきを買ってくる $ ./todo done 2 $ ./todo list 1: たいやきを買ってくる アドリブも可' :- todoを準備する, user_parameters(_パラメーター), 解析実行(_パラメーター), todoデータを保存する. 解析実行([add,_文字列]) :- assertz(todo(_文字列)),!. 解析実行([done,N]) :- 'N行目のtodoデータを削除する'(N). 解析実行([list]) :- 行番号を振ってtodoデータを表示する. 'N行目のtodoデータを削除する'(N) :- 一旦todoデータを削除しながらリストに取得し(L1), 'N番目の要素を削除して'(N,L1,L2), todoデータを定義し直す(L2). 一旦todoデータを削除しながらリストに取得し(L) :- findall(_データ,( retract(todo(_データ)), L). 'N番目の要素を削除して'(N,L1,L2) :- length([_|L0],N), append(L0,[_|R],L1), append(L0,R,L2). todoデータを定義し直す(L2) :- forall( member(_データ,L2), assertz(todo(_データ))). 行番号を振ってtodoデータを表示する :- findall(_データ,todo(_データ),L), forall(( nth1(No,L,_データ), writef('%t %t\n',[No,_データ]). todoデータを準備する :- reconsult('todo.pro'). todoデータを保存する :- tell('todo.pro'), listing(todo/1), told. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/140 # # [1] 授業単元: Cプロ # [2] 問題文(含コード&リンク): # 3行3列の行列aを入力後、余因子行列で行列値|a|を求める # '3行3列の行列aを入力後、余因子行列で行列値|a|を求める' :- '3行3列の行列aを入力'(_a), '余因子行列で行列値|a|を求める'(_a,_行列式_aの値), writef('行列値|a|は%tです。\n',[_行列式_aの値]). '3行3列の行列aを入力'(_a) :- length(_a,3), findall(L,( nth1(_nth1,_a,L), length(L,3), '3列入力する'(_nth1,1,L)), _a). '3列入力する'(_,_,[]). '3列入力する'(_行位置,_列位置,[V|R]) :- writef('列入力[%t][%t] : ',[_行位置,_列位置]), get_line(Line), atom_to_term(Line,V,_), _列位置_2 is _列位置 + 1, '3列入力する'(_行位置,_列位置_2,R). '余因子行列を使って逆行列を得る'(_n,_正方行列,_逆行列) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値), 余因子行列(_n,_正方行列,_余因子行列), 転置(_余因子行列,_転置された余因子行列), 行列のすべての要素に値を掛ける(1,_n,_転置された余因子行列,1 / _行列式の値,_逆行列). 行列のすべての要素に値を掛ける(_行目,_n,LL,_,LL) :- _行目 > _n,!. 行列のすべての要素に値を掛ける(_行目,_n,LL1,_乗数 / _除数,LL2) :- '行基本変形'(_乗数 / _除数 # _行目,LL1,LL3), _行目_2 is _行目 + 1, 行列のすべての要素に値を掛ける(_行目_2,_n,LL3,_乗数 / _除数,LL2). '余因子行列で行列値|a|を求める'(_a,_行列式_aの値) :- 余因子行列(_a,_余因子行列), _a = [_aの第一行|_], _余因子行列 = [_余因子行列の第一行|_], '二つのならびの積の和'(_aの第一行,_余因子行列の第一行,_行列式_aの値). '二つのならびの積の和'([],[],0). '二つのならびの積の和'([A|R1],[B|R2],S) :- '二つのならびの積の和'(R1,R2,S_1), S is S_1 + A * B. 余因子行列(_正方行列,_余因子行列) :- length(_正方行列,_n), 余因子行列(_n,_正方行列,_余因子行列). 余因子行列(_n,_正方行列,_余因子行列) :- length(_余因子行列,_n), findall(L,( nth1(_i,_余因子行列,L), 余因子行列の要素が余因子である(_n,_正方行列,_i,L)), _余因子行列). 余因子行列の要素が余因子である(_n,_正方行列,_i,L) :- length(L,_n), findall(_余因子,( nth1(_j,L,_余因子), 余因子(_n,_正方行列,_i,_j,_余因子)), L). 行列式の値(1,[[_]],1) :- !. 行列式の値(2,_正方行列,_行列式の値) :- 二つの対角要素の積の差を得る(_n,_正方行列,_行列式の値),!. 行列式の値(_n,_正方行列,_行列式の値) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値). 余因子(_n,_正方行列,_i,_j,_余因子) :- 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子). 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) :- '正方行列からi行j列を取り除いた行列式の値'(_n,_正方行列,_i,_j,_n_1次正方行列の行列式の値), 'i,jから乗数を得る'(_i,_j,_乗数), _余因子 is _乗数 * _n_1次正方行列の行列式の値. '正方行列からi行j列を取り除いた行列式の値'(_n,_正方行列,_i,_j,_n_1次正方行列の行列式の値) :- '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列), _n_1 is _n - 1, 行列式の値(_n_1,_n_1次正方行列,_n_1次正方行列の行列式の値). '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列) :- '第何行を取り除く'(_正方行列,_i,_第i行が取り除かれた行列), 転置(_第i行が取り除かれた行列,_転置された第i行が取り除かれた行列), '第何行を取り除く'(_転置された第i行が取り除かれた行列,_j,_転置された第i行第j列が取り除かれた行列), 転置(_転置された第i行第j列が取り除かれた行列,_n_1次正方行列). '第何行を取り除く'(_正方行列,_第何行,_第i行が取り除かれた行列) :- append(L0,[L|R],_正方行列), length([_|L0],_第何行), append(L0,R,_第i行が取り除かれた行列). 二つの対角要素の積の差を得る(0,[],1) :- !. 二つの対角要素の積の差を得る(1,[[N]],N) :- !. 二つの対角要素の積の差を得る(_n,_正方行列,_二つの対角要素の積の差) :- 二つの対角要素の積を得る(_正方行列,_右下がり対角要素の積,_右上がり対角要素の積), _二つの対角要素の積の差 is _右下がり対角要素の積 - _右上がり対角要素の積. 二つの対角要素の積を得る(_正方行列,_右下がり対角要素の積,_右上がり対角要素の積) :- 二つの対角要素を得る(_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび), 対角要素の掛算(_右下がり対角要素ならび,_右下がり対角要素の積), 対角要素の掛算(_右上がり対角要素ならび,_右上がり対角要素の積). 二つの対角要素を得る(_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび) :- 右下がり対角要素ならび(_正方行列,_右下がり対角要素ならび), 右上がり対角要素ならび(_正方行列,_右上がり対角要素ならび). 右下がり対角要素ならび(_正方行列,_右下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), nth1(_nth1,L,V)), _右下がり対角要素ならび). 右上がり対角要素ならび(_正方行列,_右上がり対角要素ならび) :- reverse(_正方行列,_行を逆転した正方行列), 右下がり対角要素ならび(_行を逆転した正方行列,_右上がり対角要素ならび). 左下がり対角要素ならび(_正方行列,_左下がり対角要素ならび) :- findall(V,( nth1(_nth1,_正方行列,L), length([_|R],_nth1), append(_,[V|R],L)), _左下がり対角要素ならび),!. 左上がり対角要素ならび(_正方行列,_左上がり対角要素ならび) :- reverse(_正方行列,_行を逆転した正方行列), 左下がり対角要素ならび(_行を逆転した正方行列,_左上がり対角要素ならび). 'i,jから乗数を得る'(_i,_j,(-1)) :- 1 is (_i + _j) mod 2,!. 'i,jから乗数を得る'(_i,_j,1) :- 0 is (_i + _j) mod 2,!. 対角要素の掛算([],1). 対角要素の掛算([A|R],X) :- 対角要素の掛算(R,Y), X is A * Y. 'n次正方行列の要素を行・列順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_i行), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素). 'n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_j列), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/567 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # 1から16777215までの整数を入力すると、それを小数点以下の桁数としたチャンパーノウン定数を表示するプログラムを作成せよ。 # 指定した桁数を超えて、あるいは満たずに表示させた場合は不正解とする。 # # 【入力例】 # 16 # 【出力例】 # 0.1234567891011121 # # '1から16777215までの整数を入力すると、それを小数点以下の桁数としたチャンパーノウン定数を表示するプログラムを作成せよ。 指定した桁数を超えて、あるいは満たずに表示させた場合は不正解とする。' :- '1から16777215までの整数を入力すると'(_整数), 'それを小数点以下の桁数としたチャンパーノウン定数を'(1,0,_整数,_チャンパーノウン定数), 表示する(_チャンパーノウン定数文字). '1から16777215までの整数を入力すると'(_整数) :- 整数を得る('1から16777215までの整数',(整数 > 0,_整数 =< 16777215),_整数). 'それを小数点以下の桁数としたチャンパーノウン定数を表示するプログラムを作成せよ。'(_整数,_チャンパーノウン定数) :- 'チャンパーノウン定数をならびとして作成'(1,0,_整数,_チャンパーノウン定数文字ならび), atomic_list_concat(['0','.'|_チャンパーノウン定数文字ならび],_チャンパーノウン定数). 'チャンパーノウン定数をならびとして作成'(_,_桁1,_限界桁,[]) :- _桁1 >= _限界桁,!. 'チャンパーノウン定数をならびとして作成'(N1,_桁1,_限界桁,R1) :- 'チャンパーノウン定数をならびとして作成'(N1,_桁数,_桁1,_限界桁,R1,R2). _桁2 is _桁1 + _桁数, N2 is N1 + 1, 'チャンパーノウン定数をならびとして作成'(N2,_桁2,_限界桁,R2). 'チャンパーノウン定数をならびとして作成'(N1,_桁数,_桁1,_限界桁,R1,R2) :- 追加文字ならび(N1,_桁数,_桁1,_限界桁,Chars), 'チャンパーノウン定数をならびとして作成'(Chars,R1,R2). 'チャンパーノウン定数をならびとして作成'([],R,R) :- !. 'チャンパーノウン定数をならびとして作成'([A|R1],[A|R2],R) :- 'チャンパーノウン定数をならびとして作成'(R1,R2,R). 追加文字ならび(N1,_桁数,_桁1,_限界桁,Chars) :- number_chars(N1,Chars1), length(Chars,_桁数), 追加文字ならび(_桁数,_桁1,_限界桁,Chars1,Chars),!. 追加文字ならび(_桁数,_桁1,_限界桁,Chars,Chars) :- _桁1 + _桁数 =< _限界桁,!. 追加文字ならび(_桁数,_桁1,_限界桁,Chars1,Chars) :- _桁2 is _限界桁 - _桁1, length(Chars,_桁2), append(Chars,R2,Chars1),!. 表示する(_チャンパーノウン定数文字) :- writef('%t',[_チャンパーノウン定数文字]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/651 # # 2010年度の月毎の件数をまとめたデータですが # 累計を求めたいです。 # # 月 2010年度 # 01 1 # 02 2 # 03 1 # 04 3 # 05 2 # 06 2 # 07 2 # 08 1 # 09 2 # 10 2 # 11 2 # 12 1 # # 求めたい結果 # 月 2010年度累計 # 04 3 # 05 5 # 06 7 # 07 9 # 08 10 # 09 12 # 10 14 # 11 16 # 12 17 # 01 18 # 02 20 # 03 21 # # これだけのデータから # スタートを4月にして累計を求める方法は # ありますでしょうか? # よろしくお願いします。 # '2010年度データ'('01',1). '2010年度データ'('02',2). '2010年度データ'('03',1). '2010年度データ'('04',3). '2010年度データ'('05',2). '2010年度データ'('06',2). '2010年度データ'('07',2). '2010年度データ'('08',1). '2010年度データ'('09',2). '2010年度データ'('10',2). '2010年度データ'('11',2). '2010年度データ'('12',1). '2010年度の月毎の件数をまとめたデータですが累計を求めたいです。'(_月,_累計件数) :- _月順序 = ['04','05','06','07','08','09','10','11','12','01','02','03'], findall(_件数,( member(_月,_月順序), '2010年度データ'(_月,_件数)), _月別件数), 累計表示(_月順序,_月別件数,_月,_累計件数). 累計表示(_月順序,_月別件数,_月,_累計件数) :- append(L1,[_件数|R],_月別件数), length(L1,_nth0), nth0(_nth0,_月順序,_月), sum([_件数|L1],_累計件数). sum([],0). sum([N|R],S) :- sum(R,S_1), S is S_1 + N. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/651 # # 2010年度の月毎の件数をまとめたデータですが # 累計を求めたいです。 # # 月 2010年度 # 01 1 # 02 2 # 03 1 # 04 3 # 05 2 # 06 2 # 07 2 # 08 1 # 09 2 # 10 2 # 11 2 # 12 1 # # 求めたい結果 # 月 2010年度累計 # 04 3 # 05 5 # 06 7 # 07 9 # 08 10 # 09 12 # 10 14 # 11 16 # 12 17 # 01 18 # 02 20 # 03 21 # # これだけのデータから # スタートを4月にして累計を求める方法は # ありますでしょうか? # よろしくお願いします。 # '2010年度データ'('01',1). '2010年度データ'('02',2). '2010年度データ'('03',1). '2010年度データ'('04',3). '2010年度データ'('05',2). '2010年度データ'('06',2). '2010年度データ'('07',2). '2010年度データ'('08',1). '2010年度データ'('09',2). '2010年度データ'('10',2). '2010年度データ'('11',2). '2010年度データ'('12',1). '2010年度の月毎の件数をまとめたデータですが累計を求めたいです。'(_月,_累計件数) :- _月順序 = ['04','05','06','07','08','09','10','11','12','01','02','03'], 月別件数を得る(_月順序,_月別件数), 累計表示(_月順序,_月別件数,_月,_累計件数). 月別件数を得る([],[]). 月別件数を得る([_月|R1],[_件数|R2]) :- '2010年度データ'(_月,_件数), 月別件数を得る(R1,R2). 累計表示(_月順序,_月別件数,_月,_累計件数) :- append(L1,[_件数|R],_月別件数), length(L1,_nth0), nth0(_nth0,_月順序,_月), sum([_件数|L1],_累計件数). sum([],0). sum([N|R],S) :- sum(R,S_1), S is S_1 + N. % 以下のサイトは % % 履歴付き最終組余り有効N個組 % 最終組余り有効N個組(N,_対象ならび,_N個組) :- 履歴付き最終組余り有効N個組(N,_対象ならび,_履歴ならび,_N個組,_後ならび). 履歴付き最終組余り有効N個組(N,_対象ならび,_履歴ならび,_N個組,_後ならび) :- length(_N個組の一,N), append(_N個組の一,R,_対象ならび),!, 履歴付き最終組余り有効N個組(N,_N個組の一,R,_履歴ならび,_N個組,_後ならび). 履歴付き最終組余り有効N個組(N,_N個組,[],_N個組,[]). 履歴付き最終組余り有効N個組(N,_N個組,_後ならび,[],_N個組,_後ならび). 履歴付き最終組余り有効N個組(N,_N個組の一,R,[_N個組の一|R1],_N個組,_後ならび) :- 履歴付き最終組余り有効N個組(N,R,R1,_N個組,_後ならび). % ?- 履歴付き最終組余り有効N個組(3,[1,2,3,4,5,6,7,8],_履歴,_N個組,_後). % _履歴 = [], % _N個組 = [1, 2, 3], % _後 = [4, 5, 6, 7, 8] ; % _履歴 = [[1, 2, 3]], % _N個組 = [4, 5, 6], % _後 = [7, 8] ; % _履歴 = [[1, 2, 3], [4, 5, 6]], % _N個組 = [7, 8], % _後 = []. % 以下のサイトは # # 剰余算を使った最終組余り有効N個組 # 最終組余り有効N個組(N,_対象ならび,_N個組) :- 最終組余り有効N個組(N,_対象ならび,_前ならび,_N個組,_後ならび). 最終組余り有効N個組(N,_対象ならび,_前ならび,_N個組,_後ならび) :- length(X1,N), append(L0,X1,R1,_対象ならび), length(L0,Len1), 0 is Len1 mod N, 最終組余り有効N個組終了条件(N,L0,X1,R1,_前ならび,_N個組,_後ならび). 最終組余り有効N個組終了条件(N,L0,X,R,L0,X,R). 最終組余り有効N個組終了条件(N,L0,X,R,L1,R,[]) :- length(R,LenR), LenR < N, append(L0,X,L1). append([],L1,L2,L) :- append(L1,L2,L). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % ?- 最終組余り有効N個組(3,[1,2,3,4,5,6,7,8],_前ならび,_N個組,_後ならび). % _前ならび = [], % _N個組 = [1, 2, 3], % _後ならび = [4, 5, 6, 7, 8] ; % _前ならび = [1, 2, 3], % _N個組 = [4, 5, 6], % _後ならび = [7, 8] ; % _前ならび = [1, 2, 3, 4, 5, 6], % _N個組 = [7, 8], % _後ならび = [] ; % false. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/311 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # 以下のような入力が与えられたときに # 3 # 11010 # 01111 # 10101 # 01110 # 01100 # # 01011 # 01010 # 00100 # 00110 # 10100 # # 11110 # 01110 # 01101 # 01110 # 00001 # # 以下のように出力されるプログラムを作成してください。よろしくお願いします。 # 4 # 3 # 8 # '以下のような入力が与えられたときに 3 11010 01111 10101 01110 01100 01011 01010 00100 00110 10100 11110 01110 01101 01110 00001 以下のように出力されるプログラムを作成してください。よろしくお願いします。 4 3 8'(LL) :- プログラム(LL,_解), writef('%t\n',[_解]). プログラム(LL,_解) :- 転置(LL,LL1), '1の最大連続数を得る'(LL1,_最大連続数), '最大連続数の連続は何か所にあるか'(LL1,_最大連続数,_何か所), _解 is _最大連続数 * _何か所. '1の最大連続数を得る'(LL1,_最大連続数) :- '1の最大連続数を得る'(LL1,0,_最大連続数). '1の最大連続数を得る'([],_最大連続数,_最大連続数) :- !. '1の最大連続数を得る'([L|R],_最大連続数_1,_最大連続数) :- 'Lの最大連続数'(L,_連続数), _連続数 > _最大連続数_1, '1の最大連続数を得る'(R,_連続数,_最大連続数),!. '1の最大連続数を得る'([_|R],_最大連続数_1,_最大連続数) :- '1の最大連続数を得る'(R,_最大連続数_1,_最大連続数). 'Lの最大連続数'(L,_Lの最大連続数) :- findmax(_連続数,( append(L1,L2,L3,L), '1の連続数'(L1,L2,L3,_連続数)), _Lの最大連続数). '1の連続数'(L1,L2,L3,_連続数) :- all(L2,1), \+(last(L1,1)), \+(L3 = [1|_]), length(L2,_連続数). '最大連続数の連続は何か所にあるか'([],_最大連続数,0) :- !. '最大連続数の連続は何か所にあるか'([L|R],_最大連続数,_何か所) :- length(L2,_最大連続数), count(( append(L1,L2,L3,L), '1の連続数'(L1,L2,L3,_最大連続数)), Count), '最大連続数の連続は何か所にあるか'(R,_最大連続数,_何か所_1), _何か所 is _何か所_1 + Count. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/59 # # ../test/read.cgi/tech/1361082416/48 # http://kohada.2ch.net/test/read.cgi/prog/1209467166/401 # FizzBuzzクイズ # # 1.fizz.buzz #=> 1 # 3.fizz.buzz #=> "Fizz" # 5.fizz.buzz #=> "Buzz" # 15.fizz.buzz #=> "FizzBuzz" # 997.fizz.buzz #=> 997 # # となるようなメソッドfizz、buzzは定義可能か? # 可能である場合、同様にgizzを追加定義し、 # 7.fizz.buzz.gizz #=> "Gizz" # 21.fizz.buzz.gizz #=> "FizzGizz" # 35.fizz.buzz.gizz #=> "BuzzGizz" # 105.fizz.buzz.gizz #=> "FizzBuzzGizz" # と拡張・応用ができるか? # # メソッドのコールに()が必須の言語では 3.fizz().buzz() 形式でも構わない。 # オープンクラス機構やメソッドのない言語では関数(buzz(fizz(3)) #=> "Fizz" など)で。 # # 'FizzBuzzGizz' :- 'FizzBuzzGizz'([],['','','Fizz'],['','','','','Buzz'],['','','','','','','Gizz']). 'FizzBuzzGizz'(Ln,_,_,_) :- length(Ln,100),!. 'FizzBuzzGizz'(Ln,L1,L2,L3) :- 'FizzBuzzGizz'([_|Ln],L1,L2,L3,_表示情報), writef('%t\n',[_表示情報]), 三つのリストの左シフト(L1,L2,L3,L1_2,L2_2,L3_2), 'FizzBuzzGizz'([_|Ln],L1_2,L2_2,L3_2). 'FizzBuzzGizz'(Ln,[''|_],[''|_],[''|_],_数値) :- length(Ln,_数値),!. 'FizzBuzzGizz'(Ln,[A|_],[B|_],[C|_],_FizzBuzzGizz文字列) :- atomic_list_concat([A,B,C],_FizzBuzzGizz文字列). 三つのリストの左シフト([A|R1],[B|R2],[C|R3],L1,L2,L3) :- append(R1,[A],L1), append(R2,[B],L2), append(R3,[C],L3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/169 # # http://toro.2ch.net/test/read.cgi/tech/1357748713/775 # それで過去問さんにお願いがあるのですか、選りすぐった問題を一日一題のペースで載せていただけないでしょうか。 # # 1: http://toro.2ch.net/test/read.cgi/tech/1357748713/777 # 2: .http://toro.2ch.net/test/read.cgi/tech/1357748713/874 # 3.: ../test/read.cgi/tech/1361082416/59 # 4: .http://pc11.2ch.net/test/read.cgi/tech/1208268461/726 # [1] 授業単元:情報実験第一 # [2] 問題文:リストの全要素の最大公約数を求める述語 gcdlist を実装 # せよ。また、要素数が n であるリストに自然数 n 個を読み込み、関数 # gcdlist を用いてそれらの最大公約数を求めるプログラムを作成せよ。 # 'リストの全要素の最大公約数を求める述語 gcdlist を実装せよ。 また、要素数が n であるリストに自然数 n 個を読み込み、述語 gcdlist を用いて それらの最大公約数を求めるプログラムを作成せよ。'(_n,_最大公約数) :- '要素数が n であるリストに自然数 n 個を読み込み、gcdlist を用いて それらの最大公約数を求める'(_n,_最大公約数). gcdlist([N],N). gcdlist([N|R],_最大公約数) :- gcdlist(R,_最大公約数_2), 最大公約数をユークリッドの互除法で求める(N,_最大公約数_2,_最大公約数). 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). '要素数が n であるリストに自然数 n 個を読み込み、gcdlist を用いて それらの最大公約数を求める'(_n,_最大公約数) :- '要素数が n であるリストに自然数 n 個を読み込み'(_n,_リスト), gcdlist(_リスト,_最大公約数). '要素数が n であるリストに自然数 n 個を読み込み'(_n,_リスト) :- '要素数が n であるリスト'(_n,_リスト), findall(_自然数,( member(_,_リスト), 自然数を得る(自然数,_自然数)), _リスト). '要素数が n であるリスト'(_n,_リスト) :- length(_リスト,_n). % 以下のサイトは # 出典:: 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」を、数値の代わりに出力することとする' :- 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'([],['','','Fizz'],['','','','','','','Buzz'],['','','','','','','','','','','','','hoge']). 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(Ln,_,_,_) :- length(Ln,100),!. 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(Ln,L1,L2,L3) :- '3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに'([_|Ln],L1,L2,L3,_表示情報), writef('%t\n',[_表示情報]), 三つのならびの左方向へ回転(L1,L2,L3,L1_2,L2_2,L3_2), 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'([_|Ln],L1_2,L2_2,L3_2). '3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに'(Ln,[''|_],[''|_],[''|_],_数値) :- length(Ln,_数値),!. '3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに'(Ln,[A|_],[B|_],[C|_],_FizzBuzzhoge文字列) :- atomic_list_concat([A,B,C],_FizzBuzzhoge文字列). 三つのならびの左方向へ回転([A|R1],[B|R2],[C|R3],L1,L2,L3) :- append(R1,[A],L1), append(R2,[B],L2), append(R3,[C],L3). % 以下のサイトは '10進数n進数変換表示'(_10進数,_n,_n進数数値ならび,_n進数文字ならび,_n進数表示) :- _n >= 0, _n =< 35, '10進数からn進数ならび'(_10進数,_n,[],_n進数数値ならび,[],_n進数文字ならび), atomic_list_concat(_n進数文字ならび,_n進数表示). '10進数からn進数ならび'(0,_n,L1,L1,L2,L2) :- !. '10進数からn進数ならび'(D,_n,L1_1,L1,L2_1,L2) :- M is D mod _n, D_1 is D // _n, n進数文字変換(M,M_1), '10進数からn進数ならび'(D_1,_n,[M|L1_1],L1,[M_1|L2_1],L2). n進数文字変換(N,_文字) :- N >= 10, N =< 35, N_2 is N + 55, char_code(_文字,N_2). n進数文字変換(N,_文字) :- atom_number(_文字,N). 頭部零10進数n進数変換表示(_10進数,_n,_指定桁数,_n進数数値ならび,_n進数文字ならび,_n進数表示) :- '10進数n進数変換表示'(_10進数,_n,_n進数数値ならび,_n進数文字ならび_1,_), length(_n進数文字ならび,_指定桁数), append(L0,_n進数文字ならび_1,_n進数文字ならび), all(L0,'0'), atomic_list_concat(_n進数文字ならび,_n進数表示). % 以下のサイトは # 出典:: 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). % 以下のサイトは # Prolog 21世紀における0〜3の数字を2個ずつ使ってできる年月日の個数 # # 【出典】https://twitter.com/c_oi/status/301346035094126593 # https://twitter.com/c_oi/status/301346039590436864 # 【引用】「0〜3の数字を2個ずつ使ってできる年月日は21世紀(2001/01/01〜2100/12/31)の間に何日間あるでしょう?」 # '21世紀における0〜3の数字を2個ずつ使ってできる年月日の個数'(_個数) :- setof(_年月日ならび,( 重複を許す年月日ならびの選択(_年月日ならび)), LL), length(LL,_個数). 重複を許す年月日ならびの選択(_年月日ならび) :- 順列([0,0,1,1,2,2,3,3],8,_年月日ならび), _年月日ならび @>= [2,0,0,1,0,1,0,1], _年月日ならび @=< [2,1,0,0,1,2,3,1], \+(禁則(_年月日ならび)). 禁則([_,_,_,_,0,2,3,_]) :- !. 禁則([_,_,_,_,2,_,_,_]) :- !. 禁則([_,_,_,_,3,_,_,_]) :- !. 禁則([_,_,_,_,1,3,_,_]) :- !. 禁則([_,_,_,_,_,_,3,3]) :- !. 禁則([_,_,_,_,_,_,3,2]) :- !. 順列(Y,0,[]). 順列(Y,N,[A|X]) :- del(A,Y,Z), M is N - 1, 順列(Z,M,X). del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). % 以下のサイトは # http://d.hatena.ne.jp/E_Mattsan/20130211/1360590408 # 「E.Mattsan氏のブログ 20130211より」 # # 設問 # # まず、パタンマッチングの部分だけが見やすくなるように、「どう書く」の問題からいろいろ取り去ってより簡単な問題を作りました。 # # # 要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 # コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 # 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 # 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 # 要素がコンテナ中に見つからない場合、-1を返す。 # 検索(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- 形式(_指定された要素,L1), append(L0,L1,_コンテナ), length(L0,_最初の場所の最初の要素の位置),!. 検索(_,_,-1). 形式(_指定された要素,[_指定された要素,_指定された要素,_指定された要素|_]). 形式(_指定された要素,[_指定された要素,_指定された要素|_]). 形式(_指定された要素,[_指定された要素|_]). % 以下のサイトは # http://d.hatena.ne.jp/E_Mattsan/20130211/1360590408 # 「E.Mattsan氏のブログ 20130211より」 # # 設問 # # まず、パタンマッチングの部分だけが見やすくなるように、「どう書く」の問題からいろいろ取り去ってより簡単な問題を作りました。 # # # 要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 # コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 # 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 # 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 # 要素がコンテナ中に見つからない場合、-1を返す。 # search(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- member(L1,[[_指定された要素,_指定された要素,_指定された要素|_],[_指定された要素,_指定された要素|_],[_指定された要素|_]]), append(L0,L1,_コンテナ), length(L0,_最初の場所の最初の要素の位置),!. search(_,_,-1). % 以下のサイトは # http://d.hatena.ne.jp/E_Mattsan/20130211/1360590408 # 「E.Mattsan氏のブログ 20130211より」 # # 設問 # # まず、パタンマッチングの部分だけが見やすくなるように、「どう書く」の問題からいろいろ取り去ってより簡単な問題を作りました。 # # # 要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 # コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 # 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 # 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 # 要素がコンテナ中に見つからない場合、-1を返す。 # '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- member(L1,[[_指定された要素,_指定された要素,_指定された要素|_],[_指定された要素,_指定された要素|_],[_指定された要素|_]]), append(L0,L1,_コンテナ), length(L0,_最初の場所の最初の要素の位置),!. '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,-1) :- 要素がコンテナ中に見つからない場合(_指定された要素,_コンテナ). 要素がコンテナ中に見つからない場合(_指定された要素,_コンテナ) :- \+(member(_指定された要素,_コンテナ)). % 以下のサイトは # http://d.hatena.ne.jp/E_Mattsan/20130211/1360590408 # 「E.Mattsan氏のブログ 20130211より」 # # 設問 # # まず、パタンマッチングの部分だけが見やすくなるように、「どう書く」の問題からいろいろ取り去ってより簡単な問題を作りました。 # # # 要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 # コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 # 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 # 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 # 要素がコンテナ中に見つからない場合、-1を返す。 # '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- search(_指定された要素,_コンテナ,_最初の場所の最初の要素の位置). search(A,L,_nth0) :- append(L0,[A,A,A|_],L), length(L0,_nth0),!. search(A,L,_nth0) :- append(L0,[A,A|_],L), length(L0,_nth0),!. search(A,L,_nth0) :- append(L0,[A|_],L), length(L0,_nth0),!. search(A,L,-1). % 以下のサイトは # http://d.hatena.ne.jp/E_Mattsan/20130211/1360590408 # 「E.Mattsan氏のブログ 20130211より」 # # 設問 # # まず、パタンマッチングの部分だけが見やすくなるように、「どう書く」の問題からいろいろ取り去ってより簡単な問題を作りました。 # # # 要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 # コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 # 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 # 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 # 要素がコンテナ中に見つからない場合、-1を返す。 # '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。要素が2つ連続した場所がない場合、最初の要素の位置を返す。要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- '先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置),!. '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。要素が2つ連続した場所がない場合、最初の要素の位置を返す。要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- '先頭の位置は0とする。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置),!. '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。要素が2つ連続した場所がない場合、最初の要素の位置を返す。要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- '先頭の位置は0とする。要素が2つ連続した場所がない場合、最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置),!. '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。要素が2つ連続した場所がない場合、最初の要素の位置を返す。要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- '要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,-1). '先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- append(L0,[_指定された要素,_指定された要素,_指定された要素|_],_コンテナ), length(L0,_最初の場所の最初の要素の位置),!. '先頭の位置は0とする。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- 要素が3つ連続した場所がない場合(_コンテナ,_指定された要素), append(L0,[_指定された要素,_指定された要素|_],_コンテナ), length(L0,_最初の場所の最初の要素の位置),!. '先頭の位置は0とする。要素が2つ連続した場所がない場合、最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- 要素が2つ連続した場所がない場合(_コンテナ,_指定された要素), append(L0,[_指定された要素|_],_コンテナ), length(L0,_最初の場所の最初の要素の位置),!. '要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,-1) :- \+(member(_指定された要素,_コンテナ)). 要素が3つ連続した場所がない場合(_コンテナ,_指定された要素) :- \+(append(_,[_指定された要素,_指定された要素,_指定された要素|_],_コンテナ)). 要素が2つ連続した場所がない場合(_コンテナ,_指定された要素) :- \+(append(_,[_指定された要素,_指定された要素|_],_コンテナ)). % 以下のサイトは # [1] 授業単元: プログラミング  # [2] 問題文(含コード&リンク):入力仕様を、入力座標は最大2桁までの整数を # 最大10件までとし、入力範囲のチェックと、最大件数のチェックを行うプログラムの # 作成。 # [3] 環境 #  [3.1] OS: xp #  [3.2] コンパイラ名とバージョン: MSC Ver.5.1 #  [3.3] 言語: C # [4] 期限: 今週中 # [5] その他の制限: 出来れば、各所にコメントを入れて下さい。 # どういうプログラムなのか自分でも把握したいのと、コードの勉強も兼ねて。 # # よろしくお願いします。 '入力仕様を、入力座標は最大2桁までの整数を最大10件までとし、入力範囲のチェックと、最大件数のチェックを行う'(_入力座標ならび,_桁数最大件数範囲で修正した入力座標ならび) :- '座標をX,Y最大2桁、(X,Y) の空白区切り形式で最大10件まで一行で入力する'(_座標ならび文字列), split(_座標ならび文字列,[' '],L1), 座標ならびに変換(L,_入力座標ならび), 最大件数のチェック(_入力座標ならび,_最大件数を超えた部分を除外した入力座標ならび), 入力範囲のチェック(_最大件数を超えた部分を除外した入力座標ならび,_桁数最大件数範囲で修正した入力座標ならび). '座標をX,Y最大2桁、(X,Y) の空白区切り形式で最大10件まで一行で入力する'(_座標ならび文字列) :- write('座標をX,Y最大2桁、(X,Y) の空白区切り形式で最大10件まで一行で入力する : '), get_line(_座標ならび文字列). 最大件数のチェック(L,L) :- length(L,_要素数), _要素数 =< 10,!. 最大件数のチェック(L1,L) :- length(L1,_要素数), length(L,10), append(L,_,L1), writef('要素数が%tで最大件数10件を超えています。\n',[_要素数]). 座標ならびに変換([],[]). 座標ならびに変換([_座標ならび文字列|R1],[[X,Y]|R2]) :- atom_to_term(_座標ならび文字列,(X,Y),_), 座標ならびに変換(R1,R2). 入力範囲のチェック([],[]). 入力範囲のチェック([[X,Y]|R1],[[X,Y]|R2]) :- 'X,Yが2桁の範囲'(X,Y), 入力範囲のチェック(R1,R2),!. 入力範囲のチェック([[X,Y]|R1],R2) :- writef('入力範囲にエラーがありました (%t,%t) \n',[X,Y]), 入力範囲のチェック(R1,R2). 'X,Yが2桁の範囲'(X,Y) :- '2桁の範囲'(X), '2桁の範囲'(Y). '2桁の範囲'(X) :- X < 100,!. '2桁の範囲'(X) :- X < 100.0. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/587 # # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):キーボードより本体価格と税率を入力し、その税込価格を #                表示するプログラムを作成せよ。 # #                任意の数値xを小数点以下第n位で四捨五入する作れ(nは任意) # 'キーボードより本体価格と税率を入力し、その税込価格を 表示するプログラムを作成せよ。 任意の数値xを小数点以下第n位で四捨五入する作れ(nは任意)'(_小数点以下第n位で四捨五入) :- 'キーボードより本体価格と税率を入力し'(_本体価格,_税率), その税込み価格を表示する(_小数点以下第n位で四捨五入,_本体価格,_税率). 'キーボードより本体価格と税率を入力し'(_本体価格,_税率) :- 数を得る(本体価格,_本体価格 >= 0.0,_本体価格), 数を得る(税率,_税率 >= 0.0,_税率),!. その税込み価格を表示する(_小数点以下第n位で四捨五入,_本体価格,_税率) :- V is 10 ^ (_小数点以下第n位で四捨五入 - 1), _税込み価格 is floor(_本体価格 * (1 + _税率) * V + 0.5) / V, writef('%w\n',[_税込み価格]). 数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :- list(_催促文ならび), findall(_数,( member(_催促文,_催促文ならび), 数を得る(Instream,_催促文,_数を含む条件,_数)), _数ならび),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 数を得る'(Line,_数を含む条件,_数),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 数を得る(Instream,_催促文,_数を含む条件,_数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 数を得る'(end_of_file,_,end_of_file) :- !. '診断: 数を得る'('',_,_) :- !,fail. '診断: 数を得る'(Line,_数を含む条件,_数) :- atom_to_term(Line,_数,_), number(_数), '診断: 数を含む条件'(_数,_数を含む条件),!. '診断: 数を得る'(Line,_数を含む条件,_数) :- \+((atom_to_term(Line,_数,_),number(_数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!, fail. '診断: 数を含む条件'(_数,_数を含む条件) :- number(_数), call(_数を含む条件),!. '診断: 数を含む条件'(_数,_数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!, fail. 数を得る(_催促文,_数を含む条件,_数) :- 数を得る(user_input,_催促文,_数を含む条件,_数). 数を得る(_催促文,_数) :- 数を得る(user_input,_催促文,true,_数). 数を得る(_数) :- 数を得る(user_input,'',true,_数). 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([]. % 以下のサイトは うるう年は何回来るか(_年起点,_年終点,_うるう年の回数) :- count(( between(_年起点,_年終点,_年), うるう年(_年)), _うるう年の回数). 'ある日から後の年のある日は何日目か(起点日と終点日はそれぞれ日数に含める)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はそれぞれ日数に含める, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2. 'ある日から後の年のある日は何日目か(起点日と終点日はともに日数に含めない)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はともに日数に含めない, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2 - 2. 'ある日から後の年のある日は何日目か(起点日と終点日のどちらかは日数に含めない)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はともに日数に含めない, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2 - 1. ある年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目) :- うるう年は何回来るか(_年起点,_年終点,_うるう年の回数), '基本は一年365日で計算し、それにうるう年の回数(日数)を加える'(_年起点,_年終点,_うるう年の回数,_何日目). '基本は一年365日で計算し、それにうるう年の回数(日数)を加える'(_年起点,_年終点,_うるう年の回数,_何日目) :- _何日目 is _うるう年の回数 + 365 * (_年終点 - _年起点 + 1). 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目) :- _翌年 is _年起点 + 1, ある年の元旦から後の年の大晦日は何日目か(_翌年,_年終点,_何日目). ある年の元旦から後の年のある日は何日目か(_年起点,_年終点,_月終点,_日終点,_何日目) :- _前年 is _年終点 - 1, ある年の元旦から後の年の大晦日は何日目か(_年起点,_前年,_何日目_1), ある年月日はその年の元旦から何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _何日目_1 + _何日目_2. ある年月日はその年の元旦から何日目か(_年,_月,_日,_元旦から何日) :- 月日数ならび(_年,_月日数ならび), _前月 is _月 - 1, length(L0,_月), append(L0,_,_月日数ならび), sum(L0,_前月末日までの日数), _元旦から何日 is _前月末日までの日数 + _日. 大晦日は何日目か(_年,_月,_日,_大晦日は何日目) :- 月日数ならび(_年,_月日数ならび), 翌月から一日から大晦日は何日目か(_年,_月,_日,_月日数ならび,_翌月の一日から大晦日は何日目), 今日を含めて今月末日までの日数(_年,_月,_日,_月日数ならび,_今日を含めて今月の末日までの日数), _大晦日は何日目 is _今日を含めて今月の末日までの日数 + _翌月の一日から大晦日は何日目. 翌月から一日から大晦日は何日目か(_年,_月,_日,_月日数ならび,_何日目) :- length(L0,_月), append(L0,_翌月からの月日数ならび,_月日数ならび), sum(_翌月からの月日数ならび,_何日目). 今日を含めて今月末日までの日数(_年,_月,_日,_月日数ならび,_今日を含めて今月の末日までの日数) :- nth1(_月,_月日数ならび,_今月の日数), _今日を含めて今月の末日までの日数 is _今月の日数 - _日 + 1. 明日から今月末日までの日数(_年,_月,_日,_月日数ならび,_明日から今月の末日までの日数) :- nth1(_月,_月日数ならび,_今月の日数), _明日から今月の末日までの日数 is _今月の日数 - _日. 月日数ならび(_年,[31,29,31,30,31,30,31,31,30,31,30,31]) :- うるう年(_年),!. 月日数ならび(_年,[31,28,31,30,31,30,31,31,30,31,30,31]). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_),!, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 起点日と終点日はそれぞれ日数に含める. 起点日と終点日はともに日数に含めない. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/561 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 問題A # 0と1だけで構成されたテキストファイルAがある。このファイルを読み込み、文字数をカウントし、 # 同じ文字数の0と1で構成された乱数列を生成し、テキストファイルBとして出力するプログラムを作成せよ。 # シード値はシステム時刻など適当なものを使用せよ。 # 問題B # 問題Aで使用したテキストファイルA、Bを一文字ずつXORしテキストファイルCとして出力するプログラムを作成せよ。 # '問題A 0と1だけで構成されたテキストファイルAがある。このファイルを読み込み、文字数をカウントし、 同じ文字数の0と1で構成された乱数列を生成し、テキストファイルBとして出力するプログラムを作成せよ。'(_テキストファイルA,_テキストファイルB) :- 'このファイルを読み込み、文字数をカウントし、同じ文字数の0と1で構成された乱数列を生成し'(_テキストファイルA,_要素数,_乱数数字ならび), テキストファイルBとして出力する(_テキストファイルB,_乱数数字ならび). 'このファイルを読み込み、文字数をカウントし、同じ文字数の0と1で構成された乱数列を生成し'(_テキストファイルA,_要素数,_乱数数字ならび) :- このファイルを読み込み(_テキストファイルA,Chars), 文字数をカウントし(Chars,_文字数), 同じ文字数の0と1で構成された乱数列を生成し(_文字数,Chars,_乱数数字ならび). このファイルを読み込み(_テキストファイルA,Chars) :- get_chars(_テキストファイルA,Chars). 文字数をカウントし(Chars,_文字数) :- length(Chars,_文字数). 同じ文字数の0と1で構成された乱数列を生成し(0,[],[]) :- !. 同じ文字数の0と1で構成された乱数列を生成し(N,L1,[A|R]) :- M is random(N), 一文字取り出す(M,L1,A,L2), N_1 is N - 1, 同じ文字数の0と1で構成された乱数列を生成し(N_1,L2,R). 一文字取り出す(M,L1,A,L2) :- length(L0,M), append(L0,[A|R],L1), append(L0,R,L2). テキストファイルBとして出力する(_テキストファイルB,L) :- atom_chars(_乱数文字列,L), open(_テキストファイルB,write,Outstream), write(Outstream,A), close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/598 # # mysql 5.5 # # テーブル master # tcode # tname # lastdate # 〜 # # daily_data # select tcode,max(tdate) as maxdate # from daily_date # group by tcode; # # このdaily_dateから得られるmaxdateを使って # masterのtcodeの対応するlastdateに入れたいのですが、 # どのようにupdateを書けば良いのでしょうか? # 'daily_dateから得られるmaxdateを使ってmasterのtcodeの対応するlastdateに入れたい' :- dail_dateテーブルの構造(P1,_daily_date_tcode,_date), masterテーブルの構造(P2,_master_tcode,_lastdate), findsetof(_tcode,P1,L1), 最大日付に変更する(L1,P1,P2,_daily_date_tcode,_date,_master_tcode,_lastdate),!. daily_dateテーブルの構造(P,_tcode,_date) :- count(テーブル定義(daily_date,_,_),_アリティ), length(L,_アリティ), P =.. [daily_date|L], tcodeとdateの列位置を確定する(L,_tcode,_date),!. tcodeとdateの列位置を確定する(L,_tcode,_date),!. テーブル定義(daily_date,_nth1_tcode,tcode), テーブル定義(daily_date,_nth1_date,date), nth1(_nth1_tcode,L,_tcode), nth1(_nth1_date,L,_date),!. masterテーブルの構造(P,_tcode,_date) :- count(テーブル定義(master,_,_),_アリティ), length(L,_アリティ), P =.. [master|L], tcodeとlastdateの列位置を確定する(L,_tcode,_lastdate),!. tcodeとlastdateの列位置を確定する(L,_tcode,_date),!. テーブル定義(master,_nth1_tcode,tcode), テーブル定義(master,_nth1_lastdate,lastdate), nth1(_nth1_tcode,L,_tcode), nth1(_nth1_date,L,_lastdate),!. 最大日付に変更する(L1,P1,P2,_daily_date_tcode,_date,_master_tcode,_lastdate) :- forall(( member(_tcode,L1), findmax(_date,P1,_maxdate), lastdateの更新(_maxdate,P2,_tcode,_lastdate)), true). lastdateの更新(_maxdate,P,_tcode,_lastdate) :- retract(P), _lastdate = _maxdate, asserta(P),!. lastdateの更新(_maxdate,P,_tcode,_lastdate) :- _lastdate = _maxdate, asserta(P),!. % 以下のサイトは 加算器型相加平均(_累計,_相加平均) :- 加算器型相加平均([],0,_累計,_相加平均). 加算器型相加平均(Ln,_累計_1,_累計,_相加平均) :- 数を得る(_数), _累計_2 is _累計_1 + _数, 加算器型相加平均_1(Ln,_累計_2,_累計,_相加平均). 加算器型相加平均_1(Ln,_累計,_累計,_相加平均) :- length([_|Ln],Len), _相加平均 is _累計 / Len. 加算器型相加平均_1(Ln,_累計_2,_累計,_相加平均) :- 加算器型相加平均([_|Ln],_累計_2,_累計,_相加平均). 数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :- list(_催促文ならび), findall(_数,( member(_催促文,_催促文ならび), 数を得る(Instream,_催促文,_数を含む条件,_数)), _数ならび),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 数を得る'(Line,_数を含む条件,_数),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 数を得る(Instream,_催促文,_数を含む条件,_数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 数を得る'(end_of_file,_,end_of_file) :- !. '診断: 数を得る'('',_,_) :- !,fail. '診断: 数を得る'(Line,_数を含む条件,_数) :- atom_to_term(Line,_数,_), number(_数), '診断: 数を含む条件'(_数,_数を含む条件),!. '診断: 数を得る'(Line,_数を含む条件,_数) :- \+((atom_to_term(Line,_数,_),number(_数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!, fail. '診断: 数を含む条件'(_数,_数を含む条件) :- number(_数), call(_数を含む条件),!. '診断: 数を含む条件'(_数,_数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!, fail. 数を得る(_催促文,_数を含む条件,_数) :- 数を得る(user_input,_催促文,_数を含む条件,_数). 数を得る(_催促文,_数) :- 数を得る(user_input,_催促文,true,_数). 数を得る(_数) :- 数を得る(user_input,'',true,_数). 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([]. % 以下のサイトは # 出典 :: #420 # [1]c言語 # [2]5進数のかけ算九九(五五?)の表を画面に表示するプログラムを作成せよ(原文ママ) # [3.1]OS:fedora17 # [3.2]gcc 4.7.2 # [3.3]C # [4]無期限 # [5]なし # # '5進数のかけ算九九(五五?)の表を画面に表示する' :- write(' 1 2 3 4 5'), '5進数のかけ算九九(五五?)の表を画面に表示する'([],[_,_,_,_,_,_]),!. '5進数のかけ算九九(五五?)の表を画面に表示する'([_,_,_,_,_],[_,_,_,_,_,_]) :- !. '5進数のかけ算九九(五五?)の表を画面に表示する'(L1,L2) :- '5進数のかけ算九九(五五?)の表を画面に表示して行く'(L1,L2). '5進数のかけ算九九(五五?)の表を画面に表示して行く'(L1,[_,_,_,_,_,_]) :- '次の行に行く'(L1),!. '5進数のかけ算九九(五五?)の表を画面に表示して行く'(L1,L2) :- '行を表示した後に残りの5進数のかけ算九九(五五?)の表を画面に表示する'(L1,L2). '次の行に行く'(L1) :- length([_|L1],N), writef('\n%w ',[N]), '5進数のかけ算九九(五五?)の表を画面に表示する'([_|L1],[_]). '行を表示した後に残りの5進数のかけ算九九(五五?)の表を画面に表示する'(L1,L2) :- 行を表示した後に(L1,L2), '5進数のかけ算九九(五五?)の表を画面に表示する'(L1,[_|L2]). 行を表示した後に(L1,L2) :- findall(L2,member(L,L1),LL), flatten(LL,L3), 表示(L3). 表示(L) :- 表示(L,[],L1,L2), length(L1,N1), length(L2,N2), writef('%w%w ',[N1,N2]). 表示([_,_,_,_,_|R1],L1,A,B) :- 表示(R1,[_|L1],A,B). 表示(L2,L1,L1,L2). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 162代目 #174 # [1]授業単元:数値シュミレーション演習 # [2]問題文:逐次二分法を用いて、 f(x)=exp(x)-3xの根を求めよ。 # x1=0,x2=1とおいて計算を始める。許容誤差は10^-5、 #       反復回数は30回とする。 #       ・#include "stdafx.h" #        #include <stdio.h> #        #include <math.h>)として始めること。 # [3]環境 # [3.1]OS:windous7 # [3.2]コンパイラ名とバージョン:Visual Studio2010 # [3.3]言語:C++ # [4]期限:1月27日 # [5]その他:プログラミングは全くの素人で、申し訳ありませんがよろしくお願いします。 # # f(_x,_y) :- _y is exp(_x)- 3 * _x. '逐次二分法を用いて、 f(x)=exp(x)-3xの根を求めよ。'(X) :- length(Ln,30), '逐次二分法を用いて、 f(x)=exp(x)-3xの根を求めよ。'(Ln,0,1,X). '逐次二分法を用いて、 f(x)=exp(x)-3xの根を求めよ。'(Ln,N1,N2,X) :- f(N1,Y1), f(N2,Y2), N is (N1 + N2) / 2, f(N,Y), '逐次二分法を用いて、 f(x)=exp(x)-3xの根を求めよ。'(Ln,N1,N2,N,Y1,Y2,Y,X). '逐次二分法を用いて、 f(x)=exp(x)-3xの根を求めよ。'([],_,_,X,_,_,Y,X) :- !. '逐次二分法を用いて、 f(x)=exp(x)-3xの根を求めよ。'(_,_,_,X,_,_,Y,X) :- 0.00001 > abs(Y). '逐次二分法を用いて、 f(x)=exp(x)-3xの根を求めよ。'([_|Ln],N1,N2,N,Y1,Y2,Y,X) :- abs(Y1) < abs(Y2), '逐次二分法を用いて、 f(x)=exp(x)-3xの根を求めよ。'(Ln,N1,N,X),!. '逐次二分法を用いて、 f(x)=exp(x)-3xの根を求めよ。'([_|Ln],N1,N2,N,Y1,Y2,Y,X) :- abs(Y1) > abs(Y2), '逐次二分法を用いて、 f(x)=exp(x)-3xの根を求めよ。'(Ln,N,N2,X). % 以下のサイトは # # 教育漢字から任意の一文字を選択する # 教育漢字から任意の二文字を選択する # 教育漢字から任意の三文字を選択する # 教育漢字ならび([一,右,雨,円,王,音,下,火,花,貝,学,気,九,休,玉,金,空,月,犬,見,五,口,校,左,三,山,子,四,糸,字,耳,七,車,手,十,出,女,小,上,森,人,水,正,生,青,夕,石,赤,千,川,先,早,草,足,村,大,男,竹,中,虫,町,天,田,土,二,日,入,年,白,八,百,文,木,本,名,目,立,力,林,六,引,羽,雲,園,遠,何,科,夏,家,歌,画,回,会,海,絵,外,角,楽,活,間,丸,岩,顔,汽,記,帰,弓,牛,魚,京,強,教,近,兄,形,計,元,言,原,戸,古,午,後,語,工,公,広,交,光,考,行,高,黄,合,谷,国,黒,今,才,細,作,算,止,市,矢,姉,思,紙,寺,自,時,室,社,弱,首,秋,週,春,書,少,場,色,食,心,新,親,図,数,西,声,星,晴,切,雪,船,線,前,組,走,多,太,体,台,地,池,知,茶,昼,長,鳥,朝,直,通,弟,店,点,電,刀,冬,当,東,答,頭,同,道,読,内,南,肉,馬,売,買,麦,半,番,父,風,分,聞,米,歩,母,方,北,毎,妹,万,明,鳴,毛,門,夜,野,友,用,曜,来,里,理,話,悪,安,暗,医,委,意,育,員,院,飲,運,泳,駅,央,横,屋,温,化,荷,開,界,階,寒,感,漢,館,岸,起,期,客,究,急,級,宮,球,去,橋,業,曲,局,銀,区,苦,具,君,係,軽,血,決,研,県,庫,湖,向,幸,港,号,根,祭,皿,仕,死,使,始,指,歯,詩,次,事,持,式,実,写,者,主,守,取,酒,受,州,拾,終,習,集,住,重,宿,所,暑,助,昭,消,商,章,勝,乗,植,申,身,神,真,深,進,世,整,昔,全,相,送,想,息,速,族,他,打,対,待,代,第,題,炭,短,談,着,注,柱,丁,帳,調,追,定,庭,笛,鉄,転,都,度,投,豆,島,湯,登,等,動,童,農,波,配,倍,箱,畑,発,反,坂,板,皮,悲,美,鼻,筆,氷,表,秒,病,品,負,部,服,福,物,平,返,勉,放,味,命,面,問,役,薬,由,油,有,遊,予,羊,洋,葉,陽,様,落,流,旅,両,緑,礼,列,練,路,和,愛,案,以,衣,位,囲,胃,印,英,栄,塩,億,加,果,貨,課,芽,改,械,害,街,各,覚,完,官,管,関,観,願,希,季,紀,喜,旗,器,機,議,求,泣,救,給,挙,漁,共,協,鏡,競,極,訓,軍,郡,径,型,景,芸,欠,結,建,健,験,固,功,好,候,航,康,告,差,菜,最,材,昨,札,刷,殺,察,参,産,散,残,士,氏,史,司,試,児,治,辞,失,借,種,周,祝,順,初,松,笑,唱,焼,象,照,賞,臣,信,成,省,清,静,席,積,折,節,説,浅,戦,選,然,争,倉,巣,束,側,続,卒,孫,帯,隊,達,単,置,仲,貯,兆,腸,低,底,停,的,典,伝,徒,努,灯,堂,働,特,得,毒,熱,念,敗,梅,博,飯,飛,費,必,票,標,不,夫,付,府,副,粉,兵,別,辺,変,便,包,法,望,牧,末,満,未,脈,民,無,約,勇,要,養,浴,利,陸,良,料,量,輪,類,令,冷,例,歴,連,老,労,録,圧,移,因,永,営,衛,易,益,液,演,応,往,桜,恩,可,仮,価,河,過,賀,快,解,格,確,額,刊,幹,慣,眼,基,寄,規,技,義,逆,久,旧,居,許,境,均,禁,句,群,経,潔,件,券,険,検,限,現,減,故,個,護,効,厚,耕,鉱,構,興,講,混,査,再,災,妻,採,際,在,財,罪,雑,酸,賛,支,志,枝,師,資,飼,示,似,識,質,舎,謝,授,修,述,術,準,序,招,承,証,条,状,常,情,織,職,制,性,政,勢,精,製,税,責,績,接,設,舌,絶,銭,祖,素,総,造,像,増,則,測,属,率,損,退,貸,態,団,断,築,張,提,程,適,敵,統,銅,導,徳,独,任,燃,能,破,犯,判,版,比,肥,非,備,俵,評,貧,布,婦,富,武,復,複,仏,編,弁,保,墓,報,豊,防,貿,暴,務,夢,迷,綿,輸,余,預,容,略,留,領,異,遺,域,宇,映,延,沿,我,灰,拡,革,閣,割,株,干,巻,看,簡,危,机,貴,揮,疑,吸,供,胸,郷,勤,筋,系,敬,警,劇,激,穴,絹,権,憲,源,厳,己,呼,誤,后,孝,皇,紅,降,鋼,刻,穀,骨,困,砂,座,済,裁,策,冊,蚕,至,私,姿,視,詞,誌,磁,射,捨,尺,若,樹,収,宗,就,衆,従,縦,縮,熟,純,処,署,諸,除,将,傷,障,城,蒸,針,仁,垂,推,寸,盛,聖,誠,宣,専,泉,洗,染,善,奏,窓,創,装,層,操,蔵,臓,存,尊,宅,担,探,誕,段,暖,値,宙,忠,著,庁,頂,潮,賃,痛,展,討,党,糖,届,難,乳,認,納,脳,派,拝,背,肺,俳,班,晩,否,批,秘,腹,奮,並,陛,閉,片,補,暮,宝,訪,亡,忘,棒,枚,幕,密,盟,模,訳,郵,優,幼,欲,翌,乱,卵,覧,裏,律,臨,朗,論]). 教育漢字から一文字を選択する(_漢字) :- 教育漢字ならび(_教育漢字ならび), 教育漢字から一文字を選択する(_教育漢字ならび,_漢字). 教育漢字から一文字を選択する(_教育漢字ならび,_漢字) :- _nth0 is random(1006), nth0(_nth0,_教育漢字ならび,_漢字). 教育漢字から重複なく二文字を選択する(_漢字_1,_漢字_2) :- 教育漢字から重複なくn文字を選択する(2,[_漢字_1,_漢字_2]). 教育漢字から重複なく三文字を選択する(_漢字_1,_漢字_2,_漢字_3) :- 教育漢字から重複なくn文字を選択する(3,[_漢字_1,_漢字_2,_漢字_3]). 教育漢字から重複なくn文字を選択する(_n,_漢字ならび) :- 教育漢字ならび(_教育漢字ならび), 教育漢字から重複なくn文字を選択する(_n,_教育漢字ならび,[],_漢字ならび). 教育漢字から重複なくn文字を選択する(_n,_,L,L) :- length(L,_n),!. 教育漢字から重複なくn文字を選択する(_n,_教育漢字ならび,L1,L) :- 重複なくn文字を選択して行く(_n,_教育漢字ならび,L1,L). 重複なくn文字を選択して行く(_n,_教育漢字ならび,L1,L) :- 重複なく一文字を選択する(_教育漢字ならび,L1,_漢字), 教育漢字から重複なくn文字を選択する(_n,_教育漢字ならび,[_漢字|L1],L). 重複なく一文字を選択する(_教育漢字ならび,L1,_漢字) :- 教育漢字から一文字を選択する(_教育漢字ならび,_漢字), 重複検査(_教育漢字ならび,L1,_漢字). 重複検査(_教育漢字ならび,L1,_漢字) :- 重複なく(_漢字,L1),!. 重複検査(_教育漢字ならび,L1,_漢字) :- 重複なく一文字を選択する(_教育漢字ならび,L1,_漢字). 重複なく(_漢字,L1) :- \+(member(_漢字,L1)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/149 # # [1] 授業単元:データ構造アルゴリズム # [2] 問題文(含コード&リンク) : qsort関数を用いてソートするプログラムを作成しなさい。身長の昇順、視力の降順など、複数の条件でソートすること。 # ※qsort関数 # 書式 void qsort(void*base,size_t nmemb,size_t size,int(*compar)(const void*,const void)) # 'qsort関数を用いてソートするプログラムを作成しなさい。身長の昇順、視力の降順など、複数の条件でソートすること。'(_テーブル名,_昇順降順,_鍵ならび,L) :- 単位節からリストに変換(_テーブル名,_属性名ならび,L1), 鍵位置ならびを得る(_鍵ならび,_属性名ならび,_鍵位置ならび), 鍵付きqsort(L1,_昇順降順,_鍵位置ならび,L2). 単位節からリストに変換(_テーブル名,_属性名ならび,L1) :- findall(_属性名,( テーブル定義(_テーブル名,_,_属性名)), _属性名ならび), length(_属性名ならび,Len), length(_引数ならび,Len), P =.. [_身体検査|_引数ならび], findall(_引数ならび,( call(P)), L1). 鍵位置ならびを得る([],_,[]). 鍵位置ならびを得る([_鍵|R1],_属性名ならび,[_鍵位置|R3]) :- nth1(_鍵位置,_属性名ならび,_鍵), 鍵位置ならびを得る(R1,_属性名ならび,R3). 鍵付きqsort([],_,_,[]) :- !. 鍵付きqsort([_軸要素|R1],_昇順降順,_鍵位置ならび,LL2) :- 鍵取得(_鍵位置ならび,_軸要素,_軸要素の鍵ならび), 分割(_軸要素の鍵ならび,R1,_昇順降順,_鍵位置ならび,LL1,LL2), 鍵付きqsort(LL1,_鍵位置ならび,LL1_s), 鍵付きqsort(LL2,_鍵位置ならび,LL2_2), append(LL1_s,[_軸要素|LL2_s],LL2). 鍵取得([],_,[]). 鍵取得([_鍵位置|R1],L,[_鍵|R3]) :- nth1(_鍵位置,L,_鍵), 鍵取得(R1,L,R3). 分割(_軸要素の鍵ならび,[],_,_鍵位置ならび,[],[]). 分割(_軸要素の鍵ならび,[L1|R2],_昇順降順,_鍵位置ならび,L2,L3) :- 鍵取得(_鍵位置ならび,L1,_鍵ならび_2), 分割_2(_昇順降順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,L2,L3), 分割(_軸要素の鍵ならび,R2,_昇順降順,_鍵位置ならび,R2,R3). 分割_2(昇順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,[_鍵ならび|R2],R3) :- _軸要素の鍵ならび @=< _鍵ならび. 分割_2(昇順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,R2,[_鍵ならび|R3]) :- _軸要素の鍵ならび @> _鍵ならび. 分割_2(降順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,[_鍵ならび|R2],R3) :- _軸要素の鍵ならび @>= _鍵ならび. 分割_2(降順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,R2,[_鍵ならび|R3]) :- _軸要素の鍵ならび @< _鍵ならび. % 以下のサイトは 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 = []. % 以下のサイトは # [1] 授業単元:C言語 # [2] 問題 http://ime.nu/codepad.org/yV0KrZox # # 問題4 # 9行9列の九九の表のそれぞれの値を計算によって算出し、表示するプログラムを、二次元配列を用いて作成しなさい。 # ------------------------------------------------------------------- # 1 2 3 4 5 6 7 8 9 # 2 4 6 8 10 12 14 16 18 # 3 6 9 12 15 18 21 24 27 # 4 8 12 16 20 24 28 32 26 # 5 10 15 20 25 30 35 40 45 # 6 12 18 24 30 36 42 48 54 # 7 14 21 28 35 42 49 56 63 # 8 16 24 32 40 48 56 64 72 # 9 18 27 36 45 54 63 72 81 # -------------------------------------------------------------------- # '9行9列の九九の表のそれぞれの値を計算によって算出し、表示するプログラムを、二次元配列を用いて作成しなさい。' :- length(LL,9), findall(L,行の計算(LL,L),LL), 表示する(LL). 行の計算(LL,L) :- nth1(M,LL,L), length(L,9), findall(X,列の計算(M,L,X),L). 列の計算(M,L,X) :- nth1(N,L,_), X is M * N. 表示する(LL) :- write('-------------------------------------------------------------------\n'), 行を表示する(LL,R), R = [], write('-------------------------------------------------------------------\n'). 行を表示する(LL,R) :- append(_,[L|R],LL), writef('%3r%3r%3r%3r%3r%3r%3r%3r%3r\n',L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元: リスト処理 # [2] 問題文(含コード&) http://codepad.org/3DdhcBUM # # /* # # seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 # また、整列する際に要素どうしを比較した回数も表示しなさい。 # # 【実行例】 # # 番号 氏名      得点 # 1021 Machida Masato 100 # 1017 Nonaka Fujio 98 # 1011 Suzuki kenichi 93 # 1019 Fujimoto Kaoru 92 # 1006 kato Ichiro 91 # ・ ・     ・ # ・ ・     ・ # ・ ・     ・ # 1020 Hoshi Izumi 32 # 整列の為の比較回数=132回 # # ※長いので実行結果は途中省略しています。 # ※比較回数はコードによって異なる場合があります。 # # */ 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 また、整列する際に要素どうしを比較した回数も表示しなさい。' :- 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび), リスト処理による挿入法で得点の降順に整列して(_生徒ならび,[],_整列済み生徒ならび,0,_比較回数), 表示しなさい(_整列済み生徒ならび,_比較回数). 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび) :- get_split_lines('seito.dat',[' '],_生徒ならび). リスト処理による挿入法で得点の降順に整列して([[_学籍番号,_姓,_名,_得点]|R1],L1,_整列済み生徒ならび,_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,L1,L2,_比較回数_1,_比較回数_2), リスト処理による挿入法で得点の降順に整列して(R1,L2,_整列済み生徒ならび,_比較回数_2,_比較回数),!. リスト処理による挿入法で得点の降順に整列して([],_整列済み生徒ならび,_整列済み生徒ならび,_比較回数,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],[[_学籍番号,_名,_名,_得点],[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],_比較回数_1,_比較回数) :- 比較回数 is _比較回数_1 + 1, _得点 >= _得点_1,!. 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R1],[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R2],_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,R1,R2,_比較回数_1,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[],[[_学籍番号,_名,_名,_得点]],_比較回数,_比較回数) :- !. 表示しなさい(_整列済み生徒ならび,_比較回数) :- 見出しの表示, append(_,[[_学籍番号,_姓,_名,_得点]|R],_整列済み生徒ならび), 整形して表示する(_学籍番号,_姓,_名,_得点), R = [], writef('整列の為の比較回数=%t回\n',[_比較回数]). 見出しの表示 :- write('番号 氏名      得点\n'). 整形して表示する(_学籍番号,_姓,_名,_得点) :- 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列), 得点を頭部空白3桁に(_得点,_得点文字列), atomic_list_concat([_学籍番号,_姓文字列,_名文字列,_得点文字列],' ',_表示文字列), writef('%t\n',[_表示文字列]). 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列) :- '8桁に'(_姓,_姓文字列), '8桁に'(_名,_名文字列). '8桁に'(_項,_8桁文字列) :- atom_chars(_項,Chars_1), length(L,8), append(L1,L2,L), all(L2,' '), atom_chars(_8桁文字列,L). 得点を頭部空白3桁に(_得点,_得点文字列) :- number_chars(_得点,Chars), length(L,3), append(L0,Chars,L), all(L0,' '), atom_chars(_得点文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,( member(A,Lines1), split(A,Sep,Line)), Lines). get_lines(Instream,end_of_file,_,_,[]) :-!. get_lines(Instream,S,[],_終了検索対象ならび,[S]) :- member(A,_終了検索対象ならび), 検索(S,A),!. get_lines(Instream,S,[],[],[S|R]) :- get_line(Instream,S2), get_lines(Instream,S2,[],[],R),!. get_lines(Instream,S,[],_終了検索対象ならび,[S|R]) :- member(A,_終了検索対象ならび), \+(検索(S,A)), get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), member(B,_終了検索対象ならび), 検索(S,B),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S|R]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), !, get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,_,_開始検索対象ならび,_終了検索対象ならび,X) :- get_line(Instream,S2), get_lines(Instream,S2,_開始検索対象ならび,_終了検索対象ならび,X),!. get_lines(_ファイル,_スタート行,_最終行,X) :- integer(_スタート行), integer(_最終行), 行位置指定選択(_ファイル,_スタート行,_最終行,X). get_lines(_ファイル,_開始検索対象ならび,_終了検索対象ならび,X) :- \+(integer(_開始検索対象ならび)), \+(integer(_終了検索対象ならび)), open(_ファイル,read,Instream), get_line(Instream,S), get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,X), close(Instream),!. get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat, get_line(user_input,Line), (Line = end_of_file , (!) , fail ; true)), Lines). get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_chars(Instream,end_of_file,[]) :- !. get_chars(Instream,_,[]) :- at_end_of_stream(Instream),!. get_chars(Instream,X,[X|R]) :- get_char(Instream,Y), get_chars(Instream,Y,R) . get_chars(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), exists_file(File_1), open(File_1,read,Instream), get_char(Instream,X), get_chars(Instream,X,L), close(Instream),!. get_chars(Instream,L) :- is_stream(_,Instream,_), get_char(Instream,X), get_chars(Instream,X,L),!. get_chars(L) :- findall(U,( repeat, get_char(U), (U = end_of_file , (!) , fail ; true)), L). get_line(X) :- get_line(user_input,X). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,_,[]) :- at_end_of_stream(Instream),!. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). chars_lines([],[],[]) :- !. chars_lines(['\r'],[],[]) :- !. chars_lines(['\r',A|R],[],[A|R]) :- \+(A = '\n'),!. chars_lines(['\r','\n'|R],[],R) :- !. chars_lines(['\n'|R],[],R) :- !. chars_lines([A|R1],[A|R2],Z) :- chars_lines(R1,R2,Z). chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R), atomic_list_concat(U,A), chars_lines(R,R2). split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y) , \+(member(U,_区切り符号ならび))), Z), Z = X,!. split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび) , atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), C number Nl,!. split_5(B,C) :- atomic_list_concat(B,C),!. all([],_). all([V|R],V) :- all(R,V). 検索(_文字列,_副文字列) :- atom_length(_文字列,_文字列の文字数), atom_length(_副文字列,_副文字列の文字数), Max is _文字列の文字数 - _副文字列の文字数, between(0,Max,N), sub_atom(_文字列,N,_副文字列の文字数,_副文字列),!. 行位置指定選択(_ファイル,_選択先頭行,_選択最終行,X) :- wc(_ファイル,[[_行,_,_,_]]), _行数_1 is _行 - _選択先頭行 + 1, _行数_2 is _選択最終行 - _選択先頭行, atomic_list_concat(['tail -',_行数_1,' ',_ファイル,' | head -',_行数_2],S), shs(S,X). wc(F,X) :- exists_file(F1), atomic_list_concat(['wc ',F1],S), sh(S,X),!. wc(F,X) :- atomic_list_concat([F,' | wc'],S), sh(S,X),!. sh(Command,X) :- shs(Command,Y), findall(U,(member(V,Y) , make_list(V,[' ',','],U)),X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,_,[]) :- at_end_of_stream(Instream),!. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元:リスト構造 # [2] 問題文(含コード&amp;リンク): # http://ime.nu/iup.2ch-library.com/i/i0825590-1357830189.gif # # 以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作 成せよ. # リストは1つとし,初期値は「15 4 32 1」である. # ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. # ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. # ・データのソート(降順)を行う関数を作成する. # ・リストの平均値を計算し出力する関数を作成する。 # # ------表示例------ # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : # ------------------ # # ------実行例------- # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 1 # 追加するデータを入力してください : 10 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 4 # リストの平均値 : 12.4 # リスト : 15 4 32 1 10 # # 1. データの追加 # 2. データの削除 # 3. データのソート(降順) # 4. リストの平均値 # 5. 終了 # 何を実行しますか : 3 # リスト : 32 15 10 4 1 # :- dynamic(リスト/1). '以下のようなメニューを表示,各項目の機能を実現して結果を表示するプログラムを作成せよ. リストは1つとし,初期値は「15 4 32 1」である. ・データの追加,削除は練習課題(挿入や削除)のものを参考にすればよい. ・データの追加に関して,そのデータはリストの最後に挿入されるものとする. ・データのソート(降順)を行う関数を作成する. ・リストの平均値を計算し出力する関数を作成する。 ------表示例------ 1. データの追加 2. データの削除 3. データのソート(降順) 4. リストの平均値 5. 終了 何を実行しますか : ' :- 'リストは1つとし,初期値は「15 4 32 1」である', メニューを表示, 各項目の機能を実現して結果を表示する. 'リストは1つとし,初期値は「15 4 32 1」である' :- assertz(リスト([15,4,32,1])). メニューを表示 :- write('1. データの追加\n2. データの削除\n3. データのソート(降順)\n4. リストの平均値\n5. 終了\n何を実行しますか : '). メニューを表示 :- メニューを表示. 各項目の機能を実現して結果を表示する :- 機能番号を選択する(_機能番号), 機能を実現して結果を表示する(_機能番号), _機能番号 = 5,!. 機能番号を選択する(_機能番号) :- get_line(Line), '診断:: メニューの選択'(Line,_機能番号),!. 機能番号を選択する(_機能番号) :- 機能番号を選択する(_機能番号). '診断:: メニューの選択'(Line,_機能番号) :- atom_number(Line,_機能番号), integer(_機能番号), between(1,5,_機能番号),!. '診断:: メニューの選択'(Line,_機能番号) :- writef('選択された %t からは適切な機能番号が得られません。再入力をお願いします。\n',[Line]), fail. 機能を実現して結果を表示する(5) :- !. 機能を実現して結果を表示する(1) :- データの追加. 機能を実現して結果を表示する(2) :- データの削除. 機能を実現して結果を表示する(3) :- 'データのソート(降順)'. 機能を実現して結果を表示する(4) :- リストの平均値. データの追加 :- write('追加するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), append(L1,[_データ],L2), assertz(リスト(L2)). データの削除 :- write('削除するデータを入力してください : '), 整数を得る(_データ), retract(リスト(L1)), ならびから削除(_データ,L1,L2), assertz(リスト(L2)). 'データのソート(降順)' :- リスト(L1), 降順整列(L1,L2), atomic_list_concat(L2,' ',S), writef('リスト : %t\n',[S]). リストの平均値 :- リスト(L1), findavg(_データ,( member(_データ,L1)), _平均値), atomic_list_concat(L1,_リスト表示), writef('平均値 : %t\nリスト : %t\n',[_平均値,_リスト表示]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,_,[e,n,d,'_',o,f,'_',f,i,l,e]) :- at_end_of_stream(Stream),!. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_line(user_input,X). ならびから削除(_,[],[]) :- !. ならびから削除(_削除する要素,[_削除する要素|_残り対象ならび],_削除されたならび) :- ならびから削除(_削除する要素,_残り対象ならび,_削除されたならび),!. ならびから削除(_削除する要素,[_要素|_残り対象ならび],[_要素|_残り削除ならび]) :- ならびから削除(_削除する要素,_残り対象ならび,_残り削除ならび),!. 降順整列([],[]). 降順整列([_軸要素|R1],_降順に整列されたならび) :- 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび), 降順整列(_軸要素に等しいか大きいならび,_整列した軸要素に等しいか大きいならび), 降順整列(_軸要素より小さいならび,_整列した軸要素より小さいならび), append(_整列した軸要素に等しいか大きいならび,[_軸要素|_整列した軸要素より小さいならび],_降順に整列したならび). 降順分割(_,[],[],[]). 降順分割(_軸要素,[_要素|R],[_要素|_軸要素に等しいか大きいならび],_軸要素より小さいならび) :- _要素 @>= _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). 降順分割(_軸要素,[_要素|R],_軸要素に等しいか大きいならび,[_要素|_軸要素より小さいならび]) :- _要素 @< _軸要素, 降順分割(_軸要素,R,_軸要素に等しいか大きいならび,_軸要素より小さいならび). findavg(_集約項,_項,_相加平均) :- findall(_集約項,_項,_値ならび), sum(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _相加平均 is _合計値 / _ならびの長さ,!. sum([],0). sum([N|R],S) :- sum(R,S_1), S is N + S_1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/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/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/1354070278/859 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/kie.nu/Hag # ファイルの内容を行番号付きで出力するプログラムを作成せよ # ファイルの内容を行番号付きで出力するプログラムを作成せよ(_ファイル名) :- get_lines(_ファイル名,Lines), append(L0,[_行|R],Lines), length([_|L0],_行番号), writef('%t %t\n',[_行番号,_行]), R = []. % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/829 # # [1] 授業単元:文字列 # [2] 問題文(含コード&リンク): # 1行最大80文字の空白を挟まない英字文字列を入力し、 # 10文字続けて表示するごとに改行を挿入して表示するプログラムを作成しなさい # '1行最大80文字の空白を挟まない英字文字列を入力し、10文字続けて表示するごとに改行を挿入して表示する' :- '1行最大80文字の空白を挟まない英字文字列を入力し'(_英字文字列), '10文字続けて表示するごとに改行を挿入して表示する'(_英字文字列). '1行最大80文字の空白を挟まない英字文字列を入力し'(_英字文字列) :- length(Ln,80), get_char(_文字), '1行最大80文字の空白を挟まない英字ならびを入力し'(Ln,_文字,_英字ならび), atom_chars(_英字文字列,_英字ならび). '1行最大80文字の空白を挟まない英字ならびを入力し'([],_英字,[_英字]) :- !. '1行最大80文字の空白を挟まない英字ならびを入力し'(_,'\n',[]) :- !. '1行最大80文字の空白を挟まない英字ならびを入力し'([_|Ln],_文字,[A|R]) :- 英字(_文字), get_char(_次の文字), '1行最大80文字の空白を挟まない英字ならびを入力し'(Ln,_次の文字,R),!. '1行最大80文字の空白を挟まない英字ならびを入力し'([_|Ln],_,_英字ならび) :- get_char(_文字), '1行最大80文字の空白を挟まない英字ならびを入力し'([_|Ln],_文字,_英字ならび),!. 英字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z',!. 英字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. '10文字続けて表示するごとに改行を挿入して表示する'('') :- !. '10文字続けて表示するごとに改行を挿入して表示する'(_英字文字列) :- '10文字続けて表示するごとに改行を挿入して'(_英字文字列,_残り文字列), '10文字続けて表示するごとに改行を挿入して表示する'(_残り文字列),!. '10文字続けて表示するごとに改行を挿入して表示する'(_英字文字列) :- writef('%t\n',[_英字文字列]). '10文字続けて表示するごとに改行を挿入して'(_英字文字列,_残り文字列) :- sub_atom(_英字文字列,0,10,R,_10文字), sub_atom(_英字文字列,10,R,0,_残り文字列), writef('%t',[_10文字]), write('\n'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/682 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 以下の手順に従ってプログラムを作成せよ。 # 適宜printfを利用して、入力支援(「文字列を入力してください」等の画面表示)を行うこと。 # 1.文字配列name[5][64]を作成 # 2.キーボードから5人分の名前を入力し、name配列に格納 # 3.キーボードから名前を入力し、name配列の何番目に格納されているかを検索して表示 # (見つからなかった場合は「見つかりません」と表示) # 4.「quit」が入力されるまで3の処理を繰り返す # '以下の手順に従ってプログラムを作成せよ。 適宜printfを利用して、入力支援(「文字列を入力してください」等の画面表示)を行うこと。 1.文字配列名前[5][64]を作成 2.キーボードから5人分の名前を入力し、名前配列に格納 3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す' :- '1.文字配列名前[5][64]を作成'(_名前配列), '2.キーボードから5人分の名前を入力し、名前配列に格納'(_名前配列), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前). '1.文字配列名前[5][64]を作成'(LL) :- length(_名前配列,5), findall(L,( member(L,_名前配列), length(L,64)), _名前配列). '2.キーボードから5人分の名前を入力し、名前配列に格納'(_名前配列) :- findall(L,( member(L,_名前配列), 名前を入力し(_名前), 名前配列に格納(_名前,L)), _名前配列). 名前を入力し(_名前) :- write('名前を入力してください : '), get_line(_名前). 名前配列に格納(_名前,L) :- atom_chars(_名前,Chars), append(Chars,R,L), all(R,' '). '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前) :- 'キーボードから名前を入力し'(_名前), '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前), '3.キーボードから名前を入力し、名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前配列,_名前). 'キーボードから名前を入力し'(_名前) :- write('検索する名前を入力してください : '), get_line(_名前). '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '4.「quit」が入力されるまで3の処理を繰り返す'(_名前),!. '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '名前配列の何番目に格納されているかを検索して'(_名前,_名前配列,_nth1), writef('%t番目 %t\n',[_nth,_名前]),!, fail. '名前配列の何番目に格納されているかを検索して表示(見つからなかった場合は「見つかりません」と表示) 4.「quit」が入力されるまで3の処理を繰り返す'(_名前,_名前配列) :- '見つからなかった場合は「見つかりません」と表示', fail. '見つからなかった場合は「見つかりません」と表示' :- write('見つかりません\n'). '名前配列の何番目に格納されているかを検索して'(_名前,_名前配列,_nth1) :- atom_chars(_名前,Chars), nth1(_nth1,_名前配列,L), append(Chars,R,L), all(R,' '). '4.「quit」が入力されるまで3の処理を繰り返す'(quit). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/431 # # UPDATE list SET target=1 WHERE id=1 # というので更新をかけたいのですが、id=1が複数あります。 # どれでもいいのでid=1のものを1つ更新をかけたいのですがそういったことは可能でしょうか? # 最後に「LIMIT 1」とつけたら # SQLSTATE[HY000]: General error: 1 near "LIMIT": syntax errorとエラーが表示されましたので間違っているとは思うのですが # こういったことが可能であれば構文的にご指摘いただけないでしょうか。 # # 'UPDATE list SET target=1 WHERE id=1 というので更新をかけたいのですが、id=1が複数あります。 どれでもいいのでid=1のものを1つ更新をかけたい' :- テーブルの更新(list,[id],[1],true,[target],[1]). テーブルの更新(_テーブル名,_鍵属性ならび,_鍵値ならび,_条件,_置換属性ならび,_置換値ならび) :- テーブル定義から実行項と引数ならびを得る(_テーブル名,P,_引数ならび), 鍵を設定する(_テーブル名,_鍵属性ならび,_鍵値ならび,_引数ならび), 条件に適合した節を削除する(P,_条件), 引数ならびの値を置換する(_テーブル名,_置換属性ならび,_置換値ならび,_引数ならび,_置換された引数ならび), 置換された節を先頭に加える(_テーブル名,_置換された引数ならび). 条件に適合した節を削除する(P,_条件) :- retract(P), '診断: 条件に適合した節を削除する'(P,_条件). '診断: 条件に適合した節を削除する'(P,_条件) :- call(_条件),!. '診断: 条件に適合した節を削除する'(P,_条件) :- asserta(P). テーブル定義から実行項と引数ならびを得る(_テーブル名,P,_引数ならび) :- findall(_,テーブル定義(_テーブル名,_,_),_引数ならび), P =.. [_テーブル名|_引数ならび],!. 鍵を設定する(_,[],[],_引数ならび). 鍵を設定する(_テーブル名,[_鍵属性|R1],[_鍵値|R2],_引数ならび) :- テーブル定義(_テーブル名,_nth1,_鍵属性), nth1(_nth1,_引数ならび,_鍵値), 鍵を設定する(_テーブル名,R1,R2,_引数ならび). 引数ならびの値を置換する(_,[],[],_置換された引数ならび,_置換された引数ならび). 引数ならびの値を置換する(_テーブル名,[_置換属性|R1],[_置換値|R2],_引数ならび,_置換された引数ならび) :- テーブル定義(_テーブル名,_nth1,_置換属性), 要素番号によるならびの置換(_nth1,_置換値,_引数ならび,_引数ならび_2), 引数ならびの値を置換する(_テーブル名,R1,R2,_引数ならび_2,_置換された引数ならび). 要素番号によるならびの置換(_要素番号,_置換要素,_対象ならび,_置換ならび) :- length([_|L0],_要素番号), append(L0,[_|R],_対象ならび), append(L0,[_置換要素|R],_置換ならび),!. 置換された節を先頭に加える(_テーブル名,_置換された引数ならび) :- P =.. [_テーブル名|_置換された引数ならび], asserta(P). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/551 # # こんにちは。 # 早速ですがtxtファイルに書いてある下記の数値を取り込んで平均点の大きい順に # 上から並び替え、別のtxtファイルに出力するプログラムを作りたいのですが # どうすればいいんでしょうか。 # # ご回答お願いします。 # # 14 # 1001 90 80 70 67 # 1002 60 50 40 60 # 1003 55 30 56 65 # 1004 88 70 77 20 # 1005 60 30 90 30 # 1006 100 0 100 100 # 1007 23 33 21 50 # 1008 65 66 46 98 # 1009 58 87 88 64 # 1010 30 55 63 32 # 1011 65 54 70 77 # 1013 98 89 79 90 # 1014 100 60 95 68 # 1016 30 22 56 30 # # 'txtファイルに書いてある下記の数値を取り込んで平均点の大きい順に上から並び替え、別のtxtファイルに出力する'(_txtファイル,_別のtxtファイル) :- 'txtファイルに書いてある下記の数値を取り込んで'(_txtファイル,LL1), 平均点の大きい順に上から並び替え(LL1,LL2), 別のtxtファイルに出力する(LL2,_別のtxtファイル). 'txtファイルに書いてある下記の数値を取り込んで'(_txtファイル,LL1) :- get_split_lines(_txtファイル,[' '],[_|LL1]). 平均点の大きい順に上から並び替え(LL1,LL2) :- 平均点の(LL1,LL3), 大きい順に上からならび替え(LL3,LL2). 平均点の([],[]). 平均点の([[A|L1]|R1],[[_平均点,A|L1]|R2]) :- 相加平均(L1,_平均点), 平均点の(R1,R2). 大きい順に上からならび替え(LL3,LL2) :- 整列(LL3,LL4), reverse(LL4,LL2). 別のtxtファイルに出力する(_別のtxtファイル,LL2) :- length(LL2,Len), open(_別のtxtファイル,write,Outstream), 出力する(Outstream,[[Len]|LL2]), close(Outstream). 出力する(Outstream,[]). 出力する(Outstream,[[_|L]|R]) :- atomic_list_concat(L,' ',S), writef(Outstream,'%t\n',[S]), 出力する(Outstream,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/434 # # [1] C言語 # [2] 1) codepad.org/u1WNoZPtの関数と反対の動作をする関数、 #     及び二つの関数の動作確認が出来るmain関数を作成せよ。 #   2) キーボードから入力されたアルファベット及び数字の数を数えて、 #     少ないほうを消去するプログラムを作成せよ。 #     ただし、同数の場合は両方とも消去する。 # [3.1] Windows7 # [3.3] C言語 # [4] 12/19 19時まで # [5] 特になし # # 'キーボードから入力されたアルファベット及び数字の数を数えて、少ないほうを消去するプログラムを作成せよ。ただし、同数の場合は両方とも消去する。'(_残った文字列) :- 'キーボードから入力された'(_文字列), 'アルファベット及び数字の数を数えて'(_文字列,_アルファベットの数,_数字の数), '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列). 'キーボードから入力された'(_文字列) :- write('アルファベットと数字だけからなる文字列を入力してください : '), get_line(_文字列). 'アルファベット及び数字の数を数えて'(_文字列,_アルファベットの数,_数字の数) :- count((sub_atom(_文字列,_,1,_,_文字),アルファベット(_文字)),_アルファベットの数), count((sub_atom(_文字列,_,1,_,_文字),数字(_文字)),_アルファベットの数). アルファベット(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. アルファベット(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 数字(_文字) :- _文字 @>= '0', _文字 @=< '9'. '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- 少ないほうを消去する。(_文字列,_アルファベットの数,_数字の数,_残った文字列). '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- 'ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列). '少ないほうを消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット < _数字の数, アルファベットを消去する(_文字列,_残った文字列). '少ないほうを消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット > _数字の数, 数字を消去する(_文字列,_残った文字列). 'ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット = _数字の数, 両方とも消去する(_文字列,_残った文字列). アルファベットを消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(アルファベット(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). 数字を消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(数字(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). 両方とも消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(数字(_文字)), \+(アルファベット(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). count(P,Count) :- findall(1,P,L), length(L,Count). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/392 # # (1)C言語 # (2)問題:キーボードから正の整数を入力するとその桁数を表示するプログラムを作成せよ。 # (3)windows7 visual studio2010 # (4)期限:12月20日 # (5)よろしくお願いします。 # # 'キーボードから正の整数を入力するとその桁数を表示する' :- 'キーボードから正の整数を入力すると'(_正の整数), 'その桁数を表示する'(_正の整数). 'キーボードから正の整数を入力すると'(_正の整数) :- 整数を得る(正の整数,_正の整数 > 0,_正の整数). 'その桁数を表示する'(_正の整数) :- number_chars(_正の整数,Chars), length(Chars,_その桁数), writef('%t桁です\n',[_その桁数]). 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(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. get_line(Line) :- read_line_to_codes(user_input,Codes), atom_codes(Line,Codes). % 以下のサイトは # 出典:: 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/187 # # [1]C言語 # [2]最大20人分の番号、所属、名前を管理する構造体配列を利用し #   入力したデータを元に社員タグを出力するプログラムを作成せよ #   実行例 #   http://ime.nu/iup.2ch-library.com/i/i0804401-1355254105.jpg # [3.1]Windows # [4]2012/12/13まで # [5]いかにも初心者が作るようなものだと嬉しいです # お願いします # # # % syain # input name...yamada # input post...education # input syainID...1234 # # input name...okada # input post...sales # input syainID...9876 # # input name...\d # # *******[ IDnumber 1234 ]******* # post:education # name:yamada # ******************************* # # *******[ IDnumber 9876 ]******* # post:sales # name:okeda # ******************************* # :- dynamic(社員/3). '最大20人分の番号、所属、名前を管理する述語を定義し、 入力したデータを元に社員タグを出力する' :- '最大20人分の番号、所属、名前を管理する構造体配列を利用し入力したデータを元に', 入力したデータを元に社員タグを出力する. '最大20人分の番号、所属、名前を管理する述語を定義し' :- 最大20人分の(Ln), '番号、所属、名前を管理する述語を定義し'(Ln). 最大20人分の(Ln) :- length(Ln,20). '最大20人分の番号、所属、名前を管理する述語を定義し'([_|Ln]) :- '番号、所属、名前の入力'(_名前,_所属,_社員タグ), '番号、所属、名前を管理する述語を定義し'(_名前,_所属,_社員タグ), '最大20人分の番号、所属、名前を管理する述語を定義し'(Ln),!. '最大20人分の番号、所属、名前を管理する述語を定義し'(_). '番号、所属、名前の入力'(_名前,_所属,_社員タグ) :- 名前の入力(_名前), 所属の入力(_所属), 社員タグの入力(_社員タグ). 名前の入力(_名前) :- write('input name...'), get_line(_名前), \+(_名前 = end_of_file). 所属の入力(_所属) :- write('input post...'), get_line(_所属). 社員タグの入力(_社員タグ) :- write('input SyainID...'), get_line(_社員ID). '番号、所属、名前を管理する述語を定義し'(_名前,_所属,_社員タグ) :- assertz(社員(_社員タグ,_所属,_名前)). 入力したデータを元に社員タグを出力する :- 社員(_社員タグ,_所属,_名前), writef('*******[ IDnumber %t ]*******\n post:%t\n name:%t\n*******************************\n\n',[_社員タグ,_所属,_名前]), fail. 入力したデータを元に社員タグを出力する. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/150 # # [1] c言語 # [2] # (1) # キーボードから二つの文字列を配列x[256],y[256] に入力する.配列xに含まれる文字列の # 後ろに配列yに含まれる文字列をつなげたものを配列z[256] に代入し,画面表示するプログ # ラムを作成せよ.例えば二つの文字列が「sch」,「ool」の場合,配列z に「school」が代入され, # 画面表示される.なお,NULL文字「\0」の扱いに注意し,配列z の文字列の後ろにNULL文 # 字を入れておくこと # # (2)以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入 # 力して下さい」などの画面表示)を行うこと. # 文字配列name[5][64] を作成する. # キーボードから5 人分の名前を入力し,name 配列に格納する. # キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示 # する.ただし,見つからなかった場合には,「見つかりません」と表示する. # 「quit」が入力されるまでの処理を繰り返す. # # '以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入力して下さい」などの画面表示)を行うこと. 1) 文字配列name[5][64] を作成する. 2) キーボードから5 人分の名前を入力し,name 配列に格納する. 3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する. 4) 「quit」が入力されるまで3)の処理を繰り返す.' :- '1) 文字配列name[5][64] を作成する.'(_name), '2) キーボードから5 人分の名前を入力し,name 配列に格納する.'(_name), '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,_名前), '4) 「quit」が入力されるまで3)の処理を繰り返す.'(_名前). '1) 文字配列name[5][64] を作成する.'(_name) :- length(_name,5), findall(L,( member(L,LL), length(L,64)), _name). '2) キーボードから5 人分の名前を入力し,name 配列に格納する.'(_name) :- findall(L,( member(L,_name), '名前を入力し,name 配列に格納する'(L)), _name). '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,名前) :- キーボードから名前を入力し(_名前), 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(_名前,_name). '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,_名前) :- '3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する.'(_name,_名前). 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(quit,_) :- !. 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(_名前,_name) :- 'name 配列の何番目に格納されているかを検索して'(_名前,_name), 表示する(_名前,_何番目),!. 'name 配列の何番目に格納されているかを検索して表示する.ただし,見つからなかった場合には,「見つかりません」と表示する'(_,_) :- writef('見つかりません\n'), fail. 'name 配列の何番目に格納されているかを検索して'(_名前,_name) :- atom_chars(_名前,Chars), nth1(_何番目,_name,L), append(Chars,_,L). 表示する(_名前,_何番目) :- writef('%tは%t番目にあります。\n',[_名前,_何番目]),!. '4) 「quit」が入力されるまで3)の処理を繰り返す.'(quit). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/313 # # SET型について質問です。 # # 'りんご', 'みかん', 'ばなな', 'めろん' # # のようなfruitという名のフィールドがあった時、 # 'りんご' と 'ばなな' 両方が含まれているデータを取得したいのですが、どのようにしたら良いでしょうか? # # WHERE `fruit` & 5 # # このようにしたら、 'りんご' または 'ばなな' のいずれかを持つデータが取得されてしまいます。 # # # MySQL5を使用しています。 # どなたかご教授お願いしますm(_ _)m # # 'りんご, みかん, ばなな, めろん のようなfruitという名のフィールドがあった時、 りんご と ばなな 両方が含まれているデータを取得したいのですが、どのようにしたら良いでしょうか?'(_fruit) :- テーブル検索の副目標を得る(テーブル1,[fruit],_テーブル定義,_副目標,_値ならび,[_fruit]), _副目標, 'fruitという名のフィールドがあった時、りんご と ばなな 両方が含まれているデータを取得したい'(_fruit). テーブル検索の副目標を得る(_テーブル名,_鍵名ならび,_テーブル定義,_副目標,_値ならび,_鍵の変数ならび) :- テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび). 副目標に鍵を設定する(_テーブル定義,_鍵名ならび,_値ならび,_鍵の変数ならび),!. テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび) :- findall([_位置,_属性名],( テーブル定義(_テーブル名,_位置,_属性名)), _テーブル定義), length(_テーブル定義,Len), length(_値ならび,Len), _副目標 =.. [_テーブル名|_値ならび]. 副目標に鍵を設定する(_,[],_,[]). 副目標に鍵を設定する(_テーブル定義,[_鍵名|R2],_値ならび,[_鍵の変数|R4]) :- member([_鍵の位置,_鍵名],_テーブル定義), nth1(_鍵の位置,_値ならび,_鍵の変数), 副目標に鍵を設定する(_テーブル定義,R2,_値ならび,R4). 'fruitという名のフィールドがあった時、りんご と ばなな 両方が含まれているデータを取得したい'(_fruit) :- sub_atom(_fruit,_,_,_,りんご), sub_atom(_fruit,_,_,_,ばなな). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/318 # # MySQL5.1 # # table1 # id,hoge1,hoge2 # # idが2,4,6の中で、hoge1が1,3,5のidを取得したい。 # # SELECT `id` FROM `table1` WHERE (`id` IN (2,4,6)) AND (`hoge1` IN (1,3,5)); # # このsqlでidが2,4,6の3件からの検索なりますか? # もっといいsqlありますか? # # 'table1 id,hoge1,hoge2 idが2,4,6の中で、hoge1が1,3,5のidを取得したい。'(_id) :- テーブル検索の副目標を得る(table1,[id,hoge1],_,_副目標,_,[_id,_hoge1]), member(_id,[2,4,6]), member(_hoge1,[1,3,5]), _副目標. テーブル検索の副目標を得る(_テーブル名,_鍵名ならび,_テーブル定義,_副目標,_値ならび,_鍵の変数ならび) :- テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび). 副目標に鍵を設定する(_テーブル定義,_鍵名ならび,_値ならび,_鍵の変数ならび),!. テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび) :- findall([_位置,_属性名],( テーブル定義(_テーブル名,_位置,_属性名)), _テーブル定義), length(_テーブル定義,Len), length(_値ならび,Len), _副目標 =.. [_テーブル名|_値ならび]. 副目標に鍵を設定する(_,[],_,[]). 副目標に鍵を設定する(_テーブル定義,[_鍵名|R2],_値ならび,[_鍵の変数|R4]) :- member([_鍵の位置,_鍵名],_テーブル定義), nth1(_鍵の位置,_値ならび,_鍵の変数), 副目標に鍵を設定する(_テーブル定義,R2,_値ならび,R4). % 以下のサイトは # # ならびの中央値 # 中央値(L,_中央値) :- 整列(L,L1), length(L,_要素数), Div_2 is _要素数 // 2, Mod_2 is _要素数 mod 2, 中央値(L1,Div_2,Mod_2,_中央値). 中央値(L,Div_2,1,_中央値) :- nth0(Div_2,L,_中央値). 中央値(L,Div_2,0,_中央値) :- nth1(Div_2,L,_値_1), nth0(Div_2,L,_値_2), _中央値 is (_値_1 + _値_2) / 2. 整列([],[]). 整列([_軸要素|R],L2) :- 分割(_軸要素,R,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび), 整列(_軸要素に等しいか小さい要素ならび,_整列した軸要素に等しいか小さい要素ならび), 整列(_軸要素より大きい要素ならび,_整列した軸要素より大きい要素ならび), append(_整列した軸要素に等しいか小さい要素ならび,[_軸要素|_整列した軸要素より大きい要素ならび],L2). 分割(_,[],[],[]). 分割(_軸要素,[_値|R1],[_値|R2],R3) :- _値 @=< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[_値|R1],R2,[_値|R3]) :- _値 @> _軸要素, 分割(_軸要素,R1,R2,R3). % 以下のサイトは # # ならびの中央値 # 中央値(_ならび,_中央値) :- 整列(_ならび,_整列済みならび), length(L0,_同じ要素数), length(R,_同じ要素数), 中央値(_整列済みならび,L0,R,_中央値),!. 中央値(_整列済みならび,L0,R,_中央値) :- append(L0,[_中央値_1,_中央値_2|R],_整列済みならび), _中央値 is (_中央値_1 + _中央値_2) / 2. 中央値(_整列済みならび,L0,R,_中央値) :- append(L0,[_中央値|R],_整列済みならび). 整列([],[]). 整列([_軸要素|R],L2) :- 分割(_軸要素,R,_軸要素に等しいか小さい要素ならび,_軸要素より大きい要素ならび), 整列(_軸要素に等しいか小さい要素ならび,_整列した軸要素に等しいか小さい要素ならび), 整列(_軸要素より大きい要素ならび,_整列した軸要素より大きい要素ならび), append(_整列した軸要素に等しいか小さい要素ならび,[_軸要素|_整列した軸要素より大きい要素ならび],L2). 分割(_,[],[],[]). 分割(_軸要素,[_値|R1],[_値|R2],R3) :- _値 @=< _軸要素, 分割(_軸要素,R1,R2,R3). 分割(_軸要素,[_値|R1],R2,[_値|R3]) :- _値 @> _軸要素, 分割(_軸要素,R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/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(ボード保存(終了時点のボードを保存する(_現在のボード)). % 以下のサイトは ヒストグラムを出力する(_標本ならび) :- ヒストグラムの用意(_標本ならび,LL1), 転置して出力する(LL1). ヒストグラムの用意(_標本ならび,LL1) :- '標本の最大値要素数のリストを作る'(_標本ならび,L1), findall(L1,( 星のリストに変換(_標本ならび,L1)),LL1). '標本の最大値要素数のリストを作る'(_標本ならび,L1) :- 最大値(_標本ならび,_最大値), length(L1,_最大値). 星のリストに変換(_標本ならび,L1) :- member(_標本値,_標本ならび), length(_星のリスト,_標本値), 空白リストと星のリスト(_星のリスト,L1). 空白リストと星のリスト(_星のリスト,L1) :- append(_空白リスト,_星のリスト,L1), all(_空白リスト,' '), all(_星のリスト,*). 転置して出力する(LL1) :- 転置(LL1,LL2), 出力する(LL2). 出力する(LL) :- forall( ならび要素を文字列に変換して(LL,_出力行文字列), writef('%w\n',[_出力行文字列])). ならび要素を文字列に変換して(LL,_出力行文字列) :- member(L,LL), atomic_list_concat(L,_出力行文字列). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). all([],_). all([V|R],V) :- all(R,V). 最大値([A|R],_最大値) :- 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値(_ならび,_最大値_1,_最大値) :- '_ならびの先頭要素の値によって_最大値_1を置き換えて行く'(_ならび,_最大値_1,_最大値). '_ならびの先頭要素の値によって_最大値_1を置き換えて行く'(_ならび,_最大値_1,_最大値) :- '_ならびの先頭要素が_最大値_1より大きい場合、_最大値_1を置き換える'(_ならび,_最大値_1,_最大値). '_ならびの先頭要素の値によって_最大値_1を置き換えて行く'(_ならび,_最大値_1,_最大値) :- '_ならびの先頭要素が_最大値_1と等しいか小さい場合、_最大値_1を置き換えない'(_ならび,_最大値_1,_最大値). '_ならびの先頭要素が_最大値_1より大きい場合、_最大値_1を置き換える'([_先頭要素|R],_最大値_1,_最大値) :- _先頭要素 @> _最大値_1, 最大値(R,_先頭要素,_最大値). '_ならびの先頭要素が_最大値_1と等しいか小さい場合、_最大値_1を置き換えない'([_先頭要素|R],_最大値_1,_最大値) :- _先頭要素 @=< _最大値_1, 最大値(R,_最大値_1,_最大値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/7 # # [1] 授業単元:問題1:二次元配列 問題2:関数 # [2] 問題文(含コード&リンク): # 問題1:ファイルから入力した英小文字a-zの頻度のヒストグラムを # 出力するプログラムを書いてください。入力ファイルはプログラムファイルを使えば良い。 # # 問題2:1文字を引数としてそれが小文字であれば大文字にして返し # そうでなければそのまま文字を返す関数を作成しキーボードから # 文字入力としてこの関数の動作を確認せよ。 # [3.1] OS: windows vista #  [3.2] コンパイラ名とバージョン:visual studio2010 #  [3.3] 言語: C言語 # [4] 期限: 11月30日 # [5]ポインタはやってません。宜しくお願いします 。 # # 'ファイルから入力した英小文字a-zの頻度のヒストグラムを出力するプログラムを書いてください。入力ファイルはプログラムファイルを使えば良い。' :- get_chars('c161_7.html',Chars), '英小文字a-zの頻度の'(Chars,[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]), ヒストグラムを出力する([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]). '英小文字a-zの頻度の'([],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]). '英小文字a-zの頻度の'([_文字|_残りならび],L1,L) :- 英小文字ならば頻度を更新(_文字,L1,L2), '英小文字a-zの頻度の'(_残りならび,L2,L),!. '英小文字a-zの頻度の'([_|_残りならび],L1,L) :- '英小文字a-zの頻度の'(_残りならび,L1,L). 英小文字ならば頻度を更新(_文字,L1,L2) :- nth0(Nth0,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_文字), length(L0,Nth0), append(L0,[S|R],L1), S2 is S + 1, append(L0,[S2|R],L2). ヒストグラムを出力する(L) :- ヒストグラムの用意(L,LL1), 転置(LL1,LL2), 出力する(LL2). ヒストグラムの用意(L,LL1) :- 最大値(L,_最大値), length(L1,_最大値), findall(L1,( 星のリストに変換(L,L1)), LL1). 星のリストに変換(L,L1) :- member(N,L), length(R,N), append(L0,R,L1), all(L0,' '), all(R,*). 出力する([]). 出力する([L|R]) :- atomic_list_concat(L,S), writef('%t\n',[S]), 出力する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/456 # # 【 課題 】http://ime.nu/ideone.com/hRQD87 # try catch # 【 Ver 】1.7.0_07 # 【 形態 】Javaアプリケーション # 【 期限 】27日 11:00まで # よろしくお願いします # # # 問題2:ある文字列が標準入力されたとき,次のような変換を行うプログラムKadai02.java を作成せ # よ.String クラスの,charAt メソッド,length メソッド,valueOf メソッドなどを使うとよい. #  ’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える. #  空白は空白のままとする. #  ”ab Adaf”という文字列であれば,”xo ooxo”に変換される. # 'ある文字列が標準入力されたとき,次のような変換を行う. ’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える. 空白は空白のままとする. "ab Adaf"という文字列であれば,"xo ooxo"に変換される.' :- ある文字列が標準入力されたとき(_ある文字列), '’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(_ある文字列,_変換された文字列), writef('%t',[_変換された文字列]). ある文字列が標準入力されたとき(_ある文字列) :- get_line(_ある文字列). '’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(_ある文字列,_変換された文字列) :- findall(_変換された文字,( sub_atom(_ある文字列,_,1,_,_文字), '文字が’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(_文字,_変換された文字)), L), atomic_list_concat(L,_変換された文字列). '文字が’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(a,x) :- !. '文字が’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(' ',' ') :- !. '文字が’a’ ならば’x’,それ以外の文字ならば’o’ に置き換える.空白は空白のままとする.'(_,o). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349545643/864 # # ../test/read.cgi/tech/1349545643/845の問題の # # 「取り出した玉が黒であるとき、その玉を取り出した箱に # 残っている玉が黒玉である確率を求めよ」 # # という文章を # # 「取り出した玉が黒であるとき、その玉を取り出した箱から # もう一度玉を取り出したとき黒玉である確率を求めよ。」 # # に変更すると、二つの箱に任意個の白黒玉を入れた場合を考える事ができる。 # 片方の箱に{白, 白, 黒}、もう一方に{黒, 黒, 黒, 白}が入ってる場合の確率を求めよ。 # '取り出した玉が黒であるとき、その玉を取り出した箱からもう一度玉を取り出したとき黒玉である確率を求めよ。'(_一つ目の箱,_二つめの箱,_確率) :- '箱から黒を取り出した後に、次に黒を取り出す確率は'(_一つ目の箱,_確率_1), '箱から黒を取り出した後に、次に黒を取り出す確率は'(_二つ目の箱,_確率_2), _求める確率 is 0.5 * _確率_1 + 0.5 * _確率_2. '箱から黒を取り出した後に、次に黒を取り出す確率は'(_箱,_確率) :- 黒玉を一つ削除する(_箱,_黒玉を一つ削除した箱), length(_黒玉を一つ削除箱,_残りの玉の数), 黒玉の数(_黒玉を一つ削除した箱,_残りの黒玉の数), 一つの箱で次に黒玉を取り出す確率を求める(_残りの黒玉の数,_残りの玉の数,_確率). 黒玉を一つ削除する(L1,L1_2) :- append(L0,[黒|R],L1), append(L0,R,L1_2),!. 黒玉を一つ削除する(L,L). 黒玉の数(_箱,_黒玉の数) :- findall(_,member(黒,_箱),L), length(L,_黒玉の数). 一つの箱で次に黒玉を取り出す確率を求める(_,0,_) :- write('黒玉を取り出したら残りの玉はもうありませんでした。\n確率計算はできません。\n'),!, fail. 一つの箱で次に黒玉を取り出す確率を求める(_残りの黒玉の数,_残りの玉の数,_確率) :- _確率 is _残りの黒玉の数 / _残りの玉の数. % 以下のサイトは # 出典:: 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/1349527750/880 # # [1] 授業単元:C言語 # [2] 問題 http://codepad.org/I9NEBx3U # # #  [3]初日に1円、2日目に2円、3日目に4円というように #     前日の2倍の金額を貯金していったとき、貯金の合計金額が #     100万円を超えるのは何日目になるかを算出するプログラムを作成せよ。 # '初日に1円、2日目に2円、3日目に4円というように 前日の2倍の金額を貯金していったとき、貯金の合計金額が 100万円を超えるのは何日目になるかを算出する'(_何日目) :- 数列が1000000を超えるまで([1,2,4|R],_), length([1,2,4|R],_何日目). 数列が1000000を超えるまで([N],_) :- N > 1000000,!. 数列が1000000を超えるまで([A,B|R],_公差) :- 等差数列の連続した二項(A,B,_公差), 数列が1000000を超えるまで([B|R],_公差). 数列が1000000を超えるまで([A,B|R],_公比) :- 等比数列の連続した二項(A,B,_公比), 数列が1000000を超えるまで([B|R],_公比). 等差数列の連続した二項(A,B,_公差) :- var(B), B is A + _公差. 等差数列の連続した二項(A,B,_公差) :- \+(var(B)), _公差 is B - A. 等比数列の連続した二項(A,B,_公比) :- var(B), B is A * _公比. 等比数列の連続した二項(A,B,_公比) :- \+(var(B)), _公比 is B / A. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/880 # # [1] 授業単元:C言語 # [2] 問題 http://codepad.org/I9NEBx3U # # #  [1] 次の数列の第20項までの和を計算するプログラムを繰り返し処理を用いて作成せよ。 #      5,10,15,20,・・・・ # '次の数列の第20項までの和を計算する      5,10,15,20,・・・・'(_数列の和) :- 次の数列の第20項までの([5,10,15,20|R]), 和を計算する([5,10,15,20|R],_数列の和). 次の数列の第20項までの(L) :- 第20項までの(L), 次の数列の(L,_). 第20項までの(L) :- length(L,20). 次の数列の([],_). 次の数列の([A,B|R],_公差) :- 等差数列の連続した二項(A,B,_公差), 次の数列の([B|R],_公差). 次の数列の([A,B|R],_公比) :- 等比数列の連続した二項(A,B,_公比), 次の数列の([B|R],_公比). 等差数列の連続した二項(A,B,_公差) :- var(B), B is A + _公差. 等差数列の連続した二項(A,B,_公差) :- \+(var(B)), _公差 is B - A. 等比数列の連続した二項(A,B,_公比) :- var(B), B is A * _公比. 等比数列の連続した二項(A,B,_公比) :- \+(var(B)), _公比 is B / A. 和を計算する([],0). 和を計算する([_数|R],_和) :- 和を計算する(R,_和_1), _和 is _和_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/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/tech/1337692704/440 # # 「課題」 # 以下に示すのは、int型配列aの要素の中で値が正であるものを順に並べた要素 # をもつ配列bを作るプログラムである(配列aが{5,-1,3,4,-2,7}であれば、配列bは{5,4 # ,3,7}となる)  # int count =0; # for (int i=0;i<a.length; i++) # if (a[i]>0) count++ # int[] b =new int[count]; # int j =0; # for (int i=0; i<a.length;i++) # if(a[i]>0)b[j++]=a[i]; # # これを実行できるようにする宿題です。 # 明日の朝までに提出です。 # # '整数のならびaの要素の中で値が正であるものを順に並べた要素をもつならびbを作る'(_a,_b) :- findall(A,( member(A,_a), A >= 0), _b). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/443 # # すみませんがもう一つできない問題があります。 # {課題} # 以下に示すのは、すべての要素の値が0である2行3列のint型の2次元配列 # aを作るプログラムである。 # # int[][]a=new int[2][3]; # # int[][]a={0,0,0,},{0,0,0}; # # int[][]a={new int[3],new int[3]}; # # int[][] a; # a=new int[2][]; # a[0]=new int[3]; # a[1]=new int[3]; # # この4つをそれぞれ使って四つプログラム作る問題です。 # # 明日の朝9:00に提出です。 # できれば4:30ぐらいまでにお願いしたいです>< # 何度も申し訳ないです>< # # 'すべての要素の値が0である2行3列のint型の2次元配列aを作る'(_a) :- length(_a,2), findall(L,( member(L,_a), length(L,3), all(L,0)), _a). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/443 # # すみませんがもう一つできない問題があります。 # {課題} # 以下に示すのは、すべての要素の値が0である2行3列のint型の2次元配列 # aを作るプログラムである。 # # int[][]a=new int[2][3]; # # int[][]a={0,0,0,},{0,0,0}; # # int[][]a={new int[3],new int[3]}; # # int[][] a; # a=new int[2][]; # a[0]=new int[3]; # a[1]=new int[3]; # # この4つをそれぞれ使って四つプログラム作る問題です。 # # 明日の朝9:00に提出です。 # できれば4:30ぐらいまでにお願いしたいです>< # 何度も申し訳ないです>< # # 'すべての要素の値が0である2行3列のint型の2次元配列aを作る'(_a) :- length(_a,2), findall(L,( member(L,_a), length(L,3), all(L,0)), _a). 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/1337692704/437 # # 【 形態 】Javaアプリケーション # 【 期限 】一週間後まで # 【 Ver  】java version "1.7.0_03" # 【 課題 】2次元配列、1次元配列を使って科目得点表を表示するプログラムを作成する。 #       平均点に関しては、プログラム内で求めて表示する。また、配列の要素は必要な個数分だけにする。 #        #           国語  数学  英語  社会  理科  平均 #       青木   50   90   76           72 #       木村   80   46   84   67       69 #       山田   30   69   72   89   56   63 # #       科目名、生徒はStringクラスの1次元配列、点数はint型の2次元配列で初期化。 # # 【 補足 】点数、平均点の表示は何とか出来たのですが、表にしようとすると、青木の社会、理科、木村の理科の部分が足りず、ArrayIndexOutOfBoundsExceptionが発生してしまいます。 # '2次元配列、1次元配列を使って科目得点表を表示するプログラムを作成する。 平均点に関しては、プログラム内で求めて表示する。また、配列の要素は必要な個数分だけにする。                  国語  数学  英語  社会  理科  平均       青木   50   90   76           72       木村   80   46   84   67       69       山田   30   69   72   89   56   63 科目名、生徒はStringクラスの1次元配列、点数はint型の2次元配列で初期化。' :- 科目名ならび(_科目名ならび), 生徒ならび(_生徒ならび), 得点ならび(_得点ならび), 科目得点表を表示する(_得点ならび,_生徒ならび,_得点ならぴ). 科目名ならび([国語,数学,英語,社会,理科]). 生徒ならび([青木,木村,山田]). 得点ならび([[50,90,76,[],[],72],[80,46,84,67,[],69],[30,69,72,89,56,63]]). 科目得点表を表示する(_科目ならび,_生徒ならび,_得点ならぴ) :- 科目見出し(_科目ならび), 行表示(_生徒ならび,_得点ならび). 科目見出し(_科目ならび) :- write(' '), append(_,[A|R],_科目ならび), 幅は8桁で表示(A), R = [], write('\n'). 行表示([],[]). 行表示([_生徒|R1],[_得点ならび|R2]) :- writef(' %t',[_生徒]), 得点列を表示する(_得点ならび), 行表示(R1,R2). 得点列を表示する(_得点ならび) :- append(_,[N|R],_得点ならび), 幅は8桁で表示(N), R = [], write('\n'). 幅は8桁で表示(A) :- atom(A), 文字列の末尾を空白で埋める(A,S), writef('%t',[S]). 幅は8桁で表示(N) :- integer(N), 整数の頭部を空白で埋める(N,S), writef('%t',[S]). 文字列の末尾を空白で埋める(A,S) :- length(L,8), atom_chars(A,L1), append(L1,L2,L), all(L2,' '), atom_chars(S,L2). 整数の頭部を空白で埋める(A,S) :- length(L,8), number_chars(A,L2), append(L1,L2,L), all(L1,' '), atom_chars(S,L2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/693 # # [1]C/C++プログラミング実習 まとめ  # [2]問題 http://ime.nu/codepad.org/CfJninhf #   問題文中に出てくる histograms.txt # [3]visual studio 2010 # [4]11月19日 10時 # [5]前にここのスレでお世話になりました../test/read.cgi/tech/1349527750/603です。 #   この前の課題を提出した所、今度はまとめとして前の問題の発展問題がだされました。 #   前に頂いたプログラムを改変してみようと思ったのですが、今回の問題が複雑になりすぎてて #   お手上げ状態です。どなたか助けていただけると幸いに思います。 # # /* # histograms.txtという文章ファイルがある。 # このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が # 並んでいて、それらの数字は水平TAB文字によって区切られている。 # このhistograms.txtを自動的に以下の条件のもとに改変して # train.datというファイルとして出力をするプログラムを作れ。 # # 条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。 #     (例 image/0-21C5N550AVL.jpg → 0 #        image/1-19690369.jpg  → 1 #        image/2-24891960.jpg  → 2 #        image/3-12725422.jpg  → 3) # # 条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。 # # 条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、 #     番号:数値?番号:数値?番号:数値?…という形に書き換える #     (例 0  0.0309051 0 0   0.00496689 #      → 2:0.0309051 5:0.00496689 …… ) # # 条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き #              指定した方の名前で出力を行う。 # # */ 'histograms.txtという文章ファイルがある。 このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が 並んでいて、それらの数字は水平TAB文字によって区切られている。 このhistograms.txtを自動的に以下の条件のもとに改変して train.datというファイルとして出力をするプログラムを作れ。 条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。     (例 image/0-21C5N550AVL.jpg → 0        image/1-19690369.jpg  → 1        image/2-24891960.jpg  → 2        image/3-12725422.jpg  → 3) 条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。 条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、     番号:数値?番号:数値?番号:数値?…という形に書き換える     (例 0  0.0309051 0 0   0.00496689      → 2:0.0309051 5:0.00496689 …… ) 条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き              指定した方の名前で出力を行う。' :- 'histograms.txtという文章ファイルがある。このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が並んでいて、それらの数字は水平TAB文字によって区切られている。このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする'. 'histograms.txtという文章ファイルがある。このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が並んでいて、それらの数字は水平TAB文字によって区切られている。このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする' :- 'このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする'. 'このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする' :- 'histograms.txtを項区切りの情報に変換する'(LL0), '条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。'(LL0,LL1), '条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、'(LL1,LL3), '条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。'(LL3,_行ならび), '条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(LL3). 'histograms.txtを項区切りの情報に変換する'(LL0) :- get_split_lines('histograms.txt',['\t'],LL0). '条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。'(LL0,LL1) :- findall([N|R],( member([File|R],LL0), split(File,['/','-'],[_,N|_])), LL1). '条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、'(LL2,LL3) :- findall([N|L],( member([N|R],LL2), 左から順に番号を振った上で要素が0のものを削除し(R,L)), LL3). 左から順に番号を振った上で要素が0のものを削除し(L1,L) :- findall(Nth:A,( append(L0,[A|_],L1), \+(A = 0), length([_|L0],Nth)), L). '条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。'(LL1,L) :- findall(S,( member(L,LL1), atomic_list_concat(LL1,' ',S)), L). '条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(_行ならび) :- 'train.datかtest.datのどちらのファイル名で出力するかを聞き', 整数を得る('1または2のどちらかの数字',(N>=1,N=<2),N), 指定した方の名前で出力を行う(N,_指定した方の名前). 'train.datかtest.datのどちらのファイル名で出力するかを聞き' :- write('ファイル名を選択します。\n1.. train.dat 2.. test.dat \n'). 指定した方の名前で出力を行う :- 指定した方の名前で(_指定した方の名前), 出力を行う(_指定して方の名前,_行ならび). 指定した方の名前で(_指定した方の名前) :- 整数を得る('1または2',(N == 1;N == 2),N), 指定した方の名前で(N,_指定した方の名前). 指定した方の名前(1,'train.dat'). 指定した方の名前(2,'test.dat'). 出力を行う(_指定した方の名前,_行ならび) :- put_lines(_指定した方の名前,_行ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/666 # # [1] 配列ポインタ # [2] n件の浮動小数点型データを配列に入力して、その最大値を出力するプログラムを作成。 # ただし、配列の定義以外で添字演数子[ ]を用いないまた、*(p+i)、*p++の形式2つを用いた場合をそれぞれ作成。また、入出力処理をファイル処理に変更して、入出力ファイル名はコマンドラインで指定する。 # [3]Linux、gcc、C # # [4] 至急 # [5] 緊急で無理とは思いますがお願いします # # 'n件の浮動小数点型データをならびに入力して、その最大値を出力する'(_n件,_最大値) :- 'n件の浮動小数点型データをならびに入力して'(_n件,_浮動小数点型データならび), その最大値を出力する(_浮動小数点型データならび). 'n件の浮動小数点型データをならびに入力して'(_n件,_浮動小数点型データならび) :- length(_浮動小数点型データならび,_n件), findall(_浮動小数点型データ,( member(_,_浮動小数点型データならび), 実数を得る('浮動小数点型データ',浮動小数点型データ)), _浮動小数点型データならび). その最大値を出力する(_浮動小数点型データならび) :- その最大値を(_浮動小数点型データならび,_最大値), writef('最大値は %t です\n',[_最大値]). その最大値を([A|R],A,_最大値) :- その最大値を(R,A,_最大値). その最大値を([],_最大値,_最大値). その最大値を([A|R],_最大値_1,_最大値) :- A > _最大値_1, その最大値を(R,A,_最大値). その最大値を([A|R],_最大値_1,_最大値) :- A =< _最大値_1, その最大値を(R,_最大値_1,_最大値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/628 # # [1] c言語 # [2] 問題文:C言語でのポインタを使った行列の操作です。 # 1 2 3 0 # 0 0 0 1 # 2 0 0 2 # 0 0 0 1 # をファイルから読み込み,以下の操作を実行せよ。 # 1,非零の要素を左から右へ、上から下へ書きならべた配列を作り、 # [1 2 3 1 2 2 1]とする。 # 2,各要素が何行目・何列目にあるかを別の配列に格納し、 # A = [1 2 3 1 2 2 1] 非零要素リスト # IA = [1 1 1 2 3 3 4] i行 # JA = [1 2 3 4 1 4 4] j列 # の配列が出力されるようにせよ。 # 3,何番目の要素からiが始まるかを書きならべる。 # IAの中で、1が初めに出現するのは1番目、2が初めに出現するのは4番目、3が初めに出現するのは5番目、4が初めに出現するのは7番目なので、 # IA' = [1 4 5 7] の配列が出力されるようにせよ # # '非零の要素を左から右へ、上から下へ書きならべた配列を作り'(_行列,_非零要素ならび) :- flatten(_行列,_要素ならび), findall(_非零要素,( member(_非零要素,_行列), \+(_非零要素 = 0)), _非零要素ならび). '各要素が何行目・何列目にあるかを別の配列に格納し'(_行列,_非零要素ならび,_非零要素の元々の行位置ならび,_非零要素の元々の列位置ならび) :- findall([_非零要素,_非零要素の元々の行位置,_非零要素の元々の列位置],( nth1(_非零要素の元々の行位置,_行列,_行), nth1(_非零要素の元々の列位置,_行,_非零要素), \+(_非零要素 = 0)), LL), 三つのならびに分解(LL,_非零要素ならび,_非零要素の元々の行位置ならび,_非零要素の元々の列位置ならび). 三つのならびに分解([],[],[],[]). 三つのならびに分解([[A,B,C]|R1],[A|R2],[B|R3],[C|R4]) :- 三つのならびに分解(R1,R2,R3,R4). '何番目の要素からiが始まるかを書きならべる。IAの中で、1が初めに出現するのは1番目、2が初めに出現するのは4番目、3が初めに出現するのは5番目、4が初めに出現するのは7番目なので、IA = [1 4 5 7] の配列が出力されるようにせよ'(_非零要素の元々の行位置ならび,_何番目の非零要素から元々の行列での行が変わったかを示すならび) :- findall(_何番目,( append(L0,[I|R],_非零要素の元々の行位置ならび), \+(member(I,L0), length([_|L0],_何番目)), _何番目の非零要素から元々の行列での行が変わったかを示すならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/603 # # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 lこのtxtファイルを読み取って ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), open('書き換え.txt',write,Outstream), ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(Outstream,LL), close(Outstream). ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(Outstream,[]) :- !. ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(Outstream,[[_|L]|R) :- 一行出力する(Outstream,L), ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(Outstream,R). 一行出力する(Outstream,L) :- append(L0,[N|R1],L), 要素が0のものを削除し出力する(Outstream,L0,N), R1 = [], write('\n'). 要素が0のものを削除し出力する(Outstream,L0,0) :- !. 要素が0のものを削除し出力する(Outstream,L0,A) :- length([_|L0],Nth), writef(Outstream,'%t:%t ',[Nth,A]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/603 # # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 lこのtxtファイルを読み取って ファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), ファイル名を削除し(LL,LL1), 右から順に番号を振った上で(LL1,LL2), 要素が0のものを削除し書き換え(LL2,LL3), 書き換えtxtファイルに出力する(LL3). ファイル名を削除し([],[]). ファイル名を削除し([[_|L1]|R1],[L1|R2]) :- ファイル名を削除し(R1,R2). 右から順に番号を振った上で([],[]). 右から順に番号を振った上で([L1|R1],[L2|R2]) :- findall(N-A,( append(_,[A|R],L1), length([_|R],N)), L2), 右から順に番号を振った上で(R1,R2). 要素が0のものを削除し書き換え([],[]). 要素が0のものを削除し書き換え([N-0|R1],R2) :- 要素が0のものを削除し書き換え(R1,R2). 要素が0のものを削除し書き換え([N:A|R1],[N-A|R2]) :- \+(A = 0), 要素が0のものを削除し書き換え(R1,R2). 書き換えtxtファイルに出力する(LL3) :- open('書き換え.txt',write,Outstream), append(_,[L|R],LL3), 行要素を出力する(Ountstream,L), R = [], close(Outstream). 行要素を出力する(Outstream,[]) :- writef(Outstream,'\n'). 行要素を出力する(Outstream,[N:A|R]) :- writef(Outstream,'%t:%t ',[N,A]), 行要素を出力する(Outstream,R). % 以下のサイトは # 課題で「自作の関数(main)以外)を少なくとも一つ実装して使用せよ」という条件が出されたんですが、次レスようなプログラムで条件を満たしていますか? # # ちなみに課題はx要素の二乗和を求める課題で、元となった参考プログラムにsum(void)はありませんでした。 # 'x要素の二乗和を求める'(_x要素,_二乗和) :- length(Ln,_x要素), findsum(_x2,( member(_,Ln), 整数を得る(整数,_x), _x2 is _x * _x), _二乗和). % 以下のサイトは # このディレクトリの索引 # [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] 問題文( # 問題1 # キーボードから入力した5 件のデータのうち、最大値と最小値を調べ、最後に # 表示してください。なお、プログラム作成時は以下の仕様に従ってください。 # ファイル名: kadai2.c # 【 問題作成時の注意点 】 # ・キーボードから入力したデータはint 型配列で管理してください。 # ・データを入力する際にはscanf 関数を利用してください。 # ・画面にメッセージを表示する際にはprintf 関数を利用してください。 # なお、結果表示時は、最大値/最小値となる要素の添字もあわせて # 表示してください。また、最大値/最小値が複数ある場合は、 # すべての要素を表示してください。 # 【 実行時のイメージ 】 # ----------------------------- # data[0] ... 69 ←「...」の後ろはキーボード入力部 # data[1] ... 91 ←「...」の後ろはキーボード入力部 # data[2] ... 91 ←「...」の後ろはキーボード入力部 # data[3] ... 72 ←「...」の後ろはキーボード入力部 # data[4] ... 86 ←「...」の後ろはキーボード入力部 # Max : data[1] = 91 # Max : data[2] = 91 # Min : data[0] = 69 # ----------------------------- # # [3] 環境 #  [3.1] OS: Windows #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C++ # [4] 期限: ([2006年11月2日17:30まで # [5] その他の制限:なし # 'キーボードから入力した5 件のデータのうち、最大値と最小値を調べ、最後に 表示してください。なお、プログラム作成時は以下の仕様に従ってください。 ファイル名: kadai2.c 【 問題作成時の注意点 】 ・キーボードから入力したデータはint 型配列で管理してください。 ・データを入力する際にはscanf 関数を利用してください。 ・画面にメッセージを表示する際にはprintf 関数を利用してください。 なお、結果表示時は、最大値/最小値となる要素の添字もあわせて 表示してください。また、最大値/最小値が複数ある場合は、 すべての要素を表示してください。 【 実行時のイメージ 】 ----------------------------- data[0] ... 69 ←「...」の後ろはキーボード入力部 data[1] ... 91 ←「...」の後ろはキーボード入力部 data[2] ... 91 ←「...」の後ろはキーボード入力部 data[3] ... 72 ←「...」の後ろはキーボード入力部 data[4] ... 86 ←「...」の後ろはキーボード入力部 Max : data[1] = 91 Max : data[2] = 91 Min : data[0] = 69 ----------------------------- ' :- 'キーボードから入力した5 件のデータのうち、最大値と最小値を調べ、最後に表示してください。'. 'キーボードから入力した5 件のデータのうち、最大値と最小値を調べ、最後に表示してください。' :- キーボードから入力した5 件のデータのうち(_5件のデータ), 最大値と最小値を調べ(_5件のデータ,_最大値情報のならび,_最小値の情報ならび), 最大値の情報を表示する(_最大値の情報ならび), 最小値の情報を表示する(_最小値の情報ならび). キーボードから入力した5 件のデータのうち(_5件のデータ) :- length(_5件のデータ,5), findall(_データ,( append(L0,[_|_],_5件のデータ), データを得る(L0,_データ)), _5件のデータ). データを得る(L0,_データ) :- length(L0,_0基準位置), writef('data[%t] ... ',[_0基準位置]), 整数を得る(整数,_データ),!. 最大値と最小値を調べ(_5件のデータ,_最大値の情報ならび,_最小値の情報ならび) :- 位置情報を持った最大値(_5件のデータ,_最大値の情報ならび), 位置情報を持った最小値(_5件のデータ,_最小値の情報ならび). 位置情報を持った最大値(_5件のデータ,_最大値の情報ならび) :- findall([_位置情報,_最大値],( append(L0,[_最大値|R],_5件のデータ), すべてが等しいか小さい(L0,_最大値), すべてが等しいか小さい(R,_最大値), length(L0,_位置情報)), _最大値の情報ならび). 位置情報を持った最小値(_5件のデータ,_最小値の情報ならび) :- findall([_位置情報,_最大値],( append(L0,[_最大値|R],_5件のデータ), すべてが等しいか大きい(L0,_最小値), すべてが等しいか大きい(R,_最小値), length(L0,_位置情報)), _最小値の情報ならび). すべてが等しいか小さい([],_). すべてが等しいか小さい([A|R],_基準値) :- A @=< _基準値, すべてが等しいか小さい(R,_基準値). すべてが等しいか大きい([],_). すべてが等しいか大きい([A|R],_基準値) :- A @>= _基準値, すべてが等しいか大きい(R,_基準値). 最大値の情報を表示する(_最大値の情報ならび) :- append(_,[[_0基準位置,_最大値]|R],_最大値の情報ならび), writef('Max : data[%t] = %t\n',[_0基準位置,_最大値]), R = []. 最小値の情報を表示する(_最小値の情報ならび) :- append(_,[[_0基準位置,_最小値]|R],_最小値の情報ならび), writef('Min : data[%t] = %t\n',[_0基準位置,_最小値]), 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]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 以下のサイトは # # 値の決まらない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. % 以下のサイトは # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク):() # # アルファベット小文字からなる文字列 s が与えられる. # s から何文字か削除して回文(左から読んでも右から読んでも同じ)にしたい. # 最小何文字削除すれば回文となるか計算するプログラムを作れ. # なお,s の文字数は 100000 以下としてよい. # # 例: # s = ababba → 1 (右から 2 番目の b を消して ababa) # s = abcdef → 5 (1 文字残して残りを削除する) # # # [3] 環境 #  [3.1,2] OS,コンパイラ: 問わず #  [3.3] 言語: どちらでも可 # [4] 期限: 2008/06/08 # [5] その他の制限: 特に無し 'アルファベット小文字からなる文字列 s が与えられる.s から何文字か削除して回文(左から読んでも右から読んでも同じ)にしたい.最小何文字削除すれば回文となるか計算するプログラムを作れ.なお,s の文字数は 100000 以下としてよい.' :- 'アルファベット小文字からなる文字列 s が与えられる'(_s), 's から何文字か削除して回文(左から読んでも右から読んでも同じ)にしたい.最小何文字削除すれば回文となるか計算するプログラムを作れ.なお,s の文字数は 100000 以下としてよい.'(_s,_最小何文字の削除で済む), writef('最小 %t 文字の削除で回文は出来上がります\n',[_最小何文字の削除で済む]),!. 's から何文字か削除して回文(左から読んでも右から読んでも同じ)にしたい.最小何文字削除すれば回文となるか計算するプログラムを作れ.なお,s の文字数は 100000 以下としてよい.'(_s,_最小何文字の削除で済む) :- sの文字ならびと反転した文字ならびを用意する(_s,Chars_1,Chars_2), atom_length(_s,_文字列数), findmax(_回文の文字数,( 回文を生成(Chars_1,Chars_2,0,_回文の文字数)), _回文は最大何文字), _最小何文字の削除で済む is _文字列数 - _回文は最大何文字. sの文字ならびと反転した文字ならびを用意する(_s,Chars_1,Chars_2) :- atom_chars(_s,Chars_1), reverse(Chars_1,Chars_2). 回文を生成([],_,N,N). 回文を生成([A|R1],[A|R2],N_1,N) :- N_2 is N_1 + 1, 回文を生成(R1,R2,N_2,N). 回文を生成(L1,[B|R2],N_1,N) :- 回文を生成(L1,R2,N_1,N). 回文を生成([_|R1],L2,N_1,N) :- 回文を生成(R1,L2,N_1,N). % 以下のサイトは # [1]プログラム演習 # [2] # 一定の文字からなる列sを読み込み、以下の条件を満たす同じ個数の文字からなる列tを出力するプログラムを作りなさい。 # ただし、以下での単語とは空白以外の文字からなる列のこととする。 # 1,s中の単語は同じ順番で t に現われる # 2,t中では単語は一つの空白に区切られる # 3,t中に最初の単語の最初の文字から最後の単語の文字までは列全体のちゅうおうに位置し、前後は空白である # 例えば文字の列 # _This___is__a____good___program___ # を入力すると # ______This_is_a_good_program______ # が出力される。ここで、_は空白を表すものとする。 # [3]C言語 # [4]12/7 # [5]for,while,if文 ポインター 文字列 1,2次配列 関数の書き方 '一定の文字からなる列sを読み込み、以下の条件を満たす同じ個数の文字からなる列tを出力するプログラムを作りなさい。 ただし、以下での単語とは空白以外の文字からなる列のこととする。 1,s中の単語は同じ順番で t に現われる 2,t中では単語は一つの空白に区切られる 3,t中に最初の単語の最初の文字から最後の単語の文字までは列全体のちゅうおうに位置し、前後は空白である' :- '一定の文字からなる列sを読み込み、上記条件を満たす同じ個数の文字からなる列tを出力する'. '一定の文字からなる列sを読み込み、上記条件を満たす同じ個数の文字からなる列tを出力する' :- '一定の文字からなる列sを読み込み'(_s), tの語彙部を確定する(_s,_sの文字列長,_tの語彙部), tの語彙部の前後の文字列を確定する(_tの語彙部,_sの文字列長,_前の空白列,_後の空白列), tを出力する(_前の空白列,_空白を挟んだ連結した語彙,_後の空白列). tの語彙部を確定する(_s,_tの語彙部) :- atom_chars(_s,L_1), length(L_1,_sの文字列長), split(_s,[' '],_語彙ならび),  atomic_list_concat(_語彙ならび,' ',_tの語彙部). tの語彙部の前後の文字列を確定する(_tの語彙部,_sの文字列長,_前の空白列,_後の空白列) :- atom_length(_tの語彙部,_tの語彙部の長さ), _前後の空白合計 is _sの文字列長さ - _tの語彙部の長さ, length(_空白ならび,_前後の空白合計), all(_空白ならび,' '), 空白を割り振る(_空白ならび,_前の空白列,_後の空白列). 空白を割り振る(L,S,S) :- append(L1,L1,L), atomic_list_concat(L1,S),!. 空白を割り振る(L,S1,S2) :- append([_|L1],L1,L), atomic_list_concat(L1,S2), atom_concat(' ',S2,S1). tを出力する(_前の空白列,_空白を挟んだ連結した語彙,_後の空白列) :- atomic_list_concat([_前の空白列,_空白を挟んだ連結した語彙,_後の空白列],_t), writef('%t\n',[_t]). % 以下のサイトは # 出典:: 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 として実行してみよ。分布は、**** を打って表示せよ。 # */ 'πの値をモンテカルロ法で求めよ'(_pi) :- 'πの値をモンテカルロ法で求めよ'(0,[],L), length(L,_頻度), _pi is _頻度 * 4 / 100000. 'πの値をモンテカルロ法で求めよ'(100000,L,L) :- !. 'πの値をモンテカルロ法で求めよ'(N,L_1,L) :- '点が四分の一円弧の内側の時はカウントする'(L_1,L), N_2 is N + 1, 'πの値をモンテカルロ法で求めよ'(N_2,L_2,L). '点が四分の一円弧の内側の時はカウントする'(L_1,[1|L_1] _x is random(10001) / 10000, _y is random(10001) / 10000, _x ^ 2 + _y ^ 2 >= 1.0,!. '点が四分の一円弧の内側の時はカウントする'(L,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ # 'コイン投げも同様にして、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,_乱数ならび) :- 乱数で得られる変位の数字のならびを作って行く(Nth1,L1,_乱数ならび). 乱数で得られる変位の数字のならびを作って行く(Nth1,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,_残り数ならび) :- Nth0 is random(Nth), 前からNth変位のNと残り数ならび(Nth0,L1,N,_残り数ならび). 前からNth変位のNと残り数ならび(Nth0,L1,N,_残り数ならび) :- length(L0,Nth0), append(L0,[N|R1],L1), append(L0,R1,_残り数ならび). それから先頭の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). % 以下のサイトは # # 文字列の先頭と末尾から順に対にして取り出す # # ならびの先頭と末尾から順に対にして取り出す # 文字列の先頭と末尾から順に対にして取り出す(_文字列,C1,C2) :- sub_atom(_文字列,S,1,R,C1), sub_atom(_文字列,R,1,_,C2). ならびの先頭と末尾から順に対にして取り出す(_ならび,C1,C2) :- append(L0,[C1|L1],_ならび), length(L0,Len), length(R,Len), append(_,[C2|R],_ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/338 # # 7個のデータを入力し、中央地を表示するプログラムを作成して下さい # # 例 # 1番目の数字を入力してください: 13 # 2番目の数字を入力してください: 22 # ・・・ # 中央値は 22 です。 # # '7個のデータを入力し、中央地を表示する' :- '7個のデータを入力し'(_7個のデータ), 中央値を表示する(_7個のデータ). '7個のデータを入力し'(_7個のデータ) :- '7個のデータを'(_7個のデータ), 入力し(1,_7個のデータ),!. '7個のデータを'(_7個のデータ) :- length(_7個のデータ,7). 入力し(_何番目,[]) :- _何番目 > 7. 入力し(_何番目,[_データ|R]) :- writef('%t番目のデータを入力してください: ',[_何番目]), get_line(_データ), _何番目_2 is _何番目 + 1, 入力し(_何番目_2,R). 中央値を表示する(_7個のデータ) :- バブルソート(_7個のデータ,[_,_,_,_中央値,_,_,_]), 表示する(_中央値). バブルソート(L1,L2) :- 軽い泡はちょっと浮き上がる(L1,L3), 泡が浮き上がったら最初からやり直す(L3,L2),!. バブルソート(L,L) :- 浮き上がる泡がなくなったらバブルソート終了. 軽い泡はちょっと浮き上がる(L1,L3) :- append(L0,[_重い泡,_軽い泡|R],L1), _重い泡 @> _軽い泡, append(L0,[_軽い泡,_重い泡|R],L3). 泡が浮き上がったら最初からやり直す(L3,L2) :- バブルソート(L3,L2). 浮き上がる泡がなくなったらバブルソート終了. 表示する(_中央値) :- writef('中央値は %t です\n',[_中央値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/324 # # [1] 授業単元:一次元配列 # [2] 問題文 # キーボードから得点を入力し、最高点、最低点、合計点、平均点を表示した後、元の得点と、元の得点から平均点を引いた値を表示させるプログラムを作成しなさい。なお、配列の要素数は100個とし、得点の終わりは999とする。 # # 'キーボードから得点を入力し(要素数は最大100個とし、999の入力を以って得点の入力を終了する)、最高点、最低点、合計点、平均点を表示した後、元の得点と、元の得点から平均点を引いた値を表示させるプログラムを作成しなさい。' :- 'キーボードから得点を入力し(要素数は最大100個とし、999の入力を以って得点の入力を終了する)'(_得点ならび), '最高点、最低点、合計点、平均点を表示した後'(_得点ならび,_平均点), '元の得点と、元の得点から平均点を引いた値を表示させる'(_得点ならび,_平均点). 'キーボードから得点を入力し(要素数は最大100個とし、999の入力を以って得点の入力を終了する)'(_得点ならび) :- 整数を得る(得点,_得点), 'キーボードから得点を入力し(ただし最大要素数は100個とし、得点の終わりは999とする)'(0,_得点,_得点ならび). 'キーボードから得点を入力し(ただし最大要素数は100個とし、得点の終わりは999とする)'(1000,_,[]) :- !. 'キーボードから得点を入力し(ただし最大要素数は100個とし、得点の終わりは999とする)'(_,999,[]) :- !. 'キーボードから得点を入力し(ただし最大要素数は100個とし、得点の終わりは999とする)'(M_1,_得点,[_得点|R]) :- 得点を得る(得点,_得点_2), M_2 is M_1 + 1, 'キーボードから得点を入力し(ただし最大要素数は100個とし、得点の終わりは999とする)'(M_2,_得点_2,R). '最高点、最低点、合計点、平均点を表示した後'(_得点ならび,_平均点) :- 最高点(_得点ならび,_最高点), 最低点(_得点ならび,_最低点), 平均点(_得点ならび,_平均点), writef('最高点 = %t, 最低点 = %t, 平均点 = %t\n',[_最高点,_最低点,_平均点). 最高点([_得点|R],_最高点) :- 最高点(R,_得点,_最高点). 最高点([],_最高点,_最高点). 最高点([_得点|R],_これまでの最高点,_最高点) :- _得点 >= _これまでの最高点, 最高点(R,_得点,_最高点),!. 最高点([_得点|R],_これまでの最高点,_最高点) :- 最高点(R,_これまでの最高点,_最高点),!. 最低点([_得点|R],_最低点) :- 最高点(R,_得点,_最低点). 最低点([],_最低点,_最低点). 最低点([_得点|R],_これまでの最低点,_最低点) :- _得点 =< _これまでの最低点, 最低点(R,_得点,_最低点),!. 最低点([_得点|R],_これまでの最低点,_最低点) :- 最低点(R,_これまでの最低点,_最低点),!. 平均点([_得点|R],_平均点) :- length([_得点|R],_要素数), 合計([_得点|R],0,_合計点), _平均点 is _合計点 / _要素数. 合計([],_合計点,_合計点). 合計([_得点|R],_合計点_1,_合計点) :- _合計点_2 is _合計点_1 + _得点, 合計(R,_合計点_2,_合計点),!. '元の得点と、元の得点から平均点を引いた値を表示させる'([_],_). '元の得点と、元の得点から平均点を引いた値を表示させる'([_元の得点|R],_平均点) :- _元の得点から平均点を引いた値 is _元の得点 - _平均点, write('%t,%t\n',[_元の得点,_元の得点から平均点を引いた値]), '元の得点と、元の得点から平均点を引いた値を表示させる'(R,_平均点). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/267 # # [1] 授業単元:C言語(配列) # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/KOT3NBPz # # キーボードから3×3の行列の数値を入力し行列のランク(階数)を出力するプログラムを作成せよ 'キーボードから3×3の行列の数値を入力し行列のランク(階数)を出力するプログラムを作成せよ' :- 'キーボードから3×3の行列の数値を入力し'(_行列), '行列のランク(階数)を出力する'(_行列). 'キーボードから3×3の行列の数値を入力し'(_行列) :- length(_行列,3), findall(L,( member(L,_行列), length(L,3), 行を入力(L)), _行列). 行を入力([]). 行を入力([_数値|R]) :- 数を得る(数値,_数値), 行を入力(R). '行列のランク(階数)を出力する'(_行列) :- ガウス行列に変形(_行列,_ガウス行列), '要素に零以外の数が存在する行数'(_ガウス行列,_ランク), writef('行列 %t のランクは %t です\n',[_行列,_ランク]). '要素に零以外の数が存在する行数'(_行列,_ランク) :- count((member(L,_行列),零以外の要素が存在する行(L)),_ランク). 零以外の要素が存在する行(_行) :- member(_要素,_行), \+(_要素 = 0), \+(_要素 = 0.0),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/226 # # [1]C言語 繰り返し文 # [2]問題 長いのでリンクでお願いします。 # http://ime.nu/codepad.org/iaWNbokN # [3]Linux ubuntu gcc C言語 # [4]今週日曜日迄 # [5]配列 ポインタなどは習ってないですよろしくお願いします。 # # 課題1. # #include <stdio.h> # int main(void) # { # int n, i, count = 0; # printf("n: "); # scanf("%d", &n); # for (i = 2; i * i <= n; i++) { # count++; # if (n % i == 0) { # break; # } # } # if (i * i > n) { # printf("%d: %d\n", n, count); # } # return 0; # } # # # 課題2. キーボードから10 進整数を入力し,その数を2 進数に変換した値を表示するプログラムを作成 # せよ.ただし,変換後の2 進数は正しい順序で表示すること(入力が10 ならば,1010 と表示). # # 課題3.課題1,2 のプログラムを作成するにあたり,どのように考えてプログラムを実現したのかをレ # ポートにまとめよ(プログラムの説明ではなく,問題を解くための考え方を説明する). # ※プログラムが完成していなくても,自分の考えた解き方をレポートにまとめること # */ # 'キーボードから10進整数を入力し,その数を2進数に変換した値を表示する' :- キーボードから10進整数を入力し(_10進整数), その数を2進数に変換した値を表示する(_10進整数). キーボードから10進整数を入力し(_10進整数) :- 整数を得る('10進整数',integer(_10進整数),_10進整数). その数を2進数に変換した値を表示する(_10進整数) :- その数を2進数に変換した値を(_10進整数,[],_2進数に変換した値), 表示する(_2進数に変換した値). その数を2進数に変換した値を(_10進整数,_2進数に変換した値) :- _10進整数 >= 0, その数を2進数に変換した値を(_10進整数,[],L), atomic_list_concat(L,_2進数に変換した値),!. その数を2進数に変換した値を(_10進整数,_2進数に変換した値) :- 負数を2進数に変換(_10進整数,_2進数に変換した値). その数を2進数に変換した値を(N,L1,[N|L1]) :- N < 2,!. その数を2進数に変換した値を(_10進整数,L1,L) :- M_1 is _10進整数 // 2, M_2 is _10進整数 mod 2, その数を2進数に変換した値を(M_1,[M_2|L1],L). 負数を2進数に変換(_10進整数,_2進数に変換した値) :- _10進整数_2 is abs(_10進整数) + 1, その数を2進数に変換した値を(_10進整数_2,[],L_1), 'Lを32要素に拡張して否定する'(L_1,L_2), atomic_list_concat(L_2,_2進数に変換した値). 'Lを32要素に拡張して否定する'(L_1,L_2) :- length(L,32), append(L_0,L_1,L), all(L_0,0), 各要素を反転する(L,L_2),!. 各要素を反転する([],[]). 各要素を反転する([0|R1],[1|R2]) :- 各要素を反転する(R1,R2). 各要素を反転する([1|R1],[0|R2]) :- 各要素を反転する(R1,R2). 表示する(_2進数に変換した値) :- writef('%t\n',[_2進数に変換した値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/212 # # C言語で明日までです # # # n件の整数型データを配列に入力し、その平均値を出力するプログラムを作成せよ。ただし、実行部において添字演算子を用いないで、また、*(p+i)と*p++の形2つを用いた場合をそれぞれ求めよ。です。お願いします! # # 'n件の整数データを入力し、その平均値を出力する'(_n) :- 'n件の整数データを入力し'(_n,_n件の整数データ), その平均値を出力する(_n,_n件の整数データ,0). 'n件の整数データを入力し'(_n,_n件の整数データ) :- length(_n件の整数データ,_n), findall(_整数,( append(L0,[_|_],_n件の整数データ), length([_|L0],_何件目), atomic_list_concat(['[',_何件目,']',' : '],_催促), 整数を得る(_催促,_整数)), _n件の整数データ). その平均値を出力する(_n,[],_合計) :- _平均値 is _合計 / _n, writef('平均値 は %t です\n',[_平均値]). その平均値を出力する(_n,[_整数|R],_合計_1) :- _合計_2 is _整数 + _合計_1, その平均値を出力する(_n,R,_合計_2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/189 # # [1] 授業単元:C言語 文字列 # [2] 問題文 # http://ime.nu/s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/img/382.txt # # 文字列処理 キーボードからアルファベット小文字で入力し、イニシャルで表示する # プログラムを作成しなさい。 # 入力できる文字数は姓、名、最大20文字、配列を宣言すること。 # 文字変換関数を使用すること。 # (実行結果) 氏名をアルファベット小文字で入力して下さい # tanaka # hanako # tanaka hanako さんのイニシャルはH,Tです # # キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、 # その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントするプログラムを作成しなさい。 # ただし、入力する文字数は最大30文字とする。 # 文字列操作関数を必ず用いること # # (実行結果) 文字列を入力して下さい. # TanakaHanako1234          # 入力文字列は TanakaHanako1234 で          小文字は10文字,大文字は2文字,数字は4文字です. 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)、その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする' :- 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)'(_入力文字列), 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_入力文字列,_小文字の数,_大文字の数,_数字の数). 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)'(_入力文字列) :- write('文字列を入力してください\n'), get_line(Line), 最大30文字(Line,_入力文字列). 最大30文字(Line,_入力文字列) :- atom_length(Line,_長さ), _長さ > 30, sub_atom(Line,0,30,_,_入力文字列),!. 最大30文字(_入力文字列,_入力文字列). 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_入力文字列,_小文字の数,_大文字の数,_数字の数) :- count((sub_atom(_入力文字列,_,1,_,_文字),_文字 @>= 'a',_文字 @=< 'z'),_小文字の数), count((sub_atom(_入力文字列,_,1,_,_文字),_文字 @>= 'A',_文字 @=< 'Z'),_大文字の数), count((sub_atom(_入力文字列,_,1,_,_文字),_文字 @>= '0',_文字 @=< '9'),_数字の数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/189 # # [1] 授業単元:C言語 文字列 # [2] 問題文 # http://ime.nu/s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/img/382.txt # # 文字列処理 キーボードからアルファベット小文字で入力し、イニシャルで表示する # プログラムを作成しなさい。 # 入力できる文字数は姓、名、最大20文字、配列を宣言すること。 # 文字変換関数を使用すること。 # (実行結果) 氏名をアルファベット小文字で入力して下さい # tanaka # hanako # tanaka hanako さんのイニシャルはH,Tです # # キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、 # その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントするプログラムを作成しなさい。 # ただし、入力する文字数は最大30文字とする。 # 文字列操作関数を必ず用いること # # (実行結果) 文字列を入力して下さい. # TanakaHanako1234          # 入力文字列は TanakaHanako1234 で          小文字は10文字,大文字は2文字,数字は4文字です. 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)、その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする' :- 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)'(_入力文字列), 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_入力文字列,_小文字の数,_大文字の数,_数字の数). 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し(入力する文字数は最大30文字とする)'(_入力文字列) :- write('文字列を入力してください\n'), get_line(Line), 最大30文字(Line,_入力文字列). 最大30文字(Line,_入力文字列) :- atom_length(Line,_長さ), _長さ > 30, sub_atom(Line,0,30,_,_入力文字列),!. 最大30文字(_入力文字列,_入力文字列). 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_入力文字列,_小文字の数,_大文字の数,_数字の数) :- atom_chars(_入力文字列,_文字ならび), 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(_文字ならび,0,0,0,_小文字の数,_大文字の数,_数字の数). 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'([],_小文字の数,_大文字の数,_数字の数,_小文字の数,_大文字の数,_数字の数) :- !. 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'([_文字|R],_小文字の数_1,_大文字の数_1,_数字の数_1,_小文字の数,_大文字の数,_数字の数) :- '一文字単位のカウント'(_文字,_小文字の数_1,_大文字の数_1,_数字の数_1,_小文字の数_2,_大文字の数_2,_数字の数_2), 'その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントする'(R,_小文字の数_2,_大文字の数_2,_数字の数_2,_小文字の数,_大文字の数,_数字の数). '一文字単位のカウント'(_文字,_小文字の数_1,_大文字の数,_数字の数,_小文字の数_2,_大文字の数,_数字の数) :- _文字 @>= 'a', _文字 @=< 'z', _小文字の数 is _小文字の数_1 + 1. '一文字単位のカウント'(_文字,_小文字の数,_大文字の数_1,_数字の数,_小文字の数,_大文字の数,_数字の数) :- _文字 @>= 'A', _文字 @=< 'Z', _大文字の数 is _大文字の数_1 + 1. '一文字単位のカウント'(_文字,_小文字の数,_大文字の数,_数字の数_1,_小文字の数,_大文字の数,_数字の数) :- _文字 @>= '0', _文字 @=< '9', _数字の数 is _数字の数_1 + 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/189 # # [1] 授業単元:C言語 文字列 # [2] 問題文 # http://ime.nu/s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/img/382.txt # # 文字列処理 キーボードからアルファベット小文字で入力し、イニシャルで表示する # プログラムを作成しなさい。 # 入力できる文字数は姓、名、最大20文字、配列を宣言すること。 # 文字変換関数を使用すること。 # (実行結果) 氏名をアルファベット小文字で入力して下さい # tanaka # hanako # tanaka hanako さんのイニシャルはH,Tです # # キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、 # その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントするプログラムを作成しなさい。 # ただし、入力する文字数は最大30文字とする。 # 文字列操作関数を必ず用いること # # (実行結果) 文字列を入力して下さい. # TanakaHanako1234          # 入力文字列は TanakaHanako1234 で          小文字は10文字,大文字は2文字,数字は4文字です. '文字列処理 キーボードから姓名をアルファベット小文字で入力し(入力できる文字数は姓、名、最大20文字)、イニシャルで表示する。' :- '文字列処理 キーボードから姓名をアルファベット小文字で入力し(入力できる文字数は姓、名、最大20文字)'(_姓名), 'イニシャルで表示する。'(_姓名,_イニシャル). '文字列処理 キーボードから姓名をアルファベット小文字で入力し(入力できる文字数は姓、名、最大20文字)'(_姓,_名) :- '姓を入力(入力できる文字数は姓、名、最大20文字)'(_姓), '名を入力(入力できる文字数は姓、名、最大20文字)'(_名). '姓を入力(入力できる文字数は姓、名、最大20文字)'(_姓) :- write('姓を入力してください : '), get_line(Line_1), '入力できる文字数は姓、名、最大20文字'(Line_1,_姓). '名を入力(入力できる文字数は姓、名、最大20文字)'(_名) :- write('名を入力してください : '), get_line(Line_2), '入力できる文字数は姓、名、最大20文字'(Line_2,_名). '入力できる文字数は姓、名、最大20文字'(Line,Line) :- atom_length(Line,_長さ), _長さ_1 =< 20,!. '入力できる文字数は姓、名、最大20文字'(_文字列,_20文字以内の文字列) :- sub_atom(_文字列,0,20,_,_20文字以内の文字列). 'イニシャルで表示する。'(_姓,_名) :- イニシャルで(_姓,_名,_イニシャル), writef('%t %t さんのイニシャルは %t です\n',[_イニシャル]). イニシャルで(_姓,_名,_イニシャル) :- sub_atom(_姓,0,1,_,_姓の第一文字), to_upper(_姓の第一文字,_イニシャル_1), sub_atom(_名,0,1,_,_名の第一文字), to_upper(_名の第一文字,_イニシャル_2), atomic_list_concat([_イニシャル_1,',',_イニシャル_2],_イニシャル). % 以下のサイトは # 出典:: 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]本日中でお願いします。 # # 'キーボードから正の整数''x'' を入力し、一辺に''*'' がx 個並んだ直角三角形が画面に出力される' :- 'キーボードから正の整数''x'' を入力し'(_x), '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(_x). 'キーボードから正の整数''x'' を入力し'(_x) :- 整数を得る(正の整数x,_x > 0,_x). '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(_x) :- length(L,_x), all(L,'*'), '直角三角形が画面に出力される'(L). '直角三角形が画面に出力される'(L) :- append(_,L2,L), atomic_list_concat(L2,A), writef('%t\n',[A]), L2 = ['*']. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/165 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/YKwOhX0L # # /* # ・仕様 # ・配るカードは13枚 # ・スートはSuiteという列挙体で定義され、Spade(スペード)、Club(クラブ)、Heart(ハート) # Dia(ダイア)という定数を持つ # ・カードはCARDという構造体で定義され、Suite列挙体のsuiteと、カードのランクを表す # int型のrankという2つのメンバを持つ # ・カードは配列 # ・13枚のカードのスートとランクは乱数で決定。現実にはありえないカードの配り方 # になってもよい(例:13枚の中にスペードのエースが5枚ある等) # ・スートはスペード→ハート→クラブ→ダイヤの順にソートし、ランクは小さい順(1,2,3,…13) # にソート、またランクよりもスートを優先 # 例:4枚のカードの内訳がスペードの2と5、ハートの3、クラブの10なら # スペードの2→スペードの5→ハートの3→クラブの10とソートされる # ・ソートのアルゴリズムはバブルソートを使う # ソートの前とソートの後のカードを表示する # */ '乱数を使ってカードを13枚配りそれをバブルソートする'(_配られたカード,_ソートされたカード) :- '乱数を使ってカードを13枚配り'(_配られたカード), それをバブルソートする(_配られたカード,_ソートされたカード). '乱数を使ってカードを13枚配り'(_配られたカード) :- 'カードを13枚'(_配られたカード), スートとランクを当て嵌める(_配られたカード). 'カードを13枚'(_配られたカード) :- length(_配られたカード,13). スートとランクを当て嵌める(_配られたカード) :- findall([_スート,_ランク],( member(_カード,_配られたカード), スートを決める(_スート), ランクを決める(_ランク)), _配られたカード). スートを決める(_スート) :- _乱数 is random(4), スートを決める(_乱数,_スート). スートを決める(0,スペード). スートを決める(1,ハート). スートを決める(2,クラブ). スートを決める(3,ダイヤ). ランクを決める(_ランク) :- _ランク is random(13) + 1. それをバブルソートする(_配られたカード,_ソートされたカード) :- 'スート・ランク仕様のバブルソート'(_配られたカード,_ソートされたカード). 'スート・ランク仕様のバブルソート'(L1,L2) :- 軽い泡はちょっと浮き上がる(L1,L3), 泡が浮き上がったら最初からやり直す(L3,L2),!. 'スート・ランク仕様のバブルソート'(L,L) :- 浮き上がる泡がなくなったらバブルソート終了. 軽い泡はちょっと浮き上がる(L1,L3) :- append(L0,[_重い泡,_軽い泡|R],L1), 泡の重さを量る(_重い泡,_軽い泡), append(L0,[_軽い泡,_重い泡|R],L3). 泡の重さを量る([_スート_1,_],[_スート_2,_]) :- スート強度(_スート_1,_スート_2),!. 泡の重さを量る([_スート,_ランク_1],[_スート,_ランク_2]) :- _ランク_1 >= _ランク_2. スート強度(_スート_1,_スート_2) :- nth1(N1,[ダイヤ,クラブ,ハート,スペード],_スート_1), nth1(N2,[ダイヤ,クラブ,ハート,スペード],_スート_2), N1 > N2,!. 泡が浮き上がったら最初からやり直す(L3,L2) :- 'スート・ランク仕様のバブルソート'(L3,L2). 浮き上がる泡がなくなったらバブルソート終了. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/165 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/YKwOhX0L