このディレクトリの索引

% 以下のサイトは # 出典 :: CodeIQ q1565 # 【問題】 # できるだけ多くの人数で、肩車をしようと思います。 #      # # 肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。 # # # 【例】 # 一行ごとに、身長と体重のセットが与えられます。次の例は、5人の身長と体重を表しています。 # 166 71 # 178 84 # 176 94 # 174 85 # 174 65 # # # この中から肩車をする人間を選ぶと、身長と体重が # (166, 71) # (174, 85) # (176, 94) # の3人が最大人数になります。 # # ※身長と体重共に、上の人が下の人“より小さい”場合に肩車が許されるとしていますので、 #  (174, 85)の上に(174, 65)が乗ることはできません。 'できるだけ多くの人数で、肩車をしようと思います。      肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_最大人数) :- 身長と体重のセットを得る(_身長と体重のセット), 'できるだけ多くの人数で、肩車をしようと思います。'(_身長と体重のセット,_最大人数). 身長と体重のセットを得る(_身長と体重のセット) :- 行を得る(_行,_終了状態), 身長と体重のセットを得る(_終了状態,_行,_身長と体重のセット). 身長と体重のセットを得る(入力終了,_,[]) :- !. 身長と体重のセットを得る(_,_行,_身長体重ならび) :- 入力終了になるまで行入力を続ける(_,_行,_身長体重ならび). 入力終了になるまで行入力を続ける(_,_行,[[_身長,_体重]|_残りの行ならび]) :- read_term_from_atom(_行,(_身長,_体重),[]), 行を得る(_次の行,_終了状態), 身長と体重のセットを得る(_終了状態,_次の行,_残りの行ならび). 'できるだけ多くの人数で、肩車をしようと思います。'(_人間ならび,_最大人数) :- findall(_肩車人数,( 肩車人数(_人間ならび,_肩車人数)),_肩車人数ならび), max_list(_肩車人数ならび,_最大人数). 肩車人数(_人間ならび,_肩車人数) :- select(_取りだされた人間,_人間ならび,_残りの人間ならび), 肩車を重ねる(_取りだされた人間,_残りの人間ならび,_肩車重ね), length(_肩車重ね,_肩車人数). 肩車を重ねる(_自分,_人間ならび,[_自分|_肩車重ね]) :- 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね). 肩車を重ねる(_一番上の人間,_,[_一番上の人間]). 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね) :- select(_上の人間,_人間ならび,_残りの人間ならび), '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_上の人間,_自分), 肩車を重ねる(_上の人間,_残りの人間ならび,_肩車重ね). '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'([_上の人間の身長,_上の人間の体重],[_自分の身長,_自分の体重]) :- _上の人間の身長 @< _自分の身長, _上の人間の体重 @< _自分の体重. 行を得る(_行,_終了状態) :- get_char(_文字), 行を得る(_文字,_文字ならび,_終了状態), atomic_list_concat(_文字ならび,_行). 行を得る(_入力文字,[],_終了状態) :- 入力文字が改行文字またはend_of_fileの時停止する(_入力文字,_終了状態),!. 行を得る(_文字,_行ならび,_終了状態) :- 行を得るために文字入力を続ける(_文字,_行ならび,_終了状態). 入力文字が改行文字またはend_of_fileの時停止する('\n',改行終了). 入力文字が改行文字またはend_of_fileの時停止する(end_of_file,入力終了). 行を得るために文字入力を続ける(_文字,[_文字|_残りの文字ならび],_終了状態) :- get_char(_次の文字), 行を得る(_次の文字,_残りの文字ならび,_終了状態). % 以下のサイトは # 出典 :: 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('%t:%t\n',[_範囲表現文字列,_星文字列]). ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列) :- ヘッドゼロサプライ(_範囲下限の表示桁数,_範囲下限,_表示範囲下限), ヘッドゼロサプライ(_範囲上限の表示桁数,_範囲上限,_表示範囲上限), atomic_list_concat([_表示範囲下限,'-',_表示範囲上限],_範囲表現文字列). ヘッドゼロサプライ(_桁数,_数値,_ヘッドゼロサプライ数値表現) :- ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト), 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト), 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現). ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト) :- length(_ヘッドゼロサプライされたリスト,_桁数). 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト) :- number_chars(_数値,_数字のリスト), append(_頭部の枠リスト,_数字のリスト,_ヘッドゼロサプライされたリスト), 全ての要素が同じ(_頭部の枠リスト,'0'). 全ての要素が同じ([],_). 全ての要素が同じ([V|R],V) :- 全ての要素が同じ(R,V). 星文字列(_度数,_星文字列) :- findall(*,between(1,_度数,_),L), atomic_list_concat(L,_星文字列). 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現) :- atom_chars(_ヘッドゼロサプライ数値表現,_ヘッドゼロサプライされたリスト). % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # 横書文書を縦書文書に変形する(_横書文書,_縦書文書) :- 横書文書を縦書文書に変形する(_横書文書,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 _式. % 以下のサイトは # 出典 :: 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. % 以下のサイトは # # データベースに在る一日分売上データを給油所別月別ファイルに追加保存する。 # 保存ファイルは例えば "志村_売上_201501.pro" のようなファイル名である。 # 給油所(志村,'300203'). 給油所(上野毛,'300206'). 給油所(横浜南,'370113'). 給油所(熊谷銀座,'370105'). 給油所(けやき台,'370109'). 給油所(秩父21,'370111'). 給油所(狭山ヶ丘,'370112'). 売上保存(_保存月,_保存日) :- '保存日から入力時刻下限、上限を得る'(_保存日,_入力年月日), forall(売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ), 売上保存の一日分データを書き出す(_出力,_一日分データ)). '保存日から入力時刻下限、上限を得る'(_保存日,_入力年月日) :- '売上保存_年-_月-_日'(_保存日,_年,_月,_日), 売上保存_入力年月日(_年,_月,_日,_入力年月日). '売上保存_年-_月-_日'(_保存日,_年,_月,_日) :- sub_atom(_保存日,0,4,_,_年), sub_atom(_保存日,4,2,_,_月), sub_atom(_保存日,6,2,_,_日). 売上保存_入力年月日(_年,_月,_日,_入力年月日) :- atomic_list_concat([_年,'-',_月,'-',_日],_入力年月日). 売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ) :- 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力), データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ). 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力) :- 給油所(_給油所,_出荷場所), atomic_list_concat([_給油所,'_売上_',_保存月,'.pro'],_保存ファイル名), open(_保存ファイル名,append,_出力). データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ) :- findall([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20],( 売上(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20), 出荷場所と入力時刻から組を得る(_16,_出荷場所,_20,_入力年月日)),_一日データ). 出荷場所と入力時刻から組を得る(_出荷場所,_出荷場所,_入力時刻,_入力年月日,_組) :- sub_atom(_入力時刻,0,10,_,_入力年月日). 売上保存の一日分データを書き出す(_出力,[]) :- close(_出力). 売上保存の一日分データを書き出す(_出力,[_組|_残り]) :- 売上保存一行表示(_出力,_組), 売上保存の一日分データを書き出す(_出力,_残り). 売上保存一行表示(_出力,_組) :- _売上 =.. [売上|_組], writeq(_出力,_売上), write(_出力,'.\n'). % 以下のサイトは # # データベースに在る一日分売上データを給油所別月別ファイルに追加保存する。 # 保存ファイルは例えば "志村_売上_201501.pro" のようなファイル名である。 # 売上保存(_保存月,_保存日) :- '保存日から入力時刻下限、上限を得る'(_保存日,_入力年月日), 売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ,_残り), 売上保存の一日分データを書き出す(_出力,_一日分データ), _残り = []. '保存日から入力時刻下限、上限を得る'(_保存日,_入力年月日) :- '売上保存_年-_月-_日'(_保存日,_年,_月,_日), 売上保存_入力年月日(_年,_月,_日,_入力年月日). '売上保存_年-_月-_日'(_保存日,_年,_月,_日) :- sub_atom(_保存日,0,4,_,_年), sub_atom(_保存日,4,2,_,_月), sub_atom(_保存日,6,2,_,_日). 売上保存_入力年月日(_年,_月,_日,_入力年月日) :- atomic_list_concat([_年,'-',_月,'-',_日],_入力年月日). 売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ,_残り) :- 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力,_残り), データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ). 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力,_残り) :- append(_,[[_給油所,_出荷場所]|_残り],[[志村,'300203'],[上野毛,'300206'],[熊谷,'370105'],[けやき台,'370109'],[秩父21,'370111'],[狭山ヶ丘,'370112'],[横浜南,'370113']]), atomic_list_concat([_給油所,'_売上_',_保存月,'.pro'],_保存ファイル名), open(_保存ファイル名,append,_出力). データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ) :- findall([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20],( 売上(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20), 出荷場所と入力時刻から組を得る(_16,_出荷場所,_20,_入力年月日)),_一日データ). 出荷場所と入力時刻から組を得る(_出荷場所,_出荷場所,_入力時刻,_入力年月日,_組) :- sub_atom(_入力時刻,0,10,_,_入力年月日). 売上保存の一日分データを書き出す(_出力,_一日分データ) :- append(_,[_組|_残り],_一日分データ), 売上保存一行表示(_出力,_組), 売上保存の一日分書き出しを完了する(_出力,_残り). 売上保存一行表示(_出力,_組) :- _売上 =.. [売上|_組], writeq(_出力,_売上), write(_出力,'.\n'). 売上保存の一日分書き出しを完了する(_出力,[]) :- close(_出力). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/910 # お題:2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を # 隣り合う文字の間に挿入した文字列を返す。 # 例 # "Personal" -> "Peerrsssoonnall" # "Hello, world!" -> "Heellllooo,, wwworrrlldd!" # # '2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列を返す。'(_文字列,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- findall(_副文字列_2,( sub_atom(_文字列,_,2,_残り文字数,_副文字列), 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_副文字列,_残り文字数,_副文字列_2)),L), atomic_list_concat(L,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_副文字列,_残り文字数,_副文字列_2) :- 隣り合う2文字の大きい方の文字(_副文字列,_文字_1,_文字_2,_大きい方の文字), 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_残り文字数,_文字_1,_文字_2,_大きい方の文字,_副文字列_2). 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(0,_文字_1,_文字_2,_大きい方の文字,_副文字列_2) :- atomic_list_concat([_文字_1,_大きい方の文字,_文字_2],_副文字列_2),!. 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_,_文字_1,_文字_2,_大きい方の文字,_副文字列_2) :- atomic_list_concat([_文字_1,_大きい方の文字],_副文字列_2). 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字) :- sub_atom(_2文字,0,1,_,_文字_1), sub_atom(_2文字,1,1,_,_文字_2), 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_大きい方の文字). 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_1) :- _文字_1 @>= _文字_2. 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_2) :- _文字_1 @< _文字_2. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/910 # お題:2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を # 隣り合う文字の間に挿入した文字列を返す。 # 例 # "Personal" -> "Peerrsssoonnall" # "Hello, world!" -> "Heellllooo,, wwworrrlldd!" # # '2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列を返す。'(_文字列,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- findall(_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列,( sub_atom(_文字列,_,2,_,_2文字), 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_2文字,_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列)),L), sub_atom(_文字列,0,1,_,_最初の文字), atomic_list_concat([_最初の文字|L],_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_2文字,_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字), atomic_list_concat([_大きい方の文字,_文字_2],_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字) :- sub_atom(_2文字,0,1,_,_文字_1), sub_atom(_2文字,1,1,_,_文字_2), 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_大きい方の文字). 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_1) :- _文字_1 @>= _文字_2. 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_2) :- _文字_1 @< _文字_2. % 以下のサイトは % [1] 授業単元:C言語演習課題 % http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9422.txt % 問題 % 年と月を「YYYY/MM」と入力し、入力された月のカレンダーを表示しなさい。 % % 1752年10月以前、及び10000年1月以降はエラーを返す。 % % 出力形式は以下のとおり % ・1行目は該当月の1日が月曜日でなければ、前月の最終月曜日から表示。 % ・該当月の最終日が日曜日でなければ、翌月の第1日曜日まで表示。 % ・6行目の表示が必要ない場合は表示しない。 % % うるう年判定は以下のとおり % ・年が4で割り切れる年はうるう年。 % ・年が100で割り切れる年はうるう年でない。 % ・年が400で割り切れる年はうるう年である。 % % [出力例] % 年月日を入力:2009/07 % % 月 火 水 木 金 土 日 % 29 30 01 02 03 04 05 % 06 07 08 09 10 11 12 % 13 14 15 16 17 18 19 % 20 21 22 23 24 25 26 % 27 28 29 30 31 01 02 課題のカレンダー(_年/_月) :- not((_年/_月 >= 1752/10,_年/_月 =< 10000/1)), write('エラー: 入力された年月は範囲を逸脱しています\n'),!. 課題のカレンダー(_年/_月) :- _年/_月 @=< 2009/6,!, 曜日検索(_日付,_曜日,2009/6/13,土曜), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー(_年/_月) :- _年/_月 @>= 2009/6,!, 曜日検索(2009/6/13,土曜,_日付,_曜日), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー表示(_年/_月/_日,月曜) :- 日付候補を得る(_年/_月/_日,_年/_月/_日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 課題のカレンダー表示(_年/_月/_日,_曜日) :- not(_曜日=月曜), 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日), 日付候補を得る(_年/_月/_日,_前週の月曜日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日) :- 曜日検索(_前週の月曜日,_前週の曜日,_年/_月/_日,_曜日), _前週の曜日 = 月曜,!. 日付候補を得る(_年/_月/_日,_起点日付,_曜日,_日付整数ならび) :- findall(_日付,( 曜日(_起点日付,_曜日,_日付2,_),(_日付2=_年2/_月2/7,_年2/_月2 @> _年/_月,!,fail;true)),_日付整数ならび). 課題のカレンダー週表示(_日付整数ならび) :- n個組(7,_日付整数ならび,_7個組), 月曜から日曜までヘッドゼロサプライで表示(_7個組). 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t\n',[_日文字列]),!. 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日|R]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t ',[_日付文字列]), 月曜から日曜までヘッドゼロサプライで表示(R). 課題のカレンダー見出し表示 :- write_formatted('月 火 水 木 金 土 日\n'). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_日付,_曜日,_今日,_今日の曜日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_前日,_前日の曜日,_今日,_今日の曜日), 曜日検索(_日付,_曜日,_前日,_前日の曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_日付,_曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_翌日,_翌日の曜日), 曜日検索(_翌日,_翌日の曜日,_日付,_曜日). '曜日'(_日付,_曜日,_日付,_曜日) :- ! . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @> _日付2, '前日・今日'(_日付3,_曜日3,_日付1,_曜日1), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @< _日付2, '前日・今日'(_日付1,_曜日1,_日付3,_曜日3), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . 前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :- not(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/550 # # [1] 授業単元: Ruby演習 [2] 問題文、http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9426.txt # Rubyの問題がわかりません 助けてください # # (1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい # # p wday["sunday"] #=> "日曜日" # p wday["monday"] #=> "月曜日" # p wday["saturday"] #=> "土曜日" # # (2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい # # (3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてくださ い。 # 「sunday」は日曜日のことです。 # 「monday」は月曜日のことです。 # # (4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行(正 規表現で定義するなら「/\uff3cs+/」)で区切られた文字列をハッシュに変換するメソ ッドstr2hashを定義してください。 # # p str2hash("bule 青 white 白\uff3cnred赤"); # #=> {"bule"=>"青", "white"=>"白", "red"=>"赤"} :- op(450,xfx,(=>)). % (1) wday({ "sunday" => "日曜日","monday" => "月曜日","saturday" #=> "土曜日"}). % (2) hash_count(Hashname,Count) :- functor(P,Hashname,1), call(P), arg(1,P,H), count(H,Count). count(','(A,B),Count) :- count(B,Count2), Count is Count2 + 1. count(A,1). % (3) ?- each(wday.A=>B),write_formatted('「%t」は%tのことです。\n',[A,B]),fail;true. each(Hashname.Key=>Value) :- functor(P,Hashname,1), arg(1,P,V), each(V,Key=>Value). each(','(Key=>Value,B),Key=>Value). each(','(_,B),Key=>Value) :- each(B,Key=>Value). each(Key=>Value,Key=>Value). % (4) str2hash(Atom,Hash) :- split(Atom,[' ','\t','\n'],L), findall(U,n個組(2,L,U),L2), hashを成長させる(L2,Hash). hashを成長させる([A,B],{ A=>B }) :- !. hashを成長させる([[A,B]|R], { (A=>B,R2) }) :- hashを成長させる(R,{ R2 }). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/103 # # 【質問テンプレ】 # [1] 授業単元: C言語演習 # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9753.txt # 2.入力された年月の1日が何曜日かを調べる。 #   曜日のチェックはZellerの公式を使用する。Zellerの公式は、 #    #   曜日を表す値=(y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ (( 13 * m ) + 8 ) / 5 ] + d ) % 7 # #           ※ 上記の公式中の y は年、 m は月、 d は日を表し、 #             []はその数を越えない最大の整数を表す。(例: [13.6]は13になる) # #   で、曜日を表す値は次のようになっている。 # #     日曜日 = 0, 月曜日 = 1, 火曜日 = 2, 水曜日 = 3, # # 木曜日 = 4, 金曜日 = 5, 土曜日 = 6, # #   ※但し、1月と2月は前年の13月14月として計算するものとする。 % (1) 年月の入力 年月入力処理(_年,_月) :- 年入力処理(_年), 月入力処理(_月). % (2) 曜日計算 :- op(450,xfx,が),op(500,xfx,であり),op(600,xfx,ならば),op(450,xfx,は). 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は (Y + Y // 4 - Y // 100 + Y // 400 + ((( 13 * M ) + 8 ) // 5 ) + D ) mod 7). 曜日計算処理(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値), 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値を得る'(_年,1,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,13,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,2,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,14,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値) :- _年=Y,_月=M,_日=D, 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は _Zellerの公式), _曜日を表す値 is _Zellerの公式,!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % (3) カレンダー表示 カレンダー表示 :- 年月入力処理(_年,_月), 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,1,_曜日を表す整数値), カレンダー表示データ編集(_年,_月,_曜日を表す整数値,_カレンダー表示文字列ならび), 要素に空白を挿入して全行表示(_カレンダー表示文字列ならび). カレンダー表示データ編集(_年,_月,_各月1日の曜日を表す整数値,_カレンダー表示文字列ならび) :- 年月文字列編集処理(_年,_月,_年月文字列), 月日数(_年,_月,_月日数), findall(S,for(1,N,_月日数),ヘッドゼロサプレス(2,N,S)),_表示日ならび), Length is _月日数 + _各月1日の曜日を表す整数値, M is (7 - (Length mod 7)), '7個組ならび'(Length,M,_表示日ならび,_7個組ならび), 見出しならび(_年月文字列,_見出しならび), append(_見出しならび,_7個組ならび,_カレンダー表示文字列ならび). 見出しならび(_年月文字列,[[_年月文字列],[日,月,火,水,木,金,土]]). '7個組ならび'(Length,0,_表示日ならび,_7個組ならび) :- length(L0,Length), すべての要素が(L0,' '), append(L0,_表示日ならび,L), '7個組'(L,_7個組ならび),!. '7個組ならび'(Length,M,_表示日ならび,_7個組ならび) :- not(M=0), length(L0,Length), すべての要素が(L0,' '), length(L2,M), すべての要素が(L2,' '), append(L0,_表示日ならび,L2,L), '7個組'(L,_7個組ならび),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,28) :- not(うるう年(_年)),!. 月日数(_,_月,30) :- member(_月,[4,6,9,11]). 月日数(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). % (4) 基礎述語の定義 年入力処理(_年) :- write('表示したいカレンダーは西暦何年 ? '), get_line(_行), 年入力処理の二(_行,_年), 年入力検査(_年),!. 年入力処理(_年) :- 年入力処理(_年). 年入力処理の二(_行,_年) :- atom_to_term(_行,_年), integer(_年),!. 年入力処理の二(_行,_年) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 年入力検査(_年) :- _年 >= 1583, _年 =< 3999,!. 年入力検査(_年) :- write_formatted('この年を表す整数%tは不正です\n',[_年]), fail. 月入力処理(_月) :- write('月は ? '), get_line(_行), 月入力処理の二(_行,_月), 月入力検査(_月),!. 月入力処理(_月) :- 月入力処理(_月). 月入力処理の二(_行,_月) :- atom_to_term(_行,_月,_), integer(_月),!. 月入力処理の二(_行,_月) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 月入力検査(_月) :- _月 >= 1, _月 =< 12,!. 月入力検査(_月) :- write_formatted('この月を表す整数%tは不正です\n',[_月]), fail. 日付文字列編集処理(_年,_月,_日,_日付文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), ヘッドゼロサプライ(2,_日,_日文字列), concat_atom([_年文字列,_月文字列,_日文字列],_日付文字列). 年月文字列編集処理(_年,_月,_年月文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), concat_atom([_年文字列,_月文字列],_年月文字列). ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). ヘッドゼロサプレス(N桁,_整数,_ヘッド空白整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプレス_1(N桁,_数字ならび,_ヘッド空白整数文字ならび), concat_atom(_ヘッド空白整数文字ならび,_ヘッド空白整数文字列),!. ヘッドゼロサプレス_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプレス_1(N桁,L,[' '|R]) :- M桁 is N桁 - 1, ヘッドゼロサプレス_1(M桁,L,R). 要素に空白を挿入して全行表示([]) :- !. 要素に空白を挿入して全行表示([L|R]) :- concat_atom(L,' ',_表示行), write_formatted('%t\n',[_表示行]), 要素に空白を挿入して全行表示(R). すべての要素が([],_). すべての要素が([V|R],V) :- すべての要素が(R,V). '7個組'([],[]) :- !. '7個組'([A,B,C,D,E,F,G|R1]),[[A,B,C,D,E,F,G]|R2]) :- '7個組'(R1,R2). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. not(P) :- \+(P). append([],L1,L2,L) :- append(L1,L2,L) . append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R) . concat_atom([],'') :- !. concat_atom([A],A) :- !. concat_atom([A|R],S) :- concat_atom(R,S1), atom_concat(A,S1,S). concat_atom([],_,'') :- !. concat_atom([A],_,A) :- !. concat_atom([A|R],_区切り文字列,S) :- concat_atom(R,_区切り文字列,S1), atom_concat(A,_区切り文字列,S2), atom_concat(S2,S1,S). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/157 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9762.txt # # 正数による正方行列のうち、全ての行、列、斜め列の合計が同じであり、 # かつ2回以上使用される数字が存在しないものを魔方陣という。 # 下図に示すa,bに数値を設定したときに、1〜9の整数によって構成される魔方陣を # 出力するプログラムを作成せよ。 # 但し、魔方陣が作成不可能な(a,b)の組み合わせが設定された場合は、「Impossible」 # と出力するとする。 # # la_lb_l__l # l__l__l__l # l__l__l__l # 魔方陣(N枡,A,B,_行列) :- 魔方陣のための行列の生成(N枡,_行列), _行列 = [[A,B|_],_,_], 行の合計が全て一致する(_行列,S), 列の合計が全て一致する(_行列,S), 正方行列の斜め要素の合計が一致する(_行列,S). 魔方陣のための行列の生成(N枡,_行列) :- N2 is N枡 ^ 2, findall(M,for(1,M,N2),NL),!, 順列(NL,N2,_順列数字ならび), findall(_N個組,n個組(N枡,_順列数字ならび,_N個組),_行列). 行の合計が全て一致する([],S) :- !. 行の合計が全て一致する([_行|R],S) :- 魔方陣の加算(_行,0,S), 行の合計が全て一致する(R,S). 列の合計が全て一致する(_行列,S) :- 行列の転置(_行列,_転置行列), 列の合計が全て一致する(_転置行列,S),!. 正方行列の斜め要素の合計が一致する(_正方行列,S) :- length(_行列,Len), 左上から右下方向の合計(1,Len,_正方行列,0,S), 右上から左下方向の合計(1,Len,_正方行列,0,S),!. 左上から右下方向の合計(M,N,_,S,S) :- M > N,!. 左上から右下方向の合計(M,N,_行列,S1,S) :- list_nth(M,_行列,_行), list_nth(M,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 左上から右下方向の合計(M2,N,_行列,S2,S),!. 右上から左下方向の合計(M,N,_,S,S) :- M > N,!. 右上から左下方向の合計(M,N,_行列,S1,S) :- M1 is N - M + 1, list_nth(M1,_行列,_行), list_nth(M1,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 右上から左下方向の合計(M2,N,_行列,S2,S),!. n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. 魔方陣の加算([],X,X) :- !. 魔方陣の加算([A|R],Y,X) :- Z is A + Y, 魔方陣の加算(R,Z,X). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/566 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 番号と点数を配列に初期化して、それらを # 5段階にランク付けをして、受験番号・ランクを表示するプログラムを作成。 # ランク付けをする部分を関数Rankとして、番号と評価を表示する部分を関数Outputとすること。 # なお、ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 # 60〜79点をB、80〜100点をAとする。 # ただし、受験者の数は、50人以下とする。 # 番号と点数は、以下の配列を使用すること。 # 番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10}; # 点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100}; # '問題文の5段階にランク付け'('ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 60〜79点をB、80〜100点をAとする。 '). 番号の定義文('番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10};'). 点数の定義文('点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100};'). 'ランクならびの生成'(_ランクならび) :- '問題文の5段階にランク付け'(_ランク定義文), ランクの定義文解析(_ランク定義文,_ランクならび). 番号ならびの生成(_番号ならび) :- 番号の定義文(_番号の定義文), 番号の定義文解析(_番号の定義文,_番号ならび). 点数ならびの生成(_点数ならび) :- 点数の定義文(_点数の定義文), 点数の定義文解析(_点数の定義文,_点数ならび). '5段階にランク付けをして、受験番号・ランクを表示する' :- ランクならびの生成(_ランクならび), 番号ならびの生成(_番号ならび), 点数ならびの生成(_点数ならび), '5段階にランク付けをして、受験番号・ランクを表示する'(_番号ならび,_点数ならび,_ランクならび). '5段階にランク付けをして、受験番号・ランクを表示する'([],[],_). '5段階にランク付けをして、受験番号・ランクを表示する'([_番号|R1],[_点数|R2],_ランクならび) :- append(_,[[_点数下限,_点数上限,_ランク]|_],_ランクならび), _点数 >= _点数下限, _点数 =< _点数上限, writef('受験番号:%t ランク:%t\n',[_番号,_ランク]), '5段階にランク付けをして、受験番号・ランクを表示する'(R1,R2,_ランクならび). ランクの定義文解析(_ランク定義文,_ランクならび) :- 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文), split(_半角数字変換されたランク定義文,[' ','。','、','〜','点を','とする'],L), n個組(3,L,_ランクならび). 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文) :- atom_chars(_ランク定義文,Chars), findall(_文字_1, append(_,[_文字|_],Chars), 全角数字ならば半角数字に変換(_文字,_文字_1)), Chars2), atom_chars(_半角数字変換されたランク定義文,Chars2). 全角数字ならば半角数字に変換([_全角数字|R1],[_半角数字|R2]) :- 全角数字半角数字変換(_全角数字,_半角数字), 全角数字ならば半角数字に変換(R1,R2). 全角数字ならば半角数字に変換([_文字|R1],[_文字|R2]) :- \+(全角数字半角数字変換(_文字,_)), 全角数字ならば半角数字に変換(R1,R2). 全角数字半角数字変換(0,0). 全角数字半角数字変換(1,1). 全角数字半角数字変換(2,2). 全角数字半角数字変換(3,3). 全角数字半角数字変換(4,4). 全角数字半角数字変換(5,5). 全角数字半角数字変換(6,6). 全角数字半角数字変換(7,7). 全角数字半角数字変換(8,8). 全角数字半角数字変換(9,9). 番号の定義文解析(_番号の定義文,_番号ならび) :- split(_番号の定義文,['=',',',';'],[_|_番号ならび]). 点数の定義文解析(_点数の定義文,_点数ならび) :- split(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは % % SWI-Prolog のコマンド引数の内、ユーザパラメータ部分をリストに得る。 % user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/348 # # [1] C言語演習 # # [2] argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 # 但し、第一引数だけは別の配列(ary)に格納はしないこと。 # 例)argv:./test a b c d e f # 例)ary :./test b c d e f # # [3.1] redhat # [3.3] C言語 # [4] 本日中 # [5] 制限:なし # わかる方どうかよろしくお願いします。 # # 'argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 但し、第一引数だけは別の配列(ary)に格納はしないこと'(UserParameterList) :- user_parameters([_|UserParameterList]),!. user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/425 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 与えた文字列を指定した回数繰り返す文字列に変換するプログラムを作成しなさい。 # ただし、main関数を以下のように宣言し、実行時に引数をとれるようにする。 # 第一引数は繰り返し回数とし、第二引数は繰り返される文字列とする。 # すなわち、./prog 3 "ABC"と実行した場合は、ABCABCABCとなる文字列が作られる。 # 作られた文字列は、表示すること。必要に応じて、数字を数値に変換する関数atoi()を使用してもよい。 # その際は、#include<stdlib.h>を加えること。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc,char*argv[]){ # /** argc:引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:引数**/ # x=atoi(argv[1]);/*atoiの使用例*/ # return(0); # } # program :- 与えた文字列を指定した回数繰り返す文字列に変換する. 与えた文字列を指定した回数繰り返す文字列に変換する :- user_parameters([_回数文字列,_文字列]), atom_to_term(_回数文字列,_回数,_), length(Ln,_回数), append(_,[_|R],Ln), write(_文字列), R = []. user_parameters(A) :- current_prolog_flag(argv, B), append(_, [--|A], B). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/639 # # [1] C言語演習 # [2] argvで入力された引数 "123:456:78:90" の様な文字列を ":" 区切りで # 別の配列へ順に格納せよ。(strchr関数を使いなさい) # 上記の例では、[0]=123,[1]=456,[2]=78,[3]=90となる。 # 尚、::の連続もありで、"12:34::90" は [0]=12,[1]=34,[2]=null,[3]=90となる。 # # 下の様に処理しているが、スマートに行きません。。。 # p = NULL; # p = strchr(str, ':'); # while (p != NULL) { # printf("length %d\n", strlen(str)-strlen(p)); # p++; # p = strchr(p, ':'); # } # 'argvで入力された引数 "123:456:78:90" の様な文字列を ":" で区切り、プログラム引数述語のリスト引数とする' :- user_parameters([_引数文字列]), split(_引数文字列,[':'],L), assertz(プログラム引数(L)). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/682 # # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(0,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,1,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,0,1,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,1,0,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,0,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(0,1,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,1,1,'NG') :- !. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/699 # # ../test/read.cgi/tech/1311089619/682について内容が不足していたので再投稿します。 # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # [3] フラグ・判定にビット演算を使用してください。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する。判定はビット演算を使う' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'OK') :- 0 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'NG') :- 1 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/453 # # 【 課題 】コマンドラインから入力された点数を集計するプログラムを作成。 #       ソースファイルにコードを追加して、以下の実行結果になるように。 # # 実行結果  #       java CalcMain 69 88 70 45 95 33 #       高得点順: 95点 , 88点 , 70点 , 69点 , 45点 , 33点 #       科目数:6科目 #       合計点:400点 #       平均点: 66.666664点 #        CalcMainクラスはmain()メソッドを持つ。 #        Calculationクラスは、合計点の計算をするgetTotal()メソッド、平均点の計算をするgetAve()メソッド、並び替え処理を行うsort()メソッドを持つ。 #        コマンドライン引数から受け取った不特定数の数値(点数)について、降順並び替え表示、科目数、合計点、平均点の表示を行う。 #        sort()メソッドの並び替え処理には「バブルソート」を使用する # # #       ソースファイル #       http://ime.nu/www.dotup.org/uploda/www.dotup.org2249012.java.html # # http://ime.nu/www.dotup.org/uploda/www.dotup.org2249060.java # # # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11月14日まで # 【 Ver  】java version "1.6.0_22" # 【 用語 】 # 【 補足 】よろしくお願いします。 # # 'コマンドラインから入力された点数を集計するプログラムを作成。ソースファイルにコードを追加して、以下の実行結果になるように。' :- コマンドラインから入力された点数(_コマンドラインから入力された点数ならび), 高得点順に表示(_コマンドラインから入力された点数ならび), 科目数と合計点と平均点の表示(_コマンドラインから入力された点数ならび). コマンドラインから入力された点数(_コマンドラインから入力された点数ならび) :- current_prolog_flag(argv,_コマンドライン), append(_,['--'|_コマンドラインから入力された点数ならび],_コマンドライン]). 高得点順に表示(L) :- バブルソート降順(L,L2), concat_atom(L2,',',_表示文字列), writef('高得点順: %t\n',[_表示文字列]). 科目数の表示(L,_科目数) :- length(L,_科目数), writef('科目数: %t\n',[_科目数]), 科目数と合計点と平均点の表示(L) :- length(L,_科目数), sum(L,_合計点), _平均点 is _合計点 / _科目数. writef('科目数: %t\n合計点: %t\n平均点: %t\n',[_科目数,_合計点,_平均点]). バブルソート降順(_対象ならび,_整列済みならび) :- 降順交換(_対象ならび,_対象ならびの一), !, バブルソート降順(_対象ならびの一,_整列済みならび). バブルソート降順(_整列済みならび,_整列済みならび). 降順交換([],[]) :- !,fail. 降順交換([A,B|R],[B,A|R]) :- A @< B,!. 降順交換([A|R1],[A|R2]) :- 降順交換(R1,R2). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/670 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # #include<stdio.h> # int main(void) # { # int i=0; # char *ptr; # char str[128]; # # ptr = str; # # scanf("%s",&str); # # while(*ptr++){ # i++; # } # # printf("%d\n",i); # } # # 上記の入力したテキストの文字数を表示するプログラムの読み込み部分をファイル処理に変更せよ。 # fgetc() 関数を使用し、コマンドラインにファイル名が指定できるようにすること。 # ただし、ファイル名を指定しない場合は標準入力とする。 # ファイルが見つからなかった時はエラーメッセージを出し、プログラムを終了する。 # 'length系組込述語を使わず入力したテキストの文字数を表示する' :- get_chars(_文字ならび), ならびの文字数を数える(_文字ならび,_文字数), writef('文字数は %t文字です\n',[_文字数]). ならびの文字数を数える([],0). ならびの文字数を数える([_|R],_文字数) :- ならびの文字数を数える(R,_文字数_1), _文字数 is _文字数_1 + 1. 読み込み部分をファイル処理に変更する :- コマンドラインからファイル名を取り出す(_ファイル名), 読み込み部分をファイル処理に変更する(_ファイル名). 読み込み部分をファイル処理に変更する(user_input,_文字数) :- ファイルから読み出しながら文字数を数える(user_input,_文字数). 読み込み部分をファイル処理に変更する(_ファイル名,_文字数) :- open(_ファイル名,read,Instream), ファイルから読み出しながら文字数を数える(Instream,_文字数), close(Instream). ファイルから読み出しながら文字数を数える(Instream,0) :- at_end_of_stream(Instream),!. ファイルから読み出しながら文字数を数える(Instream,_文字数) :- get_char(Instream,_), ファイルから読み出しながら文字数を数える(Instream,_文字数_1), _文字数 is _文字数_1 + 1. コマンドラインからファイル名を取り出す(_ファイル名) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList), ParameterList = [_ファイル名|_],!. コマンドラインからファイル名を取り出す(user_input). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/613 # # 明日までの課題です。 # まったくわかりません。 # # キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力するプログラムを書きなさい。 # なお、プログラムは次の要件を満たすこと。 # # 1.キーボードからの入力は、Enter(return)キーを2回連続して入力すると終了する # 2.入力終了後、画面に入力した行数を表示する # 3.コマンドラインからプログラムを起動後、入力する文字列に各自の氏名(ローマ字表記)を含めた場合、入力処理終了後、各自の氏名を含む行は何行目にあり、その行の文字列が何であるか表示する。 # 氏名が入力データに含まれていない場合には、含まれていなかったことを表示する # # よろしくお願いします。 # # program :- 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する' :- user_parameters([_ファイル名]), open(_ファイル名,write,Outstream), get_line(Line), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,[]), close(Outstream). 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,'',Ln) :- length(Ln,_行数), writef('行数は %t です\n',[_行数]),!. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,Ln) :- writef(Outstream,'%t\n',[Line]), get_line(Line_2), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line_2,[_|Ln] user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/59 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): # main関数を以下のように宣言し、実行時に引数を取れるようにする。 # 引数がすべて得点であるとして、その平均値を # 求めるプログラムを作成しなさい。 # すなわち、 # ./prog 50 70 90 と実行した場合は、70と表示される。 # 必要に応じて、数字を数値に変換する関数atoi()や # atof()を使用してもよい。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc, char *argv[] ) { # /** argc: 引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:実数 **/ # x = atof( argv[1] ); /* atofの使用例 */ # return(0); # } # # ※ 配列のサイズなど、定数は必ず#defineを利用すること. # ※ 表示や入力を目的とする関数以外では、 # 関数の中で標準入力や標準出力への入出力は行わないこと. # # #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語: c言語 # [4] 期限: 6月15日 # よろしくお願いします! # # program :- user_parameters(_ユーザパラメータならび), プログラム引数を整数ならびに変換(_ユーザパラメータならび,_整数ならび), avg(整数ならび,_相加平均), writef('%t\n',[_相加平均]). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). プログラム引数を整数ならびに変換([],[]). プログラム引数を整数ならびに変換([A|R1],[N|R2]) :- atom_to_term(A,N,_), integer(N), プログラム引数を整数ならびに変換(R1,R2). プログラム引数を整数ならびに変換([_|R1],R2) :- プログラム引数を整数ならびに変換(R1,R2). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/642 # # [1] 授業単元:C言語演習 # [2] 問題文: # 実行ファイル名をmultiとして、multiに続いて2つの正の整数を入力すると、小さい方の整数から大きい方の整数までの積を出力するプログラムを作成せよ。 # 但し、入力時には小さい方の整数、大きいほうの整数の順で入力されるものとする。 # <入力例>$./multi 3 6 # <計算結果>360 # program :- user_parameters([_引数1,_引数2]), 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2), user_parameters(ParametersList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2) :- atom_number(_引数1,N1), atom_number(_引数2,N2), 小さい方の整数と大きい方の整数(N1,N2,_小さい方の整数,_大きい方の整数), 小さい方の整数から大きい方の整数までの積を(_小さい方の整数,_大きい方の整数,_積), 出力する(_積). 小さい方の整数と大きい方の整数(N1,N2,N1,N2) :- N1 =< N2. 小さい方の整数と大きい方の整数(N1,N2,N2,N1) :- N1 > N2. 小さい方の整数から大きい方の整数までの積を(N,N,N). 小さい方の整数から大きい方の整数までの積を(N,_大きい方の整数,_積) :- N < _大きい方の整数, N1_2 is N1 + 1, 小さい方の整数から大きい方の整数までの積を(N_2,_大きい方の整数,_積_2), _積 is _積_2 * N. 出力する(_積) :- writef('%t\n',[N]). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/786 # # C言語 # gcc # Linux # 問題:cat関数を作りなさい。ただし、fgets,fputsを用いること。です。 # # 明日のお昼までにお願いします。 # # cat :- user_parameters([]), get_code(user_input,Code), ストリームから読み取り書き出す(user_input,Code),!. cat :- user_parameters(L), append(_,[File|R],L), ファイルを書き出す(File), R = [],!. ファイルを書き出す(File) :- open(File,read,Instream), get_code(Instream,Code), ストリームから読み取り書き出す(Instream,Code), close(Instream). ストリームから読み取り書き出す(_,-1) :- !. ストリームから読み取り書き出す(Instream,Code_1) :- put_code(Code_1), get_code(Instream,Code_2), ストリームから読み取り書き出す(Instream,Code_2). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). % % SWI-Prologの起動は % # swipl -t cat -f プログラムファイル名 -- ファイル1 ファイル名2 ... % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/907 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 以下のようにmain関数を定義し、mainの引数を合計するプログラムsumを作成せよ。ただし、引数の数は未定であり、実行時に決定されるものとする。 # int main(int argc, char *argv[]) # main :- 利用者引数ならび(_利用者引数ならび), findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値ならび), sum(_数値ならび,_合計), writef('%t\n',[_合計]). sum([],0). sum([_数値|R],_合計) :- sum(R,_合計_1), _合計 is _数値 + _合計_1. 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). % % # swipl --quiet -f c161_907.html -g main -- 33.0 25.1 38.4 % 96.5 % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/957 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク): # コマンド行から複数の数値を受け取りその平均値を出力するプログラムを # 作成し、プログラムリストと実行結果を示せ。ヒント:受け取った文字列を # double型に変換するには、関数double atof(const char *nPtr)を使う。 # この関数を使うには<stdlib.h>のインクルードが必要である。 # #include <stdio.h> # #include <stdlib.h> # int main(void) # { # char str[]="1.41421356"; # double x; # x = atof(str); # } # 'コマンド行から複数の数値を受け取りその平均値を出力する' :- 利用者引数ならび(_利用者引数ならび), 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび), 相加平均(_数値引数ならび,_相加平均), writef('平均値は %t です\n',[_相加平均]). 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび) :- findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値引数ならび). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0e+00,M). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/142 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ # input関数とshow関数を作ること # コマンド引数にテキストファイルの名前を入れること # 'テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ。コマンド引数にテキストファイルの名前を入れること' :- コマンド引数からテキストファイルの名前を得る(_テキストファイル), テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル). コマンド引数からテキストファイルの名前を得る(_テキストファイル) :- current_prolog_flag(argv,ParameterList), append(_,['--'|[_テキストファイル]],ParameterList). テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル) :- テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル,Outstream), そのテキストファイルの中身を出力せよ(_テキストファイル). テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル) :- open(_テキストファイル,write,Outstream). そのなかに整数5個数字を入れる(Outstream), close(Outstream). そのなかに整数5個数字を入れる(Outstream) :- between(1,5,_何番目), 整数を得る(_整数), writef(Outstream,'%t\n',[_整数]), _何番目 = 5. そのテキストファイルの中身を出力せよ(_テキストファイル) :- open(_テキストファイル,read,Instream), copy_stream_data(Instream,user_output), close(Instream). % % ここではズルをして組込述語 copy_stream_data/2 を使って見た。 % % 本来ならget_lines/2とput_lines/2の組合せでコピーを表現するところ。 % % そのテキストファイルの中身を出力せよ(_テキストファイル) :- % get_lines(_テキストファイル,_行ならび), % put_lines(user_output,_行ならび). % % get_lines(_ファイル名,_行ならび) :- % open(_ファイル名,read,Instream), % findall(_行,( % repeat, % ( at_end_of_stream(Instream),!,fail; % get_line(Instream,_行))), % _行ならび), % close(Instream). % % put_lines(_ファイル名,_行ならび) :- % open(_ファイル名,write,Outstream), % forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), % close(Outstream). % % 以下のサイトは # 出題場所 :: http://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) :- get_line(user_input,Line). get_line(Instream,Line) :- get_char(Instream,C), get_line_1(Instream,C,Chars), atom_chars(Line,Chars) . get_line_1(_,'\n',[]) :- !. get_line_1(_,end_of_file,[]) :- !. get_line_1(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_1(Instream,C2,R). '日付と曜日の生成'(_年,_月,_日,_年,_月,_日,_曜日) :- '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(_定数,_文字番号ならび). % 以下のサイトは % 使用言語 SWI-Prolog % 以下、ソースコード :- op(400,xfx,だけ). :- op(300,xf,分). :- op(400,xfx,が真になる全ての場合). :- op(500,xfx,を). :- op(600,xf,に収集する). :- op(400,xfx,を結合して). :- op(600,xf,を得る). 行のずれを意味する空白文字列(' '). 項表示形式('%6c'). パスカルの三角形 :- パスカルの三角形([_,_,_,_,_,_,_,_,_,_],[1]),!. パスカルの三角形([_],_上の行) :- '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行). パスカルの三角形([_|_行数],_上の行) :- パスカルの三角形の行を順に表示する([_|_行数],_上の行). '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行) :- パスカルの三角形の上の行を表示([],_上の行). パスカルの三角形の行を順に表示する([_|_行数],_上の行) :- 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行), パスカルの三角形(_行数,_現在行). 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行) :- 上の行の二項の和(_上の行,_上の行の二項の和) が真になる全ての場合 _上の行の二項の和 を _両端の1が落ちた計算された行 に収集する, パスカルの三角形の上の行を表示(_行数,_上の行), 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行). 上の行の二項の和(_上の行,_上の行の二項の和) :- append(_,[_左上の項,_右上の項|_],_上の行), _上の行の二項の和 is _左上の項 + _右上の項. パスカルの三角形の上の行を表示(_行数,_上の行) :- '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列), 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列), 表示する('%t%t\n',[_行頭からの空白文字列,_上の行の数字表示文字列]). '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列) :- 行のずれを意味する空白文字列(_行のずれを意味する空白文字列), _行数 分 だけ _行のずれを意味する空白文字列 を _空白文字列ならび に収集する, _空白文字列ならび を結合して _行頭からの空白文字列 を得る. 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列) :- 上の行の数字表示部分(_上の行,_上の行の数字表示部分), _上の行の数字表示部分 を結合して _上の行の数字表示文字列 を得る. 上の行の数字表示部分(_上の行,_上の行の数字表示部分) :- 項表示形式(_項表示形式), 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) が真になる全ての場合 _上の行の数字文字列 を _上の行の数字表示部分 に収集する. 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) :- member(_項,_上の行), swritef(_上の行の数字文字列,_項表示形式,[_項]). 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行) :- append([1|_両端の1が落ちた計算された行],[1],_現在行). _行数 分 だけ _行のずれを意味する空白文字列 を _空白文字列ならび に収集する :- findall(_行のずれを意味する空白文字列,member(_,_行数),_空白文字列ならび). _目標 が真になる全ての場合 _収集項 を _収集項ならび に収集する :- findall(_収集項,_目標,_収集項ならび). 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) が真になる全ての場合 _上の行の数字文字列 を _上の行の数字表示部分 に収集する :- findall(_上の行の数字文字列,( 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列)),_上の行の数字表示部分). _上の行の数字表示部分 を結合して _上の行の数字表示文字列 を得る :- atomic_list_concat(_上の行の数字表示部分,_上の行の数字表示文字列). 表示する(_表示形式項,_値ならび) :- writef(_表示形式項,_値ならび). :- nl,パスカルの三角形,nl,halt. % 以下、実行結果 # swipl -f temp1.pl 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 % 以下のサイトは # 最近、マシューはポエマーな女子高生に恋をしている。彼女は詩人なんだが、パーコさんと言うんだ。 # # パーコ :「あらゆる物体、すなわち大空、星、大地、その王国などは、精神の最も小さいものにもおよばない。なぜなら、精神はそれらのすべてと自身とを認識するが、物体は何も認識しないからである。」 # # マシュー:「それは新しい詩かい?」 # # パーコ :「違う。パスカルの『パンセ』に記載された有名な一節。知らない人がいるんだ。」 # # マシュー:「Oh...ごめんよ。」 # # パーコ :「人間は自然の中では矮小な生き物にすぎないが、考えることによって宇宙を超える、というパスカルの考え方には実に共感するものがある。」 # # マシュー:「そうだなあ。確かに、マシューの肉体は小さいが、妄想だけはいつもビッグサイズだ!・・・さて、パーコ、デートに行かないか?」 # # パーコ :「うん、そうね。じゃあ、パスカルにちなんで、パスカルの三角形をプログラムで表示して欲しい。もちろん、数学の美しさを生かした記述の仕方をしてね。」 # # 以下の三角形が10行分のパスカルの三角形だ。こちらを再現して欲しい。 # # 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 # # 動作確認はideoneで行う。 # ideoneで正しく動作しない場合は不正解となりますので注意してくれよ。 # 言語は40種類以上サポートしているぞ。 # # ・使用した言語 # ・ソースコード # ・答え # の3つを合わせて記述して欲しい。 % 使用言語 SWI-Prolog % 以下、ソースコード :- op(400,xfx,だけ). :- op(300,xf,分). :- op(400,xfx,が真になる全ての場合). :- op(500,xfx,を). :- op(600,xf,に収集する). :- op(400,xfx,を結合して). :- op(600,xf,を得る). 行のずれを意味する空白文字列(' '). 項表示形式('%6c'). パスカルの三角形 :- パスカルの三角形([_,_,_,_,_,_,_,_,_,_],[1]),!. パスカルの三角形([_],_上の行) :- '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行). パスカルの三角形([_|_行数],_上の行) :- パスカルの三角形の行を順に表示する([_|_行数],_上の行). '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行) :- パスカルの三角形の上の行を表示([],_上の行). パスカルの三角形の行を順に表示する([_|_行数],_上の行) :- 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行), パスカルの三角形(_行数,_現在行). 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行) :- 上の行の二項の和(_上の行,_上の行の二項の和) が真になる全ての場合 _上の行の二項の和 を _両端の1が落ちた計算された行 に収集する, パスカルの三角形の上の行を表示(_行数,_上の行), 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行). 上の行の二項の和(_上の行,_上の行の二項の和) :- append(_,[_左上の項,_右上の項|_],_上の行), _上の行の二項の和 is _左上の項 + _右上の項. パスカルの三角形の上の行を表示(_行数,_上の行) :- '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列), 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列), 表示する('%t%t\n',[_行頭からの空白文字列,_上の行の数字表示文字列]). '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列) :- 行のずれを意味する空白文字列(_行のずれを意味する空白文字列), _行数 分 だけ _行のずれを意味する空白文字列 を _空白文字列ならび に収集する, _空白文字列ならび を結合して _行頭からの空白文字列 を得る. 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列) :- 上の行の数字表示部分(_上の行,_上の行の数字表示部分), _上の行の数字表示部分 を結合して _上の行の数字表示文字列 を得る. 上の行の数字表示部分(_上の行,_上の行の数字表示部分) :- 項表示形式(_項表示形式), 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) が真になる全ての場合 _上の行の数字文字列 を _上の行の数字表示部分 に収集する. 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) :- member(_項,_上の行), swritef(_上の行の数字文字列,_項表示形式,[_項]). 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行) :- append([1|_両端の1が落ちた計算された行],[1],_現在行). _行数 分 だけ _収集項 を _収集項ならび に収集する :- findall(_収集項,member(_,_行数),_収集項ならび). _目標 が真になる全ての場合 _収集項 を _収集項ならび に収集する :- findall(_収集項,_目標,_収集項ならび). L を結合して A を得る :- atomic_list_concat(L,A). 表示する(_表示形式項,_値ならび) :- writef(_表示形式項,_値ならび). :- nl,パスカルの三角形,nl,halt. % 以下、実行結果 # swipl -f temp1.pro 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 % 以下のサイトは # 出典: プログラミングのお題スレ 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). % 以下のサイトは ならびの右回転([],[]) :- !. ならびの右回転([A|R1],[E|R2]) :- ならびの右回転(R1,A,E,R2). ならびの右回転([E],A,E,[A]) :- !. ならびの右回転([B|R1],A,E,[B|R2]) :- ならびの右回転(R1,A,E,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ならびの右回転([],[]) :- !. ならびの右回転([A|R],_右回転したならび) :- append(R,[A],_右回転したならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 文字列の右回転 % 文字列の右回転(_文字列,_右回転した文字列) :- sub_atom(_文字列,0,1,_残り文字数,_文字), sub_atom(_文字列,1,_残り文字数,0,_残り文字列), atomic_list_concat([_残り文字列,_文字],_右回転した文字列). % 以下のサイトは ならびの右ローテイト([],[]) :- !. ならびの右ローテイト([A|R1],[E|R2]) :- ならびの右ローテイト(R1,A,E,R2). ならびの右ローテイト([E],A,E,[A]) :- !. ならびの右ローテイト([B|R1],A,E,[B|R2]) :- ならびの右ローテイト(R1,A,E,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ならびの右ローテイト([],[]) :- !. ならびの右ローテイト([A|R],_右ローテイトしたならび) :- append(R,[A],_右ローテイトしたならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 文字列の右ローテイト % 文字列の右ローテイト(_文字列,_右ローテイトした文字列) :- sub_atom(_文字列,0,1,_残り文字数,_文字), sub_atom(_文字列,1,_残り文字数,0,_残り文字列), atomic_list_concat([_残り文字列,_文字],_右ローテイトした文字列). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/206 # お題:文字列中の数字が一文字以上連続する部分を右ローテイトする。 # 例 # "2014-10-03 00:17:21" -> "21-2014-10 03:00:17" # "1 2 3 4" -> "4 1 2 3" # "a0=0;a1=1;a2=2;a3=3" -> "a3=0;a0=1;a1=2;a2=3" # # '文字列中の数字が一文字以上連続する部分を右ローテイトする。'(_文字列,_数字が一文字以上連続する部分を右ローテイトした文字列) :- atom_chars(_文字列,_文字ならび), '文字列ならびの数字が一文字以上連続する部分を右ローテイトする。'(_文字ならび,_数字列部分が右ローテイトしたならび), atomic_list_concat(_数字列部分が右ローテイトしたならび,_数字が一文字以上連続する部分を右ローテイトした文字列). '文字列ならびの数字が一文字以上連続する部分を右ローテイトする。'(_文字ならび,_数字列部分が右ローテイトしたならび) :- '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(_文字ならび,_数字列ならび,_数字列部分が右ローテイトしたならび), 右ローテイトしてから変数部分を埋める(_数字列ならび,_数字列部分が右ローテイトしたならび). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'([],[],[]). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(L1,[_数字列|R2],[_|R3]) :- 先頭からの数字ならびを数字列に変換(L1,_数字列,R1), '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(R1,R2,R3). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(L1,R2,[_文字列|R3]) :- 先頭からの数字以外の文字ならびを文字列に変換(L1,_文字列,R1), '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(R1,R2,R3), 先頭からの数字ならびを数字列に変換(L1,_数字列,R1) :- 先頭からの数字ならびを(L1,_数字ならび,R1), 数字列に変換(_数字ならび,_数字列). 先頭からの数字ならびを(L1,_数字ならび,R1) :- append(_数字ならび,R1,L1), 要素の全てが数字(_数字ならび), 'R1の最初の要素があればそれは数字ではない'(R1). 'R1の最初の要素があればそれは数字ではない'(R1) :- \+((R1 = [_文字|_],member(_文字,['0','1','2','3','4','5','6','7','8','9'])). 要素の全てが数字(_数字ならび) :- forall(member(_数字,_数字ならび),member(_数字,['0','1','2','3','4','5','6','7','8','9'])). 数字列に変換(_数字ならび,_数字列) :- atom_chars(_数字列,_数字ならび). 先頭からの数字以外の文字ならびを文字列に変換(L1,_文字列,R1) :- append(_文字ならび,R1,L1), 要素の全てが数字ではない(_文字ならび), 'R1の最初の要素があればそれは数字以外の文字ではない'(R1). 要素の全てが数字ではない(_文字ならび) :- forall(member(_文字,_文字ならび),\+(member(_文字,['0','1','2','3','4','5','6','7','8','9']))). 'R1の最初の要素があればそれは数字以外の文字ではない'(R1) :- \+((R1 = [A|_],\+(member(A,['0','1','2','3','4','5','6','7','8','9'])))). 右ローテイトしてから変数を埋める([],L2) :- !. 右ローテイトしてから変数を埋める(L1,L2) :- 右ローテイトしてから(L1,L3), 変数を埋める(L3,L2). 右ローテイトしてから([A|R],L3) :- append(R,[A],L3). 変数を埋める([],[]) :- !. 変数を埋める([_数字列|R1],[_数字列|R2]) :- 変数を埋める(R1,R2). 変数を埋める(R1,[_文字列|R2]) :- 変数を埋める(R1,R2). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/89 # 0と1のみでランダムに生成した文字列Sがある # 長さは2<=S<=1000である # 11001010110100011001011011111111111111000000000010111000000 # # 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX # 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN # としたときのMXとMNを求めよ # 見当たらない場合はFALSEを出力しろ # # S=110001010100 # MX=3 (000が一番長い) # MN=2 (11または00が二番目に長い) # # S=111111 # MX=3 (111111が一番長い) # MN=FALSE (2番目に短いものが存在しない) # # S=10 # MX=FALSE (1番長いのが存在しない) # MX=FALSE (2番目に短いものが存在しない) # # '0と1のみでランダムに生成した文字列Sがある 長さは2<=S<=1000である 11001010110100011001011011111111111111000000000010111000000 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ' :- '0と1のみでランダムに生成した文字列Sがある'(_文字列), forall('同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ'(_文字列,_最長文字列,_短い方から二番目の文字列), write('S=%t\nMX=%t,MN=%t\n',[_文字列,_最長文字列,_短い方から二番目の文字列])),!. '0と1のみでランダムに生成した文字列Sがある 長さは2<=S<=1000である 11001010110100011001011011111111111111000000000010111000000 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ' :- write('FALSE\n'). '0と1のみでランダムに生成した文字列Sがある'(_文字列) :- R is random(999) + 2, findall(_0または1,( between(2,R,_), _0または1 is random(3341) mod 2), _0または1ならび), atomic_list_concat(_0または1ならび,_文字列). '同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ'(_文字列,_最長文字列,_短い方から二番目の文字列) :- 連続した文字列と文字数ならびを得る(_文字列,_連続した文字列と文字数ならび), 最長文字列と短い方から二番目の文字列(_連続した文字列と文字数ならび,_最長文字列,_短い方から二番目の文字列). 連続した文字列と文字数ならびを得る(_文字列,_連続した文字列と文字数ならび) :- findall([_連続した文字列,_文字数],( 連続した文字列と文字数(_文字列,_連続した文字列,_文字数)), _連続した文字列_文字数ならび). 連続した文字列と文字数(_文字列,_連続した文字列,_文字数) :- '0の連続したの文字列'(_文字列,_連続した文字列,_文字数). 連続した文字列と文字数(_文字列,_連続した文字列,_文字数) :- '1の連続したの文字列と文字数'(_文字列,_連続した文字列,_文字数). '0の連続したの文字列'(_文字列,_連続した文字列,_文字数) :- sub_atom(_文字列,_開始点,_文字数,_残り文字数,_連続した文字列), 前後に0の文字がない(_文字列,_開始点,_文字数,_残り文字数), forall(sub_atom(_連続した文字列,_,1,_,_文字),_文字='0'). '1の連続したの文字列'(_文字列,_連続した文字列,_文字数) :- sub_atom(_文字列,_開始点,_文字数,_残り文字数,_連続した文字列), 前後に0の文字がない(_文字列,_開始点,_文字数,_残り文字数), forall(sub_atom(_連続した文字列,_,1,_,_文字),_文字='1'). 前後に0の文字がない(_文字列,_開始点,_文字数) :- succ(_開始点_1,_開始点), _開始点_2 is _開始点 + _文字数, \+(sub_atom(_文字列,_開始点_1,1,_,'0')), \+(sub_atom(_文字列,_開始点_2,1,_,'0')). 前後に1の文字がない(_文字列,_開始点,_文字数) :- succ(_開始点_1,_開始点), _開始点_2 is _開始点 + _文字数, \+(sub_atom(_文字列,_開始点_1,1,_,'1')), \+(sub_atom(_文字列,_開始点_2,1,_,'1')). 最長文字列と短い方から二番目の文字列(_連続した文字列と文字数ならび,_最長文字列,_短い方から二番目の文字列) :- 最長文字数と短い方から二番目に短い文字数(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数), 最長文字数と短い方から二番目に短い文字列(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数,_最長文字列,_短い方から二番目に短い文字列). 最長文字数と短い方から二番目に短い文字数(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数) :- 文字列長ならび(_連続した文字列と文字数ならび,_文字列長ならび), sort(_文字列長ならび,_整列した文字列長ならび), nth1(2,_整列した文字列長ならび,_短い方から二番目に短い文字数), append(_,[_最長文字数],_整列した文字列長ならび). 文字数ならび(_連続した文字列と文字数ならび,_文字数ならび) :- findall(_文字数,( member([_,_文字数],_連続した文字列と文字列数ならび)), _文字数ならび). 最長文字数と短い方から二番目に短い文字列(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数,_最長文字列,_短い方から二番目に短い文字列) :- member([_最長文字列,_最長文字数],_連続した文字列と文字数ならび), member([_短い方から二番目に短い文字列,_短い方から二番目に短い文字数],_連続した文字列と文字数ならび). % 以下のサイトは # # 9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ # '9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ' :- '9―3÷1/3+1=?', 尾崎さんならPrologで解きそうだ. '9―3÷1/3+1=?' :- '全角文字を半角文字にしながら/をrdivに÷を/に置換する'('9―3÷1/3+1',_置換された半角式文字列), '/(実は÷)の演算子結合度をrdiv(実は/)の400より強くする', 置換された半角式文字列を解釈実行する(_置換された半角式文字列,_はてな), 式を復元して表示する('9―3÷1/3+1=',_はてな). '全角文字を半角文字にしながら/をrdivに÷を/に置換する'('9―3÷1/3+1',_置換された半角式文字列) :- 'ここだけの文字列置換(=?は除去される)'('9―3÷1/3+1=?',_置換された半角式文字列). '/(実は÷)の演算子結合度をrdiv(実は/)の400より強くする' :- op(401,yfx,(/)). 置換された半角式文字列を解釈実行する(_置換された半角式文字列,_はてな) :- read_term_from_atom(_置換された半角式文字列,_式,[]), _はてな is _式. 'ここだけの文字列置換(=?は除去される)'(_文字列,_置換された文字列) :- findall(_置換された文字,( sub_atom(_文字列,_,1,_,_文字), ここだけの置換(_文字,_置換された文字)),_置換された文字ならび), atomic_list_concat(_置換された文字ならび,_置換された文字列). ここだけの置換('9','9'). ここだけの置換('―','-'). ここだけの置換('3','3'). ここだけの置換('÷','/'). ここだけの置換('/',' rdiv '). ここだけの置換('+','+'). ここだけの置換('1','1'). ここだけの置換('=',''). ここだけの置換('?',''). ここだけの置換('2','2'). ここだけの置換('4','4'). ここだけの置換('5','5'). ここだけの置換('6','6'). ここだけの置換('7','7'). ここだけの置換('8','8'). ここだけの置換('0','0'). 式を復元して表示する(_表示文字列_1,_はてな) :- '_はてなを全角数字に置換する'(_はてな,_はてな全角文字列), writef('%t%t\n',[_表示文字列_1,_はてな全角文字列]). '_はてなを全角数字に置換する'(_はてな,_はてな全角数字文字列) :- number_chars(_はてな,_はてな数字ならび), 半角文字ならびを全角文字ならびに変換する(_はてな数字ならび,_はてな全角数字ならび), atomic_list_concat(_はてな全角数字ならび,_はてな全角数字文字列). 半角文字ならびを全角文字ならびに変換する(_はてな数字ならび,_はてな全角数字ならび) :- findall(_全角数字,( member(_半角数字,_はてな数字ならび), ここだけの置換(_全角数字,_半角数字)),_はてな全角数字ならび). 尾崎さんならPrologで解きそうだ. % 以下のサイトは # 9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ '9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ' :- '9―3÷1/3+1=?', 尾崎さんならPrologで解きそうだ. '9―3÷1/3+1=?' :- op(401,yfx,(/)), ここだけの文字列置換('9―3÷1/3+1=?',_置換された文字列), read_term_from_atom(_置換された文字列,_式 = ?,[]), X is _式, '?を全角数字の解に置換して表示する'('9―3÷1/3+1=%t\n',X). ここだけの文字列置換(_文字列,_置換された文字列) :- findall(_置換された文字,( sub_atom(_文字列,_,1,_,_文字), ここだけの文字置換(_文字,_置換された文字)),_置換された文字ならび), atomic_list_concat(_置換された文字ならび,_置換された文字列). ここだけの文字置換('9','9'). ここだけの文字置換('―','-'). ここだけの文字置換('3','3'). ここだけの文字置換('÷','/'). ここだけの文字置換('/',' rdiv '). ここだけの文字置換('+','+'). ここだけの文字置換('1','1'). ここだけの文字置換('=','='). ここだけの文字置換('?',' ? '). ここだけの文字置換('2','2'). ここだけの文字置換('4','4'). ここだけの文字置換('5','5'). ここだけの文字置換('6','6'). ここだけの文字置換('7','7'). ここだけの文字置換('8','8'). ここだけの文字置換('0','0'). '?を全角数字の解に置換して表示する'(_表示パターン,X) :- '?を全角数字の解に置換して'(X,_解文字列), writef(_表示パターン,[_解文字列]). '?を全角数字の解に置換して'(X,_解文字列) :- number_chars(X,Chars), findall(_全角数字,( member(_数字,Chars), ここだけの文字置換(_全角数字,_数字)),_解文字ならび), atomic_list_concat(_解文字ならび,_解文字列). 尾崎さんならPrologで解きそうだ. % 以下のサイトは # 9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ '9―3÷1/3+1=? 尾崎さんならPrologで解きそうだ'(X) :- '9―3÷1/3+1=?'(X), 尾崎さんならPrologで解きそうだ. '9―3÷1/3+1=?'(X) :- op(401,yfx,(/)), ここだけの文字列置換('9―3÷1/3+1=?',_置換された文字列), read_term_from_atom(_置換された文字列,_式,[]), X is _式. ここだけの文字列置換(_文字列,_置換された文字列) :- findall(_置換された文字,( sub_atom(_文字列,_,1,_,_文字), ここだけの文字置換(_文字,_置換された文字)),_置換された文字ならび), atomic_list_concat(_置換された文字ならび,_置換された文字列). ここだけの文字置換('9','9'). ここだけの文字置換('―','-'). ここだけの文字置換('3','3'). ここだけの文字置換('÷','/'). ここだけの文字置換('/',' rdiv '). ここだけの文字置換('+','+'). ここだけの文字置換('1','1'). 尾崎さんならPrologで解きそうだ. % 以下のサイトは フィボナッチ数列を20個目までカンマ区切りで出力する :- フィボナッチ数列を20個目までの数列の枠を作り初期値を埋める(_数列の枠), フィボナッチ数で数列の枠を埋める(_数列の枠), フィボナッチ数列をカンマ区切りで出力する(_数列の枠). フィボナッチ数列を20個目までの数列の枠を作り初期値を埋める(_数列の枠) :- length(_数列の枠,20), _数列の枠 = [1,1|_]. フィボナッチ数で数列の枠を埋める([_,_]). フィボナッチ数で数列の枠を埋める([_二つ前のフィボナッチ数,_一つ前のフィボナッチ数,_フィボナッチ数|R]) :- フィボナッチ数は二つ前のフィボナッチ数に一つ前のフィボナッチを加えたものです(_二つ前のフィボナッチ数,_一つ前のフィボナッチ数,_フィボナッチ数), フィボナッチ数で数列の枠を埋める([_一つ前のフィボナッチ数,_フィボナッチ数|R]). フィボナッチ数は二つ前のフィボナッチ数に一つ前のフィボナッチを加えたものです(_二つ前のフィボナッチ数,_一つ前のフィボナッチ数,_フィボナッチ数) :- _フィボナッチ数 is _二つ前のフィボナッチ数 + _一つ前のフィボナッチ数. フィボナッチ数列をカンマ区切りで出力する(_数列の枠) :- atomic_list_concat(_数列の枠,',',_フィボナッチ数列出力文字列), writef('%t\n',[_フィボナッチ数列出力文字列]). % 以下のサイトは 挟区間文字列(_文字列,_副文字列A,_副文字列B,_前文字列,_挟区間文字列,_後文字列) :- '文字列の中で副文字列Aと副文字列Bに挟まれた挟区間文字列(ただし、_挟区間文字列のなかに副文字列Aと副文字列Bは含まれない)'(_文字列,_副文字列A,_副文字列B,_前文字列,_挟区間文字列,_後文字列). '文字列の中で副文字列Aと副文字列Bに挟まれた挟区間文字列(ただし、_挟区間文字列のなかに副文字列Aと副文字列Bは含まれない)'(_文字列,_副文字列A,_副文字列B,_前文字列,_挟区間文字列,_後文字列) :- '副文字列Aと副文字列Bで検索する'(_文字列,_副文字列A,_副文字列B,_前文字列_1,_挟区間文字列,_後文字列_2), '挟区間文字列の中に副文字列Aと副文字列Bは含まれない'(_挟区間文字列,_副文字列A,_副文字列B), 前文字列と後文字列を構成する(_前文字列_1,_副文字列A,_副文字列B,_後文字列_2,_前文字列,_後文字列). '副文字列Aと副文字列Bで検索する'(_文字列,_副文字列A,_副文字列B,_前文字列_1,_挟区間文字列,_後文字列_2) :- 検索文字列(_文字列,_前文字列_1,_副文字列A,_後文字列_1), 検索文字列(_後文字列_1,_挟区間文字列,_副文字列B,_後文字列_2), '挟区間文字列の中に副文字列Aと副文字列Bは含まれない'(_挟区間文字列,_副文字列A,_副文字列B). 前文字列と後文字列を構成する(_前文字列_1,_副文字列A,_副文字列B,_後文字列_2,_前文字列,_後文字列) :- atomic_list_concat([_前文字列_1,_副文字列A],_前文字列), atomic_list_concat([_副文字列B,_後文字列_2],_後文字列). 検索文字列(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,S,Len,R,_検索文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). '挟区間文字列の中に副文字列Aと副文字列Bは含まれない'(_挟区間文字列,_副文字列A,_副文字列B) :- \+(sub_atom(_挟区間文字列,_,_,_,_副文字列A)), \+(sub_atom(_挟区間文字列,_,_,_,_副文字列B)). % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0.0,200.0,_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), get_term_from_atom(_身長文字列,_身長,[]), get_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重) :- 収束条件を満たす(_体重_下,_体重_上,_体重),!. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重) :- '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_体重_2,_BMI,_BMI_2,_体重_下,_体重_上), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重). 収束条件を満たす(_体重_下,_体重_上,_体重) :- (_体重_上 - _体重_下) < 0.1, _体重 is (_体重_上 + _体重_下) / 2. '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_BMI,_体重_下,_体重_上) :- '新しい体重とその時のBMIを計算する'(_体重_下_1,_体重_上_1,_BMI_2,_体重_2), '次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_体重_2,_BMI,_BMI_2,_体重_下,_体_上). '新しい体重とその時のBMIを計算する'(_体重_下,_体重_上,_BMI_2,_体重_2) :- _体重_2 is (_体重_下 + _体重_上) / 2, _BMI_2 is _体重_2 / ((_身長 / 100) ^ 2). '次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_体重_2,_BMI,_BMI_2,_体重_下,_体_2) :- _BMI_2 =< _BMI,!. '次の体重の計算区間を得る'(_体重_下,_体重_上,_体重_3,_BMI,_BMI_2,_体重_2,_体重_上). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), get_term_from_atom(_身長文字列,_身長,[]), get_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重) :- '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0,_身長,_BMI,_体重_BMIとの差ならび), 'BMIの計算差が最小のものの体重'(_体重_BMIとの差ならび,_体重). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(2000,_身長,_BMI,[]) :- !. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(N,_身長,_BMI,[[N,_BMI_の計算差]|R]) :- '身長、体重から、BMIの計算差を得る'(N,_身長,_BMI,N_2,_体重,_BMIの計算差), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(N_2,_身長,_BMI,R). '身長、体重から、BMIの計算差を得る'(N,_身長,_BMI,N_2,_体重,_BMIの計算差) :- _BMIの計算差 is abs((N / 10) / ((_身長 / 100) ^ 2)) - _BMI), succ(N,N_2), _体重 is N / 10. 'BMIの計算差が最小のものの体重'(_N_BMIとの差ならび,_体重) :- select([_体重,_BMIの差],_N_BMIとの差ならび,R), forall(member([_,_BMIの差_1],R),_BMIの差 =< _BMIの差_1). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), get_term_from_atom(_身長文字列,_身長,[]), get_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重) :- _体重 is _BMI * (_身長 / 100) ^ 2. 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/db/1402919549/274 # よろしくお願いいたします。 # 【DBMS名とバージョン】Oracle 11g # 【テーブルデータ】 # ID   YMD # 1  20140101 # 1  20140102 # 1  20140103 # 1  20140105 # 1  20140106 # 2  20140101 # 2  20140102 # 【欲しい結果 】 # ID START_YMD END_YMD # 1 20140101 20140103 # 1 20140105 20140106 # 2 20140101 20140102 # 【説明】 # レコード単位で一日の日付を持つデータをグループかして、 # 開始日付と終了日付に集約したいです。 # ただし、一日でも間があれば、集約データ内では別レコードとして扱いたいです。 # # どなたかいいお知恵がございましたら、よろしくお願いいたしますm(_ _)m # # 'レコード単位で一日の日付を持つデータをグループかして、 開始日付と終了日付に集約したいです。 ただし、一日でも間があれば、集約データ内では別レコードとして扱いたいです。'(_id,_START_YMD,_END_YMD) :- findsetof(_ID,table(_ID,_),_id候補), member(_ID,_ID候補), findsetof(_YMD,table(_ID,_YMD),_YMD候補), 連続性検査(_YMD候補,_START_YMD,_END_YMD). 連続性検査(_YMD候補,_START_YMD,_END_YMD) :- append(L1,[_START_YMD|R2],L2,_YMD候補), 連続している([_START_YMD|R2],_END_YMD), 連続していない(L1,[_START_YMD]), 連続していない([_END_YMD],L2). 連続している([_END_YMD],_END_YMD) :- !. 連続している([_YMD_1,_YMD_2|R1],_END_YMD) :- 翌日(_YMD_1,_YMD_2), 連続している([_YMD_2|R1],_END_YMD). 連続していない(L1,[_YMD_2|_]) :- last(L1,_YMD_1), \+(翌日(_YMD_1,_YMD_2)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 翌日(_YMD,_翌日) :- 年月日(_YMD,_年,_月,_日), 翌日(_年,_月,_日,_翌日). 年月日(_YMD,_年,_月,_日) :- sub_atom(_YMD,0,2,_,_年), sub_atom(_YMD,2,2,_,_月), sub_atom(_YMD,4,2,_,_日). 翌日(_年,_月,_日,_翌日) :- 年月換わり(年,_月,_日,_翌日),!. 翌日(_年,_月,_日,_翌日) :- 翌日の日(_日,_翌日の日), atomic_list_concat([_年,_月,_翌日の日],_翌日). 年月換わり(_年,'02',_月末日,_翌日) :- 二月月末(_年,'02',_月末日,_翌日). 年月換わり(_年,_月,_月末日,_翌日) :- 小の月の月末日の翌日(_月,_月末日,_翌日). 年月換わり(_年,_月,_月末日,_翌日) :- 大の月の月末日の翌日(_年,_月,_月末日,_翌日). 二月月末(_年,'02','29',_翌日) :- atomic_list_concat([_年,'03','01'],_翌日). 二月月末(_年,'02','28',_翌日) :- atom_number(_年,_年整数), \+(うるう年(_年整数)), atomic_list_concat([_年,'03','01'],_翌日). 小の月の月末日の翌日(_月,'30',_翌日) :- member(_月,['04','06','09','11']), 翌月(_月,_翌月), atomic_list_concat([_年,_翌月,'01'],_翌日). 大の月の月末日の翌日(_年,_月,'31',_翌日) :- member(_月,['01','03','05','07','08','10','12']), 翌月(_月,_翌月), 年換わり(_年,_月,_年_1), atomic_list_concat([_年_1,_翌月,'01'],_翌日). 年換わり(_年,'12',_翌年) :- 翌年(_年,_翌年). 年換わり(_年,_月,_年) :- \+(_月='12'). うるう年(_うるう年) :- 0 is mod _うるう年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_うるう年) :- 0 is _うるう年 mod 4. 翌月('01','02'). 翌月('02','03'). 翌月('03','04'). 翌月('04','05'). 翌月('05','06'). 翌月('06','07'). 翌月('07','08'). 翌月('08','09'). 翌月('09','10'). 翌月('10','11'). 翌月('11','12'). 翌月('12','01'). 翌日の日('01','02'). 翌日の日('02','03'). 翌日の日('03','04'). 翌日の日('04','05'). 翌日の日('05','06'). 翌日の日('06','07'). 翌日の日('07','08'). 翌日の日('08','09'). 翌日の日('09','10'). 翌日の日('10','11'). 翌日の日('11','12'). 翌日の日('12','13'). 翌日の日('13','14'). 翌日の日('14','15'). 翌日の日('15','16'). 翌日の日('16','17'). 翌日の日('17','18'). 翌日の日('18','19'). 翌日の日('19','20'). 翌日の日('20','21'). 翌日の日('21','22'). 翌日の日('22','23'). 翌日の日('23','24'). 翌日の日('24','25'). 翌日の日('25','26'). 翌日の日('26','27'). 翌日の日('27','28'). 翌日の日('28','29'). 翌日の日('29','30'). 翌日の日('30','31'). 翌年(_年,_翌年) :- atom_number(_年,_年整数), succ(_年整数,_翌年の年整数), atom_number(_翌年,_翌年の年整数). % 以下のサイトは # phpの文字置換で質問です # # 【目的】 文字列内の ab を a にする ただしabの後ろがcの場合を除く # 例 ab123 → a123 、 abcde → abcde # # という条件を正規表現で記述するにはどのように書けばよいでしょうか? # # よろしくおねがいします '文字列内の ab を a にする ただしabの後ろがcの場合を除く'(_文字列,_置換された文字列) :- '文字列内のabただしabの後ろがcの場合を除く'(_文字列,_前文字列,_後文字列), '文字列内の ab を a にする ただしabの後ろがcの場合を除く'(_後文字列,_置換された文字列_2), atomic_list_concat([_前文字列,a,_置換された文字列_2],_置換された文字列),!. '文字列内の ab を a にする ただしabの後ろがcの場合を除く'(_文字列,_文字列). '文字列内のabただしabの後ろがcの場合を除く'(_文字列,_前文字列,_後文字列) :- '文字列内のab'(_文字列,_前文字列,_後文字列), 'ただしabの後ろがcの場合を除く'(_後文字列). '文字列内のab'(_文字列,_前文字列,_後文字列) :- sub_atom(_文字列,S,2,R,ab), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). 'ただしabの後ろがcの場合を除く'(_後文字列) :- \+(sub_atom(_後文字列,0,1,_,c)). % 以下のサイトは # 出典: Regular Expression(正規表現) Part12 #723 # # ●Regular Expressionの使用環境 # JavaScript # # ●検索か置換か? # 置換 # # ●説明 # 例えばある文字列の中の「体」を「體」へ、「旧」を「舊」へ…、というように変換したいときに全て書き連ねるのではなく正規表現で簡潔に表現する方法はないでしょうか # '例えばある文字列の中の「体」を「體」へ、「旧」を「舊」へ…、というように変換したいときに全て書き連ねるのではなく正規表現で簡潔に表現する方法はないでしょうか'(_文字列,_置換された文字列) :- findall(_文字,文字列中の文字を可能ならば異体字に変換する(_文字列,_文字),L), atomic_list_concat(L,_置換された文字列). 文字列中の文字を可能ならば異体字に変換する(_文字列,_文字) :- sub_atom(_文字列,_,1,_,_文字_1), 異体字変換(_文字_1,_文字). 異体字変換(_文字_1,_文字_2) :- 異体字(_文字_1,_文字_2),!. 異体字変換(_文字,_文字). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/754 # お題:与えられた文字列を正方形にして出力 # 縦横の字数が等しければ正方形とします # 字数が足りない場合は'*'で埋めること # 余る場合は余計な文字を捨ててかまいません # ただし与えられた字数により近い正方形にすること # 例:http://jump.2ch.net/?ideone.com/mA41q6 # 1, 2=1x1 # 3, 4, 5, 6=2x2 # 7, 8, 9, 10, 11, 12=3x3 # 13, 14, 15, 16=4x4 # 最終行が*だけにならないようにすること。 # '与えられた文字列を正方形にして出力 縦横の字数が等しければ正方形とします 字数が足りない場合は'*'で埋めること 余る場合は余計な文字を捨ててかまいません ただし与えられた字数により近い正方形にすること 例:http://jump.2ch.net/?ideone.com/mA41q6 1, 2=1x1 3, 4, 5, 6=2x2 7, 8, 9, 10, 11, 12=3x3 13, 14, 15, 16=4x4 最終行が*だけにならないようにすること。'(_与えられた文字列,_正方形の文字列) :- 縦横の字数(_与えられた文字列,_縦横の字数), '与えられた文字列を正方形にして出力 縦横の字数が等しければ正方形とします 字数が足りない場合は'*'で埋めること 余る場合は余計な文字を捨ててかまいません'(_与えられた文字列,_縦横の字数,_正方形の文字列). 縦横の字数(_文字列ならび,_縦横の字数) :- sub_atom(_与えられた文字列,0,_文字列の長さ,1,_与えられた文字列), _縦横の字数_1 is floor(sqrt(_文字列の長さ)), _縦横の字数_2 is ceiling(sqrt(_文字列の長さ)), 縦横の字数の選択(_文字列の長さ,_縦横の字数_1,_縦横の字数_2,_縦横の字数). 縦横の字数の選択(_文字列の長さ,_縦横の字数_1,_縦横の字数_2,_縦横の字数_1) :- abs(_縦横の字数_1 ^ 2 - _文字列の長さ) =< abs(_縦横の字数_2 ^ 2 - _文字列の長さ),!. 縦横の字数の選択(_文字列の長さ,_縦横の字数_1,_縦横の字数_2,_縦横の字数_2). '与えられた文字列を正方形にして出力 縦横の字数が等しければ正方形とします 字数が足りない場合は * で埋めること 余る場合は余計な文字を捨ててかまいません'(_文字列,_縦横の字数,_正方形の文字列) :- findall(_行,( sub_atom(_文字列,_変位,_縦横の字数,_残り文字数,_行), 0 is _変位 mod _縦横の字数, (_行=_行_1;_残り文字数 < _縦横の字数,'字数が足りない場合は * で埋めること'(_文字列,_縦横の字数,_残り文字数,_行),!,fail)), _正方形の文字列). '字数が足りない場合は * で埋めること'(_文字列,_縦横の字数,_残り文字数,_行) :- atom_length(_文字列,_文字数), _星の時数 is _縦横の字数 - _残り文字数, 星文字列(_星の字数,_星文字列), sub_atom(_文字列,_,_残り文字数,0,_副文字列), atom_concat(_副文字列,_星文字列,_行). 星文字列(_字数,_星文字列) :- findall(*,between(1,_字数,_),_星ならび), atomic_list_concat(_星ならび,_星文字列). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/861 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # (Run Length圧縮) # 文字列が連続した場合、ある規則で文字を置き換え、 # 文字列を短くすることができます。 # 例えば、AAAAという文字列の場合、@4Aと表現すれば # 1文字分圧縮されます。 # この規則で圧縮された文字列を入力して # もとの文字列に復元して終了するプログラムを # 作成してください。 # ただし、復元した文字列に@文字は出現しないものとします。 # # 原文の文字列は半角の英大文字、英小文字、数字、記号であり100文字以内、連続する文字は9文字以内です。 # # 実行例) # ab@5C1@8050 入力 # abCCCCC10000000050 出力 # @99+1=1@90 入力 # 999999999+1=1000000000 出力 # '文字列が連続した場合、ある規則で文字を置き換え、 文字列を短くすることができます。 例えば、AAAAという文字列の場合、@4Aと表現すれば 1文字分圧縮されます。 この規則で圧縮された文字列を入力して もとの文字列に復元して終了するプログラムを 作成してください。 ただし、復元した文字列に@文字は出現しないものとします。 原文の文字列は半角の英大文字、英小文字、数字、記号であり100文字以内、連続する文字は9文字以内です。 実行例) ab@5C1@8050 入力 abCCCCC10000000050 出力 @99+1=1@90 入力 999999999+1=1000000000 出力' :- '文字列が連続した場合、ある規則で文字を置き換え、 文字列を短くすることができます。 例えば、AAAAという文字列の場合、@4Aと表現すれば 1文字分圧縮されます。 この規則で圧縮された文字列を入力して もとの文字列に復元して終了する'. '文字列が連続した場合、ある規則で文字を置き換え、 文字列を短くすることができます。 例えば、AAAAという文字列の場合、@4Aと表現すれば 1文字分圧縮されます。 この規則で圧縮された文字列を入力して もとの文字列に復元して終了する' :- 圧縮された文字列を入力し(_圧縮された文字列), もとの文字列に復元して(_圧縮された文字列,_復元された文字列), 終了する(_復元された文字列). 圧縮された文字列を入力し(_圧縮された文字列) :- get_line(_圧縮された文字列). もとの文字列に復元して(_圧縮された文字列,_復元された文字列) :- '前文字列、圧縮部の復元された数字列,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部の復元された数字列,_後文字列), もとの文字列に復元して(_後文字列,_復元された文字列_2), atomic_list_concat([_前文字列,_数字列,_復元された文字列_2],_復元された文字列),!. もとの文字列に復元して(_文字列,_文字列). '前文字列、圧縮部の復元された数字列,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部の復元された数字列,_後文字列) :- '前文字列、圧縮部,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部,_後文字列), 圧縮部を復元する(_圧縮部,_圧縮部の復元された数字列). '前文字列、圧縮部,後文字列に分解'(_圧縮された文字列,_前文字列,_圧縮部,_後文字列) :- sub_atom(_圧縮された文字列,S,3,R,_圧縮部), sub_atom(_圧縮部,0,1,2,'@'), sub_atom(_圧縮された文字列,0,S,_,_前文字列), sub_atom(_圧縮された文字列,_,R,0,_後文字列). 圧縮部を復元する(_圧縮部,_圧縮部の復元された数字列) :- sub_atom(_圧縮部,1,1,_,_繰り返し回数文字), sub_atom(_圧縮部,2,1,_,_繰り返される数文字), atom_numbers(_繰り返し回数文字,[_繰り返し回数]), findall(_繰り返される数字,between(1,_繰り返し回数数,_),_圧縮部の復元された数字列). 終了する(_復元された文字列) :- writef('%t\n',[_復元された文字列]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/851 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 入力された数字まで、1から順に # 表示すること # (入力される数字の最小は、1) # (入力される数字の最大は、20) # # 実行例 # 5 入力 # 1 2 3 4 5 出力 # 11 入力 # 1 2 3 4 5 6 7 8 9 10 11 出力 # 1 入力 # 1 出力 # # '入力された数字まで、1から順に 表示すること (入力される数字の最小は、1) (入力される数字の最大は、20)' :- '入力された数字まで、(入力される数字の最小は、1最大は、20)'(_入力された数字), '1から順に表示すること'(_入力された数字). '1から順に表示すること'(_入力された数字) :- findall(_整数,between(1,_入力された数字,_整数),L), atomic_list_concat(L,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/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,_星文字列). % 以下のサイトは # [1] 小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 # その答えが100になるものを見つける)を解くプログラムを作成しなさい。プログラムはint型の変数を用い、 # 複数のクラスを定義して作成すること。 # 例 1+2+3‐4+5+6+78+9=100 # ' 小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解くプログラムを作成しなさい。プログラムはint型の変数を用い、 複数のクラスを定義して作成すること。 例 1+2+3‐4+5+6+78+9=100 '(_式) :- '小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解く'(_式). '小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解く'(_式) :- '数字の間に+や‐といった算術記号を入れて'([_1,_2,_3,_4,_5,_6,_7,_8]), atomic_list_concat([1,_1,2,_2,3,_3,4,_4,5,_5,6,_6,7,_7,8,_8,9],S), read_term_from_atom(S,_式,[]), 100 is _式. '数字の間に+や‐といった算術記号を入れて'([]). '数字の間に+や‐といった算術記号を入れて'([A|R]) :- member(A,[+,-,'']), '数字の間に+や‐といった算術記号を入れて'(R). % 以下のサイトは # [1] 小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 # その答えが100になるものを見つける)を解くプログラムを作成しなさい。プログラムはint型の変数を用い、 # 複数のクラスを定義して作成すること。 # 例 1+2+3‐4+5+6+78+9=100 # ' 小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解くプログラムを作成しなさい。プログラムはint型の変数を用い、 複数のクラスを定義して作成すること。 例 1+2+3‐4+5+6+78+9=100 '(_式) :- '小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解く'(_式). '小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解く'(_式) :- L = [+,-,''], member(_1,L), member(_2,L), member(_3,L), member(_4,L), member(_5,L), member(_6,L), member(_7,L), member(_8,L), atomic_list_concat([1,_1,2,_2,3,_3,4,_4,5,_5,6,_6,7,_7,8,_8,9],S), read_term_from_atom(S,_式,[]), 100 is _式. % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #393 # 文字列A(2≦N≦100000)が与えられる # どうしていするかな # うしていするかなど # していするかなどう # ていするかなどうし # いするかなどうして # するかなどうしてい # るかなどうしていす # かなどうしていする # などうしていするか 例('どうしていするかな うしていするかなど していするかなどう ていするかなどうし いするかなどうして するかなどうしてい るかなどうしていす かなどうしていする などうしていするか'). '文字列A(2≦N≦100000)が与えられる どうしていするかな うしていするかなど していするかなどう ていするかなどうし いするかなどうして するかなどうしてい るかなどうしていす かなどうしていする などうしていするか'(_文字列,_一文字づつ回転した文字列ならび) :- '文字列A(2≦N≦100000)が与えられる。全文を回転して、例と一致するか調べる。 一致した場合の題意は 「文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)」 であると考えられる', '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(_文字列,_一文字づつ回転した文字列ならび). '文字列A(2≦N≦100000)が与えられる。全文を回転して、例と一致するか調べる。 一致した場合の題意は 「文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)」 であると考えられる' :- 例(_回転する例文), '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(どうしていするかな,_一文字づつ回転した文字列ならび), atomic_list_concat(_一文字づつ回転した文字列ならび,'\n',_回転する例文). '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(_文字列,_一文字づつ回転した文字列ならび) :- findall(_一文字づつ回転して文字列,( 文字列を一文字づつ回転する(_文字列,_一文字づつ回転した文字列,R), ただし最終行は元に戻らない(R)), _一文字づつ回転した文字列ならび). 文字列を一文字づつ回転する(_文字列,_一文字づつ回転した文字列,R) :- sub_atom(_文字列,0,N,R,_副文字列_1), sub_atom(_文字列,N,R,0,_副文字列_2), atom_concat(_副文字列_2,_副文字列_1,_一文字づつ回転した文字列). ただし最終行は元に戻らない(R) :- \+(R = 0). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(_文字列,_文字列長,_回転する例文) :- atom_concat(_文字列,_文字列,_連結した文字列), findall(_副文字列,( sub_atom(_連結した文字列,_,_文字列長,_残り文字数,_副文字列), \+(_残り文字数 = 0)), _位置文字づつ回転した文字列ならび), atomic_list_concat(_位置文字づつ回転した文字列ならび,'\n',_回転する例文). % 以下のサイトは # # append/4からappend/nまでを一気に定義してしまう、 'append/4から/nの定義'/1 。 # append/nの定義、 'append/nの定義'/1 。 # 'append/4からappend/nの定義'(_n) :- between(4,_n,M), 'abolish_append/n'(M), 'append/nの定義'(M), _n = M. 'append/nの定義'(_n) :- 'L2からLnまで'(_n,_L2_Ln), 'L2からLn_1まで'(_n,_L2_Ln_1), 'L1からLnまで'(_n,_L1_Ln), 'append/nの定義'(_n,_L2_Ln,_L2_Ln_1,_L1_Ln). 'append/nの定義'(_n,_L2_Ln,_L2_Ln_1,_L1_Ln) :- 'append/nの第一節の定義'(_n,_L2_Ln), 'append/nの第二節の定義'(_n,_L2_Ln_1,_L1_Ln). 'append/nの第一節の定義'(_n,_L2_Ln) :- format(atom(S1),'append([],~w) :-~n append(~p).~n',[_L2_Ln,_L2_Ln]), read_term_from_atom(S1,Clause_1,[variables(_変数ならび),variable_names(_変数名ならび)]), assertz(Clause_1). 'append/nの第二節の定義'(_n,_L2_Ln_1,_L1_Ln) :- format(atom(S2),'append([U|L1],~w,[U|L~p]) :-~n append(~w).\n',[_L2_Ln_1,_n,_L1_Ln]), read_term_from_atom(S2,Clause_2,[variables(_変数ならび),variable_names(_変数名ならび)]), assertz(Clause_2). 'L2からLnまで'(_n,_L2_Ln) :- findall(A,( between(2,_n,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L2_Ln). 'L2からLn_1まで'(_n,_L2_Ln_1) :- _m is _n - 1, findall(A,( between(2,_m,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L2_Ln_1). 'L1からLnまで'(_n,_L1_Ln) :- findall(A,( between(1,_n,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L1_Ln). 'abolish_append/n'(_n) :- abolish(append,_n). % 以下のサイトは # プログラミングのお題スレ Part4 #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]). % 以下のサイトは # 出典: 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('%t\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('%t%t%t\n',[_m個の空白文字列,_RT副文字列,_m個の空白文字列]), _n_2 is _n + 2, 'RT文字列描画'(_n_2), writef('%t%t%t\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). % 以下のサイトは # 出典: twitter_by_@warazo_20140611 # #     RT #    RTRT #   RTRTRT #  RTRTRTRT # RTRTRTRTRT #  RTRTRTRT #   RTRTRT #    RTRT #     RT # '     RT    RTRT   RTRTRT  RTRTRTRT RTRTRTRTRT  RTRTRTRT   RTRTRT    RTRT     RT ' :- 'RT文字列'. 'RT文字列' :- 'RT文字列描画前半部', 'RT文字列描画後半部'. 'RT文字列描画前半部' :- char_code(' ',_全角空白文字コード), 'RT文字列描画前半部'(_RT副文字列,_表示制御文字列), format(_表示制御文字,[_全角空白文字コード,_RT副文字列,_全角空白文字コード]), _RT副文字列 = 'RTRTRTRT'. 'RT文字列描画前半部'(_RT副文字列,_表示制御文字列) :- sub_atom('RTRTRTRTRT',S,Len,R,_RT副文字列), Len > 0, 0 is S mod 2, _m is R // 2, 表示制御文字列の生成(_m,_表示制御文字列). 'RT文字列描画後半部' :- char_code(' ',_全角空白文字コード), 'RT文字列描画後半部'(_RT副文字列,_表示制御文字列), format(_表示制御文字,[_全角空白文字コード,_RT副文字列,_全角空白文字コード]), _RT副文字列 = 'RT'. 'RT文字列描画後半部'(_RT副文字列,_表示制御文字列) :- sub_atom('RTRTRTRTRT',S,_,0,_RT副文字列), 0 is S mod 2, _m is S // 2, 表示制御文字列の生成(_m,_表示制御文字列). 表示制御文字の生成(_m,_表示制御文字列) :- atomic_list_concat(['~',_m,c,'%q','~'_m,c~n],_表示制御文字列). % 以下のサイトは # 出典: プログラミングのお題スレ 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). % 以下のサイトは # # 鎮 静 剤 #               マリー・ローランサン #                   堀口大學 訳 # # # 退屈な女より もっと哀れなのは 悲しい女です。 # # 悲しい女より もっと哀れなのは 不幸な女です。 # # 不幸な女より もっと哀れなのは 病気の女です。 # # 病気の女より もっと哀れなのは 捨てられた女です。 # # 捨てられた女より もっと哀れなのは よるべない女です。 # # よるべない女より もっと哀れなのは 追われた女です。 # # 追われた女より もっと哀れなのは 死んだ女です。 # # 死んだ女より もっと哀れなのは 忘れられた女です。 # # :- op(400,xf,より). :- op(450,xf,もっと). :- op(500,xfx,哀れなのは). :- op(350,xf,女). :- op(700,xf,です). 鎮静剤(_どんな,_哀れなのは) :- _どんな 女 より もっと 哀れなのは _こんな 女 です, atomic_list_concat([_どんな,女より,' もっと哀れなのは ',_こんな,'女です。'],_哀れなのは). 鎮静剤(_どんな,_哀れなのは) :- _どんな 女 より もっと 哀れなのは _こんな 女 です, 鎮静剤(_こんな,_哀れなのは). よるべない 女 より もっと 哀れなのは 追われた 女 です. 退屈な 女 より もっと 哀れなのは 悲しい 女 です. 忘れられた 女 より もっと 哀れなのは 退屈な 女 です. 追われた 女 より もっと 哀れなのは 死んだ 女 です. 不幸な 女 より もっと 哀れなのは 病気の 女 です. 捨てられた 女 より もっと 哀れなのは よるべない 女 です. 病気の 女 より もっと 哀れなのは 捨てられた 女 です. 悲しい 女 より もっと 哀れなのは 不幸な 女 です. 死んだ 女 より もっと 哀れなのは 忘れられた 女 です. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?- 鎮静剤(退屈な,_節). _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' ; _節 = 'よるべない女より もっと哀れなのは 追われた女です。' ; _節 = '追われた女より もっと哀れなのは 死んだ女です。' ; _節 = '死んだ女より もっと哀れなのは 忘れられた女です。' ; _節 = '忘れられた女より もっと哀れなのは 退屈な女です。' ; _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' . ?- % 以下のサイトは # # 鎮 静 剤 #               マリー・ローランサン #                   堀口大學 訳 # # # 退屈な女より もっと哀れなのは 悲しい女です。 # # 悲しい女より もっと哀れなのは 不幸な女です。 # # 不幸な女より もっと哀れなのは 病気の女です。 # # 病気の女より もっと哀れなのは 捨てられた女です。 # # 捨てられた女より もっと哀れなのは よるべない女です。 # # よるべない女より もっと哀れなのは 追われた女です。 # # 追われた女より もっと哀れなのは 死んだ女です。 # # 死んだ女より もっと哀れなのは 忘れられた女です。 # # :- op(400,xf,より). :- op(500,xfx,もっと哀れなのは). :- op(700,xf,です). 鎮静剤(_どんな女,_もっと哀れなのは) :- _どんな女 より もっと哀れなのは _こんな女 です, atomic_list_concat([_どんな女,より,' もっと哀れなのは ',_こんな女,'です。'],_もっと哀れなのは). 鎮静剤(_どんな女,_もっと哀れなのは) :- _どんな女 より もっと哀れなのは _こんな女 です, 鎮静剤(_こんな女,_もっと哀れなのは). よるべない女 より もっと哀れなのは 追われた女 です. 退屈な女 より もっと哀れなのは 悲しい女 です. 忘れられた女 より もっと哀れなのは 退屈な女 です. 追われた女 より もっと哀れなのは 死んだ女 です. 不幸な女 より もっと哀れなのは 病気の女 です. 捨てられた女 より もっと哀れなのは よるべない女 です. 病気の女 より もっと哀れなのは 捨てられた女 です. 悲しい女 より もっと哀れなのは 不幸な女 です. 死んだ女 より もっと哀れなのは 忘れられた女 です. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?- 鎮静剤(退屈な女,_節). _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' ; _節 = 'よるべない女より もっと哀れなのは 追われた女です。' ; _節 = '追われた女より もっと哀れなのは 死んだ女です。' ; _節 = '死んだ女より もっと哀れなのは 忘れられた女です。' ; _節 = '忘れられた女より もっと哀れなのは 退屈な女です。' ; _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' . ?- % 以下のサイトは # # 鎮 静 剤 #               マリー・ローランサン #                   堀口大學 訳 # # # 退屈な女より もっと哀れなのは 悲しい女です。 # # 悲しい女より もっと哀れなのは 不幸な女です。 # # 不幸な女より もっと哀れなのは 病気の女です。 # # 病気の女より もっと哀れなのは 捨てられた女です。 # # 捨てられた女より もっと哀れなのは よるべない女です。 # # よるべない女より もっと哀れなのは 追われた女です。 # # 追われた女より もっと哀れなのは 死んだ女です。 # # 死んだ女より もっと哀れなのは 忘れられた女です。 # # :- op(400,xf,より). :- op(500,xfx,もっと哀れなのは). :- op(700,xf,です). 鎮静剤(_どんな女,_もっと哀れなのは) :- _どんな女 より もっと哀れなのは _こんな女 です, 鎮静剤(_どんな女,_こんな女,_もっと哀れなのは). 鎮静剤(_どんな女,_こんな女,_もっと哀れなのは) :- atomic_list_concat([_どんな女,より,' もっと哀れなのは ',_こんな女,'です。'],_もっと哀れなのは). 鎮静剤(_,_こんな女,_もっと哀れなのは) :- 鎮静剤(_こんな女,_もっと哀れなのは). よるべない女 より もっと哀れなのは 追われた女 です. 退屈な女 より もっと哀れなのは 悲しい女 です. 忘れられた女 より もっと哀れなのは 退屈な女 です. 追われた女 より もっと哀れなのは 死んだ女 です. 不幸な女 より もっと哀れなのは 病気の女 です. 捨てられた女 より もっと哀れなのは よるべない女 です. 病気の女 より もっと哀れなのは 捨てられた女 です. 悲しい女 より もっと哀れなのは 不幸な女 です. 死んだ女 より もっと哀れなのは 忘れられた女 です. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?- 鎮静剤(退屈な女,_節). _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' ; _節 = 'よるべない女より もっと哀れなのは 追われた女です。' ; _節 = '追われた女より もっと哀れなのは 死んだ女です。' ; _節 = '死んだ女より もっと哀れなのは 忘れられた女です。' ; _節 = '忘れられた女より もっと哀れなのは 退屈な女です。' ; _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' . ?- % 以下のサイトは # # 鎮 静 剤 #               マリー・ローランサン #                   堀口大學 訳 # # # 退屈な女より もっと哀れなのは 悲しい女です。 # # 悲しい女より もっと哀れなのは 不幸な女です。 # # 不幸な女より もっと哀れなのは 病気の女です。 # # 病気の女より もっと哀れなのは 捨てられた女です。 # # 捨てられた女より もっと哀れなのは よるべない女です。 # # よるべない女より もっと哀れなのは 追われた女です。 # # 追われた女より もっと哀れなのは 死んだ女です。 # # 死んだ女より もっと哀れなのは 忘れられた女です。 # # :-op(500,xfx,もっと哀れなのは). 鎮静剤(_どんな女,_もっと哀れなのは) :- atom_concat(_どんな女,より,_どんな女より), _どんな女より もっと哀れなのは _こんな女です, sub_atom(_こんな女です,0,_,2,_こんな女), 鎮静剤(_どんな女,_こんな女,_もっと哀れなのは). 鎮静剤(_どんな女,_こんな女,_もっと哀れなのは) :- atomic_list_concat([_どんな女,より,' もっと哀れなのは ',_こんな女,'です。'],_もっと哀れなのは). 鎮静剤(_,_こんな女,_もっと哀れなのは) :- 鎮静剤(_こんな女,_もっと哀れなのは). よるべない女より もっと哀れなのは 追われた女です. 退屈な女より もっと哀れなのは 悲しい女です. 忘れられた女より もっと哀れなのは 退屈な女です. 追われた女より もっと哀れなのは 死んだ女です. 不幸な女より もっと哀れなのは 病気の女です. 捨てられた女より もっと哀れなのは よるべない女です. 病気の女より もっと哀れなのは 捨てられた女です. 悲しい女より もっと哀れなのは 不幸な女です. 死んだ女より もっと哀れなのは 忘れられた女です. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?- 鎮静剤(退屈な女,_節). _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' ; _節 = 'よるべない女より もっと哀れなのは 追われた女です。' ; _節 = '追われた女より もっと哀れなのは 死んだ女です。' ; _節 = '死んだ女より もっと哀れなのは 忘れられた女です。' ; _節 = '忘れられた女より もっと哀れなのは 退屈な女です。' ; _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' . ?- % 以下のサイトは 九十九までの和数字変換(9,九) :- '0から9までの変換'(_数字,_和数字). 九十九までの和数字変換(_数字,_和数字) :- '10から19までの和数字変換'(_数字,_和数字). 九十九までの和数字変換(_数字,_和数字) :- '20から99までの和数字変換'(_数字,_和数字). '0から9までの変換'(_数字,_和数字) :- _数字 >= 0, _数字 =< 9. 数字和数字変換(_数字,_和数字). 数字和数字変換(0,''). 数字和数字変換(1,一). 数字和数字変換(2,ニ). 数字和数字変換(3,三). 数字和数字変換(4,四). 数字和数字変換(5,五). 数字和数字変換(6,六). 数字和数字変換(7,七). 数字和数字変換(8,八). 数字和数字変換(9,九). '10から19までの和数字変換'(_数字,_和数字) :- N >= 10, N =< 19, M is N mod 10, 和数字一の桁の数字変換(M,M2), atomic_list_concat([十,_和数字一の桁],_和数字). '20から99までの和数字変換'(_数字,_和数字) :- N >= 20, N =< 99, 和数字一の桁の変換(_数字,_和数字一の桁), 和数字十の桁の変換(_数字,_和数字十の桁), atomic_list_concat([_和数字十の桁,十,_和数字一の桁],_和数字). 和数字一の桁の変換(_数字,_和数字一の桁) :- _数字_一の桁 is _数字 mod 10, 数字和数字変換(_数字一の桁,_和数字一の桁). 和数字十の桁の変換(_数字,_和数字十の桁) :- _数字_十の桁 is _数字 // 10, 九十九までの和数字変換(_数字_十の桁,_和数字十の桁). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #729 # # お題:○×ゲームで○が勝つ局面までの手順を深さ優先探索ですべて探し出して出力。手順の重複は認めない。 # # 列者臨 # 在皆兵 # 前陣闘 # 勝ち(列者臨). 勝ち(在皆兵). 勝ち(前陣闘). 勝ち(列在前). 勝ち(者皆陣). 勝ち(臨兵闘). 勝ち(列皆闘). 勝ち(臨皆前). '○×ゲームで○が勝つ局面までの手順を深さ優先探索ですべて探し出して出力。手順の重複は認めない。' :- すべて('○×ゲームで○が勝つ局面までの手順を深さ優先探索で探し出して'(_手順),出力(_手順)). '○×ゲームで○が勝つ局面までの手順を深さ優先探索で探し出して'(_手順) :- 交互着手(臨兵闘者皆陣列在前,○,×,[],[],_勝ち,_手順). 交互着手(_,_,_手番,_,_手番の着手点ならび,_手番,[]) :- 勝ち(_手番の着手点ならび),!. 交互着手(_着手可能点文字列,_手番,_次の手番,_手番の着手点ならび,_次の手番の着手点ならび,_勝ち,[_着手|_着手ならび]) :- 選択(_着手可能点文字列,_着手,_残り着手可能点文字列), 交互着手(_残り着手可能点文字列,_次の手番,_手番,_次の手番の着手点ならび,[_着手|_手番の着手点ならび],_勝ち,_着手ならび). 選択(_着手可能点文字列,_着手,_残り着手可能点文字列) :- 副文字列(_着手可能点文字列,_開始位置,1,_残り文字数,_着手), 着手以外の文字列を残り着手可能点とする(_着手可能点文字列,_開始位置,_残り文字数,_残り着手可能点文字列). 着手以外の文字列を残り着手可能点文字列とする(_着手可能点文字列,_前文字列長,_後文字列長,_残り着手可能点文字列) :- 副文字列(_着手可能点文字列,0,_前文字列長,_,_前文字列), 副文字列(_着手可能点文字列,_,_後文字列長,0,_後文字列), 二つの文字列の結合(_前文字列,_後文字列,_残り着手可能点文字列). 勝ち(_着手ならび) :- 勝ち(_文字列), 全ての文字列の構成文字は着手ならびに含まれる(_文字列,_着手ならび). 全ての文字列の構成文字は着手ならびに含まれる(_文字列,_着手ならび) :- すべて(副文字列(_文字列,_,1,_,文字),含まれる(_文字,_着手ならび)). 出力(_手順) :- 文字列ならびを結合して出力し改行する(_手順). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 副文字列(_文字列,_副文字列の開始位置,_文字列長,_残り文字列長,_副文字列) :- sub_atom(_文字列,_副文字列の開始位置,_文字列長,_残り文字列長,_副文字列). 文字列ならびを結合する(_文字列ならび,_結合した文字列) :- atomic_list_concat(_文字列ならび,_結合した文字列). 二つの文字列の結合(_文字列_1,_文字列_2,_結合した文字列) :- atom_concat(_文字列_1,_文字列_2,_結合した文字列). 含まれる(_要素,_ならび) :- member(_要素,_ならび). すべて(P,Q) :- forall(P,Q). 文字列ならびを結合して出力し改行する(_文字列ならび) :- atomic_list_concat(_文字列ならび,_結合した文字列), writef('%t\n',[_結合した文字列]). % 以下のサイトは # 「留神-リュウジン-」いくす @ikuth ? 2 時間 # リスト[か,ど,か,わ,ど,わ,ん,ご]の部分集合を求めてこう # # subset([],[]). # subset([Head|Tail], [Head|L]) :- # subset(Tail,L). # subset([Head|Tail],L) :- # subset(Tail,L). # # ?- subset([か,ど,か,わ,ど,わ,ん,ご],L). # これで新しい会社名を決められるな! # # あー調子にのって書くんじゃなかったくっそ不安になってきたし間違ってたら恥ずかしいわwww # # 要は対象リストの先頭を取り出して、部分集合リストに入れるか入れないかことだし…でもこれだと「角ドワンゴ川」とかはつくれない # 会社名候補(_文字ならび,_会社名候補) :- subset(_文字ならび,_部分文字ならび), atomic_list_concat(_部分文字ならび,_会社名候補). subset([],[]). subset(L1,L) :- 置換候補(L1,L,Tail,L2), subset(Tail,L2). subset([Head|Tail],L) :- subset(Tail,L). 置換候補([か|R1],[カ|R2],R1,R2). 置換候補([ど|R1],[ド|R2],R1,R2). 置換候補([わ|R1],[ワ|R2],R1,R2). 置換候補([ど|R1],[ド|R2],R1,R2). 置換候補([ん|R1],[ン|R2],R1,R2). 置換候補([ご|R1],[ゴ|R2],R1,R2). 置換候補([か,ど|R1],[角|R2],R1,R2). 置換候補([か,わ|R1],[川|R2],R1,R2). 置換候補([A|R1],[A|R2],R1,R2). % % ?- 会社名候補([か,ど,か,わ,ど,わ,ん,ご],L). % L = カドカワドワンゴ ; % L = カドカワドワンご ; % L = カドカワドワン ; % L = カドカワドワんゴ ; % L = カドカワドワんご ; % L = カドカワドワん ; % L = カドカワドワゴ ; % L = カドカワドワご ; % L = カドカワドワ ; % ・・・・・ % ・・・・・ % L = 角カんゴ ; % L = 角カんご ; % L = 角カん ; % L = 角カゴ ; % L = 角カご ; % L = 角カ ; % L = 角川ドワンゴ ; % L = 角川ドワンご ; % L = 角川ドワン ; % L = 角川ドワんゴ ; % L = 角川ドワんご ; % ・・・・・ % ・・・・・ % % 以下のサイトは 覆面算(kadokawa+dwango+kada=kandouii,N1+N2+N3=N4,_文字と数字の対応) :- 覆面(kadokawa+dwango+kada=kandouii,L0_1,L0_2,L0_3,L1,L2,L3,L4), 覆面算(L0_3,L0_2), 覆面算計算(L1,L2,L3,L4,N1,N2,N3,N4), 文字と数字の対応(L0_1,L0_2,_文字と数字の対応). 覆面(A_1+A_2+A_3=A_4,L0_1,L0_2,L0_3,L1,L2,L3,L4) :- 文字出現順の決定([A_1,A_2,A_3,A_4],L0_1), findall(N,between(1,9,_),L0_2), L0_3 = ['1','2','3','4','5','6','7','8','9','0'], 覆面文字と変数の対応付け(L0_1,L0_2,A_1,A_2,A_3,A_4,L1,L2,L3,L4). 文字出現順の決定(L,L0_1) :- atomic_list_concat(L,A), atom_chars(A,Chars), 唯一の文字ならびを得る(Chars,L0_1). 要素に重複のない文字ならび(_文字ならび,_要素に重複のない文字ならび) :- findall(_文字,( append(L1,[_文字|_],_文字ならび), \+(member(_文字,L1))), _要素に重複のない文字ならび). 数式の対応付け(L0_1,L0_2,A_1,A_2,A_3,A_4,L1,L2,L3,L4) :- 数式の対応付け(L0_1,L0_2,A_1,L1), 数式の対応付け(L0_1,L0_2,A_2,L2), 数式の対応付け(L0_1,L0_2,A_3,L3), 数式の対応付け(L0_1,L0_2,A_4,L4). 覆面文字と変数の対応付け(L0_1,L0_2,_覆面文字列,_変数ならび) :- atom_chars(_覆面文字列,_覆面文字ならび), findall(V,( nth1(_nth1,_覆面文字ならび,_文字), nth1(_nth1,L0_1,_文字), nth1(_nth1,L0_2,V)), _変数ならび). 覆面算計算(L1,L2,L3,L4,N1,N2,N3,N4) :- number_chars(N1,L1), number_chars(N2,L2), number_chars(N3,L3), number_chars(N4,L4), N1 + N2 + N3 =:= N4. 覆面算(_,[]). 覆面算(L,[A|R2]) :- select(A,L,R), 覆面算(R,R2). 文字と数字の対応(L0_1,L0_2,_文字と数字の対応) :- findall(A=B,( nth1(_nth1,L0_1,A), nth1(_nth1,L0_2,B)), _文字と数字の対応). 唯一の文字ならびを得る([],[]). 唯一の文字ならびを得る([A|R1],[A|R2]) :- \+(member(A,R1)), 唯一の文字ならびを得る(R1,R2). 唯一の文字ならびを得る([A|R1],R2) :- member(A,R1), 唯一の文字ならびを得る(R1,R2). % 以下のサイトは # 出典: Regular Expression(正規表現) Part12 #468 # # ●Regular Expressionの使用環境 # sed、grep # ●検索か置換か? # 置換 # ●説明 # マッチした結果をそのまま置き換えるでなく、 # 1つ前に改行を入れたい。 # # ●対象データ # 0ABC1DEF2GHI3JKL4MNO # # ●希望する結果 # 0ABC # 1DEF # 2GHI # 3JKL # 4MNO # # よろしくお願いします。 置換規則('0','0'). 置換規則('1','1'). 置換規則('2','2'). 置換規則('3','3'). 置換規則('4','4'). 置換規則('5','5'). 置換規則('6','6'). 置換規則('7','7'). 置換規則('8','8'). 置換規則('9','9'). 'マッチした結果をそのまま置き換えるでなく、1つ前に改行を入れたい。'(_文字列,_置換された文字列) :- 検索文字列を置換する(_文字列,_前文字列,_置換文字列,_後文字列), 後文字列も置換して置換された文字列を生成する(_前文字列,_置換文字列,_後文字列,_置換された文字列),!. 'マッチした結果をそのまま置き換えるでなく、1つ前に改行を入れたい。'(_文字列,_文字列). 後文字列も置換して置換された文字列を生成する(_前文字列,_置換文字列,_後文字列,_置換された文字列) :- 'マッチした結果をそのまま置き換えるでなく、1つ前に改行を入れたい。'(_後文字列,_置換された文字列_2), atomic_list_concat([_前文字列,'\n',_置換文字列,_置換された文字列_2],_置換された文字列). 検索文字列を置換する(_文字列,_前文字列,_置換文字列_1,_後文字列) :- 検索文字列を得る(_文字列,_前文字列,_検索文字列,_後文字列), 置換規則(_検索文字列,_置換文字列_1). 検索文字列を得る(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,S,Len,R,_検索文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # 出典 :: C言語の宿題片付けます 167代目 #324 # [1] 授業単元:プログラミング基礎 # [2] 問題文 # text.txtというファイルに以下のような個人情報が保存されているとする。これを読み込み、 # 実行例のように画面に出力するプログラムを作成しなさい。 # ヒント: 氏名の読み込みでは"name: %s\n"のような変換仕様を用いると良い。 # ▼text.txtの内容 # name: Ichiro # age: 20 # weight: 65.5 # e-mail: ichiro@foo.bar # ▼実行例 # 氏名: Ichiro # 年齢: 20 # 体重: 65.5 # Eメール: ichiro@foo.bar # # ご教示願います 'text.txtというファイルに ▼text.txtの内容 name: Ichiro age: 20 weight: 65.5 e-mail: ichiro@foo.bar のような個人情報が保存されているとする。これを読み込み、 実行例のように表示する ▼実行例 氏名: Ichiro 年齢: 20 体重: 65.5 Eメール: ichiro@foo.bar' :- 'text.txtというファイルに ▼text.txtの内容 name: Ichiro age: 20 weight: 65.5 e-mail: ichiro@foo.bar のような個人情報が保存されているとする。これを読み込み、'(Lines), '実行例のように表示する ▼実行例 氏名: Ichiro 年齢: 20 体重: 65.5 Eメール: ichiro@foo.bar'(Lines). 'text.txtというファイルに ▼text.txtの内容 name: Ichiro age: 20 weight: 65.5 e-mail: ichiro@foo.bar のような個人情報が保存されているとする。これを読み込み、'(_行ならび) :- get_lines('text.txt',_行ならび). '実行例のように表示する ▼実行例 氏名: Ichiro 年齢: 20 体重: 65.5 Eメール: ichiro@foo.bar'(_行ならび) :- append(_,[_行|_残り行ならび],_行ならび), 実行例のように(_行,_変換された行), 表示する(_変換された行), _残り行ならび = []. 実行例のように(_行,_変換された行) :- 文字列変換候補(_変換対象文字列,_変換文字列), sub_atom(_行,_前文字列の長さ,_,_後文字列の長さ,_変換対象文字列), 変換された文字列を構成する(_行,_変換文字列,_前文字列の長さ,_後文字列の長さ,_変換された文字列),!. 実行例のように(_行,_行). 変換された文字列を構成する(_行,_変換文字列,_前文字列の長さ,_後文字列の長さ,_変換された文字列) :- sub_atom(_行,0,_前文字列の長さ,_,_前文字列), sub_atom(_行,_,_後文字列の長さ,0,_後文字列), atomic_list_concat([_前文字列,_変換文字列,_後文字列],_変換された行),!. 文字列変換候補(name,氏名). 文字列変換候補(age,年齢). 文字列変換候補(weight,体重). 文字列変換候補('e-mail','Eメール'). 表示する(_変換された行) :- writef('%t\n',[_変換された行]). % 以下のサイトは 文字列の反転(_文字列,_反転した文字列) :- 最初の文字と最後の文字を入れ換えながら文字列を反転する(_文字列,_反転した文字列). 最初の文字と最後の文字を入れ換えながら文字列を反転する(_文字列,_反転した文字列) :- '最初と最後の文字、中間の文字列を得る'(_文字列,_最初の文字,_最後の文字,_中間の文字列), 最初の文字と最後の文字を入れ換えながら文字列を反転する(_中間の文字列,_反転した中間の文字列), atomic_list_concat([_最後の文字,_反転した中間の文字列,_最初の文字],_反転した文字列),!. 最初の文字と最後の文字を入れ換えながら文字列を反転する(_文字,_文字). '最初と最後の文字、中間の文字列を得る'(_文字列,_最初の文字,_最後の文字,_中間の文字列) :- sub_atom(_文字列,0,1,_,_最初の文字), sub_atom(_文字列,_,1,0,_最後の文字), sub_atom(_文字列,1,_,1,_中間の文字列). % 以下のサイトは 文字列の反転(_文字列,_反転した文字列) :- 最初の文字と最後の文字を入れ換えながら文字列を反転する(_文字列,_反転した文字列). 最初の文字と最後の文字を入れ換えながら文字列を反転する(_文字列,_反転した文字列) :- '最初と最後の文字、中間の文字列を得る'(_文字列,_最初の文字,_最後の文字,_中間の文字列), 文字列の反転(_中間の文字列,_反転した中間の文字列), atomic_list_concat([_最後の文字,_反転した中間の文字列,_最初の文字],_反転した文字列). 最初の文字と最後の文字を入れ換えながら文字列を反転する(_文字,_文字). '最初と最後の文字、中間の文字列を得る'(_文字列,_最初の文字,_最後の文字,_中間の文字列) :- sub_atom(_文字列,0,1,_,_最初の文字), sub_atom(_文字列,_,1,0,_最後の文字), sub_atom(_文字列,1,_,1,_中間の文字列). % 以下のサイトは 文字列の反転(_文字列,_反転した文字列) :- 最初の文字と最後の文字を入れ換えながら文字列を反転する(_文字列,_反転した文字列),!. 文字列の反転(_文字,_文字). 最初の文字と最後の文字を入れ換えながら文字列を反転する(_文字列,_反転した文字列) :- '最初と最後の文字、中間の文字列を得る'(_文字列,_最初の文字,_最後の文字,_中間の文字列), 文字列の反転(_中間の文字列,_反転した中間の文字列), atomic_list_concat([_最後の文字,_反転した中間の文字列,_最初の文字],_反転した文字列). '最初と最後の文字、中間の文字列を得る'(_文字列,_最初の文字,_最後の文字,_中間の文字列) :- sub_atom(_文字列,0,1,_,_最初の文字), sub_atom(_文字列,_,1,0,_最後の文字), sub_atom(_文字列,1,_,1,_中間の文字列). % 以下のサイトは # 出典 :: プログラミングのお題スレ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). % 以下のサイトは # # 先頭の連続した文字を別の文字列に置換した文字列 # 先頭の連続した文字を別の文字列に置換した文字列(_文字列,_別の文字列,_置換した文字列) :- 先頭の連続した文字を(_文字列,_先頭文字,_先頭の連続した文字数), 別の文字列に置換した文字列(_文字列,_先頭の連続した文字数,_別の文字列,_置換した文字列). 先頭の連続した文字を(_文字列,_先頭文字,_先頭の連続した文字数) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,_先頭の連続した文字数,1,_,_先頭文字とは異なる文字), \+(_先頭文字 = _先頭文字とは異なる文字),!. 別の文字列に置換した文字列(_文字列,_先頭の連続した文字数,_別の文字列,_置換した文字列) :- sub_atom(_文字列,_先頭の連続した文字数,_,0,_残り文字列), atomic_list_concat([_別の文字列,_残り文字列],_置換した文字列),!. % 以下のサイトは # # 先頭の連続した文字を一文字に置換した文字列 # 先頭の連続した文字を一文字に置換した文字列(_文字列,_置換した文字列) :- 先頭の連続した文字を(_文字列,_先頭文字,_先頭の連続した文字数), 一文字に置換した文字列(_文字列,_先頭文字,_先頭の連続した文字数,_置換した文字列). 先頭の連続した文字を(_文字列,_先頭文字,_先頭の連続した文字数) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,_先頭の連続した文字数,1,_,_先頭文字とは異なる文字), \+(_先頭文字 = _先頭文字とは異なる文字),!. 一文字に置換した文字列(_文字列,_先頭文字,_先頭の連続した文字数,_置換した文字列) :- sub_atom(_文字列,_先頭の連続した文字数,_,0,_残り文字列), atomic_list_concat([_先頭文字,_残り文字列],_置換した文字列),!. % 以下のサイトは # ●Regular Expressionの使用環境 # サクラエディタ 2.1.1.1 # # ●検索か置換か? # 置換 # # ●説明 # []内の文字だけにしたい # ※ [ と ] と (半角スペース)の3つを消したい # # ●対象データ # [あいうえお] ←最後に半角スペースあり(以下同じ) # [カキクケコ] # [AIUEO] # [漢字等々] # # ●希望する結果 # あいうえお←最後の半角スペースも消したい(以下同じ) # カキクケコ # AIUEO # 漢字等々 '[]内の文字だけとしたい'(_文字列,_変換されたデータ) :- '[]内の文字だけとしたい'(_文字列,S1,S2_2,S3), '[]内の文字だけにしたい'(S3,S3_2), atomic_list_concat([S1,S2_2,S3_2],_変換されたデータ),!. '[]内の文字だけとしたい'(_文字列,_文字列). '[]内の文字だけとしたい'(_文字列,S1,S2_2,S3) :- sub_atom(_文字列,S1,S2,S3,L1,L2,L3), sub_atom(S2,0,1,_,'['), sub_atom(S2,_,1,0,']'), '[]とスペースを削除する'(S2,S2_2),!. '[]とスペースを削除する'(S2,S2_2) :- '[]を削除する'(S2,S2_1), スペースを削除する(S2_1,S2_2). '[]を削除する'(S2,S2_1) :- sub_atom(S2,1,_,1,S2_2). スペースを削除する(S2_1,S2_2) :- findall(A,( スペースでない文字を取り出す(S2_1,A)), L), atom_chars(S2_2,L). スペースでない文字を取り出す(S2,A) :- sub_atom(S2,_,1,_,A), \+(A = ' ')). % 以下のサイトは # [1] 授業単元:プログラミング基礎II # [2] 問題文(含コード&リンク): # 課題: #  double値を10進数表示せよ。 # 対象: #  C言語 # 制約: #  ・出力にはfputc()またはputc()またはputchar()を使うこと。 #  ・printf系の書式変換を一切使ってはならない。 #  ・C標準ライブラリ以外のライブラリの使用は禁止する。 #  ・system()による外部プロセスの利用も禁止する。 # # [3] 環境 #  [3.1] OS: Windows #  [3.2] コンパイラ名とバージョン: Visual Studio 2010 #  [3.3] 言語: C # [4] 期限: 2014年05月31日まで # [5] その他の制限: プログラミング基礎I で基本的なところ(入門書1冊丸々程度)は終了してます 'double値を10進数表示せよ。'(_double値) :- _float_integer_part is float_integer_part(_double値), _float_fractional_part is float_fractional_part(_double値), 小数点以上のならび(_float_integer_part,[],_少数点以上のならび), 小数点以下のならび(_float_fractional_part,_少数点以下のならび), '10進数表示せよ。'(_少数点以上のならび,_少数点以下のならび). 小数点以上のならび(0.0,L,L) :- !. 小数点以上のならび(V,L1,L) :- N is truncate(V) mod 10, V is V / 10, 小数点以上のならび(V_1,[N|L1],L). 小数点以下のならび(0.0,[]) :- !. 小数点以下のならび(V,[N|R]) :- N is truncate(V * 10), V_1 is float_fractional_part(V * 10), 小数点以下のならび(V_1,R). '10進数表示せよ。'(_少数点以上のならび,_少数点以下のならび) :- atomic_list_concat(_少数点以上のならび,_少数点以上表示), atomic_list_concat(_少数点以下のならび,_少数点以下表示), writef('%t.%t\n',[_少数点以上表示,_少数点以下表示]). % 以下のサイトは mecab(文,_文,LL) :- tmpnam(TMPNAM), tell(TMPNAM), writef('%t\n',[_文]), told, mecab(TMPNAM,LL). mecab(_ファイル,LL) :- atomic_list_concat(['cat ',_ファイル,' | mecab'],S), sh(S,LL_1), findall([S1,S3],( member([U|_],LL_1), sub_atom(U,_,_,_,S1,'\t',S3,_,_,_)), LL). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). mecab(_ファイル,LL) :- atomic_list_concat(['cat ',_ファイル,' | mecab'],S), sh(S,LL_1), findall([S1,S3],( member([U|_],LL_1), sub_atom(U,S1,'\t',S3)), LL). sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y), split(V,[' ',','],U)), X). split(_文字列,_区切り文字ならび,L) :- atom_chars(_文字列,_文字ならび), split_list(_文字ならび,_区切り文字ならび,L). split_list([],_,[]). split_list(L1,_区切り文字ならび,[_文字列|R]) :- split_list_2(_区切り文字ならび,L1,_文字列), split_list(L3,_区切り文字ならび,R),!. split_list(L1,_区切り文字ならび,[_文字列]) :- atom_chars(_文字列,L1). split_list_2(_区切り文字ならび,L,_文字列,L3) :- append(L1,L2,L3,L), member(_区切り文字,_区切り文字ならび), split_list_3(_区切り文字,L1,L2,L3), atom_chars(_文字列,L1),!. split_list_3(_区切り文字,L1,L2,L3) :- all(L2,_区切り文字), \+(append(_,[_区切り文字],L1)), \+(L3 = [_区切り文字|_]),!. tmpnam(TMPNAM) :- 'TMPNAM'(TMPNAM), \+(exist_file(TMPNAM)),!. tmpnam(TMPNAM) :- tmpnam(TMPNAM). 'TMPNAM'(TMPNAM) :- '英小文字大文字数字からなる6要素の文字ならび'(_6要素の文字ならび), atomic_list_concat(['/tmp/file'|_6要素の文字ならび],TMPNAM). '英小文字大文字数字からなる6要素の文字ならび'(_6要素の文字ならび) :- findall(_任意の文字,( between(1,6,_), '英小文字大文字数字から任意の文字'(_任意の文字)), _6要素の文字ならび). '英小文字大文字数字から任意の文字'(_任意の文字) :- _文字コード is random(75) + 48, '文字コード48-122の範囲で記号のコードではない'(_文字コード), char_code(_任意の文字,_文字コード),!. '英小文字大文字数字から任意の文字'(_任意の文字) :- '英小文字大文字数字から任意の文字'(_任意の文字). '文字コード48-122の範囲で記号のコードではない'(_文字コード) :- '文字コード範囲58-64ではない'(_文字コード), '文字コード範囲91-96ではない'(_文字コード). '文字コード範囲58-64ではない'(_文字コード) :- \+((_文字コード>=58,_文字コード=<64)). '文字コード範囲91-96ではない'(_文字コード) :- \+((_文字コード>=91,_文字コード=<96)). sub_atom(A,H,X,T) :- atom(A), sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), sub_atom(A,_,R,0,T). % 以下のサイトは # # 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のボックス). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1387257592/351 # ●Regular Expressionの使用環境 # サクラエディタ # # ●検索か置換か? # 置換 # # ●説明 # Exampleの文字列を含まない行を削除したい # # ●対象データ # ABCA Test # BCAA Example # CABA Abc # # ●希望する結果 # BCAA Example # # # ネットで検索して出てきた^(?!.*Example).+$や^((?!Example).)*$ # で試したんですが空行が残ってしまいました # # 'Exampleの文字列を含まない行を削除したい'(_文字列,_Exampleの文字列を含まない行を削除された文字列) :- 改行記号付きの行ならびを得る(_文字列,_改行記号付きの行ならび), findall(_行,( member(_行,_文字列ならび), \+(sub_atom(_行,_,_,_,'Example'))), _Exampleの文字列を含まない行を削除された行ならび), atomic_list_concat(_Exampleの文字列を含まない行を削除された行ならび,_Exampleの文字列を含まない行を削除された文字列). 改行記号付きの行ならびを得る('',[]) :- !. 改行記号付きの行ならびを得る(_文字列,[_改行記号付き行|R]) :- 改行記号を含む行を得る(_文字列,_改行記号付き行,_残り文字列), 改行記号付きの行ならびを得る(_残り文字列,R). 改行記号を含む行を得る(_文字列,_改行記号付き行,_残り文字列) :- sub_atom(_文字列,S,1,R,'\n'), sub_atom(_文字列,0,_,R,_改行記号付き行), sub_atom(_文字列,_,R,0,_残り文字列),!. 改行記号を含む行を得る(_文字列,_文字列,''). % 以下のサイトは # # 上部の基壇に幅をもたせたピラミッドの矩形 # # # _向き = 上向き, _頂点の高さ = 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]). % 以下のサイトは 横向きに星のピラミッドを描く(_ピラミッドの頂点の高さ) :- 横向きに星のピラミッドを描く(1,_ピラミッドの頂点の高さ). 横向きに星のピラミッドを描く(_ピラミッドの頂点の高さ,_ピラミッドの頂点の高さ) :- 星で行表示する(_ビラミッドの頂点の高さ),!. 横向きに星のピラミッドを描く(N,_ピラミッドの頂点の高さ) :- 星で行表示する(N), N_2 is N + 1, 横向きに星のピラミッドを描く(N_2,_ピラミッドの頂点の高さ), 星で行表示する(N). 星で行表示する(_表示する星の数) :- findall(*,between(1,_表示する星の数,_),L), atomic_list_concat(L,A), writef('%t\n',[A]). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 # お題: # n=1のとき # 01 # 10 # # n=2のとき # 0011 # 0011 # 1100 # 1100 # # n=3のとき # 000111 # 000111 # 000111 # 111000 # 111000 # 111000 # # を表示する。 'n=1のとき 01 10 n=2のとき 0011 0011 1100 1100 n=3のとき 000111 000111 000111 111000 111000 111000 を表示する。'(_n) :- 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n). 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n) :- 'n個の数字0の後、n個の数字1を一行としてn行表示し、'(_n). 'n個の数字1の後、n個の数字0を一行としてn行表示する'(_n). 'n個の数字0の後、n個の数字1を一行としてn行表示し、'(_n) :- n個の数字0で構成されたアトム(_n,_0), n個の数字1で構成されたアトム(_n,_1), n行表示する(_n,_0,_1). 'n個の数字1の後、n個の数字0を一行としてn行表示する'(_n) :- n個の数字0で構成されたアトム(_n,_0), n個の数字1で構成されたアトム(_n,_1), n行表示する(_n,_1,_0). n個の数字0で構成されたアトム(_n,_0) :- length(L,_n), ならびの構成要素は全て数字0である(L), atomic_list_concat(L,_0). ならびの構成要素は全て数字0である([]). ならびの構成要素は全て数字0である(['0'|R]) :- ならびの構成要素は全て数字0である(R). n個の数字1で構成されたアトム(_n,_1) :- length(L,_n), ならびの構成要素は全て数字1である(L), atomic_list_concat(L,_1). ならびの構成要素は全て数字1である([]). ならびの構成要素は全て数字1である(['1'|R]) :- ならびの構成要素は全て数字1である(R). n行表示する(_n,A,B) :- forall(between(1,_n,_),writef('%t%t\n',[A,B])). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 # お題: # n=1のとき # 01 # 10 # # n=2のとき # 0011 # 0011 # 1100 # 1100 # # n=3のとき # 000111 # 000111 # 000111 # 111000 # 111000 # 111000 # # を表示する。 'n=1のとき 01 10 n=2のとき 0011 0011 1100 1100 n=3のとき 000111 000111 000111 111000 111000 111000 を表示する。'(_n) :- 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n). 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n) :- 'n個の数字0で構成されたアトム'(_n,_0), 'n個の数字1で構成されたアトム'(_n,_1), 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n,_0,_1). 'n個の数字0で構成されたアトム'(_n,_0) :- length(L,_n), ならびの構成要素は全て数字0である(L), atomic_list_concat(L,_0). ならびの構成要素は全て数字0である([]). ならびの構成要素は全て数字0である(['0'|R]) :- ならびの構成要素は全て数字0である(R). 'n個の数字1で構成されたアトム'(_n,_1) :- length(L,_n), ならびの構成要素は全て数字1である(L), atomic_list_concat(L,_1). ならびの構成要素は全て数字1である([]). ならびの構成要素は全て数字1である(['1'|R]) :- ならびの構成要素は全て数字1である(R). 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n,_0,_1) :- 'n個の数字0の後、n個の数字1を一行としてn行表示し、'(_n,_0,_1), 'n個の数字1の後、n個の数字0を一行としてn行表示する'(_n,_0,_1). 'n個の数字0の後、n個の数字1を一行としてn行表示し、'(_n,_0,_1) :- forall(between(1,_n,_),writef('%t%t\n',[_0,_1])). 'n個の数字1の後、n個の数字0を一行としてn行表示する'(_n,_0,_1) :- forall(between(1,_n,_),writef('%t%t\n',[_1,_0])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/69 # お題: # n=1のとき # 01 # 10 # # n=2のとき # 0011 # 0011 # 1100 # 1100 # # n=3のとき # 000111 # 000111 # 000111 # 111000 # 111000 # 111000 # # を表示する。 # # ブロックを表示する(_n,LL) :- '_n * _n のブロックを生成する'(_n,0,1,LL1), '_n * _n のブロックを生成する'(_n,1,0,LL2), 表示する(LL1,LL2). '_n * _n のブロックを生成する'(_n,A,B,LL) :- findall(L,( all(_n,L1,A), all(_n,L2,B), between(1,_n,_), append(L1,L2,L)), LL). all(0,[],_) :- !. all(N,[A|R],A) :- N_1 is N - 1, all(N_1,R,A). 表示する(LL1,LL2) :- forall(member(L1,LL1),(atomic_list_concat(L1,A),writef('%t\n',[A]))), forall(member(L2,LL2),(atomic_list_concat(L2,B),writef('%t\n',[B]))), % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1387257592/263 # ●Regular Expressionの使用環境 # Javascript # # ●検索か置換か? # 置換 # # ●説明 # '1'を含まないABCからDEFまでを削除したいです # # ●対象データ # ABC # 1 # DEF # # ABC # 2 # DEF # # ABC # 3 # DEF # # ●希望する結果 # ABC # 1 # DEF # # '''1''を含まないABCからDEFまでを削除したいです'(_文字列,_希望する結果) :- atom_char(_文字列,_文字ならび), '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(_文字ならび,L), atomic_list_concat(L,_希望する結果). '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'([],[]). '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(_文字ならび,L) :- '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までを'(_文字列,L3), '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(L3,L),!. '''1''を含まないABCからDEFまでを削除したいです'([A|R1],[A|R2]) :- '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(R1,R2). '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までを'(_文字列,L3) :- append(['A','B','C'|L2],['D','E','F'|L3],_文字ならび), \+(append(_,['A','B','C'|_],L2)), \+(append(_,['D','E','F'|_],L2)), \+(append(_,['1'|_],L2)),!. % 以下のサイトは # 出題場所 :: 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/910 # お題:2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を # 隣り合う文字の間に挿入した文字列を返す。 # 例 # "Personal" -> "Peerrsssoonnall" # "Hello, world!" -> "Heellllooo,, wwworrrlldd!" # % このブログラムは間違っている。最後の一文字が削られてしまう。 % この問題を解消したプログラム '2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列を返す。'(_文字列,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- findall(_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列,( sub_atom(_文字列,_,2,_,_2文字), 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_2文字,_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列)),L), atomic_list_concat(L,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_2文字,_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字), atomic_list_concat([_文字_1,_大きい方の文字],_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字) :- sub_atom(_2文字,0,1,_,_文字_1), sub_atom(_2文字,1,1,_,_文字_2), 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_大きい方の文字). 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_1) :- _文字_1 @>= _文字_2. 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_2) :- _文字_1 @< _文字_2. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1387257592/189 # ●Regular Expressionの使用環境 # ruby # # ●検索か置換か? # 置換 # # ●説明 # 行中の改行を削除したい # 以下でやると改行だけでなく改行の前の一文字も何故か消えてうまくいきません # 対象データの場合は「元」が消えてしまいます # # ruby -e 'puts open("input.txt").read.gsub(/[^。¥n]¥n/,"")' > output.txt # # ●対象データ # こんにちはお元 # 気ですか。 # 私は元気です。 # # ●希望する結果 # こんにちはお元気ですか。 # 私は元気です。 # # 文字列中の改行を削除したい(_文字列,_改行を削除された文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(_文字 = '\n')), _改行を削除された文字ならび), atomic_list_concat(_改行を削除された文字ならび,_改行を削除された文字列). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/896 # お題:単語データファイル「words.txt」から英単語リストを読み取り、アルファベットでしりとりを行い、 # 一番長いしりとりの単語列を出力せよ。同じ単語は二度使わない。 # # '一番長いしりとりの単語列を出力せよ。同じ単語は二度使わない。'(_単語列,_一番長いしりとりの単語列) :- '同じ単語は二度使わない。'(_単語列,_整列した重複のない単語列), forall(一番長いしりとり単語列を(_整列した重複のない単語列,_一番長いしりとりの単語列),'出力せよ。'(_一番長いしりとりの単語列)). 一番長いしりとり単語列を(_整列した重複のない単語列,_一番長いしりとりの単語列) :- findall([_長さ,_しりとりの単語列],しりとりの単語列(_整列した重複のない単語列,_しりとりの単語列,_長さ),LL), 一番長い(LL,_一番長い), member([_一番長い,_しりとりの単語列],LL), reverse(_しりとりの単語列,_一番長いしりとりの単語列). '同じ単語は二度使わない。'(_単語列,_整列した重複のない単語列) :- sort(_単語列,_整列した重複のない単語列). しりとりの単語列(_単語列,_しりとりの単語列,_長さ) :- select(_単語,_単語列,_残り単語列), しりとり(_単語,_残り単語列,[_単語],_しりとりの単語列), length(_しりとりの単語列,_長さ). しりとり(_単語,_単語列,L1,_しりとりの単語列) :- 単語列の中から単語の末尾文字と同じ先頭文字を持つ単語を捜す(_単語,_単語列,_次の単語候補,_残り単語列), しりとり(_次の単語候補,_残り単語列,[_次の単語候補|L1],_しりとりの単語列). しりとり(_,_,_しりとりの単語列,_しりとりの単語列). 単語列の中から単語の末尾文字と同じ先頭文字を持つ単語を捜す(_単語,_単語列,_単語_2,_残り単語列) :- sub_atom(_単語,_,1,0,_文字), select(_単語_2,_単語列,_残り単語列), sub_atom(_単語_2,0,1,_,_文字). 一番長い(LL,_一番長い) :- 最大値を捜す(_長さ,member([_長さ,_],LL),_一番長い),!. 最大値を捜す(A,B,C) :- findall(A,B,L), 最大値(L,C). 最大値(L,C) :- select(C,L,R), forall(member(A,R),A @=< C). '出力せよ。'(_一番長いしりとりの単語列) :- atomic_list_concat(_一番長いしりとりの単語列,' ',_一番長いしりとりの単語列表現), writef('%t\n',[_一番長いしりとりの単語列表現]). % 以下のサイトは タブ区切り(_文字列,_列ならび) :- findall(_列,( 先頭からタブ区切り(_文字列,_,_列)), _列ならび). 先頭からタブ区切り(_文字列,_列目,_副文字列) :- 先頭からタブ区切り(_文字列,_列目,_,_副文字列,_). 先頭からタブ区切り(_文字列,_列目,_区切り文字,_前文字列,_副文字列,_後文字列) :- 先頭からタブ区切り(_文字列,'',1,_列目,_区切り文字,_前文字列,_副文字列,_後文字列). 先頭からタブ区切り('',_,_,_,_,_,_,_) :- !,fail. 先頭からタブ区切り(_文字列,_前文字列_1,_列目_1,_列目,_区切り文字,_前文字列,_副文字列,_後文字列) :- タブ区切りが成立する(_文字列,_区切り文字_1,_副文字列_1,_後文字列_1),!, 先頭からタブ区切り(_列目_1,_区切り文字_1,_前文字列_1,_副文字列_1,_後文字列_1,_列目,_区切り文字,_前文字列,_副文字列,_後文字列). 先頭からタブ区切り(_文字列,_前文字列,_列目,_列目,'',_前文字列,_文字列,''). 先頭からタブ区切り(_列目,_区切り文字,_前文字列,_副文字列,_後文字列,_列目,_区切り文字,_前文字列,_副文字列,_後文字列). 先頭からタブ区切り(_列目_1,_,_前文字列_1,_副文字列_1,_後文字列_1,_列目,_区切り文字,_前文字列,_副文字列,_後文字列) :- _列目_2 is _列目_1 + 1, atomic_list_concat([_前文字列_1,_副文字列_1,'\t'],_前文字列_2), 先頭からタブ区切り(_後文字列_1,_前文字列_2,_列目_2,_列目,_区切り文字,_前文字列,_副文字列,_後文字列). タブ区切りが成立する(_文字列,'\t',_副文字列_1,_後文字列_1) :- sub_atom(_文字列,S,1,R,'\t'), sub_atom(_文字列,0,S,_,_副文字列_1), sub_atom(_文字列,_,R,0,_後文字列_1),!. % 以下のサイトは 語候補(2,_,_,尾崎,尾崎). 語候補(3,_前文字列,_後文字列,太加夫,隆大) :- sub_atom(_前文字列,_,_,_,尾崎). 語候補(3,_前文字列,_後文字列,太加夫,太加夫) :- \+(sub_atom(_前文字列,_,_,_,尾崎)). 文字列から最長一致法を用いて語候補を検索する(_文字列,_前文字列,_適合文字列,_後文字列) :- 候補文字列長さならび(_候補文字列長さならび), 文字列から最長一致法を用いて語候補を検索する(_文字列,_候補文字列長さならび,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_文字列,_候補文字列長さならび,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_開始位置,_長さ,_残り長さ,_適合文字列_1), member(_長さ,_候補文字列長さならび), 文字列の長さと候補文字列を得る(_文字列,_候補文字列長さならび,_長さ,_適合文字列_1,_適合文字列_1_2), 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1), 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_文字列長により降順整列した語候補ならび,_前文字列_1,_適合文字列_1_2,_後文字列_1,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- 文字列から最長一致法を用いて語候補を検索する(_後文字列_1,_候補文字列長さならび,_前文字列_2,_適合文字列,_後文字列), atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). 候補文字列長さならび(_候補文字列長さならび) :- findall(_長さ,( setof(_長さ,語候補(_長さ,_,_,_,_),[_長さ])), _候補文字列長さならび_1), reverse(_候補文字列長さならび_1,_候補文字列長さならび),!. '文字列の長さと前文字列・適合文字列・後文字列を得る'(_文字列,_開始位置,_長さ,_残り長さ,_語候補,_前文字列_1,_適合文字列_1,_後文字列_1) :- 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1), 語候補(_長さ,_前文字列,_後文字列,_語候補,_適合文字列_1). 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1) :- sub_atom(_文字列,0,_開始位置,_,_前文字列_1), sub_atom(_文字列,_,_残り長さ,0,_後文字列_1). % 以下のサイトは 語候補(2,尾崎,尾崎). 語候補(3,太加夫,隆大). 文字列から最長一致法を用いて語候補を検索する(_文字列,_前文字列,_適合文字列,_後文字列) :- 候補文字列長さならび(_候補文字列長さならび), [_最長候補文字列長さ|_] = _候補文字列長さならび, 文字列から最長一致法を用いて語候補を検索する(_文字列,_候補文字列長さならび,_最長候補文字列長さ,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_文字列,_候補文字列長さならび,_最長候補文字列長さ,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_開始位置,_長さ,_残り長さ,_適合文字列_1), _長さ =< _最長候補文字列長さ, 文字列の長さと候補文字列を得る(_文字列,_候補文字列長さならび,_長さ,_適合文字列_1,_適合文字列_1_2), 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1), 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列_1,_適合文字列_1_2,_後文字列_1,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- 文字列から最長一致法を用いて語候補を検索する(_後文字列_1,_候補文字列長さならび,_前文字列_2,_適合文字列,_後文字列), atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). 候補文字列長さならび(_候補文字列長さならび) :- findall(_長さ,( setof(_長さ,語候補(_長さ,_,_),[_長さ])), _候補文字列長さならび_1), reverse(_候補文字列長さならび_1,_候補文字列長さならび),!. 文字列の長さと候補文字列を得る(_文字列,_候補文字列長さならび,_長さ,_適合文字列_1,_適合文字列_1_2) :- member(_長さ,_候補文字列長さならび), 語候補(_長さ,_適合文字列_1,_適合文字列_1_2). 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1) :- sub_atom(_文字列,0,_開始位置,_,_前文字列_1), sub_atom(_文字列,_,_残り長さ,0,_後文字列_1). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/712 # 以前どこかで見かけた問題だけど # 「デジタル式の時計をアナログ式に変換する」 # 入出力サンプル # http://ime.nu/codepad.org/XcWCtEF5 # 目盛りをo、短針をX、長針をxで表す # 重なったときはXで表す # ただし短針は最も近い目盛りを指すようにする # # # X # o o # # o o # # o o # # o o # # o o # o # # (0時0分) # 時計板(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11, [[' ',' ',' ',' ',' ',' ',' ',' ',' ',_0,' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',_11,' ',' ',' ',' ',' ',' ',' ',' ',' ',_1,' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',_10,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',_2,' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [_9,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',_3], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',_8,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',_4,' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',_7,' ',' ',' ',' ',' ',' ',' ',' ',' ',_5,' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',_6,' ',' ',' ',' ',' ',' ',' ',' ',' ']]). 'デジタル式の時計をアナログ式に変換する。 目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分) :- 時計板(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_時計板), '目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11), 時計板の表示(_時計板). '目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11) :- '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]), '長針はxで表す。 重なったときはXで表す。'(_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]), 変数として残っている所にoを埋める([_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]). '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- '0分から29分までは短針の位置は本来の時の位置である'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]),!. '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- '30分から59分までは短針は次の時に移動する'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]). '0分から29分までは短針の位置は本来の時の位置である'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- _分 < 30, nth0(_時,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11],'X'). '30分から59分までは短針は次の時に移動する'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- _分 >= 30, _時_2 is (_時 + 1) mod 12, nth0(_時_2,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11],'X'). '長針はxで表す。 重なったときはXで表す。'(_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- _分_1 is truncate((_分 / 12) + 0.5), 分を埋める(_分_1,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]). 分をxで埋める(_分_1,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- nth0(_分_1,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11],'x'),!. 分をxで埋める(_,_). 変数として残っている所にoを埋める([]). 変数として残っている所にoを埋める([o|R]) :- 変数として残っている所にoを埋める(R),!. 変数として残っている所にoを埋める([_|R]) :- 変数として残っている所にoを埋める(R). 時計板の表示(_時計板) :- forall(member(_行,_時計板),行を表示する(_行)). 行を表示する(_行) :- atomic_list_concat(_行,_表示行), writef('%t\n',[表示行]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/712 # 以前どこかで見かけた問題だけど # 「デジタル式の時計をアナログ式に変換する」 # 入出力サンプル # http://ime.nu/codepad.org/XcWCtEF5 # 目盛りをo、短針をX、長針をxで表す # 重なったときはXで表す # ただし短針は最も近い目盛りを指すようにする # # # X # o o # # o o # # o o # # o o # # o o # o # # (0時0分) # 時計板([_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11], [[' ',_0,' '], [' ',_11,' ',_1,' '], [' '], [' ',_10,' ',_2,' '], [' '], [_9,' ',_3], [' '], [' ',_8,' ',_4,' '], [' '], [' ',_7,' ',_5,' '], [' ',_6,' ']]). 'デジタル式の時計をアナログ式に変換する。 目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分) :- 時計板(_0から_11までの変数ならび,_時計板), '目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび), 時計板の表示(_時計板). '目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび) :- '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび), '長針はxで表す。 重なったときはXで表す。'(_分,_0から_11までの変数ならび), 変数として残っている所にoを埋める(_0から_11までの変数ならび). '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび) :- '0分から29分までは短針の位置は本来の時の位置である'(_時,_分,_0から_11までの変数ならび),!. '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび) :- '30分から59分までは短針は次の時に移動する'(_時,_分,_0から_11までの変数ならび). '0分から29分までは短針の位置は本来の時の位置である'(_時,_分,_0から_11までの変数ならび) :- _分 < 30, nth0(_時,_0から_11までの変数ならび,'X'). '30分から59分までは短針は次の時に移動する'(_時,_分,_0から_11までの変数ならび) :- _分 >= 30, _時_2 is (_時 + 1) mod 12, nth0(_時_2,_0から_11までの変数ならび,'X'). '長針はxで表す。 重なったときはXで表す。'(_分,_0から_11までの変数ならび) :- _分_1 is truncate((_分 / 12) + 0.5), 分を埋める(_分_1,_0から_11までの変数ならび). 分をxで埋める(_分_1,_0から_11までの変数ならび) :- nth0(_分_1,_0から_11までの変数ならび,'x'),!. 分をxで埋める(_,_). 変数として残っている所にoを埋める([]). 変数として残っている所にoを埋める([o|R]) :- 変数として残っている所にoを埋める(R),!. 変数として残っている所にoを埋める([_|R]) :- 変数として残っている所にoを埋める(R). 時計板の表示(_時計板) :- forall(member(_行,_時計板),行を表示する(_行)). 行を表示する(_行) :- atomic_list_concat(_行,_表示行), writef('%t\n',[表示行]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/684 # お題: ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ # # 出力: http://ime.nu/codepad.org/9Qm1zRxy # # 一番上の「☆」と土台の「||」は固定でよい # 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する # # 解答例: http://ime.nu/codepad.org/aR7eI9F2 # # ☆ # || # ☆ # ** # || # ☆ # b* # *i*o # || # ☆ # ** # **** # ****** # || # ☆ # *b # **** # i**%*J # *Ni***** # || # ☆ # ** # *%** # *****i # **JX**** # ********** # || # ☆ # %* # **%* # *i***o # ******** # ****%***** # **o%****oi*b # || 葉と飾り(20,[*,*,*,*,*,*,*,*,*,*,*,*,*,'N','i','X','J',o,'%',b]). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ 出力: http://ime.nu/codepad.org/9Qm1zRxy 一番上の「☆」と土台の「||」は固定でよい 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する' :- forall((between(2,8,_何段), 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_何段,_クリスマスツリー)), クリスマスツリーの表示(_クリスマスツリー)). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_何段,_クリスマスツリー) :- length(_クリスマスツリー,_何段), append([☆|L1],['||'],_クリスマスツリー), findall(_段,( nth1(_段目,_クリスマスツリー,_段), 一段生成(_段目,_段)), _クリスマスツリー). 一段生成(_段目,_飾りを含む葉) :- var(_飾りを含む葉), length(_段,_段目), 飾りを含む葉の生成(_段,_飾りを含む葉),!. 一段生成(_,_既に存在するもの) :- \+(var(_既に存在するもの)). 飾りを含む葉の生成(_段,_一段の葉飾り) :- 葉と飾り(_基数,_葉と飾りならび), findall(_葉または飾り,( 葉または飾りの選択(_段,_基数,_葉と飾りならび,_葉または飾り)), _葉または飾りならび), atomic_list_concat(_葉または飾りならび,_一段の葉飾り),!. 葉または飾りの選択(_段,_基数,_葉と飾りならび,_葉または飾り) :- member(_葉または飾り,_段), _乱数 is random(_基数), nth0(_乱数,_葉と飾りならび,_葉または飾り). クリスマスツリーの表示(_クリスマスツリー) :- forall(member(_段,_クリスマスツリー), writef('%t\n',[_段])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/684 # お題: ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ # # 出力: http://ime.nu/codepad.org/9Qm1zRxy # # 一番上の「☆」と土台の「||」は固定でよい # 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する # # 解答例: http://ime.nu/codepad.org/aR7eI9F2 # # ☆ # || # ☆ # ** # || # ☆ # b* # *i*o # || # ☆ # ** # **** # ****** # || # ☆ # *b # **** # i**%*J # *Ni***** # || # ☆ # ** # *%** # *****i # **JX**** # ********** # || # ☆ # %* # **%* # *i***o # ******** # ****%***** # **o%****oi*b # || 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ 出力: http://ime.nu/codepad.org/9Qm1zRxy 一番上の「☆」と土台の「||」は固定でよい 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する' :- forall((between(2,8,_段), 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_段,_クリスマスツリー)), クリスマスツリーの表示(_クリスマスツリー)). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_段,_クリスマスツリー) :- length(L,_段), append([☆|L1],['||'],L), findall(A,( nth1(_nth1,L,A), '一段生成'(_nth1,A)), L). '一段生成'(_nth1,A) :- var(A), length(L,_nth1), 飾りを含む葉の生成(L,A),!. '一段生成'(_,A) :- \+(var(A)). 飾りを含む葉の生成(L,A) :- findall(B,( member(B,L), _乱数 is random(20), nth0(_乱数,[*,*,*,*,*,*,*,*,*,*,*,*,*,'N','i','X','J',o,'%',b],B)), L), atomic_list_concat(L,A),!. クリスマスツリーの表示(_クリスマスツリー) :- forall(member(A,_クリスマスツリー), writef('%t\n',[A])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/667 # Cゲンガーの逆襲! # スレにコントリビュートするために問題作ったよ!! # 64ビット変数の基数62のハッシュを作ってみよう。 # あぁ、別に64ビットじゃなくてもいいや。とにかく基数62のハッシュを作ってみよう。 # これを知っていると、例えばURLの字数短縮したりとかまぁチョイチョイ使い道がある。 # 数学苦手だからこの程度しかできなくてごめんね。 # ちなみに62なのは、数字と、アルファベットの大文字小文字を全部足すと62になるから。 # 64のほうがキリがいいよね。 '64ビット変数の基数62のハッシュを作ってみよう。'(_64ビット整数) :- atom_chars('0123456789abcdefghijkomnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',_変換符号ならび), 基数62のハッシュを作る(_64ビット整数,_変換符号ならび,[],_ハッシュ値), writef('%t -> %t\n',[_64ビット整数,_ハッシュ値]),!. 基数62のハッシュを作る(0,_,L,_ハッシュ値) :- atomic_list_concat(L,_ハッシュ値),!. 基数62のハッシュを作る(_実,_変換符号ならび,L,_ハッシュ値) :- 基数62のハッシュ符号化(_実,_変換符号ならび,_商,_変換された符号), 基数62のハッシュを作る(_商,_変換符号ならび,[_変換された符号|L],_ハッシュ値). 基数62のハッシュ符号化(_実,_変換符号ならび,_商,_変換された符号) :- _剰余 is _実 mod 62, _商 is _実 // 62, nth0(_剰余,_変換符号ならび,_変換された符号). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/658 # 任意精度整数モジュールを使ってバグ修正したかったが、 # 諸事情でそれもできなかったので出題の意図を縮小して訂正。 # # お題:1から10000までの整をすべて足せ。 # すべて足したら、その合計を表示せよ。 # # 回答例: Objective Caml version 3.08.1 # let sum1to n = # let rec f sum n = # if n = 0 then sum # else f (sum + n) (n - 1) in # f 0 n;; # print_int (sum1to 10000);; # ↓ # 50005000 # # '1から10000までの整数をすべて足せ。すべて足したら、その合計を表示せよ。' :- '1から10000までの整数をすべて足せ。'(_合計), すべて足したら、その合計を表示せよ。'(_合計). '1から10000までの整数をすべて足せ。'(_合計) :- findall(N,between(1,10000,N),_1から10000までのならび), atomic_list_concat(_1から10000までのならび,'+',_式文字列), read_term_form_atom(_式文字列,_式,[]), _合計 is _式. 'すべて足したら、その合計を表示せよ。'(_合計) :- writef('その合計は%t\n',[_合計]). % 以下のサイトは # 出題場所 :: 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('%t\n',[_文字列]), length(Ln,10). この操作(Ln,_文字列,Ln,_文字列). この操作(Ln_1,_文字列_1,Ln,_文字列) :- 連続記号を切り取って連続数と連続記号が交互に来るならびを生成する(_文字列_1,_文字構成ならび), atomic_list_concat(_文字構成ならび,_文字列_2), この操作([_|Ln_1],_文字列_2,Ln,_文字列). 連続記号を切り取って連続数と連続記号が交互に来るならびを生成する(_文字列,_文字構成ならび) :- findall([_連続数,_連続記号],( 連続記号を切り取る(_文字列,_連続数,_連続記号)), LL), flatten(LL,_文字構成ならび). 連続記号を切り取る(_文字列,_連続数,_連続記号) :- sub_atom(_文字列,0,_連続数_1,_,_連続記号_1), n個の連続記号(_連続数_1,_記号_1,_連続記号_1), \+(sub_atom(_文字列,_連続数_1,1,_,_記号_1)),!, 連続記号を切り取る(_文字列,_連続数_1,_連続記号_1,_連続数,_連続記号). 連続記号を切り取る(_文字列,_連続数,_連続記号,_連続数,_連続記号). 連続記号を切り取る(_文字列,_連続数_1,_,_連続数,_連続記号) :- sub_atom(_文字列,_連続数_1,_,0,_残り文字列), 連続記号を切り取る(_残り文字列,_連続数,_連続記号). n個の連続記号(_n個,_記号,_n個の連続記号) :- atom(_n個の連続記号), atom_chars(_n個の連続記号,_n個の連続記号ならび), n個の連続記号ならび(_n個,_記号,_n個の連続記号ならび),!. /* n個の連続記号(_n個,_記号,_n個の連続記号) :- \+(atom(_n個の連続記号)), n個の連続記号ならび(_n個,_記号,_n個の連続記号ならび), atom_chars(_n個の連続記号,_n個の連続記号ならび),!. */ n個の連続記号ならび(_n個,_記号,_n個の連続記号ならび) :- _n個の連続記号ならび = [_記号|R], length([_記号|R],_n個), all(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/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/1357191974/534 # お題:与えられた正の整数を2進文字列表現で出力せよ。 # # 回答例およびチェック用出力例: c # #include <stdio.h> # #include <limits.h> # void printbits(unsigned int n) { # int i; # for (i = sizeof (int) * 8 - 1; 0 <= i; i--) { # printf("%c", n & (1 << i) ? '1' : '0'); # } # puts(""); # } # void check(unsigned int n) { # printf("%u\n", n); # printbits(n); # } # int main() { # check(0); # check(1); # check(UINT_MAX); # return 0; # } # ↓ # 0 # 00000000000000000000000000000000 # 1 # 00000000000000000000000000000001 # 4294967295 # 11111111111111111111111111111111 # # '与えられた正の整数を2進文字列表現で出力せよ。'(_与えられた正の整数) :- 与えられた正の整数を(_与えられた正の整数), '2進文字列表現で'(_与えられた正の整数,[],_2進文字列表現), 出力せよ(_2進文字列表現). 与えられた正の整数を(_与えられた正の整数) :- integer(_与えられた正の整数), _与えられた正の整数 > 0. '2進文字列表現で'(0,L,_2進文字列表現) :- atomic_list_concat(L,_2進文字列表現),!. '2進文字列表現で'(_正の整数,L,_2進文字列表現) :- _2で割った商 is _正の整数 // 2, _2で割った剰余 is _正の整数 mod 2, '2進文字列表現で'(_2で割った商,[_2で割った剰余|L],_2進文字列表現). 出力せよ(_2進文字列表現) :- writef('%t\n',[_2進文字列表現]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/534 # お題:与えられた正の整数を2進文字列表現で出力せよ。 # # 回答例およびチェック用出力例: c # #include <stdio.h> # #include <limits.h> # void printbits(unsigned int n) { # int i; # for (i = sizeof (int) * 8 - 1; 0 <= i; i--) { # printf("%c", n & (1 << i) ? '1' : '0'); # } # puts(""); # } # void check(unsigned int n) { # printf("%u\n", n); # printbits(n); # } # int main() { # check(0); # check(1); # check(UINT_MAX); # return 0; # } # ↓ # 0 # 00000000000000000000000000000000 # 1 # 00000000000000000000000000000001 # 4294967295 # 11111111111111111111111111111111 # # '与えられた正の整数を2進文字列表現で出力せよ。'(_正の整数) :- 与えられた正の整数を2進文字列表現で(_正の整数,[],_2進文字列表現), 出力せよ(_2進文字列表現). 与えられた正の整数を2進文字列表現で(0,L,_2進文字列表現) :- atomic_list_concat(L,_2進文字列表現),!. 与えられた正の整数を2進文字列表現で(_正の整数,L,_2進文字列表現) :- _2で割った商 is _正の整数 // 2, _2で割った剰余 is _正の整数 mod 2, 与えられた正の整数を2進文字列表現で(_2で割った商,[_2で割った剰余|L],_2進文字列表現). 出力せよ(_2進文字列表現) :- writef('%t\n',[_2進文字列表現]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/542 # イマイチ出力や入力、パイプについて深く理解できなかったので質問します # よろしくお願いします。 # # [1] システムプログラム # [2] 一般の実行プログラムである/usr/bin/lessを子プロセスとして起動して、pipeを通して子プロセスの標準入力にデータ(複数行のテキスト)を渡すプログラムを作りなさい。 # '一般の実行プログラムである/usr/bin/lessを子プロセスとして起動して、 pipeを通して子プロセスの標準入力にデータ(複数行のテキスト)を渡すプログラムを作りなさい。'(_複数行のならび) :- '一般の実行プログラムを子プロセスとして起動して、 pipeを通して子プロセスの標準入力にデータ(複数行のテキスト)を渡す'('/usr/bin/less',_複数行ならび). '一般の実行プログラムを子プロセスとして起動して、 pipeを通して子プロセスの標準入力にデータ(複数行のテキスト)を渡す'(_実行プログラム,_複数行ならび) :- atomic_list_concat(_複数行ならび,'\n',_文字列), atom_chars(_文字列,_文字ならび), popen(_実行プログラム,_文字ならび). 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). % 以下のサイトは # 出題場所:: http://toro.2ch.net/test/read.cgi/tech/1357191974/435 # お題:1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は # 元のデータの順に)表示する。 '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)表示する。' :- '1から100までのチャンパーノウン定数'(_チャンパーノウン定数), '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_チャンパーノウン定数,_整列した_開始位置_数値定数ならび), 表示する(_整列した_開始位置_数値定数ならび). '1から100までのチャンパーノウン定数'(_チャンパーノウン定数) :- findall(_数値定数,( between(1,100,_数値), atom_number(_数値定数,_数値)), _数値定数ならび), atomic_list_concat(['0.'|_数値定数ならび],_チャンパーノウン定数). '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_チャンパーノウン定数,_整列した_開始位置_数値ならび) :- findall([_開始位置,_数値],( between(1,100,_数値), atom_number(_数値定数,_数値), sub_atom(_チャンパーノウン定数,_開始位置,_,_,_数値定数)), _開始位置_数値ならび), sort(_開始位置_数値ならび,_整列した_開始位置_数値ならび). 表示する(_整列した_開始位置_数値ならび) :- forall(member(_数値,_整列した_開始位置_数値ならび),writef('%t\n',[_数値])). % 以下のサイトは # 出題場所 # # ●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,_,_文字),_文字=' '). % 以下のサイトは # お題: 任意の数の自然数を与えた時、それらの自然数を四則演算した結果が、 # 期待した自然数になる式を全て列挙するコードを作成しなさい。 # ただし、式中の乗除算は加減算より先に計算するものとする。 # また数の並びは変更出来ず、括弧は使わないものとする。 # # 例: 1 5 3 6 : 10 # # 1 * 5 / 3 * 6 # 1 + 5 * 3 - 6 # # 1 5 3 6 7 : 10 # -> # 1 + 5 + 3 - 6 + 7 '任意の数の自然数を与えた時、それらの自然数を四則演算した結果が、 期待した自然数になる式を全て列挙するコードを作成しなさい。 ただし、式中の乗除算は加減算より先に計算するものとする。 また数の並びは変更出来ず、括弧は使わないものとする。'(_自然数ならび,_期待した自然数,_式) :- findall(X,( append(_,[_自然数|R],_自然数ならび), 自然数と変数を交互に(_自然数,R,X)), _自然数の間に変数が挿入されたならび), 変数に演算子を当て嵌める(_自然数の間に変数が挿入されたならび), 式を計算する(_自然数の間に変数が挿入されたならび,_期待した自然数,_式). 自然数と変数を交互に(_自然数,[],_自然数) :- !. 自然数と変数を交互に(_自然数,_,_自然数). 自然数と変数を交互に(_自然数,_,_). 変数に演算子を当て嵌める(_自然数の間に変数が挿入されたならび) :- 変数のみ取り出して(_自然数の間に変数が挿入されたならび,_変数ならび), 変数に演算子を当て嵌める(_変数ならび). 変数のみ取り出して(_自然数の間に変数が挿入されたならび,_変数ならび) :- findall(_変数,( member(_変数,_自然数の間に変数が挿入されたならび), var(_変数)), _変数ならび). 変数に演算子を当て嵌める([]). 変数に演算子を当て嵌める([_変数|R]) :- member(_演算子,[+,-,*,//]), 変数に演算子を当て嵌める(R). 式を計算する(_自然数の間に変数が挿入されたならび,_期待した自然数,_式) :- 一旦文字列に変換して(_自然数の間に変数が挿入されたならび,_式文字列), 文字列から式を生成する(_式文字列,_式), _期待した自然数 is _式,!. 一旦文字列に変換して(_自然数の間に変数が挿入されたならび,_式文字列) :- atomic_list_concat(_自然数の間に変数が挿入されたならび,_式文字列). 文字列から式を生成する(_式文字列,_式) :- read_term_from_atom(_式文字列,_式,[]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/309 # # C500問って本にあった # # * # ** # *** # **** # ***** # ****** # ******* # ******** # ********* # ********** # ってのもいい問題かと 'C500問って本にあった * ** *** **** ***** ****** ******* ******** ********* ********** ってのもいい問題かと' :- atom_chars('**********',L), forall(append([H|R],_,L),(atomic_list_concat([H|R],S),writef('%t\n',[S])). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/68 # # お題:文字列をランダムに並べ替える。 # ただし、どの文字も元と同じ位置ではないこと。 '文字列をランダムに並べ替える。 ただし、どの文字も元と同じ位置ではないこと。'(_文字列,_ランダムに並べ替えた文字列) :- 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび), 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列). 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび) :- atom_length(_文字列,_文字列の長さ), length(_位置決めならび,_文字列の長さ), findall(N,between(1,_文字列の長さ,N),_整数順ならび), 位置を置換する(_整数順ならび,_文字列の置換位置ならび). 位置を置換する([],_位置決めならび) :- !. 位置を置換する([_位置1,_位置2,_位置3],_位置決めならび) :- 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび). 位置決めならび(L,_位置決めならび) :- 位置の交換(L,R,_位置決めならび), 位置を置換する(R,_位置決めならび). 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび) :- nth1(_位置1,_位置決めならび,_位置2), nth1(_位置2,_位置決めならび,_位置3), nth1(_位置3,_位置決めならび,_位置1),!. 位置の交換(L,L2,_位置決めならび) :- 位置選択(L,N1,L1), 位置選択(N2,L1,L2), nth1(N1,_位置決めならび,N2), nth1(N2,_位置決めならび,N1),!. 位置選択(L,_位置,L2) :- length(L,Len), _乱数値 is random(Len), length(L0,Len), append(L0,[_位置|R],L), append(L0,R,L2),!. 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列) :- findall(_文字,( member(_位置,_文字列の置換位置ならび), _位置_1 is _位置 - 1, sub_atom(_文字列,_位置_1,1,_,_文字)), _ランダムに並べ替えた文字ならび), atomic_list_concat(_ランダムに並べ替えた文字ならび,_ランダムに並べ替えた文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/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). % 以下のサイトは # お題: # 入力 # AND # # 出力 # DDDDD # DNNND # DNAND # DNNND # DDDDD # 囲み(_入力) :- atom_chars(_入力,[_中心の文字|_囲み文字ならび]), 囲み(_囲み文字ならび,[[_中心の文字]],_囲み), 出力(_囲み). 囲み([],_囲み,_囲み) :- !. 囲み([_文字|R],_囲み_1,_囲み) :- 文字で囲む(_文字,_囲み_1,_囲み_2), 囲み(R,_囲み_2,_囲み). 文字で囲む(_文字,_囲み_1,_囲み_2) :- 囲みの先頭と末尾に_文字の行を付加する(_文字,_囲み_1,_先頭と末尾に_文字の行を付加された囲み_1), 囲みの各行の先頭と末尾に_文字を付加する(_文字,_先頭と末尾に_文字の行を付加された囲み_1,_囲み_2). 囲みの先頭と末尾に_文字の行を付加する(_文字,_囲み,_先頭と末尾に_文字の行を付加された囲み_1) :- 転置(_囲み_1,_転置された囲み_1), 行の先頭と末尾に文字を付加する(_文字,_転置された囲み_1,_行の先頭と末尾に_文字を付加された転置された囲み_1), 転置(_行の先頭と末尾に文字を付加された転置された囲み_1,_先頭と末尾に_文字の行を付加された囲み_1). 囲みの各行の先頭と末尾に_文字を付加する(_文字,_囲み,_行の先頭と末尾に_文字を付加された囲み) :- findall(_先頭と末尾に_文字を付加された行,( member(_行,_囲み), append([_文字|_行],[_文字],_先頭と末尾に_文字を付加された行)), _行の先頭と末尾に_文字を付加された囲み). 出力(_囲み) :- forall(member(_行,_囲み),(atomic_list_concat(_行,_行文字列),writef('%t\n',[_行文字列])). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # 西暦年を入力してそれ以後の閏年を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). % 以下のサイトは # お題:数字を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],_カンマが挿入された数字文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/700 # # お題:重複した文字のうち最初に現れた文字だけ削除する。 # 例 # "Hello, world" -> "Hel, world" 重複した文字のうち最初に現れた文字だけ削除する(_文字列,_重複した文字のうち最初に現れた文字だけ削除された文字列) :- 重複した文字のうち最初に現れた文字だけ削除する(_文字列,[],_重複した文字のうち最初に現れた文字だけ削除された文字列). 重複した文字のうち最初に現れた文字だけ削除する(_文字列,_既に削除対象となった文字列ならび,_重複した文字のうち最初に現れた文字だけ削除された文字列) :- '重複した文字のうち最初に現れた文字の前方文字列・後方文字列'(_文字列,_削除対象文字列,_既に削除対象となった文字列ならび,_前方文字列,_後方文字列), 重複した文字のうち最初に現れた文字だけ削除する(_後方文字列,[_削除対象文字列|_既に削除対象となった文字列ならび],_重複した文字のうち最初に現れた文字だけ削除された後方文字列), atomic_list_concat([_前方文字列,_重複した文字のうち最初に現れた文字だけ削除された後方文字列],_重複した文字のうち最初に現れた文字だけ削除された文字列),!. 重複した文字のうち最初に現れた文字だけ削除する(_文字列,_,_文字列). '重複した文字のうち最初に現れた文字の前方文字列・後方文字列'(_文字列,_削除対象文字列,_既に削除対象となった文字列ならび,_前方文字列,_後方文字列) :- '文字列を検索し前方文字列・後方文字列を得る'(_文字列,_前方文字列,_削除対象文字列,_後方文字列), \+(member(_削除対象文字列,_既に削除対象となった文字列ならび)), sub_atom(_後方文字列,_,_,_,_削除対象文字列),!. '文字列を検索し前方文字列・後方文字列を得る'(_文字列,_前方文字列,_対象文字列,_後方文字列) :- sub_atom(_文字列,_開始位置,_,_残り長さ,_対象文字列), sub_atom(_文字列,0,_開始位置,_,_前方文字列), sub_atom(_文字列,_,_残り長さ,0,_後方文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% p_1(_1,_2) :- p_2(_1,[],_2). p_2(_1,_2,_3) :- p_3(_1,_4,_2,_5,_6), p_2(_6,[_4|_2],_7), atomic_list_concat([_4,_7],_3),!. p_2(_1,_,_1). p_3(_1,_2,_3,_4,_5) :- p_4(_1,_4,_2,_5), \+(member(_2,_3)), sub_atom(_5,_,_,_,_2),!. p_4(_1,_2,_3,_4) :- sub_atom(_1,_5,_,_6,_3), sub_atom(_1,0,_5,_,_2), sub_atom(_1,_,_,0,_4). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/700 # # お題:重複した文字のうち最初に現れた文字だけ削除する。 # 例 # "Hello, world" -> "Hel, world" '重複した文字のうち最初に現れた文字だけ削除する。'(_文字列,_重複した文字のうち最初に現れた文字だけ削除された文字列) :- '重複した文字のうち最初に現れた文字だけ削除する。'(_文字列,[],_重複した文字のうち最初に現れた文字だけ削除された文字列). '重複した文字のうち最初に現れた文字だけ削除する。'(_文字列,_既に削除対象となった文字列ならび,_重複した文字のうち最初に現れた文字だけ削除された文字列) :- '重複した文字のうち最初に現れた文字の前後文字列'(_文字列,_削除対象文字列,_既に削除対象となった文字列ならび,_前方文字列,_後方文字列), '重複した文字のうち最初に現れた文字だけ削除する。'(_後方文字列,[_削除対象文字列|_既に削除対象となった文字列ならび],_重複した文字のうち最初に現れた文字だけ削除された後方文字列), atomic_list_concat([_前方文字列,_重複した文字のうち最初に現れた文字だけ削除された後方文字列],_重複した文字のうち最初に現れた文字だけ削除された文字列),!. '重複した文字のうち最初に現れた文字だけ削除する。'(_文字列,_,_文字列). '重複した文字のうち最初に現れた文字の前後文字列'(_文字列,_削除対象文字列,_既に削除対象となった文字列ならび,_前方文字列,_後方文字列) :- sub_atom(_文字列,_,_,_,_前方文字列,_削除対象文字列,_後方文字列,_,_,_), \+(member(_削除対象文字列,_既に削除対象となった文字列ならび)), sub_atom(_後方文字列,_,_,_,_削除対象文字列),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/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'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/528 # # ●Regular Expressionの使用環境 # サクラエディタ # # ●検索か置換か? # 置換 # # ●説明 # 1行の中に同じ単語が2連続しているのを1つだけにしたいです。 # # ●対象データ # appleapple # orangeorange # grapegrape # # ●希望する結果 # apple # orange # grape # # よろしくお願いします。 # # '1行の中に同じ単語が2連続しているのを1つだけにしたいです。'(_文字列,_短縮した文字列) :- findmax([Len,S],( sub_atom(_文字列,_,Len,_,S1,_,S3,_,L2,_), append(L,L,L2), atom_chars(S4,L), atomic_list_concat([S1,S4,S3],S)), [_,_短縮した文字列]). % 以下のサイトは # # 問題 14-13 ある文字列から特定の文字列に含まれる文字を削除するアルゴリズムを示せ。 # # 入門「データ構造とアルゴリズム」Narasimha Karumanchi著 黒川利明/木下哲也訳 オライリージャパン刊 p385 より # 'ある文字列から特定の文字列に含まれる文字を削除する'(_ある文字列,_特定の文字列,_特定の文字列に含まれる文字を削除した文字列) :- 文字選択された文字列(_ある文字列,_文字,\+(sub_atom(_特定の文字列,_,1,_,_文字)),_特定の文字列に含まれる文字を削除した文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字選択された文字列(_文字列,_構成する文字,_文字選択条件,_文字選択された文字列) :- findall(_構成する文字,( sub_atom(_文字列,_,1,_,_構成する文字), _文字選択条件), _文字選択された文字ならび), atomic_list_concat(_文字選択された文字ならび,_文字選択された文字列). % 以下のサイトは # # 問題 14-13 ある文字列から特定の文字列に含まれる文字を削除するアルゴリズムを示せ。 # # 入門「データ構造とアルゴリズム」Narasimha Karumanchi著 黒川利明/木下哲也訳 オライリージャパン刊 p385 より # 'ある文字列から特定の文字列に含まれる文字を削除する'(_ある文字列,_特定の文字列,_特定の文字列に含まれる文字を削除した文字列) :- findall(_文字,( ある文字列から(_ある文字列,_文字), \+(特定の文字列に含まれる文字(_特定の文字列,_文字))), _特定の文字列に含まれる文字を削除した文字ならび), atomic_list_concat(_特定の文字列に含まれる文字を削除した文字ならび,_特定の文字列に含まれる文字を削除した文字列). ある文字列から(_ある文字列,_文字) :- sub_atom(_ある文字列,_,1,_,_文字). 特定の文字列に含まれる文字を(_特定の文字列,_特定の文字列に含まれる文字) :- sub_atom(_特定の文字列,_,1,_,_特定の文字列に含まれる文字). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字選択された文字列(_文字列,_文字,_文字選択条件,_文字選択された文字列) :- findall(_文字,_文字選択条件,_文字選択された文字ならび), atomic_list_concat(_文字選択された文字ならび,_文字選択された文字列). % 以下のサイトは # # お題:テキストファイルを読み込み、その中で最もよく使われている単語ベスト3を表示するプログラム # 'テキストファイルを読み込み、その中で最もよく使われている単語ベスト3を表示する'(_テキストファイル) :- テキストファイルを読み込み(_テキストファイル,_文), 'その中で最もよく使われている単語ベスト3を表示する'(_文). テキストファイルを読み込み(_テキストファイル,_文) :- get_lines(_テキストファイル,_行ならび), atomic_list_concat(_行ならび,_文). 'その中で最もよく使われている単語ベスト3を表示する'(_文) :- 形態素解析(文,_文,_形態素ならび), 最もよく使われている単語ベスト3を(_形態素ならび,_最もよく使われている単語ベスト3), 表示する(_最もよく使われている単語ベスト3). その中で最もよく使われている単語ベスト3を(_形態素ならび,[_単語1,_単語2,_単語3]) :- setof(A,member(A,_形態素ならび),_単語ならぴ), findall([_度数,_単語],( member(_単語,_単語ならび), count(_単語,_形態素ならび,_度数)), LL), sort(LL,_整列したLL), append(_,[[_,_単語3],[_,_単語2],[_,_単語1]],_整列したLL). 表示する([_単語1,_単語2,_単語3]) :- writef('%t %t %t\n',[_単語1,_単語2,_単語3]). count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum_list(_値ならび,_合計値),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 形態素解析サーバー(mecab). 形態素解析([],[]) :-!. 形態素解析([['EOS'|_]|_],[]) :-!. 形態素解析([[A|_],[@,B|_]|R],[R1_1|R3]) :- 形態素解析_2(R,R1,R2), 形態素解析_2_重複削除([A,B|R1],[],R1_1), 形態素解析(R2,R3),!. 形態素解析([[A|_]|R],[B|R2]) :- 形態素解析サーバー(mecab), make_list(A,['\t'],AL), AL = [B|_], 形態素解析(R,R2),!. 形態素解析([[A|_]|R],[A|R2]) :- 形態素解析サーバー(juman), 形態素解析(R,R2),!. 形態素解析_2([],[],[]) :- !. 形態素解析_2([[A|R1]|R],[],[[A|R1]|R]) :- \+(A = (@)),!. 形態素解析_2([[@,A|_]|R],[A|R2],R3) :- 形態素解析_2(R,R2,R3),!. 形態素解析_2_重複削除([],L1,L) :- reverse(L1,L),!. 形態素解析_2_重複削除([A|R],Y,X) :- member(A,Y), 形態素解析_2_重複削除(R,Y,X),!. 形態素解析_2_重複削除([A|R],Y,X) :- \+(member(A,Y)), 形態素解析_2_重複削除(R,[A|Y],X). 形態素解析(ファイル,_テキストファイル,L) :- 形態素解析サーバー(_形態素解析サーバー), concat(['cat ',_テキストファイル,' | ',_形態素解析サーバー],S), sh(S,L1), 形態素解析(L1,L2), 形態素解析_3(L2,L). 形態素解析(文,S,L) :- tmpnam(_仮のファイル), tell(_仮のファイル), wr('%t',[S]), told, 形態素解析(ファイル,_仮のファイル,L) . 形態素解析_3([],[]). 形態素解析_3([A|R],[A|R2]) :- \+(list(A)), 形態素解析_3(R,R2) . 形態素解析_3([A|R],[B|R2]) :- list(A), member(B,A), 形態素解析_3(R,R2). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y) , split(V,[' ',','],U)), X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). tmpnam(TMPNAM) :- 乱数からTMPNAMを得る(TMPNAM),!. tmpnam(TMPNAM) :- tmpnam(TMPNAM). 乱数からTMPNAMを得る(TMPNAM) :- アルファベットに変換([_1,_2,_3,_4,_5,_6]), atomic_list_concat(['/tmp/file'|[_1,_2,_3,_4,_5,_6]],TMPNAM), \+(exists_file(TMPNAM)). アルファベットに変換([]). アルファベットに変換([A|R]) :- C is random(62), アルファベットに変換の二(C,A), アルファベットに変換(R). アルファベットに変換の二(N,A) :- '基数62のコード・アルファベットコード変換表'(S,E,B), between(S,E,N), C is N - S + B, char_code(A,C). '基数62のコード・アルファベットコード変換表'(0,9,48). '基数62のコード・アルファベットコード変換表'(10,35,65). '基数62のコード・アルファベットコード変換表'(36,60,97). % 以下のサイトは # # 読み順というか文字コード順でソートしているからこうなるので、 # 漢数字がいい感じで並ぶ順を定義して実装して使えばいい # 漢数字文字列の並べ替え(_漢数字文字列,_並べ直された漢数字文字列) :- いい感じで並ぶ順(_いい感じで並ぶ順), findall(_選択文字,( sub_atom(_いい感じで並ぶ順,_,1,_,_選択文字), sub_atom(_漢数字文字列,_,1,_,_選択文字)), _並べ直された漢数字文字ならび), atomic_list_concat(_並べ直された漢数字文字ならび,_並べ直された漢数字文字列). いい感じで並ぶ順(一二三四五六七八九). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数ならび'(_81以下の自然数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'([_],[_],_81以下の自然数ならび,_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数ならび'(_81以下の自然数ならび) :- findall(_数,between(1,81,_数),_81以下の自然数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'([_,_,_,_,_,_,_,_,_],[_,_,_,_,_,_,_,_,_,_],_81以下の自然数で九九に現れない数ならび,_81以下の自然数で九九に現れない数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_,_,_,_,_,_,_,_,_,_],L1,L) :- '81以下の自然数で九九に現れない数を昇順にすべて'([_|Ln1],[_],L1,L). '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,Ln2,L1,L) :- 九九に現れる数を削除(Ln1,Ln2,L1,L2), '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_|Ln2],L2,L). 九九に現れる数を削除(Ln1,Ln2,L1,L2) :- ならび掛け算(Ln1,Ln2,Ln3), length(Ln3,_九九に現れる数), 数をL1から削除してL2とする(_九九に現れる数,L1,L2),!. 九九に現れる数を削除(_,_,L,L). ならび掛け算(_,[],[]). ならび掛け算(L1,[B|R2],L) :- ならび掛け算(L1,R2,L2), append(L1,L2,L). 数をL1から削除してL2とする(_数,L1,L2) :- append(L0,[_数|R],L1), append(L0,R,L2). '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数ならび'(_81以下の自然数ならび), '81以下の自然数で九九に現れない数を'([_],[_],_81以下の自然数ならび,_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数ならび'(_81以下の自然数ならび) :- findall(_数,between(1,81,_数),_81以下の自然数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'([_,_,_,_,_,_,_,_,_],[_,_,_,_,_,_,_,_,_,_],_81以下の自然数で九九に現れない数ならび,_81以下の自然数で九九に現れない数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_,_,_,_,_,_,_,_,_,_],L1,L) :- '81以下の自然数で九九に現れない数を'([_|Ln1],[_],L1,L). '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,Ln2,L1,L) :- 九九に現れる数を削除(Ln1,Ln2,L1,L2), '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_|Ln2],L2,L). 九九に現れる数を削除(Ln1,Ln2,L1,L2) :- ならびの要素数表現を数表現に変換(Ln1,Ln2,_数_1,_数_2), _九九に現れる数 is _数_1 * _数_2, 数をL1から削除してL2とする(_九九に現れる数,L1,L2),!. 九九に現れる数を削除(_,_,L,L). ならびの要素数表現を数表現に変換(Ln1,Ln2,_数_1,_数_2) :- length(Ln1,_数_1), length(Ln2,_数_2). 数をL1から削除してL2とする(_数,L1,L2) :- append(L0,[_数|R],L1), append(L0,R,L2). '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数で九九に現れない数ならび) :- '81以下の自然数ならび'(_81以下の自然数ならび), 九九に現れる数ならび(_九九に現れる数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数ならび,_九九に現れる数ならび,_81以下の自然数で九九に現れない数ならび). '81以下の自然数ならび'(_81以下の自然数ならび) :- findall(_数,between(1,81,_数),_81以下の自然数ならび). 九九に現れる数ならび(_九九に現れる数ならび) :- findall(_九九,( 九九(_九九)), _九九に現れる数ならび). 九九(_九九) :- between(1,9,_数_1), between(1,9,_数_2), _九九 is _数_1 * _数_2. '81以下の自然数で九九に現れない数を昇順にすべて'([],_,[]) :- !. '81以下の自然数で九九に現れない数を昇順にすべて'([_数|R1],_九九に現れる数ならび,[_数|R3]) :- 九九に現れない数(_数,_九九に現れる数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'(R1,_九九に現れる数ならび,R3),!. '81以下の自然数で九九に現れない数を昇順にすべて'([_|R1],_九九に現れる数ならび,R3) :- '81以下の自然数で九九に現れない数を昇順にすべて'(R1,_九九に現れる数ならび,R3). 九九に現れない数(_数,_九九に現れる数ならび) :- \+(member(_数,_九九に現れる数ならび)). '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数ならび'(_81以下の自然数ならび), 九九に現れる数ならび(_九九に現れる数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数ならび,_九九に現れる数ならび,_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数ならび'(_81以下の自然数ならび) :- findall(_数,between(1,81,_数),_81以下の自然数ならび). 九九に現れる数ならび(_九九に現れる数ならび) :- findall(_九九,( 九九(_九九)), _九九に現れる数ならび). 九九(_九九) :- between(1,9,_数_1), between(1,9,_数_2), _九九 is _数_1 * _数_2. '81以下の自然数で九九に現れない数を昇順にすべて'([],_,[]) :- !. '81以下の自然数で九九に現れない数を昇順にすべて'([_数|R1],_九九に現れる数ならび,[_数|R3]) :- \+(member(_数,_九九に現れる数ならび)), '81以下の自然数で九九に現れない数を昇順にすべて'(R1,_九九に現れる数ならび,R3),!. '81以下の自然数で九九に現れない数を昇順にすべて'([_|R1],_九九に現れる数ならび,R3) :- '81以下の自然数で九九に現れない数を昇順にすべて'(R1,_九九に現れる数ならび,R3). '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- findall(N,between(1,81,N),L_1), '81以下の自然数で九九に現れない数を昇順ですべて'(1,1,L_1,L_2), '表示せよ。'(L_2). '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1,_,L,L) :- _n_1 > 9,!. '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1,_n_2,L_1,L) :- _n_2 > 9, _n_1_2 is _n_1 + 1, '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1_2,1,L_1,L). '81以下の自然数で九九に現れない数を昇順ですべて'(_n_1,_n_2,L_1,L_2) :- _n_3 is _n_1 * _n_2, 空白に置換(_n_3,L_1,L_2), _n_2_2 is _n_2 + 1, '81以下の自然数で九九に現れない数を'(_n_1,_n_2_2,L_3,L). 空白に置換(N,L_1,L_2) :- append(L0,[N|R],L_1), append(L0,[' '|R],L_2). 表示せよ(L) :- atomic_list_concat(L,_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数で九九に現れない数ならび) :- findall(_81以下の自然数,( '81以下の自然数で'(_81以下の自然数), 九九に現れない数(_81以下の自然数)),_81以下の自然数で九九に現れない数ならび). '81以下の自然数で'(_81以下の自然数) :- between(1,81,_81以下の自然数). 九九に現れない数(_81以下の自然数) :- \+(九九に現れる数(_81以下の自然数)). 九九に現れる数(_九九に現れる数) :- between(1,9,_数_1), between(1,9,_数_2), _九九に現れる数 is _数_1 * _数_2. '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは '多点交叉'(_親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,_整数_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), 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, 段の掛算(_n,M,R2,D,[M2|L3],L). 各桁の加算を表示する(_全段の数ならび) :- 全段を逆順に並べ直す(_全段の数ならび,_逆順の全段の数ならび), length(_全段の数ならび,Len), 各桁の加算を表示する(_逆順の全段の数ならび,0). 各桁の加算を表示する([],Len,S) :- findall(S,( between(1,Len,N), swritef(S,'(%t)',[N])), L), atomic_list_concat(L,'+',S1), writef('%t=%t\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). % 以下のサイトは # # お題:100以下の自然数でふたつの素数の積で表せる数を昇順にすべて表示せよ。 # '100以下の自然数でふたつの素数の積で表せる数を昇順にすべて表示せよ。' :- '100までの素数をエラトステネスの篩で求める'(_100までの素数ならび), '100以下の自然数でふたつの素数の積で表せる数を'(_100までの素数ならび,_ふたつの素数の積で表せる数ならび), '昇順にすべて表示せよ。'(_ふたつの素数の積で表せる数ならび). '100以下の自然数でふたつの素数の積で表せる数を'(_100までの素数ならび,_ふたつの素数の積で表せる数ならび) :- findall(_100までの自然数,( '100以下の自然数で'(_100以下の自然数), ふたつの素数の積で表せる数(_100までの自然数,_100までの素数ならび)), _ふたつの素数の積で表せる数ならび). '100以下の自然数で'(_100以下の自然数) :- between(1,100,_100以下の自然数). ふたつの素数の積で表せる数(_100以下の自然数,_100までの素数ならび) :- 組合せ(_100までの素数ならび,2,[_素数_1,_素数_2]), _100以下の自然数 is _素数_1 * _素数_2,!. '昇順にすべて表示せよ。'(_ふたつの素数の積で表せる数ならび) :- sort(_ふたつの素数の積で表せる数ならび,_整列したふたつの素数の積で表せる数ならび), atomic_list_concat(_整列したふたつの素数の積で表せる数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '100までの素数をエラトステネスの篩で求める'(_100までの素数ならび) :- findall(N,between(2,100,N),L), エラトステネスの篩(L,_100までの素数ならび). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). 組合せ(X,1,[A]) :- member(A,X). 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). % 以下のサイトは # # (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). % 以下のサイトは # # キーボードからNを入力し、Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を表示しなさい # 'キーボードからNを入力し、Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を表示しなさい' :- 'キーボードからNを入力し、'(_N), 'Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を表示しなさい'(_N). 'キーボードからNを入力し、'(_N) :- 整数を得る('N',_N > 2,_N). 'Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を計算して、表示しなさい'(_N) :- 'Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を計算して、'(_N,_式表示文字列,_Sum), 表示しなさい(_Sum,_式表示文字列). 'Sum = 1の4乗 + 2の4乗 + ... + Nの4乗 を計算して、'(_N,_式表示文字列,_Sum) :- '1の4乗 + 2の4乗 + ... + Nの4乗 を'(_N,_式文字列,_式表示文字列), 計算して(_式文字列,_Sum). '1の4乗 + 2の4乗 + ... + Nの4乗 を'(_N,_式文字列,_式表示文字列) :- findall([_4乗項文字列,_4乗表示文字列],( between(1,_M,_N), atomic_list_concat([_M,の4乗],_4乗表示文字列), atomic_list_concat([_M,' ^ ',4],_4乗項文字列)), LL), 式文字列と式表示文字列を分離(LL,_式文字列,_式表示文字列). 式文字列と式表示文字列を分離(LL,_式文字列,_式表示文字列) :- 転置(LL,[L1,L2]), atomic_list_concat(L1,' + ',_式文字列), atomic_list_concat(L2,' + ',_式表示文字列). 計算して(_式文字列,_Sum) :- atom_to_term(_式文字列,_式,_), _Sum is _式. 表示しなさい(_Sum,_式表示文字列) :- writef('%t = %t\n',[_Sum,_式文字列]). % 以下のサイトは # # キーボードからNを入力し、Sum = 14 + 24 + ... + N4 を表示しなさい # 'キーボードからNを入力し、Sum = 14 + 24 + ... + N4 を表示しなさい' :- 'キーボードからNを入力し、'(_N), 'Sum = 14 + 24 + ... + N4 を表示しなさい'(_N). 'キーボードからNを入力し、'(_N) :- 整数を得る('N',_N > 2,_N). 'Sum = 14 + 24 + ... + N4 を計算して、表示しなさい'(_N) :- 'Sum = 14 + 24 + ... + N4 を計算して、'(_N,_式文字列,_Sum), 表示しなさい(_Sum,_式文字列). 'Sum = 14 + 24 + ... + N4 を計算して、'(_N,_式文字列,_Sum) :- '14 + 24 + ... + N4 を'(_N,_式文字列), 計算して(_式文字列,_Sum). '14 + 24 + ... + N4 を'(_N,_式文字列) :- findall(_計算の対象となる整数,( between(1,_M,_N), _計算の対象となる整数 is 10 * _M + 4), _計算の対象となる整数ならび), atomic_list_concat(_計算の対象となる整数ならび,' + ',_式文字列). 計算して(_式文字列,_Sum) :- atom_to_term(_式文字列,_式,_), _Sum is _式. 表示しなさい(_Sum,_式文字列) :- writef('%t = %t\n',[_Sum,_式文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/744 # # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&amp;リンク): # 次の式を計算するプログラムを作れ。 # Sum = 14 + 24 + ... + N4 # (注意) ・ Nの値は、キーボードから入力できるようにすること。 #     ・scanfではなくgetcharを用いること # '次の式を計算するプログラムを作れ Sum = 14 + 24 + ... + N4 (注意) ・ Nの値は、キーボードから入力できるようにすること。     ・scanfではなくgetcharを用いること' :- 'Nの値は、キーボードから入力できるようにすること。・scanfではなくgetcharを用いること'(_N), 'Sum = 14 + 24 + ... + N4 の式を'(_N,L), 計算する(L,Sum), atomic_list_concat(L,' + ',S1), write('%t = %t\n',[Sum,S1]). 'Nの値は、キーボードから入力できるようにすること。・scanfではなくgetcharを用いること'(_N) :- write('整数N[3-9]を入力して下さい : '), get_line(Line), '診断 : Nの値はキーボードから入力'(Line,_N),!. 'Nの値は、キーボードから入力できるようにすること。・scanfではなくgetcharを用いること'(_N) :- 'Nの値は、キーボードから入力できるようにすること。・scanfではなくgetcharを用いること'(_N). '診断 : Nの値はキーボードから入力'(Line,_N) :- atom_number(Line,_N), integer(_N), _N > 2,!. '診断 : Nの値はキーボードから入力'(Line,_N) :- writef('入力された値%tは3以上9以下の整数ではありません。再入力をお願いします。\n',[Line]), fail. 'Sum = 14 + 24 + ... + N4 の式を'(_N,L) :- findall(_m_1,( between(1,_m,_N), _m_1 is _m * 10 + 4), L). 計算する(L,Sum) :- sum(L,Sum). sum([],0). sum([N|R],Sum) :- sum(R,Sum_1), Sum is Sum_1 + N. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/419 # # ●Regular Expressionの使用環境 # sakura editor # # ●検索か置換か? # 置換 # # ●説明 # xmlのtaxiwaypath要素のなかに # type="TAXI"と centerLineLighted="FALSE"が存在するときに、 他の属性を書き換えずにcenterLineLighted="TRUE"に書き換えたいです # # ●対象データ # <TaxiwayPath # type="TAXI" # … # centerLineLighted="FALSE" # … # /> # # ●希望する結果 # <TaxiwayPath # type="TAXI" # … # centerLineLighted="TRUE" # … # /> # # …は省略していると言う意味です # # ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" に置換する'(_文字列,_置換された文字列) :- sPLIT(_文字列,['>',' ','\n','\t'],_区切りを含む要素ならび), ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" にする'(R2,R2_2), atomic_list_concat(_置換された区切りを含む要素ならび,_置換された文字列),!. ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" に置換する'(_文字列,_文字列). ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" に置換する'(R2,_置換された区切りを含む要素ならび) :- append(L1,[''|R3],_区切りを含む要素ならび), \+(member('>',R2)), member('type="TAXI"',R2), ならびの置換(R2,'centerLineLighted="FALSE"','centerLineLighted="TRUE"',R2_2), append(L1,[''|R3],_置換された区切りを含む要素ならび),!. % 以下のサイトは ある文字数以上の単語をすべて抽出する(_ある文字数以上の単語ならび) :- 形態素解析(_文字列,_形態素ならび), 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],_変換された文字列). % 以下のサイトは # # 単純な置換 s/_a/_b/ # 's/a/b/'(_文字列,_置換された文字列) :- 's/_a/_b/'(_文字列,a,b,_置換された文字列). 's/_a/_b/'(_文字列,_a,_b,_置換された文字列) :- 単純な文字列置換(_文字列,_a,_b,_置換された文字列). 単純な文字列置換(_文字列,_a,_b,_置換された文字列) :- '_aを決定性に探索する'(_文字列,_a,_b,_前文字列,_後文字列), 単純な文字列置換(_a,_b,_前文字列,_後文字列,_置換された文字列). 単純な文字列置換(_a,_b,_前文字列,_後文字列,_置換された文字列) :- atomic_list_concat([_前文字列,_b,_後文字列],_置換された文字列). 単純な文字列置換(_a,_b,_前文字列,_後文字列,_置換された文字列) :- 単純な文字列置換(_後文字列,_a,_b,_置換された文字列_2), atomic_list_concat([_前文字列,_b,_置換された文字列_2],_置換された文字列). '_aを決定性に探索する'(_文字列,_a,_b,_前文字列,_後文字列) :- sub_atom(_文字列,S,Len,R,_a), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/397 # # 質問です # # ●正規表現の使用環境 # PHP5.3.3 # # ●検索か置換か? # 置換 # # ●説明 # ・URLが含まれていたときに、jpg,png,gifならimgタグへ変換。 # ・それ以外ならaタグへ変換。 # ・URLに日本語が含まれていた場合も、スペースや改行、文字列の終端にくるまでのものも上記のようにリンク化 # # ●対象データ # [1] こちらへ→http://ime.nu/example.com/index.html # [2] 写真はこれです→https://example.com/写真.jpg # # ●希望する結果 # [1] こちらへ→<a href="http://ime.nu/example.com/index.html">http://example.com/index.html</a> # [2] 写真はこれです→<img src="https://example.com/写真.jpg" /> # # '・URLが含まれていたときに、jpg,png,gifならimgタグへ変換。 ・それ以外ならaタグへ変換。 '(_文字列,_imgタグ) :- 'URL部分の切り出し'(_文字列,_前文字列,_URL部分文字列,_後文字列), 'jpg,png,gifならimgタグへ変換。'(_前文字列,_URL部分文字列,_後文字列,_imgタグ),!. '・URLが含まれていたときに、jpg,png,gifならimgタグへ変換。 ・それ以外ならaタグへ変換。 '(_文字列,_imgタグ) :- 'URL部分の切り出し'(_文字列,_前文字列,_URL部分文字列,_後文字列), 'それ以外ならaタグへ変換'(_前文字列,_URL部分文字列,_後文字列,_imgタグ). 'jpg,png,gifならimgタグへ変換。'(_前文字列,_URL部分文字列,_後文字列,_imgタグ) :- 'jpg,png,gifなら'(_URL部分文字列), 'imgタグへ変換。'(_前文字列,_URL部分文字列,_後文字列,_imgタグ). 'jpg,png,gifなら'(_URL部分文字列) :- sub_atom(_URL部分文字列,_,4,0,_サフィックス部分文字列), member(_サフィックス部分文字列,['.jpg','.png','.gif']). 'imgタグへ変換。'(_前文字列,_URL部分文字列,_後文字列,_imgタグ) :- atomic_list_concat([_前文字列,'',_後文字列],_imgタグ). 'それ以外ならaタグへ変換'(_前文字列,_URL部分文字列,_後文字列,_aタグ) :- 'それ以外なら'(_URL部分文字列), 'aタグへ変換'(_前文字列,_URL部分文字列,_後文字列,_aタグ). 'それ以外なら'(_URL部分文字列) :- sub_atom(_URL部分文字列,_,4,0,_サフィックス部分文字列), \+(member(_サフィックス部分文字列,['.jpg','.png','.gif'])). 'aタグへ変換'(_前文字列,_URL部分文字列,_後文字列,_aタグ) :- atomic_list_concat([_前文字列,'',_URL部分文字列,'',_後文字列],_aタグ). 'URL部分の切り出し'(_文字列,_前文字列,_URL部分文字列,_後文字列) :- sub_atom(_文字列,S,Len,R,A), member(A,['http://','file://','ftp://']), S_2 is S + Len, 'URL部分の切り出し'(_文字列,S,S_2,_前文字列,_URL部分文字列,_後文字列). 'URL部分の切り出し'(_文字列,S,S_2,_前文字列,_URL部分文字列,_後文字列) :- sub_atom(_文字列,S_2,_,0,_副文字列), 区切り文字で分割(_副文字列,_URL部分文字列,_後文字列), sub_atom(_文字列,0,S,_,_前文字列),!. 区切り文字で分割(_副文字列,_URL部分文字列,_後文字列) :- sub_atom(_副文字列,S,1,R,_文字), member(_文字,[' ','\t','\n']), sub_atom(_副文字列,0,S,R,_URL部分文字列), sub_atom(_副文字列,_,R,0,_後文字列),!. 区切り文字で分割(_URL部分文字列,_URL部分文字列,''). % 以下のサイトは # 出典:: 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/tech/1370255305/160 # # [1] 授業単元:サンシバへの挑戦状 # [2] 問題文:入力された正の整数を漢数字に変換するプログラムを作れ(123→百二十三)。 # '正の整数を漢数字に変換する'(_正の整数,_漢数字) :- 漢数字単位桁表現(_正の整数,_漢数字_1,_漢数字単位,_桁の商,_桁の剰余), '正の整数を漢数字に変換する'(_桁の商,_漢数字_1), '正の整数を漢数字に変換する'(_桁の剰余,_漢数字_2), 漢数字を構成する(_漢数字_1,_漢数字単位,_漢数字_2,_漢数字). '正の整数を漢数字に変換する'(_正の整数,_漢数字) :- 漢数字アラビア数字対応(_漢数字,_正の整数). 漢数字アラビア数字対応('',0). 漢数字アラビア数字対応('一',1). 漢数字アラビア数字対応('二',2). 漢数字アラビア数字対応('三',3). 漢数字アラビア数字対応('四',4). 漢数字アラビア数字対応('五',5). 漢数字アラビア数字対応('六',6). 漢数字アラビア数字対応('七',7). 漢数字アラビア数字対応('八',8). 漢数字アラビア数字対応('九',9). 漢数字アラビア数字単位(億,100000000). 漢数字アラビア数字単位(万,10000). 漢数字アラビア数字単位(千,1000). 漢数字アラビア数字単位(百,100). 漢数字アラビア数字単位(十,10). 漢数字単位桁表現(_正の整数,_漢数字_1,_漢数字単位,_桁の商,_桁の剰余) :- 漢数字アラビア数字単位(_漢数字単位,_単位数), _桁の商 is _正の整数 // _単位数, _桁の商 > 0, _桁の剰余 is _正の整数 mod _単位数,!. 漢数字を構成する(一,百,_漢数字_2,_漢数字) :- atomic_list_concat([百,_漢数字_2],_漢数字),!. 漢数字を構成する(一,十,_漢数字_2,_漢数字) :- atomic_list_concat([十,_漢数字_2],_漢数字),!. 漢数字を構成する(_漢数字_1,_漢数字単位,_漢数字_2,_漢数字) :- atomic_list_concat([_漢数字_1,_漢数字単位,_漢数字_2],_漢数字),!. % 以下のサイトは # 出典:: 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]). % 以下のサイトは 検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列) :- 重い検索(_検索文字列,_文字列,_前文字列_1,_検索情報_1,_後文字列_1), 投機的検索(_検索文字列,_文字列,_前文字列_1,_検索情報_1,_後文字列_1,_前文字列,_検索情報,_後文字列). 検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列,_前文字列,_検索情報,_後文字列). 検索(_検索文字列,_文字列,_前文字列_1,_検索情報_1,_後文字列_1,_前文字列,_検索情報,_後文字列) :- 検索(_検索文字列,_後文字列_1,_前文字列_2,_検索情報,_後文字列), atomic_list_concat([_前文字列_1,_検索文字列,_前文字列_2],_前文字列). 重い検索(_検索文字列,_文字列,_前文字列,[_度数1,_度数2],_後文字列) :- sub_atom(_文字列,S,_,R,_検索文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列), count(sub_atom(_前文字列,_,_,_,'http://'),_度数1), count(sub_atom(_後文字列,_,_,_,'http://'),_度数2),!. % 以下のサイトは 投機的検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列) :- 重い検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列). 投機的検索(_検索文字列,_文字列,_前文字列,_検索情報,_後文字列) :- 重い検索(_検索文字列,_文字列,_前文字列_1,_検索情報,_後文字列_1), 投機的検索(_検索文字列,_後文字列_1,_前文字列_2,_検索情報,_後文字列), atomic_list_concat([_前文字列_1,_検索文字列,_前文字列_2],_前文字列). 重い検索(_検索文字列,_文字列,_前文字列,[_度数1,_度数2],_後文字列) :- sub_atom(_文字列,S,_,R,_検索文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列), count(sub_atom(_前文字列,_,_,_,'http://'),_度数1), count(sub_atom(_後文字列,_,_,_,'http://'),_度数2),!. % 以下のサイトは 'Prologでジェネレータを書いてみる'(_文字列1,_文字列2,_文字列3,_生成文字列) :- sub_atom(_文字列1,_,1,_,_文字1), sub_atom(_文字列2,_,1,_,_文字2), sub_atom(_文字列3,_,1,_,_文字3), atomic_list_concat([_文字1,_文字2,_文字3],_生成文字列). % 以下のサイトは 'Prologでジェネレータを書いてみる'([_文字列1,_文字列2,_文字列3],_生成文字列) :- sub_atom(_文字列1,_,1,_,_文字1), sub_atom(_文字列2,_,1,_,_文字2), sub_atom(_文字列3,_,1,_,_文字3), atomic_list_concat([_文字1,_文字2,_文字3],_生成文字列). % 以下のサイトは 'Prologでジェネレータを書いてみる'(L,_生成文字列) :- findall(sub_atom(_文字列,_,1,_,_文字),( member(_文字列,L)), L1), ならび連言項変換(L1,P), call(P), sub_atomの解を結合する(L1,_生成文字列). ならび連言項変換([_項の一|_残りならび],_連言項) :- _連言項 =.. [',',_項の一,_連言項の二], ならび連言項変換(_残りならび,_連言項の二),!. ならび連言項変換([_項],_項) :- !. sub_atomの解を結合する(L1,_生成文字列) :- findall(A,( member(sub_atom(_,_,_,_,A),L1)), L), atomic_list_concat(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だけで表現するという主題がある。 % % 以下のサイトは # phpなんですが # enarikazukiって文字列にマッチするのを作りたいんですが # testenarikazukwwww→i○ # #enarikazuki→× # enarikazukiって→○ # enarikazuki→○ # みたいに前後に何がついてもいいんですが、前に#がついた場合のみ # マッチしないようにするってのはどうすりゃいいんでしょうか? # 'enarikazukiって文字列にマッチするのを作りたいんですが testenarikazukwwww→i○ #enarikazuki→× enarikazukiって→○ enarikazuki→○ みたいに前後に何がついてもいいんですが、前に#がついた場合のみ マッチしないようにするってのはどうすりゃいいんでしょうか?'(_文字列,_前文字列,_適合文字列,_後文字列) :- 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_文字列,_前文字列,_適合文字列,_後文字列). 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列_1,enarikazuki,_後文字列_1,L1,L2,L3), \+(last(L1,#)), 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_前文字列_1,enarikazuki,_後文字列_1,_前文字列,_適合文字列,_後文字列). 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_前文字列,enarikazuki,_後文字列,_前文字列,enarikazuki,_後文字列). 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_前文字列_1,enarikazuki,_後文字列_1,_前文字列,enarikazuki,_後文字列) :- 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_後文字列,_前文字列_2,enarikazuki,_後文字列), atomic_list_concat([_前文字列_1,erarikazuki,_前文字列_2],_前文字列). % 以下のサイトは # ●問題文 # <b>タグのように開始タグの部分にマッチする正規表現を最小限の階数のキャプチャを用いて書きなさい。 # タグ名は1文字以上の英単語であり、属性には「>」以外の任意の文字を使えるものとする。 # ●例文 # <b>ゴレイヌさん</b>は、えげつねぇ・・・<font color="red">ゴレイヌさん</font>は # えげつねぇ。。。<font color="blue">富樫仕事</font>しろ。 # ●マッチする例 # <b> # <font color="red"> # <font color="blue"> # # ●答え # <(?:\w+)(?:\s+[^>]*)*> # ●解説 # 「<」と「>」に囲まれた部分にマッチさせればよいのですが、属性付きのタグを考慮しなくてはいけません。 # また、最小限のキャプチャという条件があるため、グループ化のみでキャプチャを必要としない場所では「(?:)」を使います。 # この問題の場合には、1回もキャプチャを使わずに記述する事が可能です。 # # と、あるのですが # <\w+(?:\s+[^>]*)*> # でないかと思っています。 # \w+はグループ化する必要がそもそもあるのでしょうか? # '<b>タグのように開始タグの部分にマッチする'(_文字列,_前文字列,_開始タグ,_後文字列) :- 開始タグを切り出す(_文字列,_前文字列_1,_開始タグ_1,_後文字列_1), 開始タグ名は1文字以上の英単語であり(_開始タグ_1), '<b>タグのように開始タグの部分にマッチする'(_前文字列_1,_開始タグ_1,_後文字列_1,_前文字列,_開始タグ,_後文字列). '<b>タグのように開始タグの部分にマッチする'(_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). '<b>タグのように開始タグの部分にマッチする'(_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- '<b>タグのように開始タグの部分にマッチする'(_後文字列_1,_前文字列_2,_適合文字列,_後文字列), atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). 開始タグを切り出す(_前文字列,_開始タグ,_後文字列) :- sub_atom(_文字列,St,Len,R,_開始タグ), 開始タグ(_開始タグ), sub_atom(_文字列,0,St,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. 開始タグ(_開始タグ) :- sub_atom(_開始タグ,0,1,_,<), \+(sub_atom(_開始タグ,0,2,_,'). '開始タグの情報部分は>を含まない'(_開始タグ) :- sub_atom(_開始タグ,1,_,1,_開始タグの情報部分), \+(sub_atom(_開始タグの情報部分,_,1,_,>)),!. 開始タグ名は1文字以上の英単語であり(_開始タグ) :- 開始タグ名は(_開始タグ,_開始タグ名), '1文字以上の英単語である'(_開始タグ名),!. 開始タグ名は(_開始タグ,_開始タグ名) :- sub_atom(_開始タグ,1,_,1,_開始タグの情報部分), 開始タグ名を切り出す(_開始タグの情報部分,_開始タグ名),!. 開始タグ名を切り出す(_開始タグの情報部分,_開始タグ名) :- sub_atom(_開始タグの情報部分,St,1,_,' '), sub_atom(_開始タグの情報部分,0,St,_,_開始タグ名),!. 開始タグ名を切り出す(_開始タグ名,_開始タグ名). '1文字以上の英単語である'(_タグ名の文字ならび) :- forall(sub_atom(_開始タグ名,_,1,_,A),英文字か数字(A)). 英文字か数字(A) :- 英文字(A). 英文字か数字(A) :- 数字(A). 英文字(A) :- A @>= 'a', A @=< 'z',!. 英文字(A) :- A @>= 'A', A @=< 'Z',!. 数字(A) :- A @>= '0', A @=< '9',!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/764 # # 【質問テンプレ】 # ・DBMS名とバージョン # SQLiteバージョン3 # # ・テーブルデータ # ドメインID,ドメイン名 # ------------ # 1,test1.co.jp # 2,test2.co.jp # # ・欲しい結果 # "server1.test1.co.jp"という入力に対し # "test1.co.jp"のドメインIDである1 # # ・説明 # 自分のサイトへのアクセスを行うドメインを管理しています。 # "server1.test1.co.jp"や、"server2.test1.co.jp"等、第4レベルだけが違う同じ業者からのアクセスがあります。 # それらを"test1.co.jp"からのアクセスであると判断し、ドメインIDである1を取得したいのです。 # # 以上、宜しくお願いします。 '・DBMS名とバージョン SQLiteバージョン3 ・テーブルデータ ドメインID,ドメイン名 ------------ 1,test1.co.jp 2,test2.co.jp ・欲しい結果 "server1.test1.co.jp"という入力に対し "test1.co.jp"のドメインIDである1 ・説明 自分のサイトへのアクセスを行うドメインを管理しています。 "server1.test1.co.jp"や、"server2.test1.co.jp"等、第4レベルだけが違う同じ業者からのアクセスがあります。 それらを"test1.co.jp"からのアクセスであると判断し、ドメインIDである1を取得したいのです。'(_URL,_第三レベルドメイン名,_ドメインID) :- 第三ドメイン名を取得する(_URL,_第三レベルドメイン名), ドメインIDを取り出す(_第三レベルドメイン名,_ドメインID). 第三ドメイン名を取得する(_URL,_第三レベルドメイン名) :- split(_URL,['/','ftp://','file:///','http://','mailto://'],[A|_]), '第二・第一レベルドメインを切り捨てる'(A,C), split(C,['.'],L). last(L,_第三レベルドメイン名),!. '第二・第一レベルドメインを切り捨てる'(A,C) :- '第二・第一レベルドメイン'(A), sub_atom(A,St,Len,0,B), sub_atom(A,0,St,Len,C),!. ドメインIDを取り出す(_第三レベルドメイン名,_ドメインID) :- atom_chars(_第三レベルドメイン名,Chars), append(L1,L2,Chars), forall(member(E,L2),数字(E)), atomic_list_concat(L2,_ドメインID),!. 数字(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']). '第二・第一レベルドメイン'(a). '第二・第一レベルドメイン'(ab). '第二・第一レベルドメイン'(abo). '第二・第一レベルドメイン'(abog). '第二・第一レベルドメイン'(aboga). '第二・第一レベルドメイン'(abogad). '第二・第一レベルドメイン'(abogado). '第二・第一レベルドメイン'(ac). '第二・第一レベルドメイン'(ad). '第二・第一レベルドメイン'(adu). '第二・第一レベルドメイン'(adul). '第二・第一レベルドメイン'(adult). '第二・第一レベルドメイン'(ae). '第二・第一レベルドメイン'(aer). '第二・第一レベルドメイン'(aero). '第二・第一レベルドメイン'(af). '第二・第一レベルドメイン'(afr). '第二・第一レベルドメイン'(afri). '第二・第一レベルドメイン'(afric). '第二・第一レベルドメイン'(africa). '第二・第一レベルドメイン'(ag). '第二・第一レベルドメイン'(ai). '第二・第一レベルドメイン'(al). '第二・第一レベルドメイン'(am). '第二・第一レベルドメイン'(ams). '第二・第一レベルドメイン'(amst). '第二・第一レベルドメイン'(amste). '第二・第一レベルドメイン'(amster). '第二・第一レベルドメイン'(amsterd). '第二・第一レベルドメイン'(amsterda). '第二・第一レベルドメイン'(amsterdam). '第二・第一レベルドメイン'(ap). '第二・第一レベルドメイン'(app). '第二・第一レベルドメイン'(as). '第二・第一レベルドメイン'(asi). '第二・第一レベルドメイン'(asia). '第二・第一レベルドメイン'(at). '第二・第一レベルドメイン'(au). '第二・第一レベルドメイン'(auc). '第二・第一レベルドメイン'(auct). '第二・第一レベルドメイン'(aucti). '第二・第一レベルドメイン'(auctio). '第二・第一レベルドメイン'(auction). '第二・第一レベルドメイン'(ax). '第二・第一レベルドメイン'(az). '第二・第一レベルドメイン'(b). '第二・第一レベルドメイン'(ba). '第二・第一レベルドメイン'(bab). '第二・第一レベルドメイン'(baby). '第二・第一レベルドメイン'(ban). '第二・第一レベルドメイン'(bank). '第二・第一レベルドメイン'(bar). '第二・第一レベルドメイン'(barc). '第二・第一レベルドメイン'(barce). '第二・第一レベルドメイン'(barcel). '第二・第一レベルドメイン'(barcelo). '第二・第一レベルドメイン'(barcelon). '第二・第一レベルドメイン'(barcelona). '第二・第一レベルドメイン'(bb). '第二・第一レベルドメイン'(be). '第二・第一レベルドメイン'(bee). '第二・第一レベルドメイン'(beer). '第二・第一レベルドメイン'(ber). '第二・第一レベルドメイン'(berl). '第二・第一レベルドメイン'(berli). '第二・第一レベルドメイン'(berlin). '第二・第一レベルドメイン'(bg). '第二・第一レベルドメイン'(bi). '第二・第一レベルドメイン'(bik). '第二・第一レベルドメイン'(bike). '第二・第一レベルドメイン'(biz). '第二・第一レベルドメイン'(bj). '第二・第一レベルドメイン'(bl). '第二・第一レベルドメイン'(blo). '第二・第一レベルドメイン'(blog). '第二・第一レベルドメイン'(bm). '第二・第一レベルドメイン'(bo). '第二・第一レベルドメイン'(boo). '第二・第一レベルドメイン'(book). '第二・第一レベルドメイン'(booki). '第二・第一レベルドメイン'(bookin). '第二・第一レベルドメイン'(booking). '第二・第一レベルドメイン'(bos). '第二・第一レベルドメイン'(bost). '第二・第一レベルドメイン'(bosto). '第二・第一レベルドメイン'(boston). '第二・第一レベルドメイン'(br). '第二・第一レベルドメイン'(bru). '第二・第一レベルドメイン'(brus). '第二・第一レベルドメイン'(bruss). '第二・第一レベルドメイン'(brusse). '第二・第一レベルドメイン'(brussel). '第二・第一レベルドメイン'(brussels). '第二・第一レベルドメイン'(bs). '第二・第一レベルドメイン'(bu). '第二・第一レベルドメイン'(bud). '第二・第一レベルドメイン'(buda). '第二・第一レベルドメイン'(budap). '第二・第一レベルドメイン'(budape). '第二・第一レベルドメイン'(budapes). '第二・第一レベルドメイン'(budapest). '第二・第一レベルドメイン'(by). '第二・第一レベルドメイン'(bz). '第二・第一レベルドメイン'(c). '第二・第一レベルドメイン'(ca). '第二・第一レベルドメイン'(cap). '第二・第一レベルドメイン'(cape). '第二・第一レベルドメイン'(capet). '第二・第一レベルドメイン'(capeto). '第二・第一レベルドメイン'(capetow). '第二・第一レベルドメイン'(capetown). '第二・第一レベルドメイン'(car). '第二・第一レベルドメイン'(care). '第二・第一レベルドメイン'(caree). '第二・第一レベルドメイン'(career). '第二・第一レベルドメイン'(cas). '第二・第一レベルドメイン'(cash). '第二・第一レベルドメイン'(cat). '第二・第一レベルドメイン'(cc). '第二・第一レベルドメイン'(cd). '第二・第一レベルドメイン'(cf). '第二・第一レベルドメイン'(cg). '第二・第一レベルドメイン'(ch). '第二・第一レベルドメイン'(chr). '第二・第一レベルドメイン'(chri). '第二・第一レベルドメイン'(chris). '第二・第一レベルドメイン'(christ). '第二・第一レベルドメイン'(christm). '第二・第一レベルドメイン'(christma). '第二・第一レベルドメイン'(christmas). '第二・第一レベルドメイン'(ci). '第二・第一レベルドメイン'(cl). '第二・第一レベルドメイン'(cli). '第二・第一レベルドメイン'(clic). '第二・第一レベルドメイン'(click). '第二・第一レベルドメイン'(cm). '第二・第一レベルドメイン'(cn). '第二・第一レベルドメイン'(co). '第二・第一レベルドメイン'('co.'). '第二・第一レベルドメイン'('co.a'). '第二・第一レベルドメイン'('co.ao'). '第二・第一レベルドメイン'('co.at'). '第二・第一レベルドメイン'('co.b'). '第二・第一レベルドメイン'('co.bw'). '第二・第一レベルドメイン'('co.c'). '第二・第一レベルドメイン'('co.ck'). '第二・第一レベルドメイン'('co.cm'). '第二・第一レベルドメイン'('co.cr'). '第二・第一レベルドメイン'('co.f'). '第二・第一レベルドメイン'('co.fk'). '第二・第一レベルドメイン'('co.h'). '第二・第一レベルドメイン'('co.hu'). '第二・第一レベルドメイン'('co.i'). '第二・第一レベルドメイン'('co.id'). '第二・第一レベルドメイン'('co.il'). '第二・第一レベルドメイン'('co.in'). '第二・第一レベルドメイン'('co.ir'). '第二・第一レベルドメイン'('co.j'). '第二・第一レベルドメイン'('co.jp'). '第二・第一レベルドメイン'('co.k'). '第二・第一レベルドメイン'('co.ke'). '第二・第一レベルドメイン'('co.kr'). '第二・第一レベルドメイン'('co.l'). '第二・第一レベルドメイン'('co.ls'). '第二・第一レベルドメイン'('co.m'). '第二・第一レベルドメイン'('co.mz'). '第二・第一レベルドメイン'('co.n'). '第二・第一レベルドメイン'('co.nl'). '第二・第一レベルドメイン'('co.no'). '第二・第一レベルドメイン'('co.nz'). '第二・第一レベルドメイン'('co.r'). '第二・第一レベルドメイン'('co.rs'). '第二・第一レベルドメイン'('co.t'). '第二・第一レベルドメイン'('co.th'). '第二・第一レベルドメイン'('co.tt'). '第二・第一レベルドメイン'('co.tz'). '第二・第一レベルドメイン'('co.u'). '第二・第一レベルドメイン'('co.ug'). '第二・第一レベルドメイン'('co.uk'). '第二・第一レベルドメイン'('co.z'). '第二・第一レベルドメイン'('co.za'). '第二・第一レベルドメイン'('co.zw'). '第二・第一レベルドメイン'(cof). '第二・第一レベルドメイン'(coff). '第二・第一レベルドメイン'(coffe). '第二・第一レベルドメイン'(coffee). '第二・第一レベルドメイン'(com). '第二・第一レベルドメイン'('com.'). '第二・第一レベルドメイン'('com.a'). '第二・第一レベルドメイン'('com.ag'). '第二・第一レベルドメイン'('com.ai'). '第二・第一レベルドメイン'('com.al'). '第二・第一レベルドメイン'('com.an'). '第二・第一レベルドメイン'('com.ar'). '第二・第一レベルドメイン'('com.au'). '第二・第一レベルドメイン'('com.aw'). '第二・第一レベルドメイン'('com.az'). '第二・第一レベルドメイン'('com.b'). '第二・第一レベルドメイン'('com.bd'). '第二・第一レベルドメイン'('com.bh'). '第二・第一レベルドメイン'('com.bn'). '第二・第一レベルドメイン'('com.bo'). '第二・第一レベルドメイン'('com.br'). '第二・第一レベルドメイン'('com.bs'). '第二・第一レベルドメイン'('com.bt'). '第二・第一レベルドメイン'('com.c'). '第二・第一レベルドメイン'('com.cm'). '第二・第一レベルドメイン'('com.cn'). '第二・第一レベルドメイン'('com.co'). '第二・第一レベルドメイン'('com.cy'). '第二・第一レベルドメイン'('com.d'). '第二・第一レベルドメイン'('com.de'). '第二・第一レベルドメイン'('com.dz'). '第二・第一レベルドメイン'('com.e'). '第二・第一レベルドメイン'('com.ec'). '第二・第一レベルドメイン'('com.eg'). '第二・第一レベルドメイン'('com.es'). '第二・第一レベルドメイン'('com.et'). '第二・第一レベルドメイン'('com.f'). '第二・第一レベルドメイン'('com.fj'). '第二・第一レベルドメイン'('com.g'). '第二・第一レベルドメイン'('com.ge'). '第二・第一レベルドメイン'('com.gh'). '第二・第一レベルドメイン'('com.gi'). '第二・第一レベルドメイン'('com.gl'). '第二・第一レベルドメイン'('com.gn'). '第二・第一レベルドメイン'('com.gr'). '第二・第一レベルドメイン'('com.gt'). '第二・第一レベルドメイン'('com.gu'). '第二・第一レベルドメイン'('com.h'). '第二・第一レベルドメイン'('com.hk'). '第二・第一レベルドメイン'('com.hr'). '第二・第一レベルドメイン'('com.j'). '第二・第一レベルドメイン'('com.jm'). '第二・第一レベルドメイン'('com.jo'). '第二・第一レベルドメイン'('com.k'). '第二・第一レベルドメイン'('com.kh'). '第二・第一レベルドメイン'('com.kw'). '第二・第一レベルドメイン'('com.l'). '第二・第一レベルドメイン'('com.lb'). '第二・第一レベルドメイン'('com.lr'). '第二・第一レベルドメイン'('com.lv'). '第二・第一レベルドメイン'('com.ly'). '第二・第一レベルドメイン'('com.m'). '第二・第一レベルドメイン'('com.mg'). '第二・第一レベルドメイン'('com.mk'). '第二・第一レベルドメイン'('com.mo'). '第二・第一レベルドメイン'('com.mt'). '第二・第一レベルドメイン'('com.mx'). '第二・第一レベルドメイン'('com.my'). '第二・第一レベルドメイン'('com.n'). '第二・第一レベルドメイン'('com.na'). '第二・第一レベルドメイン'('com.ng'). '第二・第一レベルドメイン'('com.ni'). '第二・第一レベルドメイン'('com.np'). '第二・第一レベルドメイン'('com.o'). '第二・第一レベルドメイン'('com.om'). '第二・第一レベルドメイン'('com.p'). '第二・第一レベルドメイン'('com.pa'). '第二・第一レベルドメイン'('com.pe'). '第二・第一レベルドメイン'('com.ph'). '第二・第一レベルドメイン'('com.pk'). '第二・第一レベルドメイン'('com.pl'). '第二・第一レベルドメイン'('com.pr'). '第二・第一レベルドメイン'('com.pt'). '第二・第一レベルドメイン'('com.py'). '第二・第一レベルドメイン'('com.q'). '第二・第一レベルドメイン'('com.qa'). '第二・第一レベルドメイン'('com.r'). '第二・第一レベルドメイン'('com.ro'). '第二・第一レベルドメイン'('com.s'). '第二・第一レベルドメイン'('com.sg'). '第二・第一レベルドメイン'('com.sn'). '第二・第一レベルドメイン'('com.sv'). '第二・第一レベルドメイン'('com.sy'). '第二・第一レベルドメイン'('com.t'). '第二・第一レベルドメイン'('com.tn'). '第二・第一レベルドメイン'('com.tr'). '第二・第一レベルドメイン'('com.tw'). '第二・第一レベルドメイン'('com.u'). '第二・第一レベルドメイン'('com.ua'). '第二・第一レベルドメイン'('com.uy'). '第二・第一レベルドメイン'('com.v'). '第二・第一レベルドメイン'('com.ve'). '第二・第一レベルドメイン'('com.vn'). '第二・第一レベルドメイン'(con). '第二・第一レベルドメイン'(cond). '第二・第一レベルドメイン'(condo). '第二・第一レベルドメイン'(condos). '第二・第一レベルドメイン'(cons). '第二・第一レベルドメイン'(consu). '第二・第一レベルドメイン'(consul). '第二・第一レベルドメイン'(consult). '第二・第一レベルドメイン'(consulti). '第二・第一レベルドメイン'(consultin). '第二・第一レベルドメイン'(consulting). '第二・第一レベルドメイン'(coo). '第二・第一レベルドメイン'(coop). '第二・第一レベルドメイン'(cor). '第二・第一レベルドメイン'(cors). '第二・第一レベルドメイン'(corsi). '第二・第一レベルドメイン'(corsic). '第二・第一レベルドメイン'(corsica). '第二・第一レベルドメイン'(cr). '第二・第一レベルドメイン'(cre). '第二・第一レベルドメイン'(cred). '第二・第一レベルドメイン'(credi). '第二・第一レベルドメイン'(credit). '第二・第一レベルドメイン'(cu). '第二・第一レベルドメイン'(cv). '第二・第一レベルドメイン'(cw). '第二・第一レベルドメイン'(cx). '第二・第一レベルドメイン'(cy). '第二・第一レベルドメイン'(cym). '第二・第一レベルドメイン'(cymr). '第二・第一レベルドメイン'(cymru). '第二・第一レベルドメイン'(cz). '第二・第一レベルドメイン'(d). '第二・第一レベルドメイン'(de). '第二・第一レベルドメイン'('de.'). '第二・第一レベルドメイン'('de.c'). '第二・第一レベルドメイン'('de.co'). '第二・第一レベルドメイン'('de.com'). '第二・第一レベルドメイン'(den). '第二・第一レベルドメイン'(dent). '第二・第一レベルドメイン'(denta). '第二・第一レベルドメイン'(dental). '第二・第一レベルドメイン'(dj). '第二・第一レベルドメイン'(dk). '第二・第一レベルドメイン'(dm). '第二・第一レベルドメイン'(do). '第二・第一レベルドメイン'(dow). '第二・第一レベルドメイン'(down). '第二・第一レベルドメイン'(downl). '第二・第一レベルドメイン'(downlo). '第二・第一レベルドメイン'(downloa). '第二・第一レベルドメイン'(download). '第二・第一レベルドメイン'(du). '第二・第一レベルドメイン'(dub). '第二・第一レベルドメイン'(duba). '第二・第一レベルドメイン'(dubai). '第二・第一レベルドメイン'(dz). '第二・第一レベルドメイン'(e). '第二・第一レベルドメイン'(ec). '第二・第一レベルドメイン'(eco). '第二・第一レベルドメイン'(ed). '第二・第一レベルドメイン'(edu). '第二・第一レベルドメイン'(ee). '第二・第一レベルドメイン'(eg). '第二・第一レベルドメイン'(em). '第二・第一レベルドメイン'(ema). '第二・第一レベルドメイン'(emar). '第二・第一レベルドメイン'(emara). '第二・第一レベルドメイン'(emarat). '第二・第一レベルドメイン'(es). '第二・第一レベルドメイン'(eu). '第二・第一レベルドメイン'('eu.'). '第二・第一レベルドメイン'('eu.c'). '第二・第一レベルドメイン'('eu.co'). '第二・第一レベルドメイン'('eu.com'). '第二・第一レベルドメイン'(ev). '第二・第一レベルドメイン'(eve). '第二・第一レベルドメイン'(even). '第二・第一レベルドメイン'(event). '第二・第一レベルドメイン'(events). '第二・第一レベルドメイン'(f). '第二・第一レベルドメイン'(fi). '第二・第一レベルドメイン'(fil). '第二・第一レベルドメイン'(film). '第二・第一レベルドメイン'(fl). '第二・第一レベルドメイン'(fli). '第二・第一レベルドメイン'(flig). '第二・第一レベルドメイン'(fligh). '第二・第一レベルドメイン'(flight). '第二・第一レベルドメイン'(flights). '第二・第一レベルドメイン'(fly). '第二・第一レベルドメイン'(fm). '第二・第一レベルドメイン'(fo). '第二・第一レベルドメイン'(foo). '第二・第一レベルドメイン'(food). '第二・第一レベルドメイン'(foot). '第二・第一レベルドメイン'(footb). '第二・第一レベルドメイン'(footba). '第二・第一レベルドメイン'(footbal). '第二・第一レベルドメイン'(football). '第二・第一レベルドメイン'(for). '第二・第一レベルドメイン'(foru). '第二・第一レベルドメイン'(forum). '第二・第一レベルドメイン'(fr). '第二・第一レベルドメイン'(fre). '第二・第一レベルドメイン'(free). '第二・第一レベルドメイン'(fri). '第二・第一レベルドメイン'(frie). '第二・第一レベルドメイン'(frien). '第二・第一レベルドメイン'(friend). '第二・第一レベルドメイン'(friends). '第二・第一レベルドメイン'(fu). '第二・第一レベルドメイン'(fun). '第二・第一レベルドメイン'(fund). '第二・第一レベルドメイン'(fut). '第二・第一レベルドメイン'(futb). '第二・第一レベルドメイン'(futbo). '第二・第一レベルドメイン'(futbol). '第二・第一レベルドメイン'(g). '第二・第一レベルドメイン'(ga). '第二・第一レベルドメイン'(gam). '第二・第一レベルドメイン'(game). '第二・第一レベルドメイン'(gay). '第二・第一レベルドメイン'(gd). '第二・第一レベルドメイン'(ge). '第二・第一レベルドメイン'(gen). '第二・第一レベルドメイン'(gent). '第二・第一レベルドメイン'(gf). '第二・第一レベルドメイン'(gg). '第二・第一レベルドメイン'(gl). '第二・第一レベルドメイン'(gm). '第二・第一レベルドメイン'(gmb). '第二・第一レベルドメイン'(gmbh). '第二・第一レベルドメイン'(go). '第二・第一レベルドメイン'(gol). '第二・第一レベルドメイン'(gold). '第二・第一レベルドメイン'(gov). '第二・第一レベルドメイン'(gp). '第二・第一レベルドメイン'(gr). '第二・第一レベルドメイン'('gr.'). '第二・第一レベルドメイン'('gr.c'). '第二・第一レベルドメイン'('gr.co'). '第二・第一レベルドメイン'('gr.com'). '第二・第一レベルドメイン'(gs). '第二・第一レベルドメイン'(gt). '第二・第一レベルドメイン'(gy). '第二・第一レベルドメイン'(h). '第二・第一レベルドメイン'(he). '第二・第一レベルドメイン'(hel). '第二・第一レベルドメイン'(hels). '第二・第一レベルドメイン'(helsi). '第二・第一レベルドメイン'(helsin). '第二・第一レベルドメイン'(helsink). '第二・第一レベルドメイン'(helsinki). '第二・第一レベルドメイン'(hi). '第二・第一レベルドメイン'(hiv). '第二・第一レベルドメイン'(hk). '第二・第一レベルドメイン'(hn). '第二・第一レベルドメイン'(ho). '第二・第一レベルドメイン'(hoc). '第二・第一レベルドメイン'(hock). '第二・第一レベルドメイン'(hocke). '第二・第一レベルドメイン'(hockey). '第二・第一レベルドメイン'(hol). '第二・第一レベルドメイン'(holi). '第二・第一レベルドメイン'(holid). '第二・第一レベルドメイン'(holida). '第二・第一レベルドメイン'(holiday). '第二・第一レベルドメイン'(hor). '第二・第一レベルドメイン'(hors). '第二・第一レベルドメイン'(horse). '第二・第一レベルドメイン'(hos). '第二・第一レベルドメイン'(hosp). '第二・第一レベルドメイン'(hospi). '第二・第一レベルドメイン'(hospit). '第二・第一レベルドメイン'(hospita). '第二・第一レベルドメイン'(hospital). '第二・第一レベルドメイン'(hot). '第二・第一レベルドメイン'(hote). '第二・第一レベルドメイン'(hotel). '第二・第一レベルドメイン'(hou). '第二・第一レベルドメイン'(hous). '第二・第一レベルドメイン'(house). '第二・第一レベルドメイン'(hr). '第二・第一レベルドメイン'(ht). '第二・第一レベルドメイン'(hu). '第二・第一レベルドメイン'(i). '第二・第一レベルドメイン'(ie). '第二・第一レベルドメイン'(im). '第二・第一レベルドメイン'(in). '第二・第一レベルドメイン'(inc). '第二・第一レベルドメイン'(inf). '第二・第一レベルドメイン'(info). '第二・第一レベルドメイン'(ins). '第二・第一レベルドメイン'(insu). '第二・第一レベルドメイン'(insur). '第二・第一レベルドメイン'(insure). '第二・第一レベルドメイン'(io). '第二・第一レベルドメイン'(iq). '第二・第一レベルドメイン'(ir). '第二・第一レベルドメイン'(iri). '第二・第一レベルドメイン'(iris). '第二・第一レベルドメイン'(irish). '第二・第一レベルドメイン'(is). '第二・第一レベルドメイン'(isl). '第二・第一レベルドメイン'(isla). '第二・第一レベルドメイン'(islam). '第二・第一レベルドメイン'(ist). '第二・第一レベルドメイン'(ista). '第二・第一レベルドメイン'(istan). '第二・第一レベルドメイン'(istanb). '第二・第一レベルドメイン'(istanbu). '第二・第一レベルドメイン'(istanbul). '第二・第一レベルドメイン'(it). '第二・第一レベルドメイン'(j). '第二・第一レベルドメイン'(je). '第二・第一レベルドメイン'(jo). '第二・第一レベルドメイン'(job). '第二・第一レベルドメイン'(jobs). '第二・第一レベルドメイン'(jp). '第二・第一レベルドメイン'(k). '第二・第一レベルドメイン'(kg). '第二・第一レベルドメイン'(ki). '第二・第一レベルドメイン'(kit). '第二・第一レベルドメイン'(kitc). '第二・第一レベルドメイン'(kitch). '第二・第一レベルドメイン'(kitche). '第二・第一レベルドメイン'(kitchen). '第二・第一レベルドメイン'(kn). '第二・第一レベルドメイン'(ko). '第二・第一レベルドメイン'(koe). '第二・第一レベルドメイン'(koel). '第二・第一レベルドメイン'(koeln). '第二・第一レベルドメイン'(kr). '第二・第一レベルドメイン'(ky). '第二・第一レベルドメイン'(kz). '第二・第一レベルドメイン'(l). '第二・第一レベルドメイン'(la). '第二・第一レベルドメイン'(lat). '第二・第一レベルドメイン'(law). '第二・第一レベルドメイン'(lc). '第二・第一レベルドメイン'(li). '第二・第一レベルドメイン'(lim). '第二・第一レベルドメイン'(limi). '第二・第一レベルドメイン'(limit). '第二・第一レベルドメイン'(limite). '第二・第一レベルドメイン'(limited). '第二・第一レベルドメイン'(lk). '第二・第一レベルドメイン'(lo). '第二・第一レベルドメイン'(lon). '第二・第一レベルドメイン'(lond). '第二・第一レベルドメイン'(londo). '第二・第一レベルドメイン'(london). '第二・第一レベルドメイン'(lot). '第二・第一レベルドメイン'(lott). '第二・第一レベルドメイン'(lotto). '第二・第一レベルドメイン'(lt). '第二・第一レベルドメイン'(lu). '第二・第一レベルドメイン'(lv). '第二・第一レベルドメイン'(ly). '第二・第一レベルドメイン'(m). '第二・第一レベルドメイン'(ma). '第二・第一レベルドメイン'(mc). '第二・第一レベルドメイン'(md). '第二・第一レベルドメイン'(me). '第二・第一レベルドメイン'(med). '第二・第一レベルドメイン'(medi). '第二・第一レベルドメイン'(medic). '第二・第一レベルドメイン'(medica). '第二・第一レベルドメイン'(medical). '第二・第一レベルドメイン'(mel). '第二・第一レベルドメイン'(melb). '第二・第一レベルドメイン'(melbo). '第二・第一レベルドメイン'(melbou). '第二・第一レベルドメイン'(melbour). '第二・第一レベルドメイン'(melbourn). '第二・第一レベルドメイン'(melbourne). '第二・第一レベルドメイン'(men). '第二・第一レベルドメイン'(menu). '第二・第一レベルドメイン'(mg). '第二・第一レベルドメイン'(mi). '第二・第一レベルドメイン'(mia). '第二・第一レベルドメイン'(miam). '第二・第一レベルドメイン'(miami). '第二・第一レベルドメイン'(mk). '第二・第一レベルドメイン'(mn). '第二・第一レベルドメイン'(mo). '第二・第一レベルドメイン'(mob). '第二・第一レベルドメイン'(mobi). '第二・第一レベルドメイン'(mos). '第二・第一レベルドメイン'(mosc). '第二・第一レベルドメイン'(mosco). '第二・第一レベルドメイン'(moscow). '第二・第一レベルドメイン'(mp). '第二・第一レベルドメイン'(ms). '第二・第一レベルドメイン'(mu). '第二・第一レベルドメイン'(mus). '第二・第一レベルドメイン'(musi). '第二・第一レベルドメイン'(music). '第二・第一レベルドメイン'(mv). '第二・第一レベルドメイン'(mw). '第二・第一レベルドメイン'(mx). '第二・第一レベルドメイン'(my). '第二・第一レベルドメイン'(n). '第二・第一レベルドメイン'(na). '第二・第一レベルドメイン'(nam). '第二・第一レベルドメイン'(name). '第二・第一レベルドメイン'(ne). '第二・第一レベルドメイン'(net). '第二・第一レベルドメイン'('net.'). '第二・第一レベルドメイン'('net.a'). '第二・第一レベルドメイン'('net.au'). '第二・第一レベルドメイン'('net.b'). '第二・第一レベルドメイン'('net.bn'). '第二・第一レベルドメイン'('net.br'). '第二・第一レベルドメイン'('net.c'). '第二・第一レベルドメイン'('net.cm'). '第二・第一レベルドメイン'('net.cn'). '第二・第一レベルドメイン'('net.g'). '第二・第一レベルドメイン'('net.gt'). '第二・第一レベルドメイン'('net.h'). '第二・第一レベルドメイン'('net.hk'). '第二・第一レベルドメイン'('net.i'). '第二・第一レベルドメイン'('net.il'). '第二・第一レベルドメイン'('net.m'). '第二・第一レベルドメイン'('net.mx'). '第二・第一レベルドメイン'('net.n'). '第二・第一レベルドメイン'('net.nz'). '第二・第一レベルドメイン'('net.p'). '第二・第一レベルドメイン'('net.ph'). '第二・第一レベルドメイン'('net.u'). '第二・第一レベルドメイン'('net.uk'). '第二・第一レベルドメイン'(new). '第二・第一レベルドメイン'(news). '第二・第一レベルドメイン'(nl). '第二・第一レベルドメイン'(no). '第二・第一レベルドメイン'(nom). '第二・第一レベルドメイン'('nom.'). '第二・第一レベルドメイン'('nom.e'). '第二・第一レベルドメイン'('nom.es'). '第二・第一レベルドメイン'(nr). '第二・第一レベルドメイン'(nu). '第二・第一レベルドメイン'(o). '第二・第一レベルドメイン'(or). '第二・第一レベルドメイン'(org). '第二・第一レベルドメイン'('org.'). '第二・第一レベルドメイン'('org.b'). '第二・第一レベルドメイン'('org.bn'). '第二・第一レベルドメイン'('org.c'). '第二・第一レベルドメイン'('org.cn'). '第二・第一レベルドメイン'('org.e'). '第二・第一レベルドメイン'('org.es'). '第二・第一レベルドメイン'('org.i'). '第二・第一レベルドメイン'('org.il'). '第二・第一レベルドメイン'('org.l'). '第二・第一レベルドメイン'('org.lv'). '第二・第一レベルドメイン'('org.n'). '第二・第一レベルドメイン'('org.nz'). '第二・第一レベルドメイン'('org.p'). '第二・第一レベルドメイン'('org.ph'). '第二・第一レベルドメイン'('org.pl'). '第二・第一レベルドメイン'('org.u'). '第二・第一レベルドメイン'('org.uk'). '第二・第一レベルドメイン'(orga). '第二・第一レベルドメイン'(organ). '第二・第一レベルドメイン'(organi). '第二・第一レベルドメイン'(organic). '第二・第一レベルドメイン'(p). '第二・第一レベルドメイン'(pa). '第二・第一レベルドメイン'(par). '第二・第一レベルドメイン'(pari). '第二・第一レベルドメイン'(paris). '第二・第一レベルドメイン'(pe). '第二・第一レベルドメイン'(ph). '第二・第一レベルドメイン'(pho). '第二・第一レベルドメイン'(phot). '第二・第一レベルドメイン'(photo). '第二・第一レベルドメイン'(pi). '第二・第一レベルドメイン'(pin). '第二・第一レベルドメイン'(pink). '第二・第一レベルドメイン'(piz). '第二・第一レベルドメイン'(pizz). '第二・第一レベルドメイン'(pizza). '第二・第一レベルドメイン'(pk). '第二・第一レベルドメイン'(pl). '第二・第一レベルドメイン'(pm). '第二・第一レベルドメイン'(pn). '第二・第一レベルドメイン'(po). '第二・第一レベルドメイン'(pok). '第二・第一レベルドメイン'(poke). '第二・第一レベルドメイン'(poker). '第二・第一レベルドメイン'(por). '第二・第一レベルドメイン'(porn). '第二・第一レベルドメイン'(pr). '第二・第一レベルドメイン'(pro). '第二・第一レベルドメイン'(ps). '第二・第一レベルドメイン'(pt). '第二・第一レベルドメイン'(pu). '第二・第一レベルドメイン'(pub). '第二・第一レベルドメイン'(pw). '第二・第一レベルドメイン'(q). '第二・第一レベルドメイン'(qa). '第二・第一レベルドメイン'(qu). '第二・第一レベルドメイン'(que). '第二・第一レベルドメイン'(queb). '第二・第一レベルドメイン'(quebe). '第二・第一レベルドメイン'(quebec). '第二・第一レベルドメイン'(r). '第二・第一レベルドメイン'(re). '第二・第一レベルドメイン'(rei). '第二・第一レベルドメイン'(reis). '第二・第一レベルドメイン'(reise). '第二・第一レベルドメイン'(rep). '第二・第一レベルドメイン'(repo). '第二・第一レベルドメイン'(repor). '第二・第一レベルドメイン'(report). '第二・第一レベルドメイン'(res). '第二・第一レベルドメイン'(rest). '第二・第一レベルドメイン'(resta). '第二・第一レベルドメイン'(restau). '第二・第一レベルドメイン'(restaur). '第二・第一レベルドメイン'(restaura). '第二・第一レベルドメイン'(restauran). '第二・第一レベルドメイン'(restaurant). '第二・第一レベルドメイン'(ro). '第二・第一レベルドメイン'(rom). '第二・第一レベルドメイン'(roma). '第二・第一レベルドメイン'(rs). '第二・第一レベルドメイン'(ru). '第二・第一レベルドメイン'(rug). '第二・第一レベルドメイン'(rugb). '第二・第一レベルドメイン'(rugby). '第二・第一レベルドメイン'(ruh). '第二・第一レベルドメイン'(ruhr). '第二・第一レベルドメイン'(rw). '第二・第一レベルドメイン'(s). '第二・第一レベルドメイン'(sa). '第二・第一レベルドメイン'(sc). '第二・第一レベルドメイン'(sco). '第二・第一レベルドメイン'(scot). '第二・第一レベルドメイン'(sd). '第二・第一レベルドメイン'(se). '第二・第一レベルドメイン'(sec). '第二・第一レベルドメイン'(secu). '第二・第一レベルドメイン'(secur). '第二・第一レベルドメイン'(secure). '第二・第一レベルドメイン'(sg). '第二・第一レベルドメイン'(sh). '第二・第一レベルドメイン'(sho). '第二・第一レベルドメイン'(shoe). '第二・第一レベルドメイン'(shoes). '第二・第一レベルドメイン'(shop). '第二・第一レベルドメイン'(si). '第二・第一レベルドメイン'(sk). '第二・第一レベルドメイン'(ska). '第二・第一レベルドメイン'(skat). '第二・第一レベルドメイン'(skate). '第二・第一レベルドメイン'(ski). '第二・第一レベルドメイン'(sl). '第二・第一レベルドメイン'(sm). '第二・第一レベルドメイン'(sn). '第二・第一レベルドメイン'(so). '第二・第一レベルドメイン'(sp). '第二・第一レベルドメイン'(spa). '第二・第一レベルドメイン'(spac). '第二・第一レベルドメイン'(space). '第二・第一レベルドメイン'(spo). '第二・第一レベルドメイン'(spor). '第二・第一レベルドメイン'(sport). '第二・第一レベルドメイン'(sr). '第二・第一レベルドメイン'(st). '第二・第一レベルドメイン'(sto). '第二・第一レベルドメイン'(stoc). '第二・第一レベルドメイン'(stock). '第二・第一レベルドメイン'(stockh). '第二・第一レベルドメイン'(stockho). '第二・第一レベルドメイン'(stockhol). '第二・第一レベルドメイン'(stockholm). '第二・第一レベルドメイン'(su). '第二・第一レベルドメイン'(sup). '第二・第一レベルドメイン'(supp). '第二・第一レベルドメイン'(suppo). '第二・第一レベルドメイン'(suppor). '第二・第一レベルドメイン'(support). '第二・第一レベルドメイン'(sur). '第二・第一レベルドメイン'(surf). '第二・第一レベルドメイン'(sv). '第二・第一レベルドメイン'(sx). '第二・第一レベルドメイン'(sy). '第二・第一レベルドメイン'(syd). '第二・第一レベルドメイン'(sydn). '第二・第一レベルドメイン'(sydne). '第二・第一レベルドメイン'(sydney). '第二・第一レベルドメイン'(t). '第二・第一レベルドメイン'(ta). '第二・第一レベルドメイン'(tat). '第二・第一レベルドメイン'(tatt). '第二・第一レベルドメイン'(tatto). '第二・第一レベルドメイン'(tattoo). '第二・第一レベルドメイン'(tc). '第二・第一レベルドメイン'(td). '第二・第一レベルドメイン'(te). '第二・第一レベルドメイン'(tel). '第二・第一レベルドメイン'(ten). '第二・第一レベルドメイン'(tenn). '第二・第一レベルドメイン'(tenni). '第二・第一レベルドメイン'(tennis). '第二・第一レベルドメイン'(tf). '第二・第一レベルドメイン'(tg). '第二・第一レベルドメイン'(th). '第二・第一レベルドメイン'(tha). '第二・第一レベルドメイン'(thai). '第二・第一レベルドメイン'(ti). '第二・第一レベルドメイン'(tir). '第二・第一レベルドメイン'(tiro). '第二・第一レベルドメイン'(tirol). '第二・第一レベルドメイン'(tj). '第二・第一レベルドメイン'(tk). '第二・第一レベルドメイン'(tl). '第二・第一レベルドメイン'(tm). '第二・第一レベルドメイン'(tn). '第二・第一レベルドメイン'(to). '第二・第一レベルドメイン'(tok). '第二・第一レベルドメイン'(toky). '第二・第一レベルドメイン'(tokyo). '第二・第一レベルドメイン'(tr). '第二・第一レベルドメイン'(tra). '第二・第一レベルドメイン'(trai). '第二・第一レベルドメイン'(train). '第二・第一レベルドメイン'(traini). '第二・第一レベルドメイン'(trainin). '第二・第一レベルドメイン'(training). '第二・第一レベルドメイン'(trav). '第二・第一レベルドメイン'(trave). '第二・第一レベルドメイン'(travel). '第二・第一レベルドメイン'(tv). '第二・第一レベルドメイン'(tw). '第二・第一レベルドメイン'(u). '第二・第一レベルドメイン'(ua). '第二・第一レベルドメイン'(ug). '第二・第一レベルドメイン'(uk). '第二・第一レベルドメイン'('uk.'). '第二・第一レベルドメイン'('uk.c'). '第二・第一レベルドメイン'('uk.co'). '第二・第一レベルドメイン'('uk.com'). '第二・第一レベルドメイン'(us). '第二・第一レベルドメイン'('us.'). '第二・第一レベルドメイン'('us.c'). '第二・第一レベルドメイン'('us.co'). '第二・第一レベルドメイン'('us.com'). '第二・第一レベルドメイン'('us.o'). '第二・第一レベルドメイン'('us.or'). '第二・第一レベルドメイン'('us.org'). '第二・第一レベルドメイン'(uy). '第二・第一レベルドメイン'(uz). '第二・第一レベルドメイン'(v). '第二・第一レベルドメイン'(vc). '第二・第一レベルドメイン'(vg). '第二・第一レベルドメイン'(vi). '第二・第一レベルドメイン'(via). '第二・第一レベルドメイン'(viaj). '第二・第一レベルドメイン'(viaje). '第二・第一レベルドメイン'(viajes). '第二・第一レベルドメイン'(vn). '第二・第一レベルドメイン'(vo). '第二・第一レベルドメイン'(voy). '第二・第一レベルドメイン'(voya). '第二・第一レベルドメイン'(voyag). '第二・第一レベルドメイン'(voyage). '第二・第一レベルドメイン'(w). '第二・第一レベルドメイン'(wa). '第二・第一レベルドメイン'(wal). '第二・第一レベルドメイン'(wale). '第二・第一レベルドメイン'(wales). '第二・第一レベルドメイン'(we). '第二・第一レベルドメイン'(web). '第二・第一レベルドメイン'('web.'). '第二・第一レベルドメイン'('web.d'). '第二・第一レベルドメイン'('web.do'). '第二・第一レベルドメイン'(wf). '第二・第一レベルドメイン'(wi). '第二・第一レベルドメイン'(wie). '第二・第一レベルドメイン'(wien). '第二・第一レベルドメイン'(win). '第二・第一レベルドメイン'(wine). '第二・第一レベルドメイン'(ws). '第二・第一レベルドメイン'(x). '第二・第一レベルドメイン'(xx). '第二・第一レベルドメイン'(xxx). '第二・第一レベルドメイン'(y). '第二・第一レベルドメイン'(yt). '第二・第一レベルドメイン'('м'). '第二・第一レベルドメイン'('мо'). '第二・第一レベルドメイン'('мос'). '第二・第一レベルドメイン'('моск'). '第二・第一レベルドメイン'('москв'). '第二・第一レベルドメイン'('москва'). '第二・第一レベルドメイン'('р'). '第二・第一レベルドメイン'('рф'). '第二・第一レベルドメイン'('с'). '第二・第一レベルドメイン'('ср'). '第二・第一レベルドメイン'('срб'). '第二・第一レベルドメイン'('香'). '第二・第一レベルドメイン'('香港'). '第二・第一レベルドメイン'('中'). '第二・第一レベルドメイン'('中国'). % 以下のサイトは # 御題 # # 1から100までの数を出力するプログラムを書け。 # ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 # 素数のときは 'Prime' と出力し、 # フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 # また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。 '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。' :- '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(1,0,1). '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_,_) :- _数 > 100,!. '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2,_fib_1_2,_fib_2_2), _数_2 is _数_1 + 1, '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_2,_fib_1_2,_fib_2_2). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数_1,_fib_1,_fib_2,_fib_1_2,_fib_2_2) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_2_2,_fib_2_2,Fib), '素数のときは ''Prime'' と'(_数,Prime), '出力する'(_数_1,Fib,Prime),!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_2_2,_数_1,'Fib') :- _数_1 is _fib_1 + _fib_2,!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数_1,_fib_1,_fib_2,_fib_1,_fib_2,''). '素数のときは ''Prime'' と'(_数,'Prime') :- 素数である(_数),!. '素数のときは ''Prime'' と'(_,''). '出力する'(_数_1,'','') :- write('%t ',[_数_1]),!. '出力する'(_数_1,Fib,Prime) :- write('%t%t ',[Fib,Prime]). % このプログラムの骨組みは %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 素数である(1) :- !. 素数である(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,_n,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. % 以下のサイトは # 御題 # # 1から100までの数を出力するプログラムを書け。 # ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 # 素数のときは 'Prime' と出力し、 # フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 # また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。 '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。' '100以下のフィボナッチ数列を得る'(_100以下のフィボナッチ数ならび), '100以下の素数を得る'(_100以下の素数ならび), between(1,100,_数), 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L), 'Nが100になるまで出力する'(N,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,L), '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,L), それ以外の場合は数を(_数,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,['Fib',_,_]) :- member(_数,_100以下のフィボナッチ数ならび),!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_,_,['',_,_]). '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,[_,'Prime',_]) :- member(_数,_100以下の素数ならび),!. '素数のときは ''Prime'' と'(_,_,[_,'',_]). それ以外の場合は数を(_数,['','',_数]) :- !. それ以外の場合は数を(_,[_,_,'']). '100以下のフィボナッチ数列を得る'(L) :- '100以下のフィボナッチ数列'([1,0],L). '100以下のフィボナッチ数列'([B,A|R],L) :- C is A + B, C =< 100, '100以下のフィボナッチ数列'([C,B,A|R],L),!. '100以下のフィボナッチ数列'(L,L). '100以下の素数を得る'(_100以下の素数ならび) :- findall(N,( between(1,100,N)), _1から100までのならび), エラトステネスの篩(_1から100までのならび,_100以下の素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 'Nが100になるまで出力する'(N,L) :- atomic_list_concat(L,_表示文字列), writef('%t ',[_表示文字列]), N = 100. % 以下のサイトは # 御題 # # 1から100までの数を出力するプログラムを書け。 # ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 # 素数のときは 'Prime' と出力し、 # フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 # また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。 '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。' '100以下のフィボナッチ数列を得る'(_100以下のフィボナッチ数ならび), '100以下の素数を得る'(_100以下の素数ならび), between(1,100,_数), 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L), 'Nが100になるまで出力する'(N,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,L), '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,L), それ以外の場合は数を(_数,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,['Fib',_,_]) :- member(_数,_100以下のフィボナッチ数ならび),!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_,_,['',_,_]). '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,[_,'Prime',_]) :- member(_数,_100以下の素数ならび),!. '素数のときは ''Prime'' と'(_,_,[_,'',_]). それ以外の場合は数を(_数,['','',_数]) :- !. それ以外の場合は数を(_,[_,_,'']). '100以下のフィボナッチ数列を得る'(L) :- '100以下のフィボナッチ数列'([1,0],L). '100以下のフィボナッチ数列'([B,A|R],L) :- C is A + B, C =< 100, '100以下のフィボナッチ数列'([C,B,A|R],L),!. '100以下のフィボナッチ数列'(L,L). '100以下の素数を得る'(L) :- findall(N,( between(1,100,N), 素数である(N)), L). 素数である(1) :- !. 素数である(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,_n,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. 'Nが100になるまで出力する'(N,L) :- atomic_list_concat(L,_表示文字列), writef('%t ',[_表示文字列]), N = 100. % 以下のサイトは タブ区切りのn列のm字目からn字目までを切り出す(_n列,_m字目,_n字目,_文字列,_副文字列) :- nth1_split(_n列,_文字列,['\t'],_副文字列_1), _n_1 is _n - 1, sub_atom(_副文字列_1,_m字目,_n_1,_,_副文字列). タブ区切りのn列を切り出す(_n列,_m字目,_n字目,_文字列,_副文字列) :- nth1_split(_n列,_文字列,['\t'],_副文字列),!. nth1_split(_nth1,_文字列,_区切り文字ならび,_副文字列) :- split(_文字列,_区切り文字ならび,1,_nth1,_区切り文字列,_副文字列,_残り文字列). split('',_,_,_,_,_,_) :- !,fail. split(_文字列,_区切り文字列ならび,_nth1_1,_nth1,_区切り文字列,_副文字列,_残り文字列) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列_1,_副文字列_1,_残り文字列_1), split_1(_区切り文字列ならび,_nth1_1,_区切り文字列_1,_副文字列_1,_残り文字列_1,_nth1,_区切り文字列,_副文字列,_残り文字列). split_1(_区切り文字列ならび,_nth1,_区切り文字列,_副文字列,_残り文字列,_nth1,_区切り文字列,_副文字列,_残り文字列). split_1(_区切り文字列ならび,_nth1_1,_,_,_残り文字列_1,_nth1,_区切り文字列,_副文字列,_残り文字列) :- _nth1_2 is _nth1_1 + 1, split(_残り文字列_1,_区切り文字列ならび,_nth1_2,_nth1,_区切り文字列,_副文字列,_残り文字列). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), sub_atom(_区切り文字列,_,_長さ,_,_区切り文字列), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). % 以下のサイトは nth1_split(_nth1,_文字列,_区切り文字,_副文字列) :- split(_文字列,[_区切り文字],_,L2), nth1(_nth1,L2,_副文字列). split('',_,[],[]) :- !. split(_文字列,_区切り文字列ならび,[_区切り文字列|R3],[_副文字列|R4]) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列), split(_残り文字列,_区切り文字列ならび,R3,R4). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), atom_length(_区切り文字列,_長さ), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). % 以下のサイトは # # 特定の文字が含まれる行のみ消す場合の正規表現教えて下さい. # 特定の文字が含まれる行のみ消す(_文字列,_特定の文字列,_特定の文字を含む行を除いて結合し直した文字列) :- sPLIT(_文字列,['\n'],L), 特定の文字が含まれる行のみ消す(L,_特定の文字列,_特定の文字を含む行を除いた文字列ならび), atomic_list_concat(_特定の文字を含む行を除いた文字列ならび,_特定の文字を含む行を除いて結合し直した文字列). 特定の文字が含まれる行のみ消す([_文字列,'\n'|R1],_特定の文字列,L) :- 特定の文字が含まれる(_文字列,_特定の文字列), 特定の文字が含まれる行のみ消す(R1,_特定の文字列,L2),!. 特定の文字が含まれる行のみ消す([_文字列,'\n'|R1],_特定の文字列,[_文字列,'\n'|R2]) :- 特定の文字が含まれる行のみ消す(R1,_特定の文字列,R2),!. 特定の文字が含まれる行のみ消す(L,_,L). 特定の文字が含まれる(_文字列,_特定の文字列) :- sub_atom(_文字列,_,_,_,_特定の文字列),!. % 以下のサイトは # # 特定の文字が含まれる行のみ消す場合の正規表現教えて下さい. # 特定の文字が含まれる行のみ消す(_文字列,_特定の文字列,_特定の文字を含む行を除いて結合し直した文字列) :- sPLIT(_文字列,['\n'],L), 特定の文字が含まれる行のみ消す(L,_特定の文字列,_特定の文字を含む行を除いた文字列ならび), atomic_list_concat(_特定の文字を含む行を除いた文字列ならび,_特定の文字を含む行を除いて結合し直した文字列). 特定の文字が含まれる行のみ消す([_文字列,'\n'|R1],_特定の文字列,L) :- 特定の文字が含まれる(_文字列,_特定の文字列), 特定の文字が含まれる行のみ消す(R1,_特定の文字列,L2),!. 特定の文字が含まれる行のみ消す([_文字列,'\n'|R1],_特定の文字列,[_文字列,'\n'|R2]) :- 特定の文字が含まれる行のみ消す(R1,_特定の文字列,R2),!. 特定の文字が含まれる行のみ消す(L,_,L). 特定の文字が含まれる(_文字列,_特定の文字列) :- sub_atom(_文字列,_,_,_,_特定の文字列),!. % 以下のサイトは # 出典:: 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(L,( between(1,10,_n), length(L,10), all(L,1)), LL). all([],_). all([V|R],V) :- all(R,V). '対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。' :- 対角要素だけ1を代入しほかは全て0を代入してから(LL), 表示しなさい(LL). 対角要素だけ1を代入しほかは全て0を代入してから(LL) :- findall(L,( between(1,10,_n), length(L,10), nth1(_n,L,1), 他の全ての要素は0に(L)), LL). 他の全ての変数要素は0に([]). 他の全ての変数要素は0に([0|R]) :- 他の全ての変数要素は0に(R). 他の全ての変数要素は0に([_|R]) :- 他の全ての変数要素は0に(R). その内容を表示しなさい(LL) :- 表示しなさい(LL). 表示しなさい(LL) :- append(_,[L|R],LL), atomic_list_concat(L,S), writef('%t\n',[S]), R = []. % 以下のサイトは # 数式が全部文字に置き換えられたモノから数式に戻して計算する関数を作りたいと思います。 # 例えば、[ Kazu 0.1, Tasu, Kazu 2.1, Hiku, Kazu 3.0, Kake, Kazu 2.9, Waru, Kazu 0.9]があって、 # これを戻すと 0.1 + 2.1 - 3.0 * 2.9 / 0.9 -> -7.46 みたいに結果をだしたい。 :- op(200,fx,kazu). :- op(200,fx,tasu). :- op(200,fx,hiku). :- op(200,fx,kake). :- op(200,fx,waru). '数式が全部文字に置き換えられたモノから数式に戻して計算する関数を作りたいと思います。 例えば、[ Kazu 0.1, Tasu, Kazu 2.1, Hiku, Kazu 3.0, Kake, Kazu 2.9, Waru, Kazu 0.9]があって、 これを戻すと 0.1 + 2.1 - 3.0 * 2.9 / 0.9 -> -7.46 みたいに結果をだしたい。'(L,_式,_結果) :- 数式が全部文字に置き換えられたモノから数式に戻して計算する(L,_式,_結果). 数式が全部文字に置き換えられたモノから数式に戻して計算する(L,_式,_結果) :- 演算子を置換する(_ならび,_演算子を置換されたならび), atomic_list_concat(_演算子を置換されたならび,' ',_式文字列), atom_to_term(_式文字列,_式,_), _結果 is _式. 演算子を置換する([],[]). 演算子を置換する([kazu _値|R1],[_値|R2]) :- 演算子を置換する(R1,R2). 演算子を置換する([_演算子文字列 _値|R1],[_演算子,_値|R2]) :- '演算子文字列・演算子'(_演算子文字列,_演算子), 演算子を置換する(R1,R2). '演算子文字列・演算子'(tasu,+). '演算子文字列・演算子'(hiku,-). '演算子文字列・演算子'(kake,*). '演算子文字列・演算子'(waru,/). % 以下のサイトは # [1] 授業単元:Python # [2] 問題文(含コード&リンク): 課題2 # http://pc12.2ch.net/test/read.cgi/tech/1153585095/789 [1] 授業単元:Python [2] 問題文(含コード&リンク): 下の例参照 与えられた数字のみからなる文字列から各桁の数字に分割し、 隣り合う数字の合計の下一桁の値を並べたものを次の文字列とし、 結果が一桁になるまで繰り返しそれぞれの過程の文字列を出力する。 [3] 環境:特になし [4] 期限: 明日まで [5] その他の制限: 例 # 525123214112431 # 77635535523674 # 4398088075931 # 727886872424 # 99564459666 # 8410894522 # 251873974 # 76950261 # 3545287 # 899705 # 78675 # 5432 # 95 # 4 # # 上から2段目から最後の段までに現れる0から9数字の # 総出現数と各数字毎の出現比率を出力する。 # [3] 環境:特になし # [4] 期限: 明日まで # [5] その他の制限: # # 129個 # 0: 10回 3% # 1: 43回 20% # 2: 8回 2% # ... # 9: 18回 6% # のように出力してください。 対象となる文字列('525123214112431'). 対象となる文字列('77635535523674'). 対象となる文字列('4398088075931'). 対象となる文字列('727886872424'). 対象となる文字列('99564459666'). 対象となる文字列('8410894522'). 対象となる文字列('251873974'). 対象となる文字列('76950261'). 対象となる文字列('3545287'). 対象となる文字列('899705'). 対象となる文字列('78675'). 対象となる文字列('5432'). 対象となる文字列('95'). 対象となる文字列('4'). '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を出力する。' :- findall(_文字列,( 対象となる文字列(_対象となる文字列), _行ならび), '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率), 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率). '上から2段目から最後の段までに現れる0から9数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率) :- '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで), '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数), '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率). '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで) :- _行ならび = [_|_上から2段目から最後の段まで]. '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数) :- atomic_list_concat(_上から2段目から最後の段まで,_文字列), findall(_度数,( member(_数字文字,['0','1','2','3','4','5','6','7','8','9']), count(sub_atom(_文字列,_,1,_,_数字文字),_度数)), _0から9までの数字の出現ならび), sum(_0から9までの数字の出現ならび,_総出現数). '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率) :- findall(_出現比率,( member(_度数,_0から9までの数字の出現数ならび), _出現比率 is _度数 / _総出現数 * 100.0)), _各数字毎の出現比率). 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率) :- write('数: 出現数 出現比率\n'), '数字の出現数・出現比率を一行で出力する'(_0から9までの数字の出現数ならび,_各数字毎の出現比率,N), N = 9. '数字の出現数・出現比率を一行で出力する'(N,_0から9までの数字の出現数ならび,_各数字毎の出現比率,N) :- nth0(N,_0から9までの数字の出現数ならび,_出現数), nth0(N,_各数字毎の出現比率,_出現比率), writef(' %t: %t回 ',[N,_出現数]), format('~1f%\n',[_出現比率]). % 以下のサイトは # [1] 授業単元:Python # [2] 問題文(含コード&リンク): 課題2 # http://pc12.2ch.net/test/read.cgi/tech/1153585095/789 [1] 授業単元:Python [2] 問題文(含コード&リンク): 下の例参照 与えられた数字のみからなる文字列から各桁の数字に分割し、 隣り合う数字の合計の下一桁の値を並べたものを次の文字列とし、 結果が一桁になるまで繰り返しそれぞれの過程の文字列を出力する。 [3] 環境:特になし [4] 期限: 明日まで [5] その他の制限: 例 # 525123214112431 # 77635535523674 # 4398088075931 # 727886872424 # 99564459666 # 8410894522 # 251873974 # 76950261 # 3545287 # 899705 # 78675 # 5432 # 95 # 4 # # 上から2段目から最後の段までに現れる0から9数字の # 総出現数と各数字毎の出現比率を出力する。 # [3] 環境:特になし # [4] 期限: 明日まで # [5] その他の制限: # # 129個 # 0: 10回 3% # 1: 43回 20% # 2: 8回 2% # ... # 9: 18回 6% # のように出力してください。 対象となる文字列('525123214112431 77635535523674 4398088075931 727886872424 99564459666 8410894522 251873974 76950261 3545287 899705 78675 5432 95 4'). '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を出力する。' :- 対象となる文字列(_対象となる文字列), split(_対象となる文字列,['\n'],_行ならび), '上から2段目から最後の段までに現れる0から9までの数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率), 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率). '上から2段目から最後の段までに現れる0から9数字の総出現数と各数字毎の出現比率を'(_行ならび,_数字の総出現数,_各数字毎の出現比率) :- '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで), '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数), '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率). '上から2段目から最後の段までに現れる'(_行ならび,_上から2段目から最後の段まで) :- _行ならび = [_|_上から2段目から最後の段まで]. '0から9までの数字の総出現数'(_上から2段目から最後の段まで,_0から9までの数字の出現数ならび,_総出現数) :- atomic_list_concat(_上から2段目から最後の段まで,_文字列), findall(_度数,( member(_数字文字,['0','1','2','3','4','5','6','7','8','9']), count(sub_atom(_文字列,_,1,_,_数字文字),_度数)), _0から9までの数字の出現ならび), sum(_0から9までの数字の出現ならび,_総出現数). '各数字毎の出現比率を'(_0から9までの数字の出現数ならび,_総出現数,_各数字毎の出現比率) :- findall(_出現比率,( member(_度数,_0から9までの数字の出現数ならび), _出現比率 is _度数 / _総出現数 * 100.0)), _各数字毎の出現比率). 出力する(_0から9までの数字の出現数ならび,_各数字毎の出現比率) :- write('数: 出現数 出現比率\n'), '数字の出現数・出現比率を一行で出力する'(_0から9までの数字の出現数ならび,_各数字毎の出現比率,N), N = 9. '数字の出現数・出現比率を一行で出力する'(N,_0から9までの数字の出現数ならび,_各数字毎の出現比率,N) :- nth0(N,_0から9までの数字の出現数ならび,_出現数), nth0(N,_各数字毎の出現比率,_出現比率), writef(' %t: %t回 ',[N,_出現数]), format('~1f%\n',[_出現比率]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/727 # # [1] 授業単元: 暇つぶし # [2] 問題文:迷路を解くプログラム。 #  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 # ----- ここからテキスト ----- # 5 5 # sxrrr # rxrrr # rrrxr # rrxgr # ----- ここまでテキスト ----- #  テキストの1行目は順番に迷路の横幅と縦幅を表します。 #  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。 #  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。 #  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 # 1 step # sxrrr # +xrrr # rrrxr # rrxgr # <中略> # 9 step # sxrrr # +x+++ # +++x+ # rrxg+ # '問題文:迷路を解くプログラム。  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 ----- ここからテキスト ----- 5 5 sxrrr rxrrr rrrxr rrxgr ----- ここまでテキスト -----  テキストの1行目は順番に迷路の横幅と縦幅を表します。  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 1 step sxrrr +xrrr rrrxr rrxgr <中略> 9 step sxrrr +x+++ +++x+ rrxg+ '(_テキスト) :- 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト). 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト) :- テキストを入力とし(_テキスト,LL1,LL2), スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順), '道を表示してください。'(_スタートからゴールまでの道順,LL1). スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順) :- スタートを探す(LL1,LL2,_スタートの行,_スタートの列), ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列), 隣に移動する(_スタートの行,_スタートの列,_ゴールの行,_ゴールの列,LL1,LL2,[],_スタートからゴールまでの道順). テキストを入力とし(_テキスト,LL1,LL2) :- get_lines(_テキスト,[_不要要素|_行ならび]), findall(_文字ならび,( member(_一行,_行ならび), atom_chars(_一行,_文字ならび)), LL1), 転置(LL1,LL2). スタートを探す(LL1,LL2,_スタートの行,_スタートの列) :- nth1(_スタートの行,LL1,L), nth1(_スタートの列,L,s). ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列) :- nth1(_ゴールの行,LL1,L), nth1(_ゴールの列,L,g). 隣に移動する(_ゴールの行,_ゴールの列,_ゴールの行,_ゴールの列,LL1,LL2,_,[[_ゴールの行,_ゴールの列]]). 隣に移動する(_行,_列,_ゴールの行,_ゴールの列,LL1,LL2,_履歴1,[[_行,_列]|R]) :- 移動可能な隣接点を得る(_行,_列,LL1,LL2,_隣の行,_隣の列), \+(member([_隣の行,_隣の列],_履歴1)), 隣に移動する(_隣の行,_隣の列,_ゴールの行,_ゴールの列,LL1,LL2,[[_行,_列]|_履歴1],R). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 列の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列) :- nth1(_行,LL1,L), length([_|L0],_列), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の列). 列の移動可能な隣接点(_行,_列,LL1,LL2,_隣の行,_隣の列) :- nth1(_列,LL2,L), length([_|L0],_行), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の行). 移動可能な隣接点(L0,R,_隣) :- last(L0,r), length(L0,_隣). 移動可能な隣接点(L0,R,_隣) :- R = [r|_], length([_,_|L0],_隣). '道を表示してください。'(_スタートからゴールまでの道順,LL) :- append(LL0,[[_行,_列]|RR],_スタートからゴールまでの道順), length([_|LL0],_ステップ), write('%t\n',[_ステップ]), '通過点を+に置換してLLを表示する'(_行,_列,LL), R = []. '通過点を+に置換してLLを表示する'(_行,_列,LL) :- append(L0,[L1|R],LL), length([_|L0],_行_1), 列の置換(_行_1,_行,_列,L1,L2), ならびを文字列に変換して表示(L2), R = []. 列の置換(_行,_行,_列,L1,L2) :- length([_|L0],_列), append(L0,[_|R],L1), append(L0,[+|R],L2),!. 列の置換(_,_,_,L,L). ならびを文字列に変換して表示(L) :- atomic_list_concat(L,S), writef('%t\n',[S]). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/591 # # ●正規表現の使用環境 # Perl # # ●検索か置換か? # 検索 # # ●説明 # トップから第三レベルドメインまでをマッチさせたい。 # www.(mydomain.co.jp)※括弧の中 # サブドメインが無い場合も想定されます。 # mydomain.com # www.aaa.mydomain.com # aaa.bbb.mydomain.com # # ●対象データ # www.mydomain.co.jp # mydomain.co.jp # mydomain.com # www.aaa.mydomain.com # aaa.bbb.mydomain.com # # ●希望する結果 # mydomain.co.jp # mydomain.com # # よろしくお願いします。 # # 'トップから第三レベルドメインまでをマッチさせたい。'(_文字列,_第三レベルドメインまでの文字列) :- '第二・第一レベルドメインと第三以上レベルドメイン文字列を得る'(_文字列,_第二第一レベルドメイン,_第三以上レベルドメイン文字列), '第三レベルドメインを切り出す'(_第三以上レベルドメイン文字列,_第三レベルドメイン), atomic_list_concat([_第三レベルドメイン,_第二第一レベルドメイン],_第三レベルドメインまでの文字列]). '第二・第一レベルドメインと第三以上レベルドメイン文字列を得る'(_文字列,_第二第一レベルドメイン,_第三以上レベル文字列) :- '第二・第一レベルドメイン'(_第二第一レベルドメイン), sub_atom(_文字列,S,Len,R,_第二第一レベルドメイン), sub_atom(_文字列,0,S,_,_第三以上レベル文字列). '第三レベルドメインを切り出す'(_第三以上レベルドメイン文字列,_第三レベルドメイン) :- split(_第三以上レベルドメイン文字列,['.'],L), last(L,_第三レベルドメイン),!. '第二・第一レベルドメイン'(a). '第二・第一レベルドメイン'(ab). '第二・第一レベルドメイン'(abo). '第二・第一レベルドメイン'(abog). '第二・第一レベルドメイン'(aboga). '第二・第一レベルドメイン'(abogad). '第二・第一レベルドメイン'(abogado). '第二・第一レベルドメイン'(ac). '第二・第一レベルドメイン'(ad). '第二・第一レベルドメイン'(adu). '第二・第一レベルドメイン'(adul). '第二・第一レベルドメイン'(adult). '第二・第一レベルドメイン'(ae). '第二・第一レベルドメイン'(aer). '第二・第一レベルドメイン'(aero). '第二・第一レベルドメイン'(af). '第二・第一レベルドメイン'(afr). '第二・第一レベルドメイン'(afri). '第二・第一レベルドメイン'(afric). '第二・第一レベルドメイン'(africa). '第二・第一レベルドメイン'(ag). '第二・第一レベルドメイン'(ai). '第二・第一レベルドメイン'(al). '第二・第一レベルドメイン'(am). '第二・第一レベルドメイン'(ams). '第二・第一レベルドメイン'(amst). '第二・第一レベルドメイン'(amste). '第二・第一レベルドメイン'(amster). '第二・第一レベルドメイン'(amsterd). '第二・第一レベルドメイン'(amsterda). '第二・第一レベルドメイン'(amsterdam). '第二・第一レベルドメイン'(ap). '第二・第一レベルドメイン'(app). '第二・第一レベルドメイン'(as). '第二・第一レベルドメイン'(asi). '第二・第一レベルドメイン'(asia). '第二・第一レベルドメイン'(at). '第二・第一レベルドメイン'(au). '第二・第一レベルドメイン'(auc). '第二・第一レベルドメイン'(auct). '第二・第一レベルドメイン'(aucti). '第二・第一レベルドメイン'(auctio). '第二・第一レベルドメイン'(auction). '第二・第一レベルドメイン'(ax). '第二・第一レベルドメイン'(az). '第二・第一レベルドメイン'(b). '第二・第一レベルドメイン'(ba). '第二・第一レベルドメイン'(bab). '第二・第一レベルドメイン'(baby). '第二・第一レベルドメイン'(ban). '第二・第一レベルドメイン'(bank). '第二・第一レベルドメイン'(bar). '第二・第一レベルドメイン'(barc). '第二・第一レベルドメイン'(barce). '第二・第一レベルドメイン'(barcel). '第二・第一レベルドメイン'(barcelo). '第二・第一レベルドメイン'(barcelon). '第二・第一レベルドメイン'(barcelona). '第二・第一レベルドメイン'(bb). '第二・第一レベルドメイン'(be). '第二・第一レベルドメイン'(bee). '第二・第一レベルドメイン'(beer). '第二・第一レベルドメイン'(ber). '第二・第一レベルドメイン'(berl). '第二・第一レベルドメイン'(berli). '第二・第一レベルドメイン'(berlin). '第二・第一レベルドメイン'(bg). '第二・第一レベルドメイン'(bi). '第二・第一レベルドメイン'(bik). '第二・第一レベルドメイン'(bike). '第二・第一レベルドメイン'(biz). '第二・第一レベルドメイン'(bj). '第二・第一レベルドメイン'(bl). '第二・第一レベルドメイン'(blo). '第二・第一レベルドメイン'(blog). '第二・第一レベルドメイン'(bm). '第二・第一レベルドメイン'(bo). '第二・第一レベルドメイン'(boo). '第二・第一レベルドメイン'(book). '第二・第一レベルドメイン'(booki). '第二・第一レベルドメイン'(bookin). '第二・第一レベルドメイン'(booking). '第二・第一レベルドメイン'(bos). '第二・第一レベルドメイン'(bost). '第二・第一レベルドメイン'(bosto). '第二・第一レベルドメイン'(boston). '第二・第一レベルドメイン'(br). '第二・第一レベルドメイン'(bru). '第二・第一レベルドメイン'(brus). '第二・第一レベルドメイン'(bruss). '第二・第一レベルドメイン'(brusse). '第二・第一レベルドメイン'(brussel). '第二・第一レベルドメイン'(brussels). '第二・第一レベルドメイン'(bs). '第二・第一レベルドメイン'(bu). '第二・第一レベルドメイン'(bud). '第二・第一レベルドメイン'(buda). '第二・第一レベルドメイン'(budap). '第二・第一レベルドメイン'(budape). '第二・第一レベルドメイン'(budapes). '第二・第一レベルドメイン'(budapest). '第二・第一レベルドメイン'(by). '第二・第一レベルドメイン'(bz). '第二・第一レベルドメイン'(c). '第二・第一レベルドメイン'(ca). '第二・第一レベルドメイン'(cap). '第二・第一レベルドメイン'(cape). '第二・第一レベルドメイン'(capet). '第二・第一レベルドメイン'(capeto). '第二・第一レベルドメイン'(capetow). '第二・第一レベルドメイン'(capetown). '第二・第一レベルドメイン'(car). '第二・第一レベルドメイン'(care). '第二・第一レベルドメイン'(caree). '第二・第一レベルドメイン'(career). '第二・第一レベルドメイン'(cas). '第二・第一レベルドメイン'(cash). '第二・第一レベルドメイン'(cat). '第二・第一レベルドメイン'(cc). '第二・第一レベルドメイン'(cd). '第二・第一レベルドメイン'(cf). '第二・第一レベルドメイン'(cg). '第二・第一レベルドメイン'(ch). '第二・第一レベルドメイン'(chr). '第二・第一レベルドメイン'(chri). '第二・第一レベルドメイン'(chris). '第二・第一レベルドメイン'(christ). '第二・第一レベルドメイン'(christm). '第二・第一レベルドメイン'(christma). '第二・第一レベルドメイン'(christmas). '第二・第一レベルドメイン'(ci). '第二・第一レベルドメイン'(cl). '第二・第一レベルドメイン'(cli). '第二・第一レベルドメイン'(clic). '第二・第一レベルドメイン'(click). '第二・第一レベルドメイン'(cm). '第二・第一レベルドメイン'(cn). '第二・第一レベルドメイン'(co). '第二・第一レベルドメイン'('co.'). '第二・第一レベルドメイン'('co.a'). '第二・第一レベルドメイン'('co.ao'). '第二・第一レベルドメイン'('co.at'). '第二・第一レベルドメイン'('co.b'). '第二・第一レベルドメイン'('co.bw'). '第二・第一レベルドメイン'('co.c'). '第二・第一レベルドメイン'('co.ck'). '第二・第一レベルドメイン'('co.cm'). '第二・第一レベルドメイン'('co.cr'). '第二・第一レベルドメイン'('co.f'). '第二・第一レベルドメイン'('co.fk'). '第二・第一レベルドメイン'('co.h'). '第二・第一レベルドメイン'('co.hu'). '第二・第一レベルドメイン'('co.i'). '第二・第一レベルドメイン'('co.id'). '第二・第一レベルドメイン'('co.il'). '第二・第一レベルドメイン'('co.in'). '第二・第一レベルドメイン'('co.ir'). '第二・第一レベルドメイン'('co.j'). '第二・第一レベルドメイン'('co.jp'). '第二・第一レベルドメイン'('co.k'). '第二・第一レベルドメイン'('co.ke'). '第二・第一レベルドメイン'('co.kr'). '第二・第一レベルドメイン'('co.l'). '第二・第一レベルドメイン'('co.ls'). '第二・第一レベルドメイン'('co.m'). '第二・第一レベルドメイン'('co.mz'). '第二・第一レベルドメイン'('co.n'). '第二・第一レベルドメイン'('co.nl'). '第二・第一レベルドメイン'('co.no'). '第二・第一レベルドメイン'('co.nz'). '第二・第一レベルドメイン'('co.r'). '第二・第一レベルドメイン'('co.rs'). '第二・第一レベルドメイン'('co.t'). '第二・第一レベルドメイン'('co.th'). '第二・第一レベルドメイン'('co.tt'). '第二・第一レベルドメイン'('co.tz'). '第二・第一レベルドメイン'('co.u'). '第二・第一レベルドメイン'('co.ug'). '第二・第一レベルドメイン'('co.uk'). '第二・第一レベルドメイン'('co.z'). '第二・第一レベルドメイン'('co.za'). '第二・第一レベルドメイン'('co.zw'). '第二・第一レベルドメイン'(cof). '第二・第一レベルドメイン'(coff). '第二・第一レベルドメイン'(coffe). '第二・第一レベルドメイン'(coffee). '第二・第一レベルドメイン'(com). '第二・第一レベルドメイン'('com.'). '第二・第一レベルドメイン'('com.a'). '第二・第一レベルドメイン'('com.ag'). '第二・第一レベルドメイン'('com.ai'). '第二・第一レベルドメイン'('com.al'). '第二・第一レベルドメイン'('com.an'). '第二・第一レベルドメイン'('com.ar'). '第二・第一レベルドメイン'('com.au'). '第二・第一レベルドメイン'('com.aw'). '第二・第一レベルドメイン'('com.az'). '第二・第一レベルドメイン'('com.b'). '第二・第一レベルドメイン'('com.bd'). '第二・第一レベルドメイン'('com.bh'). '第二・第一レベルドメイン'('com.bn'). '第二・第一レベルドメイン'('com.bo'). '第二・第一レベルドメイン'('com.br'). '第二・第一レベルドメイン'('com.bs'). '第二・第一レベルドメイン'('com.bt'). '第二・第一レベルドメイン'('com.c'). '第二・第一レベルドメイン'('com.cm'). '第二・第一レベルドメイン'('com.cn'). '第二・第一レベルドメイン'('com.co'). '第二・第一レベルドメイン'('com.cy'). '第二・第一レベルドメイン'('com.d'). '第二・第一レベルドメイン'('com.de'). '第二・第一レベルドメイン'('com.dz'). '第二・第一レベルドメイン'('com.e'). '第二・第一レベルドメイン'('com.ec'). '第二・第一レベルドメイン'('com.eg'). '第二・第一レベルドメイン'('com.es'). '第二・第一レベルドメイン'('com.et'). '第二・第一レベルドメイン'('com.f'). '第二・第一レベルドメイン'('com.fj'). '第二・第一レベルドメイン'('com.g'). '第二・第一レベルドメイン'('com.ge'). '第二・第一レベルドメイン'('com.gh'). '第二・第一レベルドメイン'('com.gi'). '第二・第一レベルドメイン'('com.gl'). '第二・第一レベルドメイン'('com.gn'). '第二・第一レベルドメイン'('com.gr'). '第二・第一レベルドメイン'('com.gt'). '第二・第一レベルドメイン'('com.gu'). '第二・第一レベルドメイン'('com.h'). '第二・第一レベルドメイン'('com.hk'). '第二・第一レベルドメイン'('com.hr'). '第二・第一レベルドメイン'('com.j'). '第二・第一レベルドメイン'('com.jm'). '第二・第一レベルドメイン'('com.jo'). '第二・第一レベルドメイン'('com.k'). '第二・第一レベルドメイン'('com.kh'). '第二・第一レベルドメイン'('com.kw'). '第二・第一レベルドメイン'('com.l'). '第二・第一レベルドメイン'('com.lb'). '第二・第一レベルドメイン'('com.lr'). '第二・第一レベルドメイン'('com.lv'). '第二・第一レベルドメイン'('com.ly'). '第二・第一レベルドメイン'('com.m'). '第二・第一レベルドメイン'('com.mg'). '第二・第一レベルドメイン'('com.mk'). '第二・第一レベルドメイン'('com.mo'). '第二・第一レベルドメイン'('com.mt'). '第二・第一レベルドメイン'('com.mx'). '第二・第一レベルドメイン'('com.my'). '第二・第一レベルドメイン'('com.n'). '第二・第一レベルドメイン'('com.na'). '第二・第一レベルドメイン'('com.ng'). '第二・第一レベルドメイン'('com.ni'). '第二・第一レベルドメイン'('com.np'). '第二・第一レベルドメイン'('com.o'). '第二・第一レベルドメイン'('com.om'). '第二・第一レベルドメイン'('com.p'). '第二・第一レベルドメイン'('com.pa'). '第二・第一レベルドメイン'('com.pe'). '第二・第一レベルドメイン'('com.ph'). '第二・第一レベルドメイン'('com.pk'). '第二・第一レベルドメイン'('com.pl'). '第二・第一レベルドメイン'('com.pr'). '第二・第一レベルドメイン'('com.pt'). '第二・第一レベルドメイン'('com.py'). '第二・第一レベルドメイン'('com.q'). '第二・第一レベルドメイン'('com.qa'). '第二・第一レベルドメイン'('com.r'). '第二・第一レベルドメイン'('com.ro'). '第二・第一レベルドメイン'('com.s'). '第二・第一レベルドメイン'('com.sg'). '第二・第一レベルドメイン'('com.sn'). '第二・第一レベルドメイン'('com.sv'). '第二・第一レベルドメイン'('com.sy'). '第二・第一レベルドメイン'('com.t'). '第二・第一レベルドメイン'('com.tn'). '第二・第一レベルドメイン'('com.tr'). '第二・第一レベルドメイン'('com.tw'). '第二・第一レベルドメイン'('com.u'). '第二・第一レベルドメイン'('com.ua'). '第二・第一レベルドメイン'('com.uy'). '第二・第一レベルドメイン'('com.v'). '第二・第一レベルドメイン'('com.ve'). '第二・第一レベルドメイン'('com.vn'). '第二・第一レベルドメイン'(con). '第二・第一レベルドメイン'(cond). '第二・第一レベルドメイン'(condo). '第二・第一レベルドメイン'(condos). '第二・第一レベルドメイン'(cons). '第二・第一レベルドメイン'(consu). '第二・第一レベルドメイン'(consul). '第二・第一レベルドメイン'(consult). '第二・第一レベルドメイン'(consulti). '第二・第一レベルドメイン'(consultin). '第二・第一レベルドメイン'(consulting). '第二・第一レベルドメイン'(coo). '第二・第一レベルドメイン'(coop). '第二・第一レベルドメイン'(cor). '第二・第一レベルドメイン'(cors). '第二・第一レベルドメイン'(corsi). '第二・第一レベルドメイン'(corsic). '第二・第一レベルドメイン'(corsica). '第二・第一レベルドメイン'(cr). '第二・第一レベルドメイン'(cre). '第二・第一レベルドメイン'(cred). '第二・第一レベルドメイン'(credi). '第二・第一レベルドメイン'(credit). '第二・第一レベルドメイン'(cu). '第二・第一レベルドメイン'(cv). '第二・第一レベルドメイン'(cw). '第二・第一レベルドメイン'(cx). '第二・第一レベルドメイン'(cy). '第二・第一レベルドメイン'(cym). '第二・第一レベルドメイン'(cymr). '第二・第一レベルドメイン'(cymru). '第二・第一レベルドメイン'(cz). '第二・第一レベルドメイン'(d). '第二・第一レベルドメイン'(de). '第二・第一レベルドメイン'('de.'). '第二・第一レベルドメイン'('de.c'). '第二・第一レベルドメイン'('de.co'). '第二・第一レベルドメイン'('de.com'). '第二・第一レベルドメイン'(den). '第二・第一レベルドメイン'(dent). '第二・第一レベルドメイン'(denta). '第二・第一レベルドメイン'(dental). '第二・第一レベルドメイン'(dj). '第二・第一レベルドメイン'(dk). '第二・第一レベルドメイン'(dm). '第二・第一レベルドメイン'(do). '第二・第一レベルドメイン'(dow). '第二・第一レベルドメイン'(down). '第二・第一レベルドメイン'(downl). '第二・第一レベルドメイン'(downlo). '第二・第一レベルドメイン'(downloa). '第二・第一レベルドメイン'(download). '第二・第一レベルドメイン'(du). '第二・第一レベルドメイン'(dub). '第二・第一レベルドメイン'(duba). '第二・第一レベルドメイン'(dubai). '第二・第一レベルドメイン'(dz). '第二・第一レベルドメイン'(e). '第二・第一レベルドメイン'(ec). '第二・第一レベルドメイン'(eco). '第二・第一レベルドメイン'(ed). '第二・第一レベルドメイン'(edu). '第二・第一レベルドメイン'(ee). '第二・第一レベルドメイン'(eg). '第二・第一レベルドメイン'(em). '第二・第一レベルドメイン'(ema). '第二・第一レベルドメイン'(emar). '第二・第一レベルドメイン'(emara). '第二・第一レベルドメイン'(emarat). '第二・第一レベルドメイン'(es). '第二・第一レベルドメイン'(eu). '第二・第一レベルドメイン'('eu.'). '第二・第一レベルドメイン'('eu.c'). '第二・第一レベルドメイン'('eu.co'). '第二・第一レベルドメイン'('eu.com'). '第二・第一レベルドメイン'(ev). '第二・第一レベルドメイン'(eve). '第二・第一レベルドメイン'(even). '第二・第一レベルドメイン'(event). '第二・第一レベルドメイン'(events). '第二・第一レベルドメイン'(f). '第二・第一レベルドメイン'(fi). '第二・第一レベルドメイン'(fil). '第二・第一レベルドメイン'(film). '第二・第一レベルドメイン'(fl). '第二・第一レベルドメイン'(fli). '第二・第一レベルドメイン'(flig). '第二・第一レベルドメイン'(fligh). '第二・第一レベルドメイン'(flight). '第二・第一レベルドメイン'(flights). '第二・第一レベルドメイン'(fly). '第二・第一レベルドメイン'(fm). '第二・第一レベルドメイン'(fo). '第二・第一レベルドメイン'(foo). '第二・第一レベルドメイン'(food). '第二・第一レベルドメイン'(foot). '第二・第一レベルドメイン'(footb). '第二・第一レベルドメイン'(footba). '第二・第一レベルドメイン'(footbal). '第二・第一レベルドメイン'(football). '第二・第一レベルドメイン'(for). '第二・第一レベルドメイン'(foru). '第二・第一レベルドメイン'(forum). '第二・第一レベルドメイン'(fr). '第二・第一レベルドメイン'(fre). '第二・第一レベルドメイン'(free). '第二・第一レベルドメイン'(fri). '第二・第一レベルドメイン'(frie). '第二・第一レベルドメイン'(frien). '第二・第一レベルドメイン'(friend). '第二・第一レベルドメイン'(friends). '第二・第一レベルドメイン'(fu). '第二・第一レベルドメイン'(fun). '第二・第一レベルドメイン'(fund). '第二・第一レベルドメイン'(fut). '第二・第一レベルドメイン'(futb). '第二・第一レベルドメイン'(futbo). '第二・第一レベルドメイン'(futbol). '第二・第一レベルドメイン'(g). '第二・第一レベルドメイン'(ga). '第二・第一レベルドメイン'(gam). '第二・第一レベルドメイン'(game). '第二・第一レベルドメイン'(gay). '第二・第一レベルドメイン'(gd). '第二・第一レベルドメイン'(ge). '第二・第一レベルドメイン'(gen). '第二・第一レベルドメイン'(gent). '第二・第一レベルドメイン'(gf). '第二・第一レベルドメイン'(gg). '第二・第一レベルドメイン'(gl). '第二・第一レベルドメイン'(gm). '第二・第一レベルドメイン'(gmb). '第二・第一レベルドメイン'(gmbh). '第二・第一レベルドメイン'(go). '第二・第一レベルドメイン'(gol). '第二・第一レベルドメイン'(gold). '第二・第一レベルドメイン'(gov). '第二・第一レベルドメイン'(gp). '第二・第一レベルドメイン'(gr). '第二・第一レベルドメイン'('gr.'). '第二・第一レベルドメイン'('gr.c'). '第二・第一レベルドメイン'('gr.co'). '第二・第一レベルドメイン'('gr.com'). '第二・第一レベルドメイン'(gs). '第二・第一レベルドメイン'(gt). '第二・第一レベルドメイン'(gy). '第二・第一レベルドメイン'(h). '第二・第一レベルドメイン'(he). '第二・第一レベルドメイン'(hel). '第二・第一レベルドメイン'(hels). '第二・第一レベルドメイン'(helsi). '第二・第一レベルドメイン'(helsin). '第二・第一レベルドメイン'(helsink). '第二・第一レベルドメイン'(helsinki). '第二・第一レベルドメイン'(hi). '第二・第一レベルドメイン'(hiv). '第二・第一レベルドメイン'(hk). '第二・第一レベルドメイン'(hn). '第二・第一レベルドメイン'(ho). '第二・第一レベルドメイン'(hoc). '第二・第一レベルドメイン'(hock). '第二・第一レベルドメイン'(hocke). '第二・第一レベルドメイン'(hockey). '第二・第一レベルドメイン'(hol). '第二・第一レベルドメイン'(holi). '第二・第一レベルドメイン'(holid). '第二・第一レベルドメイン'(holida). '第二・第一レベルドメイン'(holiday). '第二・第一レベルドメイン'(hor). '第二・第一レベルドメイン'(hors). '第二・第一レベルドメイン'(horse). '第二・第一レベルドメイン'(hos). '第二・第一レベルドメイン'(hosp). '第二・第一レベルドメイン'(hospi). '第二・第一レベルドメイン'(hospit). '第二・第一レベルドメイン'(hospita). '第二・第一レベルドメイン'(hospital). '第二・第一レベルドメイン'(hot). '第二・第一レベルドメイン'(hote). '第二・第一レベルドメイン'(hotel). '第二・第一レベルドメイン'(hou). '第二・第一レベルドメイン'(hous). '第二・第一レベルドメイン'(house). '第二・第一レベルドメイン'(hr). '第二・第一レベルドメイン'(ht). '第二・第一レベルドメイン'(hu). '第二・第一レベルドメイン'(i). '第二・第一レベルドメイン'(ie). '第二・第一レベルドメイン'(im). '第二・第一レベルドメイン'(in). '第二・第一レベルドメイン'(inc). '第二・第一レベルドメイン'(inf). '第二・第一レベルドメイン'(info). '第二・第一レベルドメイン'(ins). '第二・第一レベルドメイン'(insu). '第二・第一レベルドメイン'(insur). '第二・第一レベルドメイン'(insure). '第二・第一レベルドメイン'(io). '第二・第一レベルドメイン'(iq). '第二・第一レベルドメイン'(ir). '第二・第一レベルドメイン'(iri). '第二・第一レベルドメイン'(iris). '第二・第一レベルドメイン'(irish). '第二・第一レベルドメイン'(is). '第二・第一レベルドメイン'(isl). '第二・第一レベルドメイン'(isla). '第二・第一レベルドメイン'(islam). '第二・第一レベルドメイン'(ist). '第二・第一レベルドメイン'(ista). '第二・第一レベルドメイン'(istan). '第二・第一レベルドメイン'(istanb). '第二・第一レベルドメイン'(istanbu). '第二・第一レベルドメイン'(istanbul). '第二・第一レベルドメイン'(it). '第二・第一レベルドメイン'(j). '第二・第一レベルドメイン'(je). '第二・第一レベルドメイン'(jo). '第二・第一レベルドメイン'(job). '第二・第一レベルドメイン'(jobs). '第二・第一レベルドメイン'(jp). '第二・第一レベルドメイン'(k). '第二・第一レベルドメイン'(kg). '第二・第一レベルドメイン'(ki). '第二・第一レベルドメイン'(kit). '第二・第一レベルドメイン'(kitc). '第二・第一レベルドメイン'(kitch). '第二・第一レベルドメイン'(kitche). '第二・第一レベルドメイン'(kitchen). '第二・第一レベルドメイン'(kn). '第二・第一レベルドメイン'(ko). '第二・第一レベルドメイン'(koe). '第二・第一レベルドメイン'(koel). '第二・第一レベルドメイン'(koeln). '第二・第一レベルドメイン'(kr). '第二・第一レベルドメイン'(ky). '第二・第一レベルドメイン'(kz). '第二・第一レベルドメイン'(l). '第二・第一レベルドメイン'(la). '第二・第一レベルドメイン'(lat). '第二・第一レベルドメイン'(law). '第二・第一レベルドメイン'(lc). '第二・第一レベルドメイン'(li). '第二・第一レベルドメイン'(lim). '第二・第一レベルドメイン'(limi). '第二・第一レベルドメイン'(limit). '第二・第一レベルドメイン'(limite). '第二・第一レベルドメイン'(limited). '第二・第一レベルドメイン'(lk). '第二・第一レベルドメイン'(lo). '第二・第一レベルドメイン'(lon). '第二・第一レベルドメイン'(lond). '第二・第一レベルドメイン'(londo). '第二・第一レベルドメイン'(london). '第二・第一レベルドメイン'(lot). '第二・第一レベルドメイン'(lott). '第二・第一レベルドメイン'(lotto). '第二・第一レベルドメイン'(lt). '第二・第一レベルドメイン'(lu). '第二・第一レベルドメイン'(lv). '第二・第一レベルドメイン'(ly). '第二・第一レベルドメイン'(m). '第二・第一レベルドメイン'(ma). '第二・第一レベルドメイン'(mc). '第二・第一レベルドメイン'(md). '第二・第一レベルドメイン'(me). '第二・第一レベルドメイン'(med). '第二・第一レベルドメイン'(medi). '第二・第一レベルドメイン'(medic). '第二・第一レベルドメイン'(medica). '第二・第一レベルドメイン'(medical). '第二・第一レベルドメイン'(mel). '第二・第一レベルドメイン'(melb). '第二・第一レベルドメイン'(melbo). '第二・第一レベルドメイン'(melbou). '第二・第一レベルドメイン'(melbour). '第二・第一レベルドメイン'(melbourn). '第二・第一レベルドメイン'(melbourne). '第二・第一レベルドメイン'(men). '第二・第一レベルドメイン'(menu). '第二・第一レベルドメイン'(mg). '第二・第一レベルドメイン'(mi). '第二・第一レベルドメイン'(mia). '第二・第一レベルドメイン'(miam). '第二・第一レベルドメイン'(miami). '第二・第一レベルドメイン'(mk). '第二・第一レベルドメイン'(mn). '第二・第一レベルドメイン'(mo). '第二・第一レベルドメイン'(mob). '第二・第一レベルドメイン'(mobi). '第二・第一レベルドメイン'(mos). '第二・第一レベルドメイン'(mosc). '第二・第一レベルドメイン'(mosco). '第二・第一レベルドメイン'(moscow). '第二・第一レベルドメイン'(mp). '第二・第一レベルドメイン'(ms). '第二・第一レベルドメイン'(mu). '第二・第一レベルドメイン'(mus). '第二・第一レベルドメイン'(musi). '第二・第一レベルドメイン'(music). '第二・第一レベルドメイン'(mv). '第二・第一レベルドメイン'(mw). '第二・第一レベルドメイン'(mx). '第二・第一レベルドメイン'(my). '第二・第一レベルドメイン'(n). '第二・第一レベルドメイン'(na). '第二・第一レベルドメイン'(nam). '第二・第一レベルドメイン'(name). '第二・第一レベルドメイン'(ne). '第二・第一レベルドメイン'(net). '第二・第一レベルドメイン'('net.'). '第二・第一レベルドメイン'('net.a'). '第二・第一レベルドメイン'('net.au'). '第二・第一レベルドメイン'('net.b'). '第二・第一レベルドメイン'('net.bn'). '第二・第一レベルドメイン'('net.br'). '第二・第一レベルドメイン'('net.c'). '第二・第一レベルドメイン'('net.cm'). '第二・第一レベルドメイン'('net.cn'). '第二・第一レベルドメイン'('net.g'). '第二・第一レベルドメイン'('net.gt'). '第二・第一レベルドメイン'('net.h'). '第二・第一レベルドメイン'('net.hk'). '第二・第一レベルドメイン'('net.i'). '第二・第一レベルドメイン'('net.il'). '第二・第一レベルドメイン'('net.m'). '第二・第一レベルドメイン'('net.mx'). '第二・第一レベルドメイン'('net.n'). '第二・第一レベルドメイン'('net.nz'). '第二・第一レベルドメイン'('net.p'). '第二・第一レベルドメイン'('net.ph'). '第二・第一レベルドメイン'('net.u'). '第二・第一レベルドメイン'('net.uk'). '第二・第一レベルドメイン'(new). '第二・第一レベルドメイン'(news). '第二・第一レベルドメイン'(nl). '第二・第一レベルドメイン'(no). '第二・第一レベルドメイン'(nom). '第二・第一レベルドメイン'('nom.'). '第二・第一レベルドメイン'('nom.e'). '第二・第一レベルドメイン'('nom.es'). '第二・第一レベルドメイン'(nr). '第二・第一レベルドメイン'(nu). '第二・第一レベルドメイン'(o). '第二・第一レベルドメイン'(or). '第二・第一レベルドメイン'(org). '第二・第一レベルドメイン'('org.'). '第二・第一レベルドメイン'('org.b'). '第二・第一レベルドメイン'('org.bn'). '第二・第一レベルドメイン'('org.c'). '第二・第一レベルドメイン'('org.cn'). '第二・第一レベルドメイン'('org.e'). '第二・第一レベルドメイン'('org.es'). '第二・第一レベルドメイン'('org.i'). '第二・第一レベルドメイン'('org.il'). '第二・第一レベルドメイン'('org.l'). '第二・第一レベルドメイン'('org.lv'). '第二・第一レベルドメイン'('org.n'). '第二・第一レベルドメイン'('org.nz'). '第二・第一レベルドメイン'('org.p'). '第二・第一レベルドメイン'('org.ph'). '第二・第一レベルドメイン'('org.pl'). '第二・第一レベルドメイン'('org.u'). '第二・第一レベルドメイン'('org.uk'). '第二・第一レベルドメイン'(orga). '第二・第一レベルドメイン'(organ). '第二・第一レベルドメイン'(organi). '第二・第一レベルドメイン'(organic). '第二・第一レベルドメイン'(p). '第二・第一レベルドメイン'(pa). '第二・第一レベルドメイン'(par). '第二・第一レベルドメイン'(pari). '第二・第一レベルドメイン'(paris). '第二・第一レベルドメイン'(pe). '第二・第一レベルドメイン'(ph). '第二・第一レベルドメイン'(pho). '第二・第一レベルドメイン'(phot). '第二・第一レベルドメイン'(photo). '第二・第一レベルドメイン'(pi). '第二・第一レベルドメイン'(pin). '第二・第一レベルドメイン'(pink). '第二・第一レベルドメイン'(piz). '第二・第一レベルドメイン'(pizz). '第二・第一レベルドメイン'(pizza). '第二・第一レベルドメイン'(pk). '第二・第一レベルドメイン'(pl). '第二・第一レベルドメイン'(pm). '第二・第一レベルドメイン'(pn). '第二・第一レベルドメイン'(po). '第二・第一レベルドメイン'(pok). '第二・第一レベルドメイン'(poke). '第二・第一レベルドメイン'(poker). '第二・第一レベルドメイン'(por). '第二・第一レベルドメイン'(porn). '第二・第一レベルドメイン'(pr). '第二・第一レベルドメイン'(pro). '第二・第一レベルドメイン'(ps). '第二・第一レベルドメイン'(pt). '第二・第一レベルドメイン'(pu). '第二・第一レベルドメイン'(pub). '第二・第一レベルドメイン'(pw). '第二・第一レベルドメイン'(q). '第二・第一レベルドメイン'(qa). '第二・第一レベルドメイン'(qu). '第二・第一レベルドメイン'(que). '第二・第一レベルドメイン'(queb). '第二・第一レベルドメイン'(quebe). '第二・第一レベルドメイン'(quebec). '第二・第一レベルドメイン'(r). '第二・第一レベルドメイン'(re). '第二・第一レベルドメイン'(rei). '第二・第一レベルドメイン'(reis). '第二・第一レベルドメイン'(reise). '第二・第一レベルドメイン'(rep). '第二・第一レベルドメイン'(repo). '第二・第一レベルドメイン'(repor). '第二・第一レベルドメイン'(report). '第二・第一レベルドメイン'(res). '第二・第一レベルドメイン'(rest). '第二・第一レベルドメイン'(resta). '第二・第一レベルドメイン'(restau). '第二・第一レベルドメイン'(restaur). '第二・第一レベルドメイン'(restaura). '第二・第一レベルドメイン'(restauran). '第二・第一レベルドメイン'(restaurant). '第二・第一レベルドメイン'(ro). '第二・第一レベルドメイン'(rom). '第二・第一レベルドメイン'(roma). '第二・第一レベルドメイン'(rs). '第二・第一レベルドメイン'(ru). '第二・第一レベルドメイン'(rug). '第二・第一レベルドメイン'(rugb). '第二・第一レベルドメイン'(rugby). '第二・第一レベルドメイン'(ruh). '第二・第一レベルドメイン'(ruhr). '第二・第一レベルドメイン'(rw). '第二・第一レベルドメイン'(s). '第二・第一レベルドメイン'(sa). '第二・第一レベルドメイン'(sc). '第二・第一レベルドメイン'(sco). '第二・第一レベルドメイン'(scot). '第二・第一レベルドメイン'(sd). '第二・第一レベルドメイン'(se). '第二・第一レベルドメイン'(sec). '第二・第一レベルドメイン'(secu). '第二・第一レベルドメイン'(secur). '第二・第一レベルドメイン'(secure). '第二・第一レベルドメイン'(sg). '第二・第一レベルドメイン'(sh). '第二・第一レベルドメイン'(sho). '第二・第一レベルドメイン'(shoe). '第二・第一レベルドメイン'(shoes). '第二・第一レベルドメイン'(shop). '第二・第一レベルドメイン'(si). '第二・第一レベルドメイン'(sk). '第二・第一レベルドメイン'(ska). '第二・第一レベルドメイン'(skat). '第二・第一レベルドメイン'(skate). '第二・第一レベルドメイン'(ski). '第二・第一レベルドメイン'(sl). '第二・第一レベルドメイン'(sm). '第二・第一レベルドメイン'(sn). '第二・第一レベルドメイン'(so). '第二・第一レベルドメイン'(sp). '第二・第一レベルドメイン'(spa). '第二・第一レベルドメイン'(spac). '第二・第一レベルドメイン'(space). '第二・第一レベルドメイン'(spo). '第二・第一レベルドメイン'(spor). '第二・第一レベルドメイン'(sport). '第二・第一レベルドメイン'(sr). '第二・第一レベルドメイン'(st). '第二・第一レベルドメイン'(sto). '第二・第一レベルドメイン'(stoc). '第二・第一レベルドメイン'(stock). '第二・第一レベルドメイン'(stockh). '第二・第一レベルドメイン'(stockho). '第二・第一レベルドメイン'(stockhol). '第二・第一レベルドメイン'(stockholm). '第二・第一レベルドメイン'(su). '第二・第一レベルドメイン'(sup). '第二・第一レベルドメイン'(supp). '第二・第一レベルドメイン'(suppo). '第二・第一レベルドメイン'(suppor). '第二・第一レベルドメイン'(support). '第二・第一レベルドメイン'(sur). '第二・第一レベルドメイン'(surf). '第二・第一レベルドメイン'(sv). '第二・第一レベルドメイン'(sx). '第二・第一レベルドメイン'(sy). '第二・第一レベルドメイン'(syd). '第二・第一レベルドメイン'(sydn). '第二・第一レベルドメイン'(sydne). '第二・第一レベルドメイン'(sydney). '第二・第一レベルドメイン'(t). '第二・第一レベルドメイン'(ta). '第二・第一レベルドメイン'(tat). '第二・第一レベルドメイン'(tatt). '第二・第一レベルドメイン'(tatto). '第二・第一レベルドメイン'(tattoo). '第二・第一レベルドメイン'(tc). '第二・第一レベルドメイン'(td). '第二・第一レベルドメイン'(te). '第二・第一レベルドメイン'(tel). '第二・第一レベルドメイン'(ten). '第二・第一レベルドメイン'(tenn). '第二・第一レベルドメイン'(tenni). '第二・第一レベルドメイン'(tennis). '第二・第一レベルドメイン'(tf). '第二・第一レベルドメイン'(tg). '第二・第一レベルドメイン'(th). '第二・第一レベルドメイン'(tha). '第二・第一レベルドメイン'(thai). '第二・第一レベルドメイン'(ti). '第二・第一レベルドメイン'(tir). '第二・第一レベルドメイン'(tiro). '第二・第一レベルドメイン'(tirol). '第二・第一レベルドメイン'(tj). '第二・第一レベルドメイン'(tk). '第二・第一レベルドメイン'(tl). '第二・第一レベルドメイン'(tm). '第二・第一レベルドメイン'(tn). '第二・第一レベルドメイン'(to). '第二・第一レベルドメイン'(tok). '第二・第一レベルドメイン'(toky). '第二・第一レベルドメイン'(tokyo). '第二・第一レベルドメイン'(tr). '第二・第一レベルドメイン'(tra). '第二・第一レベルドメイン'(trai). '第二・第一レベルドメイン'(train). '第二・第一レベルドメイン'(traini). '第二・第一レベルドメイン'(trainin). '第二・第一レベルドメイン'(training). '第二・第一レベルドメイン'(trav). '第二・第一レベルドメイン'(trave). '第二・第一レベルドメイン'(travel). '第二・第一レベルドメイン'(tv). '第二・第一レベルドメイン'(tw). '第二・第一レベルドメイン'(u). '第二・第一レベルドメイン'(ua). '第二・第一レベルドメイン'(ug). '第二・第一レベルドメイン'(uk). '第二・第一レベルドメイン'('uk.'). '第二・第一レベルドメイン'('uk.c'). '第二・第一レベルドメイン'('uk.co'). '第二・第一レベルドメイン'('uk.com'). '第二・第一レベルドメイン'(us). '第二・第一レベルドメイン'('us.'). '第二・第一レベルドメイン'('us.c'). '第二・第一レベルドメイン'('us.co'). '第二・第一レベルドメイン'('us.com'). '第二・第一レベルドメイン'('us.o'). '第二・第一レベルドメイン'('us.or'). '第二・第一レベルドメイン'('us.org'). '第二・第一レベルドメイン'(uy). '第二・第一レベルドメイン'(uz). '第二・第一レベルドメイン'(v). '第二・第一レベルドメイン'(vc). '第二・第一レベルドメイン'(vg). '第二・第一レベルドメイン'(vi). '第二・第一レベルドメイン'(via). '第二・第一レベルドメイン'(viaj). '第二・第一レベルドメイン'(viaje). '第二・第一レベルドメイン'(viajes). '第二・第一レベルドメイン'(vn). '第二・第一レベルドメイン'(vo). '第二・第一レベルドメイン'(voy). '第二・第一レベルドメイン'(voya). '第二・第一レベルドメイン'(voyag). '第二・第一レベルドメイン'(voyage). '第二・第一レベルドメイン'(w). '第二・第一レベルドメイン'(wa). '第二・第一レベルドメイン'(wal). '第二・第一レベルドメイン'(wale). '第二・第一レベルドメイン'(wales). '第二・第一レベルドメイン'(we). '第二・第一レベルドメイン'(web). '第二・第一レベルドメイン'('web.'). '第二・第一レベルドメイン'('web.d'). '第二・第一レベルドメイン'('web.do'). '第二・第一レベルドメイン'(wf). '第二・第一レベルドメイン'(wi). '第二・第一レベルドメイン'(wie). '第二・第一レベルドメイン'(wien). '第二・第一レベルドメイン'(win). '第二・第一レベルドメイン'(wine). '第二・第一レベルドメイン'(ws). '第二・第一レベルドメイン'(x). '第二・第一レベルドメイン'(xx). '第二・第一レベルドメイン'(xxx). '第二・第一レベルドメイン'(y). '第二・第一レベルドメイン'(yt). '第二・第一レベルドメイン'('м'). '第二・第一レベルドメイン'('мо'). '第二・第一レベルドメイン'('мос'). '第二・第一レベルドメイン'('моск'). '第二・第一レベルドメイン'('москв'). '第二・第一レベルドメイン'('москва'). '第二・第一レベルドメイン'('р'). '第二・第一レベルドメイン'('рф'). '第二・第一レベルドメイン'('с'). '第二・第一レベルドメイン'('ср'). '第二・第一レベルドメイン'('срб'). '第二・第一レベルドメイン'('香'). '第二・第一レベルドメイン'('香港'). '第二・第一レベルドメイン'('中'). '第二・第一レベルドメイン'('中国'). % 以下のサイトは # 出典:: 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/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/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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/998 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # FizzBuzz問題の要領で、1から100までの整数を、かいぎょう区切りで出力せよ、ただし、 # 3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、 # 数値の代わりに出力することとする # 'FizzBuzz問題の要領で、1から100までの整数を、かいぎょう区切りで出力せよ、ただし、 3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、 数値の代わりに、かいぎょう区切りで出力することとする' :- '1から100までの整数を、'(_整数), '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、数値の代わりに、かいぎょう区切りで出力することとする'(_整数), _整数 = 100. '1から100までの整数を、'(_整数) :- between(1,100,_整数). '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、数値の代わりに、かいぎょう区切りで出力することとする'(_整数) :- '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、該当しない時は数値を'(_整数,_出力値), writef('%t\n',[_出力値]). '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、該当しない時は数値を'(_整数,_出力文字列) :- '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」のどれかが該当したとき'(_整数,_表示ならび), atomic_list_concat(_表示ならび,_表示文字列),!. '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、該当しない時は数値を'(_整数,_整数). '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」のどれかが該当したとき'(_整数,_表示ならび) :- findall(A,( '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」の'(_整数,A)), _表示ならび), どれかが該当したとき(_表示ならび). '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」の'(_整数,A) :- member([_除数,A],[[3,'Fizz'],[5,'Buzz'],[7,hoge]]), 0 is _整数 mod _除数. どれかが該当したとき([_|_]). % 以下のサイトは '10進数2進数変換表示'(_10進数,_2進数ならび,_2進数表示) :- '10進数から2進数ならび'(_10進数,[],_2進数ならび), atomic_list_concat(_2進数ならび,_2進数表示). '10進数から2進数ならび'(0,L,L) :- !. '10進数から2進数ならび'(N,L1,L) :- M is N mod 2, D is N // 2, '10進数から2進数ならび'(D,[M|L1],L). % 以下のサイトは '10進数8進数変換表示'(_10進数,_8進数ならび,_8進数表示) :- '10進数から8進数ならび'(_10進数,[],_8進数ならび), atomic_list_concat(_8進数ならび,_8進数表示). '10進数から8進数ならび'(0,L,L) :- !. '10進数から8進数ならび'(N,L1,L) :- M is N mod 8, D is N // 8, '10進数から8進数ならび'(D,[M|L1],L). % 以下のサイトは '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/609 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 問題1 キーボードから入力した複数個の整数の、加算と積算の計算結果を表示するプログラムを作成しなさい。
ただし、このプログラムは、連続して実行される前半と後半の2部構成で作成してください。 # 0が入力された時点で、入力処理を終了し結果の表示を行ってください。 # すなわち、前半の処理では、キーボードから入力した数値の加算合計の表示を、0が入力されるまで繰返し、後半の処理ではキーボードから入力した数値の積算値の表示を、0が入力されるまで繰返すプログラムを作成してください。 # 【条件】 
前半の「和を求める」繰返しは while 文、後半の「積を求める」繰返しは do-while 文を使用して作成すること。 # 【実行例】
=加算処理= # 
値:6
 # 値:8 # 
値:12
 # 値:0 # 
合計は26です。 # 
=積算処理= # 
値:2 # 
値:6 # 
値:3 # 
値:3 # 
値:0
 # 積算値は108です。 # 問題2 繰返し処理を用いて、m ÷ nの計算をするプログラム(商を求める)を作成しなさい。 
ただし、演算に割り算記号 / を使ってはいけません。また、mとnはキーボードから入力してください。 # 【ヒント】 
・割り算をするとは、mからnを何回引くことができたか?を調べることと等価です 。元の数mが正の間、nを引くことができた回数が、割り算の商となります。 # この回数を、 繰返し処理を使って数えさせてください。 
・繰返し条件は、「mからnを引いた結果が正の値の間」繰り返し、商を1ずつ増やしていきます。 # 負の値になったら、繰返しを終了します。 # '問題1 キーボードから入力した複数個の整数の、加算と積算の計算結果を表示するプログラムを作成しなさい。 ただし、このプログラムは、連続して実行される前半と後半の2部構成で作成してください。 0が入力された時点で、入力処理を終了し結果の表示を行ってください。 すなわち、前半の処理では、キーボードから入力した数値の加算合計の表示を、0が入力されるまで繰返し、 後半の処理ではキーボードから入力した数値の積算値の表示を、0が入力されるまで繰返すプログラムを作成してください。' :- 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数ならび), '前半の処理では、キーボードから入力した数値の加算合計の表示を'(_整数ならび), '後半の処理ではキーボードから入力した数値の積算値の表示を'(_整数ならび). 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数ならび) :- 整数を得る('整数(0の入力で終了)',true,_整数), 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数,_整数ならび). 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(0,[]) :- !. 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数,[_整数|R]) :- 整数を得る('整数(0の入力で終了)',true,_整数_1), 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数_1,R). '前半の処理では、キーボードから入力した数値の加算合計の表示を'(_整数ならび) :- atomic_list_concat(_整数ならび,' + ',_加算対象文字列), atom_to_term(_加算対象文字列,_加算式,_), _加算合計 is _加算式, writef('%t = %t\n',[_加算対象文字列,_加算合計]). '後半の処理ではキーボードから入力した数値の積算値の表示を'(_整数ならび) :- atomic_list_concat(_整数ならび,' * ',_積算対象文字列), atom_to_term(_積算対象文字列,_積算式,_), _数値の積算値 is _積算式, writef('%t = %t\n',[_積算対象文字列,_数値の積算値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/609 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 問題1 キーボードから入力した複数個の整数の、加算と積算の計算結果を表示するプログラムを作成しなさい。
ただし、このプログラムは、連続して実行される前半と後半の2部構成で作成してください。 # 0が入力された時点で、入力処理を終了し結果の表示を行ってください。 # すなわち、前半の処理では、キーボードから入力した数値の加算合計の表示を、0が入力されるまで繰返し、後半の処理ではキーボードから入力した数値の積算値の表示を、0が入力されるまで繰返すプログラムを作成してください。 # 【条件】 
前半の「和を求める」繰返しは while 文、後半の「積を求める」繰返しは do-while 文を使用して作成すること。 # 【実行例】
=加算処理= # 
値:6
 # 値:8 # 
値:12
 # 値:0 # 
合計は26です。 # 
=積算処理= # 
値:2 # 
値:6 # 
値:3 # 
値:3 # 
値:0
 # 積算値は108です。 # 問題2 繰返し処理を用いて、m ÷ nの計算をするプログラム(商を求める)を作成しなさい。 
ただし、演算に割り算記号 / を使ってはいけません。また、mとnはキーボードから入力してください。 # 【ヒント】 
・割り算をするとは、mからnを何回引くことができたか?を調べることと等価です 。元の数mが正の間、nを引くことができた回数が、割り算の商となります。 # この回数を、 繰返し処理を使って数えさせてください。 
・繰返し条件は、「mからnを引いた結果が正の値の間」繰り返し、商を1ずつ増やしていきます。 # 負の値になったら、繰返しを終了します。 # '問題1 キーボードから入力した複数個の整数の、加算と積算の計算結果を表示するプログラムを作成しなさい。 ただし、このプログラムは、連続して実行される前半と後半の2部構成で作成してください。 0が入力された時点で、入力処理を終了し結果の表示を行ってください。 すなわち、前半の処理では、キーボードから入力した数値の加算合計の表示を、0が入力されるまで繰返し、 後半の処理ではキーボードから入力した数値の積算値の表示を、0が入力されるまで繰返すプログラムを作成してください。' :- 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数ならび), '前半の処理では、キーボードから入力した数値の加算合計の表示を'(_整数ならび), '後半の処理ではキーボードから入力した数値の積算値の表示を'(_整数ならび). 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数ならび) :- findall(_整数,( 整数を得る('整数(0の入力で終了)',true,_整数), ( _整数 = 0,!,fail; true)), _整数ならび). '前半の処理では、キーボードから入力した数値の加算合計の表示を'(_整数ならび) :- atomic_list_concat(_整数ならび,' + ',_加算対象文字列), atom_to_term(_加算対象文字列,_加算式,_), _加算合計 is _加算式, writef('%t = %t\n',[_加算対象文字列,_加算合計]). '後半の処理ではキーボードから入力した数値の積算値の表示を'(_整数ならび) :- atomic_list_concat(_整数ならび,' * ',_積算対象文字列), atom_to_term(_積算対象文字列,_積算式,_), _数値の積算値 is _積算式, writef('%t = %t\n',[_積算対象文字列,_数値の積算値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/609 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # 問題1 キーボードから入力した複数個の整数の、加算と積算の計算結果を表示するプログラムを作成しなさい。
ただし、このプログラムは、連続して実行される前半と後半の2部構成で作成してください。 # 0が入力された時点で、入力処理を終了し結果の表示を行ってください。 # すなわち、前半の処理では、キーボードから入力した数値の加算合計の表示を、0が入力されるまで繰返し、後半の処理ではキーボードから入力した数値の積算値の表示を、0が入力されるまで繰返すプログラムを作成してください。 # 【条件】 
前半の「和を求める」繰返しは while 文、後半の「積を求める」繰返しは do-while 文を使用して作成すること。 # 【実行例】
=加算処理= # 
値:6
 # 値:8 # 
値:12
 # 値:0 # 
合計は26です。 # 
=積算処理= # 
値:2 # 
値:6 # 
値:3 # 
値:3 # 
値:0
 # 積算値は108です。 # 問題2 繰返し処理を用いて、m ÷ nの計算をするプログラム(商を求める)を作成しなさい。 
ただし、演算に割り算記号 / を使ってはいけません。また、mとnはキーボードから入力してください。 # 【ヒント】 
・割り算をするとは、mからnを何回引くことができたか?を調べることと等価です 。元の数mが正の間、nを引くことができた回数が、割り算の商となります。 # この回数を、 繰返し処理を使って数えさせてください。 
・繰返し条件は、「mからnを引いた結果が正の値の間」繰り返し、商を1ずつ増やしていきます。 # 負の値になったら、繰返しを終了します。 # '問題1 キーボードから入力した複数個の整数の、加算と積算の計算結果を表示するプログラムを作成しなさい。 ただし、このプログラムは、連続して実行される前半と後半の2部構成で作成してください。 0が入力された時点で、入力処理を終了し結果の表示を行ってください。 すなわち、前半の処理では、キーボードから入力した数値の加算合計の表示を、0が入力されるまで繰返し、 後半の処理ではキーボードから入力した数値の積算値の表示を、0が入力されるまで繰返すプログラムを作成してください。' :- 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数ならび), '前半の処理では、キーボードから入力した数値の加算合計の表示を'(_整数ならび), '後半の処理ではキーボードから入力した数値の積算値の表示を'(_整数ならび). 'キーボードから複数個の整数を入力する(0が入力されるまで繰返す)'(_整数ならび) :- findall(_整数,( 整数を得る('整数(0の入力で終了)',true,_整数), ( _整数 = 0,!,fail; true)), _整数ならび). '前半の処理では、キーボードから入力した数値の加算合計の表示を'(_整数ならび) :- 数値の加算合計(_整数ならび,_加算合計), atomic_list_concat(_整数ならび,' + ',_加算対象文字列表示), writef('%t = %t\n',[_加算対象文字列表示,_加算合計]). 数値の加算合計([],0). 数値の加算合計([N|R],_加算合計) :- 数値の加算合計(R,_加算合計_1), _加算合計 is N + _加算合計_1. '後半の処理ではキーボードから入力した数値の積算値の表示を'(_整数ならび) :- 数値の積算値(_整数ならび,_数値の積算値), atomic_list_concat(_整数ならび,' * ',_積算対象文字列表示), writef('%t = %t\n',[_積算対象文字列表示,_数値の積算値]). 数値の積算値([N],N) :- !. 数値の積算値([N|R],_数値の積算値) :- 数値の積算値(R,_数値の積算値_1), _数値の積算値 is N * _数値の積算値_1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1359210850/199 # # テキストで # 11111 # 22222 # 33333 # 44444 # 55555 # # というのを # # 12345 # 12345 # 12345 # 12345 # 12345 # # という風に90度変更したようにする方法を教えてください # # 'テキストで 11111 22222 33333 44444 55555 というのを 12345 12345 12345 12345 12345 という風に90度変更したようにする方法を教えてください' :- 'テキストで 11111 22222 33333 44444 55555 というのを'(LL1), '12345 12345 12345 12345 12345 という風に90度変更する'(LL1,_転置された文字列). 'テキストで 11111 22222 33333 44444 55555 というのを'(LL) :- split('11111 22222 33333 44444 55555',['\n'],L1), findall(L,( member(_文字列,L1), atom_chars(_文字列,L)), LL). '12345 12345 12345 12345 12345 という風に90度変更する'(LL1,_転置された文字列) :- 転置(LL1,LL2), findall(S,( member(L,LL2), atomic_list_concat(L,S)), L4), atomic_list_concat(L4,'\n',_転置された文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/512 # # [1] 授業単元:C言語基礎実習 # [2] 問題文(含コード&リンク):ある整数 a をその数自身を除く約数をすべて足したときに # その合計の値がaと同じになるとき、その数を和の完全数といいます。 # 512以下の和の完全数を見つけて表示するプログラムを作成しなさい。 # 出力は以下のようにする事。 # 6=1+2+3 # 28=1+2+4+7+14 # ・ # ・ # ・ # # 'ある整数 a をその数自身を除く約数をすべて足したときに その合計の値がaと同じになるとき、その数を和の完全数といいます 512以下の和の完全数を見つけて表示するプログラムを作成しなさい。 出力は以下のようにする事。 6=1+2+3 28=1+2+4+7+14 ・ ・ ・ ' :- between(1,512,_a), 'ある整数 a をその数自身を除く約数をすべて足したときにその合計の値がaと同じになるとき、その数を和の完全数といいます'(_診断,_a,_約数ならび), 完全数を表示する(_診断,_a,_約数ならび), _a = 512,!. 'ある整数 a をその数自身を除く約数をすべて足したときにその合計の値がaと同じになるとき、その数を和の完全数といいます'(和の完全数,_a,_約数ならび), _a_1 is _a - 1, findsum(_約数,( between(1,_a_1,_約数), 0 is _a mod _約数), _a),!. 'ある整数 a をその数自身を除く約数をすべて足したときにその合計の値がaと同じになるとき、その数を和の完全数といいます'(和の完全数ではない,_,_). 完全数を表示する(和の完全数,_a,_約数ならび) :- atomic_list_concat(_約数ならび,' + ',_式表現文字列), writef('%t=%t\n',[_a,_式表現文字列]),!. 完全数を表示する(和の完全数ではない,_,_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/345 # # [1] 授業単元: #     計算機概論 # [2] 問題文(含コード&amp;リンク): #     キーボードから入力された自然数が素数であるかを調べるプログラムを作りなさい。 #     ただし、0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること。 # 'キーボードから入力された自然数が素数であるかを調べるプログラムを作りなさい。 ただし、0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること。' :- 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数), 素数であるかを調べる(_入力された自然数). 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数) :- write('自然数を入力してください : '), get_line(Line), '診断 :: 自然数入力'(Line,_入力された自然数),!. 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数) :- 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数). '診断 :: 自然数入力'(Line,_入力された自然数) :- atom_to_term(Line,_入力された自然数,_), integer(_入力された自然数), _入力された自然数 > 0,!. '診断 :: 自然数入力'(Line,_) :- writef('入力された %t から自然数を得ることができません。再入力をお願いします。\n',[Line]), fail. 素数であるかを調べる(1) :- write('プログラムを終了します\n'),!. 素数であるかを調べる(X) :- ウィルソンの定理による素数判定(X), write('素数です\n'),!. 素数であるかを調べる(_) :- write('素数ではありません\n'). ウィルソンの定理による素数判定(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,N,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/562 # # t_all #  id/groupType/userId # t_groupA #  id/c1/c2/c3 # t_groupB #  id/c1/c2/c3 # # 以上のような3つのテーブルがあって、t_all.groupTypeの値はgroupAまたはgroupBのいずれか # かつ、t_all.userId は t_groupA.id または t_groupB.id のいずれかである構造になっています # # この状況で、t_all.idしかわかっていない時に最短で # t_all.groupType、t_all.userId と、それに付随するt_groupAの全カラムまたはt_groupBの全カラムを # 取得するにはどういうクエリ文を書いたら良いでしょうか? # # select t_all.groupType, t_all.userId from t_all where t_all.id = $id; # として、その返り値のgroupTypeとuserIdを元にif文で分けてもう一度グループのテーブルにselectをするしかないですか? # よろしくお願いします。環境はmysql5.5です # # 't_all  id/groupType/userId t_groupA  id/c1/c2/c3 t_groupB  id/c1/c2/c3 以上のような3つのテーブルがあって、t_all.groupTypeの値はgroupAまたはgroupBのいずれか かつ、t_all.userId は t_groupA.id または t_groupB.id のいずれかである構造になっています この状況で、t_all.idしかわかっていない時に最短で t_all.groupType、t_all.userId と、それに付随するt_groupAの全カラムまたはt_groupBの全カラムを 取得するにはどういうクエリ文を書いたら良いでしょうか?'(_id,_goupType,_userId,_c1,_c2,_c3) :- t_all(_id,_groupType,_userId), atomic_list_concat(['t_',_groupType],_t_groupType), list_call([_t_groupType,_userId,_c1,_c2,_c3]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/281 # # [1] 授業単元: プログラミング論 # [2] 問題文(含コード&リンク): # # 次のA・Bの行列をA×Bの計算をして、その結果を表示するプログラムを作成しなさい。 # # A=[5 3] B=[7 1 5 4] #   [3 8]     [1 9 2 8] #   [1 6] #   [9 1] # # 解の表示) [38 32 31 44] #       [29 75 31 76] #       [13 55 17 52] #       [64 18 47 44] # # '次のA・Bの行列をA×Bの計算をして、その結果を表示するプログラムを作成しなさい。 A=[5 3]   [3 8]   [1 6]   [9 1] B=[7 1 5 4]   [1 9 2 8] 解の表示) [38 32 31 44]       [29 75 31 76]       [13 55 17 52]       [64 18 47 44]'(_A, _B,_その結果) :- '次のA・Bの行列をA×Bの計算をして、'('A=[5 3]   [3 8]   [1 6]   [9 1] B=[7 1 5 4]   [1 9 2 8] ',_その結果), その結果を表示する(_その結果). '次のA・Bの行列をA×Bの計算をして、'(_文字列,_その結果) :- '次のA・Bの行列を'(_文字列,_A,_B), 転置(_B,_B_2), 行列の掛け算_1(_A,_B_2,_その結果). '次のA・Bの行列を'(_文字列,_A,_B) :- split(_文字列,[' ',' ','[',']'],L), '次のA・Bの行列を'(L,_A,_B). '次のA・Bの行列を'([A,=|R1],L2,L3) :- 'Aの行列'(R1,L2,R), 'Bの行列'(R,L3). 'Aの行列'([B,=|R1],[],[B,=|R1]) :- !. 'Aの行列'(L1,[L|R2],R) :- 'Aの行'(L,L1,R1), 'Aの行列'(R1,R2,R). 'Aの行'(['\n'|R],[],R). 'Aの行'([N|R1],[N|R2],R) :- 'Aの行'(R1,R2,R). 'Bの行列を'([B,=|R1],LL) :- 'Bの行列'(R1,LL). 'Bの行列'([],[]) :- !. 'Bの行列'(L1,[L|R2]) :- 'Bの行'(L1,L,R1), 'Bの行列'(R1,R2). 'Bの行'(['\n'|R],[],R). 'Bの行'([N|R1],[N|R2],R) :- 'Bの行'(R1,R2,R). その結果を表示する(_その結果) :- append(_,[L|R],_その結果), atomic_list_concat(L,' ',_行表示), writef('\t[%t]\n',[_行表示]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/281 # # [1] 授業単元: プログラミング論 # [2] 問題文(含コード&リンク): # # 次のA・Bの行列をA×Bの計算をして、その結果を表示するプログラムを作成しなさい。 # # A=[5 3] B=[7 1 5 4] #   [3 8]     [1 9 2 8] #   [1 6] #   [9 1] # # 解の表示) [38 32 31 44] #       [29 75 31 76] #       [13 55 17 52] #       [64 18 47 44] # # '次のA・Bの行列をA×Bの計算をして、その結果を表示する'(_A, _B,_その結果) :- '次のA・Bの行列をA×Bの計算をして、'(_A, _B,_その結果), その結果を表示する(_その結果). '次のA・Bの行列をA×Bの計算をして、'(_A, _B,_その結果) :- _A = [[5,3],[3,8],[1,6],[9,1]], _B = [[7,1,5,4],[1,9,2,8]], 転置(_B,_B_2), 行列の掛け算_1(_A,_B_2,_その結果). その結果を表示する(_その結果) :- append(_,[L|R],_その結果), atomic_list_concat(L,' ',_行表示), writef('\t[%t]\n',[_行表示]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/227 # # [1] 授業単元: 配列の整列 # [2] 問題文(含コード&リンク):字数超えてしまったのでリンク張ります。 # [ http://ime.nu/codepad.org/YCoV3saL ] # # /* # # 2次元配列の整列 # # ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 # # | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | # # これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) # 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合計点で照準に整列して表示する(整列後)。 # # 【実行例】 # # 整列前 # 番号 問1  問2 問3 問4 問5 合計 # 1001 20 30 49 41 90 230 # 1002 50 30 24 0 95 199 # 1003 20 33 55 35 90 233 # 1004 93 55 56 61 90 355 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1025 80 90 52 50 91 363 # 合計 1145 1015 1297 978 2292 # # 整列後 # 番号 問5  問3 問1 問2 問4 合計 # 1025 91 52 80 90 50 363 # 1004 90 56 93 55 61 355 # 1003 90 50 94 50 49 233 # 1004 100 49 70 30 62 311 #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ #  ・    ・  ・  ・   ・    ・   ・ # 1015 90 53 20 20 0 183 # 合計 2292 1297 1145 1015 978 # # ※実行例が長くなってしまうので途中省略しています。 # # */ 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。 | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前) 次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。' :- 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1), '学生ごとの合格点と、問ごと合計点を求めて表示する'(LL1,LL2), '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(LL2). 'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1) :- get_split_lines('seiseki.dat',[' '],LL1). '学生ごとの合格点と、問ごと合計点を求めて表示する'(LL1,LL2) :- '行列を列の合計で降順に整列して列位置を交換し(LL1,LL2), 問いごとの合計を表示する(LL2). 列の合計で降順に整列して列位置を交換し(LL,LL1) :- 転置(LL,_転置されたLL), findall([_合計,_nth1|L],( nth1(_nth1,_転置されたLL,L), sum(L,_合計)), _転置され合計を付加されたLL), 降順バブルソート(_転置され合計と列位置が付加されたLL,_降順に整列された転置され合計と列位置が付加されたLL), 転置(_降順に整列された転置され合計と列位置が付加されたLL,LL1). 問いごとの合計を表示する(LL2) :- between(1,6,_nth), nth0(_nth,LL2,[_合計|_]), atomic_list_concat([問,_nth,' = ',_合計],S), writef(' %t,',[S]), _nth = 6, write('\n'). '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(LL1) :- 列の合計で降順に整列して列位置を交換し(LL1,LL2), 行合計で降順に整列する(LL2,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL), 表示する(_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL). 行合計で降順に整列する(LL1,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL) :- findall([_合計|L2],( member(L,LL1), 要素の合計を最終要素に付加(L,_合計,L2)), LL2), 降順バブルソート(LL2,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL). 要素の合計を最終要素に付加(L1,_合計,L2) :- 要素の合計を最終要素に付加(L1,0,_合計,L2). 要素の合計を最終要素に付加([],_合計,_合計,[_合計]). 要素の合計を最終要素に付加([N|R1],_合計_1,_合計,[N|R2]) :- _合計_2 is _合計 + N, 要素の合計を最終要素に付加(R1,_合計_2,_合計,R2). 表示する(LL2) :- 最終見出しを得る(LL2,_見出し), writef('%t\n',[_見出し]), 行列部分の表示(LL2), 最終合計の表示(LL2). 行列部分の表示(LL) :- append(_,[[_|L]|R],LL), writef('%5l%5r%5r%5r%5r%5r%5r\n',L), R = []. 最終合計の表示([_最終合計ならび|_]) :- writef(' %5r%5r%5r%5r%5r%5r\n',_最終合計ならび). 合計点の表示(_順位づけられた合計点ならび) :- findall(_合計点,( member([_合計点,_],_順位づけられた合計点ならび)), _合計点ならび), writef(' %5r%5r%5r%5r%5r%5r\n',_合計点ならび). 最終見出しを得る([_,L|_],_最終見出し) :- findall(S,( member(N,L), atomic_list_concat(['問',_nth1,' '],S)), L), atomic_list_concat(['番号 '|L],_最終見出し). 降順バブルソート(L1,L2) :- append(L0,[A,B|R],L1), A @< B, append(L0,[B,A|R],L3), 降順バブルソート(L3,L2),!. 降順バブルソート(L,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/186 # # [1] 授業単元: プログラミングB # [2] 問題文(含コード&リンク):入力された文字列を2進数の文字列として #               解釈し、10進数に変換し画面出力しなさい。 #               入力にはライブラリ関数putcharを使用すること。 #               Enterキーのみが押された場合、エラーを表示し、再入力する。 #               0,1以外の文字が入力された場合、エラーを表示し、再入力する。   # # [3] 環境 #  [3.1] OS:Windows7 #  [3.2] コンパイラ名とバージョン: Borland C++ 5.5.1 #  [3.3] 言語:C言語 # [4] 期限: 2013/01/23 '入力された文字列を2進数の文字列として解釈し、10進数に変換し画面出力しなさい。 入力にはライブラリ関数putcharを使用すること。 Enterキーのみが押された場合、エラーを表示し、再入力する。 0,1以外の文字が入力された場合、エラーを表示し、再入力する。' :- '入力された文字列を(Enterキーのみが押された場合、エラーを表示し、再入力する。0,1以外の文字が入力された場合、エラーを表示し、再入力する。)' (_入力された文字列), '2進数の文字列として解釈し、10進数に変換し'(_入力された文字列,_10進数), 画面に出力する(_入力された文字列,_10進数). '入力された文字列を(Enterキーのみが押された場合、エラーを表示し、再入力する。0,1以外の文字が入力された場合、エラーを表示し、再入力する。)'(_入力された文字列) :- write('2進数文字列を入力してください : '), get_line(_入力された文字列), '診断 :: 入力された文字列を'(_入力された文字列),!. '入力された文字列を(Enterキーのみが押された場合、エラーを表示し、再入力する。0,1以外の文字が入力された場合、エラーを表示し、再入力する。)'(_入力された文字列) :- '入力された文字列を(Enterキーのみが押された場合、エラーを表示し、再入力する。0,1以外の文字が入力された場合、エラーを表示し、再入力する。)'(_入力された文字列). '診断 :: 入力された文字列を'('') :- 'Enterキーのみが押された場合、エラーを表示し、再入力する。',!,fail. '診断 :: 入力された文字列を'(_入力された文字列) :- '0,1以外の文字が入力された場合、エラーを表示し、再入力する。'(_入力された文字列), !,fail. '診断 :: 入力された文字列を'(_). 'Enterキーのみが押された場合、エラーを表示し、再入力する。' :- write('エラー :: 文字列が入力されていません\n'). '0,1以外の文字が入力された場合、エラーを表示し、再入力する。'(_入力された文字列) :- sub_atom(_入力された文字列,_,1,_,_文字), \+(_文字 = '0'), \+(_文字 = '1'), write('エラー :: 0,1以外の文字が入力されました\n'), !,fail. '2進数の文字列として解釈し、10進数に変換し'(_入力された文字列,_10進数) :- atomic_list_concat(['0b',_入力された文字列],_2進数を表す文字列), atom_number(_2進数を表す文字列,_10進数). 画面に出力する(_入力された文字列,_10進数) :- writef('入力された文字列: %t 変換された10進数: %t\n',[_入力された文字列,_10進数]). % 以下のサイトは yes. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/158 # # [1] 授業単元: プログラミング 〜構造体〜 # [2] 問題文(含コード&リンク): 3名の名前と性別、10桁の会員番号を入力し表示せよ # *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ # 入力(1234567890)→出力(12-3456-7890) # *入力された会員番号が10桁に満たない場合、 # または大きい場合は再度入力する指示を入れること # '3名の名前と性別、10桁の会員番号を入力し表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890) *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること' :- '3名の名前と性別、10桁の会員番号を入力し *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_3名の名前と性別と会員番号), '表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890)'(_3名の名前と性別と会員番号). '3名の名前と性別、10桁の会員番号を入力し *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_3名の名前と性別と会員番号) :- findall([_名前,_性別,_会員番号],( between(1,3,_), 名前を得る(_名前), 性別を得る(_性別), '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号)), _3名の名前と性別と会員番号). 名前を得る(_名前) :- write('名前を入力してください : '), get_line(_名前). 性別を得る(_性別) :- 整数を得る('性別を番号で入力してください 1..男 2..女\n',between(1,2,_性別番号),_性別番号), 性別番号から性別を得る(_性別番号,_性別). 性別番号から性別を得る(1,男). 性別番号から性別を得る(2,女). '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号) :- write('会員番号(数字10桁)を入力してください : '), get_line(Line), '診断:: 会員番号を得る'(Line,_会員番号),!. '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号) :- '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号). '診断:: 会員番号を得る'(Line,_会員番号) :- atom_chars(Line,Chars), 会員番号は数字のみで入力し(Chars), '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars),!. '診断:: 会員番号を得る'(Line,_会員番号) :- write('再入力をお願いします\n'), fail. 会員番号は数字のみで入力し(Chars) :- forall((member(A,Chars), member(A,['0','1','2','3','4','5','6','7','8','9'])),true),!. 会員番号は数字のみで入力し(Chars) :- writef('入力された文字列 %t には数字以外の文字が混入しています\n',[Chars]), fail. '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars) :- length(Chars,10),!. '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars) :- writef('入力された文字列 %t は10桁でありません\n',[Chars]), fail. '表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890)'(_3名の名前と性別と会員番号) :- append(_,[[_名前,_性別,_会員番号]|R],_3名の名前と性別と会員番号), number_chars(_会員番号,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), atomic_list_concat([[_1,_2,-,_3,_4,_5,_6,-,_7,_8,_9,_10],_会員表示文字列), writef('名前: %t\n性別: %t\n会員番号: %t\n\n',[_会員番号表示文字列]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/78 # # [1] 授業単元:C言語 # [2] 問題 http://ime.nu/codepad.org/yV0KrZox # # 問題2 # 以下2つの3行3列の行列の和を求め、表示するプログラムを、配列を用いて作成しなさい。 # ---------------------------------------------------------------------- # A = # 8 6 9 # 1 5 2 # 2 5 5 # B = # 3 2 3 # 8 6 7 # 2 5 1 # A + B = # 11 8 12 # 9 11 9 # 4 10 6 # --------------------------------------------------------------------- '2つの3行3列の行列の和を求め、表示する'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]) :- '2つの3行3列の行列の和を求め、'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]), 表示する([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]). '2つの3行3列の行列の和を求め、'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]) :- _C_1_1 is _A_1_1 + _B_1_1, _C_1_2 is _A_1_2 + _B_1_2, _C_1_3 is _A_1_3 + _B_1_3, _C_2_1 is _A_2_1 + _B_2_1, _C_2_2 is _A_2_2 + _B_2_2, _C_2_3 is _A_2_3 + _B_2_3, _C_3_1 is _A_3_1 + _B_3_1, _C_3_2 is _A_3_2 + _B_3_2, _C_3_3 is _A_3_3 + _B_3_3. 表示する([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]) :- 'A行列の表示'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]), 'B行列の表示'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]), 'A+B行列の表示'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]). 'A行列の表示'([[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]) :- write('A =\n'), append(_,[[_A_1,_A_2,_A_3]|R],[[_A_1_1,_A_1_2,_A_1_3],[_A_2_1,_A_2_2,_A_2_3],[_A_3_1,_A_3_2,_A_3_3]]), atomic_list_concat([_A_1,_A_2,_A_3],' ',S), writef('%t\n',[S]), R = []. 'B行列の表示'([[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]]) :- write('B =\n'), append(_,[[_B_1,_B_2,_B_3]|R],[[_B_1_1,_B_1_2,_B_1_3],[_B_2_1,_B_2_2,_B_2_3],[_B_3_1,_B_3_2,_B_3_3]]), atomic_list_concat([_B_1,_B_2,_B_3],' ',S), writef('%t\n',[S]), R = []. 'A+B行列の表示'([[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]) :- write('A + B =\n'), append(_,[[_C_1,_C_2,_C_3]|R],[[_C_1_1,_C_1_2,_C_1_3],[_C_2_1,_C_2_2,_C_2_3],[_C_3_1,_C_3_2,_C_3_3]]), atomic_list_concat([_C_1,_C_2,_C_3],' ',S), writef('%t\n',[S]), R = []. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの3行3列の行列の和を求め、表示する'(_A,_B,_行列の和) :- すべての同一位置の要素の和を求める(_A,_B,_行列の和), 表示する([['A',_A],['B',_B],['A + B',_行列の和]]). すべての同一位置の要素の和を求める(_A,_B,_行列の和) :- findall(_同一列の和ならび,( nth1(_nth1,_A,_行_A), nth1(_nth1,_B,_行_B), 同一列の和を求める(_行_A,_行_B,_同一列の和ならび)), _行列の和). 同一列の和を求める(_行_A,_行_B,_同一列の和ならび) :- findall(_列の和,( nth1(_nth1,_行_A,_列の値_1), nth1(_nth1,_行_B,_列の値_2), _列の和 is _列の値_1 + _列の値_2), _同一列の和ならび). 表示する(LL) :- append(_,[_行列のシンボル,_行列]|R],LL), writef('%t =\n',[_行列のシンボル]), 行列の表示(_行列), R = []. 行列の表示(_行列) :- append(_,[[_行_1,_行_2,_行_3]|R_1],_行列), atomic_list_concat([_行_1,_行_2,_行_3],' ',_行表示), writef('%t\n,[_行表示]), R = [],!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/78 # # [1] 授業単元:C言語 # [2] 問題 http://ime.nu/codepad.org/yV0KrZox # # 問題1 # 5個の整数を次々に入力して、一元配列に格納し、その平均を計算するプログラムを作成しなさい。 # ------------------------------------------------------------------- # 整数1:40 # 整数2:35 # 整数3:28 # 整数4:15 # 整数5:16 # 平均は26.8000です # --------------------------------------------------------------------- # '5個の整数を次々に入力して、一元配列に格納し、その平均を計算する' :- '5個の整数を次々に入力して、一元配列に格納し、'(_一次元配列), その平均を計算する(_一次元配列,_その平均). '5個の整数を次々に入力して、一元配列に格納し、'(_一次元配列) :- findall(_整数,( between(1,5,N), atomic_list_concat([整数,N,': '],_催促), writef('%t',[_催促]), 整数を得る(_整数)), _一次元配列). その平均を計算する(_一次元配列,_その平均) :- findavg(_値,( member(_値,_一次元配列)), _その平均), writef('平均は%tです\n',[_その平均]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/33 # # [1] 授業単元: リスト処理 # [2] 問題文(含コード&) http://codepad.org/3DdhcBUM # # /* # # seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 # また、整列する際に要素どうしを比較した回数も表示しなさい。 # # 【実行例】 # # 番号 氏名      得点 # 1021 Machida Masato 100 # 1017 Nonaka Fujio 98 # 1011 Suzuki kenichi 93 # 1019 Fujimoto Kaoru 92 # 1006 kato Ichiro 91 # ・ ・     ・ # ・ ・     ・ # ・ ・     ・ # 1020 Hoshi Izumi 32 # 整列の為の比較回数=132回 # # ※長いので実行結果は途中省略しています。 # ※比較回数はコードによって異なる場合があります。 # # */ 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 また、整列する際に要素どうしを比較した回数も表示しなさい。' :- 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび), リスト処理による挿入法で得点の降順に整列して(_生徒ならび,[],_整列済み生徒ならび,0,_比較回数), 表示しなさい(_整列済み生徒ならび,_比較回数). 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび) :- get_split_lines('seito.dat',[' '],_生徒ならび). リスト処理による挿入法で得点の降順に整列して([[_学籍番号,_姓,_名,_得点]|R1],L1,_整列済み生徒ならび,_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,L1,L2,_比較回数_1,_比較回数_2), リスト処理による挿入法で得点の降順に整列して(R1,L2,_整列済み生徒ならび,_比較回数_2,_比較回数),!. リスト処理による挿入法で得点の降順に整列して([],_整列済み生徒ならび,_整列済み生徒ならび,_比較回数,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],[[_学籍番号,_名,_名,_得点],[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],_比較回数_1,_比較回数) :- 比較回数 is _比較回数_1 + 1, _得点 >= _得点_1,!. 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R1],[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R2],_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,R1,R2,_比較回数_1,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[],[[_学籍番号,_名,_名,_得点]],_比較回数,_比較回数) :- !. 表示しなさい(_整列済み生徒ならび,_比較回数) :- 見出しの表示, append(_,[[_学籍番号,_姓,_名,_得点]|R],_整列済み生徒ならび), 整形して表示する(_学籍番号,_姓,_名,_得点), R = [], writef('整列の為の比較回数=%t回\n',[_比較回数]). 見出しの表示 :- write('番号 氏名      得点\n'). 整形して表示する(_学籍番号,_姓,_名,_得点) :- 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列), 得点を頭部空白3桁に(_得点,_得点文字列), atomic_list_concat([_学籍番号,_姓文字列,_名文字列,_得点文字列],' ',_表示文字列), writef('%t\n',[_表示文字列]). 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列) :- '8桁に'(_姓,_姓文字列), '8桁に'(_名,_名文字列). '8桁に'(_項,_8桁文字列) :- atom_chars(_項,Chars_1), length(L,8), append(L1,L2,L), all(L2,' '), atom_chars(_8桁文字列,L). 得点を頭部空白3桁に(_得点,_得点文字列) :- number_chars(_得点,Chars), length(L,3), append(L0,Chars,L), all(L0,' '), atom_chars(_得点文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,( member(A,Lines1), split(A,Sep,Line)), Lines). get_lines(Instream,end_of_file,_,_,[]) :-!. get_lines(Instream,S,[],_終了検索対象ならび,[S]) :- member(A,_終了検索対象ならび), 検索(S,A),!. get_lines(Instream,S,[],[],[S|R]) :- get_line(Instream,S2), get_lines(Instream,S2,[],[],R),!. get_lines(Instream,S,[],_終了検索対象ならび,[S|R]) :- member(A,_終了検索対象ならび), \+(検索(S,A)), get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), member(B,_終了検索対象ならび), 検索(S,B),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S|R]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), !, get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,_,_開始検索対象ならび,_終了検索対象ならび,X) :- get_line(Instream,S2), get_lines(Instream,S2,_開始検索対象ならび,_終了検索対象ならび,X),!. get_lines(_ファイル,_スタート行,_最終行,X) :- integer(_スタート行), integer(_最終行), 行位置指定選択(_ファイル,_スタート行,_最終行,X). get_lines(_ファイル,_開始検索対象ならび,_終了検索対象ならび,X) :- \+(integer(_開始検索対象ならび)), \+(integer(_終了検索対象ならび)), open(_ファイル,read,Instream), get_line(Instream,S), get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,X), close(Instream),!. get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat, get_line(user_input,Line), (Line = end_of_file , (!) , fail ; true)), Lines). get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_chars(Instream,end_of_file,[]) :- !. get_chars(Instream,_,[]) :- at_end_of_stream(Instream),!. get_chars(Instream,X,[X|R]) :- get_char(Instream,Y), get_chars(Instream,Y,R) . get_chars(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), exists_file(File_1), open(File_1,read,Instream), get_char(Instream,X), get_chars(Instream,X,L), close(Instream),!. get_chars(Instream,L) :- is_stream(_,Instream,_), get_char(Instream,X), get_chars(Instream,X,L),!. get_chars(L) :- findall(U,( repeat, get_char(U), (U = end_of_file , (!) , fail ; true)), L). get_line(X) :- get_line(user_input,X). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,_,[]) :- at_end_of_stream(Instream),!. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). chars_lines([],[],[]) :- !. chars_lines(['\r'],[],[]) :- !. chars_lines(['\r',A|R],[],[A|R]) :- \+(A = '\n'),!. chars_lines(['\r','\n'|R],[],R) :- !. chars_lines(['\n'|R],[],R) :- !. chars_lines([A|R1],[A|R2],Z) :- chars_lines(R1,R2,Z). chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R), atomic_list_concat(U,A), chars_lines(R,R2). split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y) , \+(member(U,_区切り符号ならび))), Z), Z = X,!. split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび) , atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), C number Nl,!. split_5(B,C) :- atomic_list_concat(B,C),!. all([],_). all([V|R],V) :- all(R,V). 検索(_文字列,_副文字列) :- atom_length(_文字列,_文字列の文字数), atom_length(_副文字列,_副文字列の文字数), Max is _文字列の文字数 - _副文字列の文字数, between(0,Max,N), sub_atom(_文字列,N,_副文字列の文字数,_副文字列),!. 行位置指定選択(_ファイル,_選択先頭行,_選択最終行,X) :- wc(_ファイル,[[_行,_,_,_]]), _行数_1 is _行 - _選択先頭行 + 1, _行数_2 is _選択最終行 - _選択先頭行, atomic_list_concat(['tail -',_行数_1,' ',_ファイル,' | head -',_行数_2],S), shs(S,X). wc(F,X) :- exists_file(F1), atomic_list_concat(['wc ',F1],S), sh(S,X),!. wc(F,X) :- atomic_list_concat([F,' | wc'],S), sh(S,X),!. sh(Command,X) :- shs(Command,Y), findall(U,(member(V,Y) , make_list(V,[' ',','],U)),X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,_,[]) :- at_end_of_stream(Instream),!. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/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/987 # # [1] プログラミング # [2] 数字を収納する # # Cでお願いします。コンソールです # ある数字を一文字入力し、そしてenter。 # 次に、その前に打った数だけランダムな数字を空白をはさんで打ち込む。そしてエンター # # 例 # 6 (エンター # 4 23 1 4 5 3 (エンター # # みたいなかんじです # # そしてこれを X[i] にi=1から順に空白を飛ばして入れていくってかんじです。 そんでX[1]=4 X[2]=23 ・・・  # みたいに入ればいいです # 文字列ではなく数字で収納したいです # # お願いします 'ある数字を一文字入力し、そしてenter。次に、その前に打った数だけランダムな数字を空白をはさんで打ち込む。そしてエンター'([N|_数値ならび]) :- 整数を得る(N), findall(_数値,( between(1,N,_), '空白または改行が来るまでが数値だ'(_数値)), _数値ならび). '空白または改行が来るまでが数値だ'(_数値) :- get_char(_文字), '空白または改行が来るまで'(_文字,_文字ならび), atomic_list_concat(文字ならび,_文字列), atom_number(_文字列,_数値). '空白または改行が来るまで'(' ',[]) :- !. '空白または改行が来るまで'('\n',[]) :- !. '空白または改行が来るまで'(A,[A|R]) :- get_char(B), '空白または改行が来るまで'(B,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/984 # # [1] 授業単元:プログラミング応用 # [2] 問題文(含コード&リンク):西暦を年号に変換するプログラムを作成する。 # ただし、入力できるのは、1868年以降からであり、2008年以降も平成とする。 # 明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。 # 下記を参考にプログラムを作成しなさい。 # int gannen[]={1989, 1926, 1912, 1868}; # char nengou[][8]={"heisei", "syouwa", "taisyou", "meiji"}; # '西暦を年号に変換するプログラムを作成する。 ただし、入力できるのは、1868年以降からであり、2008年以降も平成とする。 明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。'(_西暦,_年号) :- 'ただし、入力できるのは、1868年以降からであり、'(_西暦), '明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。'(_元号ならび,_元年の西暦ならび), 西暦を年号に変換する(_西暦,_元号ならび,_元年の西暦ならび,_年号). 'ただし、入力できるのは、1868年以降からであり、'(_西暦) :- _西暦 >= 1968. '明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。'([明治,大正,昭和,平成],[1868,1912,1926,1989]). 西暦を年号に変換する(_西暦,_元号ならび,_元年の西暦ならび,_年号) :- 西暦から元号と元年の西暦を得る(_西暦,_元号ならび,_元年の西暦ならび,_元号,_元年の西暦), N is _西暦 - _元年の西暦 + 1, 和年表現(N,_和年), atomic_list_concat([_元号,_和年],_年号). 西暦から元号と元年の西暦を得る(_西暦,_元号ならび,_元年の西暦ならび,_元号,_元年の西暦) :- nth0(_nth0,_元年の西暦ならび,_次の元号の元年の西暦), _次の元号の元年の西暦 > _西暦, nth1(_nth0,_元号ならび,_元号), nth1(_nth0,_元年の西暦ならび,_元年の西暦),!. 和年表現(N,_和年) :- '二十未満の和年表現'(N,_和年),!. 和年表現(N,_和年) :- '二十以上の和年表現'(N,_和年),!. '二十未満の和年表現'(N,_和年) :- N > 0, N < 20, nth0(N,['',元年,二年,三年,四年,五年,六年,七年,八年,九年,十年,十一年,十二年,十三年,十四年,十五年,十六年,十七年,十八年,十九年],_和年),!. '二十以上の和年表現'(N,_和年) :- N >= 20, '二十以上の十の位、一の位'(N,_十の位,_一の位), atomic_list_concat([_十の位,十,_一の位,年],_和年),!. '二十以上の十の位、一の位'(N,_十の位,_一の位) :- N_1 is N // 10, N_2 is N mod 10, nth0(N_1,['',一,二,三,四,五,六,七,八,九],_十の位), nth0(N_2,['',一,二,三,四,五,六,七,八,九],_一の位),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/717 # # [1] 授業単元: C演習 # [2] 問題文(含コード&リンク): # (問題文)http://imgur.com/bAeG1 # (途中まで書いたコード)://codepad.org/nwwt2hgU # (使用するテキストファイル、結果含む) # http://s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/joyful.cgi? のNo.396 # :- dynamic(転置索引/2). テキストのダウンロード(_サイトファイル名,_出力ファイル名) :- atomic_list_concat(['w3m -dump ',_サイトのファイル名],S), popen(S,Chars), open(_出力ファイル名,write,Outstream), ファイルに書き込む(Outstream,Chars), close(Outstream). ファイルに書き込む(Outstream,[]). ファイルに書き込む(Outstream,[C|R]) :- put_char(Outstream,C), ファイルに書き込む(Outstream,R). 転置索引を作る(_ファイル名) :- open(_ファイル名,read,Instream), ストリームから転置索引を作る(Instream,0), close(Instream). ストリームから転置索引を作る(Instream,_) :- at_end_of_stream(Instream),!. ストリームから転置索引を作る(Instream,N) :- get_line(Instream,Line), N_2 is N + 1, 語彙を転置索引に登録する(Line,N), ストリームから転置索引を作る(Instream,N_2). 語彙を転置索引に登録する(Line,N) :- split(Line,[' ',',','.',':','(',')'],L), member(_語彙,L), \+(転置索引(_語彙,N)), assertz(転置索引(_語彙,N)), fail. 語彙を転置索引に登録する(_,_). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). % 以下のサイトは # 出典:: 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/1355011916/198 # # phpですがwebじゃないので、こちらで質問させて下さい # 趣味でプログラムをはじめて半年程度です # # 競馬のデータ処理をやっています # 数字と記号の混ざった文字列の数字部分を置き換えたいのですが # どうすればいいでしょうか? # # 具体的には、各馬の各コーナーの通過順位を以下のように馬番から着順に置き換えたいのです # (2,*15,14,5)(9,12,16)(8,3,6)-(10,13)(11,4)(7,1) *各馬の各コーナー通過順位 馬番表示 ←コレを # (10,*16,1,2)(8,4,6)(9,3,7)-(15,14)(11,13)(5,12) *各馬の各コーナー通過順位 着順表示 こうしたい # # # 現在データは、以下のようになっています # # 各馬の各コーナー通過順位 馬番表示は $corner *先週の朝日杯の3コーナー # (2,*15,14,5)(9,12,16)(8,3,6)-(10,13)(11,4)(7,1) # # 馬番は $umban # Array ( [0] => 14 [1] => 15 [2] => 2 [3] => 5 [4] => 9 [5] => 12 [6] => 16 [7] => 3 [8] => 8 [9] => 6 [10] => 10 [11] => 13 [12] => 4 [13] => 11 [14] => 7 [15] => 1 ) # # 着順は $tyaku # Array ( [0] => 1 [1] => 16 [2] => 10 [3] => 2 [4] => 8 [5] => 4 [6] => 6 [7] => 3 [8] => 9 [9] => 7 [10] => 15 [11] => 14 [12] => 13 [13] => 11 [14] => 5 [15] => 12 ) # # $umbanと$tyakuの相関性は、[0]は14番で1着、[1]は15番で16着、[2]は2番で10着、、etcとなっています # # phpです、宜しくお願いします *分割で見にくくなってしまいすいません # # # 11R 第64回 朝日杯フューチュリティステークス(GI)成績 # # サラ系2歳,1600m,芝・右 外 # (国際)牡・牝(指定)オープン,馬齢 # 本,賞,金,:,7000,、,2800,、,1800,、,1100,、,700,万円 # 付加賞金,:,121.8,、,34.8,、,17.4,万円 # 発走 15:25 # 天候:晴   芝:良 # :- op(400,xfx,':'). コーナー通過時の先頭からの各馬の最終到達順位(_レース,_通過時文字列,_到達順位に置換した通過時文字列) :- sPLIT(_通過時文字列,['(','-','=','*',')'],L1), 馬番を最終到達順位に変換(_レース,L1,L2), atomic_list_concat(L2,_到達順に置換した通過時順位). 馬番を最終到達順位に変換(_レース,[],[]). 馬番を最終到達順位に変換(_レース,[_馬番|R1],[_着順|R2]) :- integer(_馬番), レース成績(_レース,_着順,_馬番,_馬名,_性齢,_負担重量,_騎手,_タイム,_着差,_推定上り,_馬体重,_調教師,_単勝人気), 馬番を最終到達順位に変換(_レース,R1,R2). 馬番を最終到達順位に変換(_レース,[A|R1],[A|R2]) :- \+(integer(A)), 馬番を最終到達順位に変換(_レース,R1,R2). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',1,14, ロゴタイプ,牡2,55.0, M.デムーロ,1:33.4,'',36.1,482,-4, 田中剛,7). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',2,5, コディーノ,牡2,55.0, 横山典弘,1:33.4,クビ,36.0,476,+2, 藤沢和雄,1). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',3,3, ゴットフリート,牡2,55.0, C.スミヨン,1:33.8,2+1/2,36.0,470,+2, 斎藤誠,3). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',4,12, フラムドグロワール,牡2,55.0, C.ウィリアムズ,1:33.9,3/4,36.3,490, 0, 藤沢和雄,5). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',5,7, ティーハーフ,牡2,55.0, 武豊,1:33.9,クビ,35.5,436,-2, 西浦勝一,6). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',6,16, ノウレッジ,牡2,55.0, 蛯名正義,1:34.0,クビ,36.4,490,+2, 二ノ宮敬宇,10). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',7,6, ラブリーデイ,牡2,55.0, C.ルメール,1:34.0,クビ,36.2,472,-2, 池江泰寿,4). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',8,9,エーシントップ,牡2,55.0, 浜中俊,1:34.1,クビ,36.6,532,-2, 西園正都,2). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',9,8, クラウンレガーロ,牡2,55.0, 幸英明,1:34.1,ハナ,36.3,456,+12, 日吉正和,8). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',10, 2, ネオウィズダム,牡2,55.0, 柴田善臣,1:34.2,1/2,36.8,484,+2, 矢作芳人,12). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',11, 11, アットウィル,牡2,55.0, 岩田康誠,1:34.2,クビ,36.0,482,-2, 領家政蔵,13). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',12, 1, ザラストロ,牡2,55.0, 松岡正海,1:34.3,クビ,35.8,492,+4, 武藤善則,11). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',13, 4, テイエムイナズマ,牡2,55.0, 池添謙一,1:34.5,1+1/2,36.3,510,+10, 福島信晴,9). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',14, 13, ディアセルヴィス,牡2,55.0, 勝浦正樹,1:34.6,3/4,36.5,454,+4, 高橋裕,16). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',15, 10, ワキノブレイブ,牡2,55.0, 福永祐一,1:34.7,クビ,36.6,468,+6, 清水久詞,15). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',16, 15,マイネルエテルネル,牡2,55.0, 柴田大知,1:34.9,1+1/4,37.6,470,-2, 西園正都,14). %%%%% 実行例 %%%% ?- コーナー通過時の先頭からの各馬の最終到達順位('11R 第64回 朝日杯フューチュリティステークス(GI)','(2,*15,14,5)(9,12,16)(8,3,6)-(10,13)(11,4)(7,1)',_到達順位に置換した通過時文字列). _到達順位に置換した通過時文字列 = '(10,*16,1,2)(8,4,6)(9,3,7)-(15,14)(11,13)(5,12)' % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/496 # # [1] C言語プログラミング2 # [2] 問題1・入力した文字列から文字を一文字ずつ交互に読み取り、文字列1、文字列2として結果を出力するプログラムを作成せよ。 # 問題2・また、文字列1、文字列2を入力し、それぞれから一文字ずつ交互に読み取った結果を文字列として出力するプログラムを作成せよ。 # 条件1・500文字前後の文字列を扱えるようにせよ。 # 条件2・問題1の文字列が奇数の場合は文字列1の側に奇数で余った一文字を入れること。(問題2の文字列1が一文字多い場合読み取りを忘れないように) # 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。 # 問題1・例 # 文字列・abcdefghijklm # ↓ # 文字列1・acegikm # 文字列2・bdfhjl # # 問題2・例 # 文字列1・acegikm # 文字列2・bdfhjl # ↓ # 文字列・abcdefghijklm # 'また、文字列1、文字列2を入力し、それぞれから一文字ずつ交互に読み取った結果を文字列として出力するプログラムを作成せよ。 条件1・500文字前後の文字列を扱えるようにせよ。 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。 問題2・例 文字列1・acegikm 文字列2・bdfhjl ↓ 文字列・abcdefghijklm' :- '文字列1、文字列2を入力し 条件1・500文字前後の文字列を扱えるようにせよ。 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。'(_文字列1,_文字列2), それぞれから一文字ずつ交互に読み取った結果を(_文字列1,_文字列2,_読み取った結果ならび), 文字列として出力する(_読み取った結果ならび). '文字列1、文字列2を入力し 条件1・500文字前後の文字列を扱えるようにせよ。 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。'(_文字列1,_文字列2) :- write('文字列1(半角英数記号のみからなる)を入力してください : '), get_line(_文字列1), write('文字列2(半角英数記号のみからなる)を入力してください : '), get_line(_文字列2). それぞれから一文字ずつ交互に読み取った結果を('','',[]) :- !. それぞれから一文字ずつ交互に読み取った結果を('',_文字列2,L) :- それぞれから一文字ずつ交互に読み取った結果を(_文字列2,'',L). それぞれから一文字ずつ交互に読み取った結果を(_文字列1,_文字列2,[_文字|R]) :- 一文字ずつ読み取った(_文字列1,_文字,_文字列3), それぞれから一文字ずつ交互に読み取った結果を(_文字列2,_文字列3,R). 一文字ずつ読み取った(_文字列1,_文字,_文字列3) :- sub_atom(_文字列1,S_1,1,R_1,_文字), S_2 is S_1 + 1, sub_atom(_文字列1,S_2,R_1,0,_文字列3),!. 文字列として出力する(_読み取った結果ならび) :- atomic_list_concat(_読み取った結果ならび,_読み取った結果文字列), writef('%t\n',[_読み取った結果文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/439 # # [1] プログラム演習 # [2] 入力した文字列をASCIIコードに応じた2進数に変換するプログラムを作成せよ。 # (注釈:百文字程度の変換を行えるようにすること) # 例:abc→011000010110001001100011 # また、2進数から文字列に戻す変換を行うプログラムも作成せよ。 # 例:011000010110001001100011→abc # '入力した文字列をASCIIコードに応じた2進数に変換する' :- 入力した文字列を(_入力したASCIIコードならび), 'ASCIIコードならび2進数ビットならび変換'(_入力したASCIIコードならび,_2進数ビットならび), atomic_list_concat(_2進数ビットならび,_2進数列), writef('%t\n',[_2進数列]). '2進数から文字列に戻す変換'(_2進数ビットならび,_ASCIIコードならび) :- 入力した2進数列(_入力した2進数列), 入力したASCIIコードを2進数ビットならびに変換(_入力したASCIIコードならび,_2進数ビットならび), 'ASCIIコードならび2進数ビットならび変換'(_ASCIIコードならび,_2進数ビットならび), atom_codes(_ASCII文字列,_ASCIIコードならび), writef('%t\n',[_ASCII文字列]). 入力した文字列を(_入力したASCIIコードならび) :- read_line_to_codes(user_input,_入力したASCIIコードならび). 入力した2進数列(_入力した2進数列) :- read_line_to_codes(user_input,_入力した2進数列). 'ASCIIコードならび2進数ビットならび変換'([],[]). 'ASCIIコードならび2進数ビットならび変換'([_文字コード|R1],[_b1,_b2,_b3,_b4,_b5,_b6,_b7,_b8|R2]) :- 'ASCIIコード2進数表'(_ASCIIコード,[_b1,_b2,_b3,_b4,_b5,_b6,_b7,_b8]), 'ASCIIコードならび2進数ビットならび変換'(R1,R2). 'ASCIIコード2進数'(0,[0,0,0,0,0,0,0,0]). 'ASCIIコード2進数'(1,[0,0,0,0,0,0,0,1]). 'ASCIIコード2進数'(2,[0,0,0,0,0,0,1,0]). 'ASCIIコード2進数'(3,[0,0,0,0,0,0,1,1]). 'ASCIIコード2進数'(4,[0,0,0,0,0,1,0,0]). 'ASCIIコード2進数'(5,[0,0,0,0,0,1,0,1]). 'ASCIIコード2進数'(6,[0,0,0,0,0,1,1,0]). 'ASCIIコード2進数'(7,[0,0,0,0,0,1,1,1]). 'ASCIIコード2進数'(8,[0,0,0,0,1,0,0,0]). 'ASCIIコード2進数'(9,[0,0,0,0,1,0,0,1]). 'ASCIIコード2進数'(10,[0,0,0,0,1,0,1,0]). 'ASCIIコード2進数'(11,[0,0,0,0,1,0,1,1]). 'ASCIIコード2進数'(12,[0,0,0,0,1,1,0,0]). 'ASCIIコード2進数'(13,[0,0,0,0,1,1,0,1]). 'ASCIIコード2進数'(14,[0,0,0,0,1,1,1,0]). 'ASCIIコード2進数'(15,[0,0,0,0,1,1,1,1]). 'ASCIIコード2進数'(16,[0,0,0,1,0,0,0,0]). 'ASCIIコード2進数'(17,[0,0,0,1,0,0,0,1]). 'ASCIIコード2進数'(18,[0,0,0,1,0,0,1,0]). 'ASCIIコード2進数'(19,[0,0,0,1,0,0,1,1]). 'ASCIIコード2進数'(20,[0,0,0,1,0,1,0,0]). 'ASCIIコード2進数'(21,[0,0,0,1,0,1,0,1]). 'ASCIIコード2進数'(22,[0,0,0,1,0,1,1,0]). 'ASCIIコード2進数'(23,[0,0,0,1,0,1,1,1]). 'ASCIIコード2進数'(24,[0,0,0,1,1,0,0,0]). 'ASCIIコード2進数'(25,[0,0,0,1,1,0,0,1]). 'ASCIIコード2進数'(26,[0,0,0,1,1,0,1,0]). 'ASCIIコード2進数'(27,[0,0,0,1,1,0,1,1]). 'ASCIIコード2進数'(28,[0,0,0,1,1,1,0,0]). 'ASCIIコード2進数'(29,[0,0,0,1,1,1,0,1]). 'ASCIIコード2進数'(30,[0,0,0,1,1,1,1,0]). 'ASCIIコード2進数'(31,[0,0,0,1,1,1,1,1]). 'ASCIIコード2進数'(32,[0,0,1,0,0,0,0,0]). 'ASCIIコード2進数'(33,[0,0,1,0,0,0,0,1]). 'ASCIIコード2進数'(34,[0,0,1,0,0,0,1,0]). 'ASCIIコード2進数'(35,[0,0,1,0,0,0,1,1]). 'ASCIIコード2進数'(36,[0,0,1,0,0,1,0,0]). 'ASCIIコード2進数'(37,[0,0,1,0,0,1,0,1]). 'ASCIIコード2進数'(38,[0,0,1,0,0,1,1,0]). 'ASCIIコード2進数'(39,[0,0,1,0,0,1,1,1]). 'ASCIIコード2進数'(40,[0,0,1,0,1,0,0,0]). 'ASCIIコード2進数'(41,[0,0,1,0,1,0,0,1]). 'ASCIIコード2進数'(42,[0,0,1,0,1,0,1,0]). 'ASCIIコード2進数'(43,[0,0,1,0,1,0,1,1]). 'ASCIIコード2進数'(44,[0,0,1,0,1,1,0,0]). 'ASCIIコード2進数'(45,[0,0,1,0,1,1,0,1]). 'ASCIIコード2進数'(46,[0,0,1,0,1,1,1,0]). 'ASCIIコード2進数'(47,[0,0,1,0,1,1,1,1]). 'ASCIIコード2進数'(48,[0,0,1,1,0,0,0,0]). 'ASCIIコード2進数'(49,[0,0,1,1,0,0,0,1]). 'ASCIIコード2進数'(50,[0,0,1,1,0,0,1,0]). 'ASCIIコード2進数'(51,[0,0,1,1,0,0,1,1]). 'ASCIIコード2進数'(52,[0,0,1,1,0,1,0,0]). 'ASCIIコード2進数'(53,[0,0,1,1,0,1,0,1]). 'ASCIIコード2進数'(54,[0,0,1,1,0,1,1,0]). 'ASCIIコード2進数'(55,[0,0,1,1,0,1,1,1]). 'ASCIIコード2進数'(56,[0,0,1,1,1,0,0,0]). 'ASCIIコード2進数'(57,[0,0,1,1,1,0,0,1]). 'ASCIIコード2進数'(58,[0,0,1,1,1,0,1,0]). 'ASCIIコード2進数'(59,[0,0,1,1,1,0,1,1]). 'ASCIIコード2進数'(60,[0,0,1,1,1,1,0,0]). 'ASCIIコード2進数'(61,[0,0,1,1,1,1,0,1]). 'ASCIIコード2進数'(62,[0,0,1,1,1,1,1,0]). 'ASCIIコード2進数'(63,[0,0,1,1,1,1,1,1]). 'ASCIIコード2進数'(64,[0,1,0,0,0,0,0,0]). 'ASCIIコード2進数'(65,[0,1,0,0,0,0,0,1]). 'ASCIIコード2進数'(66,[0,1,0,0,0,0,1,0]). 'ASCIIコード2進数'(67,[0,1,0,0,0,0,1,1]). 'ASCIIコード2進数'(68,[0,1,0,0,0,1,0,0]). 'ASCIIコード2進数'(69,[0,1,0,0,0,1,0,1]). 'ASCIIコード2進数'(70,[0,1,0,0,0,1,1,0]). 'ASCIIコード2進数'(71,[0,1,0,0,0,1,1,1]). 'ASCIIコード2進数'(72,[0,1,0,0,1,0,0,0]). 'ASCIIコード2進数'(73,[0,1,0,0,1,0,0,1]). 'ASCIIコード2進数'(74,[0,1,0,0,1,0,1,0]). 'ASCIIコード2進数'(75,[0,1,0,0,1,0,1,1]). 'ASCIIコード2進数'(76,[0,1,0,0,1,1,0,0]). 'ASCIIコード2進数'(77,[0,1,0,0,1,1,0,1]). 'ASCIIコード2進数'(78,[0,1,0,0,1,1,1,0]). 'ASCIIコード2進数'(79,[0,1,0,0,1,1,1,1]). 'ASCIIコード2進数'(80,[0,1,0,1,0,0,0,0]). 'ASCIIコード2進数'(81,[0,1,0,1,0,0,0,1]). 'ASCIIコード2進数'(82,[0,1,0,1,0,0,1,0]). 'ASCIIコード2進数'(83,[0,1,0,1,0,0,1,1]). 'ASCIIコード2進数'(84,[0,1,0,1,0,1,0,0]). 'ASCIIコード2進数'(85,[0,1,0,1,0,1,0,1]). 'ASCIIコード2進数'(86,[0,1,0,1,0,1,1,0]). 'ASCIIコード2進数'(87,[0,1,0,1,0,1,1,1]). 'ASCIIコード2進数'(88,[0,1,0,1,1,0,0,0]). 'ASCIIコード2進数'(89,[0,1,0,1,1,0,0,1]). 'ASCIIコード2進数'(90,[0,1,0,1,1,0,1,0]). 'ASCIIコード2進数'(91,[0,1,0,1,1,0,1,1]). 'ASCIIコード2進数'(92,[0,1,0,1,1,1,0,0]). 'ASCIIコード2進数'(93,[0,1,0,1,1,1,0,1]). 'ASCIIコード2進数'(94,[0,1,0,1,1,1,1,0]). 'ASCIIコード2進数'(95,[0,1,0,1,1,1,1,1]). 'ASCIIコード2進数'(96,[0,1,1,0,0,0,0,0]). 'ASCIIコード2進数'(97,[0,1,1,0,0,0,0,1]). 'ASCIIコード2進数'(98,[0,1,1,0,0,0,1,0]). 'ASCIIコード2進数'(99,[0,1,1,0,0,0,1,1]). 'ASCIIコード2進数'(100,[0,1,1,0,0,1,0,0]). 'ASCIIコード2進数'(101,[0,1,1,0,0,1,0,1]). 'ASCIIコード2進数'(102,[0,1,1,0,0,1,1,0]). 'ASCIIコード2進数'(103,[0,1,1,0,0,1,1,1]). 'ASCIIコード2進数'(104,[0,1,1,0,1,0,0,0]). 'ASCIIコード2進数'(105,[0,1,1,0,1,0,0,1]). 'ASCIIコード2進数'(106,[0,1,1,0,1,0,1,0]). 'ASCIIコード2進数'(107,[0,1,1,0,1,0,1,1]). 'ASCIIコード2進数'(108,[0,1,1,0,1,1,0,0]). 'ASCIIコード2進数'(109,[0,1,1,0,1,1,0,1]). 'ASCIIコード2進数'(110,[0,1,1,0,1,1,1,0]). 'ASCIIコード2進数'(111,[0,1,1,0,1,1,1,1]). 'ASCIIコード2進数'(112,[0,1,1,1,0,0,0,0]). 'ASCIIコード2進数'(113,[0,1,1,1,0,0,0,1]). 'ASCIIコード2進数'(114,[0,1,1,1,0,0,1,0]). 'ASCIIコード2進数'(115,[0,1,1,1,0,0,1,1]). 'ASCIIコード2進数'(116,[0,1,1,1,0,1,0,0]). 'ASCIIコード2進数'(117,[0,1,1,1,0,1,0,1]). 'ASCIIコード2進数'(118,[0,1,1,1,0,1,1,0]). 'ASCIIコード2進数'(119,[0,1,1,1,0,1,1,1]). 'ASCIIコード2進数'(120,[0,1,1,1,1,0,0,0]). 'ASCIIコード2進数'(121,[0,1,1,1,1,0,0,1]). 'ASCIIコード2進数'(122,[0,1,1,1,1,0,1,0]). 'ASCIIコード2進数'(123,[0,1,1,1,1,0,1,1]). 'ASCIIコード2進数'(124,[0,1,1,1,1,1,0,0]). 'ASCIIコード2進数'(125,[0,1,1,1,1,1,0,1]). 'ASCIIコード2進数'(126,[0,1,1,1,1,1,1,0]). 'ASCIIコード2進数'(127,[0,1,1,1,1,1,1,1]). 'ASCIIコード2進数'(128,[1,0,0,0,0,0,0,0]). 'ASCIIコード2進数'(129,[1,0,0,0,0,0,0,1]). 'ASCIIコード2進数'(130,[1,0,0,0,0,0,1,0]). 'ASCIIコード2進数'(131,[1,0,0,0,0,0,1,1]). 'ASCIIコード2進数'(132,[1,0,0,0,0,1,0,0]). 'ASCIIコード2進数'(133,[1,0,0,0,0,1,0,1]). 'ASCIIコード2進数'(134,[1,0,0,0,0,1,1,0]). 'ASCIIコード2進数'(135,[1,0,0,0,0,1,1,1]). 'ASCIIコード2進数'(136,[1,0,0,0,1,0,0,0]). 'ASCIIコード2進数'(137,[1,0,0,0,1,0,0,1]). 'ASCIIコード2進数'(138,[1,0,0,0,1,0,1,0]). 'ASCIIコード2進数'(139,[1,0,0,0,1,0,1,1]). 'ASCIIコード2進数'(140,[1,0,0,0,1,1,0,0]). 'ASCIIコード2進数'(141,[1,0,0,0,1,1,0,1]). 'ASCIIコード2進数'(142,[1,0,0,0,1,1,1,0]). 'ASCIIコード2進数'(143,[1,0,0,0,1,1,1,1]). 'ASCIIコード2進数'(144,[1,0,0,1,0,0,0,0]). 'ASCIIコード2進数'(145,[1,0,0,1,0,0,0,1]). 'ASCIIコード2進数'(146,[1,0,0,1,0,0,1,0]). 'ASCIIコード2進数'(147,[1,0,0,1,0,0,1,1]). 'ASCIIコード2進数'(148,[1,0,0,1,0,1,0,0]). 'ASCIIコード2進数'(149,[1,0,0,1,0,1,0,1]). 'ASCIIコード2進数'(150,[1,0,0,1,0,1,1,0]). 'ASCIIコード2進数'(151,[1,0,0,1,0,1,1,1]). 'ASCIIコード2進数'(152,[1,0,0,1,1,0,0,0]). 'ASCIIコード2進数'(153,[1,0,0,1,1,0,0,1]). 'ASCIIコード2進数'(154,[1,0,0,1,1,0,1,0]). 'ASCIIコード2進数'(155,[1,0,0,1,1,0,1,1]). 'ASCIIコード2進数'(156,[1,0,0,1,1,1,0,0]). 'ASCIIコード2進数'(157,[1,0,0,1,1,1,0,1]). 'ASCIIコード2進数'(158,[1,0,0,1,1,1,1,0]). 'ASCIIコード2進数'(159,[1,0,0,1,1,1,1,1]). 'ASCIIコード2進数'(160,[1,0,1,0,0,0,0,0]). 'ASCIIコード2進数'(161,[1,0,1,0,0,0,0,1]). 'ASCIIコード2進数'(162,[1,0,1,0,0,0,1,0]). 'ASCIIコード2進数'(163,[1,0,1,0,0,0,1,1]). 'ASCIIコード2進数'(164,[1,0,1,0,0,1,0,0]). 'ASCIIコード2進数'(165,[1,0,1,0,0,1,0,1]). 'ASCIIコード2進数'(166,[1,0,1,0,0,1,1,0]). 'ASCIIコード2進数'(167,[1,0,1,0,0,1,1,1]). 'ASCIIコード2進数'(168,[1,0,1,0,1,0,0,0]). 'ASCIIコード2進数'(169,[1,0,1,0,1,0,0,1]). 'ASCIIコード2進数'(170,[1,0,1,0,1,0,1,0]). 'ASCIIコード2進数'(171,[1,0,1,0,1,0,1,1]). 'ASCIIコード2進数'(172,[1,0,1,0,1,1,0,0]). 'ASCIIコード2進数'(173,[1,0,1,0,1,1,0,1]). 'ASCIIコード2進数'(174,[1,0,1,0,1,1,1,0]). 'ASCIIコード2進数'(175,[1,0,1,0,1,1,1,1]). 'ASCIIコード2進数'(176,[1,0,1,1,0,0,0,0]). 'ASCIIコード2進数'(177,[1,0,1,1,0,0,0,1]). 'ASCIIコード2進数'(178,[1,0,1,1,0,0,1,0]). 'ASCIIコード2進数'(179,[1,0,1,1,0,0,1,1]). 'ASCIIコード2進数'(180,[1,0,1,1,0,1,0,0]). 'ASCIIコード2進数'(181,[1,0,1,1,0,1,0,1]). 'ASCIIコード2進数'(182,[1,0,1,1,0,1,1,0]). 'ASCIIコード2進数'(183,[1,0,1,1,0,1,1,1]). 'ASCIIコード2進数'(184,[1,0,1,1,1,0,0,0]). 'ASCIIコード2進数'(185,[1,0,1,1,1,0,0,1]). 'ASCIIコード2進数'(186,[1,0,1,1,1,0,1,0]). 'ASCIIコード2進数'(187,[1,0,1,1,1,0,1,1]). 'ASCIIコード2進数'(188,[1,0,1,1,1,1,0,0]). 'ASCIIコード2進数'(189,[1,0,1,1,1,1,0,1]). 'ASCIIコード2進数'(190,[1,0,1,1,1,1,1,0]). 'ASCIIコード2進数'(191,[1,0,1,1,1,1,1,1]). 'ASCIIコード2進数'(192,[1,1,0,0,0,0,0,0]). 'ASCIIコード2進数'(193,[1,1,0,0,0,0,0,1]). 'ASCIIコード2進数'(194,[1,1,0,0,0,0,1,0]). 'ASCIIコード2進数'(195,[1,1,0,0,0,0,1,1]). 'ASCIIコード2進数'(196,[1,1,0,0,0,1,0,0]). 'ASCIIコード2進数'(197,[1,1,0,0,0,1,0,1]). 'ASCIIコード2進数'(198,[1,1,0,0,0,1,1,0]). 'ASCIIコード2進数'(199,[1,1,0,0,0,1,1,1]). 'ASCIIコード2進数'(200,[1,1,0,0,1,0,0,0]). 'ASCIIコード2進数'(201,[1,1,0,0,1,0,0,1]). 'ASCIIコード2進数'(202,[1,1,0,0,1,0,1,0]). 'ASCIIコード2進数'(203,[1,1,0,0,1,0,1,1]). 'ASCIIコード2進数'(204,[1,1,0,0,1,1,0,0]). 'ASCIIコード2進数'(205,[1,1,0,0,1,1,0,1]). 'ASCIIコード2進数'(206,[1,1,0,0,1,1,1,0]). 'ASCIIコード2進数'(207,[1,1,0,0,1,1,1,1]). 'ASCIIコード2進数'(208,[1,1,0,1,0,0,0,0]). 'ASCIIコード2進数'(209,[1,1,0,1,0,0,0,1]). 'ASCIIコード2進数'(210,[1,1,0,1,0,0,1,0]). 'ASCIIコード2進数'(211,[1,1,0,1,0,0,1,1]). 'ASCIIコード2進数'(212,[1,1,0,1,0,1,0,0]). 'ASCIIコード2進数'(213,[1,1,0,1,0,1,0,1]). 'ASCIIコード2進数'(214,[1,1,0,1,0,1,1,0]). 'ASCIIコード2進数'(215,[1,1,0,1,0,1,1,1]). 'ASCIIコード2進数'(216,[1,1,0,1,1,0,0,0]). 'ASCIIコード2進数'(217,[1,1,0,1,1,0,0,1]). 'ASCIIコード2進数'(218,[1,1,0,1,1,0,1,0]). 'ASCIIコード2進数'(219,[1,1,0,1,1,0,1,1]). 'ASCIIコード2進数'(220,[1,1,0,1,1,1,0,0]). 'ASCIIコード2進数'(221,[1,1,0,1,1,1,0,1]). 'ASCIIコード2進数'(222,[1,1,0,1,1,1,1,0]). 'ASCIIコード2進数'(223,[1,1,0,1,1,1,1,1]). 'ASCIIコード2進数'(224,[1,1,1,0,0,0,0,0]). 'ASCIIコード2進数'(225,[1,1,1,0,0,0,0,1]). 'ASCIIコード2進数'(226,[1,1,1,0,0,0,1,0]). 'ASCIIコード2進数'(227,[1,1,1,0,0,0,1,1]). 'ASCIIコード2進数'(228,[1,1,1,0,0,1,0,0]). 'ASCIIコード2進数'(229,[1,1,1,0,0,1,0,1]). 'ASCIIコード2進数'(230,[1,1,1,0,0,1,1,0]). 'ASCIIコード2進数'(231,[1,1,1,0,0,1,1,1]). 'ASCIIコード2進数'(232,[1,1,1,0,1,0,0,0]). 'ASCIIコード2進数'(233,[1,1,1,0,1,0,0,1]). 'ASCIIコード2進数'(234,[1,1,1,0,1,0,1,0]). 'ASCIIコード2進数'(235,[1,1,1,0,1,0,1,1]). 'ASCIIコード2進数'(236,[1,1,1,0,1,1,0,0]). 'ASCIIコード2進数'(237,[1,1,1,0,1,1,0,1]). 'ASCIIコード2進数'(238,[1,1,1,0,1,1,1,0]). 'ASCIIコード2進数'(239,[1,1,1,0,1,1,1,1]). 'ASCIIコード2進数'(240,[1,1,1,1,0,0,0,0]). 'ASCIIコード2進数'(241,[1,1,1,1,0,0,0,1]). 'ASCIIコード2進数'(242,[1,1,1,1,0,0,1,0]). 'ASCIIコード2進数'(243,[1,1,1,1,0,0,1,1]). 'ASCIIコード2進数'(244,[1,1,1,1,0,1,0,0]). 'ASCIIコード2進数'(245,[1,1,1,1,0,1,0,1]). 'ASCIIコード2進数'(246,[1,1,1,1,0,1,1,0]). 'ASCIIコード2進数'(247,[1,1,1,1,0,1,1,1]). 'ASCIIコード2進数'(248,[1,1,1,1,1,0,0,0]). 'ASCIIコード2進数'(249,[1,1,1,1,1,0,0,1]). 'ASCIIコード2進数'(250,[1,1,1,1,1,0,1,0]). 'ASCIIコード2進数'(251,[1,1,1,1,1,0,1,1]). 'ASCIIコード2進数'(252,[1,1,1,1,1,1,0,0]). 'ASCIIコード2進数'(253,[1,1,1,1,1,1,0,1]). 'ASCIIコード2進数'(254,[1,1,1,1,1,1,1,0]). 'ASCIIコード2進数'(255,[1,1,1,1,1,1,1,1]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/439 # # [1] プログラム演習 # [2] 入力した文字列をASCIIコードに応じた2進数に変換するプログラムを作成せよ。 # (注釈:百文字程度の変換を行えるようにすること) # 例:abc→011000010110001001100011 # また、2進数から文字列に戻す変換を行うプログラムも作成せよ。 # 例:011000010110001001100011→abc # '入力した文字列をASCIIコードに応じた2進数に変換する' :- 入力した文字列を(_入力した文字列), 'ASCIIコードに応じた2進数に変換する'(_入力した文字列,_2進数ならび), flatten(_2進数ならび,_平坦な2進数ならび), atomic_list_concat(_平坦な2進数ならび,_表示文字列), writef('%t\n',[_表示文字列]). 'ASCIIコードに応じた2進数に変換する'(_入力した文字列,_2進数ならび) :- atom_codes(_入力した文字列,Codes), findall(_2進数,( member(_ASCIIコード,Codes), 'ASCIIコードに応じた2進数'(_ASCIIコード,_2進数)), _2進数ならび). 'ASCIIコードに応じた2進数'(_ASCIIコード,_2進数) :- 'ASCIIコードに応じた2進数'(_ASCIIコード,[],_2進数). 'ASCIIコードに応じた2進数'(0,L,L) :- !. 'ASCIIコードに応じた2進数'(N,L1,L) :- N_2 is N // 2, _b is N mod 2, 'ASCIIコードに応じた2進数'(N_2,[_b|L1],L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/386 # # 二つの2×3型行列を # A=1.1 -2.2 0.9 #  -0.2  2.7 0.3 # # B= 1.8 0.5 1.3 # -0.4 0.6 -0.3 # と定義する。 # # これらの二つの行列の宣言、初期化し、C≡A+B C≡A-Bを算出して # 2×3型の表形式で出力するプログラムを作成せよ。ただし、行列CとDは固定長 # 配列とし、関数内の演算を行うこと # # 上記の問題と同じように行列A、Bを用いて、積C≡ABt を算出し、2×2型の表 # 形式で出力せよ。ただし、Bの転置行列、Btはプログラム中に直接記述するのでは # なく、Bより作成すること。また、Cはnew演算子によりメモリを確保し、関数内で # 演算を行うこと。 # # # だれかこのプログラムおしえてくださいm(_ _)m # # '行列A、Bを用いて、積C≡ABt を算出し、2×2型の表形式で出力せよ。ただし、Bの転置行列、Btはプログラム中に直接記述するのではなく、Bより作成すること。'(A,B,C) :- 転置(B,Bt), 行列の掛算_1(A,Bt,C), '2×2型の表形式で出力せよ'(C). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2) . 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 行列の掛算_1([],_,[]) :- !. 行列の掛算_1([A|R1],L,[S1|R3]) :- 行列の掛算_2(A,L,S1), 行列の掛算_1(R1,L,R3). 行列の掛算_2(_,[],[]) :- !. 行列の掛算_2(A,[B|R2],[C|R3]) :- 行列の掛算_3(A,B,C), 行列の掛算_2(A,R2,R3). 行列の掛算_3([],[],0) :- !. 行列の掛算_3([A|R1],[B|R2],S) :- 分数を含む掛算(A,B,S1), 行列の掛算_3(R1,R2,S2), 分数を含む加算(S1,S2,S),!. 分数を含む加算(A1 / A2,B1 / B2,C) :- S1 is A1 * B2 + A2 * B1, S2 is A2 * B2, 約分(S1 / S2,C),!. 分数を含む加算(A1 / A2,B,C) :- S1 is A1 + A2 * B, 約分(S1 / A2,C),!. 分数を含む加算(A,B1 / B2,C) :- S1 is B1 + B2 * A, 約分(S1 / B2,C),!. 分数を含む加算(A,B,C) :- C is A + B. 約分(B / A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(0,_,0) :- !. 約分の二(0.0,_,0) :- !. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子,_分母,_分子 / _分母). 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). '2×2型の表形式で出力せよ'(LL) :- 'M×Nの表形式で出力する'(2,2,LL). 'M×Nの表形式で出力する'(M,N,LL) :- 'N列カンマ区切り行表示形式'(N,_行表示形式), nth1(_nth1,LL,L), writef(_行表示形式,L), _nth1 = M. 'N列カンマ区切り行表示形式'(N,_行表示形式) :- findall('%t',between(1,N,_),PL), atomic_list_concat(PL,',',S1), atom_concat(S1,'\n',_行表示形式). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/386 # # 二つの2×3型行列を # A=1.1 -2.2 0.9 #  -0.2  2.7 0.3 # # B= 1.8 0.5 1.3 # -0.4 0.6 -0.3 # と定義する。 # # これらの二つの行列の宣言、初期化し、C≡A+B C≡A-Bを算出して # 2×3型の表形式で出力するプログラムを作成せよ。ただし、行列CとDは固定長 # 配列とし、関数内の演算を行うこと # # 上記の問題と同じように行列A、Bを用いて、積C≡ABt を算出し、2×2型の表 # 形式で出力せよ。ただし、Bの転置行列、Btはプログラム中に直接記述するのでは # なく、Bより作成すること。また、Cはnew演算子によりメモリを確保し、関数内で # 演算を行うこと。 # # # だれかこのプログラムおしえてくださいm(_ _)m # # '二つの2×3型行列を A=1.1 -2.2 0.9  -0.2  2.7 0.3 B= 1.8 0.5 1.3 -0.4 0.6 -0.3 と定義する。 これらの二つの行列の宣言、初期化し、C≡A+B C≡A-Bを算出して 2×3型の表形式で出力する' :- これらの二つの行列の宣言(A,B), 'C≡A+B C≡A-Bを算出して'(A,B,C), '2×3型の表形式で出力する'(C), '2×3型の表形式で出力する'(D). これらの二つの行列の宣言(A,B) :- A = [[1.1,-2.2,0.9],[-0.2,2.7,0.3]], B = [[1.8,0.5,1.3],[-0.4,0.6,-0.3]]. 'C≡A+B C≡A-Bを算出して'(A,B,C) :- 行列の和(A,B,C), 行列の差(A,B,D). 行列の和([],[],[]). 行列の和([L1|R1],[L2|R2],[L3|R3]) :- 行の和(L1,L2,L3), 行列の和(R1,R2,R3). 行の和([],[],[]). 行の和([A|R1],[B|R2],[C|R3]) :- 分数を含む加算(A,B,C), 行の和(R1,R2,R3). 行列の差([],[],[]). 行列の差([L1|R1],[L2|R2],[L3|R3]) :- 行の差(L1,L2,L3), 行列の差(R1,R2,R3). 行の差([],[],[]). 行の差([A|R1],[B|R2],[C|R3]) :- B_1 is B * (-1). 分数を含む加算(A,B_1,C), 行の差(R1,R2,R3). 分数を含む加算(A1 / A2,B1 / B2,C) :- S1 is A1 * B2 + A2 * B1, S2 is A2 * B2, 約分(S1 / S2,C),!. 分数を含む加算(A1 / A2,B,C) :- S1 is A1 + A2 * B, 約分(S1 / A2,C),!. 分数を含む加算(A,B1 / B2,C) :- S1 is B1 + B2 * A, 約分(S1 / B2,C),!. 分数を含む加算(A,B,C) :- C is A + B. 約分(B / A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(0,_,0) :- !. 約分の二(0.0,_,0) :- !. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子,_分母,_分子 / _分母). 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). '2×3型の表形式で出力する'(LL) :- 'M×Nの表形式で出力する'(2,3,LL). 'M×Nの表形式で出力する'(M,N,LL) :- 'N列カンマ区切り行表示形式'(N,_行表示形式), nth1(_nth1,LL,L), writef(_行表示形式,L), _nth1 = M. 'N列カンマ区切り行表示形式'(N,_行表示形式) :- findall('%t',between(1,N,_),PL), atomic_list_concat(PL,',',S1), atom_concat(S1,'\n',_行表示形式). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349545643/864 # # # 0 ~ 64 の 65 個の数字を # 以下のような個数毎に改行して表示する場合 # 各言語ではどのように書きますか? # 便宜上それぞれの数字の型は int としてください # # 0 1 2 3 4 # 5 6 7 8 # 9 10 11 12 # 13 14 15 16 17 # 18 19 20 21 # 22 23 24 25 # 26 27 28 29 30 # 31 32 33 34 # 35 36 37 38 # 39 40 41 42 43 # 44 45 46 47 # 48 49 50 51 # 52 53 54 55 56 # 57 58 59 60 # 61 62 63 64 '0 ~ 64 の 65 個の数字を 以下のような個数毎に改行して表示する場合 各言語ではどのように書きますか? 便宜上それぞれの数字の型は int としてください 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64' :- '0 ~ 64 の 65 個の数字を'(_数ならび), 個数毎に改行して表示する(_数ならび,[5,4,4]). '0 ~ 64 の 65 個の数字を'(_数ならび) :- findall(N,between(0,64,N),_数ならび). 個数毎に改行して表示する(_数ならび,[_個数|_残り表示パターン]) :- 個数毎に(_数ならび,_個数,_個数分の数ならび,_残り数ならび), 改行して表示する(_個数分の数ならび), 個数毎に改行して表示する(_残り数ならび,_残り表示パターン). 個数毎に改行して表示する([_数|_残り数ならび],[]) :- 個数毎に改行して表示する([_数|_残り数ならび],[5,4,4]). 個数毎に改行して表示する(_,_). 個数毎に(_数ならび,_個数,_個数分の数ならび,_残り数ならび) :- length(_個数分の数ならび,_個数), append(_個数分の数ならび,_残り数ならび,_数ならび),!. 改行して表示する(_個数分の数ならび) :- atomic_list_concat(_個数分の数ならび,' ',_空白で区切られた数ならび文字列), writef('%t\n',[_空白で区切られた数ならび文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/119 # # [1]C言語 # [2]http://ime.nu/www.dotup.org/uploda/www.dotup.org3700396.jpg # 探索木についての課題です # 問題1. データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。 # # 問題2. 前問をプログラムとして、表示しなさい。表示する関数は再帰的に書きなさい。 # 左の子(部分木) を print,node を print, 右の子 (部分木) を print のように表示することをDFS 中間順と言います。 # # 問題3. 標準入力から文字を入力させ、その文字によって2分探索木に対して以下の動作をするプログラムを作成せよ。 # s ---> 数を1つ標準入力から入力されてデータが存在するか表示 # i ---> 数を1つ標準入力から入力させて2分探索木に追加 # p ---> 今まで入力された数をすべて表示 (DFS中間順で) # q ---> quit # # 問題4. 0から9999の整数の乱数を10000個生成して、2分探索木を作り、データの # 総数、木の深さの最大値、データの最小値と最大値を求めるプログラムを作成し # て確認せよ。 # # [3]ubuntu # gcc # c言語 # [4]期限:木曜日6:00 # 宜しくお願いします。 # :- dynamic([木/3,根/1,二分探索木ラベル/2]). 二分探索木ラベルの生成(_値ならび,_ラベルならび) :- findall(_ラベル,( member(_値,_値ならび), 二分探索木ラベルの候補(_ラベル), assertz(二分探索木ラベル(_ラベル,_値))), _ラベルならび). 二分探索木ラベルの候補(_ラベル) :- N is random(900000) + 100000, atomic_list_concat(['L',N],_ラベル), \+(二分探索木ラベル(_ラベル,_)),!. 二分探索木ラベルの候補(_ラベル) :- 二分探索木ラベルの候補(_ラベル). 根を作る(_値,_ラベル) :- asserta((根(_ラベル) :- !)), 木を作る(_値,_ラベル). 木を作る(_値,_ラベル) :- 二分探索木ラベル(_ラベル,_値), asserta(木([],_ラベル,[])). 木に追加(_根のラベル,_値のラベル) :- 二分探索木ラベル(_根のラベル,_根の値), 二分探索木ラベル(_値のラベル,_値), 木に追加(_根のラベル,_値のラベル,_根の値,_値). 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, retract(木([],_根のラベル,_右枝)), 木を作る(_値のラベル), asserta(木(_値のラベル,_根のラベル,_右枝)),!. 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, 木(_左枝,_根,_右枝), 木に追加(_左枝,_値). 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, retract(木(_左枝,_根,[])), 木を作る(_値のラベル), asserta(木(_左枝,_根のラベル,_値のラベル)),!. 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, 木(_左枝,_根のラベル,_右枝), 木に追加(_右枝,_値のラベル). 'データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。' :- 二分探索木ラベルの生成([6,4,3,8,5,9,7],[_根のラベル|_ラベルならび]), 根を作る(_先頭のラベル), append(_,[N|R],_ラベルならび), 木に追加(_根のラベル,N), R = []. 二分探索木全体を表示する :- 根(_根のラベル), 木を表示する(_根のラベル). 木を表示する([]) :- !. 木を表示する(_木の根のラベル) :- 木(_左枝,_木の根のラベル,_右枝), 木を表示する(_左枝,_木の根のラベル,_右枝). 木を表示する(_左の枝,_木の根,_右の枝) :- 二分木探索ラベル(_木の根ラベル,_木の根の値), 木を表示する(_左枝), writef('%t ',[_木の根の値]), 木を表示する(_右枝). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/119 # # [1]C言語 # [2]http://ime.nu/www.dotup.org/uploda/www.dotup.org3700396.jpg # 探索木についての課題です # 問題1. データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。 # # 問題2. 前問をプログラムとして、表示しなさい。表示する関数は再帰的に書きなさい。 # 左の子(部分木) を print,node を print, 右の子 (部分木) を print のように表示することをDFS 中間順と言います。 # # 問題3. 標準入力から文字を入力させ、その文字によって2分探索木に対して以下の動作をするプログラムを作成せよ。 # s ---> 数を1つ標準入力から入力されてデータが存在するか表示 # i ---> 数を1つ標準入力から入力させて2分探索木に追加 # p ---> 今まで入力された数をすべて表示 (DFS中間順で) # q ---> quit # # 問題4. 0から9999の整数の乱数を10000個生成して、2分探索木を作り、データの # 総数、木の深さの最大値、データの最小値と最大値を求めるプログラムを作成し # て確認せよ。 # # [3]ubuntu # gcc # c言語 # [4]期限:木曜日6:00 # 宜しくお願いします。 # 二分探索木ラベルの生成(_値ならび) :- nth1(_nth1,_値ならび,_値), atomic_list_concat(['L','_',_nth1],_ラベル), assertz(二分探索木ラベル(_ラベル,_値)), fail. 二分探索木ラベルの生成(_). 根を作る(_値,_ラベル) :- 二分探索木ラベル(_ラベル,_値), asserta(根(_ラベル,[],[])). 枝を作る(_値,_ラベル) :- 二分探索木ラベル(_ラベル,_値), asserta(枝(_ラベル,[],[])). 枝に追加(_根のラベル,_値) :- 二分探索木ラベル(_根のラベル,_根の値), 二分探索木ラベル(_値のラベル,_値), 枝に追加(_根のラベル,_値のラベル,_根の値,_値). 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, retract(枝(_根のラベル,[],_右枝)), 枝を作る(_値), asserta(根(_根のラベル,_値のラベル,_右枝)),!. 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, 枝(_根,_左枝,_右枝), 枝に追加(_左枝,_値). 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, retract(枝(_根,_左枝,[])), 枝を作る(_値), asserta(根(_根のラベル,_左枝,_値のラベル)),!. 枝に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, 枝(_根のラベル,_左枝,_右枝), 枝に追加(_右枝,_値). 'データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。' :- 二分探索木ラベルの生成([6,4,3,8,5,9,7]), 根を作る(6,_根のラベル), append(_,[N|R],[4,3,8,5,9,7]), 枝に追加(_根のラベル,N), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/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,LL2), 出力する(LL2). ヒストグラムの用意(_標本ならび,LL1) :- 最大値(_標本ならび,_最大値), length(L1,_最大値), findall(L1,( 星のリストに変換(L,L1)), LL1). 星のリストに変換(L,L1) :- member(N,L), length(R,N), append(L0,R,L1), all(L0,' '), all(R,*). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 出力する([]). 出力する([L|R]) :- atomic_list_concat(L,S), writef('%t\n',[S]), 出力する(R). % 以下のサイトは # http://toro.2ch.net/test/read-cgi/tech/1351769173/728 # # 配列に、{1,2,3}の3つの数字が入っている時、並び替えて # 123 # 132 # 213 # 231 # 312 # 321 # # のように全パターンを出力したいのですが何か良い方法はありませんか。 # ちなみにVBですが、他の言語で書いていただいてもだいたいわかると思います。 # 配列の長さは変わることもあります・・・。 % % Prologでは普通配列を使わない。ここでもリストとして置き換える。 'リストに、{1,2,3}の3つの数字が入っている時、並び替えて 123 132 213 231 312 321 のように全パターンを出力したい' :- リストを並び替えて全パターンを出力したい([1,2,3]). リストを並び替えて全パターンを出力したい(_リスト) :- リストを並び替えて全パターンを(_リスト,_全パターン), 出力したい(_全パターン). リストを並べ替えて全パターンを(_リスト,_全パターン) :- findall(_パターン, リストを並べ替えて(_リスト,_リスト,_パターン), _全パターン). リストを並べ替えて(Y,[],[]). リストを並べ替えて(Y,[_|Ln],[A|X]) :- 一つ取り除いて(A,Y,Z), リストを並べ替えて(Z,Ln,X). 一つ取り除いて(A,[A|X],X). 一つ取り除いて(A,[B|X],[B|Y]) :- 一つ取り除いて(A,X,Y). 出力したい([]). 出力したい([_パターン|R]) :- atomic_list_concat(_パターン,_表示文字列), writef('%t\n',[_表示文字列]), 出力したい(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/7 # # [1] 授業単元:問題1:二次元配列 問題2:関数 # [2] 問題文(含コード&リンク): # 問題1:ファイルから入力した英小文字a-zの頻度のヒストグラムを # 出力するプログラムを書いてください。入力ファイルはプログラムファイルを使えば良い。 # # 問題2:1文字を引数としてそれが小文字であれば大文字にして返し # そうでなければそのまま文字を返す関数を作成しキーボードから # 文字入力としてこの関数の動作を確認せよ。 # [3.1] OS: windows vista #  [3.2] コンパイラ名とバージョン:visual studio2010 #  [3.3] 言語: C言語 # [4] 期限: 11月30日 # [5]ポインタはやってません。宜しくお願いします 。 # # 'ファイルから入力した英小文字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/db/1343899481/281 # # SQL Server 2000においてです。 # # テーブルのフィールドに電話番号、携帯番号、FAX とあった場合、これらから例えば"0123"と検索するのに # Or で接続する以外に検索する方法はありますか? # # 普通?に考えれば以下の方になるかと思いますが、これを簡易的?にインデックスが利く状態で書き換えたい。 # > SELECT * # > FROM Tablehoge # > WHERE (電話番号="0123") OR (携帯番号="0123") OR (FAX="0123") # # なので以下の様なものは却下になります。 # > SELECT * # > FROM Tablehoge # > WHERE "|" & 電話番号 & "|" & 携帯番号 & "|" & FAX & "|" Like "*|0123|*" # # 'テーブルのフィールドに電話番号、携帯番号、FAX とあった場合、これらから例えば"0123"と検索するのにOr による遅い検索'(_電話番号,_携帯番号,_FAX) :- findsetof([_電話番号,_携帯番号,_FAX],( 'Or による遅い検索'(_電話番号,_携帯番号,_FAX)), LL), member([_電話番号,_携帯番号,_FAX],LL). 'Or による遅い検索'(_電話番号,_携帯番号,_FAX) :- テーブル(_電話番号,_携帯番号,_FAX), sub_atom(_電話番号,_,4,_,'0123'). 'Or による遅い検索'(_電話番号,_携帯番号,_FAX) :- テーブル(_電話番号,_携帯番号,_FAX), sub_atom(_携帯番号,_,4,_,'0123'). 'Or による遅い検索'(_電話番号,_携帯番号,_FAX) :- テーブル(_電話番号,_携帯番号,_FAX), sub_atom(_Fax,_,4,_,'0123'). 'テーブルのフィールドに電話番号、携帯番号、FAX とあった場合、これらから例えば"0123"と検索するのにOr で検索する'(_電話番号,_携帯番号,_FAX) :- テーブル(_電話番号,_携帯番号,_FAX), 'Orで検索する'(_電話番号,_携帯番号,_FAX). 'Orで検索する'(_電話番号,_携帯番号,_FAX) :- sub_atom(_電話番号,_,4,_'0123'),!. 'Orで検索する'(_電話番号,_携帯番号,_FAX) :- sub_atom(_携帯番号,_,4,_'0123'),!. 'Orで検索する'(_電話番号,_携帯番号,_FAX) :- sub_atom(_Fax,_,4,_'0123'). 'テーブルのフィールドに電話番号、携帯番号、FAX とあった場合、これらから例えば"0123"と検索するのにOr 以外で検索する'(_電話番号,_携帯番号,_FAX) :- テーブル(_電話番号,_携帯番号,_FAX), 'Or以外で検索する'(_電話番号,_携帯番号,_FAX). 'Or以外で検索する'(_電話番号,_携帯番号,_FAX) :- atomic_list_concat([_電話番号,_携帯番号,_FAX],S), sub_atom(S,_,4,_,'0123'),!. % 以下のサイトは # 出典:: 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/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 文字列を逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 文字列を逆順に出力する(_文字列) :- findall(_文字,( 文字列を逆順に(_文字列,_文字)), _逆順文字ならび), atomic_list_concat(_逆順文字ならび,_逆順文字列), writef('%t\n',[_逆順文字列]). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,1,_,0,_残り文字列), 文字列を逆順に(_残り文字列,_文字). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,0,1,_,_文字). % 以下のサイトは # # 連番のエロ画像をダウンロードするスクリプトください # # # %%% バッチファイル 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/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のどちらのファイル名で出力するかを聞き              指定した方の名前で出力を行う。' :- get_lines('histograms.txt',Lines), sPLIT(Lines,['\t'],LL0), findall(L1,( 自動的に以下の条件のもとに改変して(LL0,L1)), LL), 'train.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(LL). 自動的に以下の条件のもとに改変して(LL0,L1) :- member([File|R],LL0), '行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える'(File,N), 左から順に番号を振った上で要素が0のものを削除し(0,R,L), 水平TAB文字をすべて空白文字に変える([N|L],L1). '行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える'(File,N) :- split(File,['/','-'],[_,N|_]). 左から順に番号を振った上で要素が0のものを削除し(_,[],[]). 左から順に番号を振った上で要素が0のものを削除し(N_0,[A|R1],[N:A|R2]) :- \+(A = '\t'), \+(A = 0), N is N_0 + 1, 左から順に番号を振った上で要素が0のものを削除し(N,R1,R2). 左から順に番号を振った上で要素が0のものを削除し(N,[A|R1],[A|R2]) :- A = '\t', 左から順に番号を振った上で要素が0のものを削除し(N,R1,R2). 左から順に番号を振った上で要素が0のものを削除し(N,[A|R1],R2) :- A = 0, 左から順に番号を振った上で要素が0のものを削除し(N,R1,R2). 水平TAB文字をすべて空白文字に変える(L,S) :- findall(B,( member(A,L), 水平TAB文字を空白文字に(A,B)), L2), atomic_list_concat(L2,S). 水平TAB文字を空白文字に('\t',' ') :- !. 水平TAB文字を空白文字に(A,A). 'train.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(LL) :- 'train.datかtest.datのどちらのファイル名で出力するかを聞き', 指定した方の名前で出力を行う(LL). 'train.datかtest.datのどちらのファイル名で出力するかを聞き' :- write('ファイル名を選択します。\n1.. train.dat 2.. test.dat \n'). 指定した方の名前で出力を行う(LL) :- 指定した方の名前で(_指定した方の名前), 出力を行う(_指定して方の名前,LL). 指定した方の名前で(_指定した方の名前) :- 整数を得る('1または2',(N == 1;N == 2),N), 指定した方の名前で(N,_指定した方の名前). 指定した方の名前(1,'train.dat'). 指定した方の名前(2,'test.dat'). 出力を行う(_指定した方の名前,LL) :- open(_指定した方の名前,write,Outstream), ストリーム出力を行う(Outstream,LL), close(Outstream). ストリーム出力を出力を行う(Outstream,LL) :- append(_,[L|R],LL), atomic_list_concat(L,S), writef(Outstream,'%t\n',[S]), R = [], % 以下のサイトは # 出典:: 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/617 # # 環境:Windows XP(32bit)、VC++ 2005 # # ある与えられた文字列をバイナリに変換して16バイトのバイト配列に入れる # 与えられる文字列は、バイナリ変換した時に128bitまでに収まる数値の文字列とする # という問題で困ってます # 例: # "1234" # →1234(4D2h) # →00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,04h,D2h # # で、QWORD以上は整数値にできずに困っています。 # "18446744073709551616" # →10000000000000000h # →00h,00h,00h,00h,00h,00h,00h,01h,00h,00h,00h,00h,00h,00h,00h,00h, # どのように処理すればいいのでしょうか? # # 'ある与えられた文字列をバイナリに変換して16バイトのバイト配列に入れる。与えられる文字列は、バイナリ変換した時に128bitまでに収まる数値の文字列とする'(_文字列,_バイナリー文字列) :- append(L,16), atom_number(_文字列,_整数), '16進数ならびに変換'(_整数,[],L1), '先頭から00hを埋めて16進数ならびをバイナリー文字列に変換'(L,L1,_バイナリー文字列). '16進数ならびに変換'(0,L,L) :- !. '16進数ならびに変換'(_整数,L1,L) :- M is _整数 mod 256, N is _整数 // 256, '16進数表示'(M,C), '16進数ならびに変換'(N,[C|L1],L). '16進数表示'(N,C) :- N_1 is N // 256, N_2 is N mod 256, 変換(N_1,A), 変換(N_2,B), atomic_list_concat([A,B,h],C). 変換(0,'0'). 変換(1,'1'), 変換(2,'2'). 変換(3,'3'), 変換(4,'4'). 変換(5,'5'), 変換(6,'6'). 変換(7,'7'), 変換(8,'8'), 変換(9,'9'), 変換(10,'A'). 変換(11,'B'). 変換(12,'C'). 変換(13,'D'). 変換(14,'E'). 変換(15,'F'). '先頭から00hを埋めて16進数ならびをバイナリー文字列に変換'(L,L1,_バイナリー文字列) :- append(L0,L1,L), all(L0,'00h'), atomic_list_concat(L,',',_バイナリ文字列). % 以下のサイトは # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):◎見にくくなりそうなので一番下に書きます。 # [3] 環境 #  [3.1] OS:Windows #  [3.2] コンパイラ名とバージョン:VC++ 2005 #  [3.3] 言語:C++ # [4] 期限:明日 11/3 # [5] その他の制限: 標準入出力ストリームで、 # # 整数除算による商の計算表(下記の例を参照)を表示する. # # # | 1 2 3 4 5 6 7 8 9 # --+------------------ # 1 | 1 0 0 0 0 0 0 0 0 # 2 | 2 1 0 0 0 0 0 0 0 # 3 | 3 1 1 0 0 0 0 0 0 # 4 | 4 2 1 1 0 0 0 0 0 # 5 | 5 2 1 1 1 0 0 0 0 # 6 | 6 3 2 1 1 1 0 0 0 # 7 | 7 3 2 1 1 1 1 0 0 # 8 | 8 4 2 2 1 1 1 1 0 # 9 | 9 4 3 2 1 1 1 1 1 # # これを出力するようなプログラムを教えてください。 '整数除算による商の計算表(下記の例を参照)を表示する' :- 商の計算表本体(_商の計算表本体), 商の計算表見出し表示, 商の計算表本体の表示(_商の計算表本体). 商の計算表本体(_商の計算表本体) :- findall(_表示行,( between(1,9,_被除数), 表示行(_被除数,_表示行)), _商の計算表本体). 表示行(_被除数,_表示行) :- findall(N,( between(1,9,_除数), N is _被除数 // _除数), _商表示ならび), atomic_list_concat([_被除数,'|'|_商表示ならび],' ',_表示行). 商の計算表見出し表示 :- write(' | 1 2 3 4 5 6 7 8 9\n--+------------------\n'). 商の計算表本体の表示(_商の計算表本体) :- append(_,[_表示行|R],_商の計算表本体), write('%t\n',[_表示行]), R = []. % 以下のサイトは # このディレクトリの索引 # [1] 授業単元:プログラミング # [2] 問題文( # キーボードから入力したメニュー番号に沿った図形を「*」で表示するプログラムを # 作成してください。なお、プログラム作成時は以下の仕様に従ってください。 # ファイル名: kadai3.c # 【 問題作成時の注意点 】 # ・メニュー番号と図形の種類は以下の通りとします。なお、キーボードから # 入力した値が以下の番号以外の場合、再びメニュー番号を入力するように # してください。 # 1 三角形 # 2 四角形 # ・図形の段数(高さ)は、キーボードから入力してください。なお、キーボード # から入力した数が1 以下の場合、エラーメッセージを表示し、exit 関数で # プログラムを終了してください。 # エラーメッセージの例) wrong number # ・図形の表示には関数を利用してください。関数のプロトタイプ宣言は以下の # 通りとします。 # void DrawTriangle(int); # void DrawRectangle(int); # [3] 環境 #  [3.1] OS: Windows #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C++ # [4] 期限: ([2006年11月2日17:30まで # [5] その他の制限:なし 'キーボードから入力したメニュー番号に沿った図形を「*」で表示するプログラムを 作成してください。なお、プログラム作成時は以下の仕様に従ってください。 l・メニュー番号と図形の種類は以下の通りとします。なお、キーボードから 入力した値が以下の番号以外の場合、再びメニュー番号を入力するように してください。 1 三角形 2 四角形 ・図形の段数(高さ)は、キーボードから入力してください。なお、キーボード から入力した数が1 以下の場合、エラーメッセージを表示し、exit 関数で プログラムを終了してください。' :- 'キーボードから入力した 1 三角形 2 四角形 のメニュー番号'(_メニュー番号), 'メニュー番号に沿った図形を「*」で表示する'(_メニュー番号). 'キーボードから入力した 1 三角形 2 四角形 のメニュー番号'(_メニュー番号) :- write('左側の数字で選択してください\n\n1 三角形\n2 四角形\n\n'), 整数を得る('メニュー番号[1/2]',member(_メニュー番号,[1,2]),_メニュー番号). 'メニュー番号に沿った図形を「*」で表示する'(1) :- 三角形の表示. 'メニュー番号に沿った図形を「*」で表示する'(2) :- 四角形の表示. 三角形の表示 :- '図形の段数(高さ)を入力してください'(_図形の高さ), 三角形の図形像(_図形の高さ,_図形像), 図形表示(_図形像). 三角形の図形像(_図形の高さ,_図形像,_図形像) :- findall(_表示星列,( between(1,_図形の段数,_現在の段), 三角形の表示星列(_現在の段,_表示星列)), _図形像). 三角形の表示星列(_現在の段,_表示星列) :- length(L,_現在の段), all(L,'*'), atomic_list_concat(L,_表示星列). 四角形の表示 :- 幅を入力してください(_図形の幅), '図形の段数(高さ)は、キーボードから入力してください'(_図形の高さ), 四角形の図形像(_図形の幅,_図形の高さ,_図形像), 図形の表示(_図形像). 四角形の図形像(_図形の幅,_図形の高さ,_図形像) :- 表示星列(_図形の幅,_表示星列), findall(_表示星列,( between(1,_図形の高さ,_), 四角形の表示星列(_図形の幅,_表示星列)), _図形像). 図形の表示(_図形像) :- append(_,[_表示星列|R],_図形像), writef('%t\n',[_表示星列]), R = []. 四角形の表示星列(_現在の段,_表示星列) :- length(L,_現在の段), all(L,'*'), atomic_list_concat(L,_表示星列). '図形の段数(高さ)を入力してください'(_図形の高さ) :- 整数を得る(図形の段数,_図形の高さ), 図形の高さ診断(_図形の高さ),!. '図形の段数(高さ)を入力してください'(_図形の高さ) :- '図形の段数(高さ)を入力してください'(_図形の高さ). 図形の高さ診断(_図形の高さ) :- _図形の高さ > 1,!. 図形の高さ診断(_図形の高さ) :- writef('入力された図形の高さ %t はこの図形の高さとして適切でありません。\n再入力をお願いします。\n',[_図形の高さ]), fail. '幅を入力してください'(_図形の幅) :- 整数を得る(図形の段数,_図形の幅), 図形の幅診断(_図形の幅),!. '幅を入力してください'(_図形の幅) :- '幅を入力してください'(_図形の幅). 図形の幅診断(_図形の幅) :- _図形の幅 > 1,!. 図形の幅診断(_図形の幅) :- writef('入力された図形の幅 %t はこの図形の幅として適切でありません。\n再入力をお願いします。\n',[_図形の幅]), fail. all([],_). all([A|R],A) :- all(R). % 以下のサイトは # [1]プログラム演習 # [2] # 一定の文字からなる列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/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と表示される。*/ 'n>=m>=2を満たす整数nとmをキーボードから入力するとm進数でnを出力する' :- 'n>=m>=2を満たす整数nとmをキーボードから入力すると'(_n,_m), 'm進数でnを出力する'(_n,_m). 'n>=m>=2を満たす整数nとmをキーボードから入力すると'(_n,_m) :- 整数を得る(m進数のm,_m >= 2,_m), 整数を得る(整数n,_n >= _m,_n). 'm進数でnを出力する'(_n,_m) :- m進数でnを(_n,_m,_m進数文字列), writef('%t\n',[_m進数文字列]). m進数でnを(_n,_m,_m進数文字列) :- m進数(_n,_m,[],_m進数文字ならび), atomic_list_concat(_m進数文字ならび,_m進数文字列). m進数(0,_,L,L) :- !. m進数(_n,_m,L1,_m進数文字ならび) :- _n_1 is _n mod _m, _n_2 is _n // _m, m進数文字変換(_n_1,A), m進数(_n,_m,[A|L1],_m進数文字ならび). m進数文字変換(_n_1,A) :- _n_1 < 10, atom_number(A,_n_1),!. m進数文字変換(_n_1,A) :- _文字コード is _n_1 + 55, char_code(A,_文字コード). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/412 # # [1] 授業単元:C言語 for文 # [2] 問題文(含コード&リンク): # +#+#+#+#+* # +#+#+#+*-* # +#+#+*-*-* # +#+*-*-*-* # +*-*-*-*-*  # この模様を二重ループを使って作成せよ # '+#+#+#+#+* +#+#+#+*-* +#+#+*-*-* +#+*-*-*-* +*-*-*-*-*  この模様を作成する'(_模様を表すならび) :- findall(S,( append(L1,L2,[_,_,_,_]), 中の模様を生成(L1,L2,S)), _模様を表すならび). 中の模様を生成(L1,L2,S) :- all(L1,'#+'), all(L2,'*-'), atomic_list_concat(L1,S1), atomic_list_concat(L2,S2), atomic_list_concat([+,S1,S2,*],S). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ # '2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。' :- findall(Count,( between(1,100,N), count((between(1,100,M), U is random(1000), U < 400), Count)), L), 分布を表示する(L). 分布を表示する(L) :- between(0,100,N), 表示文字列を生成(N,L,_表示文字列), writef('%t: %t\n',[_カウント表示文字列]), N = 100. 表示文字列を生成(N,L,_表示文字列) :- 整数から文字列(2,Count,_カウント表示文字列), findall((*),( member(N,L)), L), atomic_list_concat([_カウント表示文字列,': '|L],_表示文字列). 整数から文字列(_文字列桁,_整数,_文字列) :- 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列),!. 整数から文字列(_文字列桁,_整数,_文字列) :- atom_number(_文字列,_整数). 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列) :- length(L,_文字列桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,' '), atomic_list_concat(L,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ # 'コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn,そのmax、min を調べよ。'(_n) :- append(_,[_試行回数|R],[10,100,1000,10000,100000]), 試行回数の集計ならび(_試行回数,_最大値,_最小値), 整数から文字列(6,_試行回数,_試行回数文字列), writef('試行回数%t: 最大値=%t 最小値=%t\n',[_試行回数文字列,_最大値,_最小値]), R = []. 試行回数の集計ならび(_試行回数,_最大値,_最小値) :- findall(S,( between(1,_試行回数,_), count(( between(1,_n,_), 1 is random(1)), S)), L), min(L,_最小値), max(L,_最大値),!. 整数から文字列(_文字列桁,_整数,_文字列) :- 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列),!. 整数から文字列(_文字列桁,_整数,_文字列) :- atom_number(_文字列,_整数). 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列) :- length(L,_文字列桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,' '), atomic_list_concat(L,_文字列). % 以下のサイトは '99 bottles of beer on the wall' :- A = ' bottles of beer on the wall, ', B = ' bottles of beer,\nTake one down and pass it around, ', C = ' bottles of beer on the wall.\n\n', D = '1 bottle of beer on the wall, 1 bottle of beer,\nTake one down, and pass it around,\nNow they are all gone.\n', '99 bottles of beer on the wall'(A,B,C,D). '99 bottles of beer on the wall'(A,B,C,D) :- findall([N,C,N,A,N,B],between(2,99,N),L_1), reverse([D|L_1],L_2), flatten(L_2,[_,_|L_3]), atomic_list_concat(L_3,_99_bottles_of_beer_on_the_wall), write(_99_bottles_of_beer_on_the_wall). % 以下のサイトは '99 bottles of beer on the wall' :- ' bottles of beer on the wall, ' = A, ' bottles of beer, Take one down and pass it around, ' = B, ' bottles of beer on the wall. ' = C, '1 bottle of beer on the wall, 1 bottle of beer, Take one down, and pass it around, Now they are all gone. ' = D, findall([N,C,N,A,N,B],between(2,99,N),L_1), reverse([D|L_1],L_2), flatten(L_2,[_,_|L_3]), atomic_list_concat(L_3,_99_bottles_of_beer_on_the_wall), write(_99_bottles_of_beer_on_the_wall). % 以下のサイトは a(' bottles of beer on the wall, '). b(' bottles of beer, Take one down and pass it around, '). c(' bottles of beer on the wall. '). d('1 bottle of beer on the wall, 1 bottle of beer, Take one down, and pass it around, Now they are all gone. '). '99 bottles of beer on the wall'(_99_bottles_of_beer_on_the_wall) :- a(A), b(B), c(C), d(D), findall_flatten_concat_2(A,B,C,D,_99_bottles_of_beer_on_the_wall). findall_flatten_concat_2(A,B,C,D,S) :- findall([N,C,N,A,N,B],( for(99,N,2)), L_1), flatten(L_1,[_,_|L_2]), append(L_2,[D],L_3), atomic_list_concat(L_3,S). % 以下のサイトは '99 bottles of beer on the wall' :- findall([N,' bottles of beer on the wall.\n\n',N,' bottles of beer on the wall, ',N,' bottles of beer,\nTake one down and pass it around, '],between(2,99,N),L_1), reverse(['1 bottle of beer on the wall, 1 bottle of beer,\nTake one down, and pass it around,\nNow they are all gone.\n'|L_1],L_2), flatten(L_2,[_,_|L_3]), atomic_list_concat(L_3,_99_bottles_of_beer_on_the_wall), write(_99_bottles_of_beer_on_the_wall). % 以下のサイトは findall_flatten_concat(A,B,C) :- findall_flatten(A,B,L), atomic_list_concat(L,C). findall_flatten(A,B,L) :- findall(A,B,L1), flatten(L1,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/357 # # ●正規表現の使用環境 # MSVC2012 / .NET Framework 4.5 # # ●検索か置換か? # 検索 # # ●説明 # 「|」「(」「)」が文字として入っているデータから、特定の文字列を抜き出したい。 # # ●対象データ # area|name (value) # # tokyo|yamada benzo (123) # kyoto|namae tarou (21) # saga|shitemo mitukaranai you (7) # # ●希望する結果 # area, name, value # # "tokyo", "yamada benzo", "123" # "kyoto", "namae tarou", "21" # "saga", "shitemo mitukaranai you", "7" # # このように取り出したいのですが、どのように書くとよいでしょうか # # 文字列の整形(_文字列,_整形された文字列) :- split(_文字列,['|','(',')'],L_1), 各要素の末尾の空白を取り除く(L_1,L_2), 文字列に整形する(L_2,'',_整形された文字列). 各要素の末尾の空白を取り除く([],[]). 各要素の末尾の空白を取り除く([A|R1],[B|R2]) :- 末尾の空白を取り除く(A,B), 各要素の末尾の空白を取り除く(R1,R2). 末尾の空白を取り除く(A,B) :- atom_cahrs(A,Chars), append(L1,L2,Chars), all(L2,' '), atomic_list_concat(L1,B),!. 末尾の空白を取り除く(A,A). 文字列に整形する([A],S_1,S) :- atomic_list_concat([S_1,'"',A,'"'],S),!. 文字列に整形する([A|R],S_1,S) :- atomic_list_concat([S_1,'"',A,'", '],S_2), 文字列に整形する(R,S_2,S). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/246 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/xFhlH4zn # # /* # 1から5までの数値を繰り返し入力し、それぞれの数値の頻度を以下のように表せ。 # ただし、入力範囲外の値が入力されたら入力を終了し結果を表示する。 # # # [実行例] # 値:3 # 値:4 # 値:3 # 値:3 # 値:2 # 値:2 # 値:3 # 値:0 # # //頻度を*のグラフで表し、3の倍数はxで表示する。// # 1=0: # 2=2:** # 3=4:**x* # 4=1:* # 5=0: # # */ # '1から5までの数値を繰り返し入力し、それぞれの数値の頻度を 1=0: 2=2:** 3=4:**x* 4=1:* 5=0: のように表せ。ただし、入力範囲外の値が入力されたら入力を終了し結果を表示する。' :- '1から5までの数値を入力範囲外の値が入力されるまで繰り返し入力し、結果を頻度とグラフで表示する'. '1から5までの数値を入力範囲外の値が入力されるまで繰り返し入力し、結果を頻度とグラフで表示する' :- '1から5までの数値を入力範囲外の値が入力されるまで繰り返し入力し'(_入力値ならび), 結果を頻度とグラフで表示する(_入力値ならび). '1から5までの数値を入力範囲外の値が入力されるまで繰り返し入力し'(_入力値ならび) :- 数値を入力(_数値), '1から5までの数値を入力範囲外の値が入力されるまで繰り返し入力し'(_数値,_入力値ならび). '1から5までの数値を入力範囲外の値が入力されるまで繰り返し入力し'(_数値,[]) :- 入力範囲外の値が入力された(_数値),!. '1から5までの数値を入力範囲外の値が入力されるまで繰り返し入力し'(_数値,[_数値|R]) :- '1から5までの数値'(_数値), 数値を入力(_数値_2), '1から5までの数値を入力範囲外の値が入力されるまで繰り返し入力し'(_数値_2,R). 数値を入力(_数値) :- 整数を得る('1から5までの整数(終了する時は範囲外の数値を入力)',_数値). '1から5までの数値'(_数値) :- between(1,5,_数値). 入力範囲外の値が入力された(_値) :- \+(between(1,5,_数値)). 結果を頻度とグラフで表示する(_入力値ならび) :- between(1,5,N), 結果を頻度とグラフで(N,_入力値ならび,0,_頻度,_グラフ表示記号ならび), 表示する(N,_頻度,_グラフ表示記号ならび), N = 5. 結果を頻度とグラフで(_,[],_頻度,_頻度,[]) :- !. 結果を頻度とグラフで(N,[N|R1],_頻度_1,_頻度,[_表示記号|R2]) :- _頻度_2 is _頻度_1 + 1, グラフの表示記号を選択する(_頻度_2,_表示記号), 結果を頻度とグラフで(N,R1,_頻度_2,_頻度,R2),!. 結果を頻度とグラフで(N,[_|R1],_頻度_1,_頻度,R2) :- 結果を頻度とグラフで(N,R1,_頻度_1,_頻度,R2). グラフの表示記号を選択する(_頻度,x) :- 頻度が3の倍数になったら(M_1). グラフの表示記号を選択する(_頻度,*) :- 頻度が3の倍数でなかったら(_頻度). 頻度が3の倍数になったら(_頻度) :- 0 is _頻度 mod 3. 頻度が3の倍数でなかったら(_頻度) :- \+(0 is _頻度 mod 3). 表示する(N,_頻度,_グラフ表示記号ならび) :- atomic_list_concat(_グラフ表示記号ならび,_表示グラフ文字列), writef('%t=%t: %t\n',[N,_頻度,_表示グラフ文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/226 # # [1]C言語 繰り返し文 # [2]問題 長いのでリンクでお願いします。 # http://ime.nu/codepad.org/iaWNbokN # [3]Linux ubuntu gcc C言語 # [4]今週日曜日迄 # [5]配列 ポインタなどは習ってないですよろしくお願いします。 # # 課題1. # #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文字です. '文字列処理 キーボードから姓名をアルファベット小文字で入力し(入力できる文字数は姓、名、最大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/127 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/YK6POzO6 # # 値を入力し、最小値と最大値を求める。 # ただしマイナスの値が入力されたら結果を表示する。 # # [実行例] # 値1:50 # 値2:32 # 値3:102 # 値4:2 # 値5:99 # 値6:-2 # # //最大値の右にmax、最小値の右にminと出力する。// # 1: 50 # 2: 32 # 3:102  max # 4: 2  min # 5: 99 # '値を入力し、最小値と最大値を求める。ただしマイナスの値が入力されたら結果を表示する。' :- findall(_値,( '値を入力し、'(_値), ( マイナスの値が入力されたら(_値),!, fail; true)), _値ならび), '入力した値をmin(最小値),max(最大値)を付加して表示する。'(_値ならび). '値を入力し、'(_値) :- append(L0,_,_), length([_|L0],_何番目), atomic_list_concat([値,_何番目],_催促表示), 数を得る(_催促表示,_値). '入力した値をmin(最小値),max(最大値)を付加して表示する。'(_値ならび) :- 最大値(_値ならび,_最大値), 最小値(_値ならび,_最小値), 全ての行を表示する(_値ならび,_最小値,_最大値). 全ての行を表示する(_値ならび,_最小値,_最大値) :- append(L0,[_値|R],_値ならび), length([_|L0],_何番目), 行表示文字列を生成(_何番目,_値,_最小値,_最大値,_行表示文字列), writef('%t\n',[_行表示文字列]), R = [],!. 行表示文字列を生成(_何番目,_値,_最小値,_最大値,_行表示文字列) :- atomic_list_concat([_何番目,':',_値],_行表示_1), 最小値ならminを付加(_値,_最小値,_行表示_1,_行表示_2), 最大値ならmaxを付加(_値,_最大値,_行表示_2,_行表示文字列). 最小値ならminを付加(_最小値,_最小値,_行表示_1,_行表示_2) :- atomic_list_concat([_行表示_1,' min'],_行表示_2),!. 最小値ならminを付加(_,_,_行表示,_行表示). 最大値ならminを付加(_最大値,_最大値,_行表示_1,_行表示_2) :- atomic_list_concat([_行表示_1,' max'],_行表示_2),!. 最大値ならminを付加(_,_,_行表示,_行表示). マイナスの値が入力されたら(V) :- integer(V), V < 0,!. マイナスの値が入力されたら(V) :- float(V), V < 0.0,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/79 # # [1] 授業単元:C言語 文字列 # [2] 問題文 # http://ime.nu/codepad.org/kqhMSJiH # # /* # # ・問題文 # 名字と名前(null文字を除き10文字以内)を入力し、実行例のように氏名を表示する。 # なお、 # # 氏名は名前の次に1文字あけて名字を表示する # 名前は最初の文字を大文字に、2文字以降を小文字に変換して表示する。 # 名字はすべて大文字に変換して表示する # # とし、文字列関数を用いて行う。 # # ・実行例 # # 名字と名前を入力してください # yamada taro # 出力: Taro YAMADA # 名字と名前を入力してください # kawada hanako # 出力: Hanako KAWADA # .... # # */ '名字と名前(null文字を除き10文字以内)を入力し、実行例のように氏名を表示する。なお、氏名は名前の次に1文字あけて名字を表示する。名前は最初の文字を大文字に、2文字以降を小文字に変換して表示する。名字はすべて大文字に変換して表示する' :- '名字と名前(null文字を除き10文字以内)を入力し'(_名字,_名前), '名前は最初の文字を大文字に、2文字以降を小文字に変換して'(_名前,_変換後の名前), '名字はすべて大文字に変換して'(_名字,_大文字に変換された名字), '実行例のように氏名を表示する。なお、氏名は名前の次に1文字あけて名字を表示する'(_変換後の名前,_大文字に変換されたの名字). '名字と名前(null文字を除き10文字以内)を入力し'(_名字,_名前) :- write('名字と名前を入力してください\n'), 一行読み込む(_入力された名字), 一行読み込む(_入力された名前), 名字はnull文字をのぞき10文字以内(_入力された名字,_名字), 名前はnull文字をのぞき10文字以内(_入力された名前,_名前). 名字はnull文字をのぞき10文字以内(_入力された名字,_名字) :- null文字をのぞき10文字以内(_入力された名字,_名字). 名前はnull文字をのぞき10文字以内(_入力された名前,_名前) :- null文字をのぞき10文字以内(_入力された名前,_名前). null文字をのぞき10文字以内(_文字列,_null文字をのぞき10文字以内に制限された文字列) :- null文字をのぞき(_文字列,_null文字を除いた文字列), '10文字以内'(_null文字を除いた文字列,_null文字をのぞき10文字以内に制限された文字列). null文字をのぞき(_文字列,_null文字を除いた文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(_文字 = '')), _文字ならび), atom_chars(_null文字を除いた文字列,_文字ならび). '10文字以内'(_文字列,_10文字以内に制限された文字列) :- sub_atom(_文字列,0,10,_,_10文字以内に制限された文字列),!. '10文字以内'(_文字列,_文字列). '名前は最初の文字を大文字に、2文字以降を小文字に変換して'(_名前,_変換後の名前) :- 名前は最初の文字を大文字に(_名前,_大文字化された最初の文字), '2文字以降を小文字に変換して'(_名前,_小文字化された2文字以降), atomic_list_concat([_大文字化された最初の文字,_小文字化された2文字以降],_変換後の名前). 名前は最初の文字を大文字に(_名前,_大文字化された最初の文字) :- sub_atom(_名前,0,1,R,_最初の文字), to_upper(_最初の文字,_大文字化された最初の文字). '2文字以降を小文字に変換して'(_名前,_小文字化された2文字以降) :- sub_atom(_名前,1,_,0,_2文字以降), to_lower(_2文字以降,_小文字化された2文字以降). '名字はすべて大文字に変換して'(_名字,_大文字に変換された名字) :- to_upper(_名字,_大文字に変換された名字). '実行例のように氏名を表示する。なお、氏名は名前の次に1文字あけて名字を表示する'(_変換後の名前,_大文字に変換された名字) :- writef('出力: %t %t\n',[_変換後の名前,_変換後の名字]). % ・実行例 % % 名字と名前を入力してください % yamada taro % 出力: Taro YAMADA % 名字と名前を入力してください % kawada hanako % 出力: Hanako KAWADA % .... % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/311 # # ●正規表現の使用環境 # 練馬、nemery等のリネームソフト # 可能なソフトに乗り換えようと思ってます # # ●検索か置換か? # 置換 # # ●説明 # 1.ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま #  ファイル名途中の数字はスルーさせたい # 2.特定の文字(例では#)から特定の文字(例では-)の前までを削除したい # # ●対象データ # キリン#◯☓動物園-10月1 # しろくま#△☓◯動物園-5月12 # 猫(2匹目)#我が家-11月5 # # ●希望する結果 # キリン-10月01 # しろくま-5月12 # 猫(2匹目)-11月05 # # よろしくお願いします # # '特定の文字(例では#)から特定の文字(例では-)の前までを削除したい'(_文字列,_特定の文字から,_特定の文字の前まで,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[_特定の文字から|R2],[_特定の文字の前まで|_]), atomic_list_concat([S1,S3],_置換された文字列),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/311 # # ●正規表現の使用環境 # 練馬、nemery等のリネームソフト # 可能なソフトに乗り換えようと思ってます # # ●検索か置換か? # 置換 # # ●説明 # 1.ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま #  ファイル名途中の数字はスルーさせたい # 2.特定の文字(例では#)から特定の文字(例では-)の前までを削除したい # # ●対象データ # キリン#◯☓動物園-10月1 # しろくま#△☓◯動物園-5月12 # 猫(2匹目)#我が家-11月5 # # ●希望する結果 # キリン-10月01 # しろくま-5月12 # 猫(2匹目)-11月05 # # よろしくお願いします # # 'ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名,_置換したファイル名) :- sub_atom(_ファイル名,_,_,2,_末尾文字2桁), 数字桁数評価(_末尾文字2桁,1), atomic_list_concat([_ファイル名,'0'],_置換したファイル名),!. 'ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名,_ファイル名). 数字桁数評価(_末尾文字2桁,2) :- atom_number(_末尾文字2桁,_数字),!. 数字桁数評価(_末尾文字2桁,2) :- sub_atom(_末尾文字2桁,1,1,0,_末尾文字1桁), atom_number(_末尾文字1桁,_数字),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/667 # # [1] 授業単元:C言語 # [2] 問題文: http://ime.nu/ideone.com/tRkzM # # 1. 10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示するプログラムを作成せよ。 #   ただし数値は何番目に生成した数値かも表示する。 # #   例)1番目に小さい数は475番目の数10049です。 # # 2. 10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を  表示するプログラムを作成せよ。また、各数値は何番目に生成したかも表示する。 # #   例)1番目に平均との差が小さい数は680番目の数69383です。 平均値との差は10.505です。 # # 3. n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。 #   ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15 は仮定する。 # #   例)program 5 # a,b,c,d,e # a,b,c,e,d # a,b,d,c,e # ・ #       ・ #     e,d,c,b,a 'n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15 は仮定する。'(_n) :- length(L,_n), 重複しないn文字を得る(_n,L), このn種類の文字を使って構成できるn文字列をすべて表示せよ(_n,L). 重複しないn文字を得る(0,L,L) :- !. 重複しないn文字を得る(N,L1,L) :- 'L1に重複しない一文字を追加する'(L1,L2), N_1 is N - 1, 重複しないn文字を得る(N_1,L2,L),!. 重複しないn文字を得る(N,L1,L) :- 重複しないn文字を得る(N,L1,L). 'L1に重複しない一文字を追加する'(L1,L2) :- write('一文字入力してください : '), get_char(_文字), \+(member(_文字,L1)), append(L1,[_文字],L2). このn種類の文字を使って構成できるn文字列をすべて表示せよ(_n,L) :- このn種類の文字を使って構成できるn文字列を(_n,L,_文字列ならび), append(_,[_文字列|R],_文字列ならび), writef('%t\n',[_文字列]), R = []. このn種類の文字を使って構成できるn文字列を(_n,L,_文字列ならび) :- findall(_文字列,( 順列(L,_n,L1), atomic_list_concat(L1,',',_文字列)), _文字列ならび). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- del(A,Y,Z), M is N - 1, 順列(Z,M,X). del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/641 # # [1] C言語 # [2] http://ime.nu/ideone.com/m8dZRの関数を利用して、 #   キーボードから日付を読み込んで、その次の日を求める #   プログラムを作成しなさい。 # # 実行例 # --------------------- # 年月日:20120913 # # 次の日は:2012/09/14 # --------------------- # # [3.1] Windows7 # [3.3] C言語 # [4] 9/13 19:00まで # # 'キーボードから日付を読み込んで、その次の日を求める' :- 'キーボードから日付を読み込んで'(_日付文字列), その次の日を求める(_日付文字列,_次の日文字列), writef('次の日は:%t\n',[_次の日文字列]). 'キーボードから日付を読み込んで'(_日付文字列) :- write('日付を文字列8桁で入力してください : '), get_line(_日付文字列), atom(_日付文字列), atom_length(_日付文字列,8),!. 'キーボードから日付を読み込んで'(_日付文字列) :- 'キーボードから日付を読み込んで'(_日付文字列). その次の日を求める(_日付文字列,_次の日文字列) :- sub_atom(_日付文字列,0,4,_,_年), sub_atom(_日付文字列,4,2,_,_月), sub_atom(_日付文字列,6,2,_,_日), その次の日を求める(_年,_月,_日,_次の日文字列). その次の日を求める(_年,'12','31',_次の日文字列) :- 翌年の一月一日(_年,_次の日文字列),!. その次の日を求める(_年,'02','29',_次の日文字列) :- 同年の三月一日(_年,_次の日文字列),!. その次の日を求める(_年,'02','28',_次の日文字列) :- \+(うるう年(_年)), 同年の三月一日(_年,_次の日文字列),!. その次の日を求める(_年,_月,'31',_次の日文字列) :- 大の月(_月), ここでは12月は除外する(_月), 翌月の一日(_年,_月,_次の文字列),!. その次の日を求める(_年,_月,'30',_次の日文字列) :- 小の月(_月), ここでは2月は除外する(_月), 翌月の一日(_年,_月,_次の日文字列),!. その次の日を求める(_年,_月,_日,_次の日文字列) :- 同年同月の次の日(_年,_月,_日,_次の日文字列). 翌年の一月一日(_年,_翌年の一月一日) :- 翌年(_年,_翌年), atomic_list_concat([_翌年,'0101'],_翌年の一月一日). 同年の三月一日(_年,_同年の三月一日) :- atomic_list_concat([_年,'0301'],_同年の三月一日). 翌月の一日(_年,_月,_翌月の一日) :- 翌月(_月,_翌月), atomic_list_concat([_年,_翌月,'01'],_翌月の一日). 同年同月の次の日(_年,_月,_日,_同年同月の次の日) :- 翌日(_日,_翌日), atomic_list_concat([_年,_月,_翌日],_同年同月の次の日). 大の月(_月) :- member(_月,['01','03','05','07','08','10','12']). 小の月(_月) :- member(_月,['02','04','06','09','11']). ここでは12月は除外する(_月) :- \+(_月 == '12'). ここでは2月は除外する(_月) :- \+(_月 == '02'). うるう年(_年文字列) :- atom(_年文字列), atom_number(_年文字列,_年整数), !, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 翌年(_年,_翌年) :- atom_number(_年,_年整数), _翌年整数 is _年整数 + 1, 頭部零文字列に変換(4,_翌年整数,_翌年). 翌月('01','02'). 翌月('02','03'). 翌月('03','04'). 翌月('04','05'). 翌月('05','06'). 翌月('06','07'). 翌月('07','08'). 翌月('08','09'). 翌月('09','10'). 翌月('10','11'). 翌月('11','12'). 翌月('12','01'). 翌日('01','02'). 翌日('02','03'). 翌日('03','04'). 翌日('04','05'). 翌日('05','06'). 翌日('06','07'). 翌日('07','08'). 翌日('08','09'). 翌日('09','10'). 翌日('10','11'). 翌日('11','12'). 翌日('12','13'). 翌日('13','14'). 翌日('14','15'). 翌日('15','16'). 翌日('16','17'). 翌日('17','18'). 翌日('18','19'). 翌日('19','20'). 翌日('20','21'). 翌日('21','22'). 翌日('22','23'). 翌日('23','24'). 翌日('24','25'). 翌日('25','26'). 翌日('26','27'). 翌日('27','28'). 翌日('28','29'). 翌日('29','30'). 翌日('30','31'). 翌日('31','01'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/641 # # [1] C言語 # [2] http://ime.nu/ideone.com/m8dZRの関数を利用して、 #   キーボードから日付を読み込んで、その次の日を求める #   プログラムを作成しなさい。 # # 実行例 # --------------------- # 年月日:20120913 # # 次の日は:2012/09/14 # --------------------- # # [3.1] Windows7 # [3.3] C言語 # [4] 9/13 19:00まで # # 'キーボードから日付を読み込んで、その次の日を求める' :- 'キーボードから日付を読み込んで'(_日付文字列), その次の日(_日付文字列,_次の日文字列), writef('次の日は:%t\n',[_次の日文字列]). 'キーボードから日付を読み込んで'(_日付文字列) :- write('日付を文字列8桁で入力してください : '), get_line(_日付文字列), atom(_日付文字列), atom_length(_日付文字列,8),!. 'キーボードから日付を読み込んで'(_日付文字列) :- 'キーボードから日付を読み込んで'(_日付文字列). その次の日(_日付文字列,_次の日文字列) :- sub_atom(_日付文字列,4,4,0,'1231'), 翌年の一月一日(_日付文字列,_次の日文字列). その次の日(_日付文字列,_次の日文字列) :- 二月(_日付文字列), うるう年(_日付文字列), 二十九日(_日付文字列), 同年の三月一日(_日付文字列,_次の日文字列). その次の日(_日付文字列,_次の日文字列) :- 二月(_日付文字列), \+(うるう年(_日付文字列)), 二十八日(_日付文字列), 同年の三月一日(_日付文字列,_次の日文字列). その次の日(_日付文字列,_次の日文字列) :- 大の月(_日付文字列), 三十一日(_日付文字列), 翌月の一日(_日付文字列,_次の文字列). その次の日(_日付文字列,_次の日文字列) :- 小の月(_日付文字列), 三十日(_日付文字列), 翌月の一日(_日付文字列,_次の日文字列). その次の日(_日付文字列,_次の日文字列) :- 同年同月の次の日(_日付文字列,_次の日文字列). 翌年の一月一日(_日付文字列,_翌年の一月一日) :- sub_atom(_日付文字列,0,4,_,_年), 翌年(_年,_翌年), atomic_list_concat([_翌年,'0101'],_翌年の一月一日). 同年の三月一日(_日付文字列,_同年の三月一日) :- sub_atom(_日付文字列,0,4,_,_年), atomic_list_concat([_年,'0301'],_同年の三月一日). 翌月の一日(_日付文字列,_翌月の一日) :- sub_atom(_日付文字列,0,4,_,_年), sub_atom(_日付文字列,4,2,_,_月), 翌月(_月,_翌月), atomic_list_concat([_年,_翌月,'01'],_翌月の一日). 同年同月の次の日(_日付文字列,_同年同月の次の日) :- sub_atom(_日付文字列,0,6,_年月), sub_atom(_日付文字列,6,2,_日), 翌日(_日,_翌日), atomic_list_concat([_年月,_翌日],_同年同月の次の日). 二月(_日付文字列) :- sub_atom(_日付文字列,4,2,_,'02'). 十二月(_日付文字列) :- sub_atom(_日付文字列,4,2,_,'12'). 三十一日(_日付文字列) :- sub_atom(_日付文字列,6,2,_,'31'). 三十日(_日付文字列) :- sub_atom(_日付文字列,6,2,_,'30'). 二十九日(_日付文字列) :- sub_atom(_日付文字列,6,2,_,'29'). 二十八日(_日付文字列) :- sub_atom(_日付文字列,6,2,_,'28'). 大の月(_日付文字列) :- sub_atom(_日付文字列,4,2,_,_月), member(_月,['01','03','05','07','08','10','12']), ここでは12月は除外する(_月). 小の月(_日付文字列) :- sub_atom(_日付文字列,4,2,_,_月), member(_月,['02','04','06','09','11']), ここでは2月は除外する(_月). ここでは12月は除外する(_月) :- \+(_月 == '12'). ここでは2月は除外する(_月) :- \+(_月 == '02'). うるう年(_年) :- atom(_年), atom_length(_年,4), atom_number(_年,_年整数), うるう年(_年整数) . うるう年(_日付文字列) :- atom(_日付文字列), atom_length(_日付文字列,8), sub_atom(_日付文字列,0,4,_,_年), atom_number(_年,_年整数), うるう年(_年整数) . うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 翌年(_年,_翌年) :- atom_number(_年,_年整数), _翌年整数 is _年整数 + 1, atom_number(_翌年,_翌年整数). 翌月('01','02'). 翌月('02','03'). 翌月('03','04'). 翌月('04','05'). 翌月('05','06'). 翌月('06','07'). 翌月('07','08'). 翌月('08','09'). 翌月('09','10'). 翌月('10','11'). 翌月('11','12'). 翌月('12','01'). 翌日('01','02'). 翌日('02','03'). 翌日('03','04'). 翌日('04','05'). 翌日('05','06'). 翌日('06','07'). 翌日('07','08'). 翌日('08','09'). 翌日('09','10'). 翌日('10','11'). 翌日('11','12'). 翌日('12','13'). 翌日('13','14'). 翌日('14','15'). 翌日('15','16'). 翌日('16','17'). 翌日('17','18'). 翌日('18','19'). 翌日('19','20'). 翌日('20','21'). 翌日('21','22'). 翌日('22','23'). 翌日('23','24'). 翌日('24','25'). 翌日('25','26'). 翌日('26','27'). 翌日('27','28'). 翌日('28','29'). 翌日('29','30'). 翌日('30','31'). 翌日('31','01'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/466 # # # [1] 授業単元:C言語 # [2] 問題文:プレイフェア暗号の作成 #       参考:http://ime.nu/www.tamagaki.com/math/PlayfairCipher.html # # #  プレイフェア暗号(Playfair cipher) # # プレイフェア暗号はイギリス人サー・チャールズ・ホイートストン(Sir Charles Wheatstone)により開発されライアン・プレイフェア(Lyon Playfair)が普及させました。プレイフェア暗号を用いて暗号化するとき、まずキーワードまたはキーフレーズをあらかじめ決めておきます。仮にキーワードをPlayfairとします。次にこのキーワードをアルファベットが重複することなく下の5×5の表に入れていきます。 # # ここで残りのセルに余ったアルファベットを挿入していくわけですが、アルファベットは26文字あって5×5では一字余ります。そこで I と J は同じセルに入れるとあらかじめ決めておきます。そこで新たに作られた表が下のようになります。 # # 準備ができたところで、次のメッセージを暗号化してみましょう。 # # メッセージ Abandon hope, all ye who enter here. # # このメッセージをまず二文字ずつ区切っていきます。 # # Ab-an-do-nh-op-ea-ll-ye-wh-oe-nt-er-he-re # # ここで7番目に ll と同じ文字が重複しているので間に x を入れます。 # # Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-e # # そうすると最後に e が一つ余ります。ここにもやはり x を入れておきます。 # # Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-ex # # まず最初の二文字 ab を暗号化してみましょう。ab は先ほど作った表では同じ列にあります。このときは ab の列のすぐ下の文字で置き換えます。 # # つまり ab は BH に変わります。ただし一番下の文字例えば w は一番上の文字 A に変換されます。 # # 同様に同じ行に入る二文字も出てきたとします。例えば ap などは右隣の文字に置き換えます。 # # つまり ap は YL になるわけですね。この場合も一番右の文字例えば f は一番左の文字 p に変換されます。 # # 最後に行も列も違う二文字が出てきた場合は次のようにします。例えば an を考えます。下の表のように a n それぞれの行および列を塗り分け、その交点となる文字を見ます。この場合、P と Q になります。 # # そこで a は、a h と同じ行の P に、n は、n と同じ行の Q に変換します。つまり、 # # do → RT # # nh → QE # # op → NL # # となるわけです。このルールに従って、先ほどのメッセージを暗号化すると、 # # 平文  Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-ex # # 暗号文 BH PQ RT QE NL HP YV AF HU GQ NU NM BG GI KU # # これでプレイフェア暗号による暗号化が終了したわけです。 # # この暗号はイギリスがボーア戦争(ブール戦争 BoreWar)で使用したといわれています。 プレイフェア暗号表の作成(_鍵文,_暗号表) :- 鍵文を25要素のならびに拡張して(_鍵文,_25要素ならび,_鍵文字以外の変数ならび), 'Jを除いたA-Zならびを切る'(_Jを除いたA_Zならび), 変数を埋める(_Jを除いたA_Zならび,Chars,_鍵文字以外の変数ならび), 'N個組'(5,_25要素のならび,_暗号表). 鍵文を25要素のならびに拡張して(_鍵文,_25要素ならび,_鍵文字ならび,_鍵文字以外の変数ならび) :- length(_25要素ならび,25), atom_chars(_鍵文,_鍵文字ならび), append(_鍵文字ならび,_鍵文字以外の変数ならび,_25要素ならび). 'A-Zならびを切る'(_Jを除いたA_Zならび) :- _切る回数 is random(113) + 1, トランプを切るようにならびを切る(_切る回数,25,['A','B','C','D','E','F','G','H','I','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_Jを除いたA_Zならび). 変数を埋める(_,_,[]). 変数を埋める(L_1,Chars,[V|R]) :- select(V,L_1,L_R), \+(member(V,Chars)), 変数を埋める(L_R,Chars,R). プレイフェア暗号による暗号化(_平文,_暗号文) :- メッセージをまず二文字ずつ区切っていきます(_平文,_二文字ずつに区切られたならび), プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号文字ならび), atomic_list_concat(_暗号文字ならび,_暗号文). メッセージをまず二文字ずつ区切っていきます(_平文,_二文字ずつに区切られたならび) :- atom_chars(_平文,Chars), すべての文字を大文字に変換(Chars,_大文字の文字ならび), メッセージをまず二文字ずつ区切っていきます(_大文字の文字ならび,_二文字ずつに区切られたならび). メッセージをまず二文字ずつ区切っていきます([],[]). メッセージをまず二文字ずつ区切っていきます(['J'|R1],[['J','J']|R2]) :- メッセージをまず二文字ずつ区切っていきます(R1,R2). メッセージをまず二文字ずつ区切っていきます([A],[[A,'X']]). メッセージをまず二文字ずつ区切っていきます([A,A|R1],[[A,'X']|R2]) :- メッセージをまず二文字ずつ区切っていきます([A|R1],R2). メッセージをまず二文字ずつ区切っていきます([A,B|R1],[[A,B]|R2]) :- \+(A=B), メッセージをまず二文字ずつ区切っていきます(R1,R2). プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号文字ならび) :- 暗号表(_暗号表), 転置(_暗号表,_転置された暗号表), プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号表,_転置された暗号表,_暗号文字ならび). プレイフェア暗号化([],_,_,[]). プレイフェア暗号化([['J','J']|R1],_暗号表,_転置された暗号表,['J'|R2]) :- プレイフェア暗号化(R1,_暗号表,_転置された暗号表,R2). プレイフェア暗号化([[A,B]|R1],_暗号表,_転置された暗号表,[C,D|R2]) :- 暗号に変換(A,B,_暗号表,C,D), プレイフェア暗号化(R1,_暗号表,_転置された暗号表,R2). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- member(L,_転置された暗号表), 'A,Bが暗号表の同一行または列にある'(A,B,L,C,D). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- member(L,_暗号表), 'A,Bが暗号表の同一行にある'(A,B,L,C,D). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- 暗号コードは矩形を仮想した時の他の二角(A,B,_暗号表,C,D). 'A,Bが暗号表の同一行または列にある'(A,B,L,C,D) :- member(A,L), member(B,L), 'A,Bの次の要素'(L,A,C), 'A,Bの次の要素'(L,B,D). 'A,Bの次の要素'(L,X,Y) :- append([Y|_],[X],L). 'A,Bの次の要素'(L,X,Y) :- append(_,[X,Y|_],L). 暗号コードは矩形を仮想した時の他の二角(A,B,_表,C,D) :- 'A,Bの行と列位置を得る'(A,B,_表,L_1,_列_A,L_2,_列_B), nth1(_列_B,L_1,C), nth1(_列_A,L_2,D). 'A,Bの行と列位置を得る'(A,B,_表,L_1,_列_A,L_2,_列_B) :- nth1(_行_A,_表,L_1), nth1(_列_A,L_1,A), nth1(_行_B,_表,L_2), nth1(_列_B,L_2,B). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/465 # # [1] 授業単元:C言語徹底入門 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/lgXR0ur1 # 次のプログラムは書式指定可能な10進16進変換表示を行う関数プログラムである。 # 関数の機能についてコメントで解説を入れ、同時にプログラムの流れを説明せよ。 # '16進数文字表現'(N,_16進数文字表現) :- findall(A,'16進数の下から一桁ずつ16進数0-15文字表現'(N,A),L), 反転して16進数文字表現に変換(L,_16進数文字表現). '16進数の下位桁から一桁ずつ16進数0-15文字表現'(N,A) :- '16進数の下一桁'(N,M), '16進数0-15文字表現'(M,A). '16進数0-15文字表現'(N,A) :- length(L,N), append([_|L],_,['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']), last([_|L],A). '16進数の下一桁'(0,_) :- !,fail. '16進数の下一桁'(N,M) :- 最下位桁を得る(N,M). '16進数の下一桁'(N,M) :- 上位桁の16進数の下一桁(N,M). 最下位桁を得る(N,M) :- M is N mod 16. 上位桁の16進数の下一桁(N,M) :- D is N // 16, '16進数の下一桁'(D,M). 反転して16進数文字表現に変換(_下位桁からの16進数文字ならび,_16進数文字表現) :- reverse(_下位桁からの16進数文字ならび,_16進数文字ならび), atomic_list_concat(_16進数文字ならび,_16進数文字表現). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/465 # # [1] 授業単元:C言語徹底入門 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/lgXR0ur1 # 次のプログラムは書式指定可能な10進16進変換表示を行う関数プログラムである。 # 関数の機能についてコメントで解説を入れ、同時にプログラムの流れを説明せよ。 # '16進数文字表現'(N,_16進数文字表現) :- findall(A,'16進数の下から一桁ずつ16進数0-15文字表現'(N,A),L), 反転して16進数文字表現に変換(L,_16進数文字表現). '16進数の下位桁から一桁ずつ16進数0-15文字表現'(N,A) :- '16進数の下一桁'(N,M), '16進数0-15文字表現'(M,A). '16進数0-15文字表現'(N,A) :- length(L,N), append([_|L],_,['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']), last([_|L],A). '16進数の下一桁'(0,_) :- !,fail. '16進数の下一桁'(N,M) :- M is N mod 16. '16進数の下一桁'(N,M) :- D is N // 16, '16進数の下一桁'(D,M). 反転して16進数文字表現に変換(_下位桁からの16進数文字ならび,_16進数文字表現) :- reverse(_下位桁からの16進数文字ならび,_16進数文字ならび), atomic_list_concat(_16進数文字ならび,_16進数文字表現). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/465 # # [1] 授業単元:C言語徹底入門 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/lgXR0ur1 # 次のプログラムは書式指定可能な10進16進変換表示を行う関数プログラムである。 # 関数の機能についてコメントで解説を入れ、同時にプログラムの流れを説明せよ。 # '16進数文字表現'(N,_16進数文字表現) :- '16進数文字表現ならび'(N,[],L), atomic_list_concat(L,_16進数文字表現). '16進数文字表現ならび'(0,L,L) :- !. '16進数文字表現ならび'(N,L1,L) :- M is N mod 16, '16進数0-16文字表現'(M,A), N_1 is N // 16, '16進数文字表現ならび'(N_1,[A|L1],L). '16進数0-16文字表現'(N,A) :- length(L,N), append([_|L],_,['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']), last([_|L],A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/830 # # 誰か助けて # # 問題1 # はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示するプログラムをex08-02.rbで保存して実行してください. # # 問題2 # 問題1のプログラムは、nilのスロットが指定されると、そのままnilを返します.このときには「そのスロットには文字列はありません.」と表示されるように、書き換えて、ex08-03.rbで保存して実行してください. # # 問題3 # はじめに文字列の値を設定した配列変数の各スロットについて、その文字列の文字数を表示するプログラムをex08-04.rbで保存して実行してください.たとえばstrings=[’dog’,’cat’,’mouse’]の場合、以下のように出力させます. # dogは3文字 # catは3文字 # mouseは5文字 # # 問題4 # はじめに文字列の値を設定した配列変数の各スロットの内容を3回ずつ表示するプログラムをex08-05.rbで保存して実行してください. # # 問題5 # 以下のように入力したいだけの文字列を入力するよう求めて、Enterが押されたらそれを入力した順につなげて1行に出力するプログラムをex08-07.rbで保存して実行してください. # 文字列を入力してください # dog[Enter] # 文字列を入力してください # cat[Enter] # 文字列を入力してください # elephant[Enter] # 文字列を入力してください # [Enter] # あなたの入力した文字列は # dog,cat,elephant # です. # # 問題6 # 問題5のプログラムを、文字列を入力とは逆順に出力するように書き換えたプログラムをex08-08.rbで保存して実行してください. # # 問題7 # 問題5のプログラムを、3文字の文字列のみを出力するように書き換えたプログラムをex08-09.rbで保存して実行してください. # # '問題1: はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示する' :- 入力された数字(_入力された数字), 文字列ならび(_文字列ならび), nth1(_入力された数字,_文字列ならび,_文字列), writef('%t\n',[_文字列]). 入力された数字(_入力された数字) :- 数を得る(数字,_入力された数字). '問題2: はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する' :- 入力された数字(_入力された数字), 文字列ならび(_文字列ならび), nth1(_入力された数字,_文字列ならび,_文字列), 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'(_文字列). 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'('') :- writef('%t\n',['そのスロットには文字列はありません.']). 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'(_文字列) :- \+(_文字列=''), writef('%t\n',[_文字列]). '問題3: はじめに文字列の値を設定した配列変数の各スロットについて、その文字列の文字数を表示する' :- 文字列ならび(_文字列ならび), append(_,[_文字列|R],_文字列ならび), atom_length(_文字列,_文字数), writef('%tの文字数は%t\n',[_文字列,_文字数]), R = []. '問題4: はじめに文字列の値を設定した配列変数の各スロットの内容を3回ずつ表示する' :- 文字列ならび(_文字列ならび), append(_,[_文字列|R],_文字列ならび), writef('%t\n%t\n%t\n',[_文字列,_文字列,_文字列]), R = []. '問題5: 入力したいだけの文字列を入力するよう求めて、Enterが押されたらそれを入力した順につなげて1行に出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), それを入力した順につなげて1行に出力する(_文字列ならび). 文字列を入力する(_文字列) :- writef('%t ',[文字列を入力してください]), get_line(_文字列). 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'('',[]) :- !. 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列,[_文字列|R]) :- 文字列を入力する(_文字列_2), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_2,R). それを入力した順につなげて1行に出力する(_行ならび) :- atomic_list_concat(_行ならび,_表示文字列), writef('%t\n',[_表示文字列]). '問題6: 問題5のプログラムを、文字列を入力とは逆順に出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), reverse(_文字列ならび,_反転した文字列ならび), 各文字列を反転して表示する(_反転した文字列ならび). 各文字列を反転して表示する(_反転した文字列ならび) :- append(_,[_文字列|R],_反転した文字列ならび), 文字列を反転する(_文字列,_反転した文字列), writef('%t\n',[_反転した文字列]), R = []. 文字列を反転する(_文字列,_反転した文字列) :- atom_chars(_文字列,Chars), reverse(Chars,Chars_2), atom_chars(_反転した文字列,Chars_2). '問題7: 問題5のプログラムを、3文字の文字列のみを出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), '入力された文字列のうち3文字の文字列のみを出力する'(_文字列ならび). '入力された文字列のうち3文字の文字列のみを出力する'([]). '入力された文字列のうち3文字の文字列のみを出力する'([_文字列|R]) :- '3文字の文字列のみを出力する'(_文字列), '入力された文字列のうち3文字の文字列のみを出力する'(R). '3文字の文字列のみを出力する'(_文字列) :- atom_length(_文字列,3), writef('%t\n',[_文字列]),!. '3文字の文字列のみを出力する'(_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/141 # # ●正規表現の使用環境 # C# # # ●検索か置換か? # 検索 # # ●説明 # ●▼■ の部分をマッチさせたい # # ●対象データ # ほげほげ●▼■ほげおわり # ほげほげ●▼■ほげここまで # # ●希望する結果 # ●▼■ # # ほげほげ(?<1>.+?)ほげおわり|ほげここまで # # のように書きましたがだめみたいです。 # これだと # ほげほげ(?<1>.+?)ほげおわり もしくは # ほげここまで # という風になってしまうのでしょうか? # ほげおわり か ほげここまで のどちらかという書き方を教えてほしいです。 # # '「ほげほげ」で始まり「ほげほげおわり」か「ほげほげここまで」で終わる'(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), '「ほげほげ」で始まり'(S2,S2_1), '「ほげほげおわり」か「ほげほげここまで」で終わる'(S2_1), '「ほげほげ」で始まり「ほげほげおわり」か「ほげほげここまで」で終わる'(S1,S2,S3). '「ほげほげ」で始まり「ほげほげおわり」か「ほげほげここまで」で終わる'(_前文字列,_検索文字列,_後文字列,_前文字列,_検索文字列,_後文字列). '「ほげほげ」で始まり「ほげほげおわり」か「ほげほげここまで」で終わる'(S1,S2,S3,_前文字列,_検索文字列,_後文字列) :- '「ほげほげ」で始まり「ほげほげおわり」か「ほげほげここまで」で終わる'(S3,_前文字列_1,_検索文字列,_後文字列), atomic_list_concat([S1,S2,_前文字列_1],_前文字列). '「ほげほげ」で始まり'(S2,S2_1) :- sub_atom(S2,0,4,R,ほげほげ), sub_atom(S2,4,R,0,S2_1),!. '「ほげほげおわり」か「ほげほげここまで」で終わる'(S2_1) :- sub_atom(S2_1,S1,Len,0,ほげほげおわり), \+((sub_atom(S2_1,_,_,E,ほげほげ),E>3)). '「ほげほげおわり」か「ほげほげここまで」で終わる'(S2_1) :- sub_atom(S2,_,_,0,ほげほげここまで), \+((sub_atom(S2_1,_,_,E,ほげほげ),E>4)). % 以下のサイトは % % 文字列置換には、 % 1) 一ヶ所書き換えたらそれで終わり % 2) 複数置換可能の箇所かあれば、全部書き換える % 3) 先頭から書き換え可能の部分を順にさらに次の書き換え候補を置換しに行くか % 問い合わせながら置換する % 4) 先頭から書き換え可能の部分を書き換えてみるが、外部からtrueの指示が % ない場合は、元に戻して次の候補に進む。 % の三方式が考えられる。ここではその 3)の「非決定的に順に置換する」を定義する。 % 文字列を非決定的に順に置換する(_文字列,_置換対象副文字列,_置換文字列,_置換された文字列) :- sub_atom(_文字列,S,Len,R,_置換対象文字列), sub_atom(_文字列,0,S,_前文字列), sub_atom(_文字列,_,R,0,_後文字列), 文字列を非決定的に順に置換する(_文字列,_置換対象文字列,_置換文字列,_前文字列,_後文字列,_置換された文字列). 文字列を非決定的に順に置換する(_文字列,_,_,_文字列). 文字列を非決定的に順に置換する(_文字列,_置換対象文字列,_置換文字列,_前文字列,_後文字列,_置換された文字列) :- atomic_list_concat([_前文字列,_置換文字列,_後文字列],_置換された文字列). 文字列を非決定的に順に置換する(_文字列,_置換対象文字列,_置換文字列,_前文字列,_後文字列,_置換された文字列) :- 文字列を非決定的に順に置換する(_後文字列,_置換対象副文字列,_置換文字列,_置換された後文字列), atomic_list_concat([_前文字列,_置換文字列,_置換された文字列_2],_置換された後文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/309 # # [1] 授業単元:C言語プログラム演習 # [2] 問題文: # ../test/read.cgi/tech/1342966104/308の関数を用いて、1からuまでの乱数をN回発生させ、1から10までのそれぞれの数が発生した回数を数値および*の数で表し、さらに乱数の平均値も表示するプログラムを作成せよ。 # <出力例> # 1 :9回 : ********* # 2 :11回 : *********** # 3 :10回 : ********** # # 10 :5回 : ***** # 平均:5.54 # '1からuまでの乱数をN回発生させ、1から10までのそれぞれの数が発生した回数を数値および*の数で表し、さらに乱数の平均値も表示する'(_u,N) :- '1からuまでの乱数をN回発生させ'(_u,N,L), '1から10までのそれぞれの数が発生した回数を数値および*の数で表し'(L), 'さらに乱数の平均値も表示する'(L). '1からuまでの乱数をN回発生させ'(_u,N,L) :- findall(_1から_uまでの乱数,( between(1,N,_), _1から_uまでの乱数 is random(_u) + 1), L). '1から10までのそれぞれの数が発生した回数を数値および*の数で表し'(L,_度数を表す数値,_度数を表すグラフ) :- '1から10までの'(N), 'それぞれの数が発生した回数を'(L,_度数), '数値および*の数で表し'(_度数,_度数を表す数値,_度数を表すグラフ), writef('%t: %t回 %t\n',[_度数を表す数値,_度数を表すグラフ]), N = 10. '1から10までの'(N) :- between(1,10,N). 'それぞれの数が発生した回数を'(L,_度数) :- count(member(N,L),_度数). '数値および*の数で表し'(_度数,_度数を表す数値,_度数を表すグラフ) :- _度数 = _度数を表す数値, '度数を*で表す'(_度数,_度数を表すグラフ). '度数を*で表す'(_度数,_度数を表すグラフ) :- length(L,_度数), all(L,'*'), atomic_list_concat(L,_度数を表すグラフ). 'さらに乱数の平均値も表示する'(L) :- 相加平均(L,_平均値), writef('乱数の平均値: %t\n',[_平均値]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/278 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク) : 起動するとローマ字で姓と名を入力、 # 姓と名の合計ポイントが基本のポイント、姓と名の合計が7の倍数なら最終ポイントは1.5倍、 # 姓と名にl,u,c,k,yが含まれていたら追加で、lとcは1ポイント、他は1ポイント、 # tとbが文字に含まれていた場合3ポイント追加するプログラムの作成 # '起動するとローマ字で姓と名を入力、姓と名の合計ポイントが基本のポイント、姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する。合計点が7の倍数なら最終ポイントは1.5倍にする。' :- 起動するとローマ字で姓と名を入力(_姓,_名), '姓と名の合計ポイントが基本のポイント、姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する。'(_姓,_名,_合計点), '姓と名の合計が7の倍数なら最終ポイントは1.5倍'(_合計点,_最終ポイント), writef('最終ポイントは %t 点です。',[_最終ポイント]). 起動するとローマ字で姓と名を入力(_姓,_名) :- write('ローマ字で姓を入力してください : '), get_line(_姓), write('ローマ字で名を入力してください : '), get_line(_名). '姓と名の合計ポイントが基本のポイント、姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する。'(_姓,_名,_合計点) :- 姓と名の合計ポイントが基本のポイント(_姓,_名,_基本ポイント), '姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する'(_姓,_名,_追加点), _合計点 is _基本ポイント + _追加点. 姓と名の合計ポイントが基本のポイント(_姓,_名,_基本ポイント) :- atomic_list_concat([_姓,_名],_姓名), char_codes(_姓名,Codes), 標準偏差(Codes,_基本ポイント_1), _基本ポイント is truncate(_基本ポイント_1). '姓と名にl,u,c,k,yが含まれていたら、lとcはそれぞれ1ポイント、他はどれかが入っていたら1ポイント、tとbが文字に含まれていた場合3ポイント追加する'(_姓,_名,_追加点) :- 姓と名にlが含まれていたら1ポイント追加する(_姓,_名,_追加点_1), 姓と名にcが含まれていたら1ポイント追加する(_姓,_名,_追加点_2), 他はどれかが入っていたら1ポイント追加する(_姓,_名,_追加点_3), 姓と名にtとgが含まれていたら3ポイント追加する(_姓,_名,_追加点_4), _追加点 is _追加点_1 + _追加点_2 + _追加点_3 + _追加点_4. 姓と名にlが含まれていたら1ポイント追加する(_姓,_名,1) :- sub_atom(_姓,_,1,_,'l'), sub_atom(_名,_,1,_,'l'),!. 姓と名にlが含まれていたら1ポイント追加する(_,_,0). 姓と名にcが含まれていたら1ポイント追加する(_姓,_名,1) :- sub_atom(_姓,_,1,_,'c'), sub_atom(_名,_,1,_,'c'),!. 姓と名にcが含まれていたら1ポイント追加する(_,_,0). 他はどれかが入っていたら1ポイント追加する(_姓,_名,1) :- member(A,[u,k,y]), sub_atom(_姓,_,1,_,A), sub_atom(_名,_,1,_,A),!. 他はどれかが入っていたら1ポイント追加する(_,_,0). 姓と名にtとgが含まれていたら3ポイント追加する(_姓,_名,3) :- sub_atom(_姓,_,1,_,t), sub_atom(_名,_,1,_,g), sub_atom(_姓,_,1,_,t), sub_atom(_名,_,1,_,g),!. 姓と名にtとgが含まれていたら3ポイント追加する(_,_,0). '姓と名の合計が7の倍数なら最終ポイントは1.5倍'(_点数,_最終ポイント) :- 0 is _点数 mod 7, _最終ポイント is truncate(_点数 * 1.5),!. '姓と名の合計が7の倍数なら最終ポイントは1.5倍'(_点数,_点数). 標準偏差(L,V) :- length(L,N), 相加平均(L,M), 標準偏差(L,N,M,0.0,V). 標準偏差([],N,M,S,V) :- V is sqrt(S / (N - 1)),!. 標準偏差([A|R],N,M,S,V) :- S1 is (A - M) ^ 2, S2 is S + S1, 標準偏差(R,N,M,S2,V). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0,M). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/965 # # 休憩時間が設定されているときに、指定日時より'HH:MM'後の時刻を求めたいです。 # # ・データベース:PostgreSQL 8.4 # ・テーブル: # 休憩時間 # 開始時刻 終了時刻 # 08:00 08:30 # 19:00 19:30 # 22:00 22:30 # # 使うかどうかわかりませんが、次のマスタもあります。 # カレンダー # 日付 # ... # 2012-07-26 # 2012-07-27 # 2012-07-28 # ... # # ・説明 # 指定した日時から休憩時間を除いた'HH:MM'後を計算します。 # 計算結果が休憩時間内(開始終了時刻を含む)の場合は、休憩時間終了時刻を結果とします。 # # ・欲しい結果 # '2012-07-27 09:00'の'09:00'後 => '2012-07-27 18:00'(休憩時間がないのでそのまま足す) # '2012-07-27 09:00'の'10:00'後 => '2012-07-27 19:30'(10時間後は19:00の休憩と重なるので、19:30が答え) # '2012-07-27 09:00'の'11:00'後 => '2012-07-27 20:30' # '2012-07-27 09:00'の'13:00'後 => '2012-07-27 23:00'(19:00〜と22:00〜の二回の休憩を挟む) # # '指定した日時から休憩時間を除いたHH:MM後を計算します。計算結果が休憩時間内(開始終了時刻を含む)の場合は、休憩時間終了時刻を結果とします。'(_起点時刻,_時間後,_時間後の時刻) :- 休憩時間ならびと就業時間ならびを生成する(_休憩時間ならび,_就業時間ならび), 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす(_休憩時間ならび,_起点時刻,_時間後,_更新された起点時刻,_更新された時間後), 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_更新された起点時刻,_最後の休憩終了時刻,_更新された時間後,_就業時間ならび,_時間後の時刻). 休憩時間ならびと就業時間ならびを生成する(_就業時間ならび) :- findall([_開始時刻,_終了時刻],( 休憩時間(_開始時刻,_終了時刻)), _休憩時間ならび), 就業時間ならびを生成する(L,_就業時間ならび). 就業時間ならびを生成する([],[]). 就業時間ならびを生成する([[A,B],[C,D]|R1],[[B,C]|R2]) :- 就業時間ならびを生成する([[C,D]|R1],R2). 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([],_起点時刻,_時間後,0,_時間後の時刻) :- _時間後の時刻 is _起点時刻 + _時間後,!. 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([[_休憩起点時刻,_休憩終了時刻]|R1],_起点時刻,0,_時間後の時刻) :- _休憩起点時刻 @>= _起点時刻, 時間の引き算(_休憩起点時刻,_起点時刻,_休憩起点時刻までの時間), _休憩起点時刻までの時間 @>= _時間後, 時間の足し算(_起点時刻,_時間後,_時間後の時刻),!. 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([[_休憩起点時刻,_休憩終了時刻]|R1],_起点時刻,_更新された時間後,_休憩終了時刻) :- _休憩起点時刻 @>= _起点時刻, 時間の引き算(_休憩起点時刻,_起点時刻,_休憩起点時刻までの時間), _休憩起点時刻までの時間 @< _時間後, 時間の引き算(_時間後,_休憩起点時刻までの時間,_更新された時間後),!. 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([[_休憩起点時刻,_休憩終了時刻]|R1],_起点時刻,_時間後,_更新された時間後,_更新された時間後時刻) :- \+(_休憩起点時刻 @>= _起点時刻), 最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす(R1,_起点時刻,_時間後,_更新された時間後,_更新された時間後時刻). 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_時間後の時刻,_,0,_,_時間後の時刻) :- !. 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_,_時間後,[],_時間後の時刻) :- 時間の足し算(_起点時刻,_時間後,_時間後の時刻),!. 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_,_時間後,[[A,B]|R1],_時間後の時刻) :- 時間の引き算(B,A,_次の就業時間枠), _時間後 @=< _次の就業時間枠, 時間の足し算(A,_時間後,_時間後の時刻),!. 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_最後の休憩終了時刻,_時間後,[[A,B]],_時間後の時刻) :- 時間の引き算(B,A,_次の就業時間枠), 時間の引き算(_時間後,_次の就業時間枠,_更新された時間後), 時間の足し算(_最後の休憩終了時刻 +_時間後,_時間後の時刻),!. 次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_最後の休憩終了時刻,_時間後,[[A,B],[C,D]|R1],_時間後の時刻) :- 時間の引き算(B,A,_次の就業時間枠), 時間の引き算(_時間後,_次の就業時間枠,_更新された時間後), 時間の足し算(C,_時間後,_時間後の時刻),!. 時間の引き算(_時刻_1,_時刻_2,_時刻_3) :- '時刻から年・月・日・時・分を得る'(_時刻_1,_年_1,_月_1,_日_1,_時_1,_分_1), '時刻から年・月・日・時・分を得る'(_時刻_2,_年_2,_月_2,_日_2,_時_2,_分_2), 時間の引き算(_時刻_1,_年_1,_月_1,_日_1,_時_1,_分_1,_年_2,_月_2,_日_2,_時_2,_分_2,_年,_月,_日,_時,_分), atomic_list_concat([_年,-,_月,-,_日,' ',_時,':',_分],_時刻_3). 時間の足し算(_時刻_1,_時刻_2,_時刻_3) :- '時刻から年・月・日・時・分を得る'(_時刻_1,_年_1,_月_1,_日_1,_時_1,_分_1), '時刻から年・月・日・時・分を得る'(_時刻_2,_年_2,_月_2,_日_2,_時_2,_分_2), 時間の足し算(_時刻_1,_年_1,_月_1,_日_1,_時_1,_分_1,_年_2,_月_2,_日_2,_時_2,_分_2,_年,_月,_日,_時,_分), atomic_list_concat([_年,-,_月,-,_日,' ',_時,':',_分],_時刻_3). '時刻から年・月・日・時・分を得る'(_時刻,_年,_月,_日,_時,_分) :- split(_時刻,['-',':',' '],[_年,_月,_日,_時,_分]),!. 時間の足し算(_年_1,_月_1,_日_1,_時_1,_分_1,_年_2,_月_2,_日_2,_時_2,_分_2,_年,_月,_日,_時,_分) :- _年_3 is _年_1 + _年_2, _月_3 is _月_1 + _月_2, _日_3 is _日_1 + _日_2, _時_3 is _時_1 + _時_2, _分_3 is _分_1 + _分_2, 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分). 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分) :- _分_3 >= 60, _分_4 is _分_3 - 60, _時_4 is _時_3 + 1, 時間の補正(_年_3,_月_3,_日_3,_時_4,_分_4,_年,_月,_日,_時,_分),!. 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分) :- _時_3 >= 24, _時_4 is _時_3 - 24, _日_4 is _日_3 + 1, 時間の補正(_年_3,_月_3,_日_4,_時_4,_分_3,_年,_月,_日,_時,_分),!. 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分) :- 月末補正(_年_3,_月_3,_日_3,_月_4,_日_4), 時間の補正(_年_3,_月_4,_日_4,_時_3,_分_3,_年,_月,_日,_時,_分). 時間の補正(_年_3,_月_3,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分) :- _月_3 > 12, _年_4 is _年_3 + 1, 時間の補正(_年_4,1,_日_3,_時_3,_分_3,_年,_月,_日,_時,_分),!. 時間の補正(_年,_月,_日,_時,_分,_年,_月,_日,_時,_分). 月末補正(_年_3,_月_3,_日_3,_月_4,_日_4) :- % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/106 # # [1] 授業単元:C言語プログラム # [2] 問題文: # http://ime.nu/codepad.org/dZkqNN3s # 上記のプログラムを参考にして、以下のファイルidata.txtから8文字を読み出して画面出力するプログラムを作成せよ。 # 但し、以下の内容のデータファイルidata.txtを、emacsであらかじめ作成しておくこと。 # <出力例> # FILE READ OK # READ DATA->Aiba 160 # [idata.txt] # Aiba 160 59.3 # Kurata 162 51.6 # Masaki 182 76.5 # Nakashima 168 65.2 # Tanaka 170 60.7 # 'ファイルidata.txtから8文字を読み出して画面出力する'(_8文字の文字列) :- get_chars('idata.txt',Chars), append(_,[_1,_2,_3,_4,_5,_6,_7,_8|R],Chars), atomic_list_concat([_1,_2,_3,_4,_5,_6,_7,_8],_8文字の文字列), writef('%t\n',[_8文字の文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/63 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/img/371.txt # #include # int main(){ # int a[4][3]={ # {3,5,3}, # {4,3,5}, # {2,2,3}, # {1,8,7} # }; # # int b[4],x,y; # # for(y=0;y<=3;y++){ # b[y]=0; # for(x=0;x<=2;x++){ # b[y] += a[y][x]; # } # } # # for(y=0;y<=3;y++){ # printf("%d\n",b[y]); # } # } # 上のコードは、配列a[4][3]の各行の合計を求め、配列b[4]に保存し、求めた値を出力するプログラムです。 # これを改造して次のプログラムを作成せよ。 # # ・配列a[4][3]の各行において、その合計の昇順に行を並び替え、配列 c[4][3]に保存し、出力しなさい。 # ただし、各行の合計の値が等しいものがあった場合、行番号が小さいものを小さい順番にする。 # # '行列の各行において、その合計の昇順に行を並び替え、出力しなさい。ただし、各行の合計の値が等しいものがあった場合、行番号が小さいものを小さい順番にする。'(_行列,_行合計で整列した行列) :- 'その合計の昇順に行を並び替え'(_行列,_行合計で整列した行列), 出力しなさい(_行合計で整列した行列). 'その合計の昇順に行を並び替え'(_行列,_行合計で整列した行列) :- findsort([_行合計,_行番号],( nth1(_行番号,_行列,_行), sum(_行,_行合計)), _行合計で整列した行列). 出力しなさい(_行合計で整列した行列) :- 表示形式文字列の生成(_行合計で整列した行列,_表示形式文字列), append(_,[[_行合計,_行番号]|_残り行],_行合計で整列した行列), nth1(_行番号,_行列,_行), writef(_表示形式文字列,_行), _残り行 = []. 表示形式文字列の生成(_行合計で整列した行列,_表示形式文字列) :- nth1(1,_行合計で整列した行列,_行), length(_行,_列数), findall('%t',between(1,_列数,_),L), atomic_list_concat(L,',',S), atomic_list_concat(['| ',S,' |\n'],_表示形式文字列). findsort(_射影項,_目標,_整列した射影項ならび) :- findall(_射影項,_目標,_射影項ならび), sort(_射影項ならび,_整列した射影項ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/935 # # [1] 授業単元:C言語演習 # [2] 問題文: # 学生の英語、国語、数学の合計の得点データを処理するために、次のようなデータ型と名前のメンバを持つ構造体を考える。 #  氏名 : 文字型 name[20] #  英語得点 : 整数型 eigo #  国語得点 : 整数型 kokugo #  数学 : 整数型 sugaku # SCORE型の構造体配列data[5]を宣言せよ。 # そしてキーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると、最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力するプログラムを作成せよ。 # <データ例> # 番号 氏名 英語得点 国語得点 数学得点 # 1  nakashima 75   70    75 # 2  takada  85   65    70 # 3  arita   80   80    80 # 4  shimane  65   75    55 # 5  hirakata 70   77    90 # <出力例> # 英語 takada 85 # 国語 arita 80 # 数学 hirakata 90 # 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると、最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力する' :- length(Ln,5), 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'(Ln), '最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力する'. 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'([]). 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'([_|Ln]) :- 'データ(番号、氏名、各教科の得点)を入力すると', 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'(Ln). 'データ(番号、氏名、各教科の得点)を入力すると' :- 変数XXを得る(XX), 整数を得る(番号,_番号), 氏名を得る(_氏名), 各教科の得点を得る(_英語の得点,_国語の得点,_数学の得点), 成績を定義する(XX,_番号,_氏名,_英語の得点,_国語の得点,_数学の得点). 氏名を得る(_氏名) :- write('氏名 : '), get_line(_氏名). 各教科の得点を得る(_英語の得点,_国語の得点,_数学の得点) :- 整数を得る(英語得点,_英語得点), 整数を得る(国語得点,_国語得点), 整数を得る(数学得点,_数学得点). '最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力する' :- append(_,[_教科|R],[英語,国語,数学]), 教科の最高得点を得る(_教科,_氏名,_最高得点), writef('%t の最高得点者は %t 得点は %t\n',[_教科,_氏名,_最高得点]). R = []. 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点) :- assertz(成績(_XX,番号,_番号)), assertz(成績(_XX,氏名,_氏名)), assertz(成績(_XX,英語,_英語得点)), assertz(成績(_XX,国語,_国語得点)), assertz(成績(_XX,数学,_数学得点)),!. 教科の最高得点を得る(_教科,_氏名,_最高得点) :- findmax([_得点,_氏名],( 成績(XX,_教科,_得点), 成績(XX,氏名,_氏名)), _最高得点). 変数xxを得る(_XX) :- N is random(99999999) + 1, 整数から文字列(8,N,A), atomic_list_concat([x,A],_XX), \+(成績(_XX,番号,_)),!. 変数xxを得る(_XX) :- 変数xxを得る(_XX). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/924 # # [1] 授業単元:C言語 # [2] 問題文: # 学生の英語、国語、数学の合計の得点データを処理するために、次のようなデータ型と名前のメンバを持つSCORE型構造体を考える。 # 学籍番号:整数型 number # 氏名:文字型 name[20] # 英語得点:整数型 eigo # 国語得点:整数型 kokugo # 数学得点:整数型 sugaku # 合計得点:整数型 goukei # SCORE型の2つの構造体変数x1,x2を宣言せよ。 # そしてキーボードから番号、氏名、各教科の得点を入力すると英語、国語、数学の3教科の合計点が計算され、合計点の高い方の学生の氏名と合計点が出力されるプログラムを作成せよ。 # <データ例> # 変数 番号 氏名 英語得点 国語得点 数学得点 # x1  1  nakashima 75  80    75 # x2  2  takada  77   82    70 # <出力列> # nakashima 230 # 'キーボードから番号、氏名、各教科の得点を入力すると英語、国語、数学の3教科の合計点が計算され、合計点の高い方の学生の氏名と合計点が出力される' :- 'キーボードから番号、氏名、各教科の得点を入力すると', '英語、国語、数学の3教科の合計点が計算され'(_合計点_番号ならび), '合計点の高い方の学生の氏名と合計点が出力される'(_合計点_番号ならび). 'キーボードから番号、氏名、各教科の得点を入力すると' :- 一人分の成績を定義する, 'キーボードから番号、氏名、各教科の得点を入力すると'. 'キーボードから番号、氏名、各教科の得点を入力すると'. 一人分の成績を定義する :- 番号を得る(_番号), 氏名を得る(_氏名), 各教科の得点を得る(_英語得点,_国語得点,_数学得点), 成績を定義する(_番号,_氏名,_英語得点,_国語得点,_数学得点). 番号を得る(_番号) :- 整数を得る(番号,_番号),!, \+(_番号==0). 氏名を得る(_氏名) :- write('氏名を入力してください : '), get_line(_氏名). 各教科の得点を得る(_英語得点,_国語得点,_数学得点) :- 整数を得る(英語得点,_英語得点), 整数を得る(国語得点,_国語得点), 整数を得る(数学得点,_数学得点). 成績を定義する(_番号,_氏名,_英語得点,_国語得点,_数学得点) :- 変数xxを得る(_XX), 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点). 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点) :- assertz(成績(_XX,番号,_番号)), assertz(成績(_XX,氏名,_氏名)), assertz(成績(_XX,英語成績,_英語成績)), assertz(成績(_XX,国語成績,_国語成績)), assertz(成績(_XX,数学成績,_数学成績)),!. 変数xxを得る(_XX) :- N is random(99999999) + 1, 整数から文字列(8,N,A), atomic_list_concat([x,A],_XX), \+(成績(_XX,番号,_)),!. 変数xxを得る(_XX) :- 変数xxを得る(_XX). '英語、国語、数学の3教科の合計点が計算され'(_合計点_変数番号ならび) :- findsetof(_XX,( 成績(_XX,番号,_)), _XXならび), findall([_合計点,_XX],( member(_XX,_XXならび), 合計点を計算する(_XX,_合計点)), _合計点_変数番号ならび). 合計点を計算する(_XX,_合計点) :- 成績(_XX,英語成績,_英語成績), 成績(_XX,国語成績,_国語成績), 成績(_XX,数学成績,_数学成績), _合計点 is _英語成績 + _国語成績 + _数学成績. '合計点の高い方の学生の氏名と合計点が出力される'(_合計点_番号ならび) :- sort(_合計点_番号ならび,_整列された合計点_番号ならび), reverse(_整列された合計点_番号ならび,_降順に整列された合計点_番号ならび), _整列された合計点_番号ならび = [[_合計点,_XX]|_], 成績(_XX,氏名,_氏名), writef('合計点が高い方は %t で合計点 %t 点です。\n',[_氏名,_合計点]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/102 # # 正規表現での置き換え文字列をランダム化する方法はありませんか? # # 例 # 検索文字列 半角スペースで挟まれたアルファベット4文字 # ( )(\w{1})(\w{1})(\w{1})(\w{1})( ) # 置き換え結果 以下から ランダムでどれかを出力 # \1●●\3\4\5 # \1●\2●\4\5 # \1●\2\3●\5 # \1\2●●\4\5 # \1\2●\3●\5 # \1\2\3●●\5 # 分かる方いましたらお願いします。 # サクラエディタつかってますが # 半角スペースで挟まれたアルファベット4文字ランダムに置換候補文字列に置き換える(_文字列,A,B,C,D,E,F,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,[' '|R2],L3), append(L1_1,[' '],R2), \+(member(' ',L1_1)), ランダムに置換候補文字列を得る(A,B,C,D,E,F,_置換候補文字列), 半角スペースで挟まれたアルファベット4文字ランダムに置換候補文字列に置き換える(S3,A,B,C,D,E,F,_置換された文字列_2), atomic_list_concat([S1,' ',_置換候補文字列,' ',_置換された文字列_2],_置換された文字列),!. 半角スペースで挟まれたアルファベット4文字ランダムに置換候補文字列に置き換える(_文字列,A,B,C,D,E,F,_文字列). ランダムに置換候補文字列を得る(A,B,C,D,E,F,_置換候補文字列) :- R is random(6) + 1, 置換候補文字列(R,A,B,C,D,E,F,_置換候補文字列). 置換候補文字列(1,A,B,C,D,E,_文字列) :- atomic_list_concat([A,●●,C,D,E],__文字列),!. 置換候補文字列(2,A,B,C,D,E,_文字列) :- atomic_list_concat([A,●,B,●,D,E],__文字列),!. 置換候補文字列(3,A,B,C,D,E,_文字列) :- atomic_list_concat([A,B,●,C,●,E],__文字列),!. 置換候補文字列(4,A,B,C,D,E,_文字列) :- atomic_list_concat([A,B,●●,D,E],__文字列),!. 置換候補文字列(5,A,B,C,D,E,_文字列) :- atomic_list_concat([A,●,C,D,●,E],__文字列),!. 置換候補文字列(6,A,B,C,D,E,_文字列) :- atomic_list_concat([A,B,C,●●,E],__文字列),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/794 # # 正の整数mとn(1<=n<=9)を入力し, m桁の1以上n以下の数字を組み合わせてできる全ての数列を出力するプログラムを作れ. # # mが3でnが2の場合の例: # 111 # 112 # 121 # 122 # 211 # 212 # 221 # 222 # # '正の整数mとn(1<=n<=9)を入力し, m桁の1以上n以下の数字を組み合わせてできる全ての数列を出力する' :- '正の整数mとn(1<=n<=9)を入力し'(_m,_n), m桁の1以上n以下の数字を組み合わせてできる全ての数列を出力する(_m,_n). '正の整数mとn(1<=n<=9)を入力し'(_m,_n) :- 整数を得る(正の整数m,_m > 0,_m), 整数を得る('n(1<=n<=9)',(_n>=1,_n=<9),_n). m桁の1以上n以下の数字を組み合わせてできる全ての数列を出力する(_m,_n) :- m桁の1以上n以下の数字を組み合わせてできる全ての数列を(_m,_n,_m桁の1以上n以下の数字を組み合わせてできる全ての数列), 出力する(_m桁の1以上n以下の数字を組み合わせてできる全ての数列). m桁の1以上n以下の数字を組み合わせてできる全ての数列を(_m,_n,_m桁の1以上n以下の数字を組み合わせてできる全ての数列) :- 繰り返し数の制御のため_mをならびLmに変換する(_m,Lm), findall(_m桁の数字列,( m桁の1以上n以下の数字を組み合わせてできる数列(Lm,_n,_m要素の数字ならび), atomic_list_concat(_m要素の数字ならび,_m桁の数字列)), _m桁の1以上n以下の数字を組み合わせてできる全ての数列). m桁の1以上n以下の数字を組み合わせてできる数列([],_,[]). m桁の1以上n以下の数字を組み合わせてできる数列([_|Lm],_n,[_1以上n以下の数字|R]) :- '1以上n以下の数字を'(_n,_1以上n以下の数字), m桁の1以上n以下の数字を組み合わせてできる数列(Lm,_n,R). '1以上n以下の数字を'(_n,_1以上n以下の数) :- between(1,_n,_1以上n以下の数), atom_number(_1以上n以下の数字,_1以上n以下の数). 出力する(_数字文字列ならび) :- append(_,[_数字文字列|_残り要素],_数字文字列ならび), writef('%t',[_数字文字列]), _残り要素 = []. 繰り返し数の制御のため_mをならびLmに変換する(_m,Lm) :- length(Lm,_m). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/872 # # [1] 授業単元: C言語 # [2] 問題文: # 簡単な暗号化関数の作成 # 英文字を第1引数、正整数値のシフト幅nを第2引数として受け取り、第一 # 引数をASC競魁璽匹韮遒蘯分先に進めた文字を返す関数を作成せよ。 # たとえば第1引数が'b'(十進数の98)、第2引数6であった場合は戻り値は'h'(十進数の104)となる。 #  ただし、大文字を進めた場合に'z'より大きくなる場合には'A'に折り返す。たとえば、'W'を指定し # た場合は'C'が戻り値となる。小文字についても同様に、'z'を超える場合は'a'に折り返す。また、英大 # 文字・小文字以外が第一引数に与えられた場合は、第1引数をそのまま戻り値とする。 #  このような関数をcharshift()という名前で作成した上で、この関数を用いて以下の機能を持つプログ # ラムを作成せよ。 # # 「最初にキーボードから80文字以内の英文を1行入力し、次に正整数のシフト幅を入力する。 # そして、英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を1行に # 出力する」 # # このプログラムでは以下のような結果が得られる # Input English words. # UDU was established in 1907. (←キーボードからの入力) # Input shift number. # 6 (←キーボードからの入力) # AJA cgy kyzghroynkj ot 1907. # '英文字を第1引数、正整数値のシフト幅nを第2引数として受け取り、第一引数をASCIIコードでn進めた文字を返す'(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字) :- charsshift(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字). charsshift(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字) :- member(L,[[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']]), nth0(_nth0,L,_文字), _シフト is 26 + _シフト幅n - _nth0, ならびの回転(左方向,_シフト,L,_第一引数をASCIIコードでn進めた文字),!. '最初にキーボードから80文字以内の英文を1行入力し、次に正整数のシフト幅を入力する。そして、英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を1行に出力する' '最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文), '次に正整数のシフト幅を入力する'(_シフト幅), '英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を'(_80文字以内の文字列,_シフト幅,_変換された文字列), 一行で出力する(_変換された文字列). '最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文) :- get_line(_文字列), '診断: 最初にキーボードから80文字以内の英文を1行入力し'(_文字列,_80文字以内の英文),!. '診断: 最初にキーボードから80文字以内の英文を1行入力し'(_文字列,_80文字以内の英文) :- sub_atom(_文字列,0,80,_,_80文字以内の英文),!. '診断: 最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文,_80文字以内の英文). '次に正整数のシフト幅を入力する'(_シフト幅) :- 整数を得る(正整数のシフト幅,_シフト幅). '英文字のすべての文字を指定されたシフト幅だけcharsshiftで変換した文字列を'(_80文字以内の文字列,_シフト幅,_変換された文字列) :- findall(_変換された文字,( sub_atom(_80文字以内の英文,_,1,_,_英文字), charsshift(_英文字,_シフト幅,_変換された文字)), _変換された文字ならび), atomic_list_concat(_変換された文字ならび,_変換された文字列). 一行で出力する(_変換された文字列) :- writef('%t\n',[_変換された文字列]). % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/836 # # 【質問テンプレ】 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 文字列の操作 # キーボードから複数(50以内)の文字列(20文字以内)を入力する。 # 入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。 # 次に、入力した文字列の第1文字のアルファベット('a'〜'z','A'〜'Z')を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。 # なお、アルファベット以外の文字は変換しないこと。 # 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。' :- '文字列(20文字いない)を入力する'(_文字列), 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(_文字列,_文字列ならび), '次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。'(_文字列ならび). 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(_文字列,[]) :- sub_atom(_文字列,0,1,_,'0'),!. 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(50,_文字列,[_文字列]) :- !. 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(N,_文字列,[_文字列|R]) :- '文字列(20文字いない)を入力する'(_次の文字列), N_2 is N + 1, 'キーボードから複数(50以内)の文字列(20文字以内)を入力する。入力の終わりは文字列の第1文字に数字のゼロが入力されたときとする。'(N_2,_次の文字列,R). '文字列(20文字いない)を入力する'(_文字列) :- get_char(_最初の文字), '文字列(20文字いない)を入力する'(_最初の文字,_文字ならび), '20文字いない'(_文字ならび,_文字列). '文字列(20文字いない)'(_文字ならび,_文字列) :- length(_文字ならび,_要素数), '20文字いないに補正'(_要素数,_文字ならび,_文字列). '20文字いないに補正'(_要素数,_文字ならび,_文字列) :- _要素数 > 20, atom_chars(_文字列_1,_文字ならび), sub_atom(_文字列_1,0,20,_,_文字列). '20文字いないに補正'(_要素数,_文字ならび,_文字列) :- _要素数 =< 20, atom_chars(_文字列,_文字ならび). '文字列(20文字いない)を入力する'('\n',[]) :- !. '文字列(20文字いない)を入力する'(_文字,[_文字]) :- get_char(_次の文字), '文字列(20文字いない)を入力する'(N,_文字,[_文字]). '次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。'([],[]). '次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。'([_文字列|R1],[_変換された文字列|R2]) :- '入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して'(_文字列,_変換された文字列), 表示する(_変換された文字列), '次に、入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して表示する。'(R1,R2). '入力した文字列の第1文字のアルファベット(a〜z,A〜Z)を大文字に、第2文字以降のアルファベットを小文字に変換して'(_文字列,_変換された文字列) :- sub_atom(_文字列,0,1,_残り文字数,_第1文字), sub_atom(_文字列,1,_残り文字列,_,_残りの文字列), to_upper(_第一文字,_大文字化した文字), to_lower(_残り文字列,_小文字化した文字), atomic_list_concat([_大文字化した文字,_小文字化した文字],_変換された文字列). 表示する(_変換された文字列) :- writef('%t\n',[_変換された文字列]). % 最初、文字列を20文字まで読み取る部分はきっちり、20文字を越えたら述語を % 終了させていた。これだと、20文字以上の部分がキーボードバッファ上に残って % しまい、次の入力機会に、この文字列から入力されてしまう可能性がある。 % それで、文字数がオーバーしても、改行まで読み取りオーバーしている場合は % 切り取る方針にした。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/784 # # [1] 授業単元:C 言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/JrW6n1Q3 # 上記プログラムで作成したファイルを読み込んで中身を次のフォーマットで表示する関数 # void display_b(FILE *in_fp); # を作成し、その動作を確認するプログラムkadai11-2.cを作りなさい。 # ただし、ファイル名はプロトタイプ宣言で指定すること。 # また、出力は以下の出力例に示すフォーマットで画面出力されるものとする。 # # gcc kadai11-2.c # ./a.out # 1.000000 1.292166 # 1.010000 1.294241 # 1.020000 1.293094 # 1.030000 1.294946 # 1.040000 1.305628 # 1.050000 1.329642 # 1.060000 1.368... # 'ファイルを読み込んで中身を整形したフォーマットで表示する' :- フォーマットを推測する(' 1.000000 1.292166',_表示フォーマット), ファイルを読み込んで(LL), get_split_lines('test_bin.dat',LL), 整形したフォーマットで表示する(_表示フォーマット,LL). ファイルを読み込んで(LL) :- get_split_lines('test_bin.dat',[' '],LL). 整形したフォーマットで表示する(_表示フォーマット,[]). 整形したフォーマットで表示する(_表示フォーマット,[_要素ならび|R]) :- writef(_表示フォーマット,_要素ならび), 整形したフォーマットで表示する(_表示フォーマット,R). フォーマットを推測する(_文字列,_表示フォーマット) :- 要素ならびとして取り出す(_文字列,_要素ならび), フォーマット要素を推測する(_要素ならび,_表示フォーマットならび), atomic_list_concat(_表示フォーマットならび,_表示フォーマット). フォーマット要素を推測する([],['\n']) :- !. フォーマット要素を推測する([''|R1],R2) :- フォーマット要素を推測する(R1,R2),!. フォーマット要素を推測する([_要素|R1],[F|R2]) :- 要素は浮動小数点数(_要素,F), フォーマット要素を推測する(R1,R2),!. フォーマット要素を推測する([S|R1],[S|R2]) :- sub_atom(S,0,1,_,' '), フォーマットを推測する(R1,R2),!. フォーマット要素を推測する([S|R1],['%t'|R2]) :- フォーマットを推測する(R1,R2). 要素は浮動小数点数(_要素,F) :- sub_atom(_要素,S,1,_残り文字数,'.'), sub_atom(_要素,0,S,_,_小数点以上文字列), atomic_list_concat(['~',_残り文字数,f],F),!. 要素ならびとして取り出す(_文字列,[S1,S2|R1]) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 'S2は空白に挟まれている'(L1,L2,L3), 要素ならびとして取り出す(S3,R1),!. 要素ならびとして取り出す(_,[]) :- !. 'S2は空白に挟まれている'(L1,L2,L3) :- all(L1,' '), \+(member(' ',L2)), \+((L3 = [A|_],\+(A=' '))),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/191 # # 自然数N(N<10000)があたえられたとき、Nまでのうち素数のみを示すプログラムを作れ。 # 表示はコンソールに、コンマで区切って表示せよ。 # (ヒント:a,b(a<=b)の2数の積がN以下ならば最大となるaまでの素数を考えればよい) # # まずヒントが日本語じゃないです・・・ # 数学ができなくてもやる気があればできるというので大学に入ったのですが、もう毎日死ぬほど数学やってもわからない問題ばっかりです # 助けてください。毎日遊んだり合コンしたりと思ってたのに単位もらえそうになくて死にたいです # # '自然数N(N<10000)があたえられたとき、Nまでのうち素数のみを示す' :- '自然数N(N<10000)があたえられたとき'(_N), 'Nまでのうち素数のみを'(_N,_素数ならび), 示す(_素数ならび). '自然数N(N<10000)があたえられたとき'(_N) :- 自然数を得る('1000未満の自然数',_N < 1000,_N). 'Nまでのうち素数のみを'(_N,_素数ならび) :- findall(_m,( between(2,_N,_m)), L), % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/768 # # 数字が並んだテキストファイルからいくつかの数字だけを取り出して # 表示したいです. # 例:hoge.txt # 78 3 44 89 # 22 31 44 88 99 53 # 3 4 7 9 9 7 6 # 例えば上記のテキストデータですと, # 各行の最初の2つの数字以降の数字を取り出して # 表示したいです. # なお,読み込むテキストデータは行も列も不定になっています. # 上記のテキストデータは1行目は4列ですが,他の行は4列とは限りません. # なるべく簡単な関数で書けるとありがたいです. # 環境はvisual studio2010で書いてます. # # 初心者ですみません.よろしくお願いします. # '数字が並んだテキストファイルからいくつかの数字だけを取り出して表示する。各行の最初の2つの数字以降の数字を取り出して表示したい'(_テキストファイル) :- get_split_lines(_テキストファイル,[' '],LL), 各行の最初の2つの数字以降の数字を取り出して表示したい(LL,R), R = []. 各行の最初の2つの数字以降の数字を取り出して表示したい(LL,R) :- 各行の最初の2つの数字以降の数字を取り出して(LL,L,R), 表示したい(L). 各行の最初の2つの数字以降の数字を取り出して(LL,L,R) :- append(_,[[_,_|L]|R],LL). 表示したい(L) :- length(L,_要素数), length(L1,_要素数), all(L1,'%t'), atomic_list_concat(L1,' ',_表示パターン), writef(_表示パターン,L). % 以下のサイトは # # 正の整数を文字列に変換し、指定桁数に足らない場合ゼロを詰める # 頭部零文字列に変換(_指定桁数,_整数,_頭部零文字列) :- number_chars(_整数,Chars), lpad(Chars,_指定桁数,'0',_頭部零文字列). lpad(_文字列,_桁,_補填文字,_補填された文字列) :- 補填文字が必要(_文字列,_桁,_補填文字数), 補填文字列の生成(_補填文字,_補填文字数,_補填文字文字列), atomic_list_concat([_補填文字列,_文字列],_補填された文字列),!. lpad(_文字列の一,_,_,_文字列) :- atomic_list_concat([_文字列の一],_文字列). 補填文字が必要(_文字列,_桁,_補填文字数) :- atomic_length(_文字列,_文字列長), _補填文字数 is _桁 - _文字列長, _補填文字数 > 0. 補填文字列の生成(_補填文字,_補填文字数,_補填文字列) :- length(_補填文字ならび,_補填文字数), all(_補填文字ならび,_補填文字), atomic_list_concat(_補填文字ならび,_補填文字列). all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/745 # # 問題 # 1が連続しない2進数を1から小さい順に1000個求めよ。 # 例 # 10 => OK # 110 => NG # 10101 =>OK # 11011 =>NG # # '1が連続しない2進数を1から小さい順に1000個求めよ。'(_1000個の数ならび) :- findall(_10進数,( '1が連続しない2進数を1から小さい順に'([1],1,_度数,_ビットならび), ( _度数 > 1000,!,fail; 'ビットならびを10進数に変換'(_ビットならび,_10進数))), _1000個の数ならび). '1が連続しない2進数を1から小さい順に'([1|L],_度数,_度数,[1|L]). '1が連続しない2進数を1から小さい順に'([1|L],_度数_1,_度数,_ビットならび) :- _度数_2 is _度数_1 + 1, '1が連続しない2進数を1から小さい順に'([0,1|L],_度数_2,_度数,_ビットならび). '1が連続しない2進数を1から小さい順に'([0|L],_度数_1,_度数,_ビットならび) :- member(N,[1,0]), '1が連続しない2進数を1から小さい順に'([N,0|L],_度数_1,_度数,_ビットならび). 'ビットならびを10進数に変換'(L,_10進数) :- atomic_list_concat([0,b|L],_二進数表示), atom_to_term(_二進数表示,_10進数,_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/737 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/hx5VH # # 試験の各科目の点数を、受験者ごとに「出席番号 体育 美術 英語 数学 社会」の順番でテキストファイルに記録する。なお、出席番号は数字4桁、科目の点数は100点を満点とする。 # #  例: #    0001 55 66 66 77 77 # 0002 44 55 33 44 33 # 0003 33 43 53 53 53 # . # . # # 1,出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をファイルに記録するプログラムの作成。 # なお出力ファイル名はコマンドライン引数で与えることとし、出席番号に数字以外の文字が入力された場合にデータの入力を終了せよ。 # # 2,作成したファイルを読み込み、受験者ごとの合計点、順位を求め「出席番号 合計点 順位」 # の順にファイルに出力するプログラムを作成せよ。出力は成績順に並び替えなくとも良い。ただし、 # 入力ファイル名と出力ファイル名はコマンドライン引数で与えるものとする。 # # ファイル処理について習いました。stdin やFILE構造体、書式付き入出力、 # ブロック単位の入出力(size_t fwrite(const void *ptr, size_t size,size_t nmemb,FILE *stream) ) # などを習いました '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をファイルに記録する'(_ファイル) :- open(_ファイル,write,Outstream), 出席番号を標準入力から入力(_最初の出席番号), '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(Outstream,_最初の出席番号), close(Outstream). '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(_,end_of_file) :- !. '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(Outstream,_出席番号) :- 各科目の点数を標準入力から入力(_各科目の点数ならび), 上記のフォーマットにあわせて受験者の成績をOutstreamに出力(Outstream,_出席番号,_各科目の点数ならび), 出席番号を標準入力から入力(_次の出席番号), '出席番号、各科目の点数を標準入力から入力し、上記のフォーマットにあわせて受験者の成績をOutstreamに出力する'(Outstream,_次の出席番号). 出席番号を標準入力から入力(_出席番号) :- get_line(Line), '診断: 出席番号を標準入力から入力'(Line,_出席番号),!. '診断: 出席番号を標準入力から入力'(Line,_出席番号) :- write('出席番号を入力してください(終了する時はend_of_file) : '), atom_to_term(Line,_出席番号整数,_), integer(_出席番号整数), 頭部零文字列(4,_出席番号整数,_出席番号),!. '診断: 出席番号を標準入力から入力'(_,end_of_file). 各科目の点数を標準入力から入力(_各科目の点数ならび) :- findall(_点数,( member(_科目,[体育,美術,英語,数学,社会]), 整数を得る(_科目,(_点数>=0,_点数=<100),_点数)), _各科目の点数ならび). 上記のフォーマットにあわせて受験者の成績をOutstreamに出力(Outstream,_出席番号,_各科目の点数ならび) :- atomic_list_concat([_出席番号|_各科目の点数ならび],' ',_表示行文字列), writef(Outstream,'%t\n',[_表示行文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/745 # # 問題 # 1が連続しない2進数を1から小さい順に1000個求めよ。 # 例 # 10 => OK # 110 => NG # 10101 =>OK # 11011 =>NG # # '1が連続しない2進数を1から小さい順に1000個求めよ。' :- '1が連続しない2進数を1から小さい順に1000個求めよ。'([1],1). '1が連続しない2進数を1から小さい順に1000個求めよ。'([1|L],_度数) :- atomic_list_concat([0,b|[1|L]],S), atom_to_term(S,X,_), writef('%t: %t=%t\n',[_度数,X,S]), _度数 = 1000,!. '1が連続しない2進数を1から小さい順に1000個求めよ。'([1|L],_度数_1) :- _度数_2 is _度数_1 + 1, '1が連続しない2進数を1から小さい順に1000個求めよ。'([0|[1|L]],_度数_2). '1が連続しない2進数を1から小さい順に1000個求めよ。'([0|L],_度数) :- member(N,[1,0]), '1が連続しない2進数を1から小さい順に1000個求めよ。'([N|[0|L]],_度数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/710 # # # [1] 授業単元: Visual C# ソフトウェア開発 # # [2] 問題文(含コード&リンク): # #指定した親フォルダ下のbin、objフォルダ内のDebug、Rleaseフォルダを全て削除するプログラムを作成 # # '指定した親フォルダ下のbin、objフォルダ内のDebug、Rleaseフォルダを全て削除する'(_指定した親フォルダ) :- '指定した親フォルダ下のbin、objフォルダ内の'(_フォルダ_1), 'Debug、Rleaseフォルダを'(_フォルダ_2), '全て削除する'(_指定した親フォルダ,_フォルダ_1,_フォルダ_2). '指定した親フォルダ下のbin、objフォルダ内のDebug、Rleaseフォルダを全て削除する'(_). '指定した親フォルダ下のbin、objフォルダ内の'(_フォルダ_1) :- member(_フォルダ_1,[bin,obj]). 'Debug、Rleaseフォルダを'(_フォルダ_2) :- member(_フォルダ_2,['Debug','Rlease']). '全て削除する'(_指定した親フォルダ,_フォルダ_1,_フォルダ_2) :- atomic_list_concat([_指定した親フォルダ,/,_フォルダ_1,/,_フォルダ_2],_フォルダ), \+(exists_file(_フォルダ)), atomic_list_concat(['rm -R ',_フォルダ],S), shell(S), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/710 # # # [1] 授業単元: Visual C# ソフトウェア開発 # # [2] 問題文(含コード&リンク): # #指定した親フォルダ下のbin、objフォルダ内のDebug、Rleaseフォルダを全て削除するプログラムを作成 # # '指定した親フォルダ下のbin、objフォルダ内のDebug、Rleaseフォルダを全て削除する'(_指定した親フォルダ) :- append(_,[_フォルダ_1|R],[bin,obj]), member(_フォルダ_2,['Debug','Rlease']), atomic_list_concat(['rm -R ',_指定した親フォルダ,/,_フォルダ_1,/,_フォルダ_2],S), shell(S), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/902 # # DBMS:SQLite3.7.12.1(System.Data.SQLite1.0.81.0) # # [テーブルデータ] # # CREATE TABLE tblA( # id INTEGER, # status001 INTEGER, # status002 INTEGER, # status003 INTEGER, # status004 INTEGER, # . # . # . # status300 INTEGER # ); # # id |status001|status002|.... . |status300| # ----+--------+--------+ +--------| # 1| 0 | 0 | | 0 | # 2| 1 | 0 | | 0 | # 3| 0 | 0 | | 1 | # 4| 0 | 1 | | 1 | # 5| 0 | 0 | | 0 | # 6| 1 | 1 | | 0 | # 7| 0 | 1 | | 0 | # 8| 1 | 1 | | 1 | # 9| 1 | 1 | | 0 | # # 想定レコード数 50,000〜2000,000 # # [欲しい結果] # ------------------------------------------- # status001 | 4 //status001=1であるレコード数 # status002 | 5 //status002=1であるレコード数 # . # . # . # status300 | 3 //status300=1であるレコード数 # # 正規化に問題があるように思えますが # これらを一度のSQLで取得出来ないでしょうか。 # この結果を最も速く取得する方法を模索しています(__) # # 各フィールドの値が1である組数(_フィールド名,_組数) :- between(1,300,N), 引数ならびを生成し指定フィールドを1とする(L1), member([_フィールド名,L],L1), 指定フィールドが1の組数(L,_組数). 引数ならびを生成し指定フィールドを1とする(N,_フィールド名,L) :- フィールド名の復元(N,_フィールド名), length(L,300), nth1(N,L,1). 指定フィールドが1の組数(L,_組数) :- P =.. [tblA,_id|L], count(P,_組数), _組数 > 0. フィールド名の復元(_フィールド名_0,N,_フィールド名) :- '3要素のフィールド名識別名をならびで確保'(L), number_chars(N,Chars), append(L1,Chars,L), 変数として残った要素は0に単一化(L1), ならび要素を結合したものがフィールド名([_フィールド名_0|L],_フィールド名). '3要素のフィールド名識別名をならびで確保'(L) :- length(L,3). append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). 変数として残った要素は0に単一化([]). 変数として残った要素は0に単一化(['0'|R]) :- 変数として残った要素は0に単一化(R). ならび要素を結合したものがフィールド名(L,_フィールド名) :- atomic_list_concat(L,_フィールド名). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/881 # # 入庫、出庫、締め用のテーブルがあるとし、それぞれ、HEADER、DETAILがあり # HEADERには、入出庫、締め番号、日付、ACTIVE(該当月Y/N)など # DETAILには、アイテムと数量が入っているとします # そこでDAILY MOVEMENTを作成したいのですが、 # 1~31のように固定ではなく、トランザクションがあった日のみ、つまり # SELECT TRANS_DATE FROM # (SELECT TRANS_DATE FROM INCOMING WHERE ACTIVE='Y' # UNION ALL # SELECT TRANS_DATE FROM OUTGOING WHERE ACTIVE='Y') T_DATE # group by TRANS_DATE ORDER BY 1 # でTRANS_DATE抽出しておきます # 結果をREPORT WRITEとかWEBを用いずに # TRANS_DATEが横方向に1行目に表され、 # 2行目1カラムは、アイテム、2カラム目はOPENING数量で、 # 3カラム以降はIN又はOUTの数量を表記したいのですが # JUL/8はトランザクションがありませんので表記されていません # 最後のカラムは、その月の現在までのSUMMARY # #   JUL/7  JUL/9           JUL # IN OUT IN OUT IN OUT CLOSE #    3 5   3 3 8  15 # # みなさんなら、どうSQLを書きますか、教えてください # # % % 入庫(_入出庫,_締め番号,_日付,_ACTIVE,_アイテム,_数量). % % 出庫(_入出庫,_締め番号,_日付,_ACTIVE,_アイテム,_数量). % % 締め用(_入出庫,_締め番号,_日付,_ACTIVE,_アイテム,_数量). % みなさんならどう書きますか :- 重複のない入出庫日付ならび(_重複のない入出庫日付ならび), 表を作成する(_重複のない入出庫日付ならび,_表), '入庫・出庫・締め用数量合計'(_入庫数量合計,_出庫数量合計,_締め用数量合計), 転置(_表,_転置された表), 表を出力する(_転置された表,_入庫数量合計,_出庫数量合計,_締め用数量合計). 重複のない入出庫日付ならび(_重複のない入出庫日付ならび) :- findsetof(_日付_1,( 入庫(_,_,_日付_1,'Y',_,_)), _入庫日付ならび), findsetof(_日付_2,( 出庫(_,_,_日付_2,'Y',_,_)), _出庫日付ならび), append(_入庫日付ならび,_出庫日付ならび,_入出庫日付ならび), setof(_日付,member(_日付,_入出庫日付ならび),_重複のない入出庫日付ならび). 表を作成する(_重複のない入出庫日付ならび,_表) :- findall([_日付,_入庫数量,_出庫数量],( member(_日付,_重複のない入出庫日付ならぴ), 入庫数量を得る(_日付,_入庫数量), 出庫数量を得る(_日付,_出庫数量), 表示パターン(_入庫数量,_出庫数量,_表示パターン)), _表). 入庫数量を得る(_日付,_入庫数量) :- 入庫(_入出庫,_締め番号,_日付,'Y',_アイテム,_入庫数量),!. 入庫数量を得る(_日付,0.0). 出庫数量を得る(_日付,_出庫数量) :- 入庫(_入出庫,_締め番号,_日付,'Y',_アイテム,_出庫数量),!. 出庫数量を得る(_日付,0.0). '入庫・出庫・締め用数量合計'(_入庫数量合計,_出庫数量合計,_締め用数量合計) :- findsum(_数量,( 入庫(_入出庫,_締め番号,_日付,'Y',_アイテム,_数量)), _入庫数量合計), findsum(_数量,( 出庫(_入出庫,_締め番号,_日付,'Y',_アイテム,_数量)), _出庫数量合計), findsum(_数量,( 締め用(_入出庫,_締め番号,_日付,'Y',_アイテム,_数量)), _締め用数量合計). 表示パターン(_入庫数量,0.0,1) :- \+(_入庫数量 = 0.0),!. 表示パターン(0.0,_出庫数量,2) :- \+(_出庫数量 = 0.0),!. 表示パターン(_,_,3). 表を出力する([_日付ならび,_パターンならび,_入庫数量ならび,_出庫数量ならび],_入庫数量合計,_出庫数量合計,_締め用数量合計) :- 日付を表示する(_日付ならび), '入庫・出庫・合計見出し'(_パターンならび), 数量ならびを表示する(_入庫数量ならび,_出庫数量ならび), '入庫数量合計・出庫数量合計・締め用数量合計表示'(_入庫数量合計,_出庫数量合計,_締め用数量合計). 日付を表示する([]) :- write('\n'). 日付を表示する([_日付|R]) :- 日付表示文字列(_日付,_日付表示文字列), write('%12c',[_日付表示文字列]), 日付を表示する(R). 日付表示文字列(_日付,_日付表示文字列) :- sub_atom(_日付,4,2,_月), sub_atom(_日付,6,2,_日), atomic_list_concat([_月,'/',_日],_日付表示文字列). '入庫・出庫・合計見出し'([]) :- writef(' 入庫 出庫 締め用 \n'). '入庫・出庫・合計見出し'([_パターン|R]) :- '入庫・出庫・合計見出し表示文字列'(_パターン,_表示文字列), writef('%t',[_表示文字列]), '入庫・出庫・合計見出し'(R). '入庫・出庫・合計見出し表示文字列'(1,' 入庫 '). '入庫・出庫・合計見出し表示文字列'(2,' 出庫 '). '入庫・出庫・合計見出し表示文字列'(3,' 入庫 出庫 '). 数量ならびの表示([]) :- 数量ならびを表示する([_入庫|R1],[_出庫|R2]) :- 数量表示文字列(_入庫数量,_出庫数量,_入庫表示文字列,_出庫表示文字列), writef(' %t %t ',[_入庫表示文字列,_出庫表示文字列]), 数量ならびを表示する(R1,R2). 数量表示文字列(0.0,_出庫数量,' ',_出庫表示文字列) :- swritef(_出荷表示文字列,' %4r ',[_出庫数量]),!. 数量表示文字列(0.0,_入庫数量,_入庫表示文字列,' ') :- swritef(_入庫表示文字列,' %4r ',[_入庫数量]),!. 数量表示文字列(_入荷数量,_出庫数量,_入庫数量文字列,_出庫表示文字列) :- swritef(_入庫表示文字列,' %4r ',[_入庫数量]), swritef(_出庫表示文字列,' %4r ',[_出庫数量]),!. '入庫数量合計・出庫数量合計・締め用数量合計表示'(_入庫数量合計,_出庫数量合計,_締め用数量合計) :- writef(' %4r %4r %4r\n',[_入庫数量合計,_出庫数量合計,_締め用数量合計]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/573 # # [1] 授業単元: STL # [2] 問題文(含コード&リンク): # 問 二つの値xとyを使用して差を返す関数形式マクロdiff(x,y)を使用し, # キーボードからint型の2つの数値n1とn2を入力した場合に、入力した2つの数値とその差を出力するmain関数のプログラムを作成しなさい。 # 問 四季を表す列挙体seasonを定義し、キーボードから0,1,2,3を入力した場合に、 # それぞれ"Spring", "Summer", "Fall", "Winter"と表示するプログラムを作成しなさい。ただし、enum season {Spring, Summer, Fall, Winter};を使用し、キーボードから0,1,2,3以外の数字が入力された場合には、入力し直す処理を含めなさい。 # 問 数字文字の出現回数の百分率を小数点以下1桁まで求め、 # '*'のグラフと共に表示するmain関数のプログラムを作成しなさい。 # 問 キーボードから入力した行数と空白以外の文字数を求め, # 行数と文字数を表示するmain関数のプログラムを作成しなさい。ただし、文字入力は、全角文字はなく、半角文字だけであるとする。 # 数字文字の出現回数の百分率を小数点以下1桁まで求め(_文字列) :- atom_chars(_文字列,_文字ならび), length(_文字ならび,_総文字数), 数字文字の出現回数の百分率を小数点以下1桁まで求め(_文字ならび,[[],[],[],[],[],[],[],[],[],[]],_出現度数ならび), '*のグラフと共に百分率を小数点以下1桁まで求めて表示する'(_総文字数,_出現度数ならび). 数字文字の出現回数の百分率を小数点以下1桁まで求め([_文字|R],L1,L) :- 出現回数ならびを得る(L1,L). 数字文字の出現回数の百分率を小数点以下1桁まで求め([_文字|R],L1,L) :- 度数加算(_文字,L1,L2), 数字文字の出現回数の百分率を小数点以下1桁まで求め(R,L2,L),!. 数字文字の出現回数の百分率を小数点以下1桁まで求め([_文字|R],L1,L) :- 数字文字の出現回数の百分率を小数点以下1桁まで求め(R,L1,L). 出現回数ならびを得る(L1,L) :- findall(N,( member(L0,L1), length(L0,N)), L). 度数加算('0',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[[_|_0],_1,_2,_3,_4,_5,_6,_7,_8,_9]). 度数加算('1',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,[_|_1],_2,_3,_4,_5,_6,_7,_8,_9]). 度数加算('2',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,[_|_2],_3,_4,_5,_6,_7,_8,_9]). 度数加算('3',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,[_|_3],_4,_5,_6,_7,_8,_9]). 度数加算('4',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,[_|_4],_5,_6,_7,_8,_9]). 度数加算('5',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,[_|_5],_6,_7,_8,_9]). 度数加算('6',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,_5,[_|_6],_7,_8,_9]). 度数加算('7',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,_5,_6,[_|_7],_8,_9]). 度数加算('8',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,_5,_6,_7,[_|_8],_9]). 度数加算('9',[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9],[_0,_1,_2,_3,_4,_5,_6,_7,_8,_[_|9]]). '*のグラフと共に百分率を小数点以下1桁まで求めて表示する'(_総文字数,_出現度数ならび) :- append(L0,[_出現度数|R],_出現度数ならび), length(L0,N), '百分率を小数点以下1桁まで求めてNの星グラフを表示する'(N,_出現度数,_百分率), R = []. '百分率を小数点以下1桁まで求めてNの星グラフを表示する'(N,_総文字数,_出現度数) :- 星表示文字列(_出現度数,_星表示文字列), _百分率 is _出現度数 / _総文字数, format(S,'~4.1f',[_百分率]), writef('[%t] %t%% %t\n',[N,_百分率,_星表示文字列]). 星表示文字列(_出現度数,_星表示文字列) :- length(L,_出現度数), all(L,'*'), atomic_list_concat(L,_星文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/652 # # 問題 # 整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。 # 例 # n=15のとき # 1+2+3+4+5+6+7+8+9+(1+0)+(1+1)+(1+2)+(1+3)+(1+4)+(1+5) = 66 # # '整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。'(_n,_集計値) :- 一桁ずつ四項に分解した加算文字列ならび(_n,_一桁ずつ四項に分解した加算文字列ならび), atomic_list_concat(_一桁ずつ四項に分解した加算式文字列ならび,'+',_評価式文字列), atom_to_term(_評価式文字列,_評価式,_), _集計値 is _評価式. 一桁ずつ四項に分解した加算文字列ならび(_n,_一桁ずつ四項に分解した加算式文字列ならび) :- findall(_一桁ずつ四項に分解した加算式文字列,( between(1,_n,_整数), number_chars(_整数,_一桁ずつ四項に分解した数字ならび), atomic_list_concat(_一桁ずつ四項に分解した数字ならび,'+',_一桁ずつ四項に分解した加算式文字列)), _一桁ずつ四項に分解した加算式文字列ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/652 # # 問題 # 整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。 # 例 # n=15のとき # 1+2+3+4+5+6+7+8+9+(1+0)+(1+1)+(1+2)+(1+3)+(1+4)+(1+5) = 66 # % % どうせなら '1+2+3+4+5+6+7+8+9+(1+0)+(1+1)+(1+2)+(1+3)+(1+4)+(1+5)'を生成して % それを利用して!計算したいものだ。 % '整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。'(_n,_集計値) :- 一桁ずつに分解した加算文字列ならび(_n,_一桁ずつに分解した加算文字列ならび), atomic_list_concat(_一桁ずつに分解した加算式文字列ならび,'+',_評価式文字列), atom_to_term(_評価式文字列,_評価式,_), _集計値 is _評価式. 一桁ずつに分解した加算文字列ならび(_n,_一桁ずつに分解した加算式文字列ならび) :- findall(_一桁ずつに分解した加算式文字列,( between(1,_n,_整数), number_chars(_整数,_一桁ずつに分解した数字ならび), '二桁以上の時は括弧で括ってプラス演算子を挿入する'(_n,_一桁ずつに分解した数字ならび,_一桁ずつに分解した加算式文字列)), _一桁ずつに分解した加算式文字列ならび). '二桁以上の時は括弧で括ってプラス演算子を挿入する'(_n,_一桁ずつに分解した数字ならび,_一桁ずつに分解した加算式文字列) :- _n < 10, atomic_list_concat(_一桁ずつに分解した数字ならび,'+',_一桁ずつに分解した加算式文字列). '二桁以上の時は括弧で括ってプラス演算子を挿入する'(_n,_一桁ずつに分解した数字ならび,_一桁ずつに分解した括弧で括られた加算式文字列) :- _n >= 10, atomic_list_concat(_一桁ずつに分解した数字ならび,'+',_一桁ずつに分解した加算式文字列), atomic_list_concat(['(',_一桁ずつに分解した加算式文字列,')'],_一桁ずつに分解した括弧で括られた加算式文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/559 # # [1] 授業単元: C言語 # [2] 問題文:文字列の全パターンを表示するプログラム # 実行結果例 # >abc # abc # acb # bca # … # 文字列の全パターンを表示する(_文字列) :- atom_chars(_文字列,_文字ならび), length(_文字ならび,_要素数), 全パターンを(_文字ならび,_要素数,N,L), 表示する(L), N = _要素数. 全パターンを(_文字ならぴ,_要素数,L) :- between(1,N,_要素数), 順列(_文字ならび,N,L). 表示する(L) :- atomic_list_concat(L,S), writef('%t\n',[S]). % 順列/3 % 以下のサイトは # 問題 # 数字がひとつ不明な13桁のISBNコードを復元せよ。 # 例(不明な所を?とする) # 9784062?72211 => 9784062772211 # 978415031?684 => 9784150310684 '数字がひとつ不明な13桁のISBNコードを復元せよ。'(_未知符号を含む13桁のISBNコード,_復元された13桁のISBNコード) :- atom_chars(_未知符号を含む13桁のISBNコード,_未知符号を含む13要素のならび), '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(_未知符号を含む13要素のならび,_未知符号を解決した12要素の数値ならび,_最終桁の数), '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_未知符号を解決した12要素の数値ならび,_加算された数), '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数), 'ISBNコードを復元する'(_未知符号を解決した12要素の数値ならび,_最終桁の数,_復元された13桁のISBNコード). '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(L1,L2,_最終桁の数) :- 各桁を数値に変換したならび(L1,L3), append(L2,[_最終桁の数],L3). 各桁を数値に変換したならび([],[]). 各桁を数値に変換したならび([_文字|R1],[_数値または変数|R2]) :- 数値または変数に変換(_文字,_数値または変数), 各桁を数値に変換したならび(R1,R2). 数値または変数に変換((?),_数値または変数) :- member(_数値または変数,[0,1,2,3,4,5,6,7,8,9]). 数値または変数に変換(A,_数値または変数) :- atom_number(A,_数値または変数). '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_12要素の数値ならび,_加算された数) :- reverse(_12要素の数値ならび,_反転した12要素の数値ならび), findsum(S,( append(L0,[N1,N2|_],_反転した12要素の数値ならび), 要素数が偶数(L0), S is N1 * 3 + N2 * 1), _加算された数). '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数) :- _最終桁の数 is 10 - (_加算された数 mod 10). 要素数が偶数(L) :- length(L,_要素数), 0 is _要素数 mod 2. 'ISBNコードを復元する'(_未知符号を解決した12要素の数値ならび,_最終桁の数,_復元された13桁のISBNコード) :- append(_未知符号を解決した12要素の数値ならび,[_最終桁の数],L1), atomic_list_concat(L1,_復元された13桁のISBNコード). % 以下のサイトは atom_numbers(Atom,Numbers) :- atom(Atom), findall(N,( sub_atom(Atom,_,1,_,A), atom_number(A,N)), Numbers),!. atom_numbers(Var,Numbers) :- var(Var), list(Numbers), atomic_list_concat(Numbers,Var). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/413 # # [1] 授業単元: C言語 # [2] 問題文:http://ime.nu/codepad.org/je2akZ6u # #include # # int main(){ # int num[100]; # int data, i, j; # FILE* FP; # # //データの個数を入力 # printf("データの個数を入力してください。"); # scanf("%d", &data); # # //読み込み # FP = fopen("readFile.txt","r"); # # for(i=0; i&nplt;dat&npgta; i++){ # fscanf(FP,"%d", &num[i]); # } # fclose(FP); # # //書き込み # FP = fopen("writeFile.txt","w"); # for(i=0; i&nplt;data; i++){ # fprintf(FP,"%d ", num[i]); # } # fclose(FP); # return(0); # } # writeFile.txtの表示を # 11 22 33 44 55 # 66 77 88 99 00 # にするにはどうすればいい? # 'データの個数を入力し、readFile.txtを読み、昇順にデータを並べ替えて、writeFile.txtに一行5データずつ出力する' :- 'まずデータの個数を入力し'(_データの個数), 'readFile.txtを読み'(_データの個数,_データならび), '昇順にデータを並べ替えて'(_データならび,_昇順に整列したデータならび), 'ファイルwriteFile.txtに5データ毎に改行して書き込む'(_昇順に整列したデータならび). 'まずデータの個数を入力し'(_学生の人数) :- 整数を得る(データの個数,_データの個数). 'readFile.txtを読み'(_データの個数,_データならび) :- get_split_lines('readFile.txt',[' '],LL), 平坦化(LL,_データならび_1), データの個数分を切り取る(_データの個数,_データならび_1,_データならび). データの個数分を切り取る(_データの個数,_データならび_1,_データならび) :- length(_データならび_1,_要素数), _要素数 >= _データの個数, length(_データならび,_データの個数), append(_データならび,_,_データならび_1),!. データの個数分を切り取る(_,_データならび,_データならび). '昇順にデータを並べ替えて'(_データならび,_昇順に整列したデータならび) :- 整列(_データならび,_昇順に整列したデータならび). 整列([],[]). 整列([_軸要素|_着目した科目の成績ならび],_昇順に整列した着目した科目の成績ならび) :- 分割(_軸要素,_着目した科目の成績ならび,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび), 整列(_軸要素より小さい成績ならび,_整列した軸要素より小さい成績ならび), 整列(_軸要素より大きい成績ならび,_整列した軸要素より大きい成績ならび), append(_整列した軸要素より小さい成績ならび,[_軸要素|_整列した軸要素より大きい成績ならび],_昇順に整列した着目した科目の成績ならび). 分割(_,[],[],[]). 分割(_軸要素,[[_成績,_No]|R1],[[_成績,_No]|_軸要素より小さい成績ならび],_軸要素と等しいか大きい成績ならび) :- _成績 @<_軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 分割(_軸要素,[[_成績,_No]|R1],_軸要素より小さい成績ならび,[[_成績,_No]|_軸要素と等しいか大きい成績ならび]) :- _成績 @>= _軸要素, 分割(_軸要素,R1,_軸要素より小さい成績ならび,_軸要素と等しいか大きい成績ならび). 'ファイルwriteFile.txtに5データ毎に改行して書き込む'(_整列した得点ならび) :- '得点ならびを頭部零文字列ならびに変換'(_整列した得点ならび,_頭部零文字列ならび), open('writeFile.txt',write,Outstream), 'Outstreamに書き込む'(Outstream,_頭部零文字列ならび), close(Outstream). '5データ毎にOutstreamに書き込む'(_,[]) :- !. '5データ毎にOutstreamに書き込む'(Outstream,_頭部零文字列ならび) :- '5データ毎に'(_得点ならび,A,B,C,D,E,_残りならび), writef(Outstream,'%t %t %t %t %t\n',[A,B,C,D,E]), '5データ毎にOutstreamに書き込む'(Outstream,_残りならび). '5データ毎に'([A,B,C,D,E|_残りならび],A,B,C,D,E,_残りならび) :- !. '5データ毎に'(_得点ならび,A,B,C,D,E,[]) :- append(_得点ならび,L1,[A,B,C,D,E]), all(L1,'00'). '得点ならびを頭部零文字列ならびに変換'([],[]) :- !. '得点ならびを頭部零文字列ならびに変換'([N|R1],[A|R2]) :- 頭部零文字列(2,N,A), '得点ならびを頭部零文字列ならびに変換'(R1,R2). 頭部零文字列(_N桁,_整数,_頭部零文字列) :- length(L,_N桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,'0'), atomic_list_concat(L,_頭部零文字列),!. 頭部零文字列(_N桁,_整数,_頭部零文字列) :- number_chars(_整数,Chars), atomic_list_concat(Chars,_頭部零文字列). % 平坦化/2 % ここでは使っていない'N個組'/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/362 # # 再帰関数を使わず、nの階乗を求めるプログラムを教えて下さい。 # '再帰関数を使わず、nの階乗を求める'(_n,_nの階乗) :- nの階乗を表す式文字列(_n,_式文字列), 式文字列を解析して式を評価する(_式文字列,_nの階乗). nの階乗を表す式文字列(_n,_式文字列) :- length(L,_n), findall(M,( append(L0,[_|_],L), length([_|L0],M)), L2), atomic_list_concat(L2,'*',_式文字列). 式文字列を解析して式を評価する(_式文字列,_nの階乗) :- atom_to_term(_式文字列,_式,_), _nの階乗 is _式. % length/2 も append/3 も atomic_list_concat/3 も再帰述語ですから % これは解答にはなっていません。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/260 # # ttp://codepad.org/pWDlCcF7 # ここまでは出来たんだけど、txtファイルの結果を # *|** # ***|**** # *****|****** # *******|******** # *********|********** # こんな感じに揃えるにはどうすればいいんですか? # # 'ここまでは出来たんだけど、txtファイルの結果を # *|** # ***|**** # *****|****** # *******|******** # *********|********** # こんな感じに揃えるにはどうすればいいんですか?' :- ならびを変化させる(L1,L2,L), 描画する(L1,L2,L), L2 = []. ならびを変化させる(L1,L2,L) :- length(L8,8), '空白と*を配分する'(L8,L1,L2), append(L2,L1,L3), append(L1,L2,L4), append(L3,['*','|','*','*'|L4],L). '空白と*を配分する'(L8,L1,L2) :- append(L1,L2,L8), length(L1,Len1), 0 is Len1 mod 2, all(L2,' '), all(L1,'*'). 描画する(L1,L2,L) :- concat_atom(L,S), writef(' %t\n',[S]). % 以下のサイトは # # 文字列検索の標準パターン # 文字列を受け取り条件一致させて、_前文字列,_適合文字列,_後文字列を返す述語を # 先に定義しておく。(ここでは 文字列一致/3) # 最初に一致させて、それで成功とせず子述語を目標として呼び出す。 # 子述語はいきなり一度成功して解を返す。(非決定性的動作になる) # バックトラックしてきたら次の節の定義で、目標は最初の文字列検索/4を相互的に # 呼び出す。 # 成功して来たら、これは後文字列部分について成功したのだから、それまでの部分(前回の 前文字列_1 + _適合文字列)と # 今回の(後文字列の)前文字列を結合して全体の前文字列とする。 # 文字列検索(_文字列,_前文字列,_適合文字列,_後文字列) :- 文字列一致(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1), 文字列検索(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列). 文字列検索(_文字列,_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). 文字列検索(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- 文字列検索(_後文字列,_前文字列_2,_適合文字列,_後文字列), atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/930 # # ((角|丸)ゴシック|明朝) # # こういった入れ子?を書くと例えば丸ゴシックにマッチしますが丸にもマッチします # どのように書けばよいのでしょう '((角|丸)ゴシック|明朝)の内、角ゴシック|丸ゴシック|明朝に適合する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,Len,R,_適合文字列_1), '診断: 適合'(_適合文字列_1), sub_atom(_文字列,0,S,_,_前文字列_1), S_2 is S + Len, sub_atom(_文字列,S_2,R,0,_後文字列_1), '((角|丸)ゴシック|明朝)の内、角ゴシック|丸ゴシック|明朝に適合する'(_文字列,S,Len,R,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列). '((角|丸)ゴシック|明朝)の内、角ゴシック|丸ゴシック|明朝に適合する'(_文字列,_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). '((角|丸)ゴシック|明朝)の内、角ゴシック|丸ゴシック|明朝に適合する'(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- '((角|丸)ゴシック|明朝)の内、角ゴシック|丸ゴシック|明朝に適合する'(_後文字列_1,_前文字列_2,_適合文字列,_後文字列), atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). '診断: 適合'(_文字列) :- 接頭候補(_接頭候補), atomic_list_concat([_接頭候補,ゴシック],_文字列). '診断: 適合'(明朝). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/136 # # [1] 授業単元: 情報B # [2] 問題文: アルファベット1文字目は1文字、2文字目は2文字、n文字目はn文字…分ずれるシーザー暗号を暗号・復号化それぞれ作りなさい。 # アルファベット(['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). 'アルファベット1文字目は1文字、2文字目は2文字、n文字目はn文字…分ずれるシーザー暗号を暗号化する'(_文字列,_暗号化した文字列) :- findall(_暗号化した文字,( sub_atom(_文字列,S,1,_,_文字), S_2 is S + 1, 文字の暗号化(S_2,_文字,_暗号化した文字)), _暗号化した文字ならび), atomic_list_concat(_暗号化した文字ならび,_暗号化した文字列). 'アルファベット1文字目は1文字、2文字目は2文字、n文字目はn文字…分ずれるシーザー暗号を復号化する'(_文字列,_復号化した文字列) :- findall(_暗号化した文字,( sub_atom(_文字列,S,1,_,_文字), S_2 is S + 1, 文字の復号化(S_2,_文字,_暗号化した文字)), _暗号化した文字ならび), atomic_list_concat(_暗号化した文字ならび,_暗号化した文字列). 文字の暗号化(S,_文字,_暗号化した文字) :- アルファベット(L), nth1(Nth,L,_文字), ならびの回転(左方向,S_2,L,L1), nth1(Nth,L1,_暗号化した文字),!. 文字の復号化(S,_文字,_復号化した文字) :- アルファベット(L), nth1(Nth,L,_文字), ならびの回転(右方向,S_2,L,L1), nth1(Nth,L1,_復号化した文字),!. % ならびの回転/4 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/134 # # 内容: # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/t5qL2 # # 名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し, # BMI指数の小さい順に並べた線形リストを作成した上で, # BMI指数の小さい順にBMI指数,身長,体重,名前を出力するプログラムを作成せよ。 # ただし,入力件数は不定とし,名前の1文字目に'0'を入れることでデータ入力を終了するものとする。 # # BMI指数は以下の式で算出できる。 # BMI = 体重[kg]/(身長[m])^2 '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,BMI指数の小さい順に並べた線形リストを作成した上で,BMI指数の小さい順にBMI指数,身長,体重,名前を出力する。ただし,入力件数は不定とし,名前の1文字目に"0"を入れることでデータ入力を終了するものとする' :- '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト), 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(_BMI指数の小さい順並べた線形リスト). '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト) :- findall([_BMI指数,_名前,_身長,_体重],( 名前を得る(_名前), ( sub_atom(_名前,0,1,_,'0'),!,fail; '身長[cm],体重[kg]を入力'(_身長,_体重), 'BMI指数を算出する'(_身長,_体重,_BMI指数))), _BMI指数を鍵とした線形リスト). 名前を得る(_名前) :- write('名前(半角英字によるローマ字表記)を入力してください : '), get_line(_名前), 半角英字によるローマ字表記(_名前). 名前を得る(_名前) :- 名前を得る(_名前). '身長[cm],体重[kg]を入力'(_身長,_体重) :- 数を得る('身長[cm]',_身長), 数を得る('体重[kg]',_体重),!. 'BMI指数を算出する'(_身長,_体重,_BMI指数) :- _BMI指数 is _体重 / (_身長 ^ 2). 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト) :- sort(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([]). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([[_BMI指数,_氏名,_身長,_体重]|R]) :- writef('%t,%t,%t,%t\n',[_BMI指数,_身長,_体重,_名前]), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(R). 半角英字によるローマ字表記(_名前) :- findall(_文字,( sub_atom(_名前,_,1,_,_文字), 空白または半角英字の文字(_文字)), _空白または半角英字であった文字ならび), atomic_list_concat(_空白または半角英字であった文字ならび,_名前). 空白または半角英字の文字(' '). 空白または半角英字の文字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. 空白または半角英字の文字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. % 数を得る/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/134 # # 内容: # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/t5qL2 # # 名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し, # BMI指数の小さい順に並べた線形リストを作成した上で, # BMI指数の小さい順にBMI指数,身長,体重,名前を出力するプログラムを作成せよ。 # ただし,入力件数は不定とし,名前の1文字目に'0'を入れることでデータ入力を終了するものとする。 # # BMI指数は以下の式で算出できる。 # BMI = 体重[kg]/(身長[m])^2 '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,BMI指数の小さい順に並べた線形リストを作成した上で,BMI指数の小さい順にBMI指数,身長,体重,名前を出力する。ただし,入力件数は不定とし,名前の1文字目に"0"を入れることでデータ入力を終了するものとする' :- '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト), 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(_BMI指数の小さい順並べた線形リスト). '名前(半角英字によるローマ字表記),身長[cm],体重[kg]を入力し,'(_BMI指数を鍵とした線形リスト) :- findall([_BMI指数,_名前,_身長,_体重],( 名前を得る(_名前), ( sub_atom(_名前,0,1,_,'0'),!,fail; '身長[cm],体重[kg]を入力'(_身長,_体重), 'BMI指数を算出する'(_身長,_体重,_BMI指数))), _BMI指数を鍵とした線形リスト). 名前を得る(_名前) :- write('名前(半角英字によるローマ字表記)を入力してください : '), get_line(_名前), 半角英字によるローマ字表記(_名前). 名前を得る(_名前) :- 名前を得る(_名前). '身長[cm],体重[kg]を入力'(_身長,_体重) :- 数を得る('身長[cm]',_身長), 数を得る('体重[kg]',_体重),!. 'BMI指数を算出する'(_身長,_体重,_BMI指数) :- _BMI指数 is _体重 / (_身長 ^ 2). 'BMI指数の小さい順に並べた線形リストを作成した上で'(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト) :- sort(_BMI指数を鍵とした線形リスト,_BMI指数の小さい順に並べた線形リスト). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([]). 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'([[_BMI指数,_氏名,_身長,_体重]|R]) :- writef('%t,%t,%t,%t\n',[_BMI指数,_身長,_体重,_名前]), 'BMI指数の小さい順にBMI指数,身長,体重,名前を出力する'(R). 半角英字によるローマ字表記(_名前) :- findall(_文字,( sub_atom(_名前,_,1,_,_文字), 空白または半角英字の文字(_文字)), _空白または半角英字であった文字ならび), atomic_list_concat(_空白または半角英字であった文字ならび,_名前). 空白または半角英字の文字(' '). 空白または半角英字の文字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. 空白または半角英字の文字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. % 数を得る/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/17 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/hz40AN0p # 上記のプログラムを参考にしてprintf("*")とprintf("+") # を使用して下記の模様を出力するプログラムを、for文を利用して作成せよ。 # 図の上半分と下半分を別々に作成せよ。 '"http://nojiriko.asia/prolog/c158_18_zu.html"の模様を出力する。図の上半分と下半分を別々に作成せよ。' :- 上半分の作成, 下半分の作成. 上半分の作成 :- append(L1,L2,[*,*,*,*,*,*,*,*,*]), 行表示(L1), L2 = []. 下半分の作成 :- append(L1,L2,[*,*,*,*,*,*,*,*,*]), 行表示(L2), L1 = []. 行表示(L) :- length(L,Len), 0 is Len mod 2, atomic_list_concat(L,S), writef('%t+\n',[S]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/896 # # すみません # Objective-CのNSRegularExpressionで、ある文字列について、 # ・順番通りに # ・一部が欠けてもよく # ・途中に余計な文字が入ってもよく # ・一致する数を数える # ようなパターンを組みたいのですが、 # 例えばABCDEという文字列があったとして # ABCDE→5(全件一致) # AABBCCDDEE→5(全件一致) # ADCBE→3(A,C,Eが一致) # AFGHBCDE→5(全件一致) # EDCBA→1(Eのみ一致) # というように数えたいのですが、上手くいきません。 # .*?(A)?.*?(B)?.*?(C)?.*?(D)?.*?(E)?.*? # ではダメみたいなのですがどうするのが正しいでしょうか # # '・順番通りに ・一部が欠けてもよく ・途中に余計な文字が入ってもよく ・一致する数を数えるようなパターンを評価する'(_文字列,_パターン,_評価) :- atom_chars(_文字列,Chars), 指定検索パターンの昇順要素のみ評価する('A',Chars,['A','B','C','D','E'],_重複可能なパターン), パターン評価(_重複可能なパターン,_パターン,_評価). 指定検索パターンの昇順要素のみ評価する(_,[],[]). 指定検索パターンの昇順要素のみ評価する(U,[A|R1],_検索文字ならび,[A|R2]) :- member(A,_検索文字ならび), U @=< A, 指定検索パターンの昇順要素のみ評価する(A,R1,_検索文字ならび,R2). 指定検索パターンの昇順要素のみ評価する(U,[A|R1],_検索文字ならび,R2) :- member(A,_検索文字ならび)), U @> A, 指定検索パターンの昇順要素のみ評価する(U,R1,_検索文字ならび,R2). 指定検索パターンの昇順要素のみ評価する(U,[A|R1],_検索文字ならび,R2) :- \+(member(A,_検索文字ならび)), 指定検索パターンの昇順要素のみ評価する(U,R1,_検索文字ならび,R2). パターン評価(_重複可能なパターン,_検索文字ならび,_パターン,_評価) :- 重複する文字を取り除く(_重複可能なパターン,_パターン), length(_パターン,_パターンの文字数), length(_検索文字ならび,_全件数), 評価(_パターンの文字数,_全件数,_評価). 重複する文字を取り除く(_重複可能なパターン,_パターン) :- setof(A,member(A,_重複可能なパターン),_パターン). 評価(_全件数,_全件数,全件一致). 評価(_パターンの文字数,_,_評価) :- atomic_list_concat([_パターンの文字数,件一致],_評価). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/978 # # [1] 授業単元:2次元配列 # [2] 問題文(含コード&リンク): # 新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。 # 出発駅と到着駅をそれぞれ駅番号で入力し,料金を表示するプログラムを作成しなさい。 # なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする。 # 但し、料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了するものとする。 #       新大阪  京都 名古屋 新横浜  # 東京 14,920 14,390 11,540 3,180 # 新横浜 14,600 13,660 10,910 # 名古屋 6,840 6,100 # 京都 3,240 # # % 駅番号/2 と 新幹線のぞみ料金/3 の定義 駅番号(東京,1). 駅番号(新横浜,2). 駅番号(名古屋,3). 駅番号(京都,4). 駅番号(新大阪,5). 新幹線のぞみ料金(東京,新大阪,14920). 新幹線のぞみ料金(東京,京都,14390). 新幹線のぞみ料金(東京,名古屋,11540). 新幹線のぞみ料金(東京,新横浜,3180). 新幹線のぞみ料金(新横浜,新大阪,14600). 新幹線のぞみ料金(新横浜,京都,13600). 新幹線のぞみ料金(新横浜,名古屋,10910). 新幹線のぞみ料金(名古屋,新大阪,6840). 新幹線のぞみ料金(名古屋,京都,6100). 新幹線のぞみ料金(京都,新大阪,3340). '新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。出発駅と到着駅をそれぞれ駅番号で入力し,料金を表示する。なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする。但し、料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了するものとする。' :- repeat, 出発駅と到着駅をそれぞれ駅番号で入力し(_出発駅,_到着駅), 料金を表示する(_出発駅,_到着駅), '料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了する'. 出発駅と到着駅をそれぞれ駅番号で入力し(_出発駅,_到着駅) :- 出発駅を駅番号で入力(_出発駅番号), 到着駅を駅番号で入力(_出発駅番号,_到着駅番号), 駅番号(_出発駅,_出発駅番号), 駅番号(_到着駅,_到着駅番号),!. 出発駅を駅番号で入力(_出発駅番号) :- 駅番号候補の選択([],_駅番号候補), 駅名メニュー表示(出発,_駅番号候補,_駅名メニュー表示), writef('%t\n',[_駅名ニュー表示]), 駅番号の入力(_駅番号候補,_出発駅番号),!. 到着駅を駅番号で入力(_出発駅番号,_到着駅番号) :- 駅番号候補の選択([_出発駅番号],_駅番号候補), 駅名メニュー表示(到着,_駅番号候補,_駅名メニュー表示), writef('%t\n',[_駅名メニュー表示]), 駅番号の入力(_駅番号候補,_到着駅番号),!. 駅番号候補の選択(_回避駅番号ならび,_駅番号候補) :- findall(_駅番号,( 駅番号(_,_駅番号), \+(member(_駅番号,_回避駅番号ならび))), _駅番号候補). 駅名メニュー表示(_出発か到着,_駅番号候補,_駅名メニュー表示) :- 駅名メニュー表示(_駅番号候補,_表示駅名ならび), atomic_list_concat([_出発か到着,'駅を駅番号で入力します。 0..最初から入力し直し '|_表示駅名ならび],_駅名メニュー表示). 駅名メニュー表示(_駅番号候補,_表示駅名ならび) :- findall(_表示駅名,( 駅番号(_,_駅番号), 駅番号候補にある駅番号の時は表示駅名を選択(_駅番号,_回避駅番号,_表示駅名)), _表示駅名ならび). 駅番号候補にある駅番号の時は表示駅名を選択(_駅番号,_駅番号候補,_表示駅名) :- member(_駅番号,_駅番号候補), 駅番号(_駅名,_駅番号), atomic_concat_list([_駅番号,'..',_駅名,' '],_表示駅名). 駅番号の入力(_駅番号候補,_駅番号) :- write('駅番号を入力してください : '), get_line(Line), 駅番号の入力診断(Line,_駅番号),!. 駅番号の入力(_駅番号候補,_駅番号) :- 駅番号の入力(_駅番号候補,_駅番号). 駅番号の入力診断(Line,_駅番号候補,_駅番号) :- atom_to_term(Line,_駅番号,_), 駅番号は妥当(_駅番号,_駅番号候補),!. 駅番号の入力診断(Line,_,_) :- writef('入力された %t からは適切な駅番号が得られません。再入力をお願いします。\n',[Line]), fail. 駅番号は妥当(0,_) :- '駅番号0の時はここでは一旦成功裡に終わる。駅番号がないから最終的には、述語「出発駅と到着駅をそれぞれ駅番号で入力し」で失敗して出発駅からの入れ直しとなる',!. 駅番号は妥当(_駅番号,_駅番号候補) :- integer(_駅番号), 駅番号(_,_駅番号), 駅番号は駅番号候補にある(_駅番号,_駅番号候補). 駅番号は駅番号候補にある(_駅番号,_駅番号候補) :- member(_駅番号,_駅番号候補),!. 駅番号は駅番号候補にある(_駅番号,_) :- writef('駅番号%tは既に出発駅に使われています\n',[_駅番号]), fail. 料金を表示する(_出発駅,_到着駅) :- 料金を(_出発駅,_到着駅,_料金), 表示する(_料金). 料金を(_出発駅,_到着駅,_料金) :- 新幹線のぞみ料金(_出発駅,_到着駅,_料金),!. 料金を(_出発駅,_到着駅,_料金) :- 新幹線のぞみ料金(_到着駅,_出発駅,_料金). 表示する(_料金) :- writef('料金は %t 円です\n',[_料金]). '料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了する' :- write('選択してください。 1.. 処理の繰り返し 0.. 終了 : '), get_integer(_処理番号), _処理番号 = 0. '駅番号0の時はここでは一旦成功裡に終わる。駅番号がないから最終的には、述語「出発駅と到着駅をそれぞれ駅番号で入力し」で失敗して出発駅からの入れ直しとなる'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/978 # # [1] 授業単元:2次元配列 # [2] 問題文(含コード&リンク): # 新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。 # 出発駅と到着駅をそれぞれ駅番号で入力し,料金を表示するプログラムを作成しなさい。 # なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする。 # 但し、料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了するものとする。 #       新大阪  京都 名古屋 新横浜  # 東京 14,920 14,390 11,540 3,180 # 新横浜 14,600 13,660 10,910 # 名古屋 6,840 6,100 # 京都 3,240 # # % 駅番号/2 と 新幹線のぞみ料金/3 の定義 駅番号(東京,1). 駅番号(新横浜,2). 駅番号(名古屋,3). 駅番号(京都,4). 駅番号(新大阪,5). 新幹線のぞみ料金(東京,新大阪,14920). 新幹線のぞみ料金(東京,京都,14390). 新幹線のぞみ料金(東京,名古屋,11540). 新幹線のぞみ料金(東京,新横浜,3180). 新幹線のぞみ料金(新横浜,新大阪,14600). 新幹線のぞみ料金(新横浜,京都,13600). 新幹線のぞみ料金(新横浜,名古屋,10910). 新幹線のぞみ料金(名古屋,新大阪,6840). 新幹線のぞみ料金(名古屋,京都,6100). 新幹線のぞみ料金(京都,新大阪,3340). '新幹線「のぞみ」の料金(ただし運賃との合計額)は以下の表の通りである。出発駅と到着駅をそれぞれ駅番号で入力し,料金を表示する。なお駅番号は,東京が1,新横浜が2,名古屋が3,京都が4,新大阪が5とする。但し、料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了するものとする。' :- repeat, 出発駅と到着駅をそれぞれ駅番号で入力し(_出発駅,_到着駅), 料金を表示する(_出発駅,_到着駅), '料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了する'. 出発駅と到着駅をそれぞれ駅番号で入力し(_出発駅,_到着駅) :- 出発駅を駅番号で入力(_出発駅番号), 駅番号(_出発駅,_出発駅番号), 到着駅を駅番号で入力(_出発駅番号,_到着駅番号), 駅番号(_到着駅,_到着駅番号),!. 出発駅を駅番号で入力(_出発駅番号) :- 駅名メニュー表示(出発,[],_駅名メニュー表示), writef('%t\n',[_駅名ニュー表示]), 駅番号の入力([],_出発駅番号),!. 到着駅を駅番号で入力(_出発駅番号,_到着駅番号) :- 駅名メニュー表示(到着,[_出発駅番号],_駅名メニュー表示), writef('%t\n',[_駅名メニュー表示]), 駅番号の入力(_出発駅番号,_到着駅番号),!. 駅名メニュー表示(_出発か到着,_回避駅番号ならび,_駅名メニュー表示) :- 駅名メニュー表示(_回避駅番号ならび,_表示駅名ならび), atomic_list_concat([_出発か到着,'駅を駅番号で入力します。 0..最初から入力し直し '|_表示駅名ならび],_駅名メニュー表示). 駅名メニュー表示(_回避駅番号ならび,_表示駅名ならび) :- findall(_表示駅名,( 駅番号(_,_駅番号), 回避駅番号ならびにない駅番号の時は表示駅名を選択(_駅番号,_回避駅番号,_表示駅名)), _表示駅名ならび). 回避駅番号ならびにない駅番号の時は表示駅名を選択(_駅番号,_回避駅番号ならび,_表示駅名) :- \+(member(_駅番号,_回避駅番号ならび)), 駅番号(_駅名,_駅番号), atomic_concat_list([_駅番号,'..',_駅名,' '],_表示駅名). 駅番号の入力(_回避駅番号ならび,_駅番号) :- write('駅番号を入力してください : '), get_line(Line), 駅番号の入力診断(Line,_駅番号),!. 駅番号の入力(_回避駅番号ならび,_駅番号) :- 駅番号の入力(_回避駅番号ならび,_駅番号). 駅番号の入力診断(Line,_回避駅番号ならび,_駅番号) :- atom_to_term(Line,_駅番号,_), '駅番号は整数で回避駅番号ならびにない'(_駅番号,_回避駅番号ならび),!. 駅番号の入力診断(Line,_,_) :- writef('入力された %t からは適切な駅番号が得られません。再入力をお願いします。\n',[Line]), fail. '駅番号は整数で回避駅番号ならびにない'(0,_) :- '駅番号0の時はここでは一旦成功裡に終わる。駅番号がないから最終的には、述語「出発駅と到着駅をそれぞれ駅番号で入力し」で失敗して出発駅からの入れ直しとなる',!. '駅番号は整数で回避駅番号ならびにない'(_駅番号,_回避駅番号ならび) :- integer(_駅番号), 駅番号(_,_駅番号), その駅番号は回避駅番号ならびにない(_駅番号,_回避駅番号ならび). その駅番号は回避駅番号ならびにない(_駅番号,_回避駅番号ならび) :- \+(member(_駅番号,_回避駅番号ならび)),!. その駅番号は回避駅番号ならびにない(_駅番号,_回避駅番号ならび) :- writef('駅番号%tは既に使われています\n',[_駅番号]), fail. 料金を表示する(_出発駅,_到着駅) :- 料金を(_出発駅,_到着駅,_料金), 表示する(_料金). 料金を(_出発駅,_到着駅,_料金) :- 新幹線のぞみ料金(_出発駅,_到着駅,_料金),!. 料金を(_出発駅,_到着駅,_料金) :- 新幹線のぞみ料金(_到着駅,_出発駅,_料金). 表示する(_料金) :- writef('料金は %t 円です\n',[_料金]). '料金を表示してから後で、1 を入力すると上記の処理を繰り返し、0 を入力するとプログラムを終了する' :- write('選択してください。 1.. 処理の繰り返し 0.. 終了 : '), get_integer(_処理番号), _処理番号 = 0. '駅番号0の時はここでは一旦成功裡に終わる。駅番号がないから最終的には、述語「出発駅と到着駅をそれぞれ駅番号で入力し」で失敗して出発駅からの入れ直しとなる'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/959 # # [1] 授業単元: c言語演習 # [2] 問題文(含コード&リンク): 整数nを入力し、以下のようなサイズnの"Z型の図形"を"*"で表示するプログラムを作成しなさい、ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了するようにしなさい。 # # [実行例] # # 3 ←nの入力 # n=3 # *** # * # *** # 4 # n=4 # **** # * # * # **** # 0 ←データの終わり(2以下の値) #   ← n=0は表示しない # # '整数nを入力し、以下のようなサイズnの"Z型の図形"を"*"で表示する。ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する。' :- '整数nを入力する'(_整数n), 'サイズnの"Z型の図形"を"*"で表示する。ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する。'(_整数n). '整数nを入力する'(_整数n) :- write('図形を表示するためのnの値を入力してください : '), get_line(Line), 整数n入力診断(Line,_整数n),!. '整数nを入力する'(_整数n) :- '整数nを入力する'(_整数n). 整数n入力診断(Line,_整数n) :- atom_to_term(Line,_整数n,_), integer(_整数n),!. 整数n入力診断(Line,_整数n) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 'サイズnの"Z型の図形"を"*"で表示する。ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する。'(_整数n) :- _整数n =< 2, write('2以下が入力されました。終了します。\n'),!. 'サイズnの"Z型の図形"を"*"で表示する。ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する。'(_整数n) :- 図形を描く(_整数n,_図形), 図形を表示する(_図形). 図形を描く(_整数n,_図形) :- writef('n = %t\n',[_整数n]), '斜めの*を描く'(_整数n,_図形), '最初の行と最後の行は全部*、中間部分の変数を空白に変換する'(_図形),!. '斜めの*を描く'(_整数n,_図形) :- findall(L,( length(L,_整数n), append(_,[*|_],L)), _図形1), reverse(_図形1,_図形). '最初の行と最後の行は全部*、中間部分の変数を空白に変換する'(_図形) :- append([L1],_中間部分,[L2],_図形), 中間部分の変数を空白に変換する(_中間部分), all(L1,*), all(L2,*). 中間部分の変数を空白に変換する([]). 中間部分の変数を空白に変換する([L|R]) :- 変数を空白に変換する(L), 中間部分の変数を空白に変換する(R). 変数を空白に変換する([]). 変数を空白に変換する([' '|R]) :- 変数を空白に変換する(R),!. 変数を空白に変換する([_|R]) :- 変数を空白に変換する(R). 図形を表示する([]). 図形を表示する([L|R]) :- atomic_list_concat(L,S), writef('%t\n',[S]), 図形を表示する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/850 # # 3角形の3辺の長さがあたえられたとき、 # 正三角形、2等辺三角形、直角三角形か調べるプログラムをつくりなさい # ってな問題がでたことあるんだけど・・・ # 結構むずいよね。 # # '3角形の3辺の長さがあたえられたとき、正三角形、2等辺三角形、直角三角形か調べる'(_辺_1,_辺_2,_辺_3,_診断) :- 正三角形か調べる(_辺_1,_辺_2,_辺_3,_), 2等辺三角形か調べる(_辺_1,_辺_2,_辺_3,_2等辺三角形診断), 直角三角形か調べる(_辺_1,_辺_2,_辺_3,_直角三角形診断), 診断を編集する(_直角三角形診断,_2等辺三角形診断,_診断). 正三角形か調べる(_辺_1,_辺_2,_辺_3,_) :- 正三角形は2等辺三角形に属するからそちらで診断する. 正三角形は2等辺三角形に属するからそちらで診断する. '2等辺三角形か調べる'(_辺,_辺,_辺,'正') :- !. '2等辺三角形か調べる'(_辺,_辺,_,'2等辺') :- !. '2等辺三角形か調べる'(_,_辺,_辺,'2等辺') :- !. '2等辺三角形か調べる'(_辺,_,_辺,'2等辺') :- !. '2等辺三角形か調べる'(_,_,_,''). 直角三角形か調べる(_辺_1,_辺_2,_辺_3,直角) :- select(_長辺,[_辺_1,_辺_2,_辺_3],[_短辺_1,_短辺_2]), _長辺 * _長辺 =:= _短辺_1 * _短辺_1 + _短辺_2 * _短辺_2,!. 直角三角形か調べる(_,_,_,''). 診断を編集する('','','正三角形、2等辺三角形、直角三角形の何れでもない') :- !. 診断を編集する(_直角三角形診断,_2等辺三角形診断,_診断) :- atomic_list_concat([_直角三角形診断,_2等辺三角形診断,'三角形'],_診断). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/850 # # 3角形の3辺の長さがあたえられたとき、 # 正三角形、2等辺三角形、直角三角形か調べるプログラムをつくりなさい # ってな問題がでたことあるんだけど・・・ # 結構むずいよね。 # # '3角形の3辺の長さがあたえられたとき、正三角形、2等辺三角形、直角三角形か調べる'(_辺_1,_辺_2,_辺_3,_診断) :- 正三角形か(_辺_1,_辺_2,_辺_3,_), 2等辺三角形か(_辺_1,_辺_2,_辺_3,_2等辺三角形診断), 直角三角形か(_辺_1,_辺_2,_辺_3,_直角三角形診断), 調べる(_直角三角形診断,_2等辺三角形診断,_診断). 正三角形か(_辺_1,_辺_2,_辺_3,_) :- 正三角形は2等辺三角形に属するからそちらで診断する. 正三角形は2等辺三角形に属するからそちらで診断する. '2等辺三角形か'(_辺,_辺,_辺,'正') :- !. '2等辺三角形か'(_辺,_辺,_,'2等辺') :- !. '2等辺三角形か'(_,_辺,_辺,'2等辺') :- !. '2等辺三角形か'(_辺,_,_辺,'2等辺') :- !. '2等辺三角形か'(_,_,_,''). 直角三角形か(_辺_1,_辺_2,_辺_3,直角) :- select(_長辺,[_辺_1,_辺_2,_辺_3],[_短辺_1,_短辺_2]), _長辺 * _長辺 =:= _短辺_1 * _短辺_1 + _短辺_2 * _短辺_2,!. 直角三角形か(_,_,_,''). 調べる('','','正三角形、2等辺三角形、直角三角形の何れでもない') :- !. 調べる(_直角三角形診断,_2等辺三角形診断,_診断) :- atomic_list_concat([_直角三角形診断,_2等辺三角形診断,'三角形'],_診断). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/850 # # 3角形の3辺の長さがあたえられたとき、 # 正三角形、2等辺三角形、直角三角形か調べるプログラムをつくりなさい # ってな問題がでたことあるんだけど・・・ # 結構むずいよね。 # # '3角形の3辺の長さがあたえられたとき、正三角形、2等辺三角形、直角三角形か調べる'(_辺_1,_辺_2,_辺_3,_診断) :- 正三角形か調べる(_辺_1,_辺_2,_辺_3,_正三角形診断), 直角三角形か調べる(_辺_1,_辺_2,_辺_3,_直角三角形診断), '2等辺三角形か調べる'(_辺_1,_辺_2,_辺_3,_2等辺三角形診断), 診断を編集する(_正三角形診断,_直角三角形診断,_2等辺三角形診断,_診断). 正三角形か調べる(_辺,_辺,_辺,正) :- !. 正三角形か調べる(_,_,''). '2等辺三角形か調べる'(_辺,_辺,_,'2等辺') :- !. '2等辺三角形か調べる'(_,_辺,_辺,'2等辺') :- !. '2等辺三角形か調べる'(_辺,_,_辺,'2等辺') :- !. '2等辺三角形か調べる'(_,_,_,''). 直角三角形か調べる(_辺_1,_辺_2,_辺_3,直角) :- select(_長辺,[_辺_1,_辺_2,_辺_3],[_短辺_1,_短辺_2]), _長辺 * _長辺 =:= _短辺_1 * _短辺_1 + _短辺_2 * _短辺_2,!. 直角三角形か調べる(_,_,_,''). 診断を編集する('','','','正三角形、2等辺三角形,直角三角形の何れでもない') :- !. 診断を編集する(正,_,_,正三角形) :- !. 診断を編集する(_,_直角三角形診断,_2等辺三角形診断,_診断) :- atomic_list_concat([_直角三角形診断,_2等辺三角形診断,'三角形'],_診断),!. % % 一つ問題なのは、「正三角形は直角三角形にはならない」という事を分かって % しまっている定義だということだ。課題のどこを見てもそんな記述はない。 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/850 # # 3角形の3辺の長さがあたえられたとき、 # 正三角形、2等辺三角形、直角三角形か調べるプログラムをつくりなさい # ってな問題がでたことあるんだけど・・・ # 結構むずいよね。 # # '3角形の3辺の長さがあたえられたとき、正三角形、2等辺三角形、直角三角形か調べる'(_辺_1,_辺_2,_辺_3,_診断) :- 正三角形か(_辺_1,_辺_2,_辺_3,_正三角形診断), 直角三角形か(_辺_1,_辺_2,_辺_3,_直角三角形診断), '2等辺三角形か'(_辺_1,_辺_2,_辺_3,_2等辺三角形診断), 調べる(_正三角形診断,_直角三角形診断,_2等辺三角形診断,_診断). 正三角形か(_辺,_辺,_辺,正) :- !. 正三角形か(_,_,''). '2等辺三角形か'(_辺,_辺,_,'2等辺') :- !. '2等辺三角形か'(_,_辺,_辺,'2等辺') :- !. '2等辺三角形か'(_辺,_,_辺,'2等辺') :- !. '2等辺三角形か'(_,_,_,''). 直角三角形か(_辺_1,_辺_2,_辺_3,直角) :- select(_長辺,[_辺_1,_辺_2,_辺_3],[_短辺_1,_短辺_2]), _長辺 * _長辺 =:= _短辺_1 * _短辺_1 + _短辺_2 * _短辺_2,!. 直角三角形か(_,_,_,''). 調べる('','','','正三角形、2等辺三角形,直角三角形の何れでもない') :- !. 調べる(正,_,_,正三角形) :- !. 調べる(_,_直角三角形診断,_2等辺三角形診断,_診断) :- atomic_list_concat([_直角三角形診断,_2等辺三角形診断,'三角形'],_診断),!. % % 一つ問題なのは、「正三角形は直角三角形にはならない」という事を分かって % しまっている定義だということだ。課題のどこを見てもそんな記述はない。 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/862 # # 以下のように検索と置換をしたいのですが # name0 name1 name2が順番が異なる時どのような正規表現をかけばよいでしょうか # # <en_Image name0="image.png" name1="カツ丼" name2="ご飯"></en_Image> # <en_Image name0="image.png" name2="ご飯" name1="カツ丼"></en_Image> # <en_Image name2="ご飯" name1="カツ丼" name0="image.png"></en_Image> #             ↓ # <en_Image name="カツ丼ご飯image.png"></en_Image> # # name0 name1 name2が順番が異なる時,以下のような正規表現では取り出せますん # pattern="<en_Image.*?name0=\"(\\w+?).*?name1=\"(\\w+?).*?name2=\"(\\w+?)">.*?</en_Image>" # replace="<en_Image name==\"$2$3.$1\"></en_Image>" # # # 'name0 name1 name2が順番が異なる時の検索と置換'(_文字列,_置換文字列) :- sPLIT(_文字列,[''],L), 置換(L,L1), atomic_list_concat(L1,_置換された文字列). 置換([],[]) :- !. 置換([A1,B1,' ',A2,B2,' ',A3,C3|R1],['name="カツ丼ご飯image.png"'|R2]) :- 条件_1([A1,A2,A3]), 条件_2([B1,B2,B3]), 置換(R1,R2),!. 置換([A|R1],[A|R2]) :- 置換(R1,R2). 条件_1([]) :- !. 条件_1([A|R]) :- member(A,['name0=','name1=','name2=']), 条件_1(R). 条件_2([]) :- !. 条件_2([A|R]) :- member(A,['image.png','ご飯','カツ丼']), 条件_2(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/589 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文: http://ime.nu/codepad.org/lwC4tzs0 # このコードの関数addNewNodeToHeadとdeleteFirstNodeの中身を完成させてください。 # /*------------------------------------------------ # 連結リストの実装例(リストヘッドによる方法) # ------------------------------------------------*/ # #include # #include # # //DATA型を定義(正体は int 型) # typedef int DATA; # # //NODE型の構造体定義 # typedef struct node { # struct node *next; // 次のノードへのポインタ # DATA data; // データ部 # } NODE; # # //リストの先頭ポインタを保持する変数の宣言 # NODE list_head; # # //関数のプロトタイプ宣言 # void addNewNodeToHead( DATA* ); // 先頭ノードを追加 # void deleteFirstNode(); // 先頭ノードを削除 # void showList(); //リストの表示 # # /*--------------------------------------- # メイン関数 # ---------------------------------------*/ # int main() # { # int key; # DATA value = 1; //格納する値を生成するための変数 # # // リストヘッドの初期化 # list_head.next = NULL; # # //終了の 9 が入力されるまで繰り返す # while( key != 9 ) { # # //リストの表示 # showList(); # # //メニューを表示 # printf("1.先頭に追加,2.先頭を削除,9.終了:"); # # //メニュー番号の入力と分岐 # scanf("%d",&key); # switch( key ) { # # case 1: //リストの先頭にデータを追加 # # //追加するDATA(いまは整数値)を引数に追加関数をよぶ # addNewNodeToHead( &value ); //注意:ノードを追加後,ついでに value をインクリメントしている # break; # # case 2: //先頭のデータを削除 # # //先頭の要素を削除する関数をよぶ # deleteFirstNode(); # break; # } # } # # return 0; # } # # //リストの先頭にノードを追加する # void addNewNodeToHead( DATA *d ) # { # NODE *newNode, *pos; # # # } # # // リストの先頭ノードを削除する # void deleteFirstNode() # { # NODE *pos, *prevNode; # # # } # # //連結リストの状態を表示する # void showList() # { # NODE *pos; //読み出し位置にあるノードへのポインタ変数 # # //最初のノードのアドレスを取得(注意: リストが空の場合は NULL が入っている) # pos = list_head.next; # # //末尾のノードまで繰り返す # while ( pos != NULL ) { # printf("%d ", pos->data); //データ参照して表示 # pos = pos->next; //次のノードに進む # } # # printf("\n\n"); # } # 実行結果 # 1.先頭に追加、2.先頭を削除、9.終了:1 # 1 # 1.先頭に追加、2.先頭を削除、9.終了:1 # 2 1 # 1.先頭に追加、2.先頭を削除、9.終了:2 # 1 # 1.先頭に追加、2.先頭を削除、9.終了:2 # # 1.先頭に追加、2.先頭を削除、9.終了:2 # 削除するデータがありません # 1.先頭に追加、2.先頭を削除、9.終了:9 # リストの先頭にデータを追加(_データ,_リスト,[_データ|_リスト]). 先頭のデータを削除([_データ|_リスト],_取り除かれたデータ,_リスト). 先頭のデータを削除([],_,[]) :- write('データがありません。\n'). リストヘッドの初期化(_,[]). 実行(_現在のリスト,_実行後のリスト) :- メニューを表示, メニュー番号の入力と分岐(_現在のリスト,_メニュー番号,_実行後のリスト_1), リストの表示(_実行後のリスト_1), 実行の終了診断(_メニュー番号,_実行後のリスト_1,_実行後のリスト). 実行の終了診断(9,_実行後リスト_1,_実行後のリスト) :- !. 実行の終了診断(_,_実行後リスト_1,_実行後のリスト) :- 実行(_実行後リスト_1,_実行後のリスト). リストの表示(_リスト) :- length(_リスト,_リストの長さ), 表示パターンの生成(_リストの長さ,_表示パターン), writef(_表示パターン,_リスト), write('\n'). 表示パターンの生成(_リストの長さ,_表示パターン) :- length(L1,_リストの長さ), all(L1,'%t'), atomic_list_concat(L1,',',_表示パターン). メニューを表示 :- write('1.先頭に追加,2.先頭を削除,9.終了:'). メニュー番号の入力と分岐(_現在のリスト,_メニュー番号,_実行後のリスト) :- メニュー番号の入力(_メニュー番号), 分岐(_メニュー番号,_現在のリスト,_実行後のリスト). メニュー番号の入力(_メニュー番号) :- get_integer(_メニュー番号). 分岐(1,_現在のリスト,_実行後のリスト) :- 追加するデータを得る(_データ), リストの先頭にデータを追加(_データ,_現在のリスト,_実行後のリスト). 分岐(2,_現在のリスト,_実行後のリスト) :- 先頭のデータを削除(_現在のリスト,_,_実行後のリスト). 分岐(9,_リスト,_リスト). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/501 # # ../test/read.cgi/tech/1335517816/496 ../test/read.cgi/tech/1335517816/498 # ありがとうございます。 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し、 # リターンキーを押すと数字のみ#に置き換えられた文字列が出力されるプログラムを作成しなさい。 # 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し、リターンキーを押すと数字のみ#に置き換えられた文字列が出力される' :- 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_文字列), '数字のみ#に置き換えられた文字列が'(_文字列,_置き換えられた文字列), 出力される(_置き換えられた文字列). 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_文字列) :- length(Ln,48), get_char(_文字), 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(Ln,_文字,_文字ならび), atom_chars(_文字列,_文字ならび). 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_,'\n',[]) :- !. 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'([_],_文字,[_文字]) :- !. 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'([_|Ln],_文字,[_文字|R]) :- 'アルファベット、数字、空白が混在した文字'(_文字_2), 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(Ln,_文字_2,R). 'アルファベット、数字、空白が混在した文字'(_文字) :- get_char(_文字), 'アルファベット、数字、空白が混在した文字診断'(_文字),!. 'アルファベット、数字、空白が混在した文字'(_文字) :- 'アルファベット、数字、空白が混在した文字'(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- アルファベット(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- 数字(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- 空白(_文字). アルファベット(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. アルファベット(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 数字(_文字) :- member(_文字,['0','1','2','3','4','5','6','7','8','9']). 空白(' '). '数字のみ#に置き換えられた文字列が'(_文字列,_置き換えられた文字列) :- findall(_数字のみ置き換えられた文字,( sub_atom(_文字列,_,1,_,_文字), '数字のみ#の置き換える'(_文字,_数字のみ置き換えられた文字)), L), atomic_list_concat(L,_置き換えられた文字列). '数字のみ#の置き換える'(_文字,'#') :- 数字(_文字),!. '数字のみ#の置き換える'(_文字,_文字). 出力される(_置き換えられた文字列) :- writef('置き換えられた文字列 = "%t"\n',[_置き換えられた文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/501 # # ../test/read.cgi/tech/1335517816/496 ../test/read.cgi/tech/1335517816/498 # ありがとうございます。 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し、 # リターンキーを押すと数字のみ#に置き換えられた文字列が出力されるプログラムを作成しなさい。 # 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し、リターンキーを押すと数字のみ#に置き換えられた文字列が出力される' :- 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_文字列), '数字のみ#に置き換えられた文字列が'(_文字列,_置き換えられた文字列), 出力される(_置き換えられた文字列). 'アルファベット、数字、空白が混在した文字列(最高48文字)をキーボードから入力し'(_文字列) :- length(L,48), findall(_文字,( append(L0,[_|_],L), 'アルファベット、数字、空白が混在した文字'(_文字), ( _文字='\n',!,fail; true)), _文字ならび), atom_chars(_文字列,_文字ならび). 'アルファベット、数字、空白が混在した文字'(_文字) :- get_char(_文字), 'アルファベット、数字、空白が混在した文字診断'(_文字),!. 'アルファベット、数字、空白が混在した文字'(_文字) :- 'アルファベット、数字、空白が混在した文字'(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- アルファベット(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- 数字(_文字). 'アルファベット、数字、空白が混在した文字診断'(_文字) :- 空白(_文字). アルファベット(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. アルファベット(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 数字(_文字) :- member(_文字,['0','1','2','3','4','5','6','7','8','9']). 空白(' '). '数字のみ#に置き換えられた文字列が'(_文字列,_置き換えられた文字列) :- findall(_数字のみ置き換えられた文字,( sub_atom(_文字列,_,1,_,_文字), '数字のみ#の置き換える'(_文字,_数字のみ置き換えられた文字)), L), atomic_list_concat(L,_置き換えられた文字列). '数字のみ#の置き換える'(_文字,'#') :- 数字(_文字),!. '数字のみ#の置き換える'(_文字,_文字). 出力される(_置き換えられた文字列) :- writef('置き換えられた文字列 = "%t"\n',[_置き換えられた文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/814 # # しばらくずっとプログラミングしてなかったもので、正規表現を忘れてしまったのですが、PHPにて # # Japanese system that # <a title=" どうやら〜らしい" style="text-decoration: underline" href="javascript:;">apparently</a> # # のような文章で、両<a>タグを除去して(apparentlyは残す)、テキストだけにしたいのですが、どのように書けばいいでしょうか? # 両タグを除去する(_文字列,_両タグを除去された文字列) :- search(_文字列,[<,a],S2_2,[<,/,a,>],S1,S2,S3,L1,L2,L3), search(S2_2,[>],S2_3,[],_,_,_,_,_,_), atomic_list_concat([S1,S2_3,S3],_両タグを除去された文字列). % search/10 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/405 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # # 繰り返し入力された文字列をリストに集めてそれを連結する。 # 文字列 quit が入力された時終了する # % % 一般には文字列を一旦リストに集めてそれから結合する % % 終了条件の ,!,fail; がポイント % '繰り返し入力された文字列を連結する。文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示する' :- findall(_入力された文字列,( 入力された文字列(_入力された文字列), ( _入力された文字列 = quit,!,fail; true)), L), atomic_list_concat(L,_連結された文字列), writef('%t\n',[_連結された文字列]). 入力された文字列(_入力された文字列) :- write('文字列 ? '), get_line(_入力された文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1255277760/449 # # なんか布団の中で思いついた問題 # # 1. 0から9999までの整数を入力として受け取り、それをひらがなで出力するプログラムを書け #  例) 0→ぜろ 4→よん 14→じゅうよん 87→はちじゅうなな 801→はっぴゃくいち 7974→ななせんきゅうひゃくななじゅうよん # # 2. 0から99999999(9999万9999)までの整数を入力として受け取り、それをひらがなで出力するプログラムを書け #  例)88880007→はっせんはっぴゃくはちじゅうはちまんなな # # 3. 0から9999999999999999(9999兆9999億9999万9999)までの整数を入力として受け取り、それをひらがなで出力するプログラムを書け #  例)8000800080008→はっちょうはちおくはちまんはち # # 4. 上記3において、入力が3の倍数もしくは3がつく数字であるときにはその数字を英語で出力せよ # # '0から99999999(9999万9999)までの整数を入力として受け取り、それをひらがなで出力するプログラムを書け'(0,れい) :- !. '0から99999999(9999万9999)までの整数を入力として受け取り、それをひらがなで出力するプログラムを書け'(N,ひらがな) :- N_1 is N // 10000, M is N mod 10000, '0から9999までの整数を入力として受け取り、それをひらがなで出力するプログラムを書け'(M,_一万の桁以上のひらがな表現), '0から9999までの整数を入力として受け取り、それをひらがなで出力するプログラムを書け'(M,_千の桁以下のひらがな表現), atomic_list_concat([_一万の桁以上のひらがな表現,まん,_千の桁以下のひらがな表現],_ひらがな). '0から9999までの整数を入力として受け取り、それをひらがなで出力するプログラムを書け'(_0から9999までの整数,_整数のひらがな表現) :- 千の桁のひらがな(_0から9999までの整数,_百以下の桁の整数,_千の桁のひらがな), 百の桁のひらがな(_百以下の桁の整数,_十以下の桁の整数,_百の桁のひらがな), 十の桁のひらがな(_十以下の桁の整数,_十の桁のひらがな,_一の桁のひらがな), atomic_list_concat([_千の桁のひらがな,_百の桁のひらがな,_十の桁のひらがな,_一の桁のひらがな],_整数のひらがな表現). 千の桁のひらがな(N,N,'') :- N < 1000. 千の桁のひらがな(N,_百以下の桁の整数,_ひらがな) :- _千の桁の整数 is N // 1000, 数字のひらがな(_千の桁の整数,せん,_ひらがな), _百以下の桁の整数 is N mod 1000. 百の桁のひらがな(N,N,'') :- N < 1000,!. 百の桁のひらがな(N,_十以下の桁の整数,_ひらがな) :- _百の桁の整数 is N // 100, 数字のひらがな(_百の桁の整数,せん,_ひらがな), _十以下の桁の整数 is N mod 100. 十の桁のひらがな(N,'',_一の桁のひらがな) :- 数字のひらがな(_一の桁の整数,いち,_一の桁のひらがな). 十の桁のひらがな(N,_十の桁のひらがな,_一の桁のひらがな) :- _十の桁の整数 is N // 10, 数字のひらがな(_十の桁の整数,じゅう,_十の桁のひらがな), _一の桁の整数 is N mod 10, 数字のひらがな(_一の桁の整数,いち,_一の桁のひらがな). 数字のひらがな(0,_,'') :- !. 数字のひらがな(1,せん,せん) :- !. 数字のひらがな(1,ひゃく,ひゃく) :- !. 数字のひらがな(1,じゅう,じゅう) :- !. 数字のひらがな(1,いち,いち) :- !. 数字のひらがな(3,せん,さんぜん) :- !. 数字のひらがな(3,ひゃく,さんびゃく) :- !. 数字のひらがな(6,ひゃく,ろっぴゃく) :- !. 数字のひらがな(8,ひゃく,はっぴゃく) :- !. 数字のひらがな(8,せん,はっせん) :- !. 数字のひらがな(_二より大きい数,_桁のひらがな,_ひらがな) :- 二より大きい数のひらがな(_二より大きい数,_二より大きい数のひらがな), atomic_list_concat([_により大きい数のひらがな,_桁のひらがな],_ひらがな). 二より大きい数のひらがな(2,に). 二より大きい数のひらがな(3,さん). 二より大きい数のひらがな(4,よん). 二より大きい数のひらがな(5,ご). 二より大きい数のひらがな(6,ろく). 二より大きい数のひらがな(7,なな). 二より大きい数のひらがな(8,はち). 二より大きい数のひらがな(9,きゅう). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1255277760/449 # # なんか布団の中で思いついた問題 # # 1. 0から9999までの整数を入力として受け取り、それをひらがなで出力するプログラムを書け #  例) 0→ぜろ 4→よん 14→じゅうよん 87→はちじゅうなな 801→はっぴゃくいち 7974→ななせんきゅうひゃくななじゅうよん # # 2. 0から99999999(9999万9999)までの整数を入力として受け取り、それをひらがなで出力するプログラムを書け #  例)88880007→はっせんはっぴゃくはちじゅうはちまんなな # # 3. 0から9999999999999999(9999兆9999億9999万9999)までの整数を入力として受け取り、それをひらがなで出力するプログラムを書け #  例)8000800080008→はっちょうはちおくはちまんはち # # 4. 上記3において、入力が3の倍数もしくは3がつく数字であるときにはその数字を英語で出力せよ # # '0から9999までの整数を入力として受け取り、それをひらがなで出力するプログラムを書け'(0,れい) :- !. '0から9999までの整数を入力として受け取り、それをひらがなで出力するプログラムを書け'(_0から9999までの整数,_整数のひらがな表現) :- 千の桁のひらがな(_0から9999までの整数,_百以下の桁の整数,_千の桁のひらがな), 百の桁のひらがな(_百以下の桁の整数,_十以下の桁の整数,_百の桁のひらがな), 十の桁のひらがな(_十以下の桁の整数,_十の桁のひらがな,_一の桁のひらがな), atomic_list_concat([_千の桁のひらがな,_百の桁のひらがな,_十の桁のひらがな,_一の桁のひらがな],_整数のひらがな表現). 千の桁のひらがな(N,N,'') :- N < 1000. 千の桁のひらがな(N,_百以下の桁の整数,_ひらがな) :- _千の桁の整数 is N // 1000, 数字のひらがな(_千の桁の整数,せん,_ひらがな), _百以下の桁の整数 is N mod 1000. 百の桁のひらがな(N,N,'') :- N < 1000,!. 百の桁のひらがな(N,_十以下の桁の整数,_ひらがな) :- _百の桁の整数 is N // 100, 数字のひらがな(_百の桁の整数,せん,_ひらがな), _十以下の桁の整数 is N mod 100. 十の桁のひらがな(N,'',_一の桁のひらがな) :- 数字のひらがな(_一の桁の整数,いち,_一の桁のひらがな). 十の桁のひらがな(N,_十の桁のひらがな,_一の桁のひらがな) :- _十の桁の整数 is N // 10, 数字のひらがな(_十の桁の整数,じゅう,_十の桁のひらがな), _一の桁の整数 is N mod 10, 数字のひらがな(_一の桁の整数,いち,_一の桁のひらがな). 数字のひらがな(0,_,'') :- !. 数字のひらがな(1,せん,せん) :- !. 数字のひらがな(1,ひゃく,ひゃく) :- !. 数字のひらがな(1,じゅう,じゅう) :- !. 数字のひらがな(1,いち,いち) :- !. 数字のひらがな(3,せん,さんぜん) :- !. 数字のひらがな(3,ひゃく,さんびゃく) :- !. 数字のひらがな(6,ひゃく,ろっぴゃく) :- !. 数字のひらがな(8,ひゃく,はっぴゃく) :- !. 数字のひらがな(8,せん,はっせん) :- !. 数字のひらがな(_二より大きい数,_桁のひらがな,_ひらがな) :- 二より大きい数のひらがな(_二より大きい数,_二より大きい数のひらがな), atomic_list_concat([_により大きい数のひらがな,_桁のひらがな],_ひらがな). 二より大きい数のひらがな(2,に). 二より大きい数のひらがな(3,さん). 二より大きい数のひらがな(4,よん). 二より大きい数のひらがな(5,ご). 二より大きい数のひらがな(6,ろく). 二より大きい数のひらがな(7,なな). 二より大きい数のひらがな(8,はち). 二より大きい数のひらがな(9,きゅう). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/343 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # ピリオドの後に拡張子が付いているファイル名file.docが 与えられたとき, # 拡張子の無いファイル名部分(file)と, 拡張子(doc)に分け, # 文字列の配列 fname[][]に代入するプログラムを 作成しなさい. # 結果も表示すること. # ただし、文字列のループ文は文字列の長さを使わないで作り、 # ポインタ、無限ループなどは使用してはいけない. # 'ピリオドの後に拡張子が付いているファイル名が与えられたとき,拡張子の無いファイル名部分と, 拡張子に分ける'(_ピリオドの後に拡張子が付いているファイル名,_拡張子の無いファイル名部分,_拡張子) :- split(_ピリオドの後に拡張子が付いているファイル名,['.'],L), append(L1,[_拡張子],L), atomic_list_concat(L1,'.',_拡張子の無いファイル名部分). % split/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/188 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # #include <stdio.h> # # int main(void) # { # int a, b, c; /* 整数変数a,b,cの宣言 */ # # printf("身長を入力してください"); # scanf("%d", &a); # printf("体重を入力してください"); # scanf("%d", &b); # # printf( "%d-%dは %d\n", a,b,c); /* 表示 */ # return 0; # } # こちらのコードを少し変えて # 身長と体重の変数(どちらも倍精度実数変数)を宣言。身長と体重を入力し、画面に表示する。身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。 # 【実行結果例】 # 身長を入力してください(cm)?170.5 # 体重を入力してください(cm)?65.5 # 身長は170.5で、体重は65.5です。 # '身長と体重を入力し、画面に表示する。身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。' :- '身長と体重を入力し'(_身長,_体重), '画面に表示する。身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。'(_身長,_体重). '画面に表示する。身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。'(_身長,_体重) :- '適宜コメントを'(_身長,_体重,_コメント), '身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。'(_身長,_体重,_コメント). '適宜コメントを'(_身長,_体重,_コメント) :- 'BMI値の計算判定'(_身長,_体重,_BMI値,_BMI値判定), atomic_list_concat(['BMI値は',_BMI値,' 判定は ',_BMI値判定,' です'],_コメント). '身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。'(_身長,_体重,_コメント) :- format('身長 ~1f 体重~1f',[_身長,_体重]), writef(' コメントは %t\n',[_コメント]). '身長と体重を入力し'(_身長,_体重) :- 身長の入力(_身長), 体重の入力(_体重). 身長の入力(_身長) :- get_line(Line), 身長の入力診断(Line,_身長),!. 身長の入力(_身長) :- 身長の入力(_身長). 身長の入力診断(Line,_身長) :- atom_to_term(Line,_身長,_), number(_身長), _身長 >= 0.0, _身長 =< 250.0,!. 身長の入力診断(Line,_身長) :- writef('入力された %t からは適切な身長が得られません。再入力をお願いします。\n',[Line]), fail. 体重の入力(_体重) :- write('体重を入力してください : '), get_line(Line), 体重の入力診断(Line,_体重),!. 体重の入力(_体重) :- 体重の入力(_体重). 体重の入力診断(Line,_体重) :- atom_to_term(Line,_体重,_), number(_体重), _体重 >= 0.0, _体重 =< 250.0,!. 体重の入力診断(Line,_体重) :- writef('入力された %t からは適切な体重が得られません。再入力をお願いします。\n',[Line]), fail. 'BMI値の計算判定'(_身長,_体重,_BMI値,_BMI値判定) :- 'BMI値の計算'(_身長,_体重,_BMI値), 'BMI値の判定'(_BMI値,_BMI値の判定). 'BMI値の計算'(_身長,_体重,_BMI値) :- _身長 > 3, _BMI値 is _体重 / (_身長 ^ 2). 'BMI値の判定'(_BMI値,やせています) :- _BMI値 < 20.0,!. 'BMI値の判定'(_BMI値,普通です) :- _BMI値 >= 20.0, _BMI値 < 20.0,!. 'BMI値の判定'(_BMI値,やや肥満です) :- _BMI値 >= 24.0, _BMI値 < 26.5,!. 'BMI値の判定'(_BMI値,肥満です) :- _BMI値 >= 26.5,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/792 # # ABCが登場したらその後に登場する全てのDEFをXYZへ置換するにはどうしたらいいのん? # # xkdmeABCidkDEFledxaoDEFasdDEF # ↓ # xkdmeABCidkXYZledxaoXYZasdXYZ # # 'ABCが登場したらその後に登場する全てのDEFをXYZへ置換するにはどうしたらいいのん? '(_文字列,_置換された文字列) :- sub_atom(_文字列,S1,'ABC',S2),!, その後に登場する全てのDEFをXYZへ置換する(S2,S3), atom_list_concat([S1,'ABC',S3],_置換された文字列). 'ABCが登場したらその後に登場する全てのDEFをXYZへ置換するにはどうしたらいいのん? '(_文字列,_文字列). その後に登場する全てのDEFをXYZへ置換する(_文字列,_置換された文字列) :- 決定性の全置換(_文字列,'DEF','XYZ',_置換された文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 決定性の全置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- sub_atom(_文字列,Start,Length,Rest,_置換対象文字列), sub_atom(_文字列,0,Start,_,S1), Start_S3 is Start + Length, sub_atom(_文字列,Start_S3,Rest,0,S3), 決定性の全置換(S3,_置換対象文字列,_置換文字列,_置換された文字列_2), atomic_list_concat([S1,_置換文字列,_置換された文字列_2],_置換された文字列),!. 決定性の全置換(_文字列,_,_,_文字列). % sub_atom/4 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/775 # # ●正規表現の使用環境 # PCRE # # ●検索か置換か? # 置換 # # ●説明 # <tag>から</tag>内の文字列abcをABCへ置換したい # # ●対象データ # xabcxxx<tag>abcxxxxxxxxxxxabcxxxxxxxabcxx</tag>xxxxabcxxxabcxx # xabcxxx<tag>abc</tag>xxxxaxxxxxxxabcxxcxxxxx<tag>abcxx</tag>xxx # # ●希望する結果 # xabcxxx<tag>ABCxxxxxxxxxxxABCxxxxxxxABCxx</tag>xxxxabcxxxabcxx # xabcxxx<tag>ABC</tag>xxxxaxxxxxxxabcxxcxxxxx<tag>ABCxx</tag>xxx # # # '<tag>から</tag>内の文字列abcをABCへ置換したい'(_文字列,_タグ,_置換された文字列) :- タグと終了タグ文字ならび(_タグ,_タグ文字ならび,_終了タグ文字ならび), sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(L1_1,_タグ文字ならび,L1), append(_終了タグ文字ならび,R3,L3), タグまたは終了タグを含まない(L2,_タグ文字ならび,_終了タグ文字ならび), abcをABCへ置換(S2,S2_2), '<tag>から</tag>内の文字列abcをABCへ置換したい'(S3,_置換された文字列_2), atomic_list_concat([S1,S2_2,_置換された文字列_2],_置換された文字列),!. '<tag>から</tag>内の文字列abcをABCへ置換したい'(_文字列,_文字列). タグと終了タグ文字ならび(_タグ,_タグ文字ならび,_終了タグ文字ならび) :- atom_chars(_タグ,Chars), append([<],Chars,[>],_タグ文字ならび), append([<,/],Chars,[>],_終了タグ文字ならび),!. タグまたは終了タグを含まない(L,L1,L2) :- \+(append(_,L1,_,L)), \+(append(_,L2,_,L)). abcをABCへ置換(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,abc,S3,_,_,_), abcをABCへ置換(S3,_置換された文字列_2), atomic_list_concat([S1,'ABC',_置換された文字列_2],_置換された文字列),!. abcをABCへ置換(_文字列,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/775 # # ●正規表現の使用環境 # PCRE # # ●検索か置換か? # 置換 # # ●説明 # <tag>から</tag>内の文字列abcをABCへ置換したい # # ●対象データ # xabcxxx<tag>abcxxxxxxxxxxxabcxxxxxxxabcxx</tag>xxxxabcxxxabcxx # xabcxxx<tag>abc</tag>xxxxaxxxxxxxabcxxcxxxxx<tag>abcxx</tag>xxx # # ●希望する結果 # xabcxxx<tag>ABCxxxxxxxxxxxABCxxxxxxxABCxx</tag>xxxxabcxxxabcxx # xabcxxx<tag>ABC</tag>xxxxaxxxxxxxabcxxcxxxxx<tag>ABCxx</tag>xxx # # # '<tag>から</tag>内の文字列abcをABCへ置換したい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(L1_1,[<,t,a,g,>],L1), L3 = [<,/,t,a,g,>|R3], 'tagまたは/tagを含まない'(L2), abcをABCへ置換(S2,S2_2), '<tag>から</tag>内の文字列abcをABCへ置換したい'(S3,_置換された文字列_2), atomic_list_concat([S1,S2_2,_置換された文字列_2],_置換された文字列),!. '<tag>から</tag>内の文字列abcをABCへ置換したい'(_文字列,_文字列). 'tagまたは/tagを含まない'(L2) :- \+(append(_,[<,t,a,g,>|_],L2)), \+(append(_,[<,/,t,a,g,>|_],L2)). abcをABCへ置換(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,abc,S3,_,_,_), abcをABCへ置換(S3,_置換された文字列_2), atomic_list_concat([S1,'ABC',_置換された文字列_2],_置換された文字列),!. abcをABCへ置換(_文字列,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/118 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 次の規則に従う数列a_{0},a_{1},a_{2},...を表示するプログラムを作成しなさい. # ただし、配列を使用してはならない。 # 1. 初期値a_{0}は,任意の自然数とする. # 2. 数列a_{n+1}は次の式で決められる. # a_{n+1}=a_{n}/2   (a_{n}が偶数のとき) # a_{n+1}=3a_{n}+1   (a_{n}が奇数のとき) # 3. 数列a_{n}=1になったら終了する. # 例えば,a_{0}=13のとき{13, 40, 20, 10, 5, 16, 8, 4, 2, 1}となる. # '次の規則に従う数列a_{0},a_{1},a_{2},...を表示する.1. 初期値a_{0}は,任意の自然数とする. 2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき) 3. 数列a_{n}=1になったら終了する' :- '1. 初期値a_{0}は,任意の自然数とする'(_初期値a_0), '2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき) 3. 数列a_{n}=1になったら終了する'(_初期値a_0,_a), '数列a_{0},a_{1},a_{2},...を表示する'(_初期値a_0,_a). '2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき) 3. 数列a_{n}=1になったら終了する'(_a_n,[_a_n]) :- '3. 数列a_{n}=1になったら終了する'(_a_n),!. '2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき) 3. 数列a_{n}=1になったら終了する'(_a_n,[_a_n|R]) :- 'a_{n+1}=a_{n}/2 (a_{n}が偶数のとき)'(_a_n,_a_n_1), '2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき) 3. 数列a_{n}=1になったら終了する'(_a_n_1,R). '2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき) 3. 数列a_{n}=1になったら終了する'(_a_n,[_a_n|R]) :- 'a_{n+1}=a_{n}/2 (a_{n}が奇数のとき)'(_a_n,_a_n_1), '2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき) 3. 数列a_{n}=1になったら終了する'(_a_n_1,R). '3. 数列a_{n}=1になったら終了する'(_a_n) :- _a_n = 1. 'a_{n+1}=a_{n}/2 (a_{n}が偶数のとき)'(_a_n,_a_n_1) :- 'a_{n}が偶数のとき'(_a_n), _a_n_1 is _a_n // 2. 'a_{n}が偶数のとき'(_a_n) :- 0 is _a_n mod 2. 'a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき)'(_a_n,_a_n_1) :- 'a_{n}が奇数のとき'(_a_n), _a_n_1 is 3 * a_n + 1. 'a_{n}が奇数のとき'(_a_n) :- 1 is _a_n mod 2. '1. 初期値a_{0}は,任意の自然数とする'(_初期値a_0) :- 任意の自然数とする(_初期値a_0). 任意の自然数とする(_初期値a_0) :- write('自然数を入力してください : '), get_integer(_初期値a_0), _初期値a_0 > 0. '数列a_{0},a_{1},a_{2},...を表示する'(_初期値a_0,_a) :- atomic_list_concat(_a,', ',S), writef('a_{0}=%tのとき{ %t}\n',[_初期値a_0,S]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/929 # # よろしくお願いします # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # ひとつの英文をキーボードから入力し、その単語数と文字数を出力 # するプログラムを作成せよ。 # 'ひとつの英文をキーボードから入力し、その単語数と文字数を出力する' :- 'ひとつの英文をキーボードから入力し'(_英文), 'その単語数と文字数を出力する'(_英文). 'ひとつの英文をキーボードから入力し'(_英文) :- write('英文を入力して下さい : '), 'キーボードからEOFになるまで文字ならびを得る'(_文字ならび), concat_atom(_文字ならび,_英文). 'キーボードからEOFになるまで文字ならびを得る'([]) :- at_end_of_stream(user_input),!. 'キーボードからEOFになるまで文字ならびを得る'([_文字|R]) :- get_char(_文字), 'キーボードからEOFになるまで文字ならびを得る'(R). 'その単語数と文字数を出力する'(_英文) :- sPLIT(_英文,[' ',',',':',';','.'],L), 単語数(L,_単語数), 文字数(Line,_文字数), writef('単語数は%t, 文字数は%tです。\n',[_単語数,_文字数]). 単語数([],0). 単語数([A|R],_単語数) :- \+(member(A,[' ',',',':',';','.'])), 単語数(R,_単語数_1), _単語数 is _単語数_1 + 1,!. 単語数([A|R],_単語数) :- member(A,[' ',',',':',';','.']), 単語数(R,_単語数). 文字数(Line,_文字数) :- atom_length(Line,_文字数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/881 # # 昨日宿題で出された問題です。よろしくお願いします。 # 解説無しでここから試験が出るようなので難しさに焦っています。 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて、 # 式の値がちょうど 100 となる例を挙げよ(10とおりだけ書け)。 # # たとえば、 #  1 + 2 * 3 * 4 * 5 + 6 * 7 - 8 * 9 = 91 # というような計算をする。ただし、この例では式の値が91となるので答えではない。 # # '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて、式の値がちょうど 100 となる例を挙げよ'(_式) :- '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'([1,V1,2,V2,3,V3,4,V4,5,V5,6,V6,7,V7,8,V8,9]), '式の値がちょうど 100 となる例を挙げよ'([1,V1,2,V2,3,V3,4,V4,5,V5,6,V6,7,V7,8,V8,9],_式). '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'([_]). '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'([N,_演算子|R]) :- member(_演算子,[+,-,*]), '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'(R). '式の値がちょうど 100 となる例を挙げよ'(L,_式) :- atomic_list_concat(L,_式表示), atom_to_term(_式表示,_式,_), 100 is _式. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/881 # # 昨日宿題で出された問題です。よろしくお願いします。 # 解説無しでここから試験が出るようなので難しさに焦っています。 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて、 # 式の値がちょうど 100 となる例を挙げよ(10とおりだけ書け)。 # # たとえば、 #  1 + 2 * 3 * 4 * 5 + 6 * 7 - 8 * 9 = 91 # というような計算をする。ただし、この例では式の値が91となるので答えではない。 # # '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて、式の値がちょうど 100 となる例を挙げよ'(_式) :- '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'([1,V1,2,V2,3,V3,4,V4,5,V5,6,V6,7,V7,8,V8,9]), atomic_list_concat([1,V1,2,V2,3,V3,4,V4,5,V5,6,V6,7,V7,8,V8,9],_式表示), atom_to_term(_式表示,_式,_), 100 is _式. '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'([_]). '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'([N,_演算子|R]) :- member(_演算子,[+,-,*]), '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/881 # # 昨日宿題で出された問題です。よろしくお願いします。 # 解説無しでここから試験が出るようなので難しさに焦っています。 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて、 # 式の値がちょうど 100 となる例を挙げよ(10とおりだけ書け)。 # # たとえば、 #  1 + 2 * 3 * 4 * 5 + 6 * 7 - 8 * 9 = 91 # というような計算をする。ただし、この例では式の値が91となるので答えではない。 # # '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて、式の値がちょうど 100 となる例を挙げよ'(_式) :- FL = [+,-,*], member(V1,FL), member(V2,FL), member(V3,FL), member(V4,FL), member(V5,FL), member(V6,FL), member(V7,FL), member(V8,FL), atomic_list_concat([1,V1,2,V2,3,V3,4,V4,5,V5,6,V6,7,V7,8,V8,9],_式表示), atom_to_term(_式表示,_式,_), 100 is _式. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/881 # # 昨日宿題で出された問題です。よろしくお願いします。 # 解説無しでここから試験が出るようなので難しさに焦っています。 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて、 # 式の値がちょうど 100 となる例を挙げよ(10とおりだけ書け)。 # # たとえば、 #  1 + 2 * 3 * 4 * 5 + 6 * 7 - 8 * 9 = 91 # というような計算をする。ただし、この例では式の値が91となるので答えではない。 # # '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて、式の値がちょうど 100 となる例を挙げよ'(_式) :- '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'(1,L), atomic_list_concat(L,_式表示), atom_to_term(_式表示,_式,_), 100 is _式. '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'(9,[9]). '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'(N,[N,_演算子|R]) :- N < 9, member(_演算子,[+,-,*]), N_2 is N + 1, '1〜9までの連続する数字の間に和・差・積の演算子(+, -, *)を適当に入れて'(N_2,R). % 以下のサイトは # 出典:: http://kohada.2ch.net/test/read.cgi/php/1168450843/821 # # 住所と番地の間にある空白を削除する場合どうやればいいですか? # 「見附市 見附 123番地」この文字列を # 「見附市 見附123番地」としたいです # 「見附市」と「見附」の間の空白はそのままという条件付です # 市(見附市). 住所と番地の間にある空白を削除する(_文字列,_住所と番地の間にある空白を削除された文字列) :- 空白で分割して空白を含む要素ならびを作る(_文字列,_要素ならび), 前の要素が市名でない番地前の空白を削除されたならび(_要素ならび,_前の要素が市名でない番地前の空白を削除されたならび), ならびを結合して住所と番地の間にある空白を削除された文字列を生成(_前の要素が市名でない番地前の空白を削除されたならび,_住所と番地の間にある空白を削除された文字列). 空白で分割して空白を含む要素ならびを作る(_文字列,_要素ならび) :- sPLIT(_文字列,[' '],L). 前の要素が市名でない番地前の空白を削除されたならび(_要素ならび,_前の要素が市名でない番地前の空白を削除されたならび) :- append(L1,[A|R2],[B|R3],L), 前の要素が市名でない番地前の空白を(A,B,R2), 削除されたならび(L1,A,B,R2,_前の要素が市名でない番地前の空白を削除されたならび). 前の要素が市名でない番地前の空白を(A,B,R2) :- \+(市名(A)), all(R2,' '), sub_atom(B,0,1,_,_B0), member(B0,['0','1','2','3','4','5','6','7','8','9']),!. 削除されたならび(L1,A,B,R2,_前の要素が市名でない番地前の空白を削除されたならび) :- append(L1,[A,B|R3],_前の要素が市名でない番地前の空白を削除されたならび). ならびを結合して住所と番地の間にある空白を削除された文字列を生成(_前の要素が市名でない番地前の空白を削除されたならび,_住所と番地の間にある空白を削除された文字列) :- atomic_list_concat(_前の要素が市名でない番地前の空白を削除されたならび,_住所と番地の間にある空白を削除された文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/647 # # #インデントが崩れる場合は http://ime.nu/pastebin.com/26BkXDHs をみてください。 # # -- # -- 商品テーブルと、 # -- # create table items ( # id serial primary key, # name varchar(255) not null, # price integer not null -- 単価 # ); # # -- # -- 販売テーブルがあるとする。 # -- # create table sales ( # id serial primary key, # item_id integer not null references items(id), # count integer not null default 1, -- 個数 # total integer not null, -- 単価 * 個数 # created_at timestamp not null default current_datetime # ) # # -- # -- 日付を指定して、その日の商品別販売金額合計を大きい順に表示したい。 # -- どういうSQLを書けばいいの? # -- こんなかんじで書けたらいいんだけど。 # -- # select items.id, items.name # from items, # (select item_id, sum(total) as sum_total # from sales # where date(created_at) = '2012-04-01' # group by item_id) as totals # where items.id = totals.item_id # order by totals.sum_total desc; # # '日付を指定して、その日の商品別販売金額合計を大きい順に表示したい' :- '日付を指定して、'(_日付), その日の商品別販売金額合計を(_日付,L1), 大きい順に表示する(L1). '日付を指定して、'(_日付) :- write('日付を8桁の整数で入力して下さい : '), get_line(Line), '日付を指定して、の診断'(Line,_日付),!. '日付を指定して、'(_日付) :- '日付を指定して、'(_日付). '日付を指定して、の診断'(Line,_日付) :- atom_to_term(Line,_8桁の整数,_), '8桁の整数'(_8桁の整数), '8桁の整数から日付を得る'(_8桁の整数,_日付),!. '日付を指定して、の診断'(Line,_日付) :- writef('入力された %t からは日付が得られませんでした。再入力をお願いします\n',[Line]), fail. '8桁の整数'(_8桁の整数) :- integer(_8桁の整数), _8桁の整数 >= 10000000, _8桁の整数 =< 99999999. '8桁の整数から日付を得る'(_8桁の整数,_日付) :- swritef(_日付文字列,'%t',[_8桁の整数]), sub_atom(_日付文字列,0,4,_,_年), sub_atom(_日付文字列,4,2,_,_月), sub_atom(_日付文字列,6,2,_,_日), atomic_list_concat([_年,'-',_月,'-',_日],_日付),!. その日の商品別販売金額合計を(_日付,L1) :- findsetof(_id,( sales(_id,_item_id,_count,_total,_日付)), L), findall([_total,_id],( append(_,[_id|R],L), 商品の販売合計(_日付,_id,_合計金額)), L1). 商品の販売合計(_日付,_id,_合計金額) :- findsum(_total,( sales(_id,_item_id,_count,_total,_日付)), _合計金額). 大きい順に表示する(L1) :- 大きい順に(L1,L2), 表示する(L2). 大きい順に(L1,L2) :- sort(L1,L3), reverse(L3,L2). 表示する(_日付,[]). 表示する(_日付,[[_合計金額,_id]|R]) :- items(_id,_name,_price), writef('%t %t %20l %10r\n',[_日付,_id,_name,_合計金額]), 表示する(_日付,R). % 以下のサイトは 順に置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- {_文字列,_,_,_,_前文字列,_置換文字列,_後文字列,_,_,_}, 順に置換(_前文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列). 順に置換(_前文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- atomic_list_concat([_前文字列,_置換文字列,_後文字列],_置換された文字列). 順に置換(_前文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 順に置換(_後文字列,_置換対象文字列,_置換文字列,_置換された文字列_2), atomic_list_concat([_前文字列,_置換文字列,_置換された文字列_2],_置換された文字列). {_文字列,_開始位置,_文字列長,_残り文字列長,_前文字列,_目的文字列,_後文字列,_前文字列の文字ならび,_目的文字列の文字ならび,_後文字列の文字ならび} :- sub_atom(_文字列,_開始位置,_文字列長,_残り文字列長,_前文字列,_目的文字列,_後文字列,_前文字列の文字ならび,_目的文字列の文字ならび,_後文字列の文字ならび). % % sub_atom/10 % % 以下のサイトは # # 文字列を置換する。一度置換したものは元に戻ることはなく。 # 文字列を置換する(_残り文字列,_置換対象副文字列,_置換文字列,_置換された文字列) :- 置換対象副文字列の前後を取得する(_文字列,_置換対象副文字列,_前文字列,_残り文字列), atomic_list_concat([_文字列,_置換文字列,_残り文字列],_置換された文字列). 置換対象副文字列の前後を取得する(_文字列,_置換対象副文字列,_前文字列,_残り文字列) :- sub_atom(_文字列,_開始位置,_長さ,_残り文字数,_置換対象副文字列), sub_atom(_文字列,0,_開始位置,_,_前文字列), _残り文字列の開始位置 is _開始位置 + _長さ, sub_atom(_文字列,_残り文字列の開始位置,_残り文字数,_,_残り文字列). % % 置換対象副文字列の前後を取得する/4 の最後のカットを外した。 % % 以下のサイトは 文字列を順に置換する(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 文字列を置換対象文字列に対して前方文字列と後方文字列に分解する(_文字列,_置換対象文字列,_前方文字列,_後方文字列), 文字列置換を順に置換する(_前方文字列,_置換対象文字列,_後方文字列,_置換文字列,_置換された文字列). 文字列置換を順に置換する(_前方文字列,_置換対象文字列,_後方文字列,_置換文字列,_置換された文字列) :- atomic_list_concat([_前方文字列,_置換文字列,_後方文字列],_置換された文字列). 文字列置換を順に置換する(_前方文字列,_置換対象文字列,_後方文字列,_置換文字列,_置換された文字列) :- 文字列置換を順に置換する(_後方文字列,_置換対象文字列,_置換文字列,_置換された後方文字列), atomic_list_concat([_前方文字列,_置換文字列,_置換された後方文字列],_置換された文字列). 文字列を置換対象文字列に対して前方文字列と後方文字列に分解する(_文字列,_置換対象文字列,_前方文字列,_後方文字列) :- sub_atom(_文字列,_開始位置0オリジン,_,_残り長さ,_置換対象文字列), sub_atom(_文字列,0,_開始位置0オリジン,_前方文字列), sub_atom(_文字列,_,_残り長さ,0,_後方文字列),!. % 以下のサイトは # # 非決定性述語を目標とする時、その得られる解の内で最後の解だけを取得したい。 # # 適用例としては、 # 文字列置換を出現順に非決定性で置換する。つまり利用者は出現順に1-n個の # 置換を選択することができる。そういう述語が定義済みだとする。 # この述語を使って、全置換を求めるというような場合。 # 非決定性述語の最後の解(_非決定性述語,_解) :- findall(_解,_非決定性述語,_解ならび), last(_解ならび,_解). % % 非決定性述語の引数を構成する項の中に_解が含まれる必要がある。 % % 順に置換する述語例 % 全ての対象を置換する(_文字列,_置換対象副文字列,_置換文字列,_置換された文字列) :- 非決定性述語の最後の解(_置換された文字列,順に置換する(_文字列,_置換対象副文字列,_置換文字列,_置換された文字列),_置換された文字列). 順に置換する(_文字列,_置換対象副文字列,_置換文字列,_置換された文字列) :- 置換対象副文字列の前後を取得する(_文字列,_置換対象副文字列,_前文字列,_残り文字列), 順に置換する(_文字列,_置換対象副文字列,_置換文字列,_前文字列,_残り文字列,_置換された文字列). 順に置換する(_文字列,_置換対象副文字列,_置換文字列,_前文字列,_残り文字列,_置換された文字列) :- atomic_list_concat([_前文字列,_置換文字列,_残り文字列],_置換された文字列). 順に置換する(_文字列,_置換対象副文字列,_置換文字列,_前文字列,_残り文字列,_置換された文字列) :- 順に置換する(_残り文字列,_置換対象副文字列,_置換文字列,_置換された文字列_2), atomic_list_concat([_前文字列,_置換文字列,_置換された文字列_2],_置換された文字列). 置換対象副文字列の前後を取得する(_文字列,_置換対象副文字列,_前文字列,_残り文字列) :- sub_atom(_文字列,_開始位置0オリジン,_長さ,_残り文字数,_置換対象副文字列), sub_atom(_文字列,0,_開始位置0オリジン,_,_前文字列), _残り文字列の開始位置 is _開始位置0オリジン + _長さ, sub_atom(_文字列,_残り文字列の開始位置,_残り文字数,_,_残り文字列),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/745 # # ●正規表現の使用環境 # PCREライブラリを使用したアプリケーション # # ●検索か置換か? # 置換 # # ●説明 # HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索 # もし有れば対応する前方タグ内の後ろに@を付けたい # # ●対象データ # <AB><CD>nea##kv</CD>nk#eccu</AB> # nea<YY><EF>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK>#<CD>asiaev</CD>un##ima</KK> # # ●希望する結果 # <AB><CD@>nea##kv</CD>nk#eccu</AB> # nea<YY><EF@>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK@>#<CD>asiaev</CD>un##ima</KK> # % % ここでは、 % 非決定性の処理を考える。先頭から順に置換が進んでいくように。 % 注意するべきことは、普通に非決定性に書くと、既に置換したつもりの % 部分が変数の束縛が解かれて、置換前の状態にもどってしまうこと。 % この型の述語では常にその点に注意する。 % 'HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_文字列,_置換された文字列) :- タグとデータに分割する(_文字列,_タグとデータならび), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_タグとデータならび,_置換されたタグとデータならび), atomic_list_concat(_置換されたタグとデータならび,_置換された文字列). タグとデータに分割する(_文字列,[_前データ,_タグ|R]) :- データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列), タグとデータに分割する(_残り文字列,R),!. タグとデータに分割する(_文字列,[_文字列]). データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列) :- sub_atom(_文字列,S1,1,_,'<'), sub_atom(_文字列,0,S1,_,_前データ), sub_atom(_文字列,S2,1,_,'>'), Len is S2 - S1 + 1, sub_atom(_文字列,S1,Len,R,_タグ), sub_atom(_文字列,S2_2,R,0,_残り文字列),!. '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L1,L2) :- append(L0,[A,B|R],L1). タグである(A), '#が二つ以上ある'(B), sub_atom(A,_,_,2,A_1), atomic_list_concat([A_1,'@>',B],C), append(L0,[C,B|R1],L2), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L0,A,B,C,R,L2). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([A|R1],[A|R2]) :- '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,R2). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([],[]). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L0,A,B,C,R1,L2). append(L0,[C|R1],L2). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L0,A,B,C,R1,L2) :- '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,L2_1), append(L0,[C,B|L2_1],L2). タグである(A) :- sub_atom(A,0,1,_,<), sub_atom(A,_,1,0,>). '#が二つ以上ある'(B) :- count(sub_atom(B,_,1,_,'#'),Count), Count >= 2. % % count/2 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/745 # # ●正規表現の使用環境 # PCREライブラリを使用したアプリケーション # # ●検索か置換か? # 置換 # # ●説明 # HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索 # もし有れば対応する前方タグ内の後ろに@を付けたい # # ●対象データ # <AB><CD>nea##kv</CD>nk#eccu</AB> # nea<YY><EF>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK>#<CD>asiaev</CD>un##ima</KK> # # ●希望する結果 # <AB><CD@>nea##kv</CD>nk#eccu</AB> # nea<YY><EF@>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK@>#<CD>asiaev</CD>un##ima</KK> # # # 'HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_文字列,_置換された文字列) :- タグとデータに分割する(_文字列,_タグとデータならび), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_タグとデータならび,_置換されたタグとデータならび), atomic_list_concat(_置換されたタグとデータならび,_置換された文字列). タグとデータに分割する(_文字列,[_前データ,_タグ|R]) :- データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列), タグとデータに分割する(_残り文字列,R),!. タグとデータに分割する(_文字列,[_文字列]). データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列) :- sub_atom(_文字列,S1,1,_,'<'), sub_atom(_文字列,0,S1,_,_前データ), sub_atom(_文字列,S2,1,_,'>'), Len is S2 - S1 + 1, sub_atom(_文字列,S1,Len,R,_タグ), sub_atom(_文字列,S2_2,R,0,_残り文字列),!. '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([],[]) :- !. '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([A,B|R1],[A,C|R2]) :- タグである(A), '#が二つ以上ある'(B), sub_atom(A,_,_,2,A_1), atomic_list_concat([A_1,'@>'],C), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,R2),!. '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([A|R1],[A|R2]) :- '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,R2). タグである(A) :- sub_atom(A,0,1,_,<), sub_atom(A,_,1,0,>). '#が二つ以上ある'(B) :- count(sub_atom(B,_,1,_,'#'),Count), Count >= 2. % % count/2 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/741 # # ●正規表現の使用環境 # PCREライブラリを使用したアプリケーション # # ●検索か置換か? # 置換 # # ●説明 # 括弧内に特定の文字列が有れば対応する括弧を装飾したい # # (例ではCCCを含むものを検索し対応する括弧に*を加える) # # ●対象データ # (AACCCDDAABBB) # (AACAABBDBABC) # CDAA(DB(CC)C)(CDD) # C(AA(ABBD)(BCCC)C) # # ●希望する結果 # (*AACCCDDAABBB*) # (AACAABBDBABC) # CDAA(DB(CC)C)(CDD) # C(AA(ABBD)(*BCCC*)C) # # '括弧内に特定の文字列が有れば対応する括弧を装飾したい'(_文字列,_特定文字列,_置換された文字列) :- sPLIT(_文字列,['(',')',' '],L), findall(_置換された要素,( append(L0,[A|R],L), 要素文字列置換(A,_特定文字列,_置換された要素)), L), atomic_list_concat(L,_置換された文字列). 要素文字列置換(A,_特定文字列,_置換された要素) :- sub_atom(A,_,_,_,_特定文字列), atomic_list_concat(['*',A,'*'],_置換された要素),!. 要素文字列置換(A,_,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/638 # # mysql 5.5.10 # # table hogehoge # inputdate data1 data2 data3 # 2012-02-16 ssssss wwwww yyyyyy # 2012-02-17 xxxxxx xxxxx xxxxx # 2012-02-18 null aaaaa vvvvv # 2012-02-19 null null null # 2012-02-20 null null null # 2012-02-21 null null null # 2012-02-22 xxxxxx ccccc fffff # # とある時に、指定日の前日のデータが欲しい # 例でいうなら # data1について、 # 2012-02-17を指定することによって2012-02-16のssssssを、 # 2012-02-22の日付を指定して2012-02-17のxxxxxxが得られ # るようにしたいのですが。 # # よろしくお願いします # 指定日の前日のデータが欲しい(_指定日,_指定日の前日,_data1,_data2,_data3) :- 指定日の前日(_指定日,_指定日の前日), hogehoge(_指定日の前日,_data1,_data2,_data3). 指定日の前日(_指定日,_指定日の前日) :- 指定日から年取得(_指定日,_年), 指定日から月取得(_指定日,_月), 指定日から日取得(_指定日,_日), 指定日の前日(_年,_月,_日,_指定日の前日). 指定日の前日(_年,'01','01',_指定日の前日) :- 前年(_年,_前年), atomic_list_concat([_前年,-,'12',-,'31'],_指定日の前日),!. 指定日の前日(_年,_月,'01',_指定日の前日) :- member(_月,['05','07','08','10','12']), 前月(_月,_前月), atomic_list_concat([_年,-,_前月,-,'30'],_指定日の前日),!. 指定日の前日(_年,_月,'01',_指定日の前日) :- member(_月,['02','04','06','09','11']), 前月(_月,_前月), atomic_list_concat([_年,-,_前月,-,'31'],_指定日の前日),!. 指定日の前日(_年,'03','01',_指定日の前日) :- atom_to_term(_年,_年整数,_), うるう年(_年整数), atomic_list_concat([_年,-,'02',-,'29'],_指定日の前日),!. 指定日の前日(_年,'03','01',_指定日の前日) :- atom_to_term(_年,_年整数,_), \+(うるう年(_年整数)), atomic_list_concat([_年,-,'02',-,'28'],_指定日の前日),!. 指定日の前日(_年,_月,_日,_指定日の前日) :- 二桁日文字列の前日文字列(_日,_前日文字列), atomic_list_concat([_年,-,_月,-,_前日文字列],_指定日の前日). 指定日から年取得(_指定日,_年) :- sub_atom(_指定日,0,4,_,_年). 指定日から月取得(_指定日,_月) :- sub_atom(_指定日,5,2,_,_月). 指定日から日取得(_指定日,_日) :- sub_atom(_指定日,8,2,_,_日). 前年(_年,_前年) :- atom_to_term(_年,_年整数), _前年整数 is _年整数 - 1, swritef(_前年,'%t',[_前年整数]). 前月('12','11'). 前月('11','10'). 前月('10','09'). 前月('09','08'). 前月('08','07'). 前月('07','06'). 前月('06','05'). 前月('05','04'). 前月('04','03'). 前月('03','02'). 前月('02','01'). 二桁日文字列の前日文字列('31','30'). 二桁日文字列の前日文字列('30','29'). 二桁日文字列の前日文字列('29','28'). 二桁日文字列の前日文字列('28','27'). 二桁日文字列の前日文字列('27','26'). 二桁日文字列の前日文字列('26','25'). 二桁日文字列の前日文字列('25','24'). 二桁日文字列の前日文字列('24','23'). 二桁日文字列の前日文字列('23','22'). 二桁日文字列の前日文字列('22','21'). 二桁日文字列の前日文字列('21','20'). 二桁日文字列の前日文字列('20','19'). 二桁日文字列の前日文字列('19','18'). 二桁日文字列の前日文字列('18','17'). 二桁日文字列の前日文字列('17','16'). 二桁日文字列の前日文字列('16','15'). 二桁日文字列の前日文字列('15','14'). 二桁日文字列の前日文字列('14','13'). 二桁日文字列の前日文字列('13','12'). 二桁日文字列の前日文字列('12','11'). 二桁日文字列の前日文字列('11','10'). 二桁日文字列の前日文字列('10','09'). 二桁日文字列の前日文字列('09','08'). 二桁日文字列の前日文字列('08','07'). 二桁日文字列の前日文字列('07','06'). 二桁日文字列の前日文字列('06','05'). 二桁日文字列の前日文字列('05','04'). 二桁日文字列の前日文字列('04','03'). 二桁日文字列の前日文字列('03','02'). 二桁日文字列の前日文字列('02','01'). うるう年(_年) :- 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/1328276597/770 # # 1番目:1から20までの整数を入力してください:7 # 2番目:2から20までの整数を入力してください:11 # 3番目:2から20までの整数を入力してください:12 # 4番目:13から20までの整数を入力してください:20 # もういちど最初からやり直してください。 # 1番目:1から20までの整数を入力してください:7 # 2番目:8から20までの整数を入力してください:11 # 3番目:12から20までの整数を入力してください:1 # 3番目:12から20までの整数を入力してください:12 # 4番目:13から20までの整数を入力してください:17 # 5番目:18から20までの整数を入力してください:19 # 7 11 12 17 19 # % % この問題には以下の質問をぶつけてあります。 % >>770 % 二行目、三行目の範囲下限が何故2なのかわからない。8,12ではないのか? '1から範囲を狭めながら19までの数列を得て表示する' :- '1から範囲を狭めながら19までの数列を得る'(1,1,_1から19までの数列), '1から19までの数列を表示する'(_1から19までの数列),!. '1から範囲を狭めながら19までの数列を得る'(_,20,[]). '1から範囲を狭めながら19までの数列を得る'(N,_から,[X|R]) :- '20までの数値入力'(N,_から,X), _から_2 is _から + 1, N_2 is N + 1, '1から範囲を狭めながら19までの数列を得る'(N_2,_から_2,R). '1から範囲を狭めながら19までの数列を得る'(_,_,L) :- もういちど最初からやりなおす(L). もういちど最初からやりなおす(L) :- write('もういちど最初からやり直してください。\n'), '1から範囲を狭めながら19までの数列を得る'(1,1,L). '20までの整数入力'(N,_から,X) :- writef('%t番目:%tから20までの整数を入力してください:',[N,_から]), '20までの整数入力'(_から,X),!. '20までの整数入力'(N,_から,X) :- '20までの整数入力'(N,_から,X). '20までの整数入力'(_から,X) :- get_line(Line), '20までの整数入力診断'(Line,_から,X). '20までの整数入力診断'(Line,_から,X) :- atom_to_term(Line,X,_), integer(X), X >= _から, X < 20. '1から19までの数列を表示する'(L) :- concat_atom(L,' ',_表示文字列), writef('%t\n',[_表示文字列]). % % get_line/1 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1331904826/120 # # コマンドプロンプトにてワイルドカードで複数マッチングしてそれぞれ別のsetを置きたいんですけど # うまく行きません。 # for %%A in ("%folder%~n1*.txt") do ( # set tatoeba1=%%A # set tatoeba2=%%A # ) # こういう形まで考えたんですが結局最後のマッチングにsetされます。 # どのような形が正解なのでしょうか? # # 順に置換対象が現れる度に置換ならびから順に取り出して書き換える(_文字列,_置換対象,[_置換要素|R],_置換された文字列) :- 置換対象に合致したら(_文字列,_置換対象,S1,S3), 順に置換対象が現れる度に置換ならびから順に取り出して書き換える(S3,_置換対象,R,_置換された文字列_2), concat_atom([S1,_置換要素,_置換された文字列_2],_置換された文字列),!. 順に置換対象が現れる度に置換ならびから順に取り出して書き換える(_文字列,_,_,_文字列). 置換対象に合致したら(_文字列,_置換対象,S1,S3) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 置換対象と合致(S2,_置換対象). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/695 # # Objective-CのNSRegularExpressionで、 # 行頭の半角スペース列を置換しようとして@"^ +"と書いたのですが、文字列の最初しか行頭と認識してくれないらしく、 # 複数行にまたがる文字列の各行頭のスペースが置換できないので、改行文字に続く次のスペースも検出しようとして # @"^ +|\\n +" # と書くと、改行文字も含めて置換してしまうため、マッチ部分をキャプチャする()を使って # @"^( +)|\\n( +)" # としたのですが、 # (2147483647,0)という文字列の外の範囲がマッチされてしまい、置換しようとしてエラーとなってしまいます。 # 文字列途中も含めて、行頭の半角スペース列のみを置換するためにはどのようなパターンを使うのが適切でしょうか? # # '文字列途中も含めて、行頭の半角スペース列のみを置換する'(_改行を含む文字列,_置換文字列,_置換された改行を含む文字列) :- 行頭の半角スペース列のならび(_改行を含む文字列,_前文字列,_行頭の空白ならび,_後文字列), '文字列途中も含めて、行頭の半角スペース列のみを置換する'(_後文字列,_置換文字列,_置換された改行を含む文字列_2), concat_atom([前文字列,'\n',_置換文字列,_置換された改行を含む文字列_2],_置換された改行を含む文字列),!. '文字列途中も含めて、行頭の半角スペース列のみを置換する'(_文字列,_,_文字列). 行頭の半角スペース列のならび(_改行を含む文字列,_前文字列,_行頭の空白ならび,_後文字列) :- sub_atom(_改行を含む文字列,_,_,_,_前文字列,S2,_後文字列,L1,['\n'|R2],L3), \+(R2=[]), all(R2,' '), \+((L3=[A|R3],A=' ')). % sub_atom/10 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/689 # # <que name="" mail="" vpos="-45400">/publish lv80605616_t2B_SHD_7@s35841 /content/20120319/lv80605616_214226439000_1_8370f8.f4v</que> # この文字列から # # /content/20120319/lv80605616_214226439000_1_8370f8.f4v # # # 数字とかは毎回変わるんだけど # # '<que name="" mail="" vpos="-45400">/publish lv80605616_t2B_SHD_7@s35841 /content/20120319/lv80605616_214226439000_1_8370f8.f4v</que>の部分を抜き出すにはどうすればいい?数字とかは毎回変わるんだけど'(_文字列,_前文字列,_適合文字列,_後文字列) :- sPLIT(_文字列,[' ',''],L), append(L1,[' ',_適合文字列,''|R],L), concat_atom(L1,S1), concat_atom([S1,' '],_前文字列), concat_atom(['% 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/557 # # 初めて書き込みます。よろしくお願い致します。固定長バイトの文字列の中の一部を抜き出すところがわかりませんでした。 # 1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 文字列A(固定長150バイト)一万行以上と文字列B(CSV)一万行以上の # それぞれのテキストデータ・ファイルがある。 # 文字列A の5文字目から6文字分と文字列Bの2カラム目の4文字目から6文字分を # 比較し、 # 同じなら、文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を # 置き換える。 # 文字列Bの4カラム目が50バイト以下なら " "空白で埋める。 # 50バイトより大きい場合50バイトまでの大きさを対象とする。 # # 置き換え対象領域は日本語全角漢字含む文字列となる。 # 文字列Aの対象領域は2バイトx20文字+1バイト10文字で整形されている。 # 文字列AはSolaris10上のファイル。文字列BはエクセルファイルをCSV保存してFFFTPでSolaris10へコピーしたもの。 # 文字コード:文字列A(EUC-JP)、文字列B(sjis2eucで変換) # # 1ー77バイトが1バイト、77ー126が変換対象。126ー150が1バイトです。 '文字列A(固定長150バイト)一万行以上と文字列B(CSV)一万行以上のそれぞれのテキストデータ・ファイルがある。' :- get_lines('文字列A',Lines1), get_lines('文字列B',Lines2), '文字列Aの全行を置換する'(Lines1,Lines2,Lines3), 'Lines3を文字列Aに書き戻す'(Lines3,_文字列A),!. '文字列Aの全行を置換する'([],_,[]) :- !. '文字列Aの全行を置換する'([_文字列A|R1],Lines2,[_置換した文字列|R3]) :- 'Lines2を検索して文字列Aを置換する'(_文字列A,Lines2,_置換した文字列), '文字列Aの全行を置換する'(R1,Lines2,R3). 'Lines2を検索して文字列Aを置換する'(_文字列A,[],_文字列A) :- !. 'Lines2を検索して文字列Aを置換する'(_文字列A,[_文字列B|R2],_置換した文字列) :- '文字列Aを一行の置換'(_文字列A,_文字列B,_置換した文字列),!. 'Lines2を検索して文字列Aを置換する'(_文字列A,[_|R2],_置換した文字列) :- 'Lines2を検索して文字列Aを置換する'(_文字列A,R2,_置換した文字列),!. '文字列Aを一行の置換'(_文字列A,_文字列B,_置換した文字列) :- split(_文字列B,[' ',','],L), '文字列A の5文字目から6文字分と文字列Bの2カラム目の4文字目から6文字分を比較し同じなら'(_文字列A,L), '文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を置き換える'(_文字列A,L,_置換された文字列). '文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を置き換える'(_文字列A,L,_置換された文字列) :- sub_byte_atom(_文字列A,0,76,_,S1), sub_byte_atom(_文字列A,126,_,0,S3), '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2), concat_atom([S1,S2,S3],_置換された文字列),!. '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2) :- '文字列Bの4カラム目が'(L,S2_1), '50バイト以下なら'(S2_1), '" "空白で埋める'(S2_1,S2),!. '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2) :- nth1(4,L,S_1), sub_byte_atom(S_1,0,50,_,S2). '文字列Bの4カラム目が50バイト以下なら'(L) :- nth1(4,L,S_1), atom_byte_length(S_1,_長さ), _長さ =< 50,!. '" "空白で埋める'(S2_1,S2) :- length(L2,50), atom_byte_codes(S2_1,L_1), append(L_1,_,L2), 変数を空白に置換(L2), atom_byte_codes(S2,L2),!. 変数を空白に置換([]). 変数を空白に置換([' '|R]) :- 変数を空白に置換(R),!. 変数を空白に置換([A|R]) :- 変数を空白に置換(R). 'Lines3を文字列Aに書き戻す'(Lines3) :- put_lines('文字列A',Lines3). atom_byte_codes(Atom,ByteCodes) :- atom(Atom), atom_codes(Atom,Codes), バイトに分解(Codes,ByteCodes),!. atom_byte_codes(Atom,ByteCodes) :- \+(atom(Atom)), 'ByteCodes2Codes'(ByteCodes,Codes), atom_codes(Atom,Codes),!. 'ByteCodes2Codes'([],[]). 'ByteCodes2Codes'([A,B|R1],[C|R2]) :- A > 127, B > 127, C is 256 * A + B, 'ByteCodes2Codes'(R1,R2),!. 'ByteCodes2Codes'(R1,R2) :- 'ByteCodes2Codes'(R1,R2),!. atom_byte_length(Atom,ByteLength) :- atom_codes(_文字列,Codes), バイトに分解(Codes,ByteCodes), length(ByteCodes). atom_byte_codes(Atom,ByteCodes) :- atom_codes(Atom,Codes), バイトに分解(Code,ByteCodes). sub_byte_atom(_文字列,_スタートバイト位置,_バイト数,_残りバイト,_副文字列) :- atom_codes(_文字列,Codes), バイトに分解(Codes,ByteCodes), sub_byte_list(ByteCodes,_スタートバイト位置,_バイト数,_残りバイト,SubList), atom_code(_副文字列,SubList). sub_byte_list(ByteCodes,_スタートバイト位置,_バイト数,_残りバイト,SubList) :- length(L0,_スタートバイト位置), length(L1,_バイト数), append(L0,SubList,L2,ByteCodes), length(L2,_残りバイト),!. バイトに分解([],[]). バイトに分解([A|R1],[B,C|R2]) :- A > 255, B is A // 256, C is A mod 256, バイトに分解(R1,R2),!. バイトに分解([A|R1],[A|R2]) :- バイトに分解(R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/671 # # sedです # # foo # bar # *piyo # *hoge # *zieg # kero # piyo # のような文章があるとして、先頭にアスタリスクがついている部分を別記号で囲みたいです。 # foo # bar # [ # *piyo # *hoge # *zieg # ] # kero # piyo # # sedのスクリプトファイルで書いているのですが複数行にまたがるマッチングをこなしてくれません # どうか御教示願います。 # # '先頭にアスタリスクがついている部分を別記号で囲みたい'(_文字列,_置換された文字列) :- 'リスト要素の先頭にアスタリスクがついている部分を別記号で囲みたい'(L,L5). append(L5,['\n'],L6), concat_atom(L5,'\n',_置換された文字列_0), concat_atom([_置換された文字列_0,'\n'],_置換された文字列),!. '先頭にアスタリスクがついている部分を別記号で囲みたい'(_文字列,_文字列). 'リスト要素の先頭にアスタリスクがついている部分を別記号で囲みたい'(L,X) :- append(L1,L2,L3,L), '先頭にアスタリスクがついている部分'(L1,L2,L3), 'リスト要素の先頭にアスタリスクがついている部分を別記号で囲みたい'(L3,L4), append(L1,['[\n'|L2],[']\n'|L4],X),!. 'リスト要素の先頭にアスタリスクがついている部分を別記号で囲みたい'(L,L). '先頭にアスタリスクがついている部分'(L1,L2,L3) :- \+((last(L1,A),sub_atom(A,0,1,_,'*'))), \+((L3 = [B|_],sub_atom(B,0,1,_,'*'))), '全ての要素の先頭文字が*'(L2). '全ての要素の先頭文字が*'([]). '全ての要素の先頭文字が*'([A|R]) :- sub_atom(A,0,1,_,'*'), '全ての要素の先頭文字が*'(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/671 # # sedです # # foo # bar # *piyo # *hoge # *zieg # kero # piyo # のような文章があるとして、先頭にアスタリスクがついている部分を別記号で囲みたいです。 # foo # bar # [ # *piyo # *hoge # *zieg # ] # kero # piyo # # sedのスクリプトファイルで書いているのですが複数行にまたがるマッチングをこなしてくれません # どうか御教示願います。 # # '先頭にアスタリスクがついている部分を別記号で囲みたい'(_文字列,_置換された文字列) :- sPLIT(_文字列,['\n'],L), '先頭にアスタリスクがついている部分を別記号で囲みたい'(L,L2), concat_atom(L2,_置換された文字列). '先頭にアスタリスクがついている部分を別記号で囲みたい'([],[]). '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n'],['\n']) :- !. '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n',A|R1],['[','\n',A|R2]) :- sub_atom(A,0,1,_,'*'), '先頭にアスタリスクがついている部分'(R1,R2),!. '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n',A|R1],['\n',A|R2]) :- '先頭にアスタリスクがついている部分を別記号で囲みたい'(R1,R2). '先頭にアスタリスクがついている部分'([],[']','\n']). '先頭にアスタリスクがついている部分'(['\n'],[']','\n']) :- !. '先頭にアスタリスクがついている部分'(['\n',A|R1],['\n',A|R2]) :- sub_atom(A,0,1,_,'*'), '先頭にアスタリスクがついている部分'(R1,R2),!. '先頭にアスタリスクがついている部分'(['\n',A|R1],['\n',']','\n',A|R2]) :- '先頭にアスタリスクがついている部分を別記号で囲みたい'(R1,R2),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/671 # # sedです # # foo # bar # *piyo # *hoge # *zieg # kero # piyo # のような文章があるとして、先頭にアスタリスクがついている部分を別記号で囲みたいです。 # foo # bar # [ # *piyo # *hoge # *zieg # ] # kero # piyo # # sedのスクリプトファイルで書いているのですが複数行にまたがるマッチングをこなしてくれません # どうか御教示願います。 # # '先頭にアスタリスクがついている部分を別記号で囲みたい'(_文字列,_置換された文字列) :- sPLIT(_文字列,['\n'],L), '先頭にアスタリスクがついている部分を別記号で囲みたい'(L,L2), concat_atom(L2,_置換された文字列). '先頭にアスタリスクがついている部分を別記号で囲みたい'([],[]). '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n'],['\n']) :- !. '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n',A|R1],L) :- sub_atom(A,0,1,_,'*'), '先頭にアスタリスクがついている部分'(['\n',A|R1],L1,R1_1), '先頭にアスタリスクがついている部分を別記号で囲みたい'(R1_1,R2), append(L1,R2,L),!. '先頭にアスタリスクがついている部分を別記号で囲みたい'(['\n',A|R1],['\n',A|R2]) :- '先頭にアスタリスクがついている部分を別記号で囲みたい'(R1,R2). '先頭にアスタリスクがついている部分'(['\n',A|R1],['\n',A|R2],R) :- sub_atom(A,0,1,_,'*'), '先頭にアスタリスクがついている部分'(R1,R2,R),!. '先頭にアスタリスクがついている部分'(L,['\n',']'],L). % 以下のサイトは % % fizzbuzzの定義。実務の中で出てきたらきっとこう書くだろう。 % 組込述語を多用しているから、試験問題の解答としては不適だろう。 % 問題の中に 15 という数字が出てこないなら、これを使うべきではないと思う。 % fizzbuzz(N,X) :- M1 is N mod 3, M2 is N mod 5, fizzbuzz(N,M1,M2,X). fizzbuzz(_,0,0,fizzbuzz) :- !. fizzbuzz(_,0,_,fizz) :- !. fizzbuzz(_,_,0,buzz) :- !. fizzbuzz(N,_,_,N). fb(N) :- fb(N,L), concat_atom(L,' ',S), writef('%t\n',[S]). fb(N,L) :- findall(X,( for(1,N1,N), fizzbuzz(N1,X)), L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/646 # # 質問です # # phpのpreg_replaceで文字列を入れ替えたいのですが # # <a href="mailto:example@example.com">問い合せ</a> # # のexample@example.comのみを入れ替えるにはどのような正規表現を使えば出来るでしょうか? # # よろしくお願いします # 'example@example.comのみを入れ替える'(_文字列,_入れ替える文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), メールアドレス部分(S2,L2), 'example@example.comのみを入れ替える'(S3,_入れ替える文字列,_置換されたS3), concat_atom([S1,'"mailto:',_入れ替える文字列,'"',_置換されたS3],_置換された文字列),!. 'example@example.comのみを入れ替える'(_文字列,_,_文字列). メールアドレス部分(S2,L2) :- L2 = ['"',m,a,i,l,t,o,:|R2], append(L2_1,['"'],R2), \+(member('"',L2_1)), atom_chars(S2_2,R2), メールアドレスとして可能な文字文字列(S2_2),!. メールアドレスとして可能な文字列(_文字列) :- split(_文字列,['@'],[A,B]), メールに使用できるアルファベット(A), メールに使用できるアルファベット(B). メールに使用できるアルファベット(_文字) :- char_code(_文字,_文字コード), メールに使用できる文字コード(_文字コード),!. メールに使用できるアルファベット(_文字) :- member(_文字,['_','-','~']). メールに使用できる文字コード(_文字コード) :- _文字コード >= 65, _文字コード =< 90,!. メールに使用できる文字コード(_文字コード) :- _文字コード >= 97, _文字コード =< 122,!. メールに使用できる文字コード(_文字コード) :- _文字コード >= 48, _文字コード =< 57,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/908 # # 【 課題 】ttp://www.dotup.org/uploda/www.dotup.org2712711.txt.html # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】3/8 0:00 # 【 Ver  】java version "1.7.0_02-ea" # 【 補足 】3/8が提出期限なので、それまでにどうかお願いいたします。 # # # 専門学校での課題です。 # 課題1については自力でできたのですが、ところどころわからないので、課題1から3をお願いします # # # # 課題1. # 以下の仕様に従ってクラスを作った後、長方形グラフ、三角グラフ、放物線グラフの逆さと幅を設定し、グラフを描くプログラムを作りなさい。プロジェクト名は「kadai1」、mainを持つクラス名は「GraphTest」とする。 # # ・クラス1からクラス3まで全てのクラスを実装すること。 # ・全てのクラスは、カプセル化を行い、フィールドは完全に隠蔽すること。ただし、サブクラスは親クラスのフィールドは見えてもいいとする。 # ・自分自身のフィールドを設定できるコンストラクタも作ること。 # ・三角クラス及び放物線クラスは長方形クラスから継承すること。 # ・"グラフを描く"メソッドはオーバーライドを使うこと。 # # なお、グラフは*(半角)を用いて以下のようなものをテキストで描くとする。 # # 長方形 高さ5 幅4の場合 # **** # **** # **** # **** # **** # # 三角 高さ5 幅4の場合 # 幅優先で描かれて幅が0の状態(*がない状態)から1つずつ増える、高さは無視 # # * # ** # *** # **** # # 放物線 高さ5 幅4の場合 # 幅優先で描かれて幅が4の状態から1つずつ減った後、0まで行ったところでまた高さまで1ずつ増えていく、幅は無視 # **** # *** # ** # * # # * # ** # *** # **** # # クラス1 # (クラス名) # 長方形グラフ # # (フィールド) # 高さ # 幅 # # (メソッド) # 高さの設定をする # 幅の設定をする # グラフを描く # # クラス2 # (クラス名) # 三角グラフ # # (メソッド) # グラフを描く # # クラス3 # (クラス名) # 放物線グラフ # # (メソッド) # グラフを描く # # '長方形グラフ、三角グラフ、放物線グラフの逆さと幅を設定し、グラフを描く' :- 長方形(5,4), 三角形グラフ(4), 放物線グラフ(4). 長方形(_高さ,_幅) :- 幅分の星文字列(_幅,_星文字列), for(1,_行,_高さ), writef('%t\n',[_星文字列]), _行 = _高さ. 幅分の星文字列(_幅,_星文字列) :- length(L,_幅), all(L,'*'), concat_atom(L,S). 三角グラフ(_幅) :- 部分三角グラフ(_幅,L,L0,_星文字列), L = L0 部分三角グラフ(_幅,L,L0) :- length(L,_幅), append(L0,_,L), length(L0,_行の幅), 幅分の星文字列(_行の幅,_星文字列), writef('%t\n',[_星文字列]). 倒置した三角グラフ(_幅) :- 倒置した部分三角グラフ(_幅,L,L1,_星文字列), L1 = []. 倒置した部分三角グラフ(_幅,L,L1) :- length(L,_幅), append(_,L1,L), length(L1,_行の幅), 幅分の星文字列(_行の幅,_星文字列), writef('%t\n',[_星文字列]). 放物線グラフ(_高さ) :- _幅 is _高さ - 1, 倒置した部分三角グラフ(_幅,L,L1), L1 = [_], 部分三角グラフ(_幅,L,L0), L = L0. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/489 # # [1] 授業単元:C言語演習 # [2] 問題文: # キーボードで入力された名前をchar型の一次元の配列nameに入れていきます。 # 各名前の先頭アドレスをp_nameに入れます。 # p_nameのアドレスをptrptrに入れます。 # 最後に一番長い名前と一番短い名前、変数ptrptr、p_name、nameのアドレスを表示します。 # 実行例: # 名前を10個まで入力できます。桁数は最大30です。 # name1: tanaka # name2: nakabayashi # name3: hama #    ・ #    ・ # 一番長いのは"nakabayashi"で、11桁。 # 一番短いのは"hama"で、4桁。 # Adress of name: 231191 Adress of p_name: 231511 Adress of ptrptr: 231551 # # 'キーボードで入力された名前をならび_nameに入れていきます。一番長い名前と一番短い名前を表示します。' :- キーボードで入力されたならび_nameに入れていきます(_name), 一番長い名前と一番短い名前を表示します(_name). 一番長い名前と一番短い名前を表示します(_name) :- 一番長い名前(_name,_一番長い名前ならび), 一番短い名前(_name,_一番短い名前ならび), 表示します(_一番長い名前ならび,_一番短い名前ならび). 一番長い名前(_name,_一番長い名前ならび) :- findmax(_名前の長さ,( member(_名前,_name), sub_atom(_名前,0,_名前の長さ,0,_名前)), _一番長い長さ), findall(_名前,( member(_名前,_name), sub_atom(_名前,0,_一番長い長さ,_名前)), 一番長い名前ならび). 一番短い名前(_name,_一番短い名前ならび) :- findmin(_名前の長さ,( member(_名前,_name), sub_atom(_名前,0,_名前の長さ,0,_名前)), _一番短い長さ), findall(_名前,( member(_名前,_name), sub_atom(_名前,0,_一番短い長さ,_名前)), 一番短い名前ならび). 表示します(_一番長い名前ならび,_一番短い名前ならび) :- concat_atom(_一番長い名前ならび,' , ',_一番長い名前表示), writef('一番長い名前は %t です。\n',[_一番長い名前表示]), concat_atom(_一番短い名前ならび,' , ',_一番短い名前表示), writef('一番短い名前は %t です。\n',[_一番短い名前表示]). キーボードで入力された名前をならび_nameに入れていきます(_name) :- findall(_名前,( 名前を入力(_名前,_終了状態), ( _終了状態=終了,!,fail; true)), _name). 名前を入力(_名前,_終了状態) :- append(L0,_,_), length([_|L0],Nth), writef('名前[%t]: ',[Nth]), get_line(Line), 名前入力検査(Line,_名前,_終了状態). 名前入力検査('',_,終了) :- !. 名前入力検査(end_of_file,_,終了) :- !. 名前入力検査(名前,_名前,正常). % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/606 # # 問い合せフォームから来たメールアドレスを正規表現を用いて抽出したいのですが # 秀丸メールを使っておりメール全文をテキスト化したものの中に以下の文章が含まれています # # ▼メールアドレス # aaaaaaaaaa@aaaaaaaaa.com # # ▼メールアドレスという文字列の下にある行だけを検索することは可能でしょうか? # # メールアドレスにマッチする正規表現を使用するとヘッダー内のよくわからないアドレスまで抽出されてしまい # とても面倒くさいのでどうにか文章の下にある行のみを抽出という手段を取りたいのです # # どうか解決策をご教授ください # '▼メールアドレスという文字列の下にある行だけを検索する'(_文字列,_前文字列,_下にある行,_後文字列,_メールアドレスならび) :- sPLIT(_文字列,['\n'],L), '▼メールアドレスという文字列の下にある行'(L,_前文字列,_下にある行,_後文字列), メールアドレスを検索(_下にある行,_メールアドレスならび). '▼メールアドレスという文字列の下にある行'(L,_前文字列,_下にある行,_後文字列) :- append(L0,[A,'\n',_下にある行,'\n'|R],L), sub_atom(A,_,8,_,'▼メールアドレス'), concat_atom(L0,S1), concat_atom([S1,A,'\n'],_前文字列), concat_atom(R,_後文字列). メールアドレスを検索(_行,_メールアドレスならび) :- findall(S2,( sub_atom(_行,_,_,_,S1,S2,S3,L1,L2,L3), メールアドレス形式(S2), 前後がアルファベットでない(S1,S3)), _メールアドレスならび). メールアドレス形式(S) :- split(S2,['@'],[U1,U2]), アルファベット(A), アルファベット(B). 前後がアルファベットでない(S1,S3) :- \+((last(S1,A),アルファベット(A))), \+((sub_atom(S3,0,1,_,B),アルファベット(B))). アルファベット('-') :- !. アルファベット('_') :- !. アルファベット('~') :- !. アルファベット(A) :- A @>= '0', A @=< '9',!. アルファベット(A) :- A @>= 'A', A @=< 'Z',!. アルファベット(A) :- A @>= 'a', A @=< 'z',!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/595 # # ●正規表現の使用環境 # C# # # ●検索か置換か? # 置換 # # ●説明 # りんご=20 以外を削除したい # # ●対象データ # みかん10 りんご20 バナナ30 # いちご40 めろん20 りんご20 # # ●希望する結果 # りんご20 # りんご20 # # よろしくお願いします # # 検索文字列(りんご20). 'りんご=20 以外を削除したい'(_文字列,_部分削除された文字列) :- findall(_検索文字列,( 検索文字列(_検索文字列)), _検索文字列ならび), 検索文字列と改行だけを切り出す(_文字列,_検索文字列ならび,L1), ならびを整形する(L1,L2), concat_atom(L2,_部分削除された文字列). 検索文字列と改行だけを切り出す(_文字列,_検索文字列ならび,L) :- sPLIT(_文字列,['\n'|_検索文字列ならび],L1), findall(_検索文字列,( member(_検索文字列,L1), member(_検索文字列,_検索文字列ならび)), L). ならびを整形する([],[]). ならびを整形する([A],[A]) :- \+(A = '\n'),!. ならびを整形する(['\n'|R1],R2) :- ならびを整形する(R1,R2),!. ならびを整形する([A,'\n'|R1],[A,'\n'|R2]) :- ならびを整形する(R1,R2),!. ならびを整形する([A,B|R1],[A,' '|R2]) :- ならびを整形する([B|R1],R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/595 # # ●正規表現の使用環境 # C# # # ●検索か置換か? # 置換 # # ●説明 # りんご=20 以外を削除したい # # ●対象データ # みかん10 りんご20 バナナ30 # いちご40 めろん20 りんご20 # # ●希望する結果 # りんご20 # りんご20 # # よろしくお願いします # # 'りんご=20 以外を削除したい'(_文字列,_部分削除された文字列) :- sPLIT(_文字列,[' ','\n'],L), findall(A,( member(A,L), 置換(A)), L1), 部分削除文字列に変換(L1,_部分削除された文字列). 置換('りんご20'). 置換('\n'). 部分削除文字列に変換(L1,_部分削除された文字列) :- ならびを整形する(L1,L2), concat_atom(L2,_部分削除された文字列). ならびを整形する([],[]). ならびを整形する([A],[A]) :- \+(A = '\n'),!. ならびを整形する(['\n'|R1],R2) :- ならびを整形する(R1,R2),!. ならびを整形する([A,'\n'|R1],[A,'\n'|R2]) :- ならびを整形する(R1,R2),!. ならびを整形する([A,B|R1],[A,' '|R2]) :- ならびを整形する([B|R1],R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/309 # # 1から5の間の自然数を10個入力する。このとき入力された数の個数を棒グラフで次のように表示させる。 # 例: 1の入力が4回、2では2回、3では3回、4では0回、5では1回の場合 # * # * * # * * * # * * * * # 1 2 3 4 5 # という感じです。全くできないので助けてください # '1から5の間の自然数を10個入力する。このとき入力された数の個数を棒グラフで次のように表示させる' :- '1から5の間の自然数を10個入力する'(L), 横方向棒グラフを作る(L,LL1), 転置(LL1,LL2), 棒グラフ表示(LL2). '1から5の間の自然数を10個入力する'(L) :- length(L,10), findall(N,( append(L0,[N|_],L), '1から5の間の自然数を'(L0,N)), L). '1から5の間の自然数を'(L0,_自然数分の星ならび) :- length([_|L0],M), concat_atom([M,'1から5の間の自然数([',M,'/10] : '],_催促文), '1から5の間の自然数を'(_催促文,M,N),!. '1から5の間の自然数を'(_催促文,M,N) :- writef('%t',[_催促文]), get_line(Line), '1から5の間の自然数入力診断'(Line,N),!. '1から5の間の自然数を'(_催促文,M,N) :- '1から5の間の自然数を'(_催促文,M,N). '1から5の間の自然数入力診断'(Line,N) :- atom_to_term(Line,N,_), integer(N), N >= 1, N =< 5,!. '1から5の間の自然数入力診断'(Line,N) :- writef('入力された%tからは1から5の間の自然数が得られません\n',[Line]), fail. 横方向棒グラフを作る([],[]). 横方向棒グラフを作る([N|R1],[L|R2]) :- length(L,5), length(L1,N), all(L1,'*'), append(L0,L1,L), all(L0,' '), 横方向棒グラフを作る(R1,R2). 棒グラフ表示(LL) :- append(_,[L|R],LL), concat_atom(L,' ',_行表示文字列), writef('%t\n',[_行表示文字列]), R = [], write('1 2 3 4 5\n'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/306 # # [1] 授業単元:C # [2] n個の数の総和 # n個の数の総和を求める。総和が限界数を超えた時には計算を打ち切り、その時の総和を表示する。 # 総和の限界(1000). 'n個の数の総和を求め表示する。総和が限界数を超えた時には計算を打ち切り、その時の総和を表示する' :- 'n個の数'(_n,L), 総和の限界(_総和の限界), 総和を求める。総和が限界数を超えた時には計算を打ち切る'(L,_総和の限界,_加算対象数値ならび,_総和), 総和を表示する(_加算対象数値ならび,_総和,_総和の限界). 'n個の数'(_n,L) :- length(L,_n), findall(N,( m個目の数(L,N)), L). m個目の数(L,N) :- append(L0,[N|_],L), length([_|L0],_m個目), swritef(_催促,'%t/%t個目の数字 : ',[_m個目,_n]), 催促付き整数入力(_催促,N). 催促付き整数入力(_催促,N) :- writef('%t : ',[_催促]), get_line(Line), 整数入力検査(Line,N),!. 催促付き整数入力(_催促,N) :- get_integer(_催促,N). 整数入力検査(Line,N) :- atom_to_term(Line,N,_), integer(N),!. 整数入力検査(Line,N) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '総和を求める。総和が限界数を超えた時には計算を打ち切る'(L,_総和の限界,_加算対象数値ならび,_総和) :- '総和を求める。総和が限界数を超えた時には計算を打ち切る'(L,_総和の限界,_加算対象数値ならび,0,_総和). '総和を求める。総和が限界数を超えた時には計算を打ち切る'([],_総和の限界,[],_総和,_総和). '総和を求める。総和が限界数を超えた時には計算を打ち切る'(_,_総和の限界,[],_総和,_総和) :- _総和 > _総和の限界,!. '総和を求める。総和が限界数を超えた時には計算を打ち切る'([N|R1],_総和の限界,[N|R2],_総和1,_総和) :- _総和2 is _総和1 + N, '総和を求める。総和が限界数を超えた時には計算を打ち切る'(R1,_総和の限界,R2,_総和2,_総和). 総和を表示する(_加算対象数値ならび,_総和,_総和の限界) :- _総和 > _総和の限界, concat_atom(_加算対象数値ならび,'+',_加算対象項文字列), writef('(総和の限界=%t) %t=%t\n',[_総和の限界,_加算対象項文字列,_総和]),!. 総和を表示する(_加算対象数値ならび,_総和,_総和の限界) :- concat_atom(_加算対象数値ならび,'+',_加算対象項文字列), writef('%t=%t\n',[_加算対象項文字列_総和]),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328439334/383 # # すいません質問なんですが、一行ごとに文字の表示が増えるプログラムを作る場合はfor文を3重にするのでしょうか? # なんか違う様な気がするのですが、2重だといまいち組み方がわかりません ご教授お願いします # # ABC # ABC ABC # ABC ABC ABC # こんなかんじです # # 一行ごとに表示要素数が増える :- 一行ごとに表示要素数が増える('ABC',' ',5). 一行ごとに表示要素数が増える(_表示要素,_区切り要素,_最大表示回数) :- length(L,_最大表示回数), all(L0,_表示要素), 一行ずつ要素を増やしながら行表示(L,_区切り要素). 一行ずつ要素を増やしながら行表示(L,_区切り要素) :- append(L0,_,L), 要素ならびを行表示(L0,_区切り要素), L0 = L. 要素ならびを行表示([],_) :- !. 要素ならびを行表示(L0,_区切り要素) :- concat_atom(L0,_区切り要素,_表示行), writef('%t\n',[_表示行]). all([],_). all([V|R],V) :- all(R,V). % all/2 についてはユーティリティとして起動ファイルに含めてロードしておく % 要素ならびを行表示([],_) :- !. が案外大事。 % ?- append(L0,_,[abc,abc,abc,abc,abc]). の最初の解 L0 = [] これを % ?- concat_atom([],' ',_表示行). してしまうと空文字列を一行印字することになり % 結果として改行してしまう。 % これを回避するため % 要素ならびを行表示([],_) :- !. がある。 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328439334/383 # # すいません質問なんですが、一行ごとに文字の表示が増えるプログラムを作る場合はfor文を3重にするのでしょうか? # なんか違う様な気がするのですが、2重だといまいち組み方がわかりません ご教授お願いします # # ABC # ABC ABC # ABC ABC ABC # こんなかんじです # # 一行ごとに表示要素数が増える :- 一行ごとに表示要素数が増える('ABC',' ',5). 一行ごとに表示要素数が増える(_表示要素,_区切り要素,_最大表示回数) :- length(L,_最大表示回数), all(L0,_表示要素), 一行ずつ要素を増やしながら行表示(L,_区切り要素). 一行ずつ要素を増やしながら行表示(L,_区切り要素) :- append(L0,_,L), L0 = [_|_], concat_atom(L0,_区切り要素,_表示行), writef('%t\n',[_表示行]). L0 = L. all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328439334/333 # # # Prologに於ける文字置換のパターンを示す # # 置換対象文字列に出会う度に非決定性で置換される事を基本として # 併せて、置換回数が最大になるような置換述語を定義する # # 文字列を検索して、適合パターンを置換していく # 1) 文字列の先頭から検索パターンに適合する文字列の前の文字列 # 2) 検索パターンに適合した文字列 # 3) 検索パターンに適合した文字列より後の文字列 # # 2) 検索パターンに適合した文字列を置換文字列に置き換える # 置換文字列定義(def,'DEF'). '置換回数が最大になるような文字列置換'(_文字列,_置換された文字列) :- findall([_置換された回数,_置換された文字列],( '置換パターン'(_文字列,_置換された回数,_置換された文字列)), LL), findmax(N,( member([N,_],LL)), Max), member([Max,_置換された文字列],LL). '置換パターン'(_文字列,_置換された文字列) :- '置換回数付き置換パターン'(_文字列,0,_,_置換された文字列). '置換回数付き置換パターン'(_文字列,_置換された回数_1,_置換された回数,_置換された文字列) :- sub_atom(_文字列,_先頭位置,_長さ,_,_適合文字列_1), 置換文字列定義(_適合文字列_1,_置換する文字列), sub_atom(_文字列,0,_先頭位置,_,_前文字列_1), sub_atom(_文字列,_先頭位置+_長さ,_,0,_後文字列_1), _置換された回数_2 is _置換された回数_1 + 1, '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数_2,_置換された回数,_置換された文字列). '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数,_置換された回数,_置換された文字列) :- concat_atom([_前文字列_1,_置換する文字列,_後文字列_1],_置換された文字列). '置換回数付き置換パターン'(_文字列,_前文字列_1,_置換する文字列,_後文字列_1,_置換された回数_1,_置換された回数,_置換された文字列) :- '置換回数付き置換パターン'(_後文字列_1,_置換された回数_1,_置換された回数,_置換された文字列_2), concat_atom([_前文字列_1,_置換する文字列,_置換された文字列_2],_置換された文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/563 # # ●正規表現の使用環境 # PHP5.3 # # ●検索か置換か? # 置換 # # ●説明 # ページ内にある<h2>〜<h6>に対して内側に<span>を入れたいです。 # hタグににclassがある場合なども想定されますがそれは引き継ぎたいです。 # 何卒ご教授お願いいたします。 # # ●対象データ # <h2>あああああ</h2> # <h2 class="hoge">あああああ</h2> # <h2><span>あああああ</span></h2> # 以下h6まで同様 # <h6>あああああ</h6> # <h6 class="hoge">あああああ</h6> # <h6><span>あああああ</span></h6> # # ●希望する結果 # <h2><span>あああああ</span></h2> # <h2 class="hoge"><span>あああああ</span></h2> # <h2><span>あああああ</span></h2> # 以下h6まで同様 # <h6><span>あああああ</span></h6> # <h6 class="hoge"><span>あああああ</span></h6> # <h6><span>あああああ</span></h6> # # 'ページ内にある<h2>〜<h6>に対して内側に<span>を入れたい'(_文字列,_置換された文字列) :- 'Hタグを見つけて、情報を分離する'(_文字列,_前文字列,_前タグ,_中間情報,_後タグ,_後文字列), 'spanタグを付加'(_中間情報,_spanタグに挟まれた中間情報), 'ページ内にある<h2>〜<h6>に対して内側に<span>を入れたい'(_後文字列,_置換された文字列_2), concat_atom([_前文字列,_前タグ,_spanタグに挟まれた中間情報,_後タグ,_置換された文字列_2],_置換された文字列),!. 'ページ内にある<h2>〜<h6>に対して内側に<span>を入れたい'(_文字列,_文字列). 'Hタグを見つけて、情報を分離する'(_文字列,_前文字列,_前タグ,_中間情報,_後タグ,_後文字列) :- 前タグ(_文字列,_前文字列,_前タグ,A,_残り文字列), '中間情報・後タグ・後文字列'(_残り文字列,A,_中間情報,_後タグ,_後文字列),!. 前タグ(_文字列,_前文字列,_前タグ,A,_残り文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_前タグ,_残り文字列,L1,['<',h,A|R1],L3), 選択できる数字(A), append(L1_1,['>'],R1), \+(member('>',L1_1)),!. '中間情報・後タグ・後文字列'(_文字列,A,_中間情報,_後タグ,_後文字列) :- concat_atom(['<','/',h,A,'>'],_後タグ), sub_atom(_文字列,St,_,_,_中間情報,_後タグ,_後文字列,L1,L2,L3),!. 選択できる数字(A) :- member(A,['2','3','4','5','6']). 'spanタグの付加'(_中間情報,_spanタグに挟まれた中間情報) :- concat_atom(['',_中間情報,''],_spanタグに挟まれた中間情報). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/502 # # 正規表現で足し算はできないでしょうか? # # PHPのソースなんですが # array( 'start' => 10.000, 'end' => 10.166 ), # array( 'start' => 11.166, 'end' => 11.414 ), # array( 'start' => 12.414, 'end' => 14.559 ), # などと並んでる部分があり、これらの数値全部に1を足したいのですが # # 'これらの数値全部に1を足したい'([],[]). 'これらの数値全部に1を足したい'([_行|R1],[_変更された行|R2]) :- 数値に1を加える(_行,_変更された行), 'これらの数値全部に1を足したい'(R1,R2). 数値に1を加える(_行,_変更された行) :- sub_atom(_行,_,_,_,S1_1,S2_1,S3_1,L1_1,L2_1,L3_1), 数値に1を加える(S1_1,S2_1,S3_1,L1_1,L2_1,L3_1,_変更部分,S3_1), 数値に1を加える(S3_1,_残りの変更部分), concat_atom([_変更部分,_残りの変更部分],_変更された行),!. 数値に1を加える(_行,_行). 数値に1を加える(S1_1,S2_1,S3_1,L1_1,L2_1,L3_1,_変更された部分,S3_1) :- 数値部分を取り出す(L1_1,L2_1,L3_1), 数値に1を加えた文字列(L2_1,_数値文字列), concat_([S1_1,_数値文字列],_変更された部分). 数値部分を取り出す(L1_1,L2_1,L3_1) :- 数値に還元できるならび(L2_1), \+((last(L1_1,A),数値(A))), \+((L3_1 = [B|_],数値(B))). 数値に1を加えた文字列(L2_1,_数値文字列) :- number_chars(_数値,L2_1), _数値_2 is _数値 + 1.0, number_chars(_数値_2,L2_2), atom_chars(_数値文字列,L2_2). 数値に還元できるならび([A|R]) :- 数字(A), last([A|R],B), \+(B='.'), 全てが数字かピリオド(R). 全てが数字かピリオド([]). 全てが数字かピリオド([A|R]) :- member(A,['.','0','1','2','3','4','5','6','7','8','9']), 全てが数字かピリオド(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/458 # # ●正規表現の使用環境 # wxWidets (wxRegEx) # # ●検索か置換か? # 検索 # # ●説明 # 一行の中に丸括弧で閉じられた文字列を検索したい。 # 丸括弧が出てくる位置や数は不定です # # ●対象データ # (2012年2月)北海道で撮影。(raw)で保存。猫と一緒(雄) # # ●希望する結果 # (2012年2月) (raw) (雄) # # (\\(.*?\\))で検索すると、"(2012年2月)"だけ検索されます。 # (\\(.*?\\))(?:.*)(\\(.*?\\))(?:.*)(\\(.*?\\))で検索すると(2012年2月)(raw)(雄)が検索されます。 # ただ括弧の位置が変わった場合には、この正規表現では検索にかからなくなります。 # # サクラテキストエディタ等の正規表現で検索すると、(\\(.*?\\)) 文章内にいくつ括弧文字列があっても # すべて検索されています。 # # 正規表現でどのように書けばいいのか、それとも、プログラム上で検索しているのかわかりません。 # どのように実現しているかまったくわかりません。 # # 考え方などをおしえてくださいませ。 # # '一行の中に丸括弧で閉じられた文字列を検索したい。丸括弧が出てくる位置や数は不定です'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 丸括弧に挟まれた文字列(L2,_適合文字列), concat_atom([S1,'('],_前文字列), concat_atom([')',S3],_後文字列). 丸括弧に挟まれた文字列(L2,_適合文字列) :- append(['('],L2_1,[')'],L2), \+(member('(',L2_1)), \+(member(')',L2_1)), atom_chars(_適合文字列,L2_1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/368 # # お願いします # # ●正規表現の使用環境 # PHP5 # # ●検索か置換か? # 置換 # # ●説明 # 0123456789アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンABCDEFGHIJKLMNOPQRSTUVWXYZ゙ ゚\「」,.()-/ # # preg_replace関数を使い上記文字以外を全て削除したい # # ●対象データ # 0ガ9ギAグアaイbウcエdオ # # ●希望する結果 # 09Aアイウエオ # '0123456789アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンABCDEFGHIJKLMNOPQRSTUVWXYZ゙ ゚\\「」,.()-/ preg_replace関数を使い上記文字以外を全て削除したい'(_文字列,_置換された文字列) :- atom_chars('0123456789アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンABCDEFGHIJKLMNOPQRSTUVWXYZ゙ ゚\\「」,.()-/',_削除しない文字ならび), findall(_文字,( sub_atom(_文字列,_,1,_,_文字), member(_文字,_削除しない文字ならび)), _選択された文字ならび), concat_atom(_選択された文字ならび,_置換された文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/300 # # テキストファイルの中に # foo=bar # という形式で設定値が列挙されています。 # grepかegrepだけでfoo=の右辺値のbarを抽出する正規表現はどうなるでしょうか? # (?<=foo=).* # とかやりたいんですけどgrepもegrepもこの式を受け付けてくれません。 # # 'テキストファイルの中に foo=bar という形式で設定値が列挙されています。foo= の右辺値のbarを抽出する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列_1,_適合文字列_1,_後文字列_1,L1,[f,o,o,=|R2],L3), \+((last(L1,A),区切り文字(A))), \+((L2 = [B|_],区切り文字(B))), 'テキストファイルの中に foo=bar という形式で設定値が列挙されています。foo= の右辺値のbarを抽出する'(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列). 'テキストファイルの中に foo=bar という形式で設定値が列挙されています。foo= の右辺値のbarを抽出する'(_文字列,_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). 'テキストファイルの中に foo=bar という形式で設定値が列挙されています。foo= の右辺値のbarを抽出する'(_文字列,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- 'テキストファイルの中に foo=bar という形式で設定値が列挙されています。foo= の右辺値のbarを抽出する'(_後文字列_1,_前文字列_2,_適合文字列,_後文字列), concat_atom([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). 区切り文字(A) :- 数字(A),!, fail. 区切り文字(A) :- アルファベット(A),!, fail. 区切り文字(A) :- 全角文字(A),!, fail. 区切り文字(_). 数字(A) :- char_code(A,Code), Code >= 48, Code =< 57,!. アルファベット(A) :- char_code(A,Code), Code >= 65, Code =< 90,!. アルファベット(A) :- char_code(A,Code), Code >= 97, Code =< 122,!. 全角文字(A) :- char_code(A,Code), Code > 255,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/727 # # 【 課題 】 名前、生年月日、電話番号、メールアドレスと入った一文が複数あるファイルがある。 # このファイルを読み込み生年月日順にソートして表示せよ。 # ただし生年月日は和暦に変換して表示する。 # 【 形態 】1. Javaアプリケーション(main()で開始 # 【 GUI  】4. 制限なし # 【 期限 】1月23日 《必須》 # 【 Ver  】java version "1.6.0_21" # 【 用語 】数学用語、専門用語の意味、説明を書きます。 《あれば必須》 # 【 補足 】ファイルは各自で用意します。 # 例 田中一郎、1887/05/08、123-456-789、tanaka_ichiro@aa.jp # よろしくお願いします。 # # ' 名前、生年月日、電話番号、メールアドレスと入った一文が複数あるファイルがある。このファイルを読み込み生年月日順にソートして表示せよ。ただし生年月日は和暦に変換して表示する。'(_ファイル) :- get_split_lines(_ファイル,['、'],LL), 整列鍵を先頭に付加する(LL,LL1), 整列(LL1,LL2), 西暦和暦変換をしながら表示する(LL2). 整列鍵を先頭に付加する(LL,LL1) :- findall([_生年月日,_名前,_生年月日,_電話番号,_メールアドレス],LL), member([_名前,_生年月日,_電話番号,_メールアドレス],LL)), LL1). 西暦和暦変換をしながら表示する(LL) :- append(_,[[_,_生年月日,_名前,_生年月日,_電話番号,_メールアドレス]|R],LL), 西暦を和暦に変換する(_生年月日,_和暦表示生年月日), concat_atom([_生年月日,_名前,_生年月日,_電話番号,_メールアドレス],'、',_表示行), writef('%t\n',[_表示行]), R = []. 西暦を和暦に変換する(_生年月日,_和暦表示生年月日) :- split(_生年月日,[/],[_年,_月,_日]), 西暦年を和暦年に変換する(_年,_和暦年表示), concat_atom([_和暦年表示,_月,月,_日,_日],_和暦表示生年月日). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1867, _年 < 1912, _和暦年 is 1867 + _年, concat_atom([明治,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1911, _年 < 1926, _和暦年 is 1911 + _年, concat_atom([大正,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1925, _年 < 1989, _和暦年 is 1926 + _年, concat_atom([昭和,_和暦年,年],_和暦年表示). 西暦年を和暦年に変換する(_年,_和暦年表示) :- _年 > 1988, _和暦年 is 1988 + _年, concat_atom([平成,_和暦年,年],_和暦年表示). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/239 # # 質問させてください。 # 半角文字列にスペースが含まれています。 # # 例 # 727 751 798 625 791 460 645 850 656 697....... # このスペースをカウントして,3つめのスペースだけを改行に置換する場合(下) # 727 751 798 # 625 791 460 # 645 850 656 # 697....... # # どう表現すればいいのでしょうか? # # 数値が全て3桁ならば分かるのですが,2桁や4桁が含まれており文字数ではマッチできません。 # よろしくお願いします # 'スペースをカウントして,3つめのスペースだけを改行に置換する'(_文字列,_置換された文字列) :- atom_chars(_文字列,Chars1), 'スペースをカウントして,3つめのスペースだけを改行に置換する'(0,Char,Char1), concat_atom(_置換された文字列,Char2). 'スペースをカウントして,3つめのスペースだけを改行に置換する'(_,[],[]) :- !. 'スペースをカウントして,3つめのスペースだけを改行に置換する'(2,[' '|R1],['\n'|R2]) :- 'スペースをカウントして,3つめのスペースだけを改行に置換する'(0,R1,R2). 'スペースをカウントして,3つめのスペースだけを改行に置換する'(N,[' '|R1],[' '|R2]) :- N2 is N + 1, 'スペースをカウントして,3つめのスペースだけを改行に置換する'(N2,R1,R2). 'スペースをカウントして,3つめのスペースだけを改行に置換する'(N,[A|R1],[A|R2]) :- \+(A=' '), 'スペースをカウントして,3つめのスペースだけを改行に置換する'(N,R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/418 # # [1] 授業単元:コンピュータ工学 # [2] 問題文(含コード&リンク): # 例に示した通りに動作するプログラムを作成せよ。 # 例題の中にあるアンダーライン(_)は空白を示すものとする。 # input please-> 10_35_100_500・・・ # # message-> "10+35+100+500の合計は645です。" # '例に示した通りに動作するプログラム。 input please-> 10_35_100_500・・・ message-> "10+35+100+500の合計は645です。" ' :- write('input please-> '), readln(L), sum(L,_合計), concat_atom(L,'+',S), writef('%tの合計は%tです。\n',[S,_合計]). sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/197 # # ●正規表現の使用環境 # 秀丸エディタ # ●検索か置換か? # 置換 # ●説明 # <div class="main">の場合に限り、両端のdivをspanに置換したい。 # ※<div class="main">から</div>までの行数は、3行だったり5行だったりと色々変わります。 # ●対象データ # <div class="main">あああああ<br> # いいいいい<br> # ううううう<br> # えええええ<br> # おおおおお<br> # </div> # # ●希望する結果 # <span class="main">あああああ<br> # いいいいい<br> # ううううう<br> # えええええ<br> # おおおおお<br> # </span> # # # 下の正規表現を作ってみたのですが検索でマッチしません。 # どなたか助言頂けるとうれしいです。 # よろしくお願いいたします。 # # 置換元 # <div class="main">(.*\n*)</div> # 置換先 # <span class="main">\1</span> # 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換する'(_文字列,_置換された文字列) :- mainからspanへの置換(_文字列,_前文字列,_置換されたdiv部,_後文字列,_置換された文字列), 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換する'(_文字列,_前文字列,_置換されたdiv部,_後文字列,_置換された文字列). 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換する'(_文字列,_文字列). 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換数'(_文字列,_前文字列,_置換されたdiv部,_後文字列,_置換された文字列) :- concat_atom([_前文字列,_置換されたdiv部,_後文字列],_置換された文字列). 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換数'(_文字列,_前文字列,_置換されたdiv部,_後文字列,_置換された文字列) :- 'div class="main" タグが現れたら端のdiv,/divをspan,/spanに置換する'(_後文字列,_置換された後文字列), concat_atom([_前文字列,_置換されたdiv部,_置換された後文字列],_置換された文字列). mainからspanへの置換(_文字列,_前文字列,_置換された文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[<,d,i,v,' ',c,l,a,s,s,=,'"',m,a,i,n,'"',>|R2],L3), append(L2_2,[<,/,d,i,v,>],R2), append([<,s,p,a,n,' ',c,l,a,s,s,=,'"',m,a,i,n,'"',>|L2_2],[<,/,s,p,a,n,>],L2_3), concat_atom(L2_3,_置換された文字列),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/688 # # 【 課題 】 # 1、 # data.txt→2chの1スレッドのデータが入っている。 # http://ime.nu/www.dotup.org/uploda/www.dotup.org2512848.txt.html # # dataExtraction.java→data.txtの1レスを読み込んで一枚のテキストファイルに出力していくプログラム(例:レス1はres1.txtに.......レス200はres200.txtに出力) # http://ime.nu/www.dotup.org/uploda/www.dotup.org2512850.txt.html # # このdataExtraction.javaがdata.txtの1レスを読み込んだ際に # もしURLやアンカを表す文字列(例:<a href="../test/read.cgi/bizplus/1326413757/3" target="_blank">../test/read.cgi/tech/1309076891/3</a>)があった場合 # それを削除してテキストファイルに出力する機能を追加してください。 'data.txtには2chの1スレッドのデータが入っている。1レスをずつ読み込んでレス番号をファイル名に含む一枚のテキストファイルに出力していく' :- get_chars('data.txt',Chars), 'data.txtには2chの1スレッドのデータが入っている。1レスをずつ読み込んでレス番号をファイル名に含む一枚のテキストファイルに出力していく'(Chars). 'data.txtには2chの1スレッドのデータが入っている。1レスをずつ読み込んでレス番号をファイル名に含む一枚のテキストファイルに出力していく'(Chars) :- append(_,[<,d,t,>|R1],[<,/,d,t,>|R2],Chars), append(L1,[<,d,d,>|R3],[<,/,d,d,>|R4],R2), 一枚のテキストファイルに保存(R1,L1,R3),), 'data.txtには2chの1スレッドのデータが入っている。1レスをずつ読み込んでレス番号をファイル名に含む一枚のテキストファイルに出力していく'(R4), 'data.txtには2chの1スレッドのデータが入っている。1レスをずつ読み込んでレス番号をファイル名に含む一枚のテキストファイルに出力していく'(_). 一枚のテキストファイルに保存(R1,L1,R3) :- レス番号を得る(R1,_レス番号), concat_atom(['res',_レス番号,'.txt'],_ファイル名), open(_ファイル名,write,Outstream), テキスト部分の保存(Outstream,R1,L1,R3), close(Outstream),!. レス番号を得る(R1,_レス番号) :- concat_atom(R1,S), split(S,[' '],[_レス番号|_]). テキスト部分の保存(Outstream,R1,L1,R3) :- put_chars(Outstream,[<,d,t,>|R1]), put_chars(Outstream,L1), put_chars(Outstream,[<,d,d,>|R3]), put_chars(Outstream,[<,/,d,d,>]). put_chars(_,[]). put_chars(Stream,[_文字|R]) :- put_char(Stream,_文字), put_chars(Stream,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/177 # # [1] 授業単元:C++ # [2] 問題文(含コード&リンク): # 以下のxmlファイルからSysDataの格納パスを取得する # # <?xml version="1.0" encoding="utf-8"?> # <Data> # <Items> # <Key>SysConf</Key> # <Value>D:\tmp\conf</Value> # </Item> # <Items> # <Key>SysEtc</Key> # <Value>D:\tmp\etc</Value> # </Item> # <Items> # <Key>SysData</Key> # <Value>D:\tmp\data</Value> # </Item> # # </Data> # '以下のxmlファイルからSysDataの格納パスを取得する'(_ファイル,_格納パス) :- get_lines(_ファイル,Lines), append(_,['','SysData',Line,''|_],Lines), sub_atom(Line,_,_,_,S1,S2,S3,L1,[<,'V',a,l,u,e,>|R1],[<,/,'V',a,l,u,e,>,|_]), concat_atom(R1,_格納パス),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/157 # # ●正規表現の使用環境 # PHP 5.2 で出来ればpreg_replace()で。 # # ●検索か置換か? # 置換 # # ●説明 # "/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したいです。 # fooの文字数は不定です。 # # ●対象データ # /foo/bar/baz/qux/ # /qwert/asd/fghjk/klzxv/ # /qazwsx/edc/rfvt/gbyhnu/ # /4756/78674/45756/34545/4564/546/ # # ●希望する結果 # /home/bar/baz/qux/ # /home/asd/fghjk/klzxv/ # /home/edc/rfvt/gbyhnu/ # /home/78674/45756/34545/4564/546/ # # '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,_,S3,_,L2,_), L2 = [/,f,o,o,/], '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(S1,S3,_置換された文字列),!. '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(_文字列,_文字列). '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(S1,S3,_置換された文字列) :- concat_atom([S1,'/home/',S3],_置換された文字列). '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(S1,S3,_置換された文字列) :- '"/foo/bar/baz/qux/" を "/home/bar/baz/qux/" に置換したい'(S3,_置換されたS3), concat_atom([S1,'/home/',_置換されたS3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/411 # # 質問です。DBはSQLite3です。 # 構成が同じなので../test/read.cgi/db/1316769778/244のテーブルを説明に使わせてもらいます # # shop # id name # 1 Aカンパニー # 2 Bカンパニー # 3 Cカンパニー # # area # 1 北海道 # 2 青森 # 3 岩手 # 4 秋田 # # shop_area # shop_id area_id # 1 1 # 1 2 # 1 3 # 2 2 # 2 4 # 3 2 # 3 3 # # # 北海道なら、Bカンパニー・Cカンパニー # 青森なら、無し # 岩手なら、Bカンパニー # 秋田なら、Aカンパニー・Cカンパニー # 北海道・秋田なら、Cカンパニー # # 除外検索の要領で、対象の支社が無い会社を呼び出したい時はどうすればよいのでしょうか # '除外検索の要領で、対象の支社が無い会社を呼び出す' :- '除外検索の要領で、対象の支社が無い会社を呼び出す'(_地域ならび,_対象の支社が無い会社ならび), concat_atom(_地域ならび,'・',S1), concat_atom(_対象の支社が無い会社ならび,'・',S2), writef('%tなら、%t\n',[S1,S2]), fail. '除外検索の要領で、対象の支社が無い会社を呼び出す'. '除外検索の要領で、対象の支社が無い会社を呼び出す'(_地域ならび,_対象の支社が無い会社ならび) :- findall([_area_name,_対象の支社が無い会社ならび],( '対象の支社が無い会社を呼び出す'(_area_name,_対象の支社が無い会社ならび)), L1), findsetof(_対象の支社が無い会社ならび,( append(_,[[_,_対象の支社が無い会社ならび]|_],L1)), _対象の支社が無い会社ならびパターン), append(_,[_対象の支社が無い会社ならび|_],_対象の支社が無い会社ならびパターン), findall(_area_name,( append(_,[[_area_name,_対象の支社が無い会社ならび]|_],L1)), _地域ならび). '対象の支社が無い会社を呼び出す'(_area_name,_対象の支社が無い会社ならび) :- area(_area_id,_area_name), findsetof([_shop_id,_name],( shop_area(_shop_id,_area_id), shop(_shop_id,_name)), L1), findall(_name,( append(_,[[_shop_id,_name]|_],L1), \+(shop_area(_shop_id,_area_id))), _対象の支社が無い会社ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/151 # # ●JavaScriptかPHP(なければなんでも) # ●置換 # ●現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込むことできましたっけ? # ●あいうあいうあいう・・・ # ●1あいう2あいう3あいう・・・ # # # 検索パターン(L2,_検索パターン) :- L2 = _検索パターン.\ '現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込む'(_文字列,_検索パターン,_置換された文字列) :- '現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込む'(_文字列,[],_検索パターン,_置換された文字列). '現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込む'(_文字列,Ln,_検索パターン,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 検索パターン(L2,_検索パターン), length([_|Ln],Length), '現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込む'(S3,[_|Ln],_検索パターン,_置換された文字列_2), concat_atom([S1,Length,S2,_置換された文字列_2],_置換された文字列). '現在パターンにマッチしている回数(試行回数でも)を置換後に埋め込む'(_文字列,_,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/103 # # あけましておめでとう # # ●正規表現の使用環境 # perl5 # # ●検索か置換か? # 置換 # # ●説明 # 全角,句読点と半角の間を消したい # 半角と半角は無視 # ●対象データ # みんなの憧れ Justin Drew Bieber が大好き # 私だけの Justin が欲しい # やっぱ Bieber 、Bieber って響きがいいよね # # ●希望する結果 # みんなの憧れJustin Drew Bieberが大好き # 私だけのJustinが欲しい # やっぱBieber、Bieberって響きがいいよね # # # 今までは([ぁ-煕]+)と([0-9A-Za-z]+)を組み合わせて何回もやっていたのですが # 例題の1行目の様な物が煩わしいので一括に処理したいです # お願いします # '全角,句読点と半角の間を消したい。半角と半角は無視'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), 半角に挟まれていない空白の連続ならび(L1,L2,L3), '全角,句読点と半角の間を消したい 半角と半角は無視'(_S3,_置換された文字列_2), concat_atom([S1,S2,_置換された文字列_2],_置換された文字列),!. '全角,句読点と半角の間を消したい。半角と半角は無視'(_文字列,_文字列). 半角に挟まれていない空白の連続ならび(L1,L2,L3) :- 全て空白(L2), \+((last(L1,A),半角文字(A),L3=[C|_],半角文字(C))). 全て空白([]). 全て空白([' '|R]) :- 全て空白(R). 半角文字(' ') :- !,fail. 半角文字(_文字) :- char_code(_文字,_文字コード), _文字コード < 256. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/737 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # 任意の0〜nの整数から、重複を許してm個の整数を選び出力するプログラムを作れ。 # '任意の0〜nの整数から、重複を許してm個の整数を選び出力する'(_n,_m) :- '任意の0〜nの整数から'(_n,_整数ならび), findall(L,( '重複を許してm個の整数を選び'(_整数ならび,_m,_重複を許したm個の整数ならび)), LL), 出力する(LL). '任意の0〜nの整数から'(_n,_整数ならび) :- findall(N,( for(0,N,_n)), _整数ならび). '重複を許してm個の整数を選び'(L,1,[_整数]) :- member(N,L). '重複を許してm個の整数を選び'([_整数|R1],M,[_整数|R3]) :- M > 1, M_1 is M - 1, '重複を許してm個の整数を選び'([A|R1],M_1,R3). '重複を許してm個の整数を選び'([_|R1],M,R3) :- M > 1, '重複を許してm個の整数を選び'(R1,M,R3). 出力する(LL) :- append(_,[L|R],LL), concat_atom(L,',',_表示文字列), writef('%t\n',[_表示文字列]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/715 # # [1] 授業単元: 情報処理 # [2] # 問題(1) # http://ime.nu/ideone.com/xfyDt # # 上のプログラムを参考にして、unsigned型整数をビット表記した時の下から4ビット(20 から23の桁) # を表示する関数 void print_4bits ( unsigned x) を作成せよ。 # またこの関数を用いて、0から15までの整数を4ビットで表示するプログラムを作成せよ。 # # 問題(2) # float型実数 x と double型実数 yを用意し、初期値として x, y 共に1.0と置く。 # ループ( while文、 for文何でもよい) を用いて、x, yの値をそれぞれ前の値の 1/10にする毎に、その値を表示するプログラムを作成せよ。 # ループはyの値が 10 -14 より小さくなった場合に終了すること。 x , yを 表示する際、変換指定は %20.15fとすること。 C言語においては 10 -14 は 1e-14と表記する。 # # '整数をビット表記した時の下から4ビット(20 から23の桁)を表示する'(_整数) :- M is _整数 mod 16, '下から4ビット'(M,[],_表示文字列), writef('%t\n',[_表示文字列]). '下から4ビット'(0,L,S) :- concat_atom(L,S),!. '下から4ビット'(N,L,S) :- M is N mod 2, N_2 is N // 2, '下から4ビット'(N_2,[M|L],S). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/703 # # [1] 授業単元:C言語 # [2] 問題文:入力したxとyを交互に読み取り、zに出力するプログラムを作成せよ # 例 # x=いはほとりる # y=ろにへちぬを # z=いろはにほへとちりぬるを # '入力したxとyを交互に読み取り、zに出力する'(_z) :- write('xを入力して下さい : '), get_line(_x), write('yを入力して下さい : '), get_line(_y), 'xとyを交互に読み取り、zに出力する'(_x,_y,_z). 'xとyを交互に読み取り、zに出力する'(_x,_y,_z) :- 'xとyを交互に読み取り'(_x,_y,A,B,_x_2,_y_2), 'xとyを交互に読み取り、zに出力する'(_x_2,_y_2,_z_2), concat_atom([A,B,_z_2],_z). 'xとyを交互に読み取り、zに出力する'(_x,_y,_z) :- atom_concat(_x,_y,_z). 'xとyを交互に読み取り'(_x,_y,A,B,_x_2,_y_2) :- sub_atom(_x,0,1,R1,A), sub_atom(_y,0,1,R2,B), sub_atom(_x,1,R1,0,_x_2), sub_atom(_y,1,R2,0,_y_2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/700 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # (1)20個の適当な整数が空白で区切られて保存されているファイルを作成せよ。 # このファイルに含まれる整数のうち最大のものを出力せよ。 # # (2)15個の適当な整数が空白で区切られて保存されているファイルを作成せよ。 # このファイルに含まれる整数を,その保存されている順とは逆順に”result.txt”というファイルに出力せよ。 # # '15個の適当な整数が空白で区切られて保存されているファイルを作成せよ'(_ファイル) :- '15個の適当な整数'(_15個の適当な整数), 空白で区切られて(_15個の適当な整数,_空白で区切られた文字列), open(_ファイル,write,Outstream), writef(Outstream,'%t\n',[_空白で区切られた文字列]), close(Outstream). '15個の適当な整数'(_15個の適当な整数) :- length(_15個の適当な整数), findall(V,( append(_,[V|_],_15個の適当な整数), V is random(10001) - 500), _15個の適当な整数). 空白で区切られて(_15個の適当な整数,_空白で区切られた文字列) :- concat_atom(_15個の適当な整数,' ',_空白で区切られた文字列). このファイルに含まれる整数を,その保存されている順とは逆順に”result.txt”というファイルに出力せよ このファイルに含まれる整数のうち最大のものを出力せよ(_ファイル) :- open(_ファイル,read,Instream), get_lines(Instream,Lines), close(Instream), '整数を逆順に"result.txt"というファイルに出力せよ'(Lines). '整数を逆順に"result.txt"というファイルに出力せよ'(Lines) :- 整数を逆順に(Lines,_逆順整数表示文字列), open('result.txt',write,Outstream), writef(Outstream,'%t\n',[_表示文字列]), close(Outstream). 行ならびを整数ならびに変換(Lines,_整数ならび) :- findall(_要素ならび,( append(_,[_行|_],Lines), split(_行,[' '],_要素ならび)), LL), flat(LL,L), 整数を選別する(L,_整数ならび). 整数を選別する(_要素ならび,_整数ならび) :- findall(_整数,( append(_,[_要素|_],_要素ならび), integer(_要素)), _整数ならび). 整数を逆順に(Lines,_逆順整数表示文字列) :- 行ならびを整数ならびに変換(Lines,_整数ならび), reverse(_整数ならび,_逆順の整数ならび), concat_atom(_逆順の整数ならび,' ',_逆順整数表示文字列). % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/700 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # (1)20個の適当な整数が空白で区切られて保存されているファイルを作成せよ。 # このファイルに含まれる整数のうち最大のものを出力せよ。 # # (2)15個の適当な整数が空白で区切られて保存されているファイルを作成せよ。 # このファイルに含まれる整数を,その保存されている順とは逆順に”result.txt”というファイルに出力せよ。 # # '20個の適当な整数が空白で区切られて保存されているファイルを作成せよ'(_ファイル) :- '20個の適当な整数'(_20個の適当な整数), 空白で区切られて(_20個の適当な整数,_空白で区切られた文字列), open(_ファイル,write,Outstream), writef(Outstream,'%t\n',[_空白で区切られた文字列]), close(Outstream). '20個の適当な整数'(_20個の適当な整数) :- length(_20個の適当な整数), findall(V,( append(_,[V|_],_20個の適当な整数), V is random(10001) - 500), _20個の適当な整数). 空白で区切られて(_20個の適当な整数,_空白で区切られた文字列) :- concat_atom(_20個の適当な整数,' ',_空白で区切られた文字列). このファイルに含まれる整数のうち最大のものを出力せよ(_ファイル) :- open(_ファイル,read,Instream), get_lines(Instream,Lines), close(Instream), 整数のうち最大のものを出力せよ(Lines). 整数のうち最大のものを出力せよ(Lines) :- 行ならびを整数ならびに変換(Lines,_整数ならび), max(_整数ならび,_最大値), writef('%t\n',[_最大値]). 行ならびを整数ならびに変換(Lines,_整数ならび) :- findall(_要素ならび,( append(_,[_行|_],Lines), split(_行,[' '],_要素ならび)), LL), flat(LL,L), 整数を選別する(L,_整数ならび). 整数を選別する(_要素ならび,_整数ならび) :- findall(_整数,( append(_,[_要素|_],_要素ならび), integer(_要素)), _整数ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/562 # # [1] プログラミング実習応用 # [2] ファイル"tmp.csv"を入力ファイルとして、座標(x,y)の組を終端まで読み込み、 # x,yそれぞれの平均値(重心)を計算して、画面上に表示するプログラムを作成せよ # □"tmp.csv"は「関数y=x^3-xのグラフを描くため、定義域[-2,2]に対するyの値を0.1刻みで計算し、 # 結果をファイルに出力する」というプログラムで作ったファイルで、もう用意してあります。 # □コンパイラの標準外の仕様による異常終了を避けるため、変数の宣言部分にダミーの変数を追加する。例えば、"double dummy=0.0;"(変数名や値は変えてよい) # 'ファイル"tmp.csv"を入力ファイルとして、座標(x,y)の組を終端まで読み込み、x,yそれぞれの平均値(重心)を計算して、画面上に表示する' :- 'ファイル"tmp.csv"を入力ファイルとして、座標(x,y)の組を終端まで読み込み'(_x座標ならび,_y座標ならび), 'x,yそれぞれの平均値を計算して'(_x座標ならび,_y座標ならび,_xの平均,_yの平均), 画面上に表示する(_xの平均,_yの平均). 'ファイル"tmp.csv"を入力ファイルとして、座標(x,y)の組を終端まで読み込み'(_x座標ならび,_y座標ならび) :- get_chars('tmp.csv',Chars), 座標の組(Chars,_x座標ならび,_y座標ならび). 座標の組(Chars,[V|_座標ならび_1],_座標ならび_2) :- 座標の組(Chars,L,_座標ならび_2,_座標ならび_1), 実数に変換(L,V). 座標の組([],[],[],[]) :- !. 座標の組([],L,[V],[]) :- 実数に変換(L,V),!. 座標の組([_区切り記号|R1],[],[V|_座標ならび_1],_座標ならび_2) :- member(_区切り記号,[' ','\t',',','\n','(',')']), 座標の組(R1,L,_座標ならび_2,_座標ならび_1), 実数に変換(L,V),!. 座標の組([A|R1],[A|R2],_座標ならび_1,_座標ならび_2) :- \+(member(A,[' ','\t',',','\n','(',')'])), 座標の組(R1,R2,_座標ならび_1,_座標ならび_2),!. 座標の組([_|R1],L,_座標ならび_1,_座標ならび_2) :- 座標の組(R1,L,_座標ならび_1,_座標ならび_2). 実数に変換([],_) :- !,fail. 実数に変換(_実数数字ならび,_実数値) :- concat_atom(_実数数字ならび,_文字列), atom_to_term(_文字列,_実数値,_). 'x,yそれぞれの平均値を計算して'(_x座標ならび,_y座標ならび,_xの平均,_yの平均) :- 相加平均(_x座標ならび,_xの平均), 相加平均(_y座標ならび,_yの平均). 相加平均(_値ならび,_相加平均) :- length(_値ならび,_標本数), 相加平均(_値ならび,_標本数,0,_相加平均). 相加平均([],_標本数,_合計,_相加平均) :- _相加平均 is _合計 / _標本数,!. 相加平均([V|R],_標本数,_合計_1,_相加平均) :- _合計_2 is _合計_1 + V, 相加平均(R,_標本数,_合計_2,_相加平均). 画面上に表示する(_xの平均,_yの平均) :- writef('座標の組の平均(重心)は (%t,%t) です。\n',[_xの平均,_yの平均]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/620 # # 【 課題 】(源列を入力すると16進数が表示されるプログラム #       (例)I have a dream と入力するとI have a dreamが16進数で出力される。 #       16進数を入力すると文字列が表示されるプログラム(,竜侫弌璽献腑) # 【 形態 】Javaアプリケーション(main()で開始) # 【 GUI  】SWT # 【 期限 】12/20 まで # 【 Ver  】1.6.0_24 # 【 補足 】プログラム中でどのような操作がされているか #       コメントをつけてくださると嬉しいです。 # よろしくお願いします。 # # '文字列を入力すると16進数が表示される' :- write('文字列を入力して下さい : '), get_line(_文字列), '文字列を16進数表記ならびに変換する'(_文字列,_16進数表記ならび), 表示される(_16進数表記ならび). '文字列を16進数表記ならびに変換する'(_文字列,_16進数表記ならび) :- atom_codes(_文字列,Codes), 文字コードを16進数に変換(Codes,_16進数表記ならび), 文字コードを16進数に変換([],_16進数表記ならび,_16進数表記ならび). 文字コードを16進数に変換([Code|R1],R2,_16進数表記ならび) :- Code < 256, 文字コードを16進文字表記に変換(Code,_16進数文字表記), 文字コードを16進数に変換([Code|R1],[_16進数文字表記|R2],_16進数表記ならび). 文字コードを16進数に変換([Code|R1],R2,_16進数表記ならび) :- Code >= 256, Code1 is Code // 256, Code2 is Code mod 256, 文字コードを16進数に変換([Code1,Code2|R1],R2,_16進数表記ならび). 文字コードを16進文字表記に変換(Code,_16進数文字表記) :- Code1 is Code // 16, Code2 is Code mod 16, '10進数16進文字表記'(Code1,CodeA), '10進数16進文字表記'(Code2,CodeB), atom_concat(CodeA,CodeB,_16進数文字表記). '10進数16進文字表記'(0,'0'). '10進数16進文字表記'(1,'1'). '10進数16進文字表記'(2,'2'). '10進数16進文字表記'(3,'3'). '10進数16進文字表記'(4,'4'). '10進数16進文字表記'(5,'5'). '10進数16進文字表記'(6,'6'). '10進数16進文字表記'(7,'7'). '10進数16進文字表記'(8,'8'). '10進数16進文字表記'(9,'9'). '10進数16進文字表記'(10,'A'). '10進数16進文字表記'(11,'B'). '10進数16進文字表記'(12,'C'). '10進数16進文字表記'(13,'D'). '10進数16進文字表記'(14,'E'). '10進数16進文字表記'(15,'F'). 表示される(_16進数表記ならび) :- concat_atom(_16進数表記ならび,_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/526 # # [1] 授業単元:プログラミング言語 # [2] 問題文(含コード&リンク):m行n列のテキストファイル(1.txt)をそれぞれ二次元配列に入れ、その配列から新しいテキストファイル(2.txt)に1.txtと同じ内容を出力するようなプログラムを作成せよ。 # 'm行n列のテキストファイル(1.txt)をそれぞれ二次元配列に入れ、その配列から新しいテキストファイル(2.txt)に1.txtと同じ内容を出力する'(_m行,_n列,LL) :- get_lines('1.txt',Lines), length(Lines,_m行), 区切り要素のスパイ(Lines,_n列,_区切り要素), 配列に入れる(Lines,_区切り要素,LL), '配列から新しいテキストファイル(2.txt)に1.txtと同じ内容を出力する'(LL). 区切り要素のスパイ([Line|_],_n列,',') :- length(L,_n列), split(Line,',',L),!. 区切り要素のスパイ([Line|_],_n列,' ') :- length(L,_n列), split(Line,' ',L),!. '配列から新しいテキストファイル(2.txt)に1.txtと同じ内容を出力する'(LL,_区切り要素) :- open('2.txt',write,Outstream), 出力する(Outstream,LL,_区切り要素), close(Outstream). 出力する(Outstream,LL,_区切り要素) :- append(_,[L|R],LL), concat_atom(L,_区切り要素,Line), writef(Outstream,'%t\n',[Line]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/593 # # 【 課題 】ttp://edu.net.c.dendai.ac.jp/ad1/2011/kadai.html # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】1/10 20:00まで # 【 Ver  】java version "1.6.0_21" # 【 補足 】課題2をお願いします # <課題1> # 通貨を使うクラスを考えます。 値を入れると、通貨記号を含めて表示し、 # また円レートを設定すると、等価な円オブジェクトを返します。 # # <課題2> # 順序木を利用し、キーの値で値を整列するデータ構造を作成することを考えます。 # そのためには、java.util.Map を実装し、 java.util.AbstractMap を継承し、 # 最小限のプログラムで動作させます。 まず、文字列をキーとして、整数値を # 整列するような TDUMap3 を目標とします。 完成した後、Generics を利用した # 任意の型のキーと値を使用できる TDUMap を作成します。 '通貨を使うクラスを考えます。 値を入れると、通貨記号を含めて表示し、また円レートを設定すると、等価な円オブジェクトを返します。'(_値,_通貨記号,_円レート,_円) :- '値を入れると'(_値), '通貨記号を含めて表示し'(_値,_通貨記号を含む表示), '円レートを設定すると'(_通貨記号を含む表示,_円レート), '等価な円オブジェクトを返す'(_値,_円レート,_円). '通貨を使うクラスを考えます。 値を入れると、通貨記号を含めて表示し、また円レートを設定すると、等価な円オブジェクトを返します。'(_値,_通貨記号,_円レート,_円) :- '通貨を使うクラスを考えます。 値を入れると、通貨記号を含めて表示し、また円レートを設定すると、等価な円オブジェクトを返します。'(_値,_通貨記号,_円レート,_円). '値を入れると'(_値) :- write('値を入力して下さい : '), get_line(Line), '値入力診断'(Line,_値). '値を入れると'(_値) :- '値を入れると'(_値). '値入力診断'(Line,_値) :- atom_to_term(Line,_値,_), number(_値), _値 >= 0. 通貨記号を含めて表示し(_値) :- 通貨(_通貨記号), concat_atom([_通貨記号,_値],_通貨記号を含む表示), writef('%t : ',[_通貨記号を含む表示]). '円レートを設定すると'(_通貨記号を含む表示,_円レート) :- writef('%t 円レートを入力して下さい : ',[_痛か木子を含む表示]), get_line(Line), '円レート入力診断'(Line,_円レート),!. '円レートを設定すると'(_通貨記号を含む表示,_円レート) :- '円レートを設定すると'(_通貨記号を含む表示,_円レート). '円レート入力診断'(Line,_円レート) :- atom_to_term(Line,_円レート,_), number(_円レート), _円レート >= 0,!. '等価な円オブジェクトを返す'(_値,_円レート,_円) :- _円 is _値 * _円レート. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/501 # # [1] 授業単元:配列とポインタ(アルゴリズム) # [2] 問題文(含コード&リンク):以下の実行例のように,文字列を入力すると,その前 # 後に"を付けた文字列を生成するプログラムを,ライブ # ラリ関数strcpy とstrcat を用いて作成せよ.ただし, # プログラムは以下の要件を満たすこととする # ・ユーザに入力させる文字列を格納する配列をstr1[],前後に"を付けた文字列のための配列をstr2[] とする. # ・ユーザに入力させる文字列は30 字までとする。 # ・配列str2[] は初期化せずに宣言し,ライブラリ関数strcpy とstrcat を使って(添字演算子[] を使わずに)前後に"を付けた文字列を生成すること. #   実行例. # 文字列を入力してください:Tokyo # 文字列の前後に"を付けました。 # str2:"Tokyo" #  [3.1] OS: linux debian #  [3.2] コンパイラ名とバージョン: gcc4.3.2 #  [3.3] 言語:C言語 # [4] 期限: 12月13日 14時 # [5] その他の制限: # '文字列を入力すると,その前後に"を付けた文字列を生成するプログラムを,ライブラリ関数strcpy とstrcat を用いて作成せよ.ただし,プログラムは以下の要件を満たすこととする。 ・ユーザに入力させる文字列を格納する配列をstr1[],前後に"を付けた文字列のための配列をstr2[] とする. ・ユーザに入力させる文字列は30 字までとする。 ・配列str2[] は初期化せずに宣言し,ライブラリ関数strcpy とstrcat を使って(添字演算子[を使わずに)前後に"を付けた文字列を生成すること.' :- 文字列の入力(_文字列), concat_atom(['"',_文字列,'"'],_生成された文字列), writef('前後に"を付加された文字列は %t です\n',[_生成された文字列]). 文字列の入力(_文字列) :- write('文字列を入力して下さい : '), get_line(Line), 文字列入力診断(Line,_文字列),!. 文字列入力診断(文字列,_文字列) :- atom_length(_文字列,_長さ), _長さ =< 30,!. 文字列入力診断(Line,_文字列) :- sub_atom(Line,0,30,_,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/458 # # [1] 授業単元:配列とポインタ # [2] 問題文(含コード&リンク):1,2,3,4,5,6...と続くテキストファイルを読み込み、 # 8×8の2次元配列で表し、別のテキストファイルに結果を書き込みなさい。ただし、読み込むファイルのデータの数が64個に満たない場合は、0を代入しなさい。 # '1,2,3,4,5,6...と続くテキストファイルを読み込み、8×8の2次元配列で表し、別のテキストファイルに結果を書き込みなさい。ただし、読み込ファイルのデータの数が64個に満たない場合は、0を代入しなさい。'(_テキストファイル,_別のテキストファイル) :- '1,2,3,4,5,6...と続くテキストファイルを読み込み'(_テキストファイル,_文字列), '8×8の2次元配列で表し'(_文字列,LL), 別のテキストファイルに結果を書き込む(_別のテキストファイル,LL). '1,2,3,4,5,6...と続くテキストファイルを読み込み'(_テキストファイル,_文字列) :- get_lines(_テキストファイル,Lines), concat_atom(Lines,_文字列). '8×8の2次元配列で表し'(_文字列,LL) :- split(_文字列,[','],_数字ならび), length(LL,8), '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'(_数字ならび,LL). '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'(_,[]) :- !. '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'(L1,[L2|R2]) :- \+(L1 = [_,_,_,_,_,_,_,_|_]), length(L2,8), append(L0,L1,L2), all(L0,0), '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'([],R2). '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'([A,B,C,D,E,F,G,H|R1],[[A,B,C,D,E,F,G,H]|R2]) :- '先頭から8要素ずつ切り取っていく。データの数が64個に満たない場合は、0を代入しなさい'(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/312 # # access2000で # # NEN | TUKI # 23 | 11 # ってデータがあったら # # 平成23年12月31日のように常に次月末日を返したいのですが # どのようなクエリになりますか? # '平成23年12月31日のように常に次月末日を返す'(_次月末日) :- 年月(_NEN,_TUKI), '平成23年12月31日のように常に次月末日を返す'(_NEN,_TUKI,_次月末日). '平成23年12月31日のように常に次月末日を返す'(_NEN,12,_次月末日) :- _NEN_2 is _NEN + 1, concat_atom([平成,_NEN_2,年,1,月,31,日],_次月末日),!. '平成23年12月31日のように常に次月末日を返す'(_NEN,_TUKI,_次月末日) :- member(_TUKI,[2,4,6,7,9,11]), _TUKI_2 is _TUKI + 1, concat_atom([平成,_NEN,年,_TUKI_2,月,31,日],_次月末日),!. '平成23年12月31日のように常に次月末日を返す'(_NEN,_TUKI,_次月末日) :- member(_TUKI,[3,5,8,10]), _TUKI_2 is _TUKI + 1, concat_atom([平成,_NEN,年,_TUKI_2,月,30,日],_次月末日),!. '平成23年12月31日のように常に次月末日を返す'(_NEN,1,_次月末日) :- _西暦年 is _NEN + 1988, うるう年(_西暦年), concat_atom([平成,_NEN,年,2,月,29,日],_次月末日),!. '平成23年12月31日のように常に次月末日を返す'(_NEN,1,_次月末日) :- _西暦年 is _NEN + 1988, \+(うるう年(_西暦年)), concat_atom([平成,_NEN,年,2,月,28,日],_次月末日),!. うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_),!, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/378 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):↓ # # 文字列操作のライブラリ関数を使用して、指定したファイルで、 # 最も辞書順(ASCIIコード順)で最初に出てくる単語と、最後に出てくる単語を見つけて表示せよ。また、最も長い単語も表示せよ。 # ・同じ長さの単語が複数ある場合には、最初に見つけたものだけ表示するだけでよい。 # ・ただし,ここでいう単語とは、スペースや改行、タブで区切られる文字の列で必ずしも、英数字とはかぎらない。(このような区切りで、ファイルから文字列を読むために%sを用いる) # ・単語の長さは100文字以内と考えてよい。 # ・標準文字列関数を利用すること。 # # (指定されたファイルとは普通の英文が書かれた.txtファイルです) # 実行例 # $./quiz10-2 # Input file name!:sample.txt # file1 open Error sample.txt # $ # $./quiz10-2 # Input file name!:English.txt # The First word = 's # The Last word = yokozuna # The Longest word = accomplishment. # # '指定したファイルで、最も辞書順(ASCIIコード順)で最初に出てくる単語と、最後に出てくる単語を見つけて表示せよ。また、最も長い単語も表示せよ'(_ファイル) :- get_lines(_ファイル,Lines), concat_atom(Lines,' ',_文字列), split(_文字列,[' ','\t'],L1), sort(L1,L), '最初に出てくる単語と、最後に出てくる単語を見つけて表示せよ。また、最も長い単語も表示せよ'(L). '最初に出てくる単語と、最後に出てくる単語を見つけて表示せよ。また、最も長い単語も表示せよ'(L) :- 最初に出てくる単語(L,_最初に出てくる単語), 最後に出てくる単語(L,_最後に出てくる単語), 最も長い単語も表示せよ'(L,_最も長い単語), 表示する(_最初に出てくる単語,_最後に出てくる単語,_最も長い単語). 最初に出てくる単語([_最初に出てくる単語|_],_最初に出てくる単語). 最後に出てくる単語(L,_最後に出て切る単語) :- append(_,[_最後に出てくる単語],L). 最も長い単語も表示せよ(L,_最も長い単語) :- 最も長い単語も表示せよ(L,0,'',_最も長い単語). 最も長い単語も表示せよ([],_,_最も長い単語,_最も長い単語) :- !. 最も長い単語も表示せよ([_単語|R],_これまでの最長文字数,_これまでの最長文字列,_最も長い単語) :- atom_length(_単語,_文字数), _文字数 > _これまでの最長文字数, 最も長い単語も表示せよ(R,_文字数,_単語,_最も長い単語),!. 最も長い単語も表示せよ([_|R],_これまでの最長文字数,_これまでの最長文字列,_最も長い単語) :- 最も長い単語も表示せよ(R,_これまでの最長文字数,_これまでの最長文字列,_最も長い単語). 表示する(_最初に出てくる単語,_最後に出てくる単語,_最も長い単語) :- writef('最初に出てくる単語 = %t\n最後に出てくる単語 = %t\n_最も長い単語 = %t\n',[_最初に出てくる単語,_最後に出てくる単語,_最も長い単語]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/929 # # AをB、BをC・・・と # アルファベットをひとつずつずらすには、どうやって書いたらいいでしょうか? # サクラエディタでの置換を考えてます # # 'AをB、BをC・・・とアルファベットをひとつずつずらす'(_文字列,_アルファベットをひとつずつずらされた文字列) :- findall(_ずらした文字,( sub_atom(_文字列,_,1,_,_文字), アルファベットをひとつずらす(_文字,_ずらした文字)), L), concat_atom(L,_アルファベットをひとつずらされた文字列). アルファベットをひとつずらす(_文字,_ずらした文字) :- append(_,[_文字,_ずらした文字|_],[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]),!. アルファベットをひとつずらす(_文字,_ずらした文字) :- append(_,[_文字,_ずらした文字|_],['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y',Z']),!. アルファベットをひとつずらす(_文字,_文字). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/916 # # 質問です。 # # 数字と文字が混在する文字列の中から、数字だけを取り出すことは可能でしょうか? # (ただし、複数個の数字文字列としてではなく、一つの文字列として取り出す場合) # # 例えば # 「a12b3cd456efg」から「123456」を取り出す # (「12」と「3」と「456」ではなく) # # '数字と文字が混在する文字列の中から、数字だけを取り出す。ただし、複数個の数字文字列としてではなく、一つの文字列として取り出す'(_文字列,_数字文字列) :- findall(_数字,( sub_atom(_文字列,_,1,_,_文字), member(_文字,['0','1','2','3','4','5','6','7','8','9'])), L), concat_atom(L,_数字文字列). % 以下のサイトは バイナリファイル (標準入力) に一致しました % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/865 # # ../test/read.cgi/tech/1301067486/864 失礼しました # # ●正規表現の使用環境 # psstpsstというリネームソフト(Perl互換) # # ●検索か置換か? # 置換 # # ●説明 # 最大4桁で書かれた数字部分を3桁に統一したい # # ●対象データ # ABCA01.txt # BCAA2.txt # CABA0255.txt # # ●希望する結果 # AAA001.txt # AAA002.txt # AAA255.txt # # どうぞよろしくおねがいします # # 最大4桁で書かれた数字部分を3桁に統一したい(_文字列,_固定部分ファイル名,_置換された文字列) :- sub_atom(Line,_,_,_,S1,S2,S3,L1,L2,L3), ファイル部分の特定(S1,L2,L2_0,L2_1), 最大4桁で書かれた数字部分を3桁に統一したい(_固定部分ファイル名,S1,L2_0,L2_1,S3,_置換された文字列). ファイル部分の特定(S1,L2,L2_0,L2_1) :- \+((sub_atom(S1,_,1,0,A),ファイルを構成する文字(A))), append(L2_0,L2_1,['.',t,x,t],L2), すべて数字(L2_1), last(L2_0,B), \+(数字(B)). 最大4桁で書かれた数字部分を3桁に統一したい(_固定部分ファイル名,S1,L2_1,S3,_置換された文字列) :- 三桁の数字に変換する(L2_1,_三桁の数字列), concat_atom([S1,_固定部分ファイル名,_三桁の数字列,'.txt',S3],_置換された文字列). 最大4桁で書かれた数字部分を3桁に統一したい(_固定部分ファイル名,S1,L2_1,S3,_置換された文字列) :- 最大4桁で書かれた数字部分を3桁に統一したい(S3,_固定部分ファイル名,_置換された文字列_1), concat_atom([S1,_固定部分ファイル名,_三桁の数字列,'.txt',_置換された文字列_1],_置換された文字列). ファイルを構成する文字(A) :- 数字(A),!. ファイルを構成する文字(A) :- A @>= 'A', A @=< 'Z',!. ファイルを構成する文字(A) :- A @>= 'a', A @=< 'z',!. ファイルを構成する文字(A) :- member(A,['-','_','#','$','~','&']),!. 数字(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']). 全て数字([]). 全て数字([A|R]) :- 数字(A), 全て数字(R). 三桁の数字に変換する(L,_三桁の数字) :- concat_atom(['0','0','0'|L],S1), sub_atom(S1,_,3,0,_三桁の数字). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/163 # # [1] 授業単元:C言語による基礎 # [2] 問題文(含コード&リンク): # 以下の実行例のように,文字列を入力すると,その前 # 後に"を付けた文字列を生成するプログラムを,ライブ # ラリ関数strcpy とstrcat を用いて作成せよ.ただし, # プログラムは以下の要件を満たすこととする. # ? ユーザに入力させる文字列を格納する配列を # str1[],前後に"を付けた文字列のための配列を # str2[] とする. # ? ユーザに入力させる文字列は30 字までとする. # ? 配列str2[] は初期化せずに宣言し,ライブラリ関 # 数strcpy とstrcat を使って(添字演算子[] を # 使わずに)前後に"を付けた文字列を生成すること. # # '文字列を入力すると,その前後に"を付けた文字列を生成する' :- '文字列を入力すると'(_文字列), 'その前後に"を付けた文字列を生成する'(_文字列,_前後に付加された文字列), writef('前後に %t を付加された文字列は %t です。\n',['"',_前後に付加された文字列]). '文字列を入力すると'(_文字列) :- write('文字列を入力して下さい : '), rawmode, '改行が来るか30文字に達するまで文字を入力する'(_文字,[],_文字ならび), norawmode, concat_atom(_文字ならび,_文字列). '改行が来るか30文字に達するまで文字を入力する'(['\n'|_文字ならび_1],_文字ならび) :- reverse(_文字ならび_1,_文字ならび),!. '改行が来るか30文字に達するまで文字を入力する'(_文字ならび_1,_文字ならび) :- length(_文字ならび_1,30), reverse(_文字ならび_1,_文字ならび),!. '改行が来るか30文字に達するまで文字を入力する'(_文字ならび_1,_文字ならび) :- get_char(_文字), '改行が来るか30文字に達するまで文字を入力する'([_文字|_文字ならび_1],_文字ならび). 'その前後に"を付けた文字列を生成する'(_文字列,_前後に付加された文字列) :- concat_atom(['"',_文字列,'"'],_前後に付加された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/128 # # 1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 1番:コマンドライン引数を用いて2つの10進数を入力し, # その2つの数を2進数表示したものについて,論理和,論理積, # 排他的論理和,を表示するプログラムを作成せよ。 # また,2進数で直接入力して計算できるようにせよ。 # # 2番:1番で求めた論理和,論理積,排他的論理和について、 # 指定したビット目の値、連続する0の数および1の数をそれぞれ数えて # 交互に表示するプログラムを作成せよ。 # # 3番目:1番で求めた論理和,論理積,排他的論理和について、 # 4桁ずつ区切って16進数で表示するプログラムを作成せよ. # # 例: # 論理和 : 000111101001001 # 1番目の区切り:0001 = 1 # 2番目の区切り:1110 = e # 3番目の区切り:1001 = 9 # 4番目の区切り:001 = 1 # '4桁ずつ区切って16進数で表示する'(L) :- '4桁ずつ区切って16進数で表示する'(_n,L). '4桁ずつ区切って16進数で表示する'(_n,L) :- length(L0,4), append(L0,L1,L), 表示する(_n,L0), _n_2 is _n + 1, '4桁ずつ区切って16進数で表示する'(_n_2,L1). '4桁ずつ区切って16進数で表示する'(_n,L) :- 表示する(_n,L). 表示する(_n,L) :- '16進数表示'(L,_16進数表示), concat_atom(L,_2進数表示), writef('%t番目の区切り : %t = %t\n',[_n,_2進数表示,_16進表示]),!. '16進数表示'([1,0,1,0],a) :- !. '16進数表示'([1,0,1,1],b) :- !. '16進数表示'([1,1,0,0],c) :- !. '16進数表示'([1,1,0,1],d) :- !. '16進数表示'([1,1,1,0],e) :- !. '16進数表示'([1,1,1,1],f) :- !. '16進数表示'([A,B,C,D],N) :- N is A * 8 + B * 4 + C * 2 + D,!. '16進数表示'(L,N) :- '16進数表示'(L,0,N). '16進数表示'([],N,N). '16進数表示'([B|R],N_1,N) :- N_2 is N_1 * 2 + B, '16進数表示'(R,N_2,N). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/128 # # 1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 1番:コマンドライン引数を用いて2つの10進数を入力し, # その2つの数を2進数表示したものについて,論理和,論理積, # 排他的論理和,を表示するプログラムを作成せよ。 # また,2進数で直接入力して計算できるようにせよ。 # # 2番:1番で求めた論理和,論理積,排他的論理和について、 # 指定したビット目の値、連続する0の数および1の数をそれぞれ数えて # 交互に表示するプログラムを作成せよ。 # # 3番目:1番で求めた論理和,論理積,排他的論理和について、 # 4桁ずつ区切って16進数で表示するプログラムを作成せよ. # # 例: # 論理和 : 000111101001001 # 1番目の区切り:0001 = 1 # 2番目の区切り:1110 = e # 3番目の区切り:1001 = 9 # 4番目の区切り:001 = 1 # ビット目の指定(_ならび,_nビット目,_nビット目の値) :- nth1(_nビット目,_ならび,_nビット目の値). '連続する0の数および1の数をそれぞれ数えて交互に表示する'(L) :- '連続する0の数および1の数をそれぞれ数えて'(L,L2), concat_atom(L2,',',_表示文字列), writef('%t\n',[_表示文字列]). '連続する0の数および1の数をそれぞれ数えて'(L,[Len|R2]) :- append(L0,[A|R],L), \+(member(A,L0)), length(L0,Len), '連続する0の数および1の数をそれぞれ数えて'([A|R],R2). '連続する0の数および1の数をそれぞれ数えて'(L,[Len]). length(L,Len). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/111 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):テキストファイルを読み込み1次元の離散コサイン変換を行って、その結果を新たなテキストファイルに書き込むプログラムを作れ。 # # [5] その他の制限: 例 10,15,20,80,120,160,210,10,20,100...と続く # テキストデータ3つ(data.txt data2.txt data3.txt)を(それぞれ内容は違う)読み込む。 # それぞれに1次元の離散コサイン変換を行う。 # 変換後の値を新たなテキストファイルに(data,data2,data3)改行(data,data2,data3)改行...といったような表示で書き込む。 'テキストファイルを読み込み1次元の離散コサイン変換を行って、その結果を新たなテキストファイルに書き込む'(_テキストファイル名,_出力ファイル名) :- get_lines(_テキストファイル名,Lines), データ要素のならびとする(Lines,_要素ならび), '1次元の離散コサイン変換'(L1,L2), '新たなテキストファイルに書き込む'(_出力ファイル名,L2). データ要素のならびとする(Lines,_要素ならび) :- concat_atom(Lines,',',S), split(S,[',',' '],_要素ならび). '1次元の離散コサイン変換'(L1,L2) :- append([_第一要素],L,[_最終要素],L1), length(L1,N), '1次元の離散コサイン変換'(L,L,N,-1,_第一要素,_最終要素,L2). '1次元の離散コサイン変換'([],_,_,_,_第一要素,_最終要素,[]). '1次元の離散コサイン変換'([M|R1],L,N,-1,_第一要素,_最終要素,[Xk|R2]) :- findsum(U,( append(_,[B|_],L), length([_|L0],K), U is _最終要素 * cos(pi/(M-1) * N * K)), Sum), Xk is _第一要素/2 + Sum + ((-1) / 2) * (_最終要素-1)), '1次元の離散コサイン変換'(R1,L,N,1,_第一要素,_最終要素,R2). '1次元の離散コサイン変換'([M|R1],L,N,1,_第一要素,_最終要素,[Xk|R2]) :- findsum(U,( append(L0,[B|_],L), length([_|L0],K), U is _最終要素 * cos((pi / (M-1)) * N * K), Sum), Xk is _第一要素/2 + Sum + ((1 / 2) * (_最終要素-1)), '1次元の離散コサイン変換'(R1,L,N,-1,_第一要素,_最終要素,R2). '新たなテキストファイルに書き込む'(_テキストファイル名,L) :- open(_テキストファイル名,write,Outstream), append(_,[A|R],L), writef(Outstream,'%t,',[A]), R = [B], writef(Outstream,'%t\n',[B]), close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/822 # # [1] 授業単元:c言語プログラミング # [2] 問題文(含コード&リンク):(1,2,3) (1,2,4)...といった数列が続くのlist.txtを読み込み、 # 左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむプログラムを作りなさい。 # (この場合、左が1と1かつ真ん中が2と2で右が3と4なので4の方が大きいので(1,2,4)を削除する) # '(1,2,3) (1,2,4)...といった数列が続くのlist.txtを読み込み、左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ' :- get_chars('list.txt',Chars), '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ'(Chars). '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し、link2.txtに書きこむ'(Chars) :- ならびに変換(Chars,LL1), '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し'(LL1,LL2), 'link2.txtに書きこむ'(LL2). ならびに変換([],[]). ならびに変換(['('|R1],[[A,B,C]|R2]) :- append(L0,[)|R3],R1), concat_atom(L0,S), atom_to_term(S,(A,B,C),_), ならびに変換(R3,R2),!. ならびに変換([_|R1],R2) :- ならびに変換(R1,R2). '左の数字が同じかつ真ん中の数字も同じとき、右の数字が大きいものを削除し'(LL1,LL2) :- 左の数字と真ん中の数字でグループを作る(LL1,LL3), グループの中の最小ならびを蒐める(LL3,LL2). 左の数字と真ん中の数字でグループを作る(LL1,LL3) :- findsetof([A,B],( append(_,[[A,B,_]|_],LL1)), LL3). グループの中の最小ならびを蒐める(LL3,LL2) :- findall(L,( グループの中での最小ならび(LL3,L)), LL2). グループの中での最小ならび(LL3,L) :- append(_,[[A,B]|_],LL3), findmin([A,B,C],( append(_,[[A,B,C]|_],LL1)), L). 'link2.txtに書きこむ'(LL2) :- open('link2.txt',write,Outstream), 'link2.txtに書きこむ'(Outstream,LL2), close(Outstream). 'link2.txtに書きこむ'(Outstream,LL2) :- append(_,[[A,B,C]|R],LL2), writef(Outstream,'(%t,%t,%t) ',[A,B,C]), R = [], 最後に改行(Outstream). 最後に改行(Outstream) :- write(Outstream,'\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/707 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # 名前(char name[20])と点数(int score)からなる構造体の配列を作る. # 件数(10以下)をキーボード入力後、その件数だけ名前と点数をキーボード入力して配列に格納し, # 点数の平均点と、平均点以上の学生の名前を表示するプログラムを作成せよ. # なお,文字列aと整数bを同時にキーボード入力するには、scanf("%s %d",a,&b)とすればよい(文字列変数には&がいらない). # # 実行例 # $./kadai # n? 5 # name score? taro 52 # name score? jiro 84 # name score? saburo 38 # name score? hanako 63 # name score? youko 72 # Average:61 # Above average:jiro hanako youko # # ヒント # struct student { # char name[20]; # int score; # } student; # # scanf("%s %d",student.name, &student.score); # '件数(10以下)をキーボード入力後、その件数だけ名前と点数をキーボード入力して配列に格納し,点数の平均点と、平均点以上の学生の名前を表示する' :- '件数(10以下)をキーボード入力'(_件数), 'その件数だけ名前と点数をキーボード入力して配列に格納し'(_件数), '点数の平均点と、平均点以上の学生の名前を表示する'. '点数の平均点と、平均点以上の学生の名前を表示する' :- 点数の平均点(_平均点), 平均点以上の学生の名前を表示する(_平均点), fail. '点数の平均点と、平均点以上の学生の名前を表示する'. 平均点以上の学生の名前を表示する(_平均点) :- 名前と得点(_名前,_得点), _得点 >= _平均点, writef('平均点%t以上の名前は : %t\n',[_名前]),!. 点数の平均点(_平均点) :- findavg(_点数,( 名前と得点(_名前,_得点)), _平均点). '件数(10以下)をキーボード入力'(_件数) :- 催促付き整数入力('件数を入力して下さい(10以下) : ',_件数), _件数 =< 10,!. '件数(10以下)をキーボード入力'(_件数) :- '件数(10以下)をキーボード入力'(_件数). 'その件数だけ名前と点数をキーボード入力して配列に格納し'(0) :- !. 'その件数だけ名前と点数をキーボード入力して配列に格納し'(_件数) :- 名前と点数の入力(_名前,_点数), assertz(名前と点数(_名前,_点数)), _件数_1 is _件数 - 1, 'その件数だけ名前と点数をキーボード入力して配列に格納し'(_件数_1). 名前と点数の入力(_名前,_点数) :- write('名前と点数をカンマ区切りて入力して下さい : '), readln(L), 名前と点数の入力(L,_名前,_点数),!. 名前と点数の入力(_名前,_点数) :- 名前と点数の入力(_名前,_点数). 名前と点数の入力([_名前,_点数],_名前,_点数) :- !. 名前と点数の入力([_名前1,_名前2,_点数],_名前,_点数) :- concat_atom([_名前1,_名前2],' ',_名前). 名前と点数の入力(L,_,_) :- writef('入力データの解析結果は%tで名前,点数が得られません。再入力をお願いします。\n',[L]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/707 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # 名前(char name[20])と点数(int score)からなる構造体の配列を作る. # 件数(10以下)をキーボード入力後、その件数だけ名前と点数をキーボード入力して配列に格納し, # 点数の平均点と、平均点以上の学生の名前を表示するプログラムを作成せよ. # なお,文字列aと整数bを同時にキーボード入力するには、scanf("%s %d",a,&b)とすればよい(文字列変数には&がいらない). # # 実行例 # $./kadai # n? 5 # name score? taro 52 # name score? jiro 84 # name score? saburo 38 # name score? hanako 63 # name score? youko 72 # Average:61 # Above average:jiro hanako youko # # ヒント # struct student { # char name[20]; # int score; # } student; # # scanf("%s %d",student.name, &student.score); # '件数(10以下)をキーボード入力後、その件数だけ名前と点数をキーボード入力して配列に格納し,点数の平均点と、平均点以上の学生の名前を表示する' :- '件数(10以下)をキーボード入力'(_件数), 'その件数だけ名前と点数をキーボード入力して配列に格納し'(_件数,_名前と点数構造ならび), '点数の平均点と、平均点以上の学生の名前を表示する'(_名前と点数構造ならび). '件数(10以下)をキーボード入力'(_件数) :- 催促付き整数入力('件数を入力して下さい(10以下) : ',_件数), _件数 =< 10,!. '件数(10以下)をキーボード入力'(_件数) :- '件数(10以下)をキーボード入力'(_件数). 'その件数だけ名前と点数をキーボード入力して配列に格納し'(0,[]) :- !. 'その件数だけ名前と点数をキーボード入力して配列に格納し'(N,[(名前(_名前),点数(_点数))|R]) :- 名前と点数の入力(_名前,_点数), N_1 is N - 1, 'その件数だけ名前と点数をキーボード入力して配列に格納し'(N_1,R). 名前と点数の入力(_名前,_点数) :- write('名前と点数をカンマ区切りて入力して下さい : '), readln(L), 名前と点数の入力(L,_名前,_点数),!. 名前と点数の入力(_名前,_点数) :- 名前と点数の入力(_名前,_点数). 名前と点数の入力([_名前,_点数],_名前,_点数) :- !. 名前と点数の入力([_名前1,_名前2,_点数],_名前,_点数) :- concat_atom([_名前1,_名前2],' ',_名前). 名前と点数の入力(L,_,_) :- writef('入力データの解析結果は%tで名前,点数が得られません。再入力をお願いします。\n',[L]), fail. '点数の平均点と、平均点以上の学生の名前を表示する'(_名前と点数構造ならび) :- 点数の平均点(_名前と点数構造ならび,_平均点), writef('平均点は %t です\n',[_平均点]), 平均点以上の学生の名前を表示する(_平均点,_名前と点数構造ならび), 平均点以上の学生の名前を表示する(_,[]). 平均点以上の学生の名前を表示する(_平均点,[(名前(_名前),点数(_点数))|R]) :- _点数 >= _平均点, writef('平均点%t以上の生徒: %t\n',[_平均点,_名前]), 平均点以上の学生を表示する(_平均点,R). 平均点以上の学生の名前を表示する(_平均点,[_|R]) :- 平均点以上の学生の名前を表示する(_平均点,R). 点数の平均点(_名前と点数構造ならび,_平均点) :- length(_名前と点数構造ならび,_標本数), 点数の合計(_名前と点数構造ならび,_合計), _平均点 is _合計 / _標本数. 点数の合計([],0). 点数の合計([(名前(_),点数(_点数))|R],_点数合計) :- 点数の合計(R,_点数合計_1), _点数合計 is _点数 + _点数合計_1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/711 # # [1] 授業単元:リスト構造 # [2] 問題文(含コード&リンク): # malloc関数とリスト構造を使い、ファイルから二行の多桁整数を読み取る。 # それを4桁ずつリスト構造に格納し、加算を行うプログラムを作れ。 # # 口頭で出題された問題なので、おかしい部分があったらすみません。 # 'ファイルから二行の多桁整数を読み取る。それを4桁ずつリスト構造に格納し、加算を行う'(_ファイル名,_4桁ずつリストの加算値) :- 'ファイルから二行の多桁整数を読み取る'(_ファイル名,_多桁整数), 'それを4桁ずつリスト構造に格納し'(_多桁整数,_4桁ずつリスト), 加算を行う(_4桁ずつリスト,_加算値). 'ファイルから二行の多桁整数を読み取る'(_ファイル名,_多桁整数) :- get_lines(_ファイル名,[_第一行,_第二行|_]), concat_atom([_第一行,_第二行],_結合した文字列), atom_to_term(_結合した文字列,_多桁整数,_). 'それを4桁ずつリスト構造に格納し'(_多桁整数,_4桁ずつリスト) :- 'それを4桁ずつリスト構造に格納し'(_多桁整数,[],_4桁ずつリスト). 'それを4桁ずつリスト構造に格納し'(0,L,L) :- !. 'それを4桁ずつリスト構造に格納し'(N,L1,L) :- M is N mod 10000, N_1 is N // 10000, 'それを4桁ずつリスト構造に格納し'(N_1,[M|L1],L). 加算を行う([],0). 加算を行う([N|R],S) :- 加算を行う(R,S_1), S is N + S_1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/712 # # [1] 授業単元: C言語実習 # [2] 問題文(含コード&リンク): # 整数値を読み取り,4桁毎に 兆,億,万 を挿入して表示せよ. # # 例 # 入力:114514 # 出力:11万4514 # 入力:810 # 出力:810 # # '整数値を読み取り,4桁毎に 兆,億,万 を挿入して表示する' :-  整数値を読み取り(_整数値), '4桁毎に 兆,億,万 を挿入して表示する'(_整数値). '4桁毎に 兆,億,万 を挿入して表示する'(_整数値) :- number_chars(_整数値,Chars), '4桁毎に 兆,億,万 を挿入して'([[兆,12],[億,8],[万,4]],Chars,Chars2), 表示する(Chars2). '4桁毎に 兆,億,万 を挿入して'([],Chars_1,Chars_2) :- 頭部のゼロならびを取り除く(Chars_1,Chars_2),!. '4桁毎に 兆,億,万 を挿入して'([[_単位,_桁]|R],Chars_1,Chars_2) :- length(L2,_桁), append(L1,L2,Chars_1), 頭部のゼロならびを取り除く(L1,L1_2), \+(L1_2 = []), '4桁毎に 兆,億,万 を挿入して'(R,L2,Chars_1_2), append(L1_2,[_単位|Chars_1_2],Chars_2),!. '4桁毎に 兆,億,万 を挿入して'([[_,_桁]|R],Chars_1,Chars_2) :- length(L2,_桁), '4桁毎に 兆,億,万 を挿入して'(R,L2,Chars_2),!. '4桁毎に 兆,億,万 を挿入して'([_|R],Chars_1,Chars_2) :- '4桁毎に 兆,億,万 を挿入して'(R,Chars_1,Chars_2). 頭部のゼロならびを取り除く([0,0,0,0],[]) :- !. 頭部のゼロならびを取り除く([0,0,0|R],R) :-!. 頭部のゼロならびを取り除く([0,0|R],R) :-!. 頭部のゼロならびを取り除く([0|R],R) :-!. 整数値を読み取り(_整数値) :- writef('整数を入力して下さい : '), get_line(Line), 整数値読み取り診断(Line,_整数値),!. 整数値を読み取り(_整数値) :- 整数値を読み取り(_整数値). 整数値を読み取り診断(Line,_整数値) :- atom_to_term(Line,_整数値,_), integer(_整数値),!. 整数値を読み取り診断(Line,_整数値) :- writef('入力された %t からは整数値が得られません。再入力をお願いします。\n',[Line]), fail. 表示する(_単位を挿入された整数ならび) :- concat_atom(_単位を挿入された整数ならび,_表示文字列), writef('%t\n',[_表示文字列]). % % いつも通り文字ならびに変換した結果迷走した。 % こんな問題は単純に整数のまま処理した方がいい。 http://nojiriko.asia/prolog/c153_712_1.html % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1294641578/703 # # 年代別集計をしたく以下のようにしていますが # 結果が0でもその年代も表示したいのですができませんでしょうか? # # SELECT CASE # when r.age between 0 and 9 then '0 - 9' # when r.age between 10 and 19 then '10 - 19' # when r.age between 20 and 29 then '20 - 29' # when r.age between 30 and 39 then '30 - 39' # when r.age between 40 and 49 then '40 - 49' # when r.age between 50 and 59 then '50 - 59' # when r.age between 60 and 69 then '60 - 69' # when r.age between 70 and 79 then '70 - 79' # when r.age between 80 and 89 then '80 - 89' # when r.age between 90 and 99 then '90 - 99' # when r.age >=100 then '100' # end AS "age_group" # ,COUNT(CASE # when r.age between 0 and 9 then '0 - 9' # when r.age between 10 and 19 then '10 - 19' # when r.age between 20 and 29 then '20 - 29' # when r.age between 30 and 39 then '30 - 39' # when r.age between 40 and 49 then '40 - 49' # when r.age between 50 and 59 then '50 - 59' # when r.age between 60 and 69 then '60 - 69' # when r.age between 70 and 79 then '70 - 79' # when r.age between 80 and 89 then '80 - 89' # when r.age between 90 and 99 then '90 - 99' # when r.age >=100 then '100' # end) AS "age_count" # FROM rank as r # GROUP BY age_group # ORDER BY age_group; # # '年代別集計を結果が0でも表示する' :- findall([_年代別表示,_度数],( for(0,N,10), 年代別に集計する(N,_年代別表示,_度数)), LL), 表示する(LL). 年代別に集計する(10,'100才以上',_度数) :- '100才以上を集計する'(_度数),!. 年代別に集計する(N,_年代別表示,_度数) :- _年齢下限 is N * 10, _年齢上限 is _年齢下限 + 9, 年齢範囲の集計(_年齢下限,_年齢上限,_度数), concat_atom([_年齢下限,才,'-',_年齢上限,才],_年代別表示). '100才以上を集計する'(_度数) :- count(( rank(_age), _age >= 100), _度数). 年齢範囲の集計(_年齢下限,_年齢上限,_度数) :- count(( rank(_age), _age >= _年齢下限, _age =< _年齢上限), _度数). 表示する(LL) :- append(_,[[_年代別表示,_度数]|R],LL), writef('%t,%t\n',[_年代別表示,_度数]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/672 # # [1] 授業単元: C言語プログラミング(文字列生成・操作) # [2] 問題文(含コード&リンク): # 以下の実行例のように,姓と名を入力すると,2 つの # 間にスペースを入れて連結した文字列を生成するプロ # グラムを作成せよ.姓と名はそれぞれ配列family[] と # first[] に,連結した文字列は配列fullname[] に格納 # すること.入力できる姓と名の長さはそれぞれ30 字ま # でとする. # # 実行例. # Family name: Roku # First name: Dai # Roku Dai # # '姓と名を入力すると,2つの間にスペースを入れて連結した文字列を生成する' :- 姓と名を入力すると(_姓,_名), '2 つの間にスペースを入れて連結した文字列を生成する'(_姓,_名,_2つの間にスペースを入れて連結した文字列), 表示形式を指定して出力('%t\n',[_2つの間にスペースを入れて連結した文字列]). 姓と名を入力すると(_姓,_名) :- 姓の入力(_姓), 名の入力(_名). 姓の入力(_姓) :- 催促付き入力('姓を入力して下さい : ',_姓). 名の入力(_名) :- 催促付き入力('名を入力して下さい : ',_名). '2 つの間にスペースを入れて連結した文字列を生成する'(_姓,_名,_2つの間にスペースを入れて連結した文字列) :- 文字列連結([_姓,' ',_名],_2つの間にスペースを入れて連結した文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 催促付き入力(_催促文,_入力文字列) :- write('_催促文'), get_line(_入力文字列). 表示形式を指定して出力(_表示形式,_出力値ならび) :- writef(_表示形式,_出力値ならび). 文字列連結(_連結する値ならび,_連結した文字列) :- concat_atom(_連結する値ならび,_連結した文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/624 # # [1] 授業単元:リスト構造体 # [2] 問題文(含コード&リンク): # enqueue()とdequeue()を用いて実行結果が # # Please input E(登録) or D(削除): E # Input number and name: 8 Nakamura # Please input E(登録) or D(削除): E # Input number and name: 3 Saito # Please input E(登録) or D(削除): D # Number=8 Name=Nakamura # Please input E(登録) or D(削除): D # Number=3 Name=Saito # Please input E(登録) or D(削除): D # No Data! # Please input E(登録) or D(削除): E # ・ # ・ # ・ # のように動作するプログラムを作成せよ # 'enqueue()とdequeue()を用いて実行' :- start_queue, 要求の取得(_要求), 'enqueue()とdequeue()を用いて実行'(_要求). 要求の取得(_要求) :- write('Please input E(登録) or D(削除): '), get_line(_要求),!. 'enqueue()とdequeue()を用いて実行'(q) :- !. 'enqueue()とdequeue()を用いて実行'('E') :- enqueue, fail. 'enqueue()とdequeue()を用いて実行'('D') :- dequeue, fail. 'enqueue()とdequeue()を用いて実行'(_) :- 要求の取得(_要求), 'enqueue()とdequeue()を用いて実行'(_要求). start_queue :- キューの生成(一時的). enqueue :- write('Input number and name: ' 'Input number and name'(_number,_name), キューに追加(一時的,[_number,_name]). 'Input number and name'(_number,_name) :- readln([_number,_name]). dequeue :- キューからの取り出し(一時的,_値), dequeue(_項), dequeue診断(_項,_診断), writef('%t\n',[_診断]). dequeue診断([],' No Data!') :- !. dequeue診断([_number,_name],_表示文字列) :- concat_atom(['nunmber = ',_number,' name = ',_name],_表示文字列). キューの生成(_キューの名前) :- キュー(_キューの名前,_), writef('%tというキューは既に存在します。登録できません。\n',[_キューの名前]),!. キューの生成(_キューの名前) :- asserta(キュー(_キューの名前,[])). キューからの取り出し(_キューの名前,_取り出した項) :- retract(キュー(_キューの名前,[_項|R])), asserta(キュー(_キューの名前,R)),!. キューからの取り出し(_キューの名前,[]). キューへの追加(_キュー名,_追加する項) :- retract(キュー(_キューの名前,_キュー)), append(_キュー,[_追加する項],_追加されたキュー), asserta(キュー(_キューの名前,_追加されたキュー)). キューを空にする(_キュー名) :- retract(キュー(_キューの名前,_)), asserta(キュー(_キューの名前,[])). % % キューは引数内の論理変数として重リストを使って定義し、 % それを更新しながら持ちまわるのが普通だが、 % ここでは愚直に、キューを述語としてassertし、reatract/assertを % 繰り返して値を出入りさせる述語群を定義してみた。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/548 # # 1] 授業単元:画像処理 # [2] 問題文(含コード&リンク): # text.txtを読み取って0なら空白を、1なら*を表示するプログラム(test.c)がある。 # これを改良してtest.txtをtext.bmpに変換するプログラムを作れ。 # (ただし、0を白色、1を黒色とする。) # test.c # http://ime.nu/codepad.org/Xk3b2CZq # # /********test.txtの中身********** # 11 6 # 0 1 1 1 1 1 0 0 0 0 0 # 0 1 0 1 1 0 1 0 0 0 1 # 0 1 1 1 1 1 0 0 0 0 0 # 0 1 0 0 1 1 0 1 0 0 1 # 0 1 1 1 0 1 0 0 0 0 0 # 0 1 1 0 0 1 0 0 0 0 0 # ******************************/ # # 'text.txtを読み取って0なら空白を、1なら*を表示する' :- 'text.txtを読み取って'(_行数,_列数,_残り画像部Lines), '0なら空白を、1なら*を表示する'(_行数,_列数,_残り画像部Lines). 'text.txtを読み取って'(_行数,_列数,_残り画像部Lines) :- get_line('text.txt',Lines), 行数と列数を得る(Lines,_行数,_列数,_残り画像部Lines). 行数と列数を得る(Lines,_行数,_列数,_残り画像部Lines) :- Lines = [_第一行|_残り画像部Lines), split(_第一行,[' '],[_列数,_行数]). '0なら空白を、1なら*を表示する'(_行数,_列数,_残り画像部Lines) :- '残り画像部Linesを0,1ならびに変換'(_残り画像部Lines,_0_1_ならび), '行を切り取りながら0なら空白を、1なら*を表示する'(_行数,_列数,_0_1_ならび). '残り画像部Linesを0,1ならびに変換'(_残り画像部Lines,_0_1_ならび) :- concat_atom(_残り画像部Lines,_画像部文字列), split(_画像部文字列,[' '],_0_1_ならび). '行を切り取りながら0なら空白を、1なら*を表示する'(0,_,_). '行を切り取りながら0なら空白を、1なら*を表示する'(_行数,_列数,_0_1_ならび) :- 行データを切り取る(_列数,_0_1_ならび,_行データ,_残り_0_1_ならび), 行データを変換して表示する(_行データ), _行数_1 is _行数 - 1, '行を切り取りながら0なら空白を、1なら*を表示する'(_行数_1,_列数,_残り_0_1_ならび),!. 行データを切り取る(_列数,_0_1_ならび,_行データ,_残り_0_1_ならび) :- length(_行データ,_列数), append(_行データ,_残り_0_1_ならび,_0_1_ならび),!. 行データを変換して表示する(_行データ) :- append(_,[_0または1|R],_行データ), '0なら空白を、1なら*を表示する'(_0または1), 一行表示し終わったら改行する(R). '0なら空白を、1なら*を表示する'(0) :- write(' '). '0なら空白を、1なら*を表示する'(1) :- write('*'). 一行表示し終わったら改行する([]) :- write('\n'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/399 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):http://ime.nu/i.imgur.com/UwzPZ.jpg # # # 下の例のような、学生の4科目の(数学、物理、科学、英語)の試験点数(100点満点)を # 書いたファイルがある。(学生数は100名以下) # # ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、 # 各科目の平均点を表示するプログラムを作成する。 # # ・ 科目名(6文字未満)を入れる文字列(文字の一次元配列)を4つ用意する。 # # ・ 学籍番号と点数を一緒に入れる二次元整数配列を用意する # 例 int tensu[ ? ][ ? ] # # 最初に二次元配列を表示して、実行例のように点数を表示し、次に各学生の # 平均点、各科目の平均点を表示する。 # # ただし、ファイルの先頭には学生数(この例では5名)があり、つぎに4科目の # 科目名(数学、物理、科学、英語)が記述され、続いて、1行目に指定した学生数分 # の学籍番号と各試験点数が書かれている。 # # # ファイルの例(5名の例) # # 5 # Math Phys Chem Eng # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 表示例 # # 点数 :::: # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 学生平均 :::: # 8001 : 80.0 # 8004 : 48.25 # 8013 : 85.50 # 8035 : 81.25 # 8062 : 47.25 # # 科目平均 # 数学 : 69.8 # 物理 : 65.0 # 科学 : 69.0 # 英語 : 70.0 # 'ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_ファイル名) :- 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび), '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび). 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- get_lines(_ファイル名,Lines), 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数), 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび), '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび),!. 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数) :- Lines = [_学生数文字列|_], atom_to_term(_学生数文字列,_学生数,_), integer(_学生数),!. 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび) :- Lines = [_,_二行目文字列|_], split(_二行目文字列,[' ',','],_科目名ならび),!. '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび) :- length(_学籍番号と各試験点数ならび,_学生数), Lines = [_,_|_残りLines], findall(_学籍番号と各点数,( append(_,[_学籍番号と各点数文字列|_],_残りLines), aplit(_学籍番号と各点数文字列,[' ',','],_学籍番号と各点数)), _学籍番号と各試験点数ならび). '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- 学生の科目の一覧を表示(_学籍番号と各試験点数ならび), '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび). 学生の科目の一覧を表示(_学籍番号と各試験点数ならび) :- append(_,[_学籍番号と各試験点数|R],_学籍番号と各試験点数ならび), concat_atom(_学籍番号と各試験点数,' ',_表示文字列), writef('%t\n',[_表示文字列]), R = []. '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび) :- 各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび), 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点ならび), 各学生の平均点を表示する(_各学生の平均点ならび), 各科目の平均点を表示する(_各科目の平均点ならび). 各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび) :- findall([_学籍番号,_平均点],( append(_,[[_学籍番号|L]|_],_学籍番号と各試験点数ならび), 相加平均(L,_平均点)), _各学生の平均点ならび). 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点ならび) :- 転置(_学籍番号と各試験点数ならび,[_|_科目別点数ならび]), findall([_科目名,_平均点],( 科目名と点数ならびを得る(_科目名ならび,_学籍番号と各試験点数ならび,_科目名,_点数ならび), 相加平均(_点数ならび,_平均点)), _各科目の平均点ならび). 科目名と点数ならびを得る(_科目名ならび,_学籍番号と各試験点数ならび,_科目名,_点数ならび) :- append(L0,[_科目名|_],_科目名ならび), length(L0,Len), nth1(Len,_科目別点数ならび,_点数ならび). 各学生の平均点を表示する(_各学生の平均点ならび) :- write('\n学生平均 ::::\n'), append(_,[[_学籍番号,_平均点]|R],_各学生の平均点ならび), writef('%8r : %5r\n',[_学籍番号,_平均点]), R = []. 各科目の平均点を表示する(_各科目の平均点ならび) :- write('\n科目平均 ::::\n'), append(_,[[_科目名,_平均点]|R],_各科目の平均点ならび), writef('8r : %5r\n',[_科目名,_平均点]), R = []. % % http://nojiriko.asia/prolog/c153_399.html の % 各学生の平均点以下の述語定義と比較して、 % どちらが、理解しやすいかを問う。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/399 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク):http://ime.nu/i.imgur.com/UwzPZ.jpg # # # 下の例のような、学生の4科目の(数学、物理、科学、英語)の試験点数(100点満点)を # 書いたファイルがある。(学生数は100名以下) # # ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、 # 各科目の平均点を表示するプログラムを作成する。 # # ・ 科目名(6文字未満)を入れる文字列(文字の一次元配列)を4つ用意する。 # # ・ 学籍番号と点数を一緒に入れる二次元整数配列を用意する # 例 int tensu[ ? ][ ? ] # # 最初に二次元配列を表示して、実行例のように点数を表示し、次に各学生の # 平均点、各科目の平均点を表示する。 # # ただし、ファイルの先頭には学生数(この例では5名)があり、つぎに4科目の # 科目名(数学、物理、科学、英語)が記述され、続いて、1行目に指定した学生数分 # の学籍番号と各試験点数が書かれている。 # # # ファイルの例(5名の例) # # 5 # Math Phys Chem Eng # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 表示例 # # 点数 :::: # 8001 78 64 88 90 # 8004 34 40 52 67 # 8013 83 77 89 93 # 8035 98 81 69 77 # 8062 56 63 47 23 # # 学生平均 :::: # 8001 : 80.0 # 8004 : 48.25 # 8013 : 85.50 # 8035 : 81.25 # 8062 : 47.25 # # 科目平均 # 数学 : 69.8 # 物理 : 65.0 # 科学 : 69.0 # 英語 : 70.0 # 'ファイルを読んで、右のように、学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_ファイル名) :- 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび), '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび). 'ファイルを読んで'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- get_lines(_ファイル名,Lines), 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数), 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび), '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび),!. 'ファイルの先頭には学生数(この例では5名)があり'(Lines,_学生数) :- Lines = [_学生数文字列|_], atom_to_term(_学生数文字列,_学生数,_), integer(_学生数),!. 'つぎに4科目の科目名(数学、物理、科学、英語)が記述され'(Lines,_科目名ならび) :- Lines = [_,_二行目文字列|_], split(_二行目文字列,[' ',','],_科目名ならび),!. '続いて、1行目に指定した学生数分の学籍番号と各試験点数が書かれている'(Lines,_学生数,_学籍番号と各試験点数ならび) :- length(_学籍番号と各試験点数ならび,_学生数), Lines = [_,_|_残りLines], findall(_学籍番号と各点数,( append(_,[_学籍番号と各点数文字列|_],_残りLines), aplit(_学籍番号と各点数文字列,[' ',','],_学籍番号と各点数)), _学籍番号と各試験点数ならび). '学生の科目の一覧と、各学生の平均点、書く科目の平均点を表示する'(_学生数,_科目名ならび,_学籍番号と各試験点数ならび) :- write('\n'), 学生の科目の一覧を表示(_学籍番号と各試験点数ならび), '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび). 学生の科目の一覧を表示(_学籍番号と各試験点数ならび) :- append(_,[_学籍番号と各試験点数|R],_学籍番号と各試験点数ならび), concat_atom(_学籍番号と各試験点数,' ',_表示文字列), writef('%t\n',[_表示文字列]), R = []. '各学生の平均点、各科目の平均点を表示する'(_科目名ならび,_学籍番号と各試験点数ならび) :- 各学生の平均点(_学籍番号と各試験点数ならび,_各学生の平均点ならび), 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点), write('\n学生平均 ::::\n'), 各学生の平均点を表示する(_各学生の平均点ならび), write('\n科目平均 ::::\n'), 各科目の平均点を表示する(_各科目の平均点). 各学生の平均点([],[]). 各学生の平均点([[_学籍番号|L]|R1],[[_学籍番号,_平均点]|R2]) :- 相加平均(L,_平均点), 各学生の平均点(R1,R2). 各科目の平均点(_科目名ならび,_学籍番号と各試験点数ならび,_各科目の平均点) :- 転置(_学籍番号と各試験点数ならび,[_|_科目別点数ならび]), 転置された点数ならびから科目別平均点を得る(_科目名ならび,_科目別点数ならび,_各科目の平均点). 転置された点数ならびから科目別平均点を得る([],[],[]). 転置された点数ならびから科目別平均点を得る([_科目名|R1],[L|R2],[[_科目名,_平均点]|R3]) :- 相加平均(L,_平均点), 転置された点数ならびから科目別平均点を得る(R1,R2,R3). 各学生の平均点を表示する([]). 各学生の平均点を表示する([[_学籍番号,_平均点]|R]) :- writef('%8r : %5r\n',[_学籍番号,_平均点]), 各学生の平均点を表示する(R). 各科目の平均点を表示する([]). 各科目の平均点を表示する([[_科目名,_平均点]|R]) :- writef('8r : %5r\n',[_科目名,_平均点]), 各科目の平均点を表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/358 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): アルファベットと空白からなる文字列を処理する以下のような関数を作成せよ。なお各関数は処理が成功したときに1、失敗したときに0を返すものとする。 # # (3) 単語(空白で区切られた文字)の順序を反転する関数int reverse_word(char *s)を作成せよ。例: # char s[] = "abc de f ghi"; # reverse_word(s); # printf("%s¥n", s); // -> "ghi f de abc" # (ヒント: (1)や(2)で作った関数が応用できる?) # # 'アルファベットと空白からなる文字列の単語(空白で区切られた文字)の順序を反転するただし区切り形式は現在の順序通り維持する'(_文字列,_反転した文字列) :- atom_chars(_文字列,Chars), '単語(空白で区切られた文字)の順序を反転する'(Chars,[],[],L4), concat_atom(L6,_反転した文字列). '単語(空白で区切られた文字)の順序を反転する'([],L2,L2,[]) :- !. '単語(空白で区切られた文字)の順序を反転する'(L1,L2,L3,[A|R4]) :- 先頭から区切り文字を切り取る(L1,LX,R1), concat_atom(LX,A), '単語(空白で区切られた文字)の順序を反転する'(R1,L2,L3,R4). '単語(空白で区切られた文字)の順序を反転する'(L1,L2,L3,[V|R4]) :- 先頭から区切り文字までを切り取る(L1,LX,R1), concat_atom(LX,A), '単語(空白で区切られた文字)の順序を反転する'(R1,[A|L2],[V|L3],R4). 先頭から区切り文字を切り取る(L1,LX,R) :- append(L0,R,L1), \+(R = [' '|_]), \+(L0 = []), all(L0,' '),!. 先頭から区切り文字を切り取る(L1,L1,[]) :- all(L1,' '),!. 先頭から区切り文字までを切り取る(L1,LX,R) :- append(L0,R,L1), R = [' '|_], \+(member(' ',L0)),!. 先頭から区切り文字までを切り取る(L1,L1,[]) :- \+(member(' ',L1)),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/358 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): アルファベットと空白からなる文字列を処理する以下のような関数を作成せよ。なお各関数は処理が成功したときに1、失敗したときに0を返すものとする。 # # (1) 先頭からインデックスpで指定される文字までを反転させる関数int reverse(char *s, int p)を作成せよ。例: # char s[] = "abc defg"; # reverse(s, 3); # printf("%s¥n", s); // -> " cbadefg" # # (2) インデックスpとqで指定される範囲の文字を反転させる関数int reverse2(char *s, int p, int q)を作成せよ。例: # char s[] = "ab cdefg"; # reverse2(s, 4, 7); # printf("%s¥n", s); // -> "ab cgfed" # (ヒント: (1)で作った関数が応用できる?) # # (3) 単語(空白で区切られた文字)の順序を反転する関数int reverse_word(char *s)を作成せよ。例: # char s[] = "abc de f ghi"; # reverse_word(s); # printf("%s¥n", s); // -> "ghi f de abc" # (ヒント: (1)や(2)で作った関数が応用できる?) # # '単語(空白で区切られた文字)の順序を反転する'(_文字列,_反転した文字列) :- split(_文字列,[' '],L), reverse(L,L1), concat_atom(L1,' ',_反転した文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/328 # # 【質問テンプレ】 # [1] 授業単元:多次元配列 # [2] 問題文(含コード&リンク): 要素が整数からなる3x3の表データを scanf()関数を用いて読み込み、対角線を軸と して要素を入れ替えた表を表示するプログラ ムを作りなさい。 '要素が整数からなる3x3の表データを scanf()関数を用いて読み込み、対角線を軸として要素を入れ替えた表を表示する'(_対角線を軸として要素を入れ替えた表) :- '要素が整数からなる3x3の表データを scanf()関数を用いて読み込み'(_表), '対角線を軸として要素を入れ替えた表を表示する'(_表,_対角線を軸として要素を入れ替えた表). '要素が整数からなる3x3の表データを scanf()関数を用いて読み込み'(_表) :- length(_表,3), findall(L,( append(_,[L|_],_表), write('3列をカンマ区切りで入力して下さい : '), readln(L)), _表). '対角線を軸として要素を入れ替えた表を表示する'(_表,_対角線を軸として要素を入れ替えた表) :- 転置(_表,_対角線を軸として要素を入れ替えた表), 行列を表示する(_対角線を軸として要素を入れ替えた表). '対角線を軸として要素を入れ替えた表を表示する'(_表,_対角線を軸として要素を入れ替えた表) :- 表を180度回転する(_表,_表_2), 転置(_表_2,_対角線を軸として要素を入れ替えた表), 行列を表示する(_対角線を軸として要素を入れ替えた表). '表を180度回転する'(_表,_表_2) :- reverse(_表,_表_1), findall(L2,( append(_,[L1|_],_表_1), reverse(L1,L2)), _表_2). 行列を表示する(_行列) :- append(_,[_行|R],_行列), concat_atom(_行,' | ',_行表示), writef('%t\n',[_行表示]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/328 # # 【質問テンプレ】 # [1] 授業単元:多次元配列 # [2] 問題文(含コード&リンク): 要素が整数からなる3x3の表データを scanf()関数を用いて読み込み、対角線を軸と して要素を入れ替えた表を表示するプログラ ムを作りなさい。 '要素が整数からなる3x3の表データを scanf()関数を用いて読み込み、対角線を軸として要素を入れ替えた表を表示する'(_対角線を軸として要素を入れ替えた表) :- '要素が整数からなる3x3の表データを scanf()関数を用いて読み込み'(_表), '対角線を軸として要素を入れ替えた表を表示する'(_表,_対角線を軸として要素を入れ替えた表). '要素が整数からなる3x3の表データを scanf()関数を用いて読み込み'(_表) :- length(_表,3), findall(L,( append(_,[L|_],_表), write('3列をカンマ区切りで入力して下さい : '), readln(L)), _表). '対角線を軸として要素を入れ替えた表を表示する'(_表,_対角線を軸として要素を入れ替えた表) :- 転置(_表,_対角線を軸として要素を入れ替えた表), 行列を表示する(_対角線を軸として要素を入れ替えた表). '対角線を軸として要素を入れ替えた表を表示する'(_表,_対角線を軸として要素を入れ替えた表) :- 表を180度回転する(_表,_表_2), 転置(_表_2,_対角線を軸として要素を入れ替えた表), 行列を表示する(_対角線を軸として要素を入れ替えた表). '表を180度回転する'(_表,_表_2) :- reverse(_表,_表_1), findall(L2,( append(_,[L1|_],_表_1), reverse(L1,L2)), _表_2). 行列を表示する(_行列) :- append(_,[_行|R],_行列), concat_atom(_行,' | ',_行表示), writef('%t\n',[_行表示]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/249 # # ・MySQL5です # ・テーブルデータ #  ID|名前|データ #  01|鈴木|0001 #  02|佐藤|0002 #  01|鈴木|0003 # ・欲しい結果 #  ID|名前|*|DATA1|DATA2 #  01|鈴木|2|0001 |0003 #  02|佐藤|1|0002 | # # ・説明:group by と count(*) を使うと↓のように、グループ化され消えてしまう列の値を(この場合`0003`の部分)、↑みたく、行に書出す方法はありますか? #  ID|名前|*|データ #  01|鈴木|2|0001 #  02|佐藤|1|0002 # # ・補足:IDは1~1400、count数は1~97、DATAは1~4000位あります。 # # 欲しい結果(_組) :- 欲しい結果(_組,_). 欲しい結果(_組,_残り鍵ならび) :- 鍵ならびを作る(_鍵ならび), 鍵データの収集(_鍵ならび,_組,_残り鍵ならび). 欲しい結果の表示 :- 欲しい結果(_組,_残り鍵ならび), concat_atom(_組,'|',_組表示文字列), writef('%t\n',[_組表示文字列]), _残り鍵ならび = []. 鍵ならびを作る(_鍵ならび) :- findsetof([_ID,_名前],( テーブルデータ(_ID,_名前,_データ)), _鍵ならび). 鍵データの収集(_鍵ならび,_既に処理した鍵ならび,_組,_残り鍵ならび) :- 一つ鍵を取り出し(_鍵ならび,_既に処理した鍵ならび,_鍵,_残り鍵ならび), 鍵に対応するデータならび(_鍵,_鍵に対応するデータならび), 組の構成(_鍵,_鍵に対応するデータならび,_組). 一つ鍵を取り出し(_鍵ならび,_既に処理した鍵ならび,_鍵,_残り鍵ならび) :- append(_既に処理した鍵ならび,[_鍵|_残り鍵ならび],_鍵ならび). 鍵に対応するデータならび(_鍵,_鍵に対応するデータならび) :- _鍵 = [_ID,_名前], findall(_データ,( テーブルデータ(_ID,_名前,_データ)), _鍵に対応するデータならび). 組の構成(_鍵,_鍵に対応するデータならび,_組) :- length(_鍵に対応するデータならび,_度数), append(_鍵,[_度数|_鍵に対応するデータならび],_組). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/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/174 # # [1] 授業単元:文字列 # [2] 問題文(含コード&リンク): # 入力した時間と分を長針と短針で示す # アナログ時計を作れ。 # 長針の長さ(200). 単身の長さ(140). 中心X座標(240). 中心Y座標(240). アナログ時計(_時,_分) :- _時_1 is _時 mod 12, アナログ時計描画(_時_1,_分). アナログ時計描画(_時,_分) :- 時分をラジアン角度で表現する(_時,_分,_ラジアン角度_時,_ラジアン角度_分), 長針の長さ(_長針の長さ), 短針の長さ(_短針の長さ), グラフィック描画(_中心X座標,_中心Y座標,_長針の長さ,_短針の長さ,_ラジアン角度_分,_ラジアン角度_時). 時分をラジアン角度で表現する(_時,_分,_ラジアン角度_時,_ラジアン角度_分) :- _ラジアン角度_時 is 2 * pi * ( 1 - _時 / 12) + pi / 2, _ラジアン角度_分 is 2 * pi * ( 1 - _分 / 60) + pi / 2. グラフィック描画(_中心X座標,_中心Y座標,_長針の長さ,_短針の長さ,_長針の角度,_短針の角度) :- newpath, 時計の円周装飾を描画(_中心X座標,_中心Y座標,_半径), 長針の描画(_中心X座標,_中心Y座標,_長針の長さ,_長針の角度), 短針の描画(_中心X座標,_中心Y座標,_短針の長さ,_短針の角度), showpage. 長針の描画(_中心X座標,_中心Y座標,_長針の長さ,_長針の角度) :- moveto(_中心X座標,_中心Y座標), X_1 is truncate(_長針の長さ * cos(_長針の角度)), Y_1 is truncate(_長針の長さ * sin(_長針の角度)), setlinewidth(3), rlineto(X_1,Y_1), stroke. 短針の描画(_中心X座標,_中心Y座標,_短針の長さ,_短針の角度) :- moveto(_中心X座標,_中心Y座標), X_2 is truncate(_短針の長さ * cos(_短針の角度)), Y_2 is truncate(_短針の長さ * sin(_短針の角度)), setlinewidth(3), rlineto(X_2,Y_2), stroke. 時計の円周装飾を描画(_中心X座標,_中心Y座標,_半径) :- setlinewidth(1), arc(_中心X座標,_中心Y座標,_半径,0,360), stroke. %%%%%%% ポストスクリプト述語 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% pswr(G,X) :- pswr_2(G,X),!. pswr(P) :- functor(P,F,A), pswr_1(1,A,P,L1,L2), ( L1=[], G0=''; not(L1=[]), concat_atom(L1,' ',G0) ), concat_atom([G0,' ',F,'\n'],G1), pswr_2(G1,L2),!. pswr_1(N,A,_,[],[]) :- N>A,!. pswr_1(N,E,P,['%t'|R1],[X|R2]) :- arg(N,P,X), M is N+1, pswr_1(M,E,P,R1,R2). pswr_2(G,L) :- telling(user), e_printf(G,L),!. pswr_2(G,L) :- telling(screen), fopen('temp.ps','a+',F), sprintf(G,L,S), fputs(S,F), fclose(F),!. pswr_2(G,L) :- write_formatted(G,L). pstell(F) :- slush_op(F,F1), tell(F1), write('%!'), write('Adobe-PS'),nl,!. arc(_中心X座標,_中心Y座標,_半径,_開始角度,_弧角度) :- _中心X座標の二 is _中心X座標, _中心Y座標の二 is _中心Y座標, stroke, pswr(arc(_中心X座標の二,_中心Y座標の二,_半径,_開始角度,_弧角度)),!. save :- pswr(' /saveobj save def\n'),!. restore :- pswr(' saveobj restore\n'),!. stroke :- pswr(stroke),!. closepath :- pswr(closepath),!. setrgbcolor(Red,Green,Blue) :- pswr(setrgbcolor(Red,Green,Blue)),!. sethsbcolor(Hue,Saturation,Brightness) :- pswr(sethsbcolor(Hue,Saturation,Brightness)),!. setlinewidth(N) :- pswr(setlinewidth(N)),!. rlineto(X,Y) :- X1 is X, Y1 is Y, pswr(rlineto(X1,Y1)),!. lineto(X,Y) :- X1 is X, Y1 is Y, pswr(lineto(X1,Y1)),!. curveto([]) :- !. curveto([A|R]) :- not(list(A)), concat([A|R],' ',L), wr(' %t curveto\n',[L]),!. curveto([[X1,Y1,X2,Y2,X3,Y3]|R]) :- curveto(X1,Y1,X2,Y2,X3,Y3), curveto(R),!. curveto([[X1,Y1]|R]) :- flat([[X1,Y1]|R],L), curveto(L),!. curveto(X1,Y1,X2,Y2,X3,Y3) :- pswr(curveto(X1,Y1,X2,Y2,X3,Y3)),!. rcurveto([]) :- !. rcurveto([A|R]) :- not(list(A)), concat([A|R],' ',L), wr(' %t rcurveto\n',[L]),!. rcurveto([[X1,Y1,X2,Y2,X3,Y3]|R]) :- rcurveto(X1,Y1,X2,Y2,X3,Y3), rcurveto(R),!. rcurveto([[X1,Y1]|R]) :- flat([[X1,Y1]|R],L), rcurveto(L),!. rcurveto(X1,Y1,X2,Y2,X3,Y3) :- pswr(rcurveto(X1,Y1,X2,Y2,X3,Y3)),!. setdash([],Y) :- pswr(setdash([],Y)),!. setdash([A|R],Y) :- concat([A|R],' ',X0), concat(['[',X0,']'],X), pswr(setdash(X,Y)),!. setdash(X,Y) :- pswr(setdash(X,Y)),!. setlinecap(X) :- pswr(setlinecap(X)),!. setlinejoin(X) :- pswr(setlinejoin(X)),!. matrix :- pswr(matrix),!. setmatrix(Matrix) :- flat(Matrix,FlatMatrix), concat(FlatMatrix,' ',X0), concat(['[',X0,']'],X), pswr(setdash(X,Y)),!. setscreen(Frequency,Angle,Proc) :- pswr(setscreen(Frequency,Angle,Proc)),!. stroke :- pswr(stroke),!. moveto(X+X1,Y+Y1) :- var(X), var(Y), integer(X1), integer(Y1), pswr('currentpoint exch \n'), concat([X1,' add exch'],S), pswr(S), concat([Y1,' add moveto\n'],S2), pswr(S2),!. moveto(X+X1,Y) :- var(X), integer(X1), var(Y), pswr('currentpoint exch \n'), concat([X1,' add exch moveto'],S), pswr(S),!. moveto(X,Y+Y1) :- var(X), integer(Y1), var(Y), pswr('currentpoint \n'), concat([Y1,' add moveto'],S), pswr(S),!. moveto(X,Y) :- var(X), Y1 is Y, pswr('currentpoint pop \n'), pswr(moveto(Y1)),!. moveto(X,Y) :- var(Y), X1 is X, concat([X1,' exch moveto'],S), pswr('currentpoint exch pop \n'), pswr(S),!. moveto(X,Y) :- X1 is X, Y1 is Y, pswr(moveto(X1,Y1)),!. showpage :- pswr(showpage),!. copypage :- pswr(copypage),!. erasepage :- pswr(erasepage),!. fill :- pswr(fill),!. ps2pdf(FO) :- concat(['/usr/local/Adobe/Acrobat7.0/bin/acroread ',FO2],S), system(S),!. newpath :- pswr(newpath),!. xpos(Y) :- Y1 is Y, pswr('/xpos %d def\n',[Y1]),!. ypos(Y) :- Y1 is Y, pswr('/ypos %d def\n',[Y1]),!. image(_スキャン長,_スキャンライン数,_ビット数,_変換配列,_16進数ならび文字列) :- sprintf('[%t %t %t %t %t %t]',_変換配列,_変換配列文字列), sprintf(' %t %t %t %t {<%t>} image ',[_スキャン長,_スキャンライン数,_ビット数,_変換配列文字列,_16進数ならび文字列],S), pswr(S),!. scale(X,Y) :- X1 is X, Y1 is Y, pswr(scale(X,Y)),!. translate(X,Y) :- X1 is X, Y1 is Y, pswr(translate(X1,Y1)),!. rotate(R) :- R1 is R, pswr(rotate(R1)),!. p_point(X,Y) :- X1 is X, Y1 is Y, moveto(X1,Y1), rlineto(1,0), stroke,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/137 # # [1] 授業単元:基礎プロ # [2] 問題文(含コード&リンク): # キーボードから自然数 n を読み込む. # 読み込んだ自然数 n の階乗を計算する. # 計算結果を以下の実行例のように出力する. # # 実行例 # >./extra06-1 # 自然数を入力: 5 # 5! = 1 x 2 x 3 x 4 x 5 = 120 # >./extra06-1 # 自然数を入力: 6 # 6! = 1 x 2 x 3 x 4 x 5 x 6 = 720 # > # # この動作をするプログラムを作成せよ # 'キーボードから自然数 n を読み込む.読み込んだ自然数 n の階乗を計算する.計算結果を以下の実行例のように出力する.' 'キーボードから自然数 n を読み込む'(_n), '読み込んだ自然数 n の階乗を計算する.'(_n,_階乗式の文字列表現,_nの階乗), '計算結果を以下の実行例のように出力する.'(_n,_階乗式の文字列表現,_nの階乗). 'キーボードから自然数 n を読み込む'(_n) :- 自然数を読み込む(_n). '読み込んだ自然数 n の階乗を計算する.'(_n,_1からnまでの数ならび,_nの階乗) :- findall(N,for(1,N,_n),_1からnまでの数ならび), mult(_1からnまでの数ならび,_nの階乗). /* findmult(_対象項,_実行項,_解) :- findall(_対象項,_実行項,L), mult(L,_解). */ mult([],1). mult([A|R],X) :- mult(R,Y), X is A * Y. '計算結果を以下の実行例のように出力する.'(_n,_1からnまでの数ならび,_nの階乗) :- concat_atom(_1からnまでのならび,' × ',_階乗式の表示用文字列), writef('%t! = %t = %t\n',[_n,_階乗式の表示用文字列,_nの階乗]). 自然数を読み込む(_自然数) :- write('自然数を入力 : '), get_line(Line), 自然数を読み込み診断(Line,_自然数),!. 自然数を読み込む(_自然数) :- 自然数を読み込む(_自然数). 自然数を読み込み診断(Line,_自然数) :- atom_to_term(Line,_自然数,_), integer(_自然数), _自然数 >= 0,!. 自然数を読み込み診断(Line,_自然数) :- writef('入力された %t からは自然数が得られません。再入力をお願いします。\n',[Line]), fail. % % 何故findmult/3を使わなかったか? % % 目下の課題は以下の実行例をどのように述語定義の中に取り込むかだ % コメントはそのまま引数ゼロの述語として定義し、副目標として書いて置けばよいが % このような改行のある事例は述語アトムとして見やすいものにならない。 % /* # 実行例 # >./extra06-1 # 自然数を入力: 5 # 5! = 1 x 2 x 3 x 4 x 5 = 120 # >./extra06-1 # 自然数を入力: 6 # 6! = 1 x 2 x 3 x 4 x 5 x 6 = 720 # > */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/137 # # [1] 授業単元:基礎プロ # [2] 問題文(含コード&リンク): # キーボードから自然数 n を読み込む. # 読み込んだ自然数 n の階乗を計算する. # 計算結果を以下の実行例のように出力する. # # 実行例 # >./extra06-1 # 自然数を入力: 5 # 5! = 1 x 2 x 3 x 4 x 5 = 120 # >./extra06-1 # 自然数を入力: 6 # 6! = 1 x 2 x 3 x 4 x 5 x 6 = 720 # > # # この動作をするプログラムを作成せよ # 'キーボードから自然数 n を読み込む.読み込んだ自然数 n の階乗を計算する.計算結果を以下の実行例のように出力する.' 'キーボードから自然数 n を読み込む'(_n), '読み込んだ自然数 n の階乗を計算する.'(_n,_階乗式の文字列表現,_nの階乗), '計算結果を以下の実行例のように出力する.'(_n,_階乗式の文字列表現,_nの階乗). 'キーボードから自然数 n を読み込む'(_n) :- 自然数を読み込む(_n). '読み込んだ自然数 n の階乗を計算する.'(_n,_1からnまでの数ならび,_nの階乗) :- findall(N,for(1,N,_n),_1からnまでの数ならび), concat_atom(_1からnまでの数ならび,'*',_階乗式の文字列表現), atom_to_term(_階乗式の文字列表現,_式,_), _nの階乗 is _式. '計算結果を以下の実行例のように出力する.'(_n,_1からnまでの数ならび,_nの階乗) :- concat_atom(_1からnまでのならび,' × ',_階乗式の表示用文字列), writef('%t! = %t = %t\n',[_n,_階乗式の表示用文字列,_nの階乗]). 自然数を読み込む(_自然数) :- write('自然数を入力 : '), get_line(Line), 自然数を読み込み診断(Line,_自然数),!. 自然数を読み込む(_自然数) :- 自然数を読み込む(_自然数). 自然数を読み込み診断(Line,_自然数) :- atom_to_term(Line,_自然数,_), integer(_自然数), _自然数 >= 0,!. 自然数を読み込み診断(Line,_自然数) :- writef('入力された %t からは自然数が得られません。再入力をお願いします。\n',[Line]), fail. % % 目下の課題は以下の実行例をどのように述語定義の中に取り込むかだ % コメントはそのまま引数ゼロの述語として定義し、副目標として書いて置けばよいが % このような改行のある事例は述語アトムとして見やすいものにならない。 % /* # 実行例 # >./extra06-1 # 自然数を入力: 5 # 5! = 1 x 2 x 3 x 4 x 5 = 120 # >./extra06-1 # 自然数を入力: 6 # 6! = 1 x 2 x 3 x 4 x 5 x 6 = 720 # > */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/126 # # どなたかお願いします。 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): 与えられた任意の長さのアルファベットの文字列(ただし # 重複する文字は含まないとする)に対して、文字を任意の順番に入れ替えてできる # 文字列のパターンをすべて出力する関数permute()を作成せよ。 # # 例: # permute("ABC"); # ABC ACB BAC BCA CAB CBA # # '与えられた任意の長さのアルファベットの文字列(ただし重複する文字は含まないとする)に対して、文字を任意の順番に入れ替えてできる文字列のパターンをすべて空白区切りで横方向に出力する'(_文字列) :- fildall(_順番を入れ替えた文字列,( '与えられた任意の長さのアルファベットの文字列(ただし重複する文字は含まないとする)に対して、文字を任意の順番に入れ替えてできる文字列のパターンを'(_文字列,_順番を入れ替えた文字列)), _文字列パターンならび), 空白区切りで横方向に出力する(_文字列パターンならび,' ',_表示行). 空白区切りで横方向に出力する(_文字列パターンならび) :- concat_atom(_文字列パターン,' ',_表示行), writef('%t\n',[_表示行]). '与えられた任意の長さのアルファベットの文字列(ただし重複する文字は含まないとする)に対して、文字を任意の順番に入れ替えてできる文字列のパターンを'(_文字列,_順番を入れ替えた文字列) :- atom_chars(_文字列,Chars), length(Chars,Len), 順列(Chars,Len,Chars2), atom_chars(_順番を入れ替えた文字列,Chars2). % % 最初の課題述語名に「空白区切りで横方向に」を加えたのがポイント。 % このような実例付き課題では、多くの場合、仕様文の表現に実例の細部が % 反映されていないことが多い。 % この時は思い切って、課題文に手を入れて考える。 % 順列(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://hibari.2ch.net/test/read.cgi/tech/1320365280/68 # # [1] 授業単元:プログラミング入門 # [2] 問題文:整数型の要素を最大10個格納できる配列を宣言する。 # 添え字が偶数の要素として2、添え字が奇数の要素として3を格納し、 # 2 3 2 3 2 3 2 3 2 3の形式で出力せよ。 # '整数型の要素を最大10個格納できる配列を宣言する。添え字が偶数の要素として2、添え字が奇数の要素として3を格納し、2 3 2 3 2 3 2 3 2 3の形式で出力せよ。' :- '整数型の要素を最大10個格納できる配列を宣言する'(L), '添え字が偶数の要素として2、添え字が奇数の要素として3を格納し'(L), '2 3 2 3 2 3 2 3 2 3の形式で出力せよ'(L). '整数型の要素を最大10個格納できる配列を宣言する'(L) :- length(L,10). '添え字が偶数の要素として2、添え字が奇数の要素として3を格納し'(L) :- findall(_値,( append(L0,[_値|_],L), '添え字が偶数の要素として2、添え字が奇数の要素として3を'(L0,_値)), L). '添え字が偶数の要素として2、添え字が奇数の要素として3を'(L0,2) :- append(L1,L2,L0), length(L1,Len), length(L2,Len),!. '添え字が偶数の要素として2、添え字が奇数の要素として3を'(L0,3) :- append(L1,[_|L2],L0), length(L1,Len), length(L2,Len). '2 3 2 3 2 3 2 3 2 3の形式で出力せよ'(L) :- concat_atom(L,' ',S), writef('%t\n',[S]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/36 # # [1] 授業単元:C言語 # [2] 問題文:整数型の要素を最大20個格納できる配列を宣言し,先頭から10個分には2を, # 後半の10個分には3を格納せよ。正しく格納されたことを出力する必要があるが, # 出力する際には2を10個分空白区切りで出力し,改行した後に3を10個分空白区切りで出力すること。 # '整数型の要素を最大20個格納できるならびを宣言し,先頭から10個分には2を,後半の10個分には3を格納せよ。' :- '整数型の要素を最大20個格納できるならびを宣言し'(L), '先頭から10個分には2を,後半の10個分には3を格納する'(L). '整数型の要素を最大20個格納できるならびを宣言し'(L) :- length(L,20). '先頭から10個分には2を,後半の10個分には3を格納する'(L) :- append(L1,L2,L), '先頭から10個分には2を'(L1), '後半の10個分には3を'(L2), 格納する(L). '先頭から10個分には2を'(L1) :- length(L1,10), all(L1,2),!. '後半の10個分には3を'(L2) :- length(L2,10), all(L2,3),!. 格納する(L) :- assertz('整数型の要素を最大20個格納できるならび'(L)). '正しく格納されたことを出力する必要があるが,出力する際には2を10個分空白区切りで出力し,改行した後に3を10個分空白区切りで出力すること。' :- '整数型の要素を最大20個格納できるならび'(L), length(L1,10), length(L2,10), '2を10個分空白区切りで出力し'(L,L1,L2), '改行した後に3を10個分空白区切りで出力する'(L,L1,L2). '2を10個分空白区切りで出力し'(L,L1,L2) :- append(L1,L2,L), concat_atom(L1,' ',S1), writef('%t',[S1]). '改行した後に3を10個分空白区切りで出力する'(L,L1,L2) :- append(L1,L2,L), concat_atom(L2,' ',S2), writef('\n%t\n',[S2]).), % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/33 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク):mのn乗 を一の位まで正確に計算するプログラムを書け。ただし、mは2以上10000未満の整数、nは0以上10000未満の整数とする。 # # 'mのn乗 を一の位まで正確に計算するプログラムを書け。ただし、mは2以上10000未満の整数、nは0以上10000未満の整数とする。'(_m,_n,_答え) :- findall(_m,( for(1,N,_n)), L), concat_atom(L,'*',S), atom_to_term(S,_式,_), _答え is _式. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'mのn乗 を一の位まで正確に計算するプログラムを書け。ただし、mは2以上10000未満の整数、nは0以上10000未満の整数とする。'(_m,_n,_答え) :- 'mのn乗 を一の位まで正確に計算するプログラムを書け。ただし、mは2以上10000未満の整数、nは0以上10000未満の整数とする。'(_m,1,_n,_答え). 'mのn乗 を一の位まで正確に計算するプログラムを書け。ただし、mは2以上10000未満の整数、nは0以上10000未満の整数とする。'(_m,N,_n,1) :- N > _n,!. 'mのn乗 を一の位まで正確に計算するプログラムを書け。ただし、mは2以上10000未満の整数、nは0以上10000未満の整数とする。'(_m,N,_n,X) :- N_2 is N + 1, 'mのn乗 を一の位まで正確に計算するプログラムを書け。ただし、mは2以上10000未満の整数、nは0以上10000未満の整数とする。'(_m,N_2,_n,Y), X is _m * Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/727 # # わかりにくい質問かもしれませんがよろしくお願いします。 # # ●正規表現の使用環境 # Java(Android) # # ●検索か置換か? # 検索 # # ●説明 # 文字列から、数値を含むURLを検索し、その数値を取得したい # # ●対象データ # http://ime.nu/some_website.net/category:63 # http://ime.nu/some_website.net/category:19 # ・・・ # のように、数値を含むURLを含んだ文字列 # # ●希望する結果 # http://ime.nu/some_website.net/category:63 # だったら、63を取得 # # '文字列から、数値を含むURLを検索し、その数値を取得したい'(_文字列,_前文字列,_適合文字列,_後文字列) :- '数値を含むURLを検索し'(_文字列,_前文字列_1,_数値を含むURL,_後文字列_1), 数値を取得したい(_数値を含むURL,_前文字列_2,_適合文字列,_後文字列_2), concat_atom([_前文字列_1,_前文字列_2],_前文字列), concat_atom([_後文字列_2,_後文字列_1],_後文字列). '数値を含むURLを検索し'(_文字列,_前文字列,_数値を含むURL,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列_1,_数値を含むURL_1,_後文字列_1,L1,L2,L3), 'URLである'(L2), 'L3は[]であるか先頭が空白'(L3), '数値を含むURLを検索し'(_前文字列_1,_数値を含むURL_1,_後文字列_1,_前文字列,_数値を含むURL,_後文字列). '数値を含むURLを検索し'(_前文字列,_数値を含むURL,_後文字列,_前文字列,_数値を含むURL,_後文字列). '数値を含むURLを検索し'(_前文字列_1,_数値を含むURL_1,_後文字列_1,_前文字列,_数値を含むURL,_後文字列) :- '数値を含むURLを検索し'(_後文字列_1,_前文字列_2,_数値を含むURL,_後文字列), concat_atom([_前文字列_1,_数値を含むURL_1,_前文字列_2],_前文字列). 'URLである'([h,t,t,p,:,/,/|R]) :- \+(member(' ',R)),!. 'URLである'([h,t,t,p,s,:,/,/|R]) :- \+(member(' ',R)),!. 'URLである'([f,t,p,:,/,/|R]) :- \+(member(' ',R)),!. 'URLである'([f,i,l,e,:,/,/|R]) :- \+(member(' ',R)),!. 'L3は[]であるか先頭が空白'([]) :- !. 'L3は[]であるか先頭が空白'([' '|_]). 数値を取得したい(_数値を含むURL,_前文字列,_適合文字列,_後文字列) :- sub_atom(_数値を含むURL,_,_,_,_前文字列_1,_適合文字列_1,_後文字列_1,L1_1,L2_1,L3_1), 全てが数字(L1), \+((last(L1,A),数字(A))), \+((L3 = [B|_],数字(B))). 数値を取得したい(_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列). 数値を取得したい(_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). 数値を取得したい(_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- 数値を取得したい(_後文字列_1,_前文字列_2,_適合文字列,_後文字列), concat_atom([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). 全てが数字([]). 全てが数字([A|R]) :- 数字(A), 全てが数字(R). 数字(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']),!. 数字(A) :- member(A,[0,1,2,3,4,5,6,7,8,9]). % 以下のサイトは # # C:\Users\workspace\pythonというディレクトリの中のpythonファイルを実行すると、 # pythonがあるディレクトリと同ディレクトリの全てのテキスト形式ファイル内にある # path1、path2に格納されている文字列のディレクトリを # C:\Users\workspace\pythonに置き換えたいです。 # 現ディレクトリ('C:\\Users\\workspace\\python\\'). 'ディレクトリ内の全テキストファイル中のpath1, path2 のディレクトリを現ディレクトリに置換する' :- ディレクトリ内の全テキストファイル(_テキストファイル名ならび), 'ファイル中のpath1, path2 のディレクトリを現ディレクトリに置換する'(_テキストファイル名ならび). ディレクトリ内の全テキストファイル(_テキストファイル名ならび) :- shs('ls -N *.txt',_テキストファイル名ならび). 'ファイル内のpath1, path2 のディレクトリを現ディレクトリに置換する'(_テキストファイル名ならび) :- append(_,[_テキストファイル名|R],_テキストファイル名ならび), 'path1, path2 のディレクトリを現ディレクトリに置換する'(_テキストファイル名), R = []. 'path1, path2 のディレクトリを現ディレクトリに置換する'(_テキストファイル名) :- get_lines(_テキストファイル名,Lines), 'path1, path2 のディレクトリを現ディレクトリに置換する'(Lines,Lines2), put_lines(_テキストファイル名,Lines2). 'path1, path2 のディレクトリを現ディレクトリに置換する'([],[]) :- !. 'path1, path2 のディレクトリを現ディレクトリに置換する'([Line1|R1],[Line2|R2]) :- 'path1かpath2が存在する'(Line1,_path,_パス,R), パスを現ディレクトリに変換(_path,_パス,R,,Line2), 'path1, path2 のディレクトリを現ディレクトリに置換する'(R1,R2),!. 'path1, path2 のディレクトリを現ディレクトリに置換する'([Line|R1],[Line|R2]) :- 'path1, path2 のディレクトリを現ディレクトリに置換する'(R1,R2). 'path1かpath2が存在する'(Line1,_path,_パス,R) :- split(Line1,[' '],[_path,=,_パス|R]), member(_path,[path1,path2]),!. パスを現ディレクトリに変換(_path,_パス,R,Line2) :- 現ディレクトリ(DIR), split(_パス,['\\'],L), append(_,[_ファイル名],L), concat_atom([DIR,_ファイル名],_更新されたパス), concat_atom([_path,=,_更新されたパス,R],' ',Line2). % 以下のサイトは # # 非決定性の置換述語を使って、全てを置換した文字列だけを取り出せ。 # 全てを置換した文字列だけを取り出す(_文字列,_置換対象文字列,_置換文字列,_全てを置換した文字列) :- findall(_置換された文字列,( 非決定性の置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列)), _置換された文字列ならび), append(_,[_全てを置換した文字列],_置換された文字列ならび),!. 非決定性の置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 置換(_文字列,_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1), 非決定性の置換(_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1,_置換された文字列). 非決定性の置換(_,_,_,_,_置換された文字列,_置換された文字列). 非決定性の置換(_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1,_置換された文字列) :- 非決定性の置換(_後文字列,_置換対象文字列,_置換文字列,_置換された文字列_2), concat_atom(_置換された部分までの文字列,_置換された文字列_2],_置換された文字列). 置換(_文字列,_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列) :- sub_atom(_文字列,S,Len,R,_置換対象文字列), sub_atom(_文字列,0,S,0,_前文字列), sub_atom(_文字列,S+Len,R,0,_後文字列), concat_atom([_前文字列,_置換文字列,_置換された部分までの文字列]), concat_atom([_置換された部分までの文字列,_後文字列],_置換された文字列),!. % 以下のサイトは # # 非決定性の置換述語の雛形を作れ。 # 非決定性の置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 置換(_文字列,_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1), 非決定性の置換(_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1,_置換された文字列). 非決定性の置換(_,_,_,_,_置換された文字列,_置換された文字列). 非決定性の置換(_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1,_置換された文字列) :- 非決定性の置換(_後文字列,_置換対象文字列,_置換文字列,_置換された文字列_2), concat_atom(_置換された部分までの文字列,_置換された文字列_2],_置換された文字列). 置換(_文字列,_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列) :- sub_atom(_文字列,S,Len,R,_置換対象文字列), sub_atom(_文字列,0,S,0,_前文字列), sub_atom(_文字列,S+Len,R,0,_後文字列), concat_atom([_前文字列,_置換文字列,_置換された部分までの文字列]), concat_atom([_置換された部分までの文字列,_後文字列],_置換された文字列),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/994 # # 0から1000までの整数を英語で出力する # という課題があるのですが # # まったくわからないので教えてください # # '0から1000までの整数を英語で出力する'(0) :- write(zero),!. '0から1000までの整数を英語で出力する'(N) :- '1から1000までの整数を英語で出力する'(N,_英語表現), write(_英語表現),!. '1から1000までの整数を英語で出力する'(0,'') :- !. '1から1000までの整数を英語で出力する'(N,_英語表現) :- N =< 10, nth1(N,[one,two,three,four,five,six,seven,eight,nine,ten],_英語表現),!. '1から1000までの整数を英語で出力する'(N,_英語表現) :- N >= 11, N =< 19, M is N mod 10, nth1(M,[eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen],_英語表現),!. '1から1000までの整数を英語で出力する'(N,_英語表現) :- N >= 21, N =< 99, N_1 is N // 10 - 1, M is N mod 10, nth1(N_1,[twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety],_10の桁の英語表現), '0から1000までの整数を英語で出力する'(M,_1の桁の英語表現), concat_atom([_10の桁の英語表現,'-',_1の桁の英語表現],_英語表現). '1から1000までの整数を英語で出力する'(N,_英語表現) :- N >= 100, N =< 999, N_1 is N // 100, M is N mod 100, '1から1000までの整数を英語で出力する'(N_1,_100の桁の英語表現), '1から1000までの整数を英語で出力する'(M,_10の桁以下の英語表現), concat_atom([_100の桁の英語表現,' hundred and ',_10の桁以下の英語表現],_英語表現). '1から1000までの整数を英語で出力する'(1000,'one-thousand'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/980 # # [1] 授業単元:基礎C # [2] 問題文(含コード&リンク):以下の実行例のように,姓と名を入力すると,2 つの # 間にスペースを入れて連結した文字列を生成するプロ # グラムを作成せよ.姓と名はそれぞれ配列family[] と # first[] に,連結した文字列は配列fullname[] に格納 # すること.入力できる姓と名の長さはそれぞれ30 字ま # でとする。 # 例. Family name: Kouka # First name: Dai # Kouka Dai # '姓と名を入力すると,2つの間にスペースを入れて連結した文字列を生成する' :- 姓の入力(_姓), 名の入力(_名), '姓と名を入力すると,2つの間にスペースを入れて連結した文字列を生成する'(_姓,_名,_連結した文字列), writef('間にスペース入れて連結した文字列は「%t」\n',[_連結した文字列]). '姓と名を入力すると,2つの間にスペースを入れて連結した文字列を生成する'(_姓,_名,_間にスペースを入れて連結した文字列) :- concat_atom([_姓,_名],' ',_間にスペースを入れて連結した文字列). 姓の入力(_姓) :- write('姓名の姓を入力して下さい : '), get_line(_姓), 姓の入力診断(_姓),!. 姓の入力(_姓) :- 姓の入力(_姓). 姓の入力診断(_姓) :- atom(_姓), sub_atom(_姓,0,Len,0,_姓), Len =< 30,!. 姓の入力診断(_姓) :- writef('入力された %t は姓名の姓として適切でありません。再入力をお願いします。\n',[_姓]), fail. 名の入力(_名) :- write('姓名の名を入力して下さい : '), get_char(_名), 名の入力診断(_名),!. 名の入力(_名) :- 名の入力(_名). 名の入力診断(_名) :- atom(_名), sub_atom(_名,0,Len,0,_名), Len =< 30,!. 名の入力診断(_名) :- writef('入力された %t は姓名の名として適切でありません。再入力をお願いします。\n',[_名]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/957 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク):n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。 # 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(_n,X) :- findall(N,for(1,N,_n),L), concat_atom(L,'*',S), atom_to_term(S,_式,_), X is _式. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(_n,X) :- 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(1,_n,1,X). 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(N,_n,X,X) :- N > _n,!. 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(N,_n,X_1,X) :- X_2 is X_1 * N, N_2 is N + 1, 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(N_2,_n,X_2,X). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(1,1) :- !. 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(N,X) :- N_1 is N - 1, 'n!を1の位まで正確に計算するプログラムをかけ。ただし、nは0以上10000未満の整数とする。'(N_1,X_1), X is X_1 * N. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/853 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):(列挙体) # Sunday, Monday, Tuesday, Wednesday, Thursday, # Friday, Saturday という曜日を表す列挙体 # enum Days を定義せよ.以下の実行例のように, # 曜日を入力すると,enum Days の列挙定数を利用して # 週末,平日,それ以外の場合にそれぞれメッセージを # 表示するプログラムを作成せよ. # 例 % ./q3-3 # 曜日を入力して下さい # (0:日1:月2:火3:水4:木5:金6:土):0 # やった!週末だ # # 曜日を入力して下さい # (0:日1:月2:火3:水4:木5:金6:土):5 # 今日も講義頑張ろう! # # 曜日を入力して下さい # (0:日1:月2:火3:水4:木5:金6:土):7 # この日はないぞう... # 曜日([日,月,火,水,木,金,土]). '曜日を入力すると,曜日 の列挙定数を利用して 週末,平日,それ以外の場合にそれぞれメッセージを表示する' :- 曜日を入力すると(_曜日), '曜日 の列挙定数を利用して 週末,平日,それ以外の場合にそれぞれメッセージを'(_曜日,_メッセージ), 表示する'(_メッセージ),!. 曜日を入力すると(_曜日) :- write('曜日を入力してください [日,月,火,水,木,金,土] : '), get_line(_曜日),!. '曜日 の列挙定数を利用して 週末,平日,それ以外の場合にそれぞれメッセージを'(_曜日,週末は一家揃って中央競馬) :- 曜日から曜日番号を得る(_曜日,_曜日番号), 週末だ(_曜日番号),!. '曜日 の列挙定数を利用して 週末,平日,それ以外の場合にそれぞれメッセージを'(_曜日,平日も一家揃って公営競馬) :- 曜日から曜日番号を得る(_曜日,_曜日番号), 平日だ(_曜日番号),!. '曜日 の列挙定数を利用して 週末,平日,それ以外の場合にそれぞれメッセージを'(_曜日,_メッセージ) :- atomic_list_concat(['入力された ',_曜日,' は 日,月,火,水,木,金,土 のいずれでもありません],_メッセージ),!. 曜日から曜日番号を得る(_曜日,_曜日番号), 曜日(_曜日ならび), nth0(_曜日番号,_曜日ならび,_曜日). 週末だ(_曜日番号) :- 0 is _曜日番号 mod 6. 平日だ(_曜日番号) :- \+(0 is _曜日番号 mod 6). 表示する(_メッセージ) :- writef('%t\n',[_メッセージ]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/647 # # <hoge>aaa</hoge> # bbb # <hoge>ccc</hoge> # # <hoge></hoge>に囲まれてる文字を大文字に置き換える処理をしてるのですが、 # <hoge>(.*)</hoge>で一応できます。 # <hoge>(.*)?</hoge>と?をつけてもできるのですが、 # どっちが正しいのでしょうか? # # '<hoge></hoge>に囲まれてる文字を大文字に置き換える'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [<,h,o,g,e,>|R2], append(R22,[<,/,h,o,g,e,>],R2), findall(B,( member(A,R22), to_upper(A,B)), R23), concat_atom([<,hoge,>,R23,<,'/hoge',>],S23), concat_atom([S1,S23],_置換された部分までの文字列), concat_atom([S1,S23,S3],_置換された文字列_1), '<hoge></hoge>に囲まれてる文字を大文字に置き換える'(_文字列,_置換された部分までの文字列,S3,_置換された文字列_1,_置換された文字列). '<hoge></hoge>に囲まれてる文字を大文字に置き換える'(_文字列,_置換された部分までの文字列,_,_置換された文字列,_置換された文字列). '<hoge></hoge>に囲まれてる文字を大文字に置き換える'(_文字列,_置換された部分までの文字列,_後文字列,_置換された文字列,_置換された文字列) :- '<hoge></hoge>に囲まれてる文字を大文字に置き換える'(_後文字列,_置換された文字列_1), concat_atom([_置換された部分までの文字列,_置換された文字列_1],_置換された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/844 # # [1] 授業単元:C言語基礎 # [2] 問題文(含コード&リンク): # # 明治元年以降の西暦年を4桁の数で入力すると、 # 和暦で年を表示するプログラムを作成せよ。 # ただし、2つの元号を持つ年 # は両方の年を表示すること。 # (例: 1989年 → 昭和64年、平成元年) # # (2つの元号を持つ年の扱いについては # 余裕がある人は、月、日も入れて、その日の正しい # 元号を表示することによって元号を一つ表示す # るプログラムとしてもよい。) # 提出例 # === プログラム === # #include <stdio.h> # int main() # { # '明治元年以降の西暦年月日を入力して和暦を表示する' :- '明治元年以降の西暦年月日を入力すると'(_西暦年,_月,_日), '入力された西暦年月日から元号を表示する'(_西暦年,_月,_日). '明治元年以降の西暦年月日を入力すると'(_西暦年,_月,_日) :- write('西暦年月日をカンマ区切りで入力してください : '), readln([_西暦年,_月,_日]). '入力された西暦年月日から和暦を表示する'(_西暦年,_月,_日) :- findall(_和暦,( 元号期間(_元号,_期間開始年,_期間開始月,_期間開始日,_期間終了年,_期間終了月,_期間終了日), [_期間開始年,_期間開始月,_期間開始日] @=< [_西暦年,_月,_日], [_期間終了年,_期間終了月,_期間終了日] @>= [_西暦年,_月,_日], 西暦年月日と元号開始年から和暦を得る(_西暦年,_月,_日,_期間開始年,_和暦), L), 和暦を表示する(_西暦年,_月,_日,L). 和暦を表示する(_西暦年,_月,_日,[_和暦_1,_和暦_2]) :- writef('西暦%t年%月%日は二つの元号が重なっています。和暦は %t と %t になります。\n',[_西暦年,_月,_日,_和暦_1,_和暦_2]),!. 和暦を表示する(_西暦年,_月,_日,[_和暦]) :- writef('西暦%t年%月%日の和暦は %t です。\n',[_和暦]). 西暦年月日と元号開始年から和暦を得る(_西暦年,_月,_日,_期間開始年,_和暦) :- _数字和暦年 is _西暦年 - _期間開始年 + 1, 数字年和暦年変換(_数字和暦年,_和暦年), 九十九までの和数字変換(_月,_和暦月), 九十九までの和数字変換(_日,_和暦日), concat_atom([_元号,_和暦年,_和暦月,月,_和暦日,日],_和暦),!. 数字年和暦年変換(1,元年) :- !. 数字年和暦年変換(_西暦,_和暦年) :- 九十九までの和数字変換(_数字,_和数字), concat_atom([_和数字,年],_和暦年),!. 九十九までの和数字変換(0,''). 九十九までの和数字変換(1,一). 九十九までの和数字変換(2,ニ). 九十九までの和数字変換(3,三). 九十九までの和数字変換(4,四). 九十九までの和数字変換(5,五). 九十九までの和数字変換(6,六). 九十九までの和数字変換(7,七). 九十九までの和数字変換(8,八). 九十九までの和数字変換(9,九). 九十九までの和数字変換(数字,_和数字) :- N >= 10, N =< 19, M is N mod 10, 九十九までの和数字変換(M,M2), concat_atom([十,_和数字一の桁],_和数字). 九十九までの和数字変換(数字,_和数字) :- N >= 20, N =< 99, M is N mod 10, 九十九までの和数字変換(M,_和数字一の桁), N2 is N // 10, 九十九までの和数字変換(M2,_和数字十の桁), concat_atom([_和数字十の桁,十,_和数字一の桁],_和数字). 元号期間(明治,1868,1,1,1912,7,30). 元号期間(大正,1912,7,30,1926,12,25). 元号期間(昭和,1926,12,25,1989,1,7). 元号期間(平成,1989,1,8,_年,_月,_日) :- 今日(_年,_月,_日). 改元日(明治,1868,1,25,'改元は1月1日に遡って施行された') :- '実際の改元の勅書は1968年10月23日に出されたが1月1日に遡って施行'. 改元日(大正,1912,7,30,'改元は即日施行された') :- '改元は即日施行された'. 改元日(昭和,1926,12,25,'改元は即日施行された') :- '改元は即日施行された'. 改元日(平成,1989,1,7,'改元は翌日から施行された') :- '改元は翌日から施行された'. '実際の改元の勅書は1968年10月23日に出されたが1月1日に遡って施行'. '改元は即日施行された'. '改元は翌日から施行された'. 今日(_年,_月,_日) :- shs(date,S), split(S,[' ',年,月,日],[_年,_月,_日|_]),!. % 以下のサイトは # [1] 授業単元:C言語基礎 # [2] 問題文(含コード&リンク): # # 明治元年以降の西暦年を4桁の数で入力すると、 # 和暦で年を表示するプログラムを作成せよ。 # ただし、2つの元号を持つ年 # は両方の年を表示すること。 # (例: 1989年 → 昭和64年、平成元年) # # (2つの元号を持つ年の扱いについては # 余裕がある人は、月、日も入れて、その日の正しい # 元号を表示することによって元号を一つ表示す # るプログラムとしてもよい。) # 提出例 # === プログラム === # #include <stdio.h> # int main() # { # '明治元年以降の西暦年を4桁の数で入力すると、和暦で年を表示するプログラムを作成せよ。ただし、2つの元号を持つ年は両方の年を表示すること。' :- '明治元年以降の西暦年を4桁の数で入力すると'(_西暦年), '入力された西暦を示す4桁の数から和暦で年を表示する'(_西暦年). '明治元年以降の西暦年を4桁の数で入力すると'(_西暦年) :- write('明治元年以降の西暦年を4桁の数で入力 : '), 整数を得る(_西暦年), '明治元年以降の西暦年を4桁の数入力検査'(_西暦年),!. '明治元年以降の西暦年を4桁の数で入力すると'(_西暦年) :- '明治元年以降の西暦年を4桁の数で入力すると'(_西暦年). '明治元年以降の西暦年を4桁の数入力検査'(_西暦年) :- _西暦年 =< 9999, 元号期間(明治,_明治元年の西暦,_,_,_,_,_), _西暦年 >= _明治元年の西暦,!. '明治元年以降の西暦年を4桁の数入力検査'(Line,_西暦年) :- writef('入力された %t からは明治元年以降の西暦を示す整数は得られません。再入力をお願いします。\n',[Line]), fail. '入力された西暦を示す4桁の数から和暦で年を表示する'(_西暦年) :- findall(_和暦,( 西暦から和暦を得る(_西暦年,_和暦)), _和暦ならび), 和暦を表示する(_西暦年,_和暦ならび). '西暦から和暦を得る'(_西暦年,_和暦) :- 元号期間(_元号,_開始年,_,_,_終了年,_,_), _西暦年 >= _開始年, _西暦年 =< _終了年, 元号の開始年から和暦を得る(_西暦,_開始年,_和暦年), atomic_list_concat([_元号,_和暦年],_和暦). 元号の開始年から和暦年を得る(_西暦年,_開始年,_和暦年) :- _元号年 is _西暦年 - _開始年 + 1, 数字年和暦年変換(_元号年,_和暦年). 数字年和暦年変換(1,元年) :- !. 数字年和暦年変換(_西暦,_和暦年) :- 九十九までの和数字変換(_数字,_和数字), atomic_list_concat([_和数字,年],_和暦年),!. 九十九までの和数字変換(0,''). 九十九までの和数字変換(1,一). 九十九までの和数字変換(2,ニ). 九十九までの和数字変換(3,三). 九十九までの和数字変換(4,四). 九十九までの和数字変換(5,五). 九十九までの和数字変換(6,六). 九十九までの和数字変換(7,七). 九十九までの和数字変換(8,八). 九十九までの和数字変換(9,九). 九十九までの和数字変換(_数字,_和数字) :- 十から十九までの和数字変換(数字,_和数字). 九十九までの和数字変換(_数字,_和数字) :- 二十以上の和数字変換(_数字,_和数字). 十から十九までの和数字変換(_数字,_和数字) :- _数字 >= 10, _数字 =< 19, M is _数字 mod 10, 九十九までの和数字変換(M,M2), atomic_list_concat([十,_和数字一の桁],_和数字). 二十以上の和数字変換(_数字,_和数字) :- _数字 >= 20, _数字 =< 99, 一の桁の変換(_数字,_和数字一の桁), 十の桁の変換(_数字,_和数字十の桁), atomic_list_concat([_和数字十の桁,十,_和数字一の桁],_和数字). 一の桁の変換(_数字,_和数字一の桁) :- _一の桁の数字 is _数字 mod 10, 九十九までの和数字変換(_一の桁の数字,_和数字一の桁). 十の桁の変換(_数字,_和数字十の桁) :- _十の桁の数字 is _数字 // 10, 九十九までの和数字変換(_十の桁の数字,_和数字十の桁). 和暦を表示する(_西暦,[_和暦]) :- writef('西暦%t年は和暦では%tです。\n',[_西暦,_和暦]),!. 和暦を表示する(_西暦,[_和暦_1,_和暦_2]) :- writef('西暦%t年は和暦では%tか%tです。\n',[_西暦,_和暦_1,_和暦_2]),!. 元号の最終日と元号の開始日が一致する日(_年,_月,_日,_先の元号,_後の元号,_改元施行注釈) :- 元号期間(_先の元号,_年,_月,_日,_), 元号期間(_後の元号,_年,_月,_日,_改元施行注釈),!. 元号期間(明治,1868,1,1,1912,7,30). 元号期間(大正,1912,7,30,1926,12,25). 元号期間(昭和,1926,12,25,1989,1,7). 元号期間(平成,1989,1,8,_年,_月,_日) :- 今日(_年,_月,_日). 改元日(明治,1868,1,25,'改元は1月1日に遡って施行された') :- '実際の改元の勅書は1968年10月23日に出されたが1月1日に遡って施行'. 改元日(大正,1912,7,30,'改元は即日施行された') :- '改元は即日施行された'. 改元日(昭和,1926,12,25,'改元は即日施行された') :- '改元は即日施行された'. 改元日(平成,1989,1,7,'改元は翌日から施行された') :- '改元は翌日から施行された'. '実際の改元の勅書は1968年10月23日に出されたが1月1日に遡って施行'. '改元は即日施行された'. '改元は翌日から施行された'. 今日(_年,_月,_日) :- shs(date,S), split(S,[' ',年,月,日],[_年,_月,_日|_]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/829 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # ユーザーに入力させた半角英数字の文字列を、char型配列に入れ、一字ずつずらして表示させるプログラムの作成。 # 入力された順番と同じになったら表示終了とする。 # 例 abcd # bcda # cdab #   dabc # abcd # # ポインタを使うと思います。それから、strlen(c)を使うようです。 # 'ユーザーに入力させた半角英数字の文字列を、char型配列に入れ、一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。' :- 'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列), '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_半角英数字の文字列). 'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列) :- write('半角英数字の文字列を入力してください : '), get_line(Line), 'ユーザーに入力させた半角英数字の文字列入力検査'(Line,_半角英数字の文字列),!. 'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列) :- 'ユーザーに入力させた半角英数字の文字列を'(_半角英数字の文字列). 'ユーザーに入力させた半角英数字の文字列入力検査'(Line,Line) :- atom_codes(Line,Codes), \+((append(_,[N|_],Codes), 半角英数字のコード(N))),!. 'ユーザーに入力させた半角英数字の文字列入力検査'(Line,_半角英数字の文字列) :- writef('入力された %t には半角英数字以外の文字が含まれています。再入力をお願いします。\n',[Line]), fail. 半角英数字のコード(N) :- N >= 48,N =< 57,!. 半角英数字のコード(N) :- N >= 65,N =< 90,!. 半角英数字のコード(N) :- N >= 97,N =< 122,!. '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_半角英数字の文字列) :- 入力された文字列を表示する(_半角英数字の文字列), '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_半角英数字の文字列,_一文字ずらした文字列), '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_一文字ずらした文字列,_半角英数字の文字列). '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_文字列,_文字列) :- 入力された順番と同じになったら表示終了とする。',!. '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_文字列,_半角英数字の文字列) :- '一字ずつずらして表示させる'(_文字列,_一文字ずらした文字列), '一字ずつずらして表示させるプログラムの作成。入力された順番と同じになったら表示終了とする。'(_一文字ずらした文字列,_半角英数字の文字列). '一字ずつずらして表示させる'(_文字列,_一文字ずらした文字列) :- sub_atom(_文字列,0,1,R,_先頭文字), sub_atom(_文字列,1,R,0,_残り文字列), concat_atom([_残り文字列,_先頭文字],_一文字ずらした文字列), writef('%t\n',[_一文字ずらした文字列]). 入力された文字列を表示する(_半角英数字の文字列) :- writef('%t\n',[_半角英数字の文字列]). 入力された順番と同じになったら表示終了とする。'. % % 一文字ずらしてというところが、「先読み」的な制御となり、ややこしい。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/827 # # [1] 授業単元:モンテカルロ # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/foLSr # # 問題1. サイコロを10, 100 ,1000 ,10000 ,100000 回投げて分布を調べよ。 # 問題2. コイン投げも同様にして、Sn = X1 +....+ Xn のSn, そのmax,min を調べよ。 # 問題3.  面積 # ∫ 1 # 0 x^2 dx # をモンテカルロ法で求めよ。 # # 問題4. π の値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 '2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示する'(_n) :- _p = 0.4, findall([_k,Y],( for(0,_k,_n), Y is (_p^_k) * (1-_p)^(_n-_k)), _二項分布), '分布は、**** を打って表示する'(_二項分布). '分布は、**** を打って表示する'([]). '分布は、**** を打って表示する'([[_k,Y]|R]) :- 'Yを0から100まで範囲に変換'(Y,Y2), 星並びアトムを作る(Y2,_星並びアトム), 横向きにグラフ表示(_k,_星並びアトム), '分布は、**** を打って表示する'(R). 'Yを0から100まで範囲に変換'(Y,Y2) :- Y2 is truncate(Y * 100). 星並びアトムを作る(N,_星並びアトム) :- length(L,N), all(L,'*'), concat_atom(L,_星ならぴアトム). 横向きにグラフ表示(_k,_星並びアトム) :- writef('%4c: %t\n',[_k,_星並びアトム]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/809 # # [1] 授業単元:C言語 繰り返し # [2] 問題文(含コード&リンク): # 1.キーボードから正の整数を2つ(x  y)入力し、縦x個、横y個の文字'*' # からなる長方形を表示するプログラムを多重ループを用いて作成せよ。 # # 2.キーボードから入力した10進整数(0以上2^31 -1以下)を二進数にせよ # for文を使うこと。例えば2で割った余りと商の値によって下の桁のビットから求める等 # # 'キーボードから入力した10進整数(0以上2^31 -1以下)を二進数にする'(_二進数数値ならび,_二進数表示) :- 'キーボードから入力した10進整数(0以上2^31 -1以下)を'(_10進整数), '10進整数(0以上2^31 -1以下)を二進数にする'(_10進整数,_二進数数値ならび,_二進数表示). 'キーボードから入力した10進整数(0以上2^31 -1以下)を'(_10進整数) :- write('10進整数(0以上2^31 -1以下)を入力してください : '), get_line(Line), '10進整数(0以上2^31 -1以下)入力検査'(Line,_10進整数),!. 'キーボードから入力した10進整数(0以上2^31 -1以下)を'(_10進整数) :- 'キーボードから入力した10進整数(0以上2^31 -1以下)を'(_10進整数). '10進整数(0以上2^31 -1以下)入力検査'(Line,_10進整数) :- atom_to_term(Line,_10進整数,_), _10進整数 >= 0,!. '10進整数(0以上2^31 -1以下)入力検査'(Line,_10進整数) :- writef('入力された %t からは(0以上2^31 -1以下)の10進整数は得られません。再入力をお願いします。\n',[Line]), fail. '10進整数(0以上2^31 -1以下)を二進数にする'(_10進整数,_二進数数値ならび,_二進数表示) :- '10進整数(0以上2^31 -1以下)を二進数にする'(_10進整数,[],_二進数表示). '10進整数(0以上2^31 -1以下)を二進数にする'(0,_二進数数値ならび,_二進数数値ならび,_二進数表示) :- concat_atom(['0x|_二進数数値ならび],_二進数表示). '10進整数(0以上2^31 -1以下)を二進数にする'(_10進整数,L,_二進数数値ならび,_二進数表示) :- _二進数の一桁 is _10進整数 mod 2, '10進整数(0以上2^31 -1以下)を二進数にする'(_10進整数,L,_二進数表示) :- _二進数の一桁 is _10進整数 mod 2, _二で割った商 is _10進整数 // 2, '10進整数(0以上2^31 -1以下)を二進数にする'(_ニで割った商,[_二進数の一桁|L],_二進数数値ならび,_二進数表示). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/803 # # [1] 配列操作 # [2] 問題文(含コード&リンク): # 入力した文字と個数をもとに文字列データを生成する。(^Zが入力されるまで) # 以下の実行結果をもとにプログラミングしなさい。 # char m[30]; # # 実行結果 # 文字、個数==>A,3 # 文字、個数==>b,3 # 文字、個数==>c,1 # 文字、個数==>E,2 # 文字、個数==>^Z # 文字列:AAAbbbcEE # # '入力した文字と個数をもとに文字列データを生成する。(^Zが入力されるまで) ' :- findall(_文字列,( '入力した文字と個数'(_文字,_個数), length(L,_個数), all(L,_文字), concat_atom(L,_文字列)), _文字列ならび), concat_atom(_文字列ならび,_表示文字列), writef('%t\n',[_表示文字列]). 入力した文字と個数(_文字,_個数) :- write('文字,個数==> '), rawmode, get_code(_文字コード), '入力した個数'(文字コード,_文字,_個数), norawmode. 入力した個数(26,_文字,_個数) :- !,fail. 入力した個数(_文字コード,_文字,_個数) :- char_code(_文字,_文字コード), 個数を入力する(_個数). 個数を入力する(_個数) :- get_code(Code), 個数を入力する(Code,N), 個数を入力する(10,0) :- !. 個数を入力する(44,_個数) :- get_code(Code), 個数を入力する(Code,個数). 個数を入力する(Code,N,_個数) :- \+(N = 44), get_code(Code2), 個数を入力する(Code2,_個数2), Code =< 48, Code >= 57, N is Code - 48, _個数 is _個数2 * 10 + N. % 以下のサイトは # abcdefgfedcba という文字列から # defという文字列を消すこと出来るのですが、 # def以外を消すにはどうすればいいのでしょうか? 'abcdefgfedcba という文字列からdef以外を消す'(_文字列,_削除された文字列) :- sub_atom(_文字列,S,Len,R,def), S2 is S + Len, sub_atom(_文字列,S2,R,0,S3), 'abcdefgfedcba という文字列からdef以外を消す'(S3,_後半の削除された文字列), concat_atom([def,_後半の削除された文字列],_削除された文字列),!. 'abcdefgfedcba という文字列からdef以外を消す'(_文字列,''). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/538 # # ●正規表現の使用環境 Flexible Renamer # ●検索か置換か? 置換 # ●説明 # 日付の前の文字を入れ替える # ●対象データ # ABC11-12-31 \d{2}-[A-Z]{3}-\d{2} # ABC11-DEC-31 \d{2}-\d{2}-\d{2} # ABC2011-12-31 \d{4}-[A-Z]{3}-\d{2} # ABC2011-DEC-31 \d{4}-\d{2}-\d{2} # ●希望する結果 # XYZ11-12-31 # XYZ11-DEC-31 # XYZ2011-12-31 # XYZ2011-DEC-31 # ●コメント:こんな感じか書いて投稿してみた # 日付の前の文字を入れ替える(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(['A','B','C'|R21],[-|R22],[-|R23],L2), 年の文字ならび(R21), 月の文字ならび(R22), 日の文字ならび(R23), append(['X','Y','Z'|R1],[-|R22],[-|R23],L22), atom_chars(S22,L22), concat_atom([S1,S22,S3],_置換された文字列). 日付の前の文字を入れ替える(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), append(['A','B','C'|R21],[-|R22],[-|R23],L2), 年の文字ならび(R21), 月の文字ならび(R22), 日の文字ならび(R23), append(['X','Y','Z'|R1],[-|R22],[-|R23],L22), atom_chars(S22,L22), 日付の前の文字を入れ替える(S3,_置換された文字列のニ), concat_atom([S1,S22],_置換された文字列の一), concat_atom([_置換された文字列の一,_置換された文字列のニ],_置換された文字列). 日付の前の文字を入れ替える(_文字列,_文字列). 年の文字ならび(R21) :- length(R21,4), すべて数字(R21),!. 年の文字ならび(R21) :- length(R21,2), すべて数字(R21),!. 月の文字ならび(R22) :- length(R22,1), すべて数字(R22),!. 月の文字ならび(R22) :- member(A,['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC']), atom_chars(A,R22),!. 日の文字ならび(R21) :- length(R21,2), すべて数字(R21),!. 日の文字ならび(R21) :- length(R21,1), すべて数字(R21),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/503 # # ●正規表現の使用環境 # oracle(regexp_replace) # ●検索か置換か? # 置換 # ●説明 # ::でタグ名が記載されたデータを<>タグに変換したい # ●対象データ # :dog:I like dog # :cat:I like cat # ●希望する結果 # <dog>I like dog</dog> # <cat>I like cat</cat> # '::でタグ名が記載されたデータを<>タグに変換したい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [:|R2], last(R2,:), atom_chars(S21,R2), concat_atom([S1,<,S21,>],S22), '最初に現れたS21の後にを付加する'(S3,S21,S31,_), concat_atom([S22,S31],_置換された文字列). '::でタグ名が記載されたデータを<>タグに変換したい'(_文字列,_置換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,L2,L3), L2 = [:|R2], last(R2,:), atom_chars(S21,R2), concat_atom([S1,<,S21,>],S22), '最初に現れたS21の後にを付加する'(S3,S21,S31,_残り文字列), concat_atom([S22,S31],_置換された文字列の一), '::でタグ名が記載されたデータを<>タグに変換したい'(_残り文字列,_置換された文字列のニ), concat_atom([_置換された文字列の一,_置換された文字列のニ],_置換された文字列). '::でタグ名が記載されたデータを<>タグに変換したい'(_文字列,_文字列). '最初に現れたS21の後にを付加する'(_文字列,S21,S31,S3) :- sub_atom(_文字列,_,_,_,S1,S21,S3,L1,L2,L3), concat_atom([S1,S21,'<',S21,'>'],S31),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/784 # # ttp://aaa.co.jp:8888 # http://bbb.com:9999/ # を除外しつつ # 他の # h?ttp://○○○.△△△.□□□:☆☆☆/? #      ↑ここから      ここまで↑ # をヒットさせたいのですが色々試したのですが出来ませんでした # 何か方法がありますでしょうか? # # 'ttp://aaa.co.jp:8888とhttp://bbb.com:9999/を以外のURLの内、第3ドメインからトップドメインまでの部分'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_S1,S2,_後文字列,L1,[h,t,t,p,:,/,/|R2],[/|R3]), 除外URLではない(_適合文字列), \+(member(/,R2)), concat_atom([S1,'http://'],_前文字列), atom_chars(_適合文字列,R2). '除外URLではない'(S) :- \+(sub_atom(S,0,20,_,'ttp://aaa.co.jp:8888')),!. '除外URLではない'(S) :- \+(sub_atom(S,0,20,_,'http://bbb.com:9999/')),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/743 # # http://ime.nu/から最初の空白までを抽出する正規表現はどうなりますか? # # 'http://ime.nu/から最初の空白までを抽出する'(_文字列,_前文字列,_抽出された文字列,_後文字列) :- sub_atom(_文字列,_,_,_,S1,S2,_後